diff --git a/src/main/java/org/betterx/bclib/complexmaterials/set/wood/BarStool.java b/src/main/java/org/betterx/bclib/complexmaterials/set/wood/BarStool.java new file mode 100644 index 00000000..66729e04 --- /dev/null +++ b/src/main/java/org/betterx/bclib/complexmaterials/set/wood/BarStool.java @@ -0,0 +1,51 @@ +package org.betterx.bclib.complexmaterials.set.wood; + +import org.betterx.bclib.complexmaterials.ComplexMaterial; +import org.betterx.bclib.complexmaterials.WoodenComplexMaterial; +import org.betterx.bclib.complexmaterials.entry.BlockEntry; +import org.betterx.bclib.complexmaterials.entry.SimpleMaterialSlot; +import org.betterx.bclib.furniture.block.BaseBarStool; +import org.betterx.bclib.recipes.BCLRecipeBuilder; + +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockBehaviour; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class BarStool extends SimpleMaterialSlot { + public BarStool() { + super("bar_stool"); + } + + public static void makeBarStoolRecipe(ResourceLocation id, Block barStool, Block planks) { + BCLRecipeBuilder.crafting(id, barStool) + .setShape("##", "II", "II") + .addMaterial('#', planks) + .addMaterial('I', Items.STICK) + .setGroup("bar_stool") + .setCategory(RecipeCategory.DECORATIONS) + .build(); + } + + @Override + protected @NotNull Block createBlock( + WoodenComplexMaterial parentMaterial, BlockBehaviour.Properties settings + ) { + return new BaseBarStool(parentMaterial.getBlock(WoodSlots.SLAB)); + } + + @Override + protected void modifyBlockEntry(WoodenComplexMaterial parentMaterial, @NotNull BlockEntry entry) { + entry.setBlockTags(BlockTags.MINEABLE_WITH_AXE); + } + + @Override + protected @Nullable void makeRecipe(ComplexMaterial parentMaterial, ResourceLocation id) { + BarStool.makeBarStoolRecipe(id, parentMaterial.getBlock(suffix), parentMaterial.getBlock(WoodSlots.SLAB)); + } +} diff --git a/src/main/java/org/betterx/bclib/complexmaterials/set/wood/Chair.java b/src/main/java/org/betterx/bclib/complexmaterials/set/wood/Chair.java new file mode 100644 index 00000000..0b4f1d17 --- /dev/null +++ b/src/main/java/org/betterx/bclib/complexmaterials/set/wood/Chair.java @@ -0,0 +1,51 @@ +package org.betterx.bclib.complexmaterials.set.wood; + +import org.betterx.bclib.complexmaterials.ComplexMaterial; +import org.betterx.bclib.complexmaterials.WoodenComplexMaterial; +import org.betterx.bclib.complexmaterials.entry.BlockEntry; +import org.betterx.bclib.complexmaterials.entry.SimpleMaterialSlot; +import org.betterx.bclib.furniture.block.BaseChair; +import org.betterx.bclib.recipes.BCLRecipeBuilder; + +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockBehaviour; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class Chair extends SimpleMaterialSlot { + public Chair() { + super("chair"); + } + + public static void makeChairRecipe(ResourceLocation id, Block chair, Block planks) { + BCLRecipeBuilder.crafting(id, chair) + .setShape("I ", "##", "II") + .addMaterial('#', planks) + .addMaterial('I', Items.STICK) + .setGroup("chair") + .setCategory(RecipeCategory.DECORATIONS) + .build(); + } + + @Override + protected void modifyBlockEntry(WoodenComplexMaterial parentMaterial, @NotNull BlockEntry entry) { + entry.setBlockTags(BlockTags.MINEABLE_WITH_AXE); + } + + @Override + protected @NotNull Block createBlock( + WoodenComplexMaterial parentMaterial, BlockBehaviour.Properties settings + ) { + return new BaseChair(parentMaterial.getBlock(WoodSlots.SLAB)); + } + + @Override + protected @Nullable void makeRecipe(ComplexMaterial parentMaterial, ResourceLocation id) { + Chair.makeChairRecipe(id, parentMaterial.getBlock(suffix), parentMaterial.getBlock(WoodSlots.SLAB)); + } +} diff --git a/src/main/java/org/betterx/bclib/complexmaterials/set/wood/Taburet.java b/src/main/java/org/betterx/bclib/complexmaterials/set/wood/Taburet.java new file mode 100644 index 00000000..0c402e33 --- /dev/null +++ b/src/main/java/org/betterx/bclib/complexmaterials/set/wood/Taburet.java @@ -0,0 +1,51 @@ +package org.betterx.bclib.complexmaterials.set.wood; + +import org.betterx.bclib.complexmaterials.ComplexMaterial; +import org.betterx.bclib.complexmaterials.WoodenComplexMaterial; +import org.betterx.bclib.complexmaterials.entry.BlockEntry; +import org.betterx.bclib.complexmaterials.entry.SimpleMaterialSlot; +import org.betterx.bclib.furniture.block.BaseTaburet; +import org.betterx.bclib.recipes.BCLRecipeBuilder; + +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockBehaviour; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class Taburet extends SimpleMaterialSlot { + public Taburet() { + super("taburet"); + } + + public static void makeTaburetRecipe(ResourceLocation id, Block taburet, Block planks) { + BCLRecipeBuilder.crafting(id, taburet) + .setShape("##", "II") + .addMaterial('#', planks) + .addMaterial('I', Items.STICK) + .setGroup("taburet") + .setCategory(RecipeCategory.DECORATIONS) + .build(); + } + + @Override + protected void modifyBlockEntry(WoodenComplexMaterial parentMaterial, @NotNull BlockEntry entry) { + entry.setBlockTags(BlockTags.MINEABLE_WITH_AXE); + } + + @Override + protected @NotNull Block createBlock( + WoodenComplexMaterial parentMaterial, BlockBehaviour.Properties settings + ) { + return new BaseTaburet(parentMaterial.getBlock(WoodSlots.SLAB)); + } + + @Override + protected @Nullable void makeRecipe(ComplexMaterial parentMaterial, ResourceLocation id) { + Taburet.makeTaburetRecipe(id, parentMaterial.getBlock(suffix), parentMaterial.getBlock(WoodSlots.SLAB)); + } +} diff --git a/src/main/java/org/betterx/bclib/complexmaterials/set/wood/WoodSlots.java b/src/main/java/org/betterx/bclib/complexmaterials/set/wood/WoodSlots.java index 59428652..1738e863 100644 --- a/src/main/java/org/betterx/bclib/complexmaterials/set/wood/WoodSlots.java +++ b/src/main/java/org/betterx/bclib/complexmaterials/set/wood/WoodSlots.java @@ -31,6 +31,9 @@ public class WoodSlots { public static final String WALL_SIGN = Sign.WALL_SUFFFIX; public static final String WALL_HANGING_SIGN = HangingSign.WALL_SUFFFIX; public static final String SAPLING = AbstractSaplingSlot.SAPLING_SUFFIX; + public static final MaterialSlot TABURET = new Taburet(); + public static final MaterialSlot CHAIR = new Chair(); + public static final MaterialSlot BAR_STOOL = new BarStool(); } diff --git a/src/main/java/org/betterx/bclib/furniture/block/AbstractChair.java b/src/main/java/org/betterx/bclib/furniture/block/AbstractChair.java new file mode 100644 index 00000000..b0e9d255 --- /dev/null +++ b/src/main/java/org/betterx/bclib/furniture/block/AbstractChair.java @@ -0,0 +1,152 @@ +package org.betterx.bclib.furniture.block; + +import org.betterx.bclib.BCLib; +import org.betterx.bclib.blocks.BaseBlockNotFull; +import org.betterx.bclib.furniture.entity.EntityChair; +import org.betterx.bclib.registry.BaseBlockEntities; +import org.betterx.bclib.util.BlocksHelper; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.BlockHitResult; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; + +import java.util.List; +import java.util.Optional; +import org.jetbrains.annotations.Nullable; + +public abstract class AbstractChair extends BaseBlockNotFull { + public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING; + private final float height; + + public AbstractChair(Block block, int height) { + super(FabricBlockSettings.copyOf(block).noOcclusion()); + this.height = (height - 3F) / 16F; + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(FACING); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + return this.defaultBlockState().setValue(FACING, ctx.getHorizontalDirection().getOpposite()); + } + + @Override + public InteractionResult use( + BlockState state, + Level world, + BlockPos pos, + Player player, + InteractionHand hand, + BlockHitResult hit + ) { + if (world.isClientSide) { + return InteractionResult.FAIL; + } else { + if (player.isPassenger() || player.isSpectator()) + return InteractionResult.FAIL; + + + Optional active = getEntity(world, pos); + EntityChair entity; + + if (active.isEmpty()) { + entity = createEntity(state, world, pos); + } else { + entity = active.get(); + if (entity.isVehicle()) + return InteractionResult.FAIL; + } + + if (entity != null) { + float yaw = state.getValue(FACING).getOpposite().toYRot(); + player.startRiding(entity, true); + player.setYBodyRot(yaw); + player.setYHeadRot(yaw); + return InteractionResult.SUCCESS; + } + + return InteractionResult.FAIL; + } + } + + @Nullable + private EntityChair createEntity(BlockState state, Level world, BlockPos pos) { + BCLib.LOGGER.info("Creating Chair at " + pos + ", " + state); + EntityChair entity; + double px = pos.getX() + 0.5; + double py = pos.getY() + height; + double pz = pos.getZ() + 0.5; + float yaw = state.getValue(FACING).getOpposite().toYRot(); + + entity = BaseBlockEntities.CHAIR.create(world); + entity.moveTo(px, py, pz, yaw, 0); + entity.setNoGravity(true); + entity.setSilent(true); + entity.setInvisible(true); + entity.setYHeadRot(yaw); + entity.setYBodyRot(yaw); + if (!world.addFreshEntity(entity)) { + entity = null; + } + return entity; + } + + private Optional getEntity(Level level, BlockPos pos) { + List list = level.getEntitiesOfClass( + EntityChair.class, + new AABB(pos), + entity -> true + ); + if (list.isEmpty()) return Optional.empty(); + return Optional.of(list.get(0)); + } + + @Override + public BlockState rotate(BlockState state, Rotation rotation) { + return BlocksHelper.rotateHorizontal(state, rotation, FACING); + } + + @Override + public BlockState mirror(BlockState state, Mirror mirror) { + return BlocksHelper.mirrorHorizontal(state, mirror, FACING); + } + + @Override + public void onPlace(BlockState blockState, Level level, BlockPos blockPos, BlockState blockState2, boolean bl) { + super.onPlace(blockState, level, blockPos, blockState2, bl); + BCLib.LOGGER.info("Created at " + blockPos + ", " + blockState + ", " + blockState2); + if (blockState.hasProperty(BaseChair.TOP)) { + if (blockState.getValue(BaseChair.TOP)) + return; + } + createEntity(blockState, level, blockPos); + } + + @Override + public void onRemove(BlockState blockState, Level level, BlockPos blockPos, BlockState blockState2, boolean bl) { + super.onRemove(blockState, level, blockPos, blockState2, bl); +// Optional e = getEntity(level, blockPos); +// +// if (e.isPresent()) { +// BCLib.LOGGER.info("Discarding Chair at " + blockPos); +// e.get().discard(); +// } + } +} diff --git a/src/main/java/org/betterx/bclib/furniture/block/BaseBarStool.java b/src/main/java/org/betterx/bclib/furniture/block/BaseBarStool.java new file mode 100644 index 00000000..07343fdb --- /dev/null +++ b/src/main/java/org/betterx/bclib/furniture/block/BaseBarStool.java @@ -0,0 +1,21 @@ +package org.betterx.bclib.furniture.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; + +public class BaseBarStool extends AbstractChair { + private static final VoxelShape SHAPE = Block.box(4, 0, 4, 12, 16, 12); + + public BaseBarStool(Block block) { + super(block, 15); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return SHAPE; + } +} \ No newline at end of file diff --git a/src/main/java/org/betterx/bclib/furniture/block/BaseChair.java b/src/main/java/org/betterx/bclib/furniture/block/BaseChair.java new file mode 100644 index 00000000..683b863e --- /dev/null +++ b/src/main/java/org/betterx/bclib/furniture/block/BaseChair.java @@ -0,0 +1,117 @@ +package org.betterx.bclib.furniture.block; + +import org.betterx.bclib.util.BlocksHelper; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.storage.loot.LootParams; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; + +import java.util.Collections; +import java.util.List; + +public class BaseChair extends AbstractChair { + private static final VoxelShape SHAPE_BOTTOM = box(3, 0, 3, 13, 16, 13); + private static final VoxelShape SHAPE_TOP = box(3, 0, 3, 13, 6, 13); + private static final VoxelShape COLLIDER = box(3, 0, 3, 13, 10, 13); + public static final BooleanProperty TOP = BooleanProperty.create("top"); + + public BaseChair(Block block) { + super(block, 10); + this.registerDefaultState(getStateDefinition().any().setValue(FACING, Direction.NORTH).setValue(TOP, false)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { + stateManager.add(FACING, TOP); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return state.getValue(TOP) ? SHAPE_TOP : SHAPE_BOTTOM; + } + + @Override + public VoxelShape getCollisionShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return state.getValue(TOP) ? Shapes.empty() : COLLIDER; + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + if (state.getValue(TOP)) + return true; + BlockState up = world.getBlockState(pos.above()); + return up.isAir() || (up.getBlock() == this && up.getValue(TOP)); + } + + @Override + public void setPlacedBy(Level world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { + if (!world.isClientSide()) + BlocksHelper.setWithUpdate(world, pos.above(), state.setValue(TOP, true)); + } + + @Override + public BlockState updateShape( + BlockState state, + Direction facing, + BlockState neighborState, + LevelAccessor world, + BlockPos pos, + BlockPos neighborPos + ) { + if (state.getValue(TOP)) { + return world.getBlockState(pos.below()).getBlock() == this ? state : Blocks.AIR.defaultBlockState(); + } else { + return world.getBlockState(pos.above()).getBlock() == this ? state : Blocks.AIR.defaultBlockState(); + } + } + + @Override + public List getDrops(BlockState state, LootParams.Builder builder) { + if (!state.getValue(TOP)) + return Collections.singletonList(new ItemStack(this.asItem())); + else + return Collections.emptyList(); + } + + @Override + public InteractionResult use( + BlockState state, + Level world, + BlockPos pos, + Player player, + InteractionHand hand, + BlockHitResult hit + ) { + if (state.getValue(TOP)) { + pos = pos.below(); + state = world.getBlockState(pos); + } + return super.use(state, world, pos, player, hand, hit); + } + + @Override + public void playerWillDestroy(Level world, BlockPos pos, BlockState state, Player player) { + if (player.isCreative() && state.getValue(TOP) && world.getBlockState(pos.below()).getBlock() == this) { + world.setBlockAndUpdate(pos.below(), Blocks.AIR.defaultBlockState()); + } + super.playerWillDestroy(world, pos, state, player); + } +} diff --git a/src/main/java/org/betterx/bclib/furniture/block/BaseTaburet.java b/src/main/java/org/betterx/bclib/furniture/block/BaseTaburet.java new file mode 100644 index 00000000..4fbb9eca --- /dev/null +++ b/src/main/java/org/betterx/bclib/furniture/block/BaseTaburet.java @@ -0,0 +1,21 @@ +package org.betterx.bclib.furniture.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; + +public class BaseTaburet extends AbstractChair { + private static final VoxelShape SHAPE = Block.box(2, 0, 2, 14, 10, 14); + + public BaseTaburet(Block block) { + super(block, 9); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return SHAPE; + } +} diff --git a/src/main/java/org/betterx/bclib/furniture/entity/EntityChair.java b/src/main/java/org/betterx/bclib/furniture/entity/EntityChair.java new file mode 100644 index 00000000..30c2964a --- /dev/null +++ b/src/main/java/org/betterx/bclib/furniture/entity/EntityChair.java @@ -0,0 +1,147 @@ +package org.betterx.bclib.furniture.entity; + +import org.betterx.bclib.BCLib; +import org.betterx.bclib.furniture.block.AbstractChair; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntitySelector; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.animal.WaterAnimal; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; + +import java.util.List; +import org.jetbrains.annotations.Nullable; + +public class EntityChair extends Entity { + public EntityChair(EntityType type, Level world) { + super(type, world); + } + + @Override + protected void defineSynchedData() { + + } + + protected int getMaxPassengers() { + return 1; + } + + @Override + public void tick() { + if (this.level().getBlockState(this.blockPosition()).getBlock() instanceof AbstractChair) + localTick(); + else { + BCLib.LOGGER.info("Chair Block was deleted -> ejecting"); + this.ejectPassengers(); + this.discard(); + } + } + + protected void localTick() { + super.tick(); + List pushableEntities = this.level().getEntities( + this, + this.getBoundingBox().inflate(0.7f, -0.01f, 0.7f), + EntitySelector.pushableBy(this) + ); + + if (!pushableEntities.isEmpty()) { + boolean free = !this.level().isClientSide && !(this.getControllingPassenger() instanceof Player); + for (int j = 0; j < pushableEntities.size(); ++j) { + Entity entity = pushableEntities.get(j); + if (entity.hasPassenger(this)) continue; + if (free + && this.getPassengers().size() < this.getMaxPassengers() + && !entity.isPassenger() + //&& entity.getBbWidth() < this.getBbWidth() + && entity instanceof LivingEntity + && !(entity instanceof WaterAnimal) + && !(entity instanceof Player) + ) { + entity.startRiding(this); + continue; + } + this.push(entity); + } + } + } + + @Override + protected void readAdditionalSaveData(CompoundTag compoundTag) { + + } + + @Override + protected void addAdditionalSaveData(CompoundTag compoundTag) { + + } + + @Override + public boolean isAlive() { + return !this.isRemoved(); + } + + @Override + public Packet getAddEntityPacket() { + return new ClientboundAddEntityPacket(this); + } + + @Override + protected boolean canAddPassenger(Entity entity) { + return this.getPassengers().size() < this.getMaxPassengers(); + } + + @Nullable + @Override + public LivingEntity getControllingPassenger() { + for (Entity e : getPassengers()) { + if (e instanceof LivingEntity le) return le; + } + return null; + } + + @Override + public void push(Entity entity) { + //Do nothing. Should not be pushable + } + + @Override + public double getPassengersRidingOffset() { + return 0.0; + } + + @Override + public double getMyRidingOffset() { + return 0.0; + } + + @Override + public InteractionResult interact(Player player, InteractionHand interactionHand) { + if (player.isSecondaryUseActive()) { + return InteractionResult.PASS; + } + + if (!this.level().isClientSide) { + return player.startRiding(this) ? InteractionResult.CONSUME : InteractionResult.PASS; + } + return InteractionResult.SUCCESS; + } + + public static AttributeSupplier getAttributeContainer() { + return AttributeSupplier.builder().build(); + } + + @Override + public boolean isPickable() { + return !this.isRemoved(); + } +} diff --git a/src/main/java/org/betterx/bclib/furniture/renderer/RenderChair.java b/src/main/java/org/betterx/bclib/furniture/renderer/RenderChair.java new file mode 100644 index 00000000..1ebe6ceb --- /dev/null +++ b/src/main/java/org/betterx/bclib/furniture/renderer/RenderChair.java @@ -0,0 +1,24 @@ +package org.betterx.bclib.furniture.renderer; + +import org.betterx.bclib.furniture.entity.EntityChair; + +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.resources.ResourceLocation; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; + +@Environment(value = EnvType.CLIENT) +public class RenderChair extends EntityRenderer { + private static final ResourceLocation TEXTURE = new ResourceLocation("minecraft:textures/block/stone.png"); + + public RenderChair(EntityRendererProvider.Context context) { + super(context); + } + + @Override + public ResourceLocation getTextureLocation(EntityChair entity) { + return TEXTURE; + } +} diff --git a/src/main/java/org/betterx/bclib/registry/BaseBlockEntities.java b/src/main/java/org/betterx/bclib/registry/BaseBlockEntities.java index c77d10a5..7f6f39f3 100644 --- a/src/main/java/org/betterx/bclib/registry/BaseBlockEntities.java +++ b/src/main/java/org/betterx/bclib/registry/BaseBlockEntities.java @@ -10,13 +10,20 @@ import org.betterx.bclib.blocks.BaseBarrelBlock; import org.betterx.bclib.blocks.BaseChestBlock; import org.betterx.bclib.blocks.BaseFurnaceBlock; import org.betterx.bclib.blocks.signs.BaseSignBlock; +import org.betterx.bclib.furniture.entity.EntityChair; import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobCategory; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; +import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityTypeBuilder; + public class BaseBlockEntities { public static final DynamicBlockEntityType CHEST = registerBlockEntityType(BCLib.makeID( "chest"), BaseChestBlockEntity::new); @@ -26,6 +33,22 @@ public class BaseBlockEntities { public static final DynamicBlockEntityType FURNACE = registerBlockEntityType(BCLib.makeID( "furnace"), BaseFurnaceBlockEntity::new); + public static final EntityType CHAIR = registerEntity(BCLib.makeID("chair"), FabricEntityTypeBuilder + .create(MobCategory.MISC, EntityChair::new) + .dimensions(EntityDimensions.fixed(0.5F, 0.8F)) + .fireImmune() + .disableSummon() + .build()); + + + public static EntityType registerEntity( + ResourceLocation id, + EntityType entity + ) { + Registry.register(BuiltInRegistries.ENTITY_TYPE, id, entity); + return entity; + } + public static DynamicBlockEntityType registerBlockEntityType( ResourceLocation typeId, BlockEntitySupplier supplier diff --git a/src/main/java/org/betterx/bclib/registry/BaseBlockEntityRenders.java b/src/main/java/org/betterx/bclib/registry/BaseBlockEntityRenders.java index a9e20a83..f98119f4 100644 --- a/src/main/java/org/betterx/bclib/registry/BaseBlockEntityRenders.java +++ b/src/main/java/org/betterx/bclib/registry/BaseBlockEntityRenders.java @@ -1,6 +1,7 @@ package org.betterx.bclib.registry; import org.betterx.bclib.client.render.BaseChestBlockEntityRenderer; +import org.betterx.bclib.furniture.renderer.RenderChair; import org.betterx.bclib.items.boat.BoatTypeOverride; import net.minecraft.client.model.BoatModel; @@ -8,11 +9,14 @@ import net.minecraft.client.model.ChestBoatModel; import net.minecraft.client.model.ChestRaftModel; import net.minecraft.client.model.RaftModel; import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.world.entity.EntityType; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.client.rendering.v1.BlockEntityRendererRegistry; import net.fabricmc.fabric.api.client.rendering.v1.EntityModelLayerRegistry; +import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry; @Environment(EnvType.CLIENT) public class BaseBlockEntityRenders { @@ -31,5 +35,20 @@ public class BaseBlockEntityRenders { () -> type.isRaft ? chestRaftModel : chestBoatModel ); }); + + registerRender(BaseBlockEntities.CHAIR, RenderChair.class); + } + + public static void registerRender(EntityType entity, Class> renderer) { + EntityRendererRegistry.register(entity, (context) -> { + EntityRenderer render = null; + try { + render = renderer.getConstructor(context.getClass()) + .newInstance(context); + } catch (Exception e) { + e.printStackTrace(); + } + return render; + }); } } diff --git a/src/main/resources/assets/bclib/models/block/bar_stool.json b/src/main/resources/assets/bclib/models/block/bar_stool.json new file mode 100644 index 00000000..38d88ead --- /dev/null +++ b/src/main/resources/assets/bclib/models/block/bar_stool.json @@ -0,0 +1,162 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "#texture" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 4, 13, 5 ], + "to": [ 12, 15, 11 ], + "faces": { + "down": { "uv": [ 4, 5, 12, 11 ], "texture": "#texture" }, + "up": { "uv": [ 4, 5, 12, 11 ], "texture": "#texture" }, + "north": { "uv": [ 4, 1, 12, 3 ], "texture": "#texture" }, + "south": { "uv": [ 4, 1, 12, 3 ], "texture": "#texture" }, + "west": { "uv": [ 5, 1, 11, 3 ], "texture": "#texture" }, + "east": { "uv": [ 5, 1, 11, 3 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 5, 13, 4 ], + "to": [ 11, 15, 5 ], + "faces": { + "down": { "uv": [ 5, 11, 11, 12 ], "texture": "#texture" }, + "up": { "uv": [ 5, 4, 11, 5 ], "texture": "#texture" }, + "north": { "uv": [ 5, 1, 11, 3 ], "texture": "#texture" }, + "west": { "uv": [ 4, 1, 5, 3 ], "texture": "#texture" }, + "east": { "uv": [ 11, 1, 12, 3 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 5, 13, 11 ], + "to": [ 11, 15, 12 ], + "faces": { + "down": { "uv": [ 5, 4, 11, 5 ], "texture": "#texture" }, + "up": { "uv": [ 5, 11, 11, 12 ], "texture": "#texture" }, + "south": { "uv": [ 5, 1, 11, 3 ], "texture": "#texture" }, + "west": { "uv": [ 11, 1, 12, 3 ], "texture": "#texture" }, + "east": { "uv": [ 4, 1, 5, 3 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 5, 15, 5 ], + "to": [ 11, 16, 11 ], + "faces": { + "up": { "uv": [ 5, 5, 11, 11 ], "texture": "#cloth" }, + "north": { "uv": [ 5, 0, 11, 1 ], "texture": "#cloth" }, + "south": { "uv": [ 5, 0, 11, 1 ], "texture": "#cloth" }, + "west": { "uv": [ 5, 0, 11, 1 ], "texture": "#cloth" }, + "east": { "uv": [ 5, 0, 11, 1 ], "texture": "#cloth" } + } + }, + { + "__comment": "Box5", + "from": [ 5.5, 12, 5.5 ], + "to": [ 10.5, 13, 10.5 ], + "faces": { + "down": { "uv": [ 5.5, 5.5, 10.5, 10.5 ], "texture": "#texture" }, + "north": { "uv": [ 5.5, 3, 10.5, 4 ], "texture": "#texture" }, + "south": { "uv": [ 5.5, 3, 10.5, 4 ], "texture": "#texture" }, + "west": { "uv": [ 5.5, 3, 10.5, 4 ], "texture": "#texture" }, + "east": { "uv": [ 5.5, 3, 10.5, 4 ], "texture": "#texture" } + } + }, + { + "__comment": "Box5", + "from": [ 5, 0, 5 ], + "to": [ 6, 13, 6 ], + "faces": { + "down": { "uv": [ 5, 10, 6, 11 ], "texture": "#texture", "cullface": "down" }, + "north": { "uv": [ 1, 5, 14, 6 ], "texture": "#texture", "rotation": 90 }, + "south": { "uv": [ 2, 9, 15, 10 ], "texture": "#texture", "rotation": 90 }, + "west": { "uv": [ 1, 13, 14, 14 ], "texture": "#texture", "rotation": 90 }, + "east": { "uv": [ 2, 9, 15, 10 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "Box5", + "from": [ 5, 0, 10 ], + "to": [ 6, 13, 11 ], + "faces": { + "down": { "uv": [ 5, 5, 6, 6 ], "texture": "#texture", "cullface": "down" }, + "north": { "uv": [ 3, 9, 16, 10 ], "texture": "#texture", "rotation": 90 }, + "south": { "uv": [ 3, 13, 16, 14 ], "texture": "#texture", "rotation": 90 }, + "west": { "uv": [ 3, 13, 16, 14 ], "texture": "#texture", "rotation": 90 }, + "east": { "uv": [ 3, 1, 16, 2 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "Box5", + "from": [ 10, 0, 10 ], + "to": [ 11, 13, 11 ], + "faces": { + "down": { "uv": [ 10, 5, 11, 6 ], "texture": "#texture", "cullface": "down" }, + "north": { "uv": [ 3, 1, 16, 2 ], "texture": "#texture", "rotation": 90 }, + "south": { "uv": [ 3, 5, 16, 6 ], "texture": "#texture", "rotation": 90 }, + "west": { "uv": [ 3, 13, 16, 14 ], "texture": "#texture", "rotation": 90 }, + "east": { "uv": [ 3, 9, 16, 10 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "Box5", + "from": [ 10, 0, 5 ], + "to": [ 11, 13, 6 ], + "faces": { + "down": { "uv": [ 10, 10, 11, 11 ], "texture": "#texture", "cullface": "down" }, + "north": { "uv": [ 3, 13, 16, 14 ], "texture": "#texture", "rotation": 90 }, + "south": { "uv": [ 0, 9, 13, 10 ], "texture": "#texture", "rotation": 90 }, + "west": { "uv": [ 3, 5, 16, 6 ], "texture": "#texture", "rotation": 90 }, + "east": { "uv": [ 0, 1, 13, 2 ], "texture": "#texture", "rotation": 90 } + } + }, + { + "__comment": "Box5", + "from": [ 10, 5, 6 ], + "to": [ 11, 6, 10 ], + "faces": { + "down": { "uv": [ 7, 9, 11, 10 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 3, 9, 7, 10 ], "texture": "#texture", "rotation": 90 }, + "west": { "uv": [ 3, 5, 7, 6 ], "texture": "#texture" }, + "east": { "uv": [ 3, 5, 7, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "Box5", + "from": [ 6, 7, 5 ], + "to": [ 10, 8, 6 ], + "faces": { + "down": { "uv": [ 6.5, 9, 10.5, 10 ], "texture": "#texture" }, + "up": { "uv": [ 4, 9, 8, 10 ], "texture": "#texture" }, + "north": { "uv": [ 2, 9, 6, 10 ], "texture": "#texture" }, + "south": { "uv": [ 7, 9, 11, 10 ], "texture": "#texture" } + } + }, + { + "__comment": "Box5", + "from": [ 6, 7, 10 ], + "to": [ 10, 8, 11 ], + "faces": { + "down": { "uv": [ 4, 5, 8, 6 ], "texture": "#texture" }, + "up": { "uv": [ 6, 9, 10, 10 ], "texture": "#texture" }, + "north": { "uv": [ 4, 9, 8, 10 ], "texture": "#texture" }, + "south": { "uv": [ 5, 9, 9, 10 ], "texture": "#texture" } + } + }, + { + "__comment": "Box5", + "from": [ 5, 5, 6 ], + "to": [ 6, 6, 10 ], + "faces": { + "down": { "uv": [ 7, 9, 11, 10 ], "texture": "#texture", "rotation": 90 }, + "up": { "uv": [ 3, 9, 7, 10 ], "texture": "#texture", "rotation": 90 }, + "west": { "uv": [ 3, 5, 7, 6 ], "texture": "#texture" }, + "east": { "uv": [ 3, 5, 7, 6 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/bclib/models/block/chair.json b/src/main/resources/assets/bclib/models/block/chair.json new file mode 100644 index 00000000..3f71e294 --- /dev/null +++ b/src/main/resources/assets/bclib/models/block/chair.json @@ -0,0 +1,200 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "#texture" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 3, 9, 3 ], + "to": [ 13, 10, 13 ], + "faces": { + "down": { "uv": [ 3, 3, 13, 13 ], "texture": "#texture" }, + "up": { "uv": [ 3, 3, 13, 13 ], "texture": "#texture" }, + "north": { "uv": [ 3, 6, 13, 7 ], "texture": "#texture" }, + "south": { "uv": [ 3, 6, 13, 7 ], "texture": "#texture" }, + "west": { "uv": [ 3, 6, 13, 7 ], "texture": "#texture" }, + "east": { "uv": [ 3, 6, 13, 7 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 3, 0, 3 ], + "to": [ 5, 9, 5 ], + "faces": { + "down": { "uv": [ 3, 11, 5, 13 ], "texture": "#texture" }, + "north": { "uv": [ 11, 7, 13, 16 ], "texture": "#texture" }, + "south": { "uv": [ 3, 7, 5, 16 ], "texture": "#texture" }, + "west": { "uv": [ 3, 7, 5, 16 ], "texture": "#texture" }, + "east": { "uv": [ 11, 7, 13, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 3, 16, 3 ], + "to": [ 5, 21, 5 ], + "faces": { + "up": { "uv": [ 3, 3, 5, 5 ], "texture": "#texture" }, + "north": { "uv": [ 11, 11, 13, 16 ], "texture": "#texture" }, + "west": { "uv": [ 3, 11, 5, 16 ], "texture": "#texture" }, + "east": { "uv": [ 11, 11, 13, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 11, 0, 3 ], + "to": [ 13, 9, 5 ], + "faces": { + "down": { "uv": [ 11, 11, 13, 13 ], "texture": "#texture" }, + "north": { "uv": [ 3, 7, 5, 16 ], "texture": "#texture" }, + "south": { "uv": [ 11, 7, 13, 16 ], "texture": "#texture" }, + "west": { "uv": [ 3, 7, 5, 16 ], "texture": "#texture" }, + "east": { "uv": [ 11, 7, 13, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 11, 16, 3 ], + "to": [ 13, 21, 5 ], + "faces": { + "up": { "uv": [ 11, 3, 13, 5 ], "texture": "#texture" }, + "north": { "uv": [ 3, 11, 5, 16 ], "texture": "#texture" }, + "west": { "uv": [ 3, 11, 5, 16 ], "texture": "#texture" }, + "east": { "uv": [ 11, 11, 13, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 11, 10, 3 ], + "to": [ 13, 16, 5 ], + "faces": { + "north": { "uv": [ 3, 0, 5, 6 ], "texture": "#texture" }, + "south": { "uv": [ 11, 0, 13, 6 ], "texture": "#texture" }, + "west": { "uv": [ 3, 0, 5, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 13, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 3, 10, 3 ], + "to": [ 5, 16, 5 ], + "faces": { + "north": { "uv": [ 11, 0, 13, 6 ], "texture": "#texture" }, + "south": { "uv": [ 3, 0, 5, 6 ], "texture": "#texture" }, + "west": { "uv": [ 3, 0, 5, 6 ], "texture": "#texture" }, + "east": { "uv": [ 11, 0, 13, 6 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 3, 0, 11 ], + "to": [ 5, 9, 13 ], + "faces": { + "down": { "uv": [ 3, 3, 5, 5 ], "texture": "#texture" }, + "north": { "uv": [ 11, 7, 13, 16 ], "texture": "#texture" }, + "south": { "uv": [ 3, 7, 5, 16 ], "texture": "#texture" }, + "west": { "uv": [ 11, 7, 13, 16 ], "texture": "#texture" }, + "east": { "uv": [ 3, 7, 5, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 11, 0, 11 ], + "to": [ 13, 9, 13 ], + "faces": { + "down": { "uv": [ 11, 3, 13, 5 ], "texture": "#texture" }, + "north": { "uv": [ 3, 7, 5, 16 ], "texture": "#texture" }, + "south": { "uv": [ 11, 7, 13, 16 ], "texture": "#texture" }, + "west": { "uv": [ 11, 7, 13, 16 ], "texture": "#texture" }, + "east": { "uv": [ 3, 7, 5, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 3, 14, 4 ], + "to": [ 13, 16, 5 ], + "faces": { + "down": { "uv": [ 3, 11, 13, 12 ], "texture": "#texture" }, + "north": { "uv": [ 3, 0, 13, 2 ], "texture": "#texture" }, + "south": { "uv": [ 3, 0, 13, 2 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 4, 21, 3 ], + "to": [ 12, 22, 5 ], + "faces": { + "down": { "uv": [ 4, 11, 12, 13 ], "texture": "#texture" }, + "up": { "uv": [ 4, 3, 12, 5 ], "texture": "#texture" }, + "north": { "uv": [ 4, 10, 12, 11 ], "texture": "#texture" }, + "south": { "uv": [ 4, 10, 12, 11 ], "texture": "#texture" }, + "west": { "uv": [ 3, 10, 5, 11 ], "texture": "#texture" }, + "east": { "uv": [ 11, 10, 13, 11 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 3, 16, 4 ], + "to": [ 13, 21, 5 ], + "faces": { + "up": { "uv": [ 3, 4, 13, 5 ], "texture": "#texture" }, + "north": { "uv": [ 3, 11, 13, 16 ], "texture": "#texture" }, + "south": { "uv": [ 3, 11, 13, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 4, 8, 4 ], + "to": [ 12, 9, 12 ], + "faces": { + "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#texture" }, + "north": { "uv": [ 4, 7, 12, 8 ], "texture": "#texture" }, + "south": { "uv": [ 4, 7, 12, 8 ], "texture": "#texture" }, + "west": { "uv": [ 4, 7, 12, 8 ], "texture": "#texture" }, + "east": { "uv": [ 4, 7, 12, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 5, 20, 3 ], + "to": [ 11, 21, 4 ], + "faces": { + "down": { "uv": [ 5, 12, 11, 13 ], "texture": "#texture" }, + "north": { "uv": [ 5, 11, 11, 12 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 5, 14, 3 ], + "to": [ 11, 16, 4 ], + "faces": { + "down": { "uv": [ 5, 12, 11, 13 ], "texture": "#texture" }, + "up": { "uv": [ 5, 3, 11, 4 ], "texture": "#texture" }, + "north": { "uv": [ 5, 0, 11, 2 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 4, 4, 5 ], + "to": [ 5, 5, 11 ], + "faces": { + "down": { "uv": [ 4, 5, 5, 11 ], "texture": "#texture" }, + "up": { "uv": [ 4, 5, 5, 11 ], "texture": "#texture" }, + "west": { "uv": [ 5, 11, 11, 12 ], "texture": "#texture" }, + "east": { "uv": [ 5, 11, 11, 12 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 11, 4, 5 ], + "to": [ 12, 5, 11 ], + "faces": { + "down": { "uv": [ 11, 5, 12, 11 ], "texture": "#texture" }, + "up": { "uv": [ 11, 5, 12, 11 ], "texture": "#texture" }, + "west": { "uv": [ 5, 11, 11, 12 ], "texture": "#texture" }, + "east": { "uv": [ 5, 11, 11, 12 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/bclib/models/block/taburet.json b/src/main/resources/assets/bclib/models/block/taburet.json new file mode 100644 index 00000000..6cf0818d --- /dev/null +++ b/src/main/resources/assets/bclib/models/block/taburet.json @@ -0,0 +1,433 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "#texture", + "top": "#texture" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ + 2, + 8, + 2 + ], + "to": [ + 14, + 10, + 14 + ], + "faces": { + "down": { + "uv": [ + 2, + 2, + 14, + 14 + ], + "texture": "#top" + }, + "up": { + "uv": [ + 2, + 2, + 14, + 14 + ], + "texture": "#top" + }, + "north": { + "uv": [ + 2, + 6, + 14, + 8 + ], + "texture": "#texture" + }, + "south": { + "uv": [ + 2, + 6, + 14, + 8 + ], + "texture": "#texture" + }, + "west": { + "uv": [ + 2, + 6, + 14, + 8 + ], + "texture": "#texture" + }, + "east": { + "uv": [ + 2, + 6, + 14, + 8 + ], + "texture": "#texture" + } + } + }, + { + "__comment": "Box1", + "from": [ + 3, + 0, + 3 + ], + "to": [ + 5, + 8, + 5 + ], + "faces": { + "down": { + "uv": [ + 3, + 11, + 5, + 13 + ], + "texture": "#texture", + "cullface": "down" + }, + "north": { + "uv": [ + 11, + 8, + 13, + 16 + ], + "texture": "#texture" + }, + "south": { + "uv": [ + 3, + 8, + 5, + 16 + ], + "texture": "#texture" + }, + "west": { + "uv": [ + 3, + 8, + 5, + 16 + ], + "texture": "#texture" + }, + "east": { + "uv": [ + 11, + 8, + 13, + 16 + ], + "texture": "#texture" + } + } + }, + { + "__comment": "Box1", + "from": [ + 11, + 0, + 3 + ], + "to": [ + 13, + 8, + 5 + ], + "faces": { + "down": { + "uv": [ + 11, + 11, + 13, + 13 + ], + "texture": "#texture", + "cullface": "down" + }, + "north": { + "uv": [ + 3, + 8, + 5, + 16 + ], + "texture": "#texture" + }, + "south": { + "uv": [ + 11, + 8, + 13, + 16 + ], + "texture": "#texture" + }, + "west": { + "uv": [ + 3, + 8, + 5, + 16 + ], + "texture": "#texture" + }, + "east": { + "uv": [ + 11, + 8, + 13, + 16 + ], + "texture": "#texture" + } + } + }, + { + "__comment": "Box1", + "from": [ + 11, + 0, + 11 + ], + "to": [ + 13, + 8, + 13 + ], + "faces": { + "down": { + "uv": [ + 11, + 3, + 13, + 5 + ], + "texture": "#texture", + "cullface": "down" + }, + "north": { + "uv": [ + 3, + 8, + 5, + 16 + ], + "texture": "#texture" + }, + "south": { + "uv": [ + 11, + 8, + 13, + 16 + ], + "texture": "#texture" + }, + "west": { + "uv": [ + 11, + 8, + 13, + 16 + ], + "texture": "#texture" + }, + "east": { + "uv": [ + 3, + 8, + 5, + 16 + ], + "texture": "#texture" + } + } + }, + { + "__comment": "Box1", + "from": [ + 3, + 0, + 11 + ], + "to": [ + 5, + 8, + 13 + ], + "faces": { + "down": { + "uv": [ + 3, + 3, + 5, + 5 + ], + "texture": "#texture", + "cullface": "down" + }, + "north": { + "uv": [ + 11, + 8, + 13, + 16 + ], + "texture": "#texture" + }, + "south": { + "uv": [ + 3, + 8, + 5, + 16 + ], + "texture": "#texture" + }, + "west": { + "uv": [ + 11, + 8, + 13, + 16 + ], + "texture": "#texture" + }, + "east": { + "uv": [ + 3, + 8, + 5, + 16 + ], + "texture": "#texture" + } + } + }, + { + "__comment": "Box6", + "from": [ + 5, + 2, + 4 + ], + "to": [ + 11, + 3, + 5 + ], + "faces": { + "down": { + "uv": [ + 2, + 4, + 3, + 10 + ], + "texture": "#texture", + "rotation": 90 + }, + "up": { + "uv": [ + 2, + 4, + 3, + 10 + ], + "texture": "#texture", + "rotation": 90 + }, + "north": { + "uv": [ + 2, + 4, + 3, + 10 + ], + "texture": "#texture", + "rotation": 90 + }, + "south": { + "uv": [ + 2, + 4, + 3, + 10 + ], + "texture": "#texture", + "rotation": 90 + } + } + }, + { + "__comment": "Box6", + "from": [ + 5, + 2, + 11 + ], + "to": [ + 11, + 3, + 12 + ], + "faces": { + "down": { + "uv": [ + 5, + 4, + 6, + 10 + ], + "texture": "#texture", + "rotation": 90 + }, + "up": { + "uv": [ + 5, + 4, + 6, + 10 + ], + "texture": "#texture", + "rotation": 90 + }, + "north": { + "uv": [ + 5, + 4, + 6, + 10 + ], + "texture": "#texture", + "rotation": 90 + }, + "south": { + "uv": [ + 5, + 4, + 6, + 10 + ], + "texture": "#texture", + "rotation": 90 + } + } + } + ] +} \ No newline at end of file