[Feature] Furniture API
This commit is contained in:
parent
6b87c96839
commit
ad74c71c01
15 changed files with 1475 additions and 0 deletions
|
@ -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<WoodenComplexMaterial> {
|
||||
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));
|
||||
}
|
||||
}
|
|
@ -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<WoodenComplexMaterial> {
|
||||
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));
|
||||
}
|
||||
}
|
|
@ -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<WoodenComplexMaterial> {
|
||||
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));
|
||||
}
|
||||
}
|
|
@ -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<WoodenComplexMaterial> TABURET = new Taburet();
|
||||
public static final MaterialSlot<WoodenComplexMaterial> CHAIR = new Chair();
|
||||
public static final MaterialSlot<WoodenComplexMaterial> BAR_STOOL = new BarStool();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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<Block, BlockState> 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<EntityChair> 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<EntityChair> getEntity(Level level, BlockPos pos) {
|
||||
List<EntityChair> 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<EntityChair> e = getEntity(level, blockPos);
|
||||
//
|
||||
// if (e.isPresent()) {
|
||||
// BCLib.LOGGER.info("Discarding Chair at " + blockPos);
|
||||
// e.get().discard();
|
||||
// }
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
117
src/main/java/org/betterx/bclib/furniture/block/BaseChair.java
Normal file
117
src/main/java/org/betterx/bclib/furniture/block/BaseChair.java
Normal file
|
@ -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<Block, BlockState> 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<ItemStack> 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);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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<? extends EntityChair> 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<Entity> 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<ClientGamePacketListener> 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();
|
||||
}
|
||||
}
|
|
@ -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<EntityChair> {
|
||||
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;
|
||||
}
|
||||
}
|
|
@ -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<BaseChestBlockEntity> CHEST = registerBlockEntityType(BCLib.makeID(
|
||||
"chest"), BaseChestBlockEntity::new);
|
||||
|
@ -26,6 +33,22 @@ public class BaseBlockEntities {
|
|||
public static final DynamicBlockEntityType<BaseFurnaceBlockEntity> FURNACE = registerBlockEntityType(BCLib.makeID(
|
||||
"furnace"), BaseFurnaceBlockEntity::new);
|
||||
|
||||
public static final EntityType<EntityChair> CHAIR = registerEntity(BCLib.makeID("chair"), FabricEntityTypeBuilder
|
||||
.create(MobCategory.MISC, EntityChair::new)
|
||||
.dimensions(EntityDimensions.fixed(0.5F, 0.8F))
|
||||
.fireImmune()
|
||||
.disableSummon()
|
||||
.build());
|
||||
|
||||
|
||||
public static <T extends Entity> EntityType<T> registerEntity(
|
||||
ResourceLocation id,
|
||||
EntityType<T> entity
|
||||
) {
|
||||
Registry.register(BuiltInRegistries.ENTITY_TYPE, id, entity);
|
||||
return entity;
|
||||
}
|
||||
|
||||
public static <T extends BlockEntity> DynamicBlockEntityType<T> registerBlockEntityType(
|
||||
ResourceLocation typeId,
|
||||
BlockEntitySupplier<? extends T> supplier
|
||||
|
|
|
@ -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<? extends EntityRenderer<?>> renderer) {
|
||||
EntityRendererRegistry.register(entity, (context) -> {
|
||||
EntityRenderer render = null;
|
||||
try {
|
||||
render = renderer.getConstructor(context.getClass())
|
||||
.newInstance(context);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return render;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
162
src/main/resources/assets/bclib/models/block/bar_stool.json
Normal file
162
src/main/resources/assets/bclib/models/block/bar_stool.json
Normal file
|
@ -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" }
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
200
src/main/resources/assets/bclib/models/block/chair.json
Normal file
200
src/main/resources/assets/bclib/models/block/chair.json
Normal file
|
@ -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" }
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
433
src/main/resources/assets/bclib/models/block/taburet.json
Normal file
433
src/main/resources/assets/bclib/models/block/taburet.json
Normal file
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue