From 5921317d3eee0fe799b8e21a30f0cf757d66791f Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 24 Dec 2020 12:40:13 +0300 Subject: [PATCH] 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