From 56a8fa0e3a6dbf00fff9004eb18eaae1bf5b77b2 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 16 Mar 2021 10:06:59 +0300 Subject: [PATCH] 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