From 1ceb433a6154c476b32713e15ed83fe6617e786a Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 6 Oct 2020 01:06:59 +0300 Subject: [PATCH] Dense vines --- .../ru/betterend/blocks/basis/BlockSign.java | 3 +- .../ru/betterend/blocks/basis/BlockVine.java | 140 ++++++++++++++++++ .../ru/betterend/registry/BlockRegistry.java | 4 + .../betterend/registry/FeatureRegistry.java | 3 + .../world/biome/BiomeFoggyMushroomland.java | 1 + .../features/InvertedScatterFeature.java | 51 +++++++ .../betterend/world/features/VineFeature.java | 36 +++++ .../betterend/blockstates/dense_vine.json | 13 ++ .../assets/betterend/lang/en_us.json | 4 +- .../assets/betterend/lang/ru_ru.json | 4 +- .../betterend/models/block/crop_block.json | 40 +++++ .../models/block/crop_block_inverted.json | 40 +++++ .../block/cross_no_distortion_inverted.json | 29 ++++ .../models/block/dense_vine_bottom_1.json | 6 + .../models/block/dense_vine_bottom_2.json | 6 + .../models/block/dense_vine_middle_1.json | 6 + .../models/block/dense_vine_middle_2.json | 6 + .../models/block/dense_vine_top.json | 76 ++++++++++ .../betterend/models/item/dense_vine.json | 6 + .../betterend/textures/block/dense_vine.png | Bin 0 -> 2448 bytes .../textures/block/dense_vine_bottom.png | Bin 0 -> 2299 bytes .../textures/block/dense_vine_roots.png | Bin 0 -> 2116 bytes 22 files changed, 470 insertions(+), 4 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/basis/BlockVine.java create mode 100644 src/main/java/ru/betterend/world/features/InvertedScatterFeature.java create mode 100644 src/main/java/ru/betterend/world/features/VineFeature.java create mode 100644 src/main/resources/assets/betterend/blockstates/dense_vine.json create mode 100644 src/main/resources/assets/betterend/models/block/crop_block.json create mode 100644 src/main/resources/assets/betterend/models/block/crop_block_inverted.json create mode 100644 src/main/resources/assets/betterend/models/block/cross_no_distortion_inverted.json create mode 100644 src/main/resources/assets/betterend/models/block/dense_vine_bottom_1.json create mode 100644 src/main/resources/assets/betterend/models/block/dense_vine_bottom_2.json create mode 100644 src/main/resources/assets/betterend/models/block/dense_vine_middle_1.json create mode 100644 src/main/resources/assets/betterend/models/block/dense_vine_middle_2.json create mode 100644 src/main/resources/assets/betterend/models/block/dense_vine_top.json create mode 100644 src/main/resources/assets/betterend/models/item/dense_vine.json create mode 100644 src/main/resources/assets/betterend/textures/block/dense_vine.png create mode 100644 src/main/resources/assets/betterend/textures/block/dense_vine_bottom.png create mode 100644 src/main/resources/assets/betterend/textures/block/dense_vine_roots.png diff --git a/src/main/java/ru/betterend/blocks/basis/BlockSign.java b/src/main/java/ru/betterend/blocks/basis/BlockSign.java index f57c8ec1..9976aa48 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockSign.java +++ b/src/main/java/ru/betterend/blocks/basis/BlockSign.java @@ -44,8 +44,7 @@ public class BlockSign extends AbstractSignBlock { public BlockSign(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.setDefaultState(this.stateManager.getDefaultState().with(ROTATION, 0).with(FLOOR, true).with(WATERLOGGED, false)); } @Override diff --git a/src/main/java/ru/betterend/blocks/basis/BlockVine.java b/src/main/java/ru/betterend/blocks/basis/BlockVine.java new file mode 100644 index 00000000..524233ff --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/BlockVine.java @@ -0,0 +1,140 @@ +package ru.betterend.blocks.basis; + +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.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.state.property.EnumProperty; +import net.minecraft.util.math.BlockPos; +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 net.minecraft.world.WorldView; +import ru.betterend.blocks.BlockProperties; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.client.ERenderLayer; +import ru.betterend.client.IRenderTypeable; +import ru.betterend.util.BlocksHelper; + +public class BlockVine 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 BlockVine() { + this(0, false); + } + + public BlockVine(int light) { + this(light, false); + } + + public BlockVine(int light, boolean bottomOnly) { + super(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.SHEARS) + .sounds(BlockSoundGroup.GRASS) + .lightLevel((state) -> { + return bottomOnly ? state.get(SHAPE) == TripleShape.BOTTOM ? light : 0 : light; + }) + .breakByHand(true) + .noCollision()); + this.setDefaultState(this.stateManager.getDefaultState().with(SHAPE, TripleShape.BOTTOM)); + } + + @Override + protected void appendProperties(StateManager.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); + } + + @Override + public AbstractBlock.OffsetType getOffsetType() { + return AbstractBlock.OffsetType.XZ; + } + + @Override + public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + return isSupport(state, world, pos); + } + + protected boolean isSupport(BlockState state, WorldView world, BlockPos pos) { + return world.getBlockState(pos.up()).getBlock() == this || sideCoversSmallSquare(world, pos.up(), Direction.UP); + } + + @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 (world.getBlockState(pos.up()).getBlock() != this) + return state.with(SHAPE, TripleShape.TOP); + else if (world.getBlockState(pos.down()).getBlock() != this) + return state.with(SHAPE, TripleShape.BOTTOM); + 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) { + return Lists.newArrayList(new ItemStack(this)); + } + else { + return Lists.newArrayList(); + } + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } + + @Override + public boolean isFertilizable(BlockView world, BlockPos pos, BlockState state, boolean isClient) { + return true; + } + + @Override + public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) { + while (world.getBlockState(pos).getBlock() == this) { + pos = pos.down(); + } + return world.isAir(pos); + } + + @Override + public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { + while (world.getBlockState(pos).getBlock() == this) { + pos = pos.down(); + } + world.setBlockState(pos, getDefaultState()); + BlocksHelper.setWithoutUpdate(world, pos, getDefaultState()); + } +} diff --git a/src/main/java/ru/betterend/registry/BlockRegistry.java b/src/main/java/ru/betterend/registry/BlockRegistry.java index 5ea8faa6..9df1c286 100644 --- a/src/main/java/ru/betterend/registry/BlockRegistry.java +++ b/src/main/java/ru/betterend/registry/BlockRegistry.java @@ -24,6 +24,7 @@ import ru.betterend.blocks.EndStoneSmelter; import ru.betterend.blocks.EnderBlock; import ru.betterend.blocks.TerminiteBlock; import ru.betterend.blocks.basis.BlockGlowingFur; +import ru.betterend.blocks.basis.BlockVine; import ru.betterend.blocks.complex.WoodenMaterial; import ru.betterend.tab.CreativeTab; @@ -54,6 +55,9 @@ public class BlockRegistry { 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 BlockGlowingFur(BLUE_VINE_SEED, 3)); + // Vines // + public static final Block DENSE_VINE = registerBlock("dense_vine", new BlockVine(15, true)); + // Ores // public static final Block ENDER_ORE = registerBlock("ender_ore", new BlockOre(ItemRegistry.ENDER_DUST, 1, 3)); diff --git a/src/main/java/ru/betterend/registry/FeatureRegistry.java b/src/main/java/ru/betterend/registry/FeatureRegistry.java index c0ef18ac..7e453e50 100644 --- a/src/main/java/ru/betterend/registry/FeatureRegistry.java +++ b/src/main/java/ru/betterend/registry/FeatureRegistry.java @@ -6,6 +6,7 @@ import ru.betterend.world.features.EndFeature; import ru.betterend.world.features.EndLakeFeature; import ru.betterend.world.features.MossyGlowshroomFeature; import ru.betterend.world.features.SinglePlantFeature; +import ru.betterend.world.features.VineFeature; public class FeatureRegistry { // Trees // @@ -16,6 +17,8 @@ public class FeatureRegistry { public static final EndFeature CREEPING_MOSS = new EndFeature("creeping_moss", new SinglePlantFeature(BlockRegistry.CREEPING_MOSS, 5), 5); public static final EndFeature BLUE_VINE = new EndFeature("blue_vine", new BlueVineFeature(), 1); + public static final EndFeature DENSE_VINE = new EndFeature("dense_vine", new VineFeature(BlockRegistry.DENSE_VINE, 24), 3); + // Features // public static final EndFeature END_LAKE = EndFeature.makeLakeFeature("end_lake", new EndLakeFeature(), 4); diff --git a/src/main/java/ru/betterend/world/biome/BiomeFoggyMushroomland.java b/src/main/java/ru/betterend/world/biome/BiomeFoggyMushroomland.java index 4c89abda..d494512b 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeFoggyMushroomland.java +++ b/src/main/java/ru/betterend/world/biome/BiomeFoggyMushroomland.java @@ -24,6 +24,7 @@ public class BiomeFoggyMushroomland extends EndBiome { .addFeature(FeatureRegistry.BLUE_VINE) .addFeature(FeatureRegistry.UMBRELLA_MOSS) .addFeature(FeatureRegistry.CREEPING_MOSS) + .addFeature(FeatureRegistry.DENSE_VINE) .addMobSpawn(EntityRegistry.DRAGONFLY, 80, 2, 5) .addMobSpawn(EntityRegistry.END_SLIME, 10, 1, 2) .addMobSpawn(EntityType.ENDERMAN, 10, 1, 2)); diff --git a/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java b/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java new file mode 100644 index 00000000..ae2b656e --- /dev/null +++ b/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java @@ -0,0 +1,51 @@ +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.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.MHelper; + +public abstract class InvertedScatterFeature extends DefaultFeature { + private static final Mutable POS = new Mutable(); + 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 void generate(StructureWorldAccess world, Random random, BlockPos blockPos); + + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos center, DefaultFeatureConfig featureConfig) { + for (int y = 128; y > 0; y--) { + POS.set(center.getX(), y, center.getZ()); + if (world.getBlockState(POS).isAir() && !world.getBlockState(POS.up()).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++) { + float pr = r * (float) Math.sqrt(random.nextFloat()); + 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() - 5, center.getZ() + z); + int up = BlocksHelper.upRay(world, POS, 16); + if (up > 10) continue; + POS.setY(POS.getY() + up); + + if (canGenerate(world, random, center, POS, r)) { + generate(world, random, POS); + } + } + } + } + return true; + } +} diff --git a/src/main/java/ru/betterend/world/features/VineFeature.java b/src/main/java/ru/betterend/world/features/VineFeature.java new file mode 100644 index 00000000..c4cddc5e --- /dev/null +++ b/src/main/java/ru/betterend/world/features/VineFeature.java @@ -0,0 +1,36 @@ +package ru.betterend.world.features; + +import java.util.Random; + +import net.minecraft.block.Block; +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.util.BlocksHelper; + +public class VineFeature extends InvertedScatterFeature { + private final Block vineBlock; + private final int maxLength; + + public VineFeature(Block vineBlock, int maxLength) { + super(6); + this.vineBlock = vineBlock; + this.maxLength = maxLength; + } + + @Override + public boolean canGenerate(StructureWorldAccess world, Random random, BlockPos center, BlockPos blockPos, float radius) { + return vineBlock.canPlaceAt(AIR, world, blockPos); + } + + @Override + public void generate(StructureWorldAccess world, Random random, BlockPos blockPos) { + int h = BlocksHelper.downRay(world, blockPos, random.nextInt(maxLength)); + BlocksHelper.setWithoutUpdate(world, blockPos, vineBlock.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.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(h), vineBlock.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM)); + } +} diff --git a/src/main/resources/assets/betterend/blockstates/dense_vine.json b/src/main/resources/assets/betterend/blockstates/dense_vine.json new file mode 100644 index 00000000..9eb0419e --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/dense_vine.json @@ -0,0 +1,13 @@ +{ + "variants": { + "shape=top": { "model": "betterend:block/dense_vine_top" }, + "shape=middle": [ + { "model": "betterend:block/dense_vine_middle_1" }, + { "model": "betterend:block/dense_vine_middle_2" } + ], + "shape=bottom": [ + { "model": "betterend:block/dense_vine_bottom_1" }, + { "model": "betterend:block/dense_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 ea76b464..f7f90c20 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -80,5 +80,7 @@ "block.betterend.blue_vine_seed": "Blue Vine Seed", "block.betterend.blue_vine": "Blue Vine", "block.betterend.blue_vine_lantern": "Blue Vine Lantern", - "block.betterend.blue_vine_fur": "Blue Vine Fur" + "block.betterend.blue_vine_fur": "Blue Vine Fur", + + "block.betterend.dense_vine": "Dense Vine" } \ 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 cb537923..7cb0ffbd 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -80,5 +80,7 @@ "block.betterend.blue_vine_seed": "Семя синей лозы", "block.betterend.blue_vine": "Синяя лоза", "block.betterend.blue_vine_lantern": "Фонарь синей лозы", - "block.betterend.blue_vine_fur": "Пух синей лозы" + "block.betterend.blue_vine_fur": "Пух синей лозы", + + "block.betterend.dense_vine": "Плотная лоза" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/crop_block.json b/src/main/resources/assets/betterend/models/block/crop_block.json new file mode 100644 index 00000000..15e0eb4b --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/crop_block.json @@ -0,0 +1,40 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "#texture" + }, + "elements": [ + { "from": [ 4.1, 0, 0 ], + "to": [ 4.1, 16, 16 ], + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { "from": [ 11.9, 0, 0 ], + "to": [ 11.9, 16, 16 ], + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { "from": [ 0, 0, 4.1 ], + "to": [ 16, 16, 4.1 ], + "shade": false, + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { "from": [ 0, 0, 11.9 ], + "to": [ 16, 16, 11.9 ], + "shade": false, + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + } + ] +} 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 new file mode 100644 index 00000000..8d5c9a19 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/crop_block_inverted.json @@ -0,0 +1,40 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "#texture" + }, + "elements": [ + { "from": [ 4, 0, 0 ], + "to": [ 4, 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 ], + "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 ], + "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 ], + "shade": false, + "faces": { + "north": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" }, + "south": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture" } + } + } + ] +} diff --git a/src/main/resources/assets/betterend/models/block/cross_no_distortion_inverted.json b/src/main/resources/assets/betterend/models/block/cross_no_distortion_inverted.json new file mode 100644 index 00000000..429eb5ea --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/cross_no_distortion_inverted.json @@ -0,0 +1,29 @@ +{ + "textures": { + "particle": "#texture" + }, + "elements": [ + { + "__comment": "PlaneX1", + "from": [ 2.375, 0, 2.25 ], + "to": [ 2.376, 16, 18.25 ], + "rotation": { "origin": [ 2.375, 0, 2.25 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 16, 0, 0, 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": [ 16, 0, 0, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/dense_vine_bottom_1.json b/src/main/resources/assets/betterend/models/block/dense_vine_bottom_1.json new file mode 100644 index 00000000..65d99a90 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/dense_vine_bottom_1.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_no_distortion", + "textures": { + "texture": "betterend:block/dense_vine_bottom" + } +} diff --git a/src/main/resources/assets/betterend/models/block/dense_vine_bottom_2.json b/src/main/resources/assets/betterend/models/block/dense_vine_bottom_2.json new file mode 100644 index 00000000..f154f60a --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/dense_vine_bottom_2.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_no_distortion_inverted", + "textures": { + "texture": "betterend:block/dense_vine_bottom" + } +} diff --git a/src/main/resources/assets/betterend/models/block/dense_vine_middle_1.json b/src/main/resources/assets/betterend/models/block/dense_vine_middle_1.json new file mode 100644 index 00000000..453e4192 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/dense_vine_middle_1.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_no_distortion", + "textures": { + "texture": "betterend:block/dense_vine" + } +} diff --git a/src/main/resources/assets/betterend/models/block/dense_vine_middle_2.json b/src/main/resources/assets/betterend/models/block/dense_vine_middle_2.json new file mode 100644 index 00000000..7c16de51 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/dense_vine_middle_2.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/cross_no_distortion_inverted", + "textures": { + "texture": "betterend:block/dense_vine" + } +} diff --git a/src/main/resources/assets/betterend/models/block/dense_vine_top.json b/src/main/resources/assets/betterend/models/block/dense_vine_top.json new file mode 100644 index 00000000..bec20fbc --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/dense_vine_top.json @@ -0,0 +1,76 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/dense_vine", + "texture": "betterend:block/dense_vine", + "roots": "betterend:block/dense_vine_roots" + }, + "elements": [ + { + "__comment": "PlaneX1", + "from": [ 2.375, 0, 2.25 ], + "to": [ 2.376, 16, 18.25 ], + "rotation": { "origin": [ 2.375, 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": "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": "PlaneX4", + "from": [ 5, 0, 0.5 ], + "to": [ 5.001, 16, 16.5 ], + "rotation": { "origin": [ 5, 0, 0.5 ], "axis": "y", "angle": 22.5 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 16, 16, 0 ], "texture": "#roots" }, + "east": { "uv": [ 0, 16, 16, 0 ], "texture": "#roots" } + } + }, + { + "__comment": "PlaneZ5", + "from": [ 0.5, 0, 11 ], + "to": [ 16.5, 16, 11.001 ], + "rotation": { "origin": [ 0.5, 0, 11 ], "axis": "y", "angle": 22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#roots" }, + "south": { "uv": [ 0, 16, 16, 0 ], "texture": "#roots" } + } + }, + { + "__comment": "PlaneX4", + "from": [ 11, 0, 0.5 ], + "to": [ 11.001, 16, 16.5 ], + "rotation": { "origin": [ 11, 0, 0.5 ], "axis": "y", "angle": -22.5 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 16, 16, 0 ], "texture": "#roots" }, + "east": { "uv": [ 0, 16, 16, 0 ], "texture": "#roots" } + } + }, + { + "__comment": "PlaneZ5", + "from": [ 0.5, 0, 5 ], + "to": [ 16.5, 16, 5.001 ], + "rotation": { "origin": [ 0.5, 0, 5 ], "axis": "y", "angle": -22.5 }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 16, 16, 0 ], "texture": "#roots" }, + "south": { "uv": [ 0, 16, 16, 0 ], "texture": "#roots" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/dense_vine.json b/src/main/resources/assets/betterend/models/item/dense_vine.json new file mode 100644 index 00000000..5d088957 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/dense_vine.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:block/dense_vine_bottom" + } +} diff --git a/src/main/resources/assets/betterend/textures/block/dense_vine.png b/src/main/resources/assets/betterend/textures/block/dense_vine.png new file mode 100644 index 0000000000000000000000000000000000000000..0d75a1032c5025518dabef7a949375dfdf324c25 GIT binary patch literal 2448 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 literal 0 HcmV?d00001