From 1f697db60b8e2bf680a8c3b25ee4ebc8f20a6267 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 26 Nov 2020 20:26:46 +0300 Subject: [PATCH] Spires enhancements, pink moss --- .../java/ru/betterend/registry/EndBlocks.java | 2 + .../ru/betterend/registry/EndFeatures.java | 4 +- .../world/biome/BlossomingSpires.java | 3 +- .../betterend/world/features/EndFeature.java | 6 +- .../features/bushes/TenaneaBushFeature.java | 111 ++++++++++++++++++ .../{ => terrain}/FloatingSpireFeature.java | 22 +++- .../world/features/terrain/SpireFeature.java | 19 ++- .../betterend/blockstates/pink_moss.json | 21 ++++ .../betterend/blockstates/pink_moss_path.json | 10 ++ .../assets/betterend/lang/en_us.json | 5 +- .../assets/betterend/lang/ru_ru.json | 5 +- .../betterend/models/block/pink_moss.json | 12 ++ .../models/block/pink_moss_path.json | 7 ++ .../betterend/models/item/pink_moss.json | 3 + .../betterend/models/item/pink_moss_path.json | 3 + .../textures/block/pink_moss_path_top.png | Bin 0 -> 2262 bytes .../textures/block/pink_moss_side.png | Bin 0 -> 2483 bytes .../textures/block/pink_moss_top.png | Bin 0 -> 2276 bytes 18 files changed, 220 insertions(+), 13 deletions(-) create mode 100644 src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java rename src/main/java/ru/betterend/world/features/{ => terrain}/FloatingSpireFeature.java (74%) create mode 100644 src/main/resources/assets/betterend/blockstates/pink_moss.json create mode 100644 src/main/resources/assets/betterend/blockstates/pink_moss_path.json create mode 100644 src/main/resources/assets/betterend/models/block/pink_moss.json create mode 100644 src/main/resources/assets/betterend/models/block/pink_moss_path.json create mode 100644 src/main/resources/assets/betterend/models/item/pink_moss.json create mode 100644 src/main/resources/assets/betterend/models/item/pink_moss_path.json create mode 100644 src/main/resources/assets/betterend/textures/block/pink_moss_path_top.png create mode 100644 src/main/resources/assets/betterend/textures/block/pink_moss_side.png create mode 100644 src/main/resources/assets/betterend/textures/block/pink_moss_top.png diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 6831ba13..83440470 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -74,6 +74,7 @@ public class EndBlocks { 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_GRASS = registerBlock("amber_grass", new BlockTerrain(MaterialColor.ORANGE)); // Roads // @@ -83,6 +84,7 @@ public class EndBlocks { 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_GRASS_PATH = registerBlock("amber_grass_path", new BlockPath(AMBER_GRASS)); // Rocks // diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index a6d406b1..083adf7f 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -17,14 +17,15 @@ 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.FloatingSpireFeature; import ru.betterend.world.features.SinglePlantFeature; import ru.betterend.world.features.UnderwaterPlantFeature; 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.TenaneaBushFeature; import ru.betterend.world.features.terrain.EndLakeFeature; +import ru.betterend.world.features.terrain.FloatingSpireFeature; import ru.betterend.world.features.terrain.RoundCaveFeature; import ru.betterend.world.features.terrain.SpireFeature; import ru.betterend.world.features.trees.DragonTreeFeature; @@ -44,6 +45,7 @@ public class EndFeatures { // 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 TENANEA_BUSH = new EndFeature("tenanea_bush", new TenaneaBushFeature(), 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/BlossomingSpires.java b/src/main/java/ru/betterend/world/biome/BlossomingSpires.java index 4c945102..829b1701 100644 --- a/src/main/java/ru/betterend/world/biome/BlossomingSpires.java +++ b/src/main/java/ru/betterend/world/biome/BlossomingSpires.java @@ -10,10 +10,11 @@ public class BlossomingSpires extends EndBiome { .setFogColor(241, 146, 229) .setFogDensity(2.0F) .setPlantsColor(122, 45, 122) - .setSurface(EndBlocks.END_MOSS) + .setSurface(EndBlocks.PINK_MOSS) .addFeature(EndFeatures.SPIRE) .addFeature(EndFeatures.FLOATING_SPIRE) .addFeature(EndFeatures.TENANEA) + .addFeature(EndFeatures.TENANEA_BUSH) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4)); } } diff --git a/src/main/java/ru/betterend/world/features/EndFeature.java b/src/main/java/ru/betterend/world/features/EndFeature.java index 17866404..5847e5bc 100644 --- a/src/main/java/ru/betterend/world/features/EndFeature.java +++ b/src/main/java/ru/betterend/world/features/EndFeature.java @@ -23,9 +23,9 @@ import ru.betterend.blocks.complex.StoneMaterial; import ru.betterend.world.features.terrain.OreLayerFeature; public class EndFeature { - protected Feature feature; - protected ConfiguredFeature featureConfigured; - protected GenerationStep.Feature featureStep; + private Feature feature; + private ConfiguredFeature featureConfigured; + private GenerationStep.Feature featureStep; protected EndFeature() {} diff --git a/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java b/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java new file mode 100644 index 00000000..4a2cd68c --- /dev/null +++ b/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java @@ -0,0 +1,111 @@ +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.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.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.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.DefaultFeature; + +public class TenaneaBushFeature extends DefaultFeature { + private static final Function REPLACE; + + 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; + + float radius = MHelper.randRange(1.8F, 3.5F, random); + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt()); + BlockState leaves = EndBlocks.TENANEA_LEAVES.getDefaultState(); + 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.setReplaceFunction(REPLACE); + List support = Lists.newArrayList(); + sphere.setPostProcess((info) -> { + if (info.getState().getBlock() instanceof LeavesBlock) { + int distance = info.getPos().getManhattanDistance(pos); + if (distance < 7) { + if (random.nextBoolean() && info.getStateDown().isAir()) { + BlockPos d = info.getPos().down(); + support.add(d); + } + return info.getState().with(LeavesBlock.DISTANCE, distance); + } + else { + return AIR; + } + } + return info.getState(); + }); + sphere.fillRecursive(world, pos); + BlockState stem = EndBlocks.TENANEA.bark.getDefaultState(); + BlocksHelper.setWithoutUpdate(world, pos, stem); + for (Direction d: Direction.values()) { + BlockPos p = pos.offset(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); + support.forEach((bpos) -> { + int count = MHelper.randRange(3, 8, random); + mut.set(bpos); + if (world.getBlockState(mut.up()).isOf(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())) { + BlocksHelper.setWithoutUpdate(world, mut, middle); + } + else { + break; + } + } + BlocksHelper.setWithoutUpdate(world, mut, bottom); + } + }); + + 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/FloatingSpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java similarity index 74% rename from src/main/java/ru/betterend/world/features/FloatingSpireFeature.java rename to src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java index c939791a..723935e9 100644 --- a/src/main/java/ru/betterend/world/features/FloatingSpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java @@ -1,19 +1,21 @@ -package ru.betterend.world.features; +package ru.betterend.world.features.terrain; +import java.util.List; import java.util.Random; +import com.google.common.collect.Lists; + import net.minecraft.block.Blocks; 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.EndFeatures; import ru.betterend.util.MHelper; import ru.betterend.util.sdf.SDF; import ru.betterend.util.sdf.operator.SDFDisplacement; import ru.betterend.util.sdf.primitive.SDFSphere; -import ru.betterend.world.features.terrain.SpireFeature; public class FloatingSpireFeature extends SpireFeature { @Override @@ -39,10 +41,22 @@ public class FloatingSpireFeature extends SpireFeature { 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).setPostProcess((info) -> { - return info.getStateUp().isAir() ? EndBlocks.END_MOSS.getDefaultState() : info.getState(); + 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) -> { + EndFeatures.TENANEA_BUSH.getFeature().generate(world, chunkGenerator, random, bpos, null); + }); + 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 69309f5b..8dcc93f7 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java @@ -1,8 +1,11 @@ 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.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.LeavesBlock; @@ -12,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.noise.OpenSimplexNoise; -import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndTags; import ru.betterend.util.MHelper; import ru.betterend.util.sdf.SDF; @@ -40,10 +43,22 @@ public class SpireFeature extends DefaultFeature { 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).setPostProcess((info) -> { - return info.getStateUp().isAir() ? EndBlocks.END_MOSS.getDefaultState() : info.getState(); + 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) -> { + EndFeatures.TENANEA_BUSH.getFeature().generate(world, chunkGenerator, random, bpos, null); + }); + return true; } return false; diff --git a/src/main/resources/assets/betterend/blockstates/pink_moss.json b/src/main/resources/assets/betterend/blockstates/pink_moss.json new file mode 100644 index 00000000..27f9613c --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/pink_moss.json @@ -0,0 +1,21 @@ +{ + "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 new file mode 100644 index 00000000..4ca9deab --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/pink_moss_path.json @@ -0,0 +1,10 @@ +{ + "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/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index e47468c2..4e93a053 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -333,5 +333,8 @@ "item.betterend.amber_gem": "Amber Gem", "item.betterend.raw_amber": "Raw Amber", "block.betterend.tenanea_flowers": "Tenanea Flowers", - "block.betterend.tenanea_outer_leaves": "Tenanea Outer Leaves" + "block.betterend.tenanea_outer_leaves": "Tenanea Outer Leaves", + + "block.betterend.pink_moss": "Pink Moss", + "block.betterend.pink_moss_path": "Pink Moss Path" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 3cb5ccff..ebcd4606 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -335,5 +335,8 @@ "item.betterend.amber_gem": "Огранённый янтарь", "item.betterend.raw_amber": "Необработанный янтарь", "block.betterend.tenanea_flowers": "Цветы тенанеи", - "block.betterend.tenanea_outer_leaves": "Внешние листья тенанеи" + "block.betterend.tenanea_outer_leaves": "Внешние листья тенанеи", + + "block.betterend.pink_moss": "Розовый мох", + "block.betterend.pink_moss_path": "Тропа из розового мха" } \ 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 new file mode 100644 index 00000000..237cb110 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/pink_moss.json @@ -0,0 +1,12 @@ +{ + "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 new file mode 100644 index 00000000..9f46434e --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/pink_moss_path.json @@ -0,0 +1,7 @@ +{ "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/item/pink_moss.json b/src/main/resources/assets/betterend/models/item/pink_moss.json new file mode 100644 index 00000000..275797f5 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/pink_moss.json @@ -0,0 +1,3 @@ +{ + "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 new file mode 100644 index 00000000..de77462e --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/pink_moss_path.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/pink_moss_path" +} diff --git a/src/main/resources/assets/betterend/textures/block/pink_moss_path_top.png b/src/main/resources/assets/betterend/textures/block/pink_moss_path_top.png new file mode 100644 index 0000000000000000000000000000000000000000..f480e3efcf37144025e9a89e29f812852aff8349 GIT binary patch literal 2262 zcmbVO3s4kg96xYOg9ywSQ!`oCFv#}yb$5Ha!zsw2q8t$rNP@Dry9Ybm-5$Gp51_P% z_$Zq&-{zQ>GLrZl#_`pdV~rvxJFRV_4#P<!9e^Q`x4^|l8)oxl3YFrN zT3INl%`N0=t2mm6Cya;E0t_H<2`UQ(Tu!&b1T1inmjPq#HVQ*Qh+1WVGc-YHx-AdN zlw<)i>P-lT8wiM^^|%S63B&Ucf#DR2Q7BF#7|viOhNPkJ4+d&7?_lz+lfqiy$^uua zs)s>Qzu&L-lX^+6KyjL;QH($d0s#m_sd1}p0C6j0dKs*O!pWjX6(u*MF|u~at6E^- zG!%l%6QOl0;WUASp#j!|;(AOADG21b2+re`ok4M)Lj|Yc65Of+uy_RPsgzVnsg&+R z9eLbG0HoGti)i%g#pQ}fC~B4ugb_|izi6ef#v`Elf+BfkPRQ~Bn`5+SJWQr6u&N{% zN|Lj;Pq3Et!?(qLs`XHL3D5Ue3V`$htr=2RB!}u}Wg(*i zRQ6%IAHAP{h4nqy{loQI$W~wX{j8S%={}qsu99_E2w;ClVJ)6ubwi~=|6R4U zUO3o_wPEBP04^eL5y1_pW$=y=6L+NObkT9y){MfGj^y`BeD9|xWOX&J`fO1HS7R$F z7}iifcDa%8Q-kFTKfU=;LE6mIwJ)9P?wEDu^yn-Kg#T9hb^_0)^mVKR4(^TK` zNBiO3IYo6_S4)xX4wdw0tufMvqyYz!QhPkuTTdPNv9zXWE{zk)pfpIv?G=ZV)+RZ!j;!By`_-b<;vLIxZ}O>= z32j^U4P4u?^tENxJ#)TrI5UP{TR9hxO|Duv!t>j@Tbs@dB1dmdbe6Xa^`4NM&n(M7 z-92PGOs}p!z3Vxo1lwy~&~qktzpuXCH==cC!r8&!dAD7OduCv}T0s z$Jke0t{T4o$kOy*n&*|+%ZIfc-2T@qE9A8FS>I2i;!Y*b81P9~ry*xU!sVIEu2vCx z`0?|(@mZzqZx38?=$jLDPk)$bKf7n@jAL`WiKDM2PyIOY+r`ZZL*T>FNm2Pv^5-U} cKhZj2=#8o(=J1^??aL!OE7!VpV)+~Y06+;IYybcN literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/pink_moss_side.png b/src/main/resources/assets/betterend/textures/block/pink_moss_side.png new file mode 100644 index 0000000000000000000000000000000000000000..34a3f4b0972730dbe8bc19fc91602a5c49613647 GIT binary patch literal 2483 zcmbVO4^$KP9S_L*sPeDHJ*ic8JzA>b<^Cm?+)0Fx1fded5Cw;`T<$L9Aj!qtK?3b7 z7IkfX)?%d{{#kvrRZDqArL97Bvz^j)b5&-C^xy1bZC9vHI(4se*lxcIA=N%=eam~7 z``z8=_xXIje}2EaC(25fBu}3`U8B(?7Z+I_;GCu&iSgjSb*qO0r`rQXt7MI4M!I^$ zX?E<&&}eRxL}#T^X)j?o$){y`$t7sRz5qaLG`V@<0L#@03gi-MM863hJ8}$$MBW5f z=%z)w~g5eBCF(eH|e=txB@@~dq zEsSb`D--NdlmLUGp-@O0BDGSm2E}QbMlk{<2m~MyxzVq%VZ<+IO)^*onG1>mMU?!I z%E-E;dc_0-rxPLg0x?>@98D8Q7#d~+D6YlSkRm{yi{S$GL2pEy=TN~b_yoTq11uiH z20W4?$sXwksAG?B5CEyQ+hZD2dhz*U60%}z0AWNEG9_AeHUj zO@Ofk1y+%QPD%1k7OHI0GGwu+g)u_&Dnvgoh2;6y%@M4uBA8$TBQONV5sY@?dWIw! z63@X%2E!(xc8M3=jWWT-9dY#}luq1|Hq+5s3tj>tAB(6u?yb;GJBQJ0`p*Hk)%9AW+ z5T6WcDMuGf0b3ItdBw$3o5lqL#}PaW*jYD17(fbWlAu9B1)efcG_S*`TvS~vfC8Er zP0*q@*N=2CQzWW>8lx`Cg|#t1P^4)YmQxp_3Fg!;6nHp#Tb!a=x0ILY{E$Zgq&I2J z33XX=D9UuAM!7=4L5gxYrQsM>qhretd{@NeKa|ohxOM8V1GwpHJ(Uy zCrX2UziN?Z*X^2Bz+z(tDP5hU|R7>HC%!m!vPx zxcDb!XZL#zZ#Z6T+tazR2&%SBYfrn9?{Ym}xPI#iYieytZtpH*U2ors^-E`ddS`Nm z+1#3Kb*);En6R*8MwKXz7K)3=S6=(}?UN@T8XNysYD^tHcI{01S2(@*4`)VZyfSN> zEvKq$b;@DqFNiC0+o?0bgC+Kt0@~*my@PZk9dE9@?(1x;gyJ^4Jh(RHL`&;|j-D-T^Q^s|bBEjC#WUV6e4Tjm z^VaQY4{UnoKl!==@4@A(raSLBIOyD;c5>VH7ab3r&FD&<|1aS~M?>GK-lM}kZS89_ zQ(WoC<_={3{8HahdMw^!KAx{@XNjgB&sp-RpAPTH+Owj1Q%@ST^M$qrbGq+pUwuv) ze0C_QG<7}JU*>w$c<5(_+9c27X3Th5Z`+eL)BfJ*6Zbt<+Huu*mA360e(7JByAspCNbZ>Ri zK=am-#1(IbH3{FGUpEZLW0j#HOY=zX?$b}-^;&{?9dhBn@pru7bxd>RTh-61Vq2-T IyP&$|e^MHDZ~y=R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/block/pink_moss_top.png b/src/main/resources/assets/betterend/textures/block/pink_moss_top.png new file mode 100644 index 0000000000000000000000000000000000000000..ac9000185931d6c91edc55299c4d6950900f4247 GIT binary patch literal 2276 zcmbVO3vd+W9X}qT;KZclq)aHdECQinZ(nzN*(FCv?m`IR63m_Cp#?U(-{qFv-7dR( zpcj#o;j^NO+{9L_iv7v@ueZHfU&05=LrhLSiXa>1Y`qDuayQCYLL8&@#Q5 zz5RCg_x*mq|6~8N8(UrA5^$@Kon{h3ayF718whNLnQa34%c9k;-5oq;ZuFbcmOOYvVSKB0~_p z+<|5of=H2jDdLn>fY>YyCXiMNv9lJEAy~>f7oiB!juUpAq%nfz2!^9sB>F?4nkxFZ z0@uQ*7QAwxeqC2M9IvRTuvE|%SuMj!mSu5*!YK-a2u!OA>3k&?(q@b>xPT_8lA=p; z2r(G>QaP+UQ0R0xgrE|m4QbId!Gz(Jyn>S!!U$;yC<-y05>^94;-Y|q00@GRu0bpr z!zzARmo>lqBh<0ScL~7My4^92dwK~5V-lL4wFZU}O~^gbnzu>;cmdGluquG8HPGe^ zBN~Nss({yJ)ho+^kwPsUv5YvKMqyHsf)GdpWuj+0n#ds-#gJ_Dq3kthNZDk370lJjLN=d7Tv8gsYM$vYk zPasLV-NugWcgaH7D6X-8xX(pdfE@o(C4pTKD3Ql}BJaZ}yH&tgnqpyYfXLVxRqB+{tRV5+NhcFm$Pnv0*k)%3wgS+Obp{PhvKbAVk_ukrWAxh92q>Zjq$H z>QzNw5f4}$T?Hg$s4X~NFxuUL3PzoQh(>Qq_sGY6DM$BL_yHvSiQ*5dYqC$T;8l=O z26J~m{e}OSe~n-B)9&xDn!~p4c7Kn4{6F1ClOy=~P#J&|6i1DCaAVdCmj?gustrB6 zV=j%r;jlB7u_+5LVsjdVAhimoaQeWcgC^7Hw{u(>-sDK!%fjPR_S5vn zXPxGa8;>7Ui|dq(5sE4x}E zy_e6IH=kH{Yhq;fGj;vGfvVqad6j6hw2(XZwKI{{y2tv~ol8y%RHtNXb%O)e@WRI4 zgRPr7{=TQ9EpPvr?8VOF@V4Hy-}imV?45OXRp!d)E2pzbFEVwP*Dr7G+|tsQA$K{n z-3|LoLY?zww|(mgY`I?Y{idE@@6LattKQSJc%iQ~p zekzsdmu6nrpVM&u>wmBM?e2H4zT*EQ9U*^l@`eR%d~jwioxLH^UrVe=(W|Gnej1*f zKI>Pz)}EQ-@?}7airyfrRD01n>DG^Y71=B;33=h=X5@b9JS{9i$@ijzMV49wQ$^_SNHz&V{gLY%>I?uXPOFL zr?$Qk`KtZY@-H5ky87IuA!li@$uWzrHo$>3uI{+Lvsq zVXhQ)j!)_7Y-*bjQJA{8&HK$YMTvEd=TC48mYQ?G!Pa#zym;%@rJezP!NdbS{(Q4% zd+X6b|63R1cRW7h@qtnEXXY*5+MQtAFs^$adGPG2mM-1Xb^5JaZ5d~rqufy*PnW`X7P!J+RwH&O`eO^UwQ0gcF8Hauo*MHLvph6T!%AP GKKBC~7dplO literal 0 HcmV?d00001