diff --git a/src/main/java/ru/betterend/blocks/BlockUmbrellaMoss.java b/src/main/java/ru/betterend/blocks/BlockUmbrellaMoss.java new file mode 100644 index 00000000..62eaad62 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/BlockUmbrellaMoss.java @@ -0,0 +1,9 @@ +package ru.betterend.blocks; + +import ru.betterend.blocks.basis.BlockPlant; + +public class BlockUmbrellaMoss extends BlockPlant { + public BlockUmbrellaMoss() { + super(12); + } +} diff --git a/src/main/java/ru/betterend/blocks/BlockUmbrellaMossTall.java b/src/main/java/ru/betterend/blocks/BlockUmbrellaMossTall.java new file mode 100644 index 00000000..26d51cf4 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/BlockUmbrellaMossTall.java @@ -0,0 +1,44 @@ +package ru.betterend.blocks; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.entity.ItemEntity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.IntProperty; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import ru.betterend.blocks.basis.BlockDoublePlant; +import ru.betterend.registry.BlockRegistry; +import ru.betterend.util.BlocksHelper; + +public class BlockUmbrellaMossTall extends BlockDoublePlant { + public static final IntProperty ROTATION = IntProperty.of("rotation", 0, 3); + + public BlockUmbrellaMossTall() { + super(12); + } + + @Override + public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { + ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(BlockRegistry.UMBRELLA_MOSS)); + world.spawnEntity(item); + } + + @Override + public void onPlaced(World world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { + int rot = world.random.nextInt(4); + BlocksHelper.setWithoutUpdate(world, pos, this.getDefaultState().with(ROTATION, rot)); + BlocksHelper.setWithoutUpdate(world, pos.up(), this.getDefaultState().with(ROTATION, rot).with(TOP, true)); + } + + @Override + protected void appendProperties(StateManager.Builder stateManager) { + super.appendProperties(stateManager); + stateManager.add(ROTATION); + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockDoublePlant.java b/src/main/java/ru/betterend/blocks/basis/BlockDoublePlant.java new file mode 100644 index 00000000..9e170707 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/BlockDoublePlant.java @@ -0,0 +1,143 @@ +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.entity.ItemEntity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.context.LootContext; +import net.minecraft.loot.context.LootContextParameters; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.BooleanProperty; +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.client.ERenderLayer; +import ru.betterend.client.IRenderTypeable; +import ru.betterend.registry.BlockTagRegistry; +import ru.betterend.util.BlocksHelper; + +public class BlockDoublePlant extends BlockBaseNotFull implements IRenderTypeable, Fertilizable { + private static final VoxelShape SHAPE = Block.createCuboidShape(4, 2, 4, 12, 16, 12); + public static final BooleanProperty TOP = BooleanProperty.of("top"); + + public BlockDoublePlant() { + super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT) + .breakByTool(FabricToolTags.SHEARS) + .sounds(BlockSoundGroup.WET_GRASS) + .breakByHand(true) + .noCollision()); + this.setDefaultState(this.stateManager.getDefaultState().with(TOP, false)); + } + + public BlockDoublePlant(int light) { + super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT) + .breakByTool(FabricToolTags.SHEARS) + .sounds(BlockSoundGroup.WET_GRASS) + .lightLevel((state) -> { return state.get(TOP) ? light : 0; }) + .breakByHand(true) + .noCollision()); + this.setDefaultState(this.stateManager.getDefaultState().with(TOP, false)); + } + + @Override + protected void appendProperties(StateManager.Builder stateManager) { + stateManager.add(TOP); + } + + @Override + public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + Vec3d vec3d = state.getModelOffset(view, pos); + return SHAPE.offset(vec3d.x, vec3d.y, vec3d.z); + } + + @Override + public AbstractBlock.OffsetType getOffsetType() { + return AbstractBlock.OffsetType.XZ; + } + + @Override + public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + BlockState down = world.getBlockState(pos.down()); + BlockState up = world.getBlockState(pos.up()); + return state.get(TOP) ? down.getBlock() == this : down.isIn(BlockTagRegistry.END_GROUND) && (up.getMaterial().isReplaceable()); + } + + public boolean canStayAt(BlockState state, WorldView world, BlockPos pos) { + BlockState down = world.getBlockState(pos.down()); + BlockState up = world.getBlockState(pos.up()); + return state.get(TOP) ? down.getBlock() == this : down.isIn(BlockTagRegistry.END_GROUND) && (up.getBlock() == this); + } + + @Override + public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { + if (!canStayAt(state, world, pos)) { + return Blocks.AIR.getDefaultState(); + } + else { + return state; + } + } + + @Override + public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + if (state.get(TOP)) { + return Lists.newArrayList(); + } + + ItemStack tool = builder.get(LootContextParameters.TOOL); + if (tool != null && tool.getItem().isIn(FabricToolTags.SHEARS) || EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { + 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) { + return true; + } + + @Override + public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { + ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(this)); + world.spawnEntity(item); + } + + @Override + public void onPlaced(World world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { + BlocksHelper.setWithoutUpdate(world, pos.up(), this.getDefaultState().with(TOP, true)); + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockPlant.java b/src/main/java/ru/betterend/blocks/basis/BlockPlant.java new file mode 100644 index 00000000..afd268f2 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/BlockPlant.java @@ -0,0 +1,115 @@ +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.entity.ItemEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.context.LootContext; +import net.minecraft.loot.context.LootContextParameters; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.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.client.ERenderLayer; +import ru.betterend.client.IRenderTypeable; +import ru.betterend.registry.BlockTagRegistry; + +public class BlockPlant extends BlockBaseNotFull implements IRenderTypeable, Fertilizable { + private static final VoxelShape SHAPE = Block.createCuboidShape(4, 2, 4, 12, 14, 12); + + public BlockPlant() { + super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT) + .breakByTool(FabricToolTags.SHEARS) + .sounds(BlockSoundGroup.GRASS) + .breakByHand(true) + .noCollision()); + } + + public BlockPlant(int light) { + super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT) + .breakByTool(FabricToolTags.SHEARS) + .sounds(BlockSoundGroup.GRASS) + .lightLevel(light) + .breakByHand(true) + .noCollision()); + } + + @Override + public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + Vec3d vec3d = state.getModelOffset(view, pos); + return SHAPE.offset(vec3d.x, vec3d.y, vec3d.z); + } + + @Override + public AbstractBlock.OffsetType getOffsetType() { + return AbstractBlock.OffsetType.XZ; + } + + @Override + public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + BlockState down = world.getBlockState(pos.down()); + return down.isIn(BlockTagRegistry.END_GROUND); + } + + @Override + public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { + if (!canPlaceAt(state, world, pos)) { + return Blocks.AIR.getDefaultState(); + } + else { + return state; + } + } + + @Override + public 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) { + return true; + } + + @Override + public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { + ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(this)); + world.spawnEntity(item); + } +} diff --git a/src/main/java/ru/betterend/registry/BlockRegistry.java b/src/main/java/ru/betterend/registry/BlockRegistry.java index 4789f61c..d2e63f5e 100644 --- a/src/main/java/ru/betterend/registry/BlockRegistry.java +++ b/src/main/java/ru/betterend/registry/BlockRegistry.java @@ -14,6 +14,8 @@ import ru.betterend.blocks.BlockMossyGlowshroomHymenophore; import ru.betterend.blocks.BlockMossyGlowshroomSapling; import ru.betterend.blocks.BlockOre; import ru.betterend.blocks.BlockTerrain; +import ru.betterend.blocks.BlockUmbrellaMoss; +import ru.betterend.blocks.BlockUmbrellaMossTall; import ru.betterend.blocks.EndStoneSmelter; import ru.betterend.blocks.EnderBlock; import ru.betterend.blocks.TerminiteBlock; @@ -33,6 +35,10 @@ public class BlockRegistry { public static final Block MOSSY_GLOWSHROOM_FUR = registerBlock("mossy_glowshroom_fur", new BlockMossyGlowshroomFur()); public static final WoodenMaterial MOSSY_GLOWSHROOM = new WoodenMaterial("mossy_glowshroom", MaterialColor.GRAY, MaterialColor.WOOD); + // Small Plants // + public static final Block UMBRELLA_MOSS = registerBlock("umbrella_moss", new BlockUmbrellaMoss()); + public static final Block UMBRELLA_MOSS_TALL = registerBlock("umbrella_moss_tall", new BlockUmbrellaMossTall()); + // Ores // public static final Block ENDER_ORE = registerBlock("ender_ore", new BlockOre(ItemRegistry.ENDER_DUST, 1, 3)); diff --git a/src/main/resources/assets/betterend/blockstates/umbrella_moss.json b/src/main/resources/assets/betterend/blockstates/umbrella_moss.json new file mode 100644 index 00000000..1934ca32 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/umbrella_moss.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/umbrella_moss_small" }, + { "model": "betterend:block/umbrella_moss_small", "y": 90 }, + { "model": "betterend:block/umbrella_moss_small", "y": 180 }, + { "model": "betterend:block/umbrella_moss_small", "y": 270 } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/umbrella_moss_tall.json b/src/main/resources/assets/betterend/blockstates/umbrella_moss_tall.json new file mode 100644 index 00000000..53d7b64b --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/umbrella_moss_tall.json @@ -0,0 +1,12 @@ +{ + "variants": { + "top=true,rotation=0": { "model": "betterend:block/umbrella_moss_top" }, + "top=false,rotation=0": { "model": "betterend:block/umbrella_moss_bottom" }, + "top=true,rotation=1": { "model": "betterend:block/umbrella_moss_top", "y": 90 }, + "top=false,rotation=1": { "model": "betterend:block/umbrella_moss_bottom", "y": 90 }, + "top=true,rotation=2": { "model": "betterend:block/umbrella_moss_top", "y": 180 }, + "top=false,rotation=2": { "model": "betterend:block/umbrella_moss_bottom", "y": 180 }, + "top=true,rotation=3": { "model": "betterend:block/umbrella_moss_top", "y": 270 }, + "top=false,rotation=3": { "model": "betterend:block/umbrella_moss_bottom", "y": 270 } + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbrella_moss_bottom.json b/src/main/resources/assets/betterend/models/block/umbrella_moss_bottom.json new file mode 100644 index 00000000..f637005b --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbrella_moss_bottom.json @@ -0,0 +1,75 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/umbrella_moss_bottom", + "texture": "betterend:block/umbrella_moss_bottom" + }, + "elements": [ + { + "__comment": "PlaneX3", + "from": [ -2, 0, -2 ], + "to": [ -1.999, 16, 14 ], + "rotation": { "origin": [ -2, 0, -2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 9.5, 0, -2 ], + "to": [ 9.501, 16, 14 ], + "rotation": { "origin": [ 9.5, 0, -2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 6, 0, 3 ], + "to": [ 6.001, 16, 19 ], + "rotation": { "origin": [ 6, 0, 3 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 17.5, 0, 3 ], + "to": [ 17.501, 16, 19 ], + "rotation": { "origin": [ 17.5, 0, 3 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -1, 0, 6 ], + "to": [ -0.999, 16, 22 ], + "rotation": { "origin": [ -1, 0, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 10.5, 0, 6 ], + "to": [ 10.501, 16, 22 ], + "rotation": { "origin": [ 10.5, 0, 6 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/umbrella_moss_small.json b/src/main/resources/assets/betterend/models/block/umbrella_moss_small.json new file mode 100644 index 00000000..6902348e --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbrella_moss_small.json @@ -0,0 +1,238 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/umbrella_moss_up", + "texture": "betterend:block/umbrella_moss_up", + "spore": "betterend:block/umbrella_moss_sporophyte", + "small": "betterend:block/umbrella_moss_small" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 3, 13, 3 ], + "to": [ 5, 16, 5 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 11, 12, 8 ], + "to": [ 13, 15, 10 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 4, 11, 11 ], + "to": [ 6, 14, 13 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 1, 12, 1 ], + "to": [ 7, 14, 7 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -2, 0, -2 ], + "to": [ -1.999, 13, 14 ], + "rotation": { "origin": [ -2, 0, -2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 9.5, 0, -2 ], + "to": [ 9.501, 13, 14 ], + "rotation": { "origin": [ 9.5, 0, -2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 7, 14, 7 ], + "to": [ 1, 12, 1 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 9, 11, 6 ], + "to": [ 15, 13, 12 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 6, 0, 3 ], + "to": [ 6.001, 12, 19 ], + "rotation": { "origin": [ 6, 0, 3 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 4, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 4, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 17.5, 0, 3 ], + "to": [ 17.501, 12, 19 ], + "rotation": { "origin": [ 17.5, 0, 3 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 4, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 4, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 15, 13, 12 ], + "to": [ 9, 11, 6 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 2, 10, 9 ], + "to": [ 8, 12, 15 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -1, 0, 6 ], + "to": [ -0.999, 11, 22 ], + "rotation": { "origin": [ -1, 0, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 10.5, 0, 6 ], + "to": [ 10.501, 11, 22 ], + "rotation": { "origin": [ 10.5, 0, 6 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 8, 12, 15 ], + "to": [ 2, 10, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneY16", + "from": [ 0, 0, 9 ], + "to": [ 16, 0.001, 25 ], + "rotation": { "origin": [ 0, 0, 9 ], "axis": "x", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 180 } + } + }, + { + "__comment": "PlaneY16", + "from": [ 0, -0.001, -9 ], + "to": [ 16, 0, 7 ], + "rotation": { "origin": [ 0, 0, 7 ], "axis": "x", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 180 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small" } + } + }, + { + "__comment": "PlaneY18", + "from": [ 9, 0, 0 ], + "to": [ 25, 0.001, 16 ], + "rotation": { "origin": [ 9, 0, 0 ], "axis": "z", "angle": 22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 90 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 90 } + } + }, + { + "__comment": "PlaneY18", + "from": [ -9, -0.001, 0 ], + "to": [ 7, 0, 16 ], + "rotation": { "origin": [ 7, 0, 0 ], "axis": "z", "angle": -22.5 }, + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 270 }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#small", "rotation": 270 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/umbrella_moss_top.json b/src/main/resources/assets/betterend/models/block/umbrella_moss_top.json new file mode 100644 index 00000000..e8fe6304 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbrella_moss_top.json @@ -0,0 +1,193 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/umbrella_moss_up", + "texture": "betterend:block/umbrella_moss_up", + "spore": "betterend:block/umbrella_moss_sporophyte" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 3, 13, 3 ], + "to": [ 5, 16, 5 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 11, 12, 8 ], + "to": [ 13, 15, 10 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 4, 11, 11 ], + "to": [ 6, 14, 13 ], + "faces": { + "down": { "uv": [ 7, 5, 9, 7 ], "texture": "#spore" }, + "up": { "uv": [ 7, 0, 9, 2 ], "texture": "#spore" }, + "north": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "south": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "west": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" }, + "east": { "uv": [ 7, 2, 9, 5 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 1, 12, 1 ], + "to": [ 7, 14, 7 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -2, 0, -2 ], + "to": [ -1.999, 13, 14 ], + "rotation": { "origin": [ -2, 0, -2 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 9.5, 0, -2 ], + "to": [ 9.501, 13, 14 ], + "rotation": { "origin": [ 9.5, 0, -2 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 3, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 7, 14, 7 ], + "to": [ 1, 12, 1 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 9, 11, 6 ], + "to": [ 15, 13, 12 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 6, 0, 3 ], + "to": [ 6.001, 12, 19 ], + "rotation": { "origin": [ 6, 0, 3 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 4, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 4, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 17.5, 0, 3 ], + "to": [ 17.501, 12, 19 ], + "rotation": { "origin": [ 17.5, 0, 3 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 4, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 4, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 15, 13, 12 ], + "to": [ 9, 11, 6 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "Box1", + "from": [ 2, 10, 9 ], + "to": [ 8, 12, 15 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + }, + { + "__comment": "PlaneX3", + "from": [ -1, 0, 6 ], + "to": [ -0.999, 11, 22 ], + "rotation": { "origin": [ -1, 0, 6 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX3", + "from": [ 10.5, 0, 6 ], + "to": [ 10.501, 11, 22 ], + "rotation": { "origin": [ 10.5, 0, 6 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 5, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 8, 12, 15 ], + "to": [ 2, 10, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 6, 6 ], "texture": "#spore" }, + "north": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "south": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "west": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" }, + "east": { "uv": [ 0, 6, 6, 8 ], "texture": "#spore" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/umbrella_moss.json b/src/main/resources/assets/betterend/models/item/umbrella_moss.json new file mode 100644 index 00000000..e0556847 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/umbrella_moss.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/umbrella_moss_small" + } +} diff --git a/src/main/resources/assets/betterend/models/item/umbrella_moss_tall.json b/src/main/resources/assets/betterend/models/item/umbrella_moss_tall.json new file mode 100644 index 00000000..47ed1f14 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/umbrella_moss_tall.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betterend:item/umbrella_moss_large" + } +} diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_moss_bottom.png b/src/main/resources/assets/betterend/textures/block/umbrella_moss_bottom.png new file mode 100644 index 00000000..cc899542 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbrella_moss_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_moss_small.png b/src/main/resources/assets/betterend/textures/block/umbrella_moss_small.png new file mode 100644 index 00000000..584d8981 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbrella_moss_small.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_moss_sporophyte.png b/src/main/resources/assets/betterend/textures/block/umbrella_moss_sporophyte.png new file mode 100644 index 00000000..0311ec52 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbrella_moss_sporophyte.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_moss_up.png b/src/main/resources/assets/betterend/textures/block/umbrella_moss_up.png new file mode 100644 index 00000000..14f65ba0 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbrella_moss_up.png differ diff --git a/src/main/resources/assets/betterend/textures/item/umbrella_moss_large.png b/src/main/resources/assets/betterend/textures/item/umbrella_moss_large.png new file mode 100644 index 00000000..c3498af8 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/umbrella_moss_large.png differ diff --git a/src/main/resources/assets/betterend/textures/item/umbrella_moss_small.png b/src/main/resources/assets/betterend/textures/item/umbrella_moss_small.png new file mode 100644 index 00000000..0a9f6b0f Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/umbrella_moss_small.png differ