From 720103bd45e1fc0d5595ab1bec4ddefc6869eee0 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 26 Sep 2020 16:36:48 +0300 Subject: [PATCH] More wooden materials, gui, mixins, registries --- .gitignore | 1 + src/main/java/ru/betterend/BetterEnd.java | 2 + .../betterend/blocks/basis/BlockBarrel.java | 85 +++++++ .../blocks/basis/BlockBaseNotFull.java | 25 ++ .../ru/betterend/blocks/basis/BlockChest.java | 36 +++ .../blocks/basis/BlockCraftingTable.java | 23 ++ .../betterend/blocks/basis/BlockLadder.java | 134 ++++++++++ .../ru/betterend/blocks/basis/BlockSign.java | 143 +++++++++++ .../blocks/complex/WoodenMaterial.java | 32 ++- .../blocks/entities/EBarrelBlockEntity.java | 138 +++++++++++ .../blocks/entities/EChestBlockEntity.java | 10 + .../blocks/entities/ESignBlockEntity.java | 168 +++++++++++++ .../render/EChestBlockEntityRenderer.java | 187 ++++++++++++++ .../render/ESignBlockEntityRenderer.java | 123 ++++++++++ .../ru/betterend/client/BetterEndClient.java | 2 + .../client/gui/BlockSignEditScreen.java | 232 ++++++++++++++++++ .../client/ClientPlayNetworkHandlerMixin.java | 53 ++++ .../common/ServerPlayNetworkHandlerMixin.java | 60 +++++ .../registry/BlockEntityRegistry.java | 77 ++++++ .../registry/BlockEntityRenderRegistry.java | 15 ++ .../ru/betterend/registry/BlockRegistry.java | 6 +- .../resources/betterend.mixins.client.json | 3 +- .../resources/betterend.mixins.common.json | 3 +- utilities/paulevs/wooden/Helper.java | 92 +++++++ utilities/paulevs/wooden/ModelHelper.java | 93 +++++++ utility_res/block/%name%_bark.json | 6 + utility_res/block/%name%_button.json | 6 + .../block/%name%_button_inventory.json | 6 + utility_res/block/%name%_button_pressed.json | 6 + utility_res/block/%name%_door_bottom.json | 7 + .../block/%name%_door_bottom_hinge.json | 7 + utility_res/block/%name%_door_top.json | 7 + utility_res/block/%name%_door_top_hinge.json | 7 + .../block/%name%_fence_gate_closed.json | 6 + utility_res/block/%name%_fence_gate_open.json | 6 + utility_res/block/%name%_fence_inventory.json | 6 + utility_res/block/%name%_fence_post.json | 6 + utility_res/block/%name%_fence_side.json | 6 + utility_res/block/%name%_half_slab.json | 8 + utility_res/block/%name%_inner_stairs.json | 8 + utility_res/block/%name%_ladder.json | 7 + utility_res/block/%name%_log.json | 12 + utility_res/block/%name%_outer_stairs.json | 8 + utility_res/block/%name%_planks.json | 6 + .../block/%name%_pressure_plate_down.json | 6 + .../block/%name%_pressure_plate_up.json | 6 + utility_res/block/%name%_stairs.json | 8 + utility_res/block/%name%_trapdoor.json | 68 +++++ .../block/%name%_wall_gate_closed.json | 6 + utility_res/block/%name%_wall_gate_open.json | 6 + utility_res/block/barrel_%name%.json | 8 + utility_res/block/barrel_%name%_open.json | 8 + utility_res/block/crafting_table_%name%.json | 12 + utility_res/block/striped_bark_%name%.json | 6 + utility_res/block/striped_log_%name%.json | 12 + utility_res/blockstates/%name%_bark.json | 7 + utility_res/blockstates/%name%_button.json | 28 +++ utility_res/blockstates/%name%_door.json | 36 +++ utility_res/blockstates/%name%_fence.json | 17 ++ utility_res/blockstates/%name%_gate.json | 20 ++ utility_res/blockstates/%name%_ladder.json | 8 + utility_res/blockstates/%name%_log.json | 7 + utility_res/blockstates/%name%_planks.json | 6 + utility_res/blockstates/%name%_plate.json | 6 + utility_res/blockstates/%name%_slab.json | 8 + utility_res/blockstates/%name%_stairs.json | 44 ++++ utility_res/blockstates/%name%_trapdoor.json | 20 ++ utility_res/blockstates/bar_stool_%name%.json | 8 + utility_res/blockstates/barrel_%name%.json | 56 +++++ utility_res/blockstates/chair_%name%.json | 9 + utility_res/blockstates/chest_%name%.json | 7 + .../blockstates/crafting_table_%name%.json | 7 + utility_res/blockstates/sign_%name%.json | 5 + .../blockstates/striped_bark_%name%.json | 7 + .../blockstates/striped_log_%name%.json | 7 + utility_res/blockstates/taburet_%name%.json | 8 + utility_res/item/%name%_bark.json | 3 + utility_res/item/%name%_button.json | 3 + utility_res/item/%name%_door.json | 6 + utility_res/item/%name%_fence.json | 3 + utility_res/item/%name%_gate.json | 3 + utility_res/item/%name%_ladder.json | 6 + utility_res/item/%name%_log.json | 3 + utility_res/item/%name%_planks.json | 3 + utility_res/item/%name%_plate.json | 3 + utility_res/item/%name%_slab.json | 3 + utility_res/item/%name%_stairs.json | 3 + utility_res/item/%name%_trapdoor.json | 3 + utility_res/item/bar_stool_%name%.json | 3 + utility_res/item/barrel_%name%.json | 3 + utility_res/item/chair_%name%.json | 15 ++ utility_res/item/chest_%name%.json | 6 + utility_res/item/crafting_table_%name%.json | 3 + utility_res/item/sign_%name%.json | 6 + utility_res/item/striped_bark_%name%.json | 3 + utility_res/item/striped_log_%name%.json | 3 + utility_res/item/taburet_%name%.json | 3 + 97 files changed, 2414 insertions(+), 14 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/basis/BlockBarrel.java create mode 100644 src/main/java/ru/betterend/blocks/basis/BlockBaseNotFull.java create mode 100644 src/main/java/ru/betterend/blocks/basis/BlockChest.java create mode 100644 src/main/java/ru/betterend/blocks/basis/BlockCraftingTable.java create mode 100644 src/main/java/ru/betterend/blocks/basis/BlockLadder.java create mode 100644 src/main/java/ru/betterend/blocks/basis/BlockSign.java create mode 100644 src/main/java/ru/betterend/blocks/entities/EBarrelBlockEntity.java create mode 100644 src/main/java/ru/betterend/blocks/entities/EChestBlockEntity.java create mode 100644 src/main/java/ru/betterend/blocks/entities/ESignBlockEntity.java create mode 100644 src/main/java/ru/betterend/blocks/entities/render/EChestBlockEntityRenderer.java create mode 100644 src/main/java/ru/betterend/blocks/entities/render/ESignBlockEntityRenderer.java create mode 100644 src/main/java/ru/betterend/client/gui/BlockSignEditScreen.java create mode 100644 src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java create mode 100644 src/main/java/ru/betterend/mixin/common/ServerPlayNetworkHandlerMixin.java create mode 100644 src/main/java/ru/betterend/registry/BlockEntityRegistry.java create mode 100644 src/main/java/ru/betterend/registry/BlockEntityRenderRegistry.java create mode 100644 utilities/paulevs/wooden/Helper.java create mode 100644 utilities/paulevs/wooden/ModelHelper.java create mode 100644 utility_res/block/%name%_bark.json create mode 100644 utility_res/block/%name%_button.json create mode 100644 utility_res/block/%name%_button_inventory.json create mode 100644 utility_res/block/%name%_button_pressed.json create mode 100644 utility_res/block/%name%_door_bottom.json create mode 100644 utility_res/block/%name%_door_bottom_hinge.json create mode 100644 utility_res/block/%name%_door_top.json create mode 100644 utility_res/block/%name%_door_top_hinge.json create mode 100644 utility_res/block/%name%_fence_gate_closed.json create mode 100644 utility_res/block/%name%_fence_gate_open.json create mode 100644 utility_res/block/%name%_fence_inventory.json create mode 100644 utility_res/block/%name%_fence_post.json create mode 100644 utility_res/block/%name%_fence_side.json create mode 100644 utility_res/block/%name%_half_slab.json create mode 100644 utility_res/block/%name%_inner_stairs.json create mode 100644 utility_res/block/%name%_ladder.json create mode 100644 utility_res/block/%name%_log.json create mode 100644 utility_res/block/%name%_outer_stairs.json create mode 100644 utility_res/block/%name%_planks.json create mode 100644 utility_res/block/%name%_pressure_plate_down.json create mode 100644 utility_res/block/%name%_pressure_plate_up.json create mode 100644 utility_res/block/%name%_stairs.json create mode 100644 utility_res/block/%name%_trapdoor.json create mode 100644 utility_res/block/%name%_wall_gate_closed.json create mode 100644 utility_res/block/%name%_wall_gate_open.json create mode 100644 utility_res/block/barrel_%name%.json create mode 100644 utility_res/block/barrel_%name%_open.json create mode 100644 utility_res/block/crafting_table_%name%.json create mode 100644 utility_res/block/striped_bark_%name%.json create mode 100644 utility_res/block/striped_log_%name%.json create mode 100644 utility_res/blockstates/%name%_bark.json create mode 100644 utility_res/blockstates/%name%_button.json create mode 100644 utility_res/blockstates/%name%_door.json create mode 100644 utility_res/blockstates/%name%_fence.json create mode 100644 utility_res/blockstates/%name%_gate.json create mode 100644 utility_res/blockstates/%name%_ladder.json create mode 100644 utility_res/blockstates/%name%_log.json create mode 100644 utility_res/blockstates/%name%_planks.json create mode 100644 utility_res/blockstates/%name%_plate.json create mode 100644 utility_res/blockstates/%name%_slab.json create mode 100644 utility_res/blockstates/%name%_stairs.json create mode 100644 utility_res/blockstates/%name%_trapdoor.json create mode 100644 utility_res/blockstates/bar_stool_%name%.json create mode 100644 utility_res/blockstates/barrel_%name%.json create mode 100644 utility_res/blockstates/chair_%name%.json create mode 100644 utility_res/blockstates/chest_%name%.json create mode 100644 utility_res/blockstates/crafting_table_%name%.json create mode 100644 utility_res/blockstates/sign_%name%.json create mode 100644 utility_res/blockstates/striped_bark_%name%.json create mode 100644 utility_res/blockstates/striped_log_%name%.json create mode 100644 utility_res/blockstates/taburet_%name%.json create mode 100644 utility_res/item/%name%_bark.json create mode 100644 utility_res/item/%name%_button.json create mode 100644 utility_res/item/%name%_door.json create mode 100644 utility_res/item/%name%_fence.json create mode 100644 utility_res/item/%name%_gate.json create mode 100644 utility_res/item/%name%_ladder.json create mode 100644 utility_res/item/%name%_log.json create mode 100644 utility_res/item/%name%_planks.json create mode 100644 utility_res/item/%name%_plate.json create mode 100644 utility_res/item/%name%_slab.json create mode 100644 utility_res/item/%name%_stairs.json create mode 100644 utility_res/item/%name%_trapdoor.json create mode 100644 utility_res/item/bar_stool_%name%.json create mode 100644 utility_res/item/barrel_%name%.json create mode 100644 utility_res/item/chair_%name%.json create mode 100644 utility_res/item/chest_%name%.json create mode 100644 utility_res/item/crafting_table_%name%.json create mode 100644 utility_res/item/sign_%name%.json create mode 100644 utility_res/item/striped_bark_%name%.json create mode 100644 utility_res/item/striped_log_%name%.json create mode 100644 utility_res/item/taburet_%name%.json diff --git a/.gitignore b/.gitignore index 550b373c..e61b1a87 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,4 @@ bin/ # fabric run/ +output/ \ No newline at end of file diff --git a/src/main/java/ru/betterend/BetterEnd.java b/src/main/java/ru/betterend/BetterEnd.java index 344090f8..93dfcf29 100644 --- a/src/main/java/ru/betterend/BetterEnd.java +++ b/src/main/java/ru/betterend/BetterEnd.java @@ -4,6 +4,7 @@ import net.fabricmc.api.ModInitializer; import ru.betterend.config.MainConfig; import ru.betterend.recipe.CraftingRecipes; import ru.betterend.registry.BiomeRegistry; +import ru.betterend.registry.BlockEntityRegistry; import ru.betterend.registry.BlockRegistry; import ru.betterend.registry.FeatureRegistry; import ru.betterend.registry.ItemRegistry; @@ -21,6 +22,7 @@ public class BetterEnd implements ModInitializer { DoubleBlockSurfaceBuilder.register(); ItemRegistry.register(); BlockRegistry.register(); + BlockEntityRegistry.register(); FeatureRegistry.register(); BiomeRegistry.register(); BetterEndBiomeSource.register(); diff --git a/src/main/java/ru/betterend/blocks/basis/BlockBarrel.java b/src/main/java/ru/betterend/blocks/basis/BlockBarrel.java new file mode 100644 index 00000000..b5194610 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/BlockBarrel.java @@ -0,0 +1,85 @@ +package ru.betterend.blocks.basis; + +import java.util.List; +import java.util.Random; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.BarrelBlock; +import net.minecraft.block.Block; +import net.minecraft.block.BlockRenderType; +import net.minecraft.block.BlockState; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.mob.PiglinBrain; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.context.LootContext; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.stat.Stats; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.BlockView; +import net.minecraft.world.World; +import ru.betterend.blocks.entities.EBarrelBlockEntity; +import ru.betterend.registry.BlockEntityRegistry; + +public class BlockBarrel extends BarrelBlock { + public BlockBarrel(Block source) { + super(FabricBlockSettings.copyOf(source).nonOpaque()); + } + + @Override + public BlockEntity createBlockEntity(BlockView world) { + return BlockEntityRegistry.BARREL.instantiate(); + } + + @Override + public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + List drop = super.getDroppedStacks(state, builder); + drop.add(new ItemStack(this.asItem())); + return drop; + } + + @Override + public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, + BlockHitResult hit) { + if (world.isClient) { + return ActionResult.SUCCESS; + } else { + BlockEntity blockEntity = world.getBlockEntity(pos); + if (blockEntity instanceof EBarrelBlockEntity) { + player.openHandledScreen((EBarrelBlockEntity) blockEntity); + player.incrementStat(Stats.OPEN_BARREL); + PiglinBrain.onGuardedBlockInteracted(player, true); + } + + return ActionResult.CONSUME; + } + } + + @Override + public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + BlockEntity blockEntity = world.getBlockEntity(pos); + if (blockEntity instanceof EBarrelBlockEntity) { + ((EBarrelBlockEntity) blockEntity).tick(); + } + } + + @Override + public BlockRenderType getRenderType(BlockState state) { + return BlockRenderType.MODEL; + } + + @Override + public void onPlaced(World world, BlockPos pos, BlockState state, LivingEntity placer, + ItemStack itemStack) { + if (itemStack.hasCustomName()) { + BlockEntity blockEntity = world.getBlockEntity(pos); + if (blockEntity instanceof EBarrelBlockEntity) { + ((EBarrelBlockEntity) blockEntity).setCustomName(itemStack.getName()); + } + } + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockBaseNotFull.java b/src/main/java/ru/betterend/blocks/basis/BlockBaseNotFull.java new file mode 100644 index 00000000..dbf23923 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/BlockBaseNotFull.java @@ -0,0 +1,25 @@ +package ru.betterend.blocks.basis; + +import net.minecraft.block.BlockState; +import net.minecraft.entity.EntityType; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.BlockView; + +public class BlockBaseNotFull extends BlockBase { + + public BlockBaseNotFull(Settings settings) { + super(settings); + } + + public boolean canSuffocate(BlockState state, BlockView view, BlockPos pos) { + return false; + } + + public boolean isSimpleFullBlock(BlockState state, BlockView view, BlockPos pos) { + return false; + } + + public boolean allowsSpawning(BlockState state, BlockView view, BlockPos pos, EntityType type) { + return false; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockChest.java b/src/main/java/ru/betterend/blocks/basis/BlockChest.java new file mode 100644 index 00000000..e0e31439 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/BlockChest.java @@ -0,0 +1,36 @@ +package ru.betterend.blocks.basis; + +import java.util.List; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.ChestBlock; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.context.LootContext; +import net.minecraft.world.BlockView; +import ru.betterend.registry.BlockEntityRegistry; + +public class BlockChest extends ChestBlock +{ + public BlockChest(Block source) { + super(FabricBlockSettings.copyOf(source).nonOpaque(), () -> { + return BlockEntityRegistry.CHEST; + }); + } + + @Override + public BlockEntity createBlockEntity(BlockView world) + { + return BlockEntityRegistry.CHEST.instantiate(); + } + + @Override + public List getDroppedStacks(BlockState state, LootContext.Builder builder) + { + List drop = super.getDroppedStacks(state, builder); + drop.add(new ItemStack(this.asItem())); + return drop; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockCraftingTable.java b/src/main/java/ru/betterend/blocks/basis/BlockCraftingTable.java new file mode 100644 index 00000000..3bfef447 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/BlockCraftingTable.java @@ -0,0 +1,23 @@ +package ru.betterend.blocks.basis; + +import java.util.Collections; +import java.util.List; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.CraftingTableBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.context.LootContext; + +public class BlockCraftingTable extends CraftingTableBlock +{ + public BlockCraftingTable(Block source) { + super(FabricBlockSettings.copyOf(source)); + } + + @Override + public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + return Collections.singletonList(new ItemStack(this.asItem())); + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockLadder.java b/src/main/java/ru/betterend/blocks/basis/BlockLadder.java new file mode 100644 index 00000000..43806f96 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/BlockLadder.java @@ -0,0 +1,134 @@ +package ru.betterend.blocks.basis; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.HorizontalFacingBlock; +import net.minecraft.block.ShapeContext; +import net.minecraft.fluid.FluidState; +import net.minecraft.fluid.Fluids; +import net.minecraft.item.ItemPlacementContext; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.BooleanProperty; +import net.minecraft.state.property.DirectionProperty; +import net.minecraft.state.property.Properties; +import net.minecraft.util.BlockMirror; +import net.minecraft.util.BlockRotation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.BlockView; +import net.minecraft.world.WorldAccess; +import net.minecraft.world.WorldView; +import ru.betterend.client.ERenderLayer; +import ru.betterend.client.IRenderTypeable; +import ru.betterend.util.BlocksHelper; + +public class BlockLadder extends BlockBaseNotFull implements IRenderTypeable { + public static final DirectionProperty FACING = HorizontalFacingBlock.FACING; + public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; + protected static final VoxelShape EAST_SHAPE = Block.createCuboidShape(0.0D, 0.0D, 0.0D, 3.0D, 16.0D, 16.0D); + protected static final VoxelShape WEST_SHAPE = Block.createCuboidShape(13.0D, 0.0D, 0.0D, 16.0D, 16.0D, 16.0D); + protected static final VoxelShape SOUTH_SHAPE = Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 16.0D, 3.0D); + protected static final VoxelShape NORTH_SHAPE = Block.createCuboidShape(0.0D, 0.0D, 13.0D, 16.0D, 16.0D, 16.0D); + + public BlockLadder(Block block) { + super(FabricBlockSettings.copyOf(block).nonOpaque()); + } + + @Override + protected void appendProperties(StateManager.Builder stateManager) { + stateManager.add(FACING); + stateManager.add(WATERLOGGED); + } + + public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + switch (state.get(FACING)) { + case NORTH: + return NORTH_SHAPE; + case SOUTH: + return SOUTH_SHAPE; + case WEST: + return WEST_SHAPE; + case EAST: + default: + return EAST_SHAPE; + } + } + + private boolean canPlaceOn(BlockView world, BlockPos pos, Direction side) { + BlockState blockState = world.getBlockState(pos); + return !blockState.emitsRedstonePower() && blockState.isSideSolidFullSquare(world, pos, side); + } + + @Override + public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { + Direction direction = (Direction) state.get(FACING); + return this.canPlaceOn(world, pos.offset(direction.getOpposite()), direction); + } + + @Override + public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, + WorldAccess world, BlockPos pos, BlockPos neighborPos) { + if (facing.getOpposite() == state.get(FACING) && !state.canPlaceAt(world, pos)) { + return Blocks.AIR.getDefaultState(); + } else { + if ((Boolean) state.get(WATERLOGGED)) { + world.getFluidTickScheduler().schedule(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + } + + return super.getStateForNeighborUpdate(state, facing, neighborState, world, pos, neighborPos); + } + } + + @Override + public BlockState getPlacementState(ItemPlacementContext ctx) { + BlockState blockState2; + if (!ctx.canReplaceExisting()) { + blockState2 = ctx.getWorld().getBlockState(ctx.getBlockPos().offset(ctx.getSide().getOpposite())); + if (blockState2.getBlock() == this && blockState2.get(FACING) == ctx.getSide()) { + return null; + } + } + + blockState2 = this.getDefaultState(); + WorldView worldView = ctx.getWorld(); + BlockPos blockPos = ctx.getBlockPos(); + FluidState fluidState = ctx.getWorld().getFluidState(ctx.getBlockPos()); + Direction[] var6 = ctx.getPlacementDirections(); + int var7 = var6.length; + + for (int var8 = 0; var8 < var7; ++var8) { + Direction direction = var6[var8]; + if (direction.getAxis().isHorizontal()) { + blockState2 = (BlockState) blockState2.with(FACING, direction.getOpposite()); + if (blockState2.canPlaceAt(worldView, blockPos)) { + return (BlockState) blockState2.with(WATERLOGGED, fluidState.getFluid() == Fluids.WATER); + } + } + } + + return null; + } + + @Override + public BlockState rotate(BlockState state, BlockRotation rotation) { + return BlocksHelper.rotateHorizontal(state, rotation, FACING); + } + + @Override + public BlockState mirror(BlockState state, BlockMirror mirror) { + return BlocksHelper.mirrorHorizontal(state, mirror, FACING); + } + + @Override + public FluidState getFluidState(BlockState state) { + return (Boolean) state.get(WATERLOGGED) ? Fluids.WATER.getStill(false) : super.getFluidState(state); + } + + @Override + public ERenderLayer getRenderLayer() { + return ERenderLayer.CUTOUT; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/BlockSign.java b/src/main/java/ru/betterend/blocks/basis/BlockSign.java new file mode 100644 index 00000000..f57c8ec1 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/BlockSign.java @@ -0,0 +1,143 @@ +package ru.betterend.blocks.basis; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.AbstractSignBlock; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.ShapeContext; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.fluid.FluidState; +import net.minecraft.fluid.Fluids; +import net.minecraft.item.DyeItem; +import net.minecraft.item.ItemPlacementContext; +import net.minecraft.item.ItemStack; +import net.minecraft.network.packet.s2c.play.SignEditorOpenS2CPacket; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.BooleanProperty; +import net.minecraft.state.property.IntProperty; +import net.minecraft.state.property.Properties; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.SignType; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.BlockView; +import net.minecraft.world.World; +import net.minecraft.world.WorldAccess; +import net.minecraft.world.WorldView; +import ru.betterend.blocks.entities.ESignBlockEntity; + +public class BlockSign extends AbstractSignBlock { + public static final IntProperty ROTATION = Properties.ROTATION; + public static final BooleanProperty FLOOR = BooleanProperty.of("floor"); + private static final VoxelShape[] WALL_SHAPES = new VoxelShape[] { + Block.createCuboidShape(0.0D, 4.5D, 14.0D, 16.0D, 12.5D, 16.0D), + Block.createCuboidShape(0.0D, 4.5D, 0.0D, 2.0D, 12.5D, 16.0D), + Block.createCuboidShape(0.0D, 4.5D, 0.0D, 16.0D, 12.5D, 2.0D), + Block.createCuboidShape(14.0D, 4.5D, 0.0D, 16.0D, 12.5D, 16.0D) }; + + public BlockSign(Block source) { + super(FabricBlockSettings.copyOf(source).noCollision().nonOpaque(), SignType.OAK); + this.setDefaultState( + this.stateManager.getDefaultState().with(ROTATION, 0).with(FLOOR, true).with(WATERLOGGED, false)); + } + + @Override + protected void appendProperties(StateManager.Builder builder) { + builder.add(ROTATION, FLOOR, WATERLOGGED); + } + + @Override + public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ePos) { + return state.get(FLOOR) ? SHAPE : WALL_SHAPES[state.get(ROTATION) >> 2]; + } + + @Override + public BlockEntity createBlockEntity(BlockView world) { + return new ESignBlockEntity(); + } + + @Override + public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { + ItemStack itemStack = player.getStackInHand(hand); + boolean bl = itemStack.getItem() instanceof DyeItem && player.abilities.allowModifyWorld; + if (world.isClient) { + return bl ? ActionResult.SUCCESS : ActionResult.CONSUME; + } else { + BlockEntity blockEntity = world.getBlockEntity(pos); + if (blockEntity instanceof ESignBlockEntity) { + ESignBlockEntity signBlockEntity = (ESignBlockEntity) blockEntity; + if (bl) { + boolean bl2 = signBlockEntity.setTextColor(((DyeItem) itemStack.getItem()).getColor()); + if (bl2 && !player.isCreative()) { + itemStack.decrement(1); + } + } + return signBlockEntity.onActivate(player) ? ActionResult.SUCCESS : ActionResult.PASS; + } else { + return ActionResult.PASS; + } + } + } + + @Override + public void onPlaced(World world, BlockPos pos, BlockState state, LivingEntity placer, + ItemStack itemStack) { + if (placer != null && placer instanceof PlayerEntity) { + ESignBlockEntity sign = (ESignBlockEntity) world.getBlockEntity(pos); + if (!world.isClient) { + sign.setEditor((PlayerEntity) placer); + ((ServerPlayerEntity) placer).networkHandler.sendPacket(new SignEditorOpenS2CPacket(pos)); + } else + sign.setEditable(true); + } + } + + @Override + public BlockState getStateForNeighborUpdate(BlockState state, Direction facing, BlockState neighborState, + WorldAccess world, BlockPos pos, BlockPos neighborPos) { + if ((Boolean) state.get(WATERLOGGED)) { + world.getFluidTickScheduler().schedule(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + } + + return super.getStateForNeighborUpdate(state, facing, neighborState, world, pos, neighborPos); + } + + @Override + public BlockState getPlacementState(ItemPlacementContext ctx) { + if (ctx.getSide() == Direction.UP) { + FluidState fluidState = ctx.getWorld().getFluidState(ctx.getBlockPos()); + return this.getDefaultState().with(FLOOR, true) + .with(ROTATION, MathHelper.floor((180.0 + ctx.getPlayerYaw() * 16.0 / 360.0) + 0.5 - 12) & 15) + .with(WATERLOGGED, fluidState.getFluid() == Fluids.WATER); + } else if (ctx.getSide() != Direction.DOWN) { + BlockState blockState = this.getDefaultState(); + FluidState fluidState = ctx.getWorld().getFluidState(ctx.getBlockPos()); + WorldView worldView = ctx.getWorld(); + BlockPos blockPos = ctx.getBlockPos(); + Direction[] directions = ctx.getPlacementDirections(); + Direction[] var7 = directions; + int var8 = directions.length; + + for (int var9 = 0; var9 < var8; ++var9) { + Direction direction = var7[var9]; + if (direction.getAxis().isHorizontal()) { + Direction direction2 = direction.getOpposite(); + int rot = MathHelper.floor((180.0 + direction2.asRotation() * 16.0 / 360.0) + 0.5 + 4) & 15; + blockState = blockState.with(ROTATION, rot); + if (blockState.canPlaceAt(worldView, blockPos)) { + return blockState.with(FLOOR, false).with(WATERLOGGED, fluidState.getFluid() == Fluids.WATER); + } + } + } + } + + return null; + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java index f8faa189..9a83c1fc 100644 --- a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java @@ -5,13 +5,18 @@ import net.minecraft.block.Block; import net.minecraft.block.Material; import net.minecraft.block.MaterialColor; import net.minecraft.item.Items; +import ru.betterend.blocks.basis.BlockBarrel; import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.BlockChest; +import ru.betterend.blocks.basis.BlockCraftingTable; import ru.betterend.blocks.basis.BlockDoor; import ru.betterend.blocks.basis.BlockFence; import ru.betterend.blocks.basis.BlockGate; +import ru.betterend.blocks.basis.BlockLadder; import ru.betterend.blocks.basis.BlockLogStripable; import ru.betterend.blocks.basis.BlockPillar; import ru.betterend.blocks.basis.BlockPressurePlate; +import ru.betterend.blocks.basis.BlockSign; import ru.betterend.blocks.basis.BlockSlab; import ru.betterend.blocks.basis.BlockStairs; import ru.betterend.blocks.basis.BlockTrapdoor; @@ -38,12 +43,12 @@ public class WoodenMaterial public final Block trapdoor; public final Block door; - //public final Block crafting_table; - //public final Block ladder; - //public final Block sign; + public final Block crafting_table; + public final Block ladder; + public final Block sign; - //public final Block chest; - //public final Block barrel; + public final Block chest; + public final Block barrel; public WoodenMaterial(String name, MaterialColor woodColor, MaterialColor planksColor) { @@ -65,14 +70,14 @@ public class WoodenMaterial trapdoor = BlockRegistry.registerBlock(name + "_trapdoor", new BlockTrapdoor(planks)); door = BlockRegistry.registerBlock(name + "_door", new BlockDoor(planks)); - //crafting_table = BlockRegistry.registerBlock("crafting_table_" + name, planks); - //ladder = BlockRegistry.registerBlock(name + "_ladder", planks); - //sign = BlockRegistry.registerBlock("sign_" + name, planks); + crafting_table = BlockRegistry.registerBlock(name + "_crafting_table", new BlockCraftingTable(planks)); + ladder = BlockRegistry.registerBlock(name + "_ladder", new BlockLadder(planks)); + sign = BlockRegistry.registerBlock(name + "_sign", new BlockSign(planks)); - //chest = BlockRegistry.registerBlock("chest_" + name, planks); - //barrel = BlockRegistry.registerBlock("barrel_" + name, planks, planks_slab); + chest = BlockRegistry.registerBlock(name + "_chest", new BlockChest(planks)); + barrel = BlockRegistry.registerBlock(name + "_barrel", new BlockBarrel(planks)); - RecipeBuilder.make(name + "_planks", planks).setOutputCount(4).setList("#").addMaterial('#', log, bark).setGroup("end_planks").build(); + RecipeBuilder.make(name + "_planks", planks).setOutputCount(4).setList("#").addMaterial('#', log, bark, log_striped, bark_striped).setGroup("end_planks").build(); RecipeBuilder.make(name + "_stairs", stairs).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', planks).setGroup("end_planks_stairs").build(); RecipeBuilder.make(name + "_slab", slab).setOutputCount(6).setShape("###").addMaterial('#', planks).setGroup("end_planks_slabs").build(); RecipeBuilder.make(name + "_fence", fence).setOutputCount(3).setShape("#I#", "#I#").addMaterial('#', planks).addMaterial('I', Items.STICK).setGroup("end_planks_fences").build(); @@ -81,6 +86,11 @@ public class WoodenMaterial RecipeBuilder.make(name + "_pressure_plate", pressure_plate).setList("##").addMaterial('#', planks).setGroup("end_planks_plates").build(); RecipeBuilder.make(name + "_trapdoor", trapdoor).setOutputCount(2).setShape("###", "###").addMaterial('#', planks).setGroup("end_trapdoors").build(); RecipeBuilder.make(name + "_door", door).setOutputCount(3).setShape("##", "##", "##").addMaterial('#', planks).setGroup("end_doors").build(); + RecipeBuilder.make(name + "_crafting_table", crafting_table).setShape("##", "##").addMaterial('#', planks).setGroup("end_tables").build(); + RecipeBuilder.make(name + "_ladder", ladder).setOutputCount(3).setShape("I I", "I#I", "I I").addMaterial('#', planks).addMaterial('I', Items.STICK).setGroup("end_ladders").build(); + RecipeBuilder.make(name + "_sign", sign).setOutputCount(3).setShape("###", "###", " I ").addMaterial('#', planks).addMaterial('I', Items.STICK).setGroup("end_signs").build(); + RecipeBuilder.make(name + "_chest", chest).setShape("###", "# #", "###").addMaterial('#', planks).setGroup("end_chests").build(); + RecipeBuilder.make(name + "_barrel", barrel).setShape("#S#", "# #", "#S#").addMaterial('#', planks).addMaterial('S', slab).setGroup("end_barrels").build(); } public boolean isTreeLog(Block block) diff --git a/src/main/java/ru/betterend/blocks/entities/EBarrelBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EBarrelBlockEntity.java new file mode 100644 index 00000000..b88460b8 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/entities/EBarrelBlockEntity.java @@ -0,0 +1,138 @@ +package ru.betterend.blocks.entities; + +import net.minecraft.block.BarrelBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.entity.BlockEntityType; +import net.minecraft.block.entity.ChestBlockEntity; +import net.minecraft.block.entity.LootableContainerBlockEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.Inventories; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.screen.GenericContainerScreenHandler; +import net.minecraft.screen.ScreenHandler; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvent; +import net.minecraft.sound.SoundEvents; +import net.minecraft.text.Text; +import net.minecraft.text.TranslatableText; +import net.minecraft.util.collection.DefaultedList; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Vec3i; +import ru.betterend.blocks.basis.BlockBarrel; +import ru.betterend.registry.BlockEntityRegistry; + +public class EBarrelBlockEntity extends LootableContainerBlockEntity { + private DefaultedList inventory; + private int viewerCount; + + private EBarrelBlockEntity(BlockEntityType type) { + super(type); + this.inventory = DefaultedList.ofSize(27, ItemStack.EMPTY); + } + + public EBarrelBlockEntity() { + this(BlockEntityRegistry.BARREL); + } + + public CompoundTag toTag(CompoundTag tag) { + super.toTag(tag); + if (!this.serializeLootTable(tag)) { + Inventories.toTag(tag, this.inventory); + } + + return tag; + } + + public void fromTag(BlockState state, CompoundTag tag) { + super.fromTag(state, tag); + this.inventory = DefaultedList.ofSize(this.size(), ItemStack.EMPTY); + if (!this.deserializeLootTable(tag)) { + Inventories.fromTag(tag, this.inventory); + } + } + + public int size() { + return 27; + } + + protected DefaultedList getInvStackList() { + return this.inventory; + } + + protected void setInvStackList(DefaultedList list) { + this.inventory = list; + } + + protected Text getContainerName() { + return new TranslatableText("container.barrel"); + } + + protected ScreenHandler createScreenHandler(int syncId, PlayerInventory playerInventory) { + return GenericContainerScreenHandler.createGeneric9x3(syncId, playerInventory, this); + } + + public void onOpen(PlayerEntity player) { + if (!player.isSpectator()) { + if (this.viewerCount < 0) { + this.viewerCount = 0; + } + + ++this.viewerCount; + BlockState blockState = this.getCachedState(); + boolean bl = (Boolean) blockState.get(BarrelBlock.OPEN); + if (!bl) { + this.playSound(blockState, SoundEvents.BLOCK_BARREL_OPEN); + this.setOpen(blockState, true); + } + + this.scheduleUpdate(); + } + } + + private void scheduleUpdate() { + this.world.getBlockTickScheduler().schedule(this.getPos(), this.getCachedState().getBlock(), 5); + } + + public void tick() { + int i = this.pos.getX(); + int j = this.pos.getY(); + int k = this.pos.getZ(); + this.viewerCount = ChestBlockEntity.countViewers(this.world, this, i, j, k); + if (this.viewerCount > 0) { + this.scheduleUpdate(); + } else { + BlockState blockState = this.getCachedState(); + if (!(blockState.getBlock() instanceof BlockBarrel)) { + this.markRemoved(); + return; + } + + boolean bl = (Boolean) blockState.get(BarrelBlock.OPEN); + if (bl) { + this.playSound(blockState, SoundEvents.BLOCK_BARREL_CLOSE); + this.setOpen(blockState, false); + } + } + } + + public void onClose(PlayerEntity player) { + if (!player.isSpectator()) { + --this.viewerCount; + } + } + + private void setOpen(BlockState state, boolean open) { + this.world.setBlockState(this.getPos(), (BlockState) state.with(BarrelBlock.OPEN, open), 3); + } + + private void playSound(BlockState blockState, SoundEvent soundEvent) { + Vec3i vec3i = ((Direction) blockState.get(BarrelBlock.FACING)).getVector(); + double d = (double) this.pos.getX() + 0.5D + (double) vec3i.getX() / 2.0D; + double e = (double) this.pos.getY() + 0.5D + (double) vec3i.getY() / 2.0D; + double f = (double) this.pos.getZ() + 0.5D + (double) vec3i.getZ() / 2.0D; + this.world.playSound((PlayerEntity) null, d, e, f, soundEvent, SoundCategory.BLOCKS, 0.5F, + this.world.random.nextFloat() * 0.1F + 0.9F); + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/entities/EChestBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EChestBlockEntity.java new file mode 100644 index 00000000..2f8b8003 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/entities/EChestBlockEntity.java @@ -0,0 +1,10 @@ +package ru.betterend.blocks.entities; + +import net.minecraft.block.entity.ChestBlockEntity; +import ru.betterend.registry.BlockEntityRegistry; + +public class EChestBlockEntity extends ChestBlockEntity { + public EChestBlockEntity() { + super(BlockEntityRegistry.CHEST); + } +} diff --git a/src/main/java/ru/betterend/blocks/entities/ESignBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/ESignBlockEntity.java new file mode 100644 index 00000000..cfae66f8 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/entities/ESignBlockEntity.java @@ -0,0 +1,168 @@ +package ru.betterend.blocks.entities; + +import java.util.function.Function; + +import com.mojang.brigadier.exceptions.CommandSyntaxException; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.block.BlockState; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket; +import net.minecraft.server.command.CommandOutput; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.text.ClickEvent; +import net.minecraft.text.LiteralText; +import net.minecraft.text.OrderedText; +import net.minecraft.text.Style; +import net.minecraft.text.Text; +import net.minecraft.text.Texts; +import net.minecraft.util.DyeColor; +import net.minecraft.util.math.Vec2f; +import net.minecraft.util.math.Vec3d; +import ru.betterend.registry.BlockEntityRegistry; + +public class ESignBlockEntity extends BlockEntity { + private final Text[] text; + private boolean editable; + private PlayerEntity editor; + private final OrderedText[] textBeingEdited; + private DyeColor textColor; + + public ESignBlockEntity() { + super(BlockEntityRegistry.SIGN); + this.text = new Text[] { LiteralText.EMPTY, LiteralText.EMPTY, LiteralText.EMPTY, LiteralText.EMPTY }; + this.editable = true; + this.textBeingEdited = new OrderedText[4]; + this.textColor = DyeColor.BLACK; + } + + public CompoundTag toTag(CompoundTag tag) { + super.toTag(tag); + + for (int i = 0; i < 4; ++i) { + String string = Text.Serializer.toJson(this.text[i]); + tag.putString("Text" + (i + 1), string); + } + + tag.putString("Color", this.textColor.getName()); + return tag; + } + + public void fromTag(BlockState state, CompoundTag tag) { + this.editable = false; + super.fromTag(state, tag); + this.textColor = DyeColor.byName(tag.getString("Color"), DyeColor.BLACK); + + for (int i = 0; i < 4; ++i) { + String string = tag.getString("Text" + (i + 1)); + Text text = Text.Serializer.fromJson(string.isEmpty() ? "\"\"" : string); + if (this.world instanceof ServerWorld) { + try { + this.text[i] = Texts.parse(this.getCommandSource((ServerPlayerEntity) null), text, (Entity) null, + 0); + } catch (CommandSyntaxException var7) { + this.text[i] = text; + } + } else { + this.text[i] = text; + } + + this.textBeingEdited[i] = null; + } + + } + + public void setTextOnRow(int row, Text text) { + this.text[row] = text; + this.textBeingEdited[row] = null; + } + + @Environment(EnvType.CLIENT) + public OrderedText getTextBeingEditedOnRow(int row, Function function) { + if (this.textBeingEdited[row] == null && this.text[row] != null) { + this.textBeingEdited[row] = (OrderedText) function.apply(this.text[row]); + } + + return this.textBeingEdited[row]; + } + + public BlockEntityUpdateS2CPacket toUpdatePacket() { + return new BlockEntityUpdateS2CPacket(this.pos, 9, this.toInitialChunkDataTag()); + } + + public CompoundTag toInitialChunkDataTag() { + return this.toTag(new CompoundTag()); + } + + public boolean copyItemDataRequiresOperator() { + return true; + } + + public boolean isEditable() { + return this.editable; + } + + @Environment(EnvType.CLIENT) + public void setEditable(boolean bl) { + this.editable = bl; + if (!bl) { + this.editor = null; + } + + } + + public void setEditor(PlayerEntity player) { + this.editor = player; + } + + public PlayerEntity getEditor() { + return this.editor; + } + + public boolean onActivate(PlayerEntity player) { + Text[] var2 = this.text; + int var3 = var2.length; + + for (int var4 = 0; var4 < var3; ++var4) { + Text text = var2[var4]; + Style style = text == null ? null : text.getStyle(); + if (style != null && style.getClickEvent() != null) { + ClickEvent clickEvent = style.getClickEvent(); + if (clickEvent.getAction() == ClickEvent.Action.RUN_COMMAND) { + player.getServer().getCommandManager().execute(this.getCommandSource((ServerPlayerEntity) player), + clickEvent.getValue()); + } + } + } + + return true; + } + + public ServerCommandSource getCommandSource(ServerPlayerEntity player) { + String string = player == null ? "Sign" : player.getName().getString(); + Text text = player == null ? new LiteralText("Sign") : player.getDisplayName(); + return new ServerCommandSource(CommandOutput.DUMMY, Vec3d.ofCenter(this.pos), Vec2f.ZERO, + (ServerWorld) this.world, 2, string, (Text) text, this.world.getServer(), player); + } + + public DyeColor getTextColor() { + return this.textColor; + } + + public boolean setTextColor(DyeColor value) { + if (value != this.getTextColor()) { + this.textColor = value; + this.markDirty(); + this.world.updateListeners(this.getPos(), this.getCachedState(), this.getCachedState(), 3); + return true; + } else { + return false; + } + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/entities/render/EChestBlockEntityRenderer.java b/src/main/java/ru/betterend/blocks/entities/render/EChestBlockEntityRenderer.java new file mode 100644 index 00000000..0f52b4c1 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/entities/render/EChestBlockEntityRenderer.java @@ -0,0 +1,187 @@ +package ru.betterend.blocks.entities.render; + +import java.util.HashMap; + +import com.google.common.collect.Maps; + +import it.unimi.dsi.fastutil.floats.Float2FloatFunction; +import it.unimi.dsi.fastutil.ints.Int2IntFunction; +import net.minecraft.block.AbstractChestBlock; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.ChestBlock; +import net.minecraft.block.DoubleBlockProperties; +import net.minecraft.block.DoubleBlockProperties.PropertySource; +import net.minecraft.block.entity.ChestBlockEntity; +import net.minecraft.block.enums.ChestType; +import net.minecraft.client.block.ChestAnimationProgress; +import net.minecraft.client.model.ModelPart; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher; +import net.minecraft.client.render.block.entity.BlockEntityRenderer; +import net.minecraft.client.render.block.entity.LightmapCoordinatesRetriever; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.util.math.Vector3f; +import net.minecraft.item.BlockItem; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.Direction; +import net.minecraft.util.registry.Registry; +import net.minecraft.world.World; +import ru.betterend.BetterEnd; +import ru.betterend.blocks.basis.BlockChest; +import ru.betterend.blocks.entities.EChestBlockEntity; +import ru.betterend.registry.ItemRegistry; + +public class EChestBlockEntityRenderer extends BlockEntityRenderer { + private static final HashMap LAYERS = Maps.newHashMap(); + private static RenderLayer[] defaultLayer; + + private static final int ID_NORMAL = 0; + private static final int ID_LEFT = 1; + private static final int ID_RIGHT = 2; + + private final ModelPart partA; + private final ModelPart partC; + private final ModelPart partB; + private final ModelPart partRightA; + private final ModelPart partRightC; + private final ModelPart partRightB; + private final ModelPart partLeftA; + private final ModelPart partLeftC; + private final ModelPart partLeftB; + + public EChestBlockEntityRenderer(BlockEntityRenderDispatcher blockEntityRenderDispatcher) { + super(blockEntityRenderDispatcher); + + this.partC = new ModelPart(64, 64, 0, 19); + this.partC.addCuboid(1.0F, 0.0F, 1.0F, 14.0F, 10.0F, 14.0F, 0.0F); + this.partA = new ModelPart(64, 64, 0, 0); + this.partA.addCuboid(1.0F, 0.0F, 0.0F, 14.0F, 5.0F, 14.0F, 0.0F); + this.partA.pivotY = 9.0F; + this.partA.pivotZ = 1.0F; + this.partB = new ModelPart(64, 64, 0, 0); + this.partB.addCuboid(7.0F, -1.0F, 15.0F, 2.0F, 4.0F, 1.0F, 0.0F); + this.partB.pivotY = 8.0F; + this.partRightC = new ModelPart(64, 64, 0, 19); + this.partRightC.addCuboid(1.0F, 0.0F, 1.0F, 15.0F, 10.0F, 14.0F, 0.0F); + this.partRightA = new ModelPart(64, 64, 0, 0); + this.partRightA.addCuboid(1.0F, 0.0F, 0.0F, 15.0F, 5.0F, 14.0F, 0.0F); + this.partRightA.pivotY = 9.0F; + this.partRightA.pivotZ = 1.0F; + this.partRightB = new ModelPart(64, 64, 0, 0); + this.partRightB.addCuboid(15.0F, -1.0F, 15.0F, 1.0F, 4.0F, 1.0F, 0.0F); + this.partRightB.pivotY = 8.0F; + this.partLeftC = new ModelPart(64, 64, 0, 19); + this.partLeftC.addCuboid(0.0F, 0.0F, 1.0F, 15.0F, 10.0F, 14.0F, 0.0F); + this.partLeftA = new ModelPart(64, 64, 0, 0); + this.partLeftA.addCuboid(0.0F, 0.0F, 0.0F, 15.0F, 5.0F, 14.0F, 0.0F); + this.partLeftA.pivotY = 9.0F; + this.partLeftA.pivotZ = 1.0F; + this.partLeftB = new ModelPart(64, 64, 0, 0); + this.partLeftB.addCuboid(0.0F, -1.0F, 15.0F, 1.0F, 4.0F, 1.0F, 0.0F); + this.partLeftB.pivotY = 8.0F; + } + + public void render(EChestBlockEntity entity, float tickDelta, MatrixStack matrices, + VertexConsumerProvider vertexConsumers, int light, int overlay) { + World world = entity.getWorld(); + boolean worldExists = world != null; + BlockState blockState = worldExists ? entity.getCachedState() + : (BlockState) Blocks.CHEST.getDefaultState().with(ChestBlock.FACING, Direction.SOUTH); + ChestType chestType = blockState.contains(ChestBlock.CHEST_TYPE) + ? (ChestType) blockState.get(ChestBlock.CHEST_TYPE) : ChestType.SINGLE; + Block block = blockState.getBlock(); + if (block instanceof AbstractChestBlock) { + AbstractChestBlock abstractChestBlock = (AbstractChestBlock) block; + boolean isDouble = chestType != ChestType.SINGLE; + float f = ((Direction) blockState.get(ChestBlock.FACING)).asRotation(); + PropertySource propertySource; + + matrices.push(); + matrices.translate(0.5D, 0.5D, 0.5D); + matrices.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(-f)); + matrices.translate(-0.5D, -0.5D, -0.5D); + + if (worldExists) { + propertySource = abstractChestBlock.getBlockEntitySource(blockState, world, entity.getPos(), true); + } else { + propertySource = DoubleBlockProperties.PropertyRetriever::getFallback; + } + + float pitch = ((Float2FloatFunction) propertySource + .apply(ChestBlock.getAnimationProgressRetriever((ChestAnimationProgress) entity))).get(tickDelta); + pitch = 1.0F - pitch; + pitch = 1.0F - pitch * pitch * pitch; + @SuppressWarnings({ "unchecked", "rawtypes" }) + int blockLight = ((Int2IntFunction) propertySource.apply(new LightmapCoordinatesRetriever())) + .applyAsInt(light); + + VertexConsumer vertexConsumer = getConsumer(vertexConsumers, block, chestType); + + if (isDouble) { + if (chestType == ChestType.LEFT) { + renderParts(matrices, vertexConsumer, this.partLeftA, this.partLeftB, this.partLeftC, pitch, + blockLight, overlay); + } else { + renderParts(matrices, vertexConsumer, this.partRightA, this.partRightB, this.partRightC, pitch, + blockLight, overlay); + } + } else { + renderParts(matrices, vertexConsumer, this.partA, this.partB, this.partC, pitch, blockLight, overlay); + } + + matrices.pop(); + } + } + + private void renderParts(MatrixStack matrices, VertexConsumer vertices, ModelPart modelPart, ModelPart modelPart2, + ModelPart modelPart3, float pitch, int light, int overlay) { + modelPart.pitch = -(pitch * 1.5707964F); + modelPart2.pitch = modelPart.pitch; + modelPart.render(matrices, vertices, light, overlay); + modelPart2.render(matrices, vertices, light, overlay); + modelPart3.render(matrices, vertices, light, overlay); + } + + private static RenderLayer getChestTexture(ChestType type, RenderLayer[] layers) { + switch (type) { + case LEFT: + return layers[ID_LEFT]; + case RIGHT: + return layers[ID_RIGHT]; + case SINGLE: + default: + return layers[ID_NORMAL]; + } + } + + public static VertexConsumer getConsumer(VertexConsumerProvider provider, Block block, ChestType chestType) { + RenderLayer[] layers = LAYERS.getOrDefault(Block.getRawIdFromState(block.getDefaultState()), defaultLayer); + return provider.getBuffer(getChestTexture(chestType, layers)); + } + + static { + defaultLayer = new RenderLayer[] { + RenderLayer.getEntitySolid(new Identifier(BetterEnd.MOD_ID, "entity/chest/normal.png")), + RenderLayer.getEntitySolid(new Identifier(BetterEnd.MOD_ID, "entity/chest/normal_left.png")), + RenderLayer.getEntitySolid(new Identifier(BetterEnd.MOD_ID, "entity/chest/normal_right.png")) + }; + + ItemRegistry.getModBlocks().forEach((item) -> { + if (item instanceof BlockItem) { + Block block = ((BlockItem) item).getBlock(); + if (block instanceof BlockChest) { + String name = Registry.BLOCK.getId(block).getPath(); + LAYERS.put(Block.getRawIdFromState(block.getDefaultState()), new RenderLayer[] { + RenderLayer.getEntitySolid(new Identifier(BetterEnd.MOD_ID, "textures/entity/chest/" + name + ".png")), + RenderLayer.getEntitySolid(new Identifier(BetterEnd.MOD_ID, "textures/entity/chest/" + name + "_left.png")), + RenderLayer.getEntitySolid(new Identifier(BetterEnd.MOD_ID, "textures/entity/chest/" + name + "_right.png")) + }); + } + } + }); + } +} diff --git a/src/main/java/ru/betterend/blocks/entities/render/ESignBlockEntityRenderer.java b/src/main/java/ru/betterend/blocks/entities/render/ESignBlockEntityRenderer.java new file mode 100644 index 00000000..99431095 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/entities/render/ESignBlockEntityRenderer.java @@ -0,0 +1,123 @@ +package ru.betterend.blocks.entities.render; + +import java.util.HashMap; +import java.util.List; + +import com.google.common.collect.Maps; + +import net.minecraft.block.AbstractSignBlock; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.SignBlock; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.TexturedRenderLayers; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher; +import net.minecraft.client.render.block.entity.BlockEntityRenderer; +import net.minecraft.client.render.block.entity.SignBlockEntityRenderer; +import net.minecraft.client.render.block.entity.SignBlockEntityRenderer.SignModel; +import net.minecraft.client.texture.NativeImage; +import net.minecraft.client.util.SpriteIdentifier; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.util.math.Vector3f; +import net.minecraft.item.BlockItem; +import net.minecraft.text.OrderedText; +import net.minecraft.util.Identifier; +import net.minecraft.util.SignType; +import net.minecraft.util.registry.Registry; +import ru.betterend.BetterEnd; +import ru.betterend.blocks.basis.BlockSign; +import ru.betterend.blocks.entities.ESignBlockEntity; +import ru.betterend.registry.ItemRegistry; + +public class ESignBlockEntityRenderer extends BlockEntityRenderer { + private static final HashMap LAYERS = Maps.newHashMap(); + private static RenderLayer defaultLayer; + private final SignModel model = new SignBlockEntityRenderer.SignModel(); + + public ESignBlockEntityRenderer(BlockEntityRenderDispatcher dispatcher) { + super(dispatcher); + } + + public void render(ESignBlockEntity signBlockEntity, float tickDelta, MatrixStack matrixStack, + VertexConsumerProvider provider, int light, int overlay) { + BlockState state = signBlockEntity.getCachedState(); + matrixStack.push(); + + matrixStack.translate(0.5D, 0.5D, 0.5D); + float angle = -((float) ((Integer) state.get(SignBlock.ROTATION) * 360) / 16.0F); + + BlockState blockState = signBlockEntity.getCachedState(); + if (blockState.get(BlockSign.FLOOR)) { + matrixStack.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(angle)); + this.model.foot.visible = true; + } else { + matrixStack.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(angle + 180)); + matrixStack.translate(0.0D, -0.3125D, -0.4375D); + this.model.foot.visible = false; + } + + matrixStack.push(); + matrixStack.scale(0.6666667F, -0.6666667F, -0.6666667F); + VertexConsumer vertexConsumer = getConsumer(provider, state.getBlock()); + model.field.render(matrixStack, vertexConsumer, light, overlay); + model.foot.render(matrixStack, vertexConsumer, light, overlay); + matrixStack.pop(); + TextRenderer textRenderer = dispatcher.getTextRenderer(); + matrixStack.translate(0.0D, 0.3333333432674408D, 0.046666666865348816D); + matrixStack.scale(0.010416667F, -0.010416667F, 0.010416667F); + int m = signBlockEntity.getTextColor().getSignColor(); + int n = (int) (NativeImage.getRed(m) * 0.4D); + int o = (int) (NativeImage.getGreen(m) * 0.4D); + int p = (int) (NativeImage.getBlue(m) * 0.4D); + int q = NativeImage.getAbgrColor(0, p, o, n); + + for (int s = 0; s < 4; ++s) { + OrderedText orderedText = signBlockEntity.getTextBeingEditedOnRow(s, (text) -> { + List list = textRenderer.wrapLines(text, 90); + return list.isEmpty() ? OrderedText.EMPTY : (OrderedText) list.get(0); + }); + if (orderedText != null) { + float t = (float) (-textRenderer.getWidth(orderedText) / 2); + textRenderer.draw((OrderedText) orderedText, t, (float) (s * 10 - 20), q, false, + matrixStack.peek().getModel(), provider, false, 0, light); + } + } + + matrixStack.pop(); + } + + public static SpriteIdentifier getModelTexture(Block block) { + SignType signType2; + if (block instanceof AbstractSignBlock) { + signType2 = ((AbstractSignBlock) block).getSignType(); + } else { + signType2 = SignType.OAK; + } + + return TexturedRenderLayers.getSignTextureId(signType2); + } + + public static VertexConsumer getConsumer(VertexConsumerProvider provider, Block block) { + return provider.getBuffer(LAYERS.getOrDefault(Block.getRawIdFromState(block.getDefaultState()), defaultLayer)); + } + + static { + defaultLayer = RenderLayer.getEntitySolid(new Identifier(BetterEnd.MOD_ID, "entity/chest/normal.png")); + + ItemRegistry.getModBlocks().forEach((item) -> { + if (item instanceof BlockItem) { + Block block = ((BlockItem) item).getBlock(); + if (block instanceof BlockSign) { + String name = Registry.BLOCK.getId(block).getPath(); + RenderLayer layer = RenderLayer.getEntitySolid(new Identifier(BetterEnd.MOD_ID, "textures/entity/sign/" + name + ".png")); + LAYERS.put(Block.getRawIdFromState(block.getDefaultState()), layer); + } + } + }); + } + + +} diff --git a/src/main/java/ru/betterend/client/BetterEndClient.java b/src/main/java/ru/betterend/client/BetterEndClient.java index 208fb6a2..e3fb7108 100644 --- a/src/main/java/ru/betterend/client/BetterEndClient.java +++ b/src/main/java/ru/betterend/client/BetterEndClient.java @@ -4,12 +4,14 @@ import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; import net.minecraft.client.render.RenderLayer; import net.minecraft.util.registry.Registry; +import ru.betterend.registry.BlockEntityRenderRegistry; public class BetterEndClient implements ClientModInitializer { @Override public void onInitializeClient() { registerRenderLayers(); + BlockEntityRenderRegistry.register(); } private void registerRenderLayers() { diff --git a/src/main/java/ru/betterend/client/gui/BlockSignEditScreen.java b/src/main/java/ru/betterend/client/gui/BlockSignEditScreen.java new file mode 100644 index 00000000..ce63a8fd --- /dev/null +++ b/src/main/java/ru/betterend/client/gui/BlockSignEditScreen.java @@ -0,0 +1,232 @@ +package ru.betterend.client.gui; + +import java.util.Arrays; + +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.block.BlockState; +import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screen.ScreenTexts; +import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.client.render.BufferBuilder; +import net.minecraft.client.render.BufferRenderer; +import net.minecraft.client.render.DiffuseLighting; +import net.minecraft.client.render.OverlayTexture; +import net.minecraft.client.render.Tessellator; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.VertexFormats; +import net.minecraft.client.render.block.entity.SignBlockEntityRenderer.SignModel; +import net.minecraft.client.util.SelectionManager; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket; +import net.minecraft.text.LiteralText; +import net.minecraft.text.TranslatableText; +import net.minecraft.util.Util; +import net.minecraft.util.math.Matrix4f; +import ru.betterend.blocks.basis.BlockSign; +import ru.betterend.blocks.entities.ESignBlockEntity; +import ru.betterend.blocks.entities.render.ESignBlockEntityRenderer; + +@Environment(EnvType.CLIENT) +public class BlockSignEditScreen extends Screen { + private final SignModel model = new SignModel(); + private final ESignBlockEntity sign; + private int ticksSinceOpened; + private int currentRow; + private SelectionManager selectionManager; + private final String[] text = (String[]) Util.make(new String[4], (strings) -> { + Arrays.fill(strings, ""); + }); + + public BlockSignEditScreen(ESignBlockEntity sign) { + super(new TranslatableText("sign.edit")); + this.sign = sign; + } + + protected void init() { + this.client.keyboard.setRepeatEvents(true); + this.addButton(new ButtonWidget(this.width / 2 - 100, this.height / 4 + 120, 200, 20, ScreenTexts.DONE, + (buttonWidget) -> { + this.finishEditing(); + })); + this.sign.setEditable(false); + this.selectionManager = new SelectionManager(() -> { + return this.text[this.currentRow]; + }, (string) -> { + this.text[this.currentRow] = string; + this.sign.setTextOnRow(this.currentRow, new LiteralText(string)); + }, SelectionManager.makeClipboardGetter(this.client), SelectionManager.makeClipboardSetter(this.client), + (string) -> { + return this.client.textRenderer.getWidth(string) <= 90; + }); + } + + public void removed() { + this.client.keyboard.setRepeatEvents(false); + ClientPlayNetworkHandler clientPlayNetworkHandler = this.client.getNetworkHandler(); + if (clientPlayNetworkHandler != null) { + clientPlayNetworkHandler.sendPacket(new UpdateSignC2SPacket(this.sign.getPos(), this.text[0], this.text[1], + this.text[2], this.text[3])); + } + + this.sign.setEditable(true); + } + + public void tick() { + ++this.ticksSinceOpened; + if (!this.sign.getType().supports(this.sign.getCachedState().getBlock())) { + this.finishEditing(); + System.out.println(this.sign.getType()); + } + } + + private void finishEditing() { + this.sign.markDirty(); + this.client.openScreen((Screen) null); + } + + public boolean charTyped(char chr, int keyCode) { + this.selectionManager.insert(chr); + return true; + } + + public void onClose() { + this.finishEditing(); + } + + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + if (keyCode == 265) { + this.currentRow = this.currentRow - 1 & 3; + this.selectionManager.moveCaretToEnd(); + return true; + } else if (keyCode != 264 && keyCode != 257 && keyCode != 335) { + return this.selectionManager.handleSpecialKey(keyCode) ? true + : super.keyPressed(keyCode, scanCode, modifiers); + } else { + this.currentRow = this.currentRow + 1 & 3; + this.selectionManager.moveCaretToEnd(); + return true; + } + } + + public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { + DiffuseLighting.disableGuiDepthLighting(); + this.renderBackground(matrices); + DrawableHelper.drawCenteredText(matrices, this.textRenderer, this.title, this.width / 2, 40, 16777215); + matrices.push(); + matrices.translate((double) (this.width / 2), 0.0D, 50.0D); + + matrices.scale(93.75F, -93.75F, 93.75F); + matrices.translate(0.0D, -1.3125D, 0.0D); + BlockState blockState = this.sign.getCachedState(); + boolean bl = blockState.get(BlockSign.FLOOR); + + if (!bl) { + matrices.translate(0.0D, -0.3125D, 0.0D); + } + + boolean bl2 = this.ticksSinceOpened / 6 % 2 == 0; + + matrices.push(); + matrices.scale(0.6666667F, -0.6666667F, -0.6666667F); + VertexConsumerProvider.Immediate immediate = this.client.getBufferBuilders().getEntityVertexConsumers(); + VertexConsumer vertexConsumer = ESignBlockEntityRenderer.getConsumer(immediate, blockState.getBlock()); + this.model.field.render(matrices, vertexConsumer, 15728880, OverlayTexture.DEFAULT_UV); + + if (bl) { + this.model.foot.render(matrices, vertexConsumer, 15728880, OverlayTexture.DEFAULT_UV); + } + + matrices.pop(); + + matrices.translate(0.0D, 0.3333333432674408D, 0.046666666865348816D); + matrices.scale(0.010416667F, -0.010416667F, 0.010416667F); + int i = this.sign.getTextColor().getSignColor(); + int j = this.selectionManager.getSelectionStart(); + int k = this.selectionManager.getSelectionEnd(); + int l = this.currentRow * 10 - this.text.length * 5; + Matrix4f matrix4f = matrices.peek().getModel(); + + int m; + String string2; + int s; + int t; + for (m = 0; m < this.text.length; ++m) { + string2 = this.text[m]; + if (string2 != null) { + if (this.textRenderer.isRightToLeft()) { + string2 = this.textRenderer.mirror(string2); + } + + float n = (float) (-this.client.textRenderer.getWidth(string2) / 2); + this.client.textRenderer.draw(string2, n, (float) (m * 10 - this.text.length * 5), i, false, matrix4f, + immediate, false, 0, 15728880, false); + if (m == this.currentRow && j >= 0 && bl2) { + s = this.client.textRenderer + .getWidth(string2.substring(0, Math.max(Math.min(j, string2.length()), 0))); + t = s - this.client.textRenderer.getWidth(string2) / 2; + if (j >= string2.length()) { + this.client.textRenderer.draw("_", (float) t, (float) l, i, false, matrix4f, immediate, false, + 0, 15728880, false); + } + } + } + } + + immediate.draw(); + + for (m = 0; m < this.text.length; ++m) { + string2 = this.text[m]; + if (string2 != null && m == this.currentRow && j >= 0) { + int r = this.client.textRenderer + .getWidth(string2.substring(0, Math.max(Math.min(j, string2.length()), 0))); + s = r - this.client.textRenderer.getWidth(string2) / 2; + if (bl2 && j < string2.length()) { + int var31 = l - 1; + int var10003 = s + 1; + this.client.textRenderer.getClass(); + fill(matrices, s, var31, var10003, l + 9, -16777216 | i); + } + + if (k != j) { + t = Math.min(j, k); + int u = Math.max(j, k); + int v = this.client.textRenderer.getWidth(string2.substring(0, t)) + - this.client.textRenderer.getWidth(string2) / 2; + int w = this.client.textRenderer.getWidth(string2.substring(0, u)) + - this.client.textRenderer.getWidth(string2) / 2; + int x = Math.min(v, w); + int y = Math.max(v, w); + Tessellator tessellator = Tessellator.getInstance(); + BufferBuilder bufferBuilder = tessellator.getBuffer(); + RenderSystem.disableTexture(); + RenderSystem.enableColorLogicOp(); + RenderSystem.logicOp(GlStateManager.LogicOp.OR_REVERSE); + bufferBuilder.begin(7, VertexFormats.POSITION_COLOR); + float var32 = (float) x; + this.client.textRenderer.getClass(); + bufferBuilder.vertex(matrix4f, var32, (float) (l + 9), 0.0F).color(0, 0, 255, 255).next(); + var32 = (float) y; + this.client.textRenderer.getClass(); + bufferBuilder.vertex(matrix4f, var32, (float) (l + 9), 0.0F).color(0, 0, 255, 255).next(); + bufferBuilder.vertex(matrix4f, (float) y, (float) l, 0.0F).color(0, 0, 255, 255).next(); + bufferBuilder.vertex(matrix4f, (float) x, (float) l, 0.0F).color(0, 0, 255, 255).next(); + bufferBuilder.end(); + BufferRenderer.draw(bufferBuilder); + RenderSystem.disableColorLogicOp(); + RenderSystem.enableTexture(); + } + } + } + + matrices.pop(); + DiffuseLighting.enableGuiDepthLighting(); + super.render(matrices, mouseX, mouseY, delta); + } +} diff --git a/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java b/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java new file mode 100644 index 00000000..1fb9536c --- /dev/null +++ b/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java @@ -0,0 +1,53 @@ +package ru.betterend.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.network.NetworkThreadUtils; +import net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket; +import net.minecraft.network.packet.s2c.play.SignEditorOpenS2CPacket; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.thread.ThreadExecutor; +import ru.betterend.blocks.entities.ESignBlockEntity; +import ru.betterend.client.gui.BlockSignEditScreen; + +@Mixin(ClientPlayNetworkHandler.class) +public class ClientPlayNetworkHandlerMixin +{ + @Shadow + private MinecraftClient client; + + @Shadow + private ClientWorld world; + + @Inject(method = "onSignEditorOpen", at = @At(value = "HEAD"), cancellable = true) + public void openSignEditor(SignEditorOpenS2CPacket packet, CallbackInfo info) { + NetworkThreadUtils.forceMainThread(packet, (ClientPlayNetworkHandler) (Object) this, + (ThreadExecutor) client); + BlockEntity blockEntity = this.world.getBlockEntity(packet.getPos()); + if (blockEntity instanceof ESignBlockEntity) { + ESignBlockEntity sign = (ESignBlockEntity) blockEntity; + client.openScreen(new BlockSignEditScreen(sign)); + info.cancel(); + } + } + + @Inject(method = "onBlockEntityUpdate", at = @At(value = "HEAD"), cancellable = true) + public void onEntityUpdate(BlockEntityUpdateS2CPacket packet, CallbackInfo info) { + NetworkThreadUtils.forceMainThread(packet, (ClientPlayNetworkHandler) (Object) this, + (ThreadExecutor) client); + BlockPos blockPos = packet.getPos(); + BlockEntity blockEntity = this.client.world.getBlockEntity(blockPos); + if (blockEntity instanceof ESignBlockEntity) { + blockEntity.fromTag(this.client.world.getBlockState(blockPos), packet.getCompoundTag()); + info.cancel(); + } + } +} diff --git a/src/main/java/ru/betterend/mixin/common/ServerPlayNetworkHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/ServerPlayNetworkHandlerMixin.java new file mode 100644 index 00000000..4be1ac7d --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/ServerPlayNetworkHandlerMixin.java @@ -0,0 +1,60 @@ +package ru.betterend.mixin.common; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.block.BlockState; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.network.NetworkThreadUtils; +import net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket; +import net.minecraft.server.network.ServerPlayNetworkHandler; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.text.LiteralText; +import net.minecraft.util.Formatting; +import net.minecraft.util.math.BlockPos; +import ru.betterend.blocks.entities.ESignBlockEntity; + +@Mixin(ServerPlayNetworkHandler.class) +public class ServerPlayNetworkHandlerMixin { + @Shadow + private static final Logger LOGGER = LogManager.getLogger(); + + @Shadow + public ServerPlayerEntity player; + + @Inject(method = "onSignUpdate", at = @At(value = "HEAD"), cancellable = true) + private void signUpdate(UpdateSignC2SPacket packet, CallbackInfo info) { + NetworkThreadUtils.forceMainThread(packet, (ServerPlayNetworkHandler) (Object) this, (ServerWorld) this.player.getServerWorld()); + this.player.updateLastActionTime(); + ServerWorld serverWorld = this.player.getServerWorld(); + BlockPos blockPos = packet.getPos(); + if (serverWorld.isChunkLoaded(blockPos)) { + BlockState blockState = serverWorld.getBlockState(blockPos); + BlockEntity blockEntity = serverWorld.getBlockEntity(blockPos); + if (blockEntity instanceof ESignBlockEntity) { + ESignBlockEntity signBlockEntity = (ESignBlockEntity) blockEntity; + if (!signBlockEntity.isEditable() || signBlockEntity.getEditor() != this.player) { + LOGGER.warn("Player {} just tried to change non-editable sign", this.player.getName().getString()); + return; + } + + String[] strings = packet.getText(); + + for (int i = 0; i < strings.length; ++i) { + signBlockEntity.setTextOnRow(i, new LiteralText(Formatting.strip(strings[i]))); + } + + signBlockEntity.markDirty(); + serverWorld.updateListeners(blockPos, blockState, blockState, 3); + + info.cancel(); + } + } + } +} diff --git a/src/main/java/ru/betterend/registry/BlockEntityRegistry.java b/src/main/java/ru/betterend/registry/BlockEntityRegistry.java new file mode 100644 index 00000000..e7ff6ed0 --- /dev/null +++ b/src/main/java/ru/betterend/registry/BlockEntityRegistry.java @@ -0,0 +1,77 @@ +package ru.betterend.registry; + +import java.util.List; + +import com.google.common.collect.Lists; + +import net.minecraft.block.Block; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.block.entity.BlockEntityType; +import net.minecraft.item.BlockItem; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; +import ru.betterend.BetterEnd; +import ru.betterend.blocks.basis.BlockBarrel; +import ru.betterend.blocks.basis.BlockChest; +import ru.betterend.blocks.basis.BlockSign; +import ru.betterend.blocks.entities.EBarrelBlockEntity; +import ru.betterend.blocks.entities.EChestBlockEntity; +import ru.betterend.blocks.entities.ESignBlockEntity; + +public class BlockEntityRegistry +{ + public static final BlockEntityType CHEST = BlockEntityType.Builder.create(EChestBlockEntity::new, getChests()).build(null); + public static final BlockEntityType BARREL = BlockEntityType.Builder.create(EBarrelBlockEntity::new, getBarrels()).build(null); + public static final BlockEntityType SIGN = BlockEntityType.Builder.create(ESignBlockEntity::new, getSigns()).build(null); + + public static void register() { + RegisterBlockEntity("chest", CHEST); + RegisterBlockEntity("barrel", BARREL); + RegisterBlockEntity("sign", SIGN); + } + + public static void RegisterBlockEntity(String name, BlockEntityType type) { + Registry.register(Registry.BLOCK_ENTITY_TYPE, new Identifier(BetterEnd.MOD_ID, name), type); + } + + private static Block[] getChests() { + List result = Lists.newArrayList(); + ItemRegistry.getModBlocks().forEach((item) -> { + if (item instanceof BlockItem) { + Block block = ((BlockItem) item).getBlock(); + if (block instanceof BlockChest) { + result.add(block); + } + } + }); + return result.toArray(new Block[] {}); + } + + private static Block[] getBarrels() + { + List result = Lists.newArrayList(); + ItemRegistry.getModBlocks().forEach((item) -> { + if (item instanceof BlockItem) { + Block block = ((BlockItem) item).getBlock(); + if (block instanceof BlockBarrel) { + result.add(block); + } + } + }); + return result.toArray(new Block[] {}); + } + + private static Block[] getSigns() + { + List result = Lists.newArrayList(); + ItemRegistry.getModBlocks().forEach((item) -> { + if (item instanceof BlockItem) { + Block block = ((BlockItem) item).getBlock(); + if (block instanceof BlockSign) { + result.add(block); + } + } + }); + return result.toArray(new Block[] {}); + } +} diff --git a/src/main/java/ru/betterend/registry/BlockEntityRenderRegistry.java b/src/main/java/ru/betterend/registry/BlockEntityRenderRegistry.java new file mode 100644 index 00000000..3a525ba9 --- /dev/null +++ b/src/main/java/ru/betterend/registry/BlockEntityRenderRegistry.java @@ -0,0 +1,15 @@ +package ru.betterend.registry; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.rendereregistry.v1.BlockEntityRendererRegistry; +import ru.betterend.blocks.entities.render.EChestBlockEntityRenderer; +import ru.betterend.blocks.entities.render.ESignBlockEntityRenderer; + +public class BlockEntityRenderRegistry { + @Environment(EnvType.CLIENT) + public static void register() { + BlockEntityRendererRegistry.INSTANCE.register(BlockEntityRegistry.CHEST, EChestBlockEntityRenderer::new); + BlockEntityRendererRegistry.INSTANCE.register(BlockEntityRegistry.SIGN, ESignBlockEntityRenderer::new); + } +} diff --git a/src/main/java/ru/betterend/registry/BlockRegistry.java b/src/main/java/ru/betterend/registry/BlockRegistry.java index 260883c3..a64b1792 100644 --- a/src/main/java/ru/betterend/registry/BlockRegistry.java +++ b/src/main/java/ru/betterend/registry/BlockRegistry.java @@ -14,6 +14,7 @@ import ru.betterend.blocks.BlockTerrain; import ru.betterend.blocks.EndStoneSmelter; import ru.betterend.blocks.EnderBlock; import ru.betterend.blocks.TerminiteBlock; +import ru.betterend.blocks.complex.WoodenMaterial; import ru.betterend.tab.CreativeTab; public class BlockRegistry { @@ -22,6 +23,9 @@ public class BlockRegistry { public static final Block END_MYCELIUM = registerBlock("end_mycelium", new BlockTerrain(MaterialColor.LIGHT_BLUE)); public static final Block END_MOSS = registerBlock("end_moss", new BlockTerrain(MaterialColor.CYAN)); + // Wooden Materials // + public static final WoodenMaterial MOSSY_GLOWSHROOM = new WoodenMaterial("mossy_glowshroom", MaterialColor.GRAY, MaterialColor.WOOD); + // Ores // public static final Block ENDER_ORE = registerBlock("ender_ore", new BlockOre(ItemRegistry.ENDER_DUST, 1, 3)); @@ -30,7 +34,7 @@ public class BlockRegistry { public static final Block AETERNIUM_BLOCK = registerBlock("aeternium_block", new AeterniumBlock()); public static final Block ENDER_BLOCK = registerBlock("ender_block", new EnderBlock()); - // BlockEntities // + // Block With Entities // public static final Block END_STONE_SMELTER = registerBlock("end_stone_smelter", new EndStoneSmelter()); public static void register() {} diff --git a/src/main/resources/betterend.mixins.client.json b/src/main/resources/betterend.mixins.client.json index ae9f50fc..ec6da0be 100644 --- a/src/main/resources/betterend.mixins.client.json +++ b/src/main/resources/betterend.mixins.client.json @@ -5,7 +5,8 @@ "compatibilityLevel": "JAVA_8", "client": [ "WorldRendererMixin", - "BackgroundRendererMixin" + "BackgroundRendererMixin", + "ClientPlayNetworkHandlerMixin" ], "injectors": { "defaultRequire": 1 diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index a0cdbd0c..08432c01 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -5,7 +5,8 @@ "compatibilityLevel": "JAVA_8", "mixins": [ "DimensionTypeMixin", - "RecipeManagerMixin" + "RecipeManagerMixin", + "ServerPlayNetworkHandlerMixin" ], "injectors": { "defaultRequire": 1 diff --git a/utilities/paulevs/wooden/Helper.java b/utilities/paulevs/wooden/Helper.java new file mode 100644 index 00000000..dbb33e7f --- /dev/null +++ b/utilities/paulevs/wooden/Helper.java @@ -0,0 +1,92 @@ +package paulevs.wooden; + +public class Helper +{ + public static final String MASK = "%name%"; + + public static final String[] BLOCKSTATES = new String[] { + "%name%_bark.json", + "%name%_button.json", + "%name%_door.json", + "%name%_fence.json", + "%name%_gate.json", + "%name%_ladder.json", + "%name%_log.json", + "%name%_planks.json", + "%name%_plate.json", + "%name%_slab.json", + "%name%_stairs.json", + "%name%_trapdoor.json", + "barrel_%name%.json", + "bar_stool_%name%.json", + "chair_%name%.json", + "chest_%name%.json", + "crafting_table_%name%.json", + "sign_%name%.json", + "striped_bark_%name%.json", + "striped_log_%name%.json", + "taburet_%name%.json" + }; + + public static final String[] BLOCKS = new String[] { + "%name%_bark.json", + "%name%_button.json", + "%name%_button_inventory.json", + "%name%_button_pressed.json", + "%name%_door_bottom.json", + "%name%_door_bottom_hinge.json", + "%name%_door_top.json", + "%name%_door_top_hinge.json", + "%name%_fence_gate_closed.json", + "%name%_fence_gate_open.json", + "%name%_fence_inventory.json", + "%name%_fence_post.json", + "%name%_fence_side.json", + "%name%_half_slab.json", + "%name%_inner_stairs.json", + "%name%_ladder.json", + "%name%_log.json", + "%name%_outer_stairs.json", + "%name%_planks.json", + "%name%_pressure_plate_down.json", + "%name%_pressure_plate_up.json", + "%name%_stairs.json", + "%name%_trapdoor.json", + "%name%_wall_gate_closed.json", + "%name%_wall_gate_open.json", + "barrel_%name%.json", + "barrel_%name%_open.json", + "bar_stool_%name%.json", + "chair_%name%.json", + "chair_%name%_top.json", + "crafting_table_%name%.json", + "empty_%name%.json", + "striped_bark_%name%.json", + "striped_log_%name%.json", + "taburet_%name%.json" + }; + + public static final String[] ITEMS = new String[] { + "%name%_bark.json", + "%name%_button.json", + "%name%_door.json", + "%name%_fence.json", + "%name%_gate.json", + "%name%_ladder.json", + "%name%_log.json", + "%name%_planks.json", + "%name%_plate.json", + "%name%_slab.json", + "%name%_stairs.json", + "%name%_trapdoor.json", + "barrel_%name%.json", + "bar_stool_%name%.json", + "chair_%name%.json", + "chest_%name%.json", + "crafting_table_%name%.json", + "sign_%name%.json", + "striped_bark_%name%.json", + "striped_log_%name%.json", + "taburet_%name%.json" + }; +} diff --git a/utilities/paulevs/wooden/ModelHelper.java b/utilities/paulevs/wooden/ModelHelper.java new file mode 100644 index 00000000..840d8819 --- /dev/null +++ b/utilities/paulevs/wooden/ModelHelper.java @@ -0,0 +1,93 @@ +package paulevs.wooden; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +public class ModelHelper { + public static void main(String[] args) throws IOException { + new ModelHelper("nether_sakura"); + } + + private ModelHelper(String name) throws IOException { + clearOutput(); + editBlockstates(name); + editBlocks(name); + editItems(name); + printStates(name); + } + + private void clearOutput() { + for (File file: new File("./output/blockstates").listFiles()) + file.delete(); + for (File file: new File("./output/models/block").listFiles()) + file.delete(); + for (File file: new File("./output/models/item").listFiles()) + file.delete(); + } + + private void editBlockstates(String name) throws IOException { + String string; + new File("./output/blockstates").mkdirs(); + for (String state: Helper.BLOCKSTATES) { + InputStream stream = Helper.class.getResourceAsStream("/blockstates/" + state); + BufferedReader br = new BufferedReader(new InputStreamReader(stream)); + BufferedWriter wr = new BufferedWriter(new FileWriter(new File("./output/blockstates/" + state.replace(Helper.MASK, name)))); + while ((string = br.readLine()) != null) wr.write(string.replace(Helper.MASK, name) + "\n"); + wr.close(); + br.close(); + } + } + + private void editBlocks(String name) throws IOException { + String string; + new File("./output/models/block").mkdirs(); + for (String block: Helper.BLOCKS) { + InputStream stream = Helper.class.getResourceAsStream("/block/" + block); + BufferedReader br = new BufferedReader(new InputStreamReader(stream)); + BufferedWriter wr = new BufferedWriter(new FileWriter(new File("./output/models/block/" + block.replace(Helper.MASK, name)))); + while ((string = br.readLine()) != null) wr.write(string.replace(Helper.MASK, name) + "\n"); + wr.close(); + br.close(); + } + } + + private void editItems(String name) throws IOException { + String string; + new File("./output/models/item").mkdirs(); + for (String item: Helper.ITEMS) { + InputStream stream = Helper.class.getResourceAsStream("/item/" + item); + BufferedReader br = new BufferedReader(new InputStreamReader(stream)); + BufferedWriter wr = new BufferedWriter(new FileWriter(new File("./output/models/item/" + item.replace(Helper.MASK, name)))); + while ((string = br.readLine()) != null) wr.write(string.replace(Helper.MASK, name) + "\n"); + wr.close(); + br.close(); + } + } + + private String capitalize(String str) { + String out = ""; + for (int i = 0; i < str.length(); i++) + { + if (i == 0 || str.charAt(i - 1) == ' ') + out += Character.toUpperCase(str.charAt(i)); + else + out += str.charAt(i); + } + return out; + } + + private void printStates(String name) { + for (String state: Helper.BLOCKSTATES) + { + String rname = state.replace(Helper.MASK, name); + String onlyName = rname.substring(0, rname.indexOf('.')); + String finName = name.replace('_', ' ') + " " + state.substring(0, state.indexOf('.')).replace(Helper.MASK, "").replace('_', ' ').trim(); + System.out.println("\"block.betternether." + onlyName + "\": \"" + capitalize(finName) + "\","); + } + } +} diff --git a/utility_res/block/%name%_bark.json b/utility_res/block/%name%_bark.json new file mode 100644 index 00000000..cceda3df --- /dev/null +++ b/utility_res/block/%name%_bark.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betternether:block/%name%_log_side" + } +} diff --git a/utility_res/block/%name%_button.json b/utility_res/block/%name%_button.json new file mode 100644 index 00000000..1b61ccc1 --- /dev/null +++ b/utility_res/block/%name%_button.json @@ -0,0 +1,6 @@ +{ + "parent": "block/button", + "textures": { + "texture": "betternether:block/%name%_planks" + } +} diff --git a/utility_res/block/%name%_button_inventory.json b/utility_res/block/%name%_button_inventory.json new file mode 100644 index 00000000..66c59d16 --- /dev/null +++ b/utility_res/block/%name%_button_inventory.json @@ -0,0 +1,6 @@ +{ + "parent": "block/button_inventory", + "textures": { + "texture": "betternether:block/%name%_planks" + } +} diff --git a/utility_res/block/%name%_button_pressed.json b/utility_res/block/%name%_button_pressed.json new file mode 100644 index 00000000..1e4a8b9b --- /dev/null +++ b/utility_res/block/%name%_button_pressed.json @@ -0,0 +1,6 @@ +{ + "parent": "block/button_pressed", + "textures": { + "texture": "betternether:block/%name%_planks" + } +} diff --git a/utility_res/block/%name%_door_bottom.json b/utility_res/block/%name%_door_bottom.json new file mode 100644 index 00000000..721931cd --- /dev/null +++ b/utility_res/block/%name%_door_bottom.json @@ -0,0 +1,7 @@ +{ + "parent": "block/door_bottom", + "textures": { + "bottom": "betternether:block/%name%_door_bottom", + "top": "betternether:block/%name%_door_bottom" + } +} diff --git a/utility_res/block/%name%_door_bottom_hinge.json b/utility_res/block/%name%_door_bottom_hinge.json new file mode 100644 index 00000000..59b865c1 --- /dev/null +++ b/utility_res/block/%name%_door_bottom_hinge.json @@ -0,0 +1,7 @@ +{ + "parent": "block/door_bottom_rh", + "textures": { + "bottom": "betternether:block/%name%_door_bottom", + "top": "betternether:block/%name%_door_bottom" + } +} diff --git a/utility_res/block/%name%_door_top.json b/utility_res/block/%name%_door_top.json new file mode 100644 index 00000000..c92e6798 --- /dev/null +++ b/utility_res/block/%name%_door_top.json @@ -0,0 +1,7 @@ +{ + "parent": "block/door_top", + "textures": { + "bottom": "betternether:block/%name%_door_top", + "top": "betternether:block/%name%_door_top" + } +} diff --git a/utility_res/block/%name%_door_top_hinge.json b/utility_res/block/%name%_door_top_hinge.json new file mode 100644 index 00000000..df2c68fd --- /dev/null +++ b/utility_res/block/%name%_door_top_hinge.json @@ -0,0 +1,7 @@ +{ + "parent": "block/door_top_rh", + "textures": { + "bottom": "betternether:block/%name%_door_top", + "top": "betternether:block/%name%_door_top" + } +} diff --git a/utility_res/block/%name%_fence_gate_closed.json b/utility_res/block/%name%_fence_gate_closed.json new file mode 100644 index 00000000..4526f463 --- /dev/null +++ b/utility_res/block/%name%_fence_gate_closed.json @@ -0,0 +1,6 @@ +{ + "parent": "block/template_fence_gate", + "textures": { + "texture": "betternether:block/%name%_planks" + } +} diff --git a/utility_res/block/%name%_fence_gate_open.json b/utility_res/block/%name%_fence_gate_open.json new file mode 100644 index 00000000..01f0103e --- /dev/null +++ b/utility_res/block/%name%_fence_gate_open.json @@ -0,0 +1,6 @@ +{ + "parent": "block/template_fence_gate_open", + "textures": { + "texture": "betternether:block/%name%_planks" + } +} diff --git a/utility_res/block/%name%_fence_inventory.json b/utility_res/block/%name%_fence_inventory.json new file mode 100644 index 00000000..222171d9 --- /dev/null +++ b/utility_res/block/%name%_fence_inventory.json @@ -0,0 +1,6 @@ +{ + "parent": "block/fence_inventory", + "textures": { + "texture": "betternether:block/%name%_planks" + } +} diff --git a/utility_res/block/%name%_fence_post.json b/utility_res/block/%name%_fence_post.json new file mode 100644 index 00000000..ec5ab1d7 --- /dev/null +++ b/utility_res/block/%name%_fence_post.json @@ -0,0 +1,6 @@ +{ + "parent": "block/fence_post", + "textures": { + "texture": "betternether:block/%name%_planks" + } +} diff --git a/utility_res/block/%name%_fence_side.json b/utility_res/block/%name%_fence_side.json new file mode 100644 index 00000000..c3d81744 --- /dev/null +++ b/utility_res/block/%name%_fence_side.json @@ -0,0 +1,6 @@ +{ + "parent": "block/fence_side", + "textures": { + "texture": "betternether:block/%name%_planks" + } +} diff --git a/utility_res/block/%name%_half_slab.json b/utility_res/block/%name%_half_slab.json new file mode 100644 index 00000000..eedbc534 --- /dev/null +++ b/utility_res/block/%name%_half_slab.json @@ -0,0 +1,8 @@ +{ + "parent": "block/slab", + "textures": { + "bottom": "betternether:block/%name%_planks", + "top": "betternether:block/%name%_planks", + "side": "betternether:block/%name%_planks" + } +} diff --git a/utility_res/block/%name%_inner_stairs.json b/utility_res/block/%name%_inner_stairs.json new file mode 100644 index 00000000..686edd99 --- /dev/null +++ b/utility_res/block/%name%_inner_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "block/inner_stairs", + "textures": { + "bottom": "betternether:block/%name%_planks", + "top": "betternether:block/%name%_planks", + "side": "betternether:block/%name%_planks" + } +} diff --git a/utility_res/block/%name%_ladder.json b/utility_res/block/%name%_ladder.json new file mode 100644 index 00000000..b1b1a149 --- /dev/null +++ b/utility_res/block/%name%_ladder.json @@ -0,0 +1,7 @@ +{ + "parent": "betternether:block/reeds_ladder", + "textures": { + "particle": "betternether:block/%name%_ladder", + "texture": "betternether:block/%name%_ladder" + } +} diff --git a/utility_res/block/%name%_log.json b/utility_res/block/%name%_log.json new file mode 100644 index 00000000..231f4f62 --- /dev/null +++ b/utility_res/block/%name%_log.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "particle": "betternether:block/%name%_log_side", + "down": "betternether:block/%name%_log_top", + "up": "betternether:block/%name%_log_top", + "north": "betternether:block/%name%_log_side", + "east": "betternether:block/%name%_log_side", + "south": "betternether:block/%name%_log_side", + "west": "betternether:block/%name%_log_side" + } +} \ No newline at end of file diff --git a/utility_res/block/%name%_outer_stairs.json b/utility_res/block/%name%_outer_stairs.json new file mode 100644 index 00000000..6a05a3ff --- /dev/null +++ b/utility_res/block/%name%_outer_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "block/outer_stairs", + "textures": { + "bottom": "betternether:block/%name%_planks", + "top": "betternether:block/%name%_planks", + "side": "betternether:block/%name%_planks" + } +} diff --git a/utility_res/block/%name%_planks.json b/utility_res/block/%name%_planks.json new file mode 100644 index 00000000..7732858e --- /dev/null +++ b/utility_res/block/%name%_planks.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betternether:block/%name%_planks" + } +} diff --git a/utility_res/block/%name%_pressure_plate_down.json b/utility_res/block/%name%_pressure_plate_down.json new file mode 100644 index 00000000..fad108c4 --- /dev/null +++ b/utility_res/block/%name%_pressure_plate_down.json @@ -0,0 +1,6 @@ +{ + "parent": "block/pressure_plate_down", + "textures": { + "texture": "betternether:block/%name%_planks" + } +} diff --git a/utility_res/block/%name%_pressure_plate_up.json b/utility_res/block/%name%_pressure_plate_up.json new file mode 100644 index 00000000..23f3869a --- /dev/null +++ b/utility_res/block/%name%_pressure_plate_up.json @@ -0,0 +1,6 @@ +{ + "parent": "block/pressure_plate_up", + "textures": { + "texture": "betternether:block/%name%_planks" + } +} diff --git a/utility_res/block/%name%_stairs.json b/utility_res/block/%name%_stairs.json new file mode 100644 index 00000000..42ec26ff --- /dev/null +++ b/utility_res/block/%name%_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "block/stairs", + "textures": { + "bottom": "betternether:block/%name%_planks", + "top": "betternether:block/%name%_planks", + "side": "betternether:block/%name%_planks" + } +} diff --git a/utility_res/block/%name%_trapdoor.json b/utility_res/block/%name%_trapdoor.json new file mode 100644 index 00000000..968a0140 --- /dev/null +++ b/utility_res/block/%name%_trapdoor.json @@ -0,0 +1,68 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "betternether:block/%name%_trapdoor", + "texture": "betternether:block/%name%_trapdoor", + "side": "betternether:block/%name%_planks" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 0, 0, 0 ], + "to": [ 2, 3, 16 ], + "faces": { + "down": { "uv": [ 0, 0, 2, 16 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 0, 0, 2, 16 ], "texture": "#texture" }, + "north": { "uv": [ 14, 12, 16, 15 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 0, 12, 2, 15 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 0, 12, 16, 15 ], "texture": "#side", "cullface": "west" }, + "east": { "uv": [ 0, 12, 16, 15 ], "texture": "#side" } + } + }, + { + "__comment": "Box1", + "from": [ 14, 0, 0 ], + "to": [ 16, 3, 16 ], + "faces": { + "down": { "uv": [ 14, 0, 16, 16 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 14, 0, 16, 16 ], "texture": "#texture" }, + "north": { "uv": [ 0, 12, 2, 15 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 14, 12, 16, 15 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 0, 12, 16, 15 ], "texture": "#side" }, + "east": { "uv": [ 0, 12, 16, 15 ], "texture": "#side", "cullface": "east" } + } + }, + { + "__comment": "Box1", + "from": [ 2, 0, 0 ], + "to": [ 14, 3, 2 ], + "faces": { + "down": { "uv": [ 2, 14, 14, 16 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 2, 0, 14, 2 ], "texture": "#texture" }, + "north": { "uv": [ 2, 12, 14, 15 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 2, 12, 14, 15 ], "texture": "#side" } + } + }, + { + "__comment": "Box1", + "from": [ 2, 0, 14 ], + "to": [ 14, 3, 16 ], + "faces": { + "down": { "uv": [ 2, 0, 14, 2 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 2, 14, 14, 16 ], "texture": "#texture" }, + "north": { "uv": [ 2, 12, 14, 15 ], "texture": "#side" }, + "south": { "uv": [ 2, 12, 14, 15 ], "texture": "#side", "cullface": "south" } + } + }, + { + "__comment": "Box1", + "from": [ 2, 1, 2 ], + "to": [ 14, 2, 14 ], + "faces": { + "down": { "uv": [ 2, 2, 14, 14 ], "texture": "#texture" }, + "up": { "uv": [ 2, 2, 14, 14 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/utility_res/block/%name%_wall_gate_closed.json b/utility_res/block/%name%_wall_gate_closed.json new file mode 100644 index 00000000..18491fdf --- /dev/null +++ b/utility_res/block/%name%_wall_gate_closed.json @@ -0,0 +1,6 @@ +{ + "parent": "block/template_fence_gate_wall", + "textures": { + "texture": "betternether:block/%name%_planks" + } +} diff --git a/utility_res/block/%name%_wall_gate_open.json b/utility_res/block/%name%_wall_gate_open.json new file mode 100644 index 00000000..7cf9d039 --- /dev/null +++ b/utility_res/block/%name%_wall_gate_open.json @@ -0,0 +1,6 @@ +{ + "parent": "block/template_fence_gate_wall_open", + "textures": { + "texture": "betternether:block/%name%_planks" + } +} diff --git a/utility_res/block/barrel_%name%.json b/utility_res/block/barrel_%name%.json new file mode 100644 index 00000000..a781d98f --- /dev/null +++ b/utility_res/block/barrel_%name%.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/cube_bottom_top", + "textures": { + "top": "betternether:block/barrel_%name%_top", + "bottom": "betternether:block/barrel_%name%_bottom", + "side": "betternether:block/barrel_%name%_side" + } +} \ No newline at end of file diff --git a/utility_res/block/barrel_%name%_open.json b/utility_res/block/barrel_%name%_open.json new file mode 100644 index 00000000..5fa6a8f1 --- /dev/null +++ b/utility_res/block/barrel_%name%_open.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/cube_bottom_top", + "textures": { + "top": "betternether:block/barrel_%name%_top_open", + "bottom": "betternether:block/barrel_%name%_bottom", + "side": "betternether:block/barrel_%name%_side" + } +} \ No newline at end of file diff --git a/utility_res/block/crafting_table_%name%.json b/utility_res/block/crafting_table_%name%.json new file mode 100644 index 00000000..aadad9c0 --- /dev/null +++ b/utility_res/block/crafting_table_%name%.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "particle": "betternether:block/crafting_table_%name%_front", + "north": "betternether:block/crafting_table_%name%_front", + "south": "betternether:block/crafting_table_%name%_side", + "east": "betternether:block/crafting_table_%name%_side", + "west": "betternether:block/crafting_table_%name%_front", + "up": "betternether:block/crafting_table_%name%_top", + "down": "betternether:block/crafting_table_%name%_bottom" + } +} \ No newline at end of file diff --git a/utility_res/block/striped_bark_%name%.json b/utility_res/block/striped_bark_%name%.json new file mode 100644 index 00000000..7de47feb --- /dev/null +++ b/utility_res/block/striped_bark_%name%.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betternether:block/striped_log_%name%_side" + } +} diff --git a/utility_res/block/striped_log_%name%.json b/utility_res/block/striped_log_%name%.json new file mode 100644 index 00000000..22e3ec7e --- /dev/null +++ b/utility_res/block/striped_log_%name%.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "particle": "betternether:block/striped_log_%name%_side", + "down": "betternether:block/striped_log_%name%_top", + "up": "betternether:block/striped_log_%name%_top", + "north": "betternether:block/striped_log_%name%_side", + "east": "betternether:block/striped_log_%name%_side", + "south": "betternether:block/striped_log_%name%_side", + "west": "betternether:block/striped_log_%name%_side" + } +} \ No newline at end of file diff --git a/utility_res/blockstates/%name%_bark.json b/utility_res/blockstates/%name%_bark.json new file mode 100644 index 00000000..8bb93936 --- /dev/null +++ b/utility_res/blockstates/%name%_bark.json @@ -0,0 +1,7 @@ +{ + "variants": { + "axis=y": { "model": "betternether:block/%name%_bark" }, + "axis=z": { "model": "betternether:block/%name%_bark", "x": 90 }, + "axis=x": { "model": "betternether:block/%name%_bark", "x": 90, "y": 90 } + } +} \ No newline at end of file diff --git a/utility_res/blockstates/%name%_button.json b/utility_res/blockstates/%name%_button.json new file mode 100644 index 00000000..88075756 --- /dev/null +++ b/utility_res/blockstates/%name%_button.json @@ -0,0 +1,28 @@ +{ + "variants": { + "face=floor,facing=east,powered=false": { "model": "betternether:block/%name%_button", "y": 90 }, + "face=floor,facing=west,powered=false": { "model": "betternether:block/%name%_button", "y": 270 }, + "face=floor,facing=south,powered=false": { "model": "betternether:block/%name%_button", "y": 180 }, + "face=floor,facing=north,powered=false": { "model": "betternether:block/%name%_button" }, + "face=wall,facing=east,powered=false": { "model": "betternether:block/%name%_button", "uvlock": true, "x": 90, "y": 90 }, + "face=wall,facing=west,powered=false": { "model": "betternether:block/%name%_button", "uvlock": true, "x": 90, "y": 270 }, + "face=wall,facing=south,powered=false": { "model": "betternether:block/%name%_button", "uvlock": true, "x": 90, "y": 180 }, + "face=wall,facing=north,powered=false": { "model": "betternether:block/%name%_button", "uvlock": true, "x": 90 }, + "face=ceiling,facing=east,powered=false": { "model": "betternether:block/%name%_button", "x": 180, "y": 270 }, + "face=ceiling,facing=west,powered=false": { "model": "betternether:block/%name%_button", "x": 180, "y": 90 }, + "face=ceiling,facing=south,powered=false": { "model": "betternether:block/%name%_button", "x": 180 }, + "face=ceiling,facing=north,powered=false": { "model": "betternether:block/%name%_button", "x": 180, "y": 180 }, + "face=floor,facing=east,powered=true": { "model": "betternether:block/%name%_button_pressed", "y": 90 }, + "face=floor,facing=west,powered=true": { "model": "betternether:block/%name%_button_pressed", "y": 270 }, + "face=floor,facing=south,powered=true": { "model": "betternether:block/%name%_button_pressed", "y": 180 }, + "face=floor,facing=north,powered=true": { "model": "betternether:block/%name%_button_pressed" }, + "face=wall,facing=east,powered=true": { "model": "betternether:block/%name%_button_pressed", "uvlock": true, "x": 90, "y": 90 }, + "face=wall,facing=west,powered=true": { "model": "betternether:block/%name%_button_pressed", "uvlock": true, "x": 90, "y": 270 }, + "face=wall,facing=south,powered=true": { "model": "betternether:block/%name%_button_pressed", "uvlock": true, "x": 90, "y": 180 }, + "face=wall,facing=north,powered=true": { "model": "betternether:block/%name%_button_pressed", "uvlock": true, "x": 90 }, + "face=ceiling,facing=east,powered=true": { "model": "betternether:block/%name%_button_pressed", "x": 180, "y": 270 }, + "face=ceiling,facing=west,powered=true": { "model": "betternether:block/%name%_button_pressed", "x": 180, "y": 90 }, + "face=ceiling,facing=south,powered=true": { "model": "betternether:block/%name%_button_pressed", "x": 180 }, + "face=ceiling,facing=north,powered=true": { "model": "betternether:block/%name%_button_pressed", "x": 180, "y": 180 } + } +} diff --git a/utility_res/blockstates/%name%_door.json b/utility_res/blockstates/%name%_door.json new file mode 100644 index 00000000..edbe21cb --- /dev/null +++ b/utility_res/blockstates/%name%_door.json @@ -0,0 +1,36 @@ +{ + "variants": { + "facing=east,half=lower,hinge=left,open=false": { "model": "betternether:block/%name%_door_bottom" }, + "facing=south,half=lower,hinge=left,open=false": { "model": "betternether:block/%name%_door_bottom", "y": 90 }, + "facing=west,half=lower,hinge=left,open=false": { "model": "betternether:block/%name%_door_bottom", "y": 180 }, + "facing=north,half=lower,hinge=left,open=false": { "model": "betternether:block/%name%_door_bottom", "y": 270 }, + "facing=east,half=lower,hinge=right,open=false": { "model": "betternether:block/%name%_door_bottom_hinge" }, + "facing=south,half=lower,hinge=right,open=false": { "model": "betternether:block/%name%_door_bottom_hinge", "y": 90 }, + "facing=west,half=lower,hinge=right,open=false": { "model": "betternether:block/%name%_door_bottom_hinge", "y": 180 }, + "facing=north,half=lower,hinge=right,open=false": { "model": "betternether:block/%name%_door_bottom_hinge", "y": 270 }, + "facing=east,half=lower,hinge=left,open=true": { "model": "betternether:block/%name%_door_bottom_hinge", "y": 90 }, + "facing=south,half=lower,hinge=left,open=true": { "model": "betternether:block/%name%_door_bottom_hinge", "y": 180 }, + "facing=west,half=lower,hinge=left,open=true": { "model": "betternether:block/%name%_door_bottom_hinge", "y": 270 }, + "facing=north,half=lower,hinge=left,open=true": { "model": "betternether:block/%name%_door_bottom_hinge" }, + "facing=east,half=lower,hinge=right,open=true": { "model": "betternether:block/%name%_door_bottom", "y": 270 }, + "facing=south,half=lower,hinge=right,open=true": { "model": "betternether:block/%name%_door_bottom" }, + "facing=west,half=lower,hinge=right,open=true": { "model": "betternether:block/%name%_door_bottom", "y": 90 }, + "facing=north,half=lower,hinge=right,open=true": { "model": "betternether:block/%name%_door_bottom", "y": 180 }, + "facing=east,half=upper,hinge=left,open=false": { "model": "betternether:block/%name%_door_top" }, + "facing=south,half=upper,hinge=left,open=false": { "model": "betternether:block/%name%_door_top", "y": 90 }, + "facing=west,half=upper,hinge=left,open=false": { "model": "betternether:block/%name%_door_top", "y": 180 }, + "facing=north,half=upper,hinge=left,open=false": { "model": "betternether:block/%name%_door_top", "y": 270 }, + "facing=east,half=upper,hinge=right,open=false": { "model": "betternether:block/%name%_door_top_hinge" }, + "facing=south,half=upper,hinge=right,open=false": { "model": "betternether:block/%name%_door_top_hinge", "y": 90 }, + "facing=west,half=upper,hinge=right,open=false": { "model": "betternether:block/%name%_door_top_hinge", "y": 180 }, + "facing=north,half=upper,hinge=right,open=false": { "model": "betternether:block/%name%_door_top_hinge", "y": 270 }, + "facing=east,half=upper,hinge=left,open=true": { "model": "betternether:block/%name%_door_top_hinge", "y": 90 }, + "facing=south,half=upper,hinge=left,open=true": { "model": "betternether:block/%name%_door_top_hinge", "y": 180 }, + "facing=west,half=upper,hinge=left,open=true": { "model": "betternether:block/%name%_door_top_hinge", "y": 270 }, + "facing=north,half=upper,hinge=left,open=true": { "model": "betternether:block/%name%_door_top_hinge" }, + "facing=east,half=upper,hinge=right,open=true": { "model": "betternether:block/%name%_door_top", "y": 270 }, + "facing=south,half=upper,hinge=right,open=true": { "model": "betternether:block/%name%_door_top" }, + "facing=west,half=upper,hinge=right,open=true": { "model": "betternether:block/%name%_door_top", "y": 90 }, + "facing=north,half=upper,hinge=right,open=true": { "model": "betternether:block/%name%_door_top", "y": 180 } + } +} diff --git a/utility_res/blockstates/%name%_fence.json b/utility_res/blockstates/%name%_fence.json new file mode 100644 index 00000000..65f79820 --- /dev/null +++ b/utility_res/blockstates/%name%_fence.json @@ -0,0 +1,17 @@ +{ + "multipart": [ + { "apply": { "model": "betternether:block/%name%_fence_post" }}, + { "when": { "north": true }, + "apply": { "model": "betternether:block/%name%_fence_side", "uvlock": true } + }, + { "when": { "east": true }, + "apply": { "model": "betternether:block/%name%_fence_side", "y": 90, "uvlock": true } + }, + { "when": { "south": true }, + "apply": { "model": "betternether:block/%name%_fence_side", "y": 180, "uvlock": true } + }, + { "when": { "west": true }, + "apply": { "model": "betternether:block/%name%_fence_side", "y": 270, "uvlock": true } + } + ] +} diff --git a/utility_res/blockstates/%name%_gate.json b/utility_res/blockstates/%name%_gate.json new file mode 100644 index 00000000..dc4b5f19 --- /dev/null +++ b/utility_res/blockstates/%name%_gate.json @@ -0,0 +1,20 @@ +{ + "variants": { + "facing=south,in_wall=false,open=false": { "model": "betternether:block/%name%_fence_gate_closed", "uvlock": true }, + "facing=west,in_wall=false,open=false": { "model": "betternether:block/%name%_fence_gate_closed", "uvlock": true, "y": 90 }, + "facing=north,in_wall=false,open=false": { "model": "betternether:block/%name%_fence_gate_closed", "uvlock": true, "y": 180 }, + "facing=east,in_wall=false,open=false": { "model": "betternether:block/%name%_fence_gate_closed", "uvlock": true, "y": 270 }, + "facing=south,in_wall=false,open=true": { "model": "betternether:block/%name%_fence_gate_open", "uvlock": true }, + "facing=west,in_wall=false,open=true": { "model": "betternether:block/%name%_fence_gate_open", "uvlock": true, "y": 90 }, + "facing=north,in_wall=false,open=true": { "model": "betternether:block/%name%_fence_gate_open", "uvlock": true, "y": 180 }, + "facing=east,in_wall=false,open=true": { "model": "betternether:block/%name%_fence_gate_open", "uvlock": true, "y": 270 }, + "facing=south,in_wall=true,open=false": { "model": "betternether:block/%name%_wall_gate_closed", "uvlock": true }, + "facing=west,in_wall=true,open=false": { "model": "betternether:block/%name%_wall_gate_closed", "uvlock": true, "y": 90 }, + "facing=north,in_wall=true,open=false": { "model": "betternether:block/%name%_wall_gate_closed", "uvlock": true, "y": 180 }, + "facing=east,in_wall=true,open=false": { "model": "betternether:block/%name%_wall_gate_closed", "uvlock": true, "y": 270 }, + "facing=south,in_wall=true,open=true": { "model": "betternether:block/%name%_wall_gate_open", "uvlock": true }, + "facing=west,in_wall=true,open=true": { "model": "betternether:block/%name%_wall_gate_open", "uvlock": true, "y": 90 }, + "facing=north,in_wall=true,open=true": { "model": "betternether:block/%name%_wall_gate_open", "uvlock": true, "y": 180 }, + "facing=east,in_wall=true,open=true": { "model": "betternether:block/%name%_wall_gate_open", "uvlock": true, "y": 270 } + } +} diff --git a/utility_res/blockstates/%name%_ladder.json b/utility_res/blockstates/%name%_ladder.json new file mode 100644 index 00000000..a0bf640c --- /dev/null +++ b/utility_res/blockstates/%name%_ladder.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "betternether:block/%name%_ladder" }, + "facing=east": { "model": "betternether:block/%name%_ladder", "y": 90 }, + "facing=south": { "model": "betternether:block/%name%_ladder", "y": 180 }, + "facing=west": { "model": "betternether:block/%name%_ladder", "y": 270 } + } +} diff --git a/utility_res/blockstates/%name%_log.json b/utility_res/blockstates/%name%_log.json new file mode 100644 index 00000000..e1aafe3c --- /dev/null +++ b/utility_res/blockstates/%name%_log.json @@ -0,0 +1,7 @@ +{ + "variants": { + "axis=y": { "model": "betternether:block/%name%_log" }, + "axis=z": { "model": "betternether:block/%name%_log", "x": 90 }, + "axis=x": { "model": "betternether:block/%name%_log", "x": 90, "y": 90 } + } +} diff --git a/utility_res/blockstates/%name%_planks.json b/utility_res/blockstates/%name%_planks.json new file mode 100644 index 00000000..bfbea749 --- /dev/null +++ b/utility_res/blockstates/%name%_planks.json @@ -0,0 +1,6 @@ +{ + "variants": + { + "": { "model": "betternether:block/%name%_planks" } + } +} \ No newline at end of file diff --git a/utility_res/blockstates/%name%_plate.json b/utility_res/blockstates/%name%_plate.json new file mode 100644 index 00000000..98d2250a --- /dev/null +++ b/utility_res/blockstates/%name%_plate.json @@ -0,0 +1,6 @@ +{ + "variants": { + "powered=false": { "model": "betternether:block/%name%_pressure_plate_up" }, + "powered=true": { "model": "betternether:block/%name%_pressure_plate_down" } + } +} diff --git a/utility_res/blockstates/%name%_slab.json b/utility_res/blockstates/%name%_slab.json new file mode 100644 index 00000000..f4733314 --- /dev/null +++ b/utility_res/blockstates/%name%_slab.json @@ -0,0 +1,8 @@ +{ + "variants": + { + "type=bottom": { "model": "betternether:block/%name%_half_slab" }, + "type=top": { "model": "betternether:block/%name%_half_slab", "x": 180, "uvlock": true }, + "type=double": { "model": "betternether:block/%name%_planks" } + } +} diff --git a/utility_res/blockstates/%name%_stairs.json b/utility_res/blockstates/%name%_stairs.json new file mode 100644 index 00000000..75b6ab9e --- /dev/null +++ b/utility_res/blockstates/%name%_stairs.json @@ -0,0 +1,44 @@ +{ + "variants": { + "facing=east,half=bottom,shape=straight": { "model": "betternether:block/%name%_stairs" }, + "facing=west,half=bottom,shape=straight": { "model": "betternether:block/%name%_stairs", "y": 180, "uvlock": true }, + "facing=south,half=bottom,shape=straight": { "model": "betternether:block/%name%_stairs", "y": 90, "uvlock": true }, + "facing=north,half=bottom,shape=straight": { "model": "betternether:block/%name%_stairs", "y": 270, "uvlock": true }, + "facing=east,half=bottom,shape=outer_right": { "model": "betternether:block/%name%_outer_stairs" }, + "facing=west,half=bottom,shape=outer_right": { "model": "betternether:block/%name%_outer_stairs", "y": 180, "uvlock": true }, + "facing=south,half=bottom,shape=outer_right": { "model": "betternether:block/%name%_outer_stairs", "y": 90, "uvlock": true }, + "facing=north,half=bottom,shape=outer_right": { "model": "betternether:block/%name%_outer_stairs", "y": 270, "uvlock": true }, + "facing=east,half=bottom,shape=outer_left": { "model": "betternether:block/%name%_outer_stairs", "y": 270, "uvlock": true }, + "facing=west,half=bottom,shape=outer_left": { "model": "betternether:block/%name%_outer_stairs", "y": 90, "uvlock": true }, + "facing=south,half=bottom,shape=outer_left": { "model": "betternether:block/%name%_outer_stairs" }, + "facing=north,half=bottom,shape=outer_left": { "model": "betternether:block/%name%_outer_stairs", "y": 180, "uvlock": true }, + "facing=east,half=bottom,shape=inner_right": { "model": "betternether:block/%name%_inner_stairs" }, + "facing=west,half=bottom,shape=inner_right": { "model": "betternether:block/%name%_inner_stairs", "y": 180, "uvlock": true }, + "facing=south,half=bottom,shape=inner_right": { "model": "betternether:block/%name%_inner_stairs", "y": 90, "uvlock": true }, + "facing=north,half=bottom,shape=inner_right": { "model": "betternether:block/%name%_inner_stairs", "y": 270, "uvlock": true }, + "facing=east,half=bottom,shape=inner_left": { "model": "betternether:block/%name%_inner_stairs", "y": 270, "uvlock": true }, + "facing=west,half=bottom,shape=inner_left": { "model": "betternether:block/%name%_inner_stairs", "y": 90, "uvlock": true }, + "facing=south,half=bottom,shape=inner_left": { "model": "betternether:block/%name%_inner_stairs" }, + "facing=north,half=bottom,shape=inner_left": { "model": "betternether:block/%name%_inner_stairs", "y": 180, "uvlock": true }, + "facing=east,half=top,shape=straight": { "model": "betternether:block/%name%_stairs", "x": 180, "uvlock": true }, + "facing=west,half=top,shape=straight": { "model": "betternether:block/%name%_stairs", "x": 180, "y": 180, "uvlock": true }, + "facing=south,half=top,shape=straight": { "model": "betternether:block/%name%_stairs", "x": 180, "y": 90, "uvlock": true }, + "facing=north,half=top,shape=straight": { "model": "betternether:block/%name%_stairs", "x": 180, "y": 270, "uvlock": true }, + "facing=east,half=top,shape=outer_right": { "model": "betternether:block/%name%_outer_stairs", "x": 180, "y": 90, "uvlock": true }, + "facing=west,half=top,shape=outer_right": { "model": "betternether:block/%name%_outer_stairs", "x": 180, "y": 270, "uvlock": true }, + "facing=south,half=top,shape=outer_right": { "model": "betternether:block/%name%_outer_stairs", "x": 180, "y": 180, "uvlock": true }, + "facing=north,half=top,shape=outer_right": { "model": "betternether:block/%name%_outer_stairs", "x": 180, "uvlock": true }, + "facing=east,half=top,shape=outer_left": { "model": "betternether:block/%name%_outer_stairs", "x": 180, "uvlock": true }, + "facing=west,half=top,shape=outer_left": { "model": "betternether:block/%name%_outer_stairs", "x": 180, "y": 180, "uvlock": true }, + "facing=south,half=top,shape=outer_left": { "model": "betternether:block/%name%_outer_stairs", "x": 180, "y": 90, "uvlock": true }, + "facing=north,half=top,shape=outer_left": { "model": "betternether:block/%name%_outer_stairs", "x": 180, "y": 270, "uvlock": true }, + "facing=east,half=top,shape=inner_right": { "model": "betternether:block/%name%_inner_stairs", "x": 180, "y": 90, "uvlock": true }, + "facing=west,half=top,shape=inner_right": { "model": "betternether:block/%name%_inner_stairs", "x": 180, "y": 270, "uvlock": true }, + "facing=south,half=top,shape=inner_right": { "model": "betternether:block/%name%_inner_stairs", "x": 180, "y": 180, "uvlock": true }, + "facing=north,half=top,shape=inner_right": { "model": "betternether:block/%name%_inner_stairs", "x": 180, "uvlock": true }, + "facing=east,half=top,shape=inner_left": { "model": "betternether:block/%name%_inner_stairs", "x": 180, "uvlock": true }, + "facing=west,half=top,shape=inner_left": { "model": "betternether:block/%name%_inner_stairs", "x": 180, "y": 180, "uvlock": true }, + "facing=south,half=top,shape=inner_left": { "model": "betternether:block/%name%_inner_stairs", "x": 180, "y": 90, "uvlock": true }, + "facing=north,half=top,shape=inner_left": { "model": "betternether:block/%name%_inner_stairs", "x": 180, "y": 270, "uvlock": true } + } +} diff --git a/utility_res/blockstates/%name%_trapdoor.json b/utility_res/blockstates/%name%_trapdoor.json new file mode 100644 index 00000000..802d7d5e --- /dev/null +++ b/utility_res/blockstates/%name%_trapdoor.json @@ -0,0 +1,20 @@ +{ + "variants": { + "facing=north,half=bottom,open=false": { "model": "betternether:block/%name%_trapdoor" }, + "facing=south,half=bottom,open=false": { "model": "betternether:block/%name%_trapdoor", "y": 180 }, + "facing=east,half=bottom,open=false": { "model": "betternether:block/%name%_trapdoor", "y": 90 }, + "facing=west,half=bottom,open=false": { "model": "betternether:block/%name%_trapdoor", "y": 270 }, + "facing=north,half=top,open=false": { "model": "betternether:block/%name%_trapdoor", "x": 180 }, + "facing=south,half=top,open=false": { "model": "betternether:block/%name%_trapdoor", "x": 180, "y": 180 }, + "facing=east,half=top,open=false": { "model": "betternether:block/%name%_trapdoor", "x": 180, "y": 90 }, + "facing=west,half=top,open=false": { "model": "betternether:block/%name%_trapdoor", "x": 180, "y": 270 }, + "facing=north,half=bottom,open=true": { "model": "betternether:block/%name%_trapdoor", "x": 90 }, + "facing=south,half=bottom,open=true": { "model": "betternether:block/%name%_trapdoor", "x": 90, "y": 180 }, + "facing=east,half=bottom,open=true": { "model": "betternether:block/%name%_trapdoor", "x": 90, "y": 90 }, + "facing=west,half=bottom,open=true": { "model": "betternether:block/%name%_trapdoor", "x": 90, "y": 270 }, + "facing=north,half=top,open=true": { "model": "betternether:block/%name%_trapdoor", "x": 270, "y": 180 }, + "facing=south,half=top,open=true": { "model": "betternether:block/%name%_trapdoor", "x": 270, "y": 0 }, + "facing=east,half=top,open=true": { "model": "betternether:block/%name%_trapdoor", "x": 270, "y": 270 }, + "facing=west,half=top,open=true": { "model": "betternether:block/%name%_trapdoor", "x": 270, "y": 90 } + } +} diff --git a/utility_res/blockstates/bar_stool_%name%.json b/utility_res/blockstates/bar_stool_%name%.json new file mode 100644 index 00000000..9d2ed3fd --- /dev/null +++ b/utility_res/blockstates/bar_stool_%name%.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=east": { "model": "betternether:block/bar_stool_%name%" }, + "facing=west": { "model": "betternether:block/bar_stool_%name%", "y": 180 }, + "facing=south": { "model": "betternether:block/bar_stool_%name%", "y": 90 }, + "facing=north": { "model": "betternether:block/bar_stool_%name%", "y": 270 } + } +} diff --git a/utility_res/blockstates/barrel_%name%.json b/utility_res/blockstates/barrel_%name%.json new file mode 100644 index 00000000..6b998642 --- /dev/null +++ b/utility_res/blockstates/barrel_%name%.json @@ -0,0 +1,56 @@ +{ + "variants": { + "facing=down,open=false": { + "x": 180, + "model": "betternether:block/barrel_%name%" + }, + "facing=down,open=true": { + "x": 180, + "model": "betternether:block/barrel_%name%_open" + }, + "facing=east,open=false": { + "x": 90, + "y": 90, + "model": "betternether:block/barrel_%name%" + }, + "facing=east,open=true": { + "x": 90, + "y": 90, + "model": "betternether:block/barrel_%name%_open" + }, + "facing=north,open=false": { + "x": 90, + "model": "betternether:block/barrel_%name%" + }, + "facing=north,open=true": { + "x": 90, + "model": "betternether:block/barrel_%name%_open" + }, + "facing=south,open=false": { + "x": 90, + "y": 180, + "model": "betternether:block/barrel_%name%" + }, + "facing=south,open=true": { + "x": 90, + "y": 180, + "model": "betternether:block/barrel_%name%_open" + }, + "facing=up,open=false": { + "model": "betternether:block/barrel_%name%" + }, + "facing=up,open=true": { + "model": "betternether:block/barrel_%name%_open" + }, + "facing=west,open=false": { + "x": 90, + "y": 270, + "model": "betternether:block/barrel_%name%" + }, + "facing=west,open=true": { + "x": 90, + "y": 270, + "model": "betternether:block/barrel_%name%_open" + } + } +} \ No newline at end of file diff --git a/utility_res/blockstates/chair_%name%.json b/utility_res/blockstates/chair_%name%.json new file mode 100644 index 00000000..5967351d --- /dev/null +++ b/utility_res/blockstates/chair_%name%.json @@ -0,0 +1,9 @@ +{ + "variants": { + "facing=east,top=false": { "model": "betternether:block/chair_%name%", "y": 90 }, + "facing=west,top=false": { "model": "betternether:block/chair_%name%", "y": 270 }, + "facing=south,top=false": { "model": "betternether:block/chair_%name%", "y": 180 }, + "facing=north,top=false": { "model": "betternether:block/chair_%name%" }, + "top=true": { "model": "betternether:block/chair_%name%_top" } + } +} diff --git a/utility_res/blockstates/chest_%name%.json b/utility_res/blockstates/chest_%name%.json new file mode 100644 index 00000000..0b6cf624 --- /dev/null +++ b/utility_res/blockstates/chest_%name%.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "betternether:block/empty_%name%" + } + } +} \ No newline at end of file diff --git a/utility_res/blockstates/crafting_table_%name%.json b/utility_res/blockstates/crafting_table_%name%.json new file mode 100644 index 00000000..39b13fe5 --- /dev/null +++ b/utility_res/blockstates/crafting_table_%name%.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "betternether:block/crafting_table_%name%" + } + } +} \ No newline at end of file diff --git a/utility_res/blockstates/sign_%name%.json b/utility_res/blockstates/sign_%name%.json new file mode 100644 index 00000000..1569accd --- /dev/null +++ b/utility_res/blockstates/sign_%name%.json @@ -0,0 +1,5 @@ +{ + "variants": { + "": { "model": "betternether:block/empty_%name%" } + } +} \ No newline at end of file diff --git a/utility_res/blockstates/striped_bark_%name%.json b/utility_res/blockstates/striped_bark_%name%.json new file mode 100644 index 00000000..8891ea19 --- /dev/null +++ b/utility_res/blockstates/striped_bark_%name%.json @@ -0,0 +1,7 @@ +{ + "variants": { + "axis=y": { "model": "betternether:block/striped_bark_%name%" }, + "axis=z": { "model": "betternether:block/striped_bark_%name%", "x": 90 }, + "axis=x": { "model": "betternether:block/striped_bark_%name%", "x": 90, "y": 90 } + } +} \ No newline at end of file diff --git a/utility_res/blockstates/striped_log_%name%.json b/utility_res/blockstates/striped_log_%name%.json new file mode 100644 index 00000000..9fb75d59 --- /dev/null +++ b/utility_res/blockstates/striped_log_%name%.json @@ -0,0 +1,7 @@ +{ + "variants": { + "axis=y": { "model": "betternether:block/striped_log_%name%" }, + "axis=z": { "model": "betternether:block/striped_log_%name%", "x": 90 }, + "axis=x": { "model": "betternether:block/striped_log_%name%", "x": 90, "y": 90 } + } +} diff --git a/utility_res/blockstates/taburet_%name%.json b/utility_res/blockstates/taburet_%name%.json new file mode 100644 index 00000000..f3220b2c --- /dev/null +++ b/utility_res/blockstates/taburet_%name%.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=east": { "model": "betternether:block/taburet_%name%" }, + "facing=west": { "model": "betternether:block/taburet_%name%", "y": 180 }, + "facing=south": { "model": "betternether:block/taburet_%name%", "y": 90 }, + "facing=north": { "model": "betternether:block/taburet_%name%", "y": 270 } + } +} diff --git a/utility_res/item/%name%_bark.json b/utility_res/item/%name%_bark.json new file mode 100644 index 00000000..0356b8a0 --- /dev/null +++ b/utility_res/item/%name%_bark.json @@ -0,0 +1,3 @@ +{ + "parent": "betternether:block/%name%_bark" +} diff --git a/utility_res/item/%name%_button.json b/utility_res/item/%name%_button.json new file mode 100644 index 00000000..76497cd1 --- /dev/null +++ b/utility_res/item/%name%_button.json @@ -0,0 +1,3 @@ +{ + "parent": "betternether:block/%name%_button_inventory" +} diff --git a/utility_res/item/%name%_door.json b/utility_res/item/%name%_door.json new file mode 100644 index 00000000..c912ffb8 --- /dev/null +++ b/utility_res/item/%name%_door.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betternether:item/%name%_door" + } +} diff --git a/utility_res/item/%name%_fence.json b/utility_res/item/%name%_fence.json new file mode 100644 index 00000000..ebb987f7 --- /dev/null +++ b/utility_res/item/%name%_fence.json @@ -0,0 +1,3 @@ +{ + "parent": "betternether:block/%name%_fence_inventory" +} diff --git a/utility_res/item/%name%_gate.json b/utility_res/item/%name%_gate.json new file mode 100644 index 00000000..9a4dcf38 --- /dev/null +++ b/utility_res/item/%name%_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "betternether:block/%name%_fence_gate_closed" +} diff --git a/utility_res/item/%name%_ladder.json b/utility_res/item/%name%_ladder.json new file mode 100644 index 00000000..4f9a06b5 --- /dev/null +++ b/utility_res/item/%name%_ladder.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betternether:block/%name%_ladder" + } +} diff --git a/utility_res/item/%name%_log.json b/utility_res/item/%name%_log.json new file mode 100644 index 00000000..280c3020 --- /dev/null +++ b/utility_res/item/%name%_log.json @@ -0,0 +1,3 @@ +{ + "parent": "betternether:block/%name%_log" +} diff --git a/utility_res/item/%name%_planks.json b/utility_res/item/%name%_planks.json new file mode 100644 index 00000000..16ce9447 --- /dev/null +++ b/utility_res/item/%name%_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "betternether:block/%name%_planks" +} diff --git a/utility_res/item/%name%_plate.json b/utility_res/item/%name%_plate.json new file mode 100644 index 00000000..f1204af4 --- /dev/null +++ b/utility_res/item/%name%_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "betternether:block/%name%_pressure_plate_up" +} diff --git a/utility_res/item/%name%_slab.json b/utility_res/item/%name%_slab.json new file mode 100644 index 00000000..0583c080 --- /dev/null +++ b/utility_res/item/%name%_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "betternether:block/%name%_half_slab" +} diff --git a/utility_res/item/%name%_stairs.json b/utility_res/item/%name%_stairs.json new file mode 100644 index 00000000..00b8e822 --- /dev/null +++ b/utility_res/item/%name%_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "betternether:block/%name%_stairs" +} diff --git a/utility_res/item/%name%_trapdoor.json b/utility_res/item/%name%_trapdoor.json new file mode 100644 index 00000000..c321933a --- /dev/null +++ b/utility_res/item/%name%_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "betternether:block/%name%_trapdoor" +} diff --git a/utility_res/item/bar_stool_%name%.json b/utility_res/item/bar_stool_%name%.json new file mode 100644 index 00000000..b2eba944 --- /dev/null +++ b/utility_res/item/bar_stool_%name%.json @@ -0,0 +1,3 @@ +{ + "parent": "betternether:block/bar_stool_%name%" +} \ No newline at end of file diff --git a/utility_res/item/barrel_%name%.json b/utility_res/item/barrel_%name%.json new file mode 100644 index 00000000..8bbfcac6 --- /dev/null +++ b/utility_res/item/barrel_%name%.json @@ -0,0 +1,3 @@ +{ + "parent": "betternether:block/barrel_%name%" +} \ No newline at end of file diff --git a/utility_res/item/chair_%name%.json b/utility_res/item/chair_%name%.json new file mode 100644 index 00000000..ba93346b --- /dev/null +++ b/utility_res/item/chair_%name%.json @@ -0,0 +1,15 @@ +{ + "parent": "betternether:block/chair_%name%", + "display": { + "gui": { + "rotation": [ 30, 45, 0 ], + "translation": [ 0, -1.4, 0], + "scale":[ 0.625, 0.625, 0.625 ] + }, + "fixed": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 0, 0 ], + "scale": [ 0.5, 0.5, 0.5 ] + } + } +} \ No newline at end of file diff --git a/utility_res/item/chest_%name%.json b/utility_res/item/chest_%name%.json new file mode 100644 index 00000000..ff1ca460 --- /dev/null +++ b/utility_res/item/chest_%name%.json @@ -0,0 +1,6 @@ +{ + "parent": "betternether:block/chest_item", + "textures": { + "texture": "betternether:entity/chest/chest_%name%" + } +} diff --git a/utility_res/item/crafting_table_%name%.json b/utility_res/item/crafting_table_%name%.json new file mode 100644 index 00000000..3c1be142 --- /dev/null +++ b/utility_res/item/crafting_table_%name%.json @@ -0,0 +1,3 @@ +{ + "parent": "betternether:block/crafting_table_%name%" +} diff --git a/utility_res/item/sign_%name%.json b/utility_res/item/sign_%name%.json new file mode 100644 index 00000000..1eeb38df --- /dev/null +++ b/utility_res/item/sign_%name%.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "betternether:item/sign_%name%" + } +} diff --git a/utility_res/item/striped_bark_%name%.json b/utility_res/item/striped_bark_%name%.json new file mode 100644 index 00000000..ebb186a2 --- /dev/null +++ b/utility_res/item/striped_bark_%name%.json @@ -0,0 +1,3 @@ +{ + "parent": "betternether:block/striped_bark_%name%" +} diff --git a/utility_res/item/striped_log_%name%.json b/utility_res/item/striped_log_%name%.json new file mode 100644 index 00000000..453297e9 --- /dev/null +++ b/utility_res/item/striped_log_%name%.json @@ -0,0 +1,3 @@ +{ + "parent": "betternether:block/striped_log_%name%" +} diff --git a/utility_res/item/taburet_%name%.json b/utility_res/item/taburet_%name%.json new file mode 100644 index 00000000..397339e7 --- /dev/null +++ b/utility_res/item/taburet_%name%.json @@ -0,0 +1,3 @@ +{ + "parent": "betternether:block/taburet_%name%" +} \ No newline at end of file