More merging logic + 11 new block + Fix server / client sync #23
@ -9,7 +9,7 @@ loader_version=0.15.11
|
|||||||
|
|
||||||
# Mod Properties
|
# Mod Properties
|
||||||
modrinth_id = jCpoCBpn
|
modrinth_id = jCpoCBpn
|
||||||
mod_version = 1.6.4
|
mod_version = 1.6.5
|
||||||
maven_group = fr.adrien1106
|
maven_group = fr.adrien1106
|
||||||
archives_base_name = ReFramed
|
archives_base_name = ReFramed
|
||||||
mod_id = reframed
|
mod_id = reframed
|
||||||
|
@ -7,7 +7,6 @@ import fr.adrien1106.reframed.item.ReFramedBlueprintWrittenItem;
|
|||||||
import fr.adrien1106.reframed.item.ReFramedScrewdriverItem;
|
import fr.adrien1106.reframed.item.ReFramedScrewdriverItem;
|
||||||
import net.fabricmc.api.ModInitializer;
|
import net.fabricmc.api.ModInitializer;
|
||||||
import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup;
|
import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup;
|
||||||
import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder;
|
|
||||||
import net.minecraft.block.AbstractBlock;
|
import net.minecraft.block.AbstractBlock;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.Blocks;
|
import net.minecraft.block.Blocks;
|
||||||
@ -37,14 +36,15 @@ public class ReFramed implements ModInitializer {
|
|||||||
public static final String MODID = "reframed";
|
public static final String MODID = "reframed";
|
||||||
|
|
||||||
public static final ArrayList<Block> BLOCKS = new ArrayList<>();
|
public static final ArrayList<Block> BLOCKS = new ArrayList<>();
|
||||||
public static Block
|
public static ReFramedBlock
|
||||||
CUBE,
|
CUBE,
|
||||||
SMALL_CUBE, SMALL_CUBES_STEP,
|
SMALL_CUBE, SMALL_CUBES_STEP,
|
||||||
STAIR, STAIRS_CUBE,
|
STAIR, STAIRS_CUBE,
|
||||||
HALF_STAIR, HALF_STAIRS_SLAB, HALF_STAIRS_STAIR,
|
HALF_STAIR, HALF_STAIRS_SLAB, HALF_STAIRS_STAIR, HALF_STAIRS_CUBE_STAIR, HALF_STAIRS_STEP_STAIR,
|
||||||
SLAB, SLABS_CUBE, SLABS_STAIR,
|
SLAB, SLABS_CUBE, SLABS_STAIR, SLABS_OUTER_STAIR, SLABS_INNER_STAIR, SLABS_HALF_LAYER,
|
||||||
STEP, STEPS_SLAB,
|
HALF_SLAB, HALF_SLABS_SLAB,
|
||||||
LAYER,
|
STEP, STEPS_SLAB, STEPS_CROSS, STEPS_HALF_LAYER,
|
||||||
|
LAYER, HALF_LAYER,
|
||||||
PILLAR, PILLARS_WALL, WALL,
|
PILLAR, PILLARS_WALL, WALL,
|
||||||
PANE, TRAPDOOR, DOOR,
|
PANE, TRAPDOOR, DOOR,
|
||||||
BUTTON,
|
BUTTON,
|
||||||
@ -70,12 +70,22 @@ public class ReFramed implements ModInitializer {
|
|||||||
HALF_STAIR = registerBlock("half_stair" , new ReFramedHalfStairBlock(cp(Blocks.OAK_STAIRS)));
|
HALF_STAIR = registerBlock("half_stair" , new ReFramedHalfStairBlock(cp(Blocks.OAK_STAIRS)));
|
||||||
HALF_STAIRS_SLAB = registerBlock("half_stairs_slab" , new ReFramedHalfStairsSlabBlock(cp(Blocks.OAK_STAIRS)));
|
HALF_STAIRS_SLAB = registerBlock("half_stairs_slab" , new ReFramedHalfStairsSlabBlock(cp(Blocks.OAK_STAIRS)));
|
||||||
HALF_STAIRS_STAIR = registerBlock("half_stairs_stair" , new ReFramedHalfStairsStairBlock(cp(Blocks.OAK_STAIRS)));
|
HALF_STAIRS_STAIR = registerBlock("half_stairs_stair" , new ReFramedHalfStairsStairBlock(cp(Blocks.OAK_STAIRS)));
|
||||||
|
HALF_STAIRS_CUBE_STAIR = registerBlock("half_stairs_cube_stair" , new ReFramedHalfStairsCubeStairBlock(cp(Blocks.OAK_STAIRS)));
|
||||||
|
HALF_STAIRS_STEP_STAIR = registerBlock("half_stairs_step_stair" , new ReFramedHalfStairsStepStairBlock(cp(Blocks.OAK_STAIRS)));
|
||||||
LAYER = registerBlock("layer" , new ReFramedLayerBlock(cp(Blocks.OAK_SLAB)));
|
LAYER = registerBlock("layer" , new ReFramedLayerBlock(cp(Blocks.OAK_SLAB)));
|
||||||
|
HALF_LAYER = registerBlock("half_layer" , new ReFramedHalfLayerBlock(cp(Blocks.OAK_SLAB)));
|
||||||
SLAB = registerBlock("slab" , new ReFramedSlabBlock(cp(Blocks.OAK_SLAB)));
|
SLAB = registerBlock("slab" , new ReFramedSlabBlock(cp(Blocks.OAK_SLAB)));
|
||||||
SLABS_CUBE = registerBlock("slabs_cube" , new ReFramedSlabsCubeBlock(cp(Blocks.OAK_SLAB)));
|
SLABS_CUBE = registerBlock("slabs_cube" , new ReFramedSlabsCubeBlock(cp(Blocks.OAK_SLAB)));
|
||||||
SLABS_STAIR = registerBlock("slabs_stair" , new ReFramedSlabsStairBlock(cp(Blocks.OAK_STAIRS)));
|
SLABS_STAIR = registerBlock("slabs_stair" , new ReFramedSlabsStairBlock(cp(Blocks.OAK_STAIRS)));
|
||||||
|
SLABS_OUTER_STAIR = registerBlock("slabs_outer_stair" , new ReFramedSlabsOuterStairBlock(cp(Blocks.OAK_STAIRS)));
|
||||||
|
SLABS_INNER_STAIR = registerBlock("slabs_inner_stair" , new ReFramedSlabsInnerStairBlock(cp(Blocks.OAK_STAIRS)));
|
||||||
|
SLABS_HALF_LAYER = registerBlock("slabs_half_layer" , new ReFramedSlabsHalfLayerBlock(cp(Blocks.OAK_SLAB)));
|
||||||
|
HALF_SLAB = registerBlock("half_slab" , new ReFramedHalfSlabBlock(cp(Blocks.OAK_SLAB)));
|
||||||
|
HALF_SLABS_SLAB = registerBlock("half_slabs_slab" , new ReFramedHalfSlabsSlabBlock(cp(Blocks.OAK_SLAB)));
|
||||||
STEP = registerBlock("step" , new ReFramedStepBlock(cp(Blocks.OAK_SLAB)));
|
STEP = registerBlock("step" , new ReFramedStepBlock(cp(Blocks.OAK_SLAB)));
|
||||||
STEPS_SLAB = registerBlock("steps_slab" , new ReFramedStepsSlabBlock(cp(Blocks.OAK_SLAB)));
|
STEPS_SLAB = registerBlock("steps_slab" , new ReFramedStepsSlabBlock(cp(Blocks.OAK_SLAB)));
|
||||||
|
STEPS_CROSS = registerBlock("steps_cross" , new ReFramedStepsCrossBlock(cp(Blocks.OAK_SLAB)));
|
||||||
|
STEPS_HALF_LAYER = registerBlock("steps_half_layer" , new ReFramedStepsHalfLayerBlock(cp(Blocks.OAK_SLAB)));
|
||||||
PILLAR = registerBlock("pillar" , new ReFramedPillarBlock(cp(Blocks.OAK_FENCE)));
|
PILLAR = registerBlock("pillar" , new ReFramedPillarBlock(cp(Blocks.OAK_FENCE)));
|
||||||
PILLARS_WALL = registerBlock("pillars_wall" , new ReFramedPillarsWallBlock(cp(Blocks.OAK_FENCE)));
|
PILLARS_WALL = registerBlock("pillars_wall" , new ReFramedPillarsWallBlock(cp(Blocks.OAK_FENCE)));
|
||||||
WALL = registerBlock("wall" , new ReFramedWallBlock(cp(Blocks.OAK_FENCE)));
|
WALL = registerBlock("wall" , new ReFramedWallBlock(cp(Blocks.OAK_FENCE)));
|
||||||
@ -92,8 +102,9 @@ public class ReFramed implements ModInitializer {
|
|||||||
BLUEPRINT = registerItem("blueprint" , new ReFramedBlueprintItem(new Item.Settings()));
|
BLUEPRINT = registerItem("blueprint" , new ReFramedBlueprintItem(new Item.Settings()));
|
||||||
BLUEPRINT_WRITTEN = registerItem("blueprint_written" , new ReFramedBlueprintWrittenItem(new Item.Settings().maxCount(1)));
|
BLUEPRINT_WRITTEN = registerItem("blueprint_written" , new ReFramedBlueprintWrittenItem(new Item.Settings().maxCount(1)));
|
||||||
|
|
||||||
|
|
||||||
REFRAMED_BLOCK_ENTITY = Registry.register(Registries.BLOCK_ENTITY_TYPE, id("camo"),
|
REFRAMED_BLOCK_ENTITY = Registry.register(Registries.BLOCK_ENTITY_TYPE, id("camo"),
|
||||||
FabricBlockEntityTypeBuilder.create(
|
BlockEntityType.Builder.create(
|
||||||
(pos, state) -> new ReFramedEntity(REFRAMED_BLOCK_ENTITY, pos, state),
|
(pos, state) -> new ReFramedEntity(REFRAMED_BLOCK_ENTITY, pos, state),
|
||||||
BLOCKS.stream()
|
BLOCKS.stream()
|
||||||
.filter(block -> !(block instanceof ReFramedDoubleBlock))
|
.filter(block -> !(block instanceof ReFramedDoubleBlock))
|
||||||
@ -101,7 +112,7 @@ public class ReFramed implements ModInitializer {
|
|||||||
);
|
);
|
||||||
|
|
||||||
REFRAMED_DOUBLE_BLOCK_ENTITY = Registry.register(Registries.BLOCK_ENTITY_TYPE, id("double_camo"),
|
REFRAMED_DOUBLE_BLOCK_ENTITY = Registry.register(Registries.BLOCK_ENTITY_TYPE, id("double_camo"),
|
||||||
FabricBlockEntityTypeBuilder.create(
|
BlockEntityType.Builder.create(
|
||||||
(pos, state) -> new ReFramedDoubleEntity(REFRAMED_DOUBLE_BLOCK_ENTITY, pos, state),
|
(pos, state) -> new ReFramedDoubleEntity(REFRAMED_DOUBLE_BLOCK_ENTITY, pos, state),
|
||||||
BLOCKS.stream()
|
BLOCKS.stream()
|
||||||
.filter(block -> block instanceof ReFramedDoubleBlock)
|
.filter(block -> block instanceof ReFramedDoubleBlock)
|
||||||
|
@ -55,13 +55,7 @@ public abstract class ConnectingReFramedBlock extends WaterloggableReFramedBlock
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState new_state, boolean moved) {
|
@SuppressWarnings("deprecation")
|
||||||
super.onStateReplaced(state, world, pos, new_state, moved);
|
|
||||||
|
|
||||||
if(!state.isOf(new_state.getBlock())) world.removeBlockEntity(pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
||||||
return Direction.Type.HORIZONTAL.stream().reduce(state, (s, dir) ->
|
return Direction.Type.HORIZONTAL.stream().reduce(state, (s, dir) ->
|
||||||
s.with(getConnectionProperty(rotation.rotate(dir)), state.get(getConnectionProperty(dir)))
|
s.with(getConnectionProperty(rotation.rotate(dir)), state.get(getConnectionProperty(dir)))
|
||||||
@ -69,6 +63,7 @@ public abstract class ConnectingReFramedBlock extends WaterloggableReFramedBlock
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
||||||
return Direction.Type.HORIZONTAL.stream().reduce(state, (s, dir) ->
|
return Direction.Type.HORIZONTAL.stream().reduce(state, (s, dir) ->
|
||||||
s.with(getConnectionProperty(mirror.apply(dir)), state.get(getConnectionProperty(dir)))
|
s.with(getConnectionProperty(mirror.apply(dir)), state.get(getConnectionProperty(dir)))
|
||||||
@ -78,6 +73,7 @@ public abstract class ConnectingReFramedBlock extends WaterloggableReFramedBlock
|
|||||||
protected abstract boolean connectsTo(BlockState state, boolean fs, Direction dir);
|
protected abstract boolean connectsTo(BlockState state, boolean fs, Direction dir);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public abstract VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context);
|
public abstract VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context);
|
||||||
|
|
||||||
public static BooleanProperty getConnectionProperty(Direction dir) {
|
public static BooleanProperty getConnectionProperty(Direction dir) {
|
||||||
|
@ -0,0 +1,68 @@
|
|||||||
|
package fr.adrien1106.reframed.block;
|
||||||
|
|
||||||
|
import fr.adrien1106.reframed.util.blocks.BlockHelper;
|
||||||
|
import fr.adrien1106.reframed.util.blocks.Corner;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.ShapeContext;
|
||||||
|
import net.minecraft.item.ItemPlacementContext;
|
||||||
|
import net.minecraft.state.StateManager;
|
||||||
|
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 org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.CORNER;
|
||||||
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.CORNER_FACE;
|
||||||
|
|
||||||
|
public abstract class CornerDoubleReFramedBlock extends WaterloggableReFramedDoubleBlock {
|
||||||
|
|
||||||
|
public CornerDoubleReFramedBlock(Settings settings) {
|
||||||
|
super(settings);
|
||||||
|
setDefaultState(getDefaultState().with(CORNER, Corner.NORTH_EAST_DOWN).with(CORNER_FACE, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
|
||||||
|
super.appendProperties(builder.add(CORNER,CORNER_FACE));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable BlockState getPlacementState(ItemPlacementContext ctx) {
|
||||||
|
Corner corner = BlockHelper.getPlacementCorner(ctx);
|
||||||
|
return super.getPlacementState(ctx)
|
||||||
|
.with(CORNER, corner)
|
||||||
|
.with(CORNER_FACE, corner.getDirectionIndex(ctx.getSide().getOpposite()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public abstract VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context);
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
||||||
|
Corner corner = state.get(CORNER);
|
||||||
|
Direction face = corner.getDirection(state.get(CORNER_FACE));
|
||||||
|
return state
|
||||||
|
.with(CORNER, corner.rotate(rotation))
|
||||||
|
.with(CORNER_FACE, corner.getDirectionIndex(rotation.rotate(face)));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
||||||
|
Corner corner = state.get(CORNER);
|
||||||
|
Direction face = corner.getDirection(state.get(CORNER_FACE));
|
||||||
|
return state
|
||||||
|
.with(CORNER, corner.mirror(mirror))
|
||||||
|
.with(CORNER_FACE, corner.getDirectionIndex(mirror.apply(face)));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public abstract VoxelShape getShape(BlockState state, int i);
|
||||||
|
}
|
@ -0,0 +1,64 @@
|
|||||||
|
package fr.adrien1106.reframed.block;
|
||||||
|
|
||||||
|
import fr.adrien1106.reframed.util.blocks.BlockHelper;
|
||||||
|
import fr.adrien1106.reframed.util.blocks.Edge;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.ShapeContext;
|
||||||
|
import net.minecraft.item.ItemPlacementContext;
|
||||||
|
import net.minecraft.state.StateManager;
|
||||||
|
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 org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE;
|
||||||
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE_FACE;
|
||||||
|
|
||||||
|
public abstract class EdgeDoubleReFramedBlock extends WaterloggableReFramedDoubleBlock {
|
||||||
|
|
||||||
|
public EdgeDoubleReFramedBlock(Settings settings) {
|
||||||
|
super(settings);
|
||||||
|
setDefaultState(getDefaultState().with(EDGE, Edge.NORTH_DOWN).with(EDGE_FACE, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
|
||||||
|
super.appendProperties(builder.add(EDGE, EDGE_FACE));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable BlockState getPlacementState(ItemPlacementContext ctx) {
|
||||||
|
Edge edge = BlockHelper.getPlacementEdge(ctx);
|
||||||
|
return super.getPlacementState(ctx)
|
||||||
|
.with(EDGE, edge)
|
||||||
|
.with(EDGE_FACE, edge.getDirectionIndex(ctx.getSide().getOpposite()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public abstract VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
||||||
|
Edge edge = state.get(EDGE).rotate(rotation);
|
||||||
|
Direction face = state.get(EDGE).getDirection(state.get(EDGE_FACE));
|
||||||
|
return state.with(EDGE, edge).with(EDGE_FACE, edge.getDirectionIndex(rotation.rotate(face)));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
||||||
|
Edge edge = state.get(EDGE).mirror(mirror);
|
||||||
|
Direction face = state.get(EDGE).getDirection(state.get(EDGE_FACE));
|
||||||
|
return state.with(EDGE, edge).with(EDGE_FACE, edge.getDirectionIndex(mirror.apply(face)));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public abstract VoxelShape getShape(BlockState state, int i);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
package fr.adrien1106.reframed.block;
|
||||||
|
|
||||||
|
import fr.adrien1106.reframed.ReFramed;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.item.BlockItem;
|
||||||
|
import net.minecraft.item.ItemPlacementContext;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.loot.context.LootContextParameterSet;
|
||||||
|
import net.minecraft.state.StateManager;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static net.minecraft.state.property.Properties.LAYERS;
|
||||||
|
|
||||||
|
public abstract class HalfLayerDoubleReFramedBlock extends EdgeDoubleReFramedBlock {
|
||||||
|
|
||||||
|
public HalfLayerDoubleReFramedBlock(Settings settings) {
|
||||||
|
super(settings);
|
||||||
|
setDefaultState(getDefaultState().with(LAYERS, 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public List<ItemStack> getDroppedStacks(BlockState state, LootContextParameterSet.Builder builder) {
|
||||||
|
List<ItemStack> drops = super.getDroppedStacks(state, builder);
|
||||||
|
drops.add(new ItemStack(ReFramed.HALF_LAYER, state.get(LAYERS)-1));
|
||||||
|
return drops;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
|
||||||
|
super.appendProperties(builder.add(LAYERS));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public boolean canReplace(BlockState state, ItemPlacementContext context) {
|
||||||
|
if (context.getPlayer() == null
|
||||||
|
|| context.getPlayer().isSneaking()
|
||||||
|
|| !(context.getStack().getItem() instanceof BlockItem block_item)
|
||||||
|
) return false;
|
||||||
|
return block_item.getBlock() == ReFramed.HALF_LAYER && state.get(LAYERS) < 8;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,64 @@
|
|||||||
|
package fr.adrien1106.reframed.block;
|
||||||
|
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.ShapeContext;
|
||||||
|
import net.minecraft.item.BlockItem;
|
||||||
|
import net.minecraft.item.ItemPlacementContext;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.loot.context.LootContextParameterSet;
|
||||||
|
import net.minecraft.state.StateManager;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.shape.VoxelShape;
|
||||||
|
import net.minecraft.world.BlockView;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static net.minecraft.state.property.Properties.LAYERS;
|
||||||
|
|
||||||
|
public abstract class LayeredReFramedBlock extends WaterloggableReFramedBlock {
|
||||||
|
|
||||||
|
public LayeredReFramedBlock(Settings settings) {
|
||||||
|
super(settings);
|
||||||
|
setDefaultState(getDefaultState().with(LAYERS, 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public List<ItemStack> getDroppedStacks(BlockState state, LootContextParameterSet.Builder builder) {
|
||||||
|
List<ItemStack> drops = super.getDroppedStacks(state, builder);
|
||||||
|
drops.forEach((stack) -> {
|
||||||
|
if (stack.getItem() instanceof BlockItem bi && bi.getBlock() instanceof LayeredReFramedBlock)
|
||||||
|
stack.setCount(state.get(LAYERS));
|
||||||
|
});
|
||||||
|
return drops;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
|
||||||
|
super.appendProperties(builder.add(LAYERS));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public abstract VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public boolean canReplace(BlockState state, ItemPlacementContext context) {
|
||||||
|
if (context.getPlayer() == null) return false;
|
||||||
|
return !(
|
||||||
|
context.getPlayer().isSneaking()
|
||||||
|
|| !(context.getStack().getItem() instanceof BlockItem block_item)
|
||||||
|
|| !(block_item.getBlock() == this && state.get(LAYERS) < 8)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable BlockState getPlacementState(ItemPlacementContext ctx) {
|
||||||
|
BlockState previous = ctx.getWorld().getBlockState(ctx.getBlockPos());
|
||||||
|
if (!previous.isOf(this)) return super.getPlacementState(ctx);
|
||||||
|
return previous.with(LAYERS, previous.get(LAYERS) + 1);
|
||||||
|
}
|
||||||
|
}
|
@ -32,14 +32,17 @@ public abstract class PillarReFramedBlock extends WaterloggableReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public abstract VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context);
|
public abstract VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
||||||
return state.with(AXIS, rotation.rotate(Direction.get(Direction.AxisDirection.POSITIVE, state.get(AXIS))).getAxis());
|
return state.with(AXIS, rotation.rotate(Direction.get(Direction.AxisDirection.POSITIVE, state.get(AXIS))).getAxis());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
||||||
return state.with(AXIS, mirror.apply(Direction.get(Direction.AxisDirection.POSITIVE, state.get(AXIS))).getAxis());
|
return state.with(AXIS, mirror.apply(Direction.get(Direction.AxisDirection.POSITIVE, state.get(AXIS))).getAxis());
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,7 @@ import net.minecraft.util.collection.DefaultedList;
|
|||||||
import net.minecraft.util.hit.BlockHitResult;
|
import net.minecraft.util.hit.BlockHitResult;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.Direction;
|
import net.minecraft.util.math.Direction;
|
||||||
|
import net.minecraft.util.math.Vec3d;
|
||||||
import net.minecraft.util.shape.VoxelShape;
|
import net.minecraft.util.shape.VoxelShape;
|
||||||
import net.minecraft.util.shape.VoxelShapes;
|
import net.minecraft.util.shape.VoxelShapes;
|
||||||
import net.minecraft.world.BlockView;
|
import net.minecraft.world.BlockView;
|
||||||
@ -59,6 +60,7 @@ public class ReFramedBlock extends Block implements BlockEntityProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
|
public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
|
||||||
if (!canUse(world, pos, player)) return ActionResult.PASS;
|
if (!canUse(world, pos, player)) return ActionResult.PASS;
|
||||||
ActionResult result = BlockHelper.useUpgrade(state, world, pos, player, hand);
|
ActionResult result = BlockHelper.useUpgrade(state, world, pos, player, hand);
|
||||||
@ -72,7 +74,10 @@ public class ReFramedBlock extends Block implements BlockEntityProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState new_state, boolean moved) {
|
public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState new_state, boolean moved) {
|
||||||
|
if (!new_state.isOf(state.getBlock())) world.removeBlockEntity(pos);
|
||||||
|
|
||||||
if(!(new_state.getBlock() instanceof ReFramedBlock) &&
|
if(!(new_state.getBlock() instanceof ReFramedBlock) &&
|
||||||
world.getBlockEntity(pos) instanceof ReFramedEntity frame_entity &&
|
world.getBlockEntity(pos) instanceof ReFramedEntity frame_entity &&
|
||||||
world.getGameRules().getBoolean(GameRules.DO_TILE_DROPS)
|
world.getGameRules().getBoolean(GameRules.DO_TILE_DROPS)
|
||||||
@ -136,7 +141,21 @@ public class ReFramedBlock extends Block implements BlockEntityProvider {
|
|||||||
onPlaced(world, pos, state, placer, stack);
|
onPlaced(world, pos, state, placer, stack);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean matchesShape(Vec3d hit, BlockPos pos, BlockState state) {
|
||||||
|
return matchesShape(hit, pos, state, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean matchesShape(Vec3d hit, BlockPos pos, BlockState state, int i) {
|
||||||
|
Vec3d rel = BlockHelper.getRelativePos(hit, pos);
|
||||||
|
return matchesShape(rel, getShape(state, i));
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean matchesShape(Vec3d rel_hit, VoxelShape shape) {
|
||||||
|
return BlockHelper.cursorMatchesFace(shape, rel_hit);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) {
|
public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) {
|
||||||
return isGhost(view, pos)
|
return isGhost(view, pos)
|
||||||
? VoxelShapes.empty()
|
? VoxelShapes.empty()
|
||||||
@ -144,12 +163,14 @@ public class ReFramedBlock extends Block implements BlockEntityProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public VoxelShape getCullingShape(BlockState state, BlockView view, BlockPos pos) {
|
public VoxelShape getCullingShape(BlockState state, BlockView view, BlockPos pos) {
|
||||||
return isGhost(view, pos)
|
return isGhost(view, pos)
|
||||||
? VoxelShapes.empty()
|
? VoxelShapes.empty()
|
||||||
: super.getCullingShape(state, view, pos);
|
: super.getCullingShape(state, view, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public VoxelShape getShape(BlockState state, int i) {
|
public VoxelShape getShape(BlockState state, int i) {
|
||||||
// assuming the shape don't need the world and position
|
// assuming the shape don't need the world and position
|
||||||
return getOutlineShape(state, null, null, null);
|
return getOutlineShape(state, null, null, null);
|
||||||
@ -160,11 +181,13 @@ public class ReFramedBlock extends Block implements BlockEntityProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public int getWeakRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) {
|
public int getWeakRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) {
|
||||||
return view.getBlockEntity(pos) instanceof ReFramedEntity be && be.emitsRedstone() ? 15 : 0;
|
return view.getBlockEntity(pos) instanceof ReFramedEntity be && be.emitsRedstone() ? 15 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public int getStrongRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) {
|
public int getStrongRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) {
|
||||||
return getWeakRedstonePower(state, view, pos, dir);
|
return getWeakRedstonePower(state, view, pos, dir);
|
||||||
}
|
}
|
||||||
|
@ -51,6 +51,7 @@ public class ReFramedButtonBlock extends WaterloggableReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) {
|
public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) {
|
||||||
return canPlaceAt(world, pos, getDirection(state).getOpposite());
|
return canPlaceAt(world, pos, getDirection(state).getOpposite());
|
||||||
}
|
}
|
||||||
@ -96,6 +97,7 @@ public class ReFramedButtonBlock extends WaterloggableReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public void onExploded(BlockState state, World world, BlockPos pos, Explosion explosion, BiConsumer<ItemStack, BlockPos> stackMerger) {
|
public void onExploded(BlockState state, World world, BlockPos pos, Explosion explosion, BiConsumer<ItemStack, BlockPos> stackMerger) {
|
||||||
if (explosion.getDestructionType() == Explosion.DestructionType.TRIGGER_BLOCK && !world.isClient() && !(Boolean)state.get(POWERED)) {
|
if (explosion.getDestructionType() == Explosion.DestructionType.TRIGGER_BLOCK && !world.isClient() && !(Boolean)state.get(POWERED)) {
|
||||||
powerOn(state, world, pos);
|
powerOn(state, world, pos);
|
||||||
@ -120,6 +122,7 @@ public class ReFramedButtonBlock extends WaterloggableReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
||||||
return BUTTON_VOXELS[
|
return BUTTON_VOXELS[
|
||||||
(state.get(POWERED) ? 12 : 0) +
|
(state.get(POWERED) ? 12 : 0) +
|
||||||
@ -129,11 +132,13 @@ public class ReFramedButtonBlock extends WaterloggableReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
||||||
return state.with(HORIZONTAL_FACING, rotation.rotate(state.get(HORIZONTAL_FACING)));
|
return state.with(HORIZONTAL_FACING, rotation.rotate(state.get(HORIZONTAL_FACING)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
||||||
return state.with(HORIZONTAL_FACING, mirror.apply(state.get(HORIZONTAL_FACING)));
|
return state.with(HORIZONTAL_FACING, mirror.apply(state.get(HORIZONTAL_FACING)));
|
||||||
}
|
}
|
||||||
@ -144,7 +149,6 @@ public class ReFramedButtonBlock extends WaterloggableReFramedBlock {
|
|||||||
|
|
||||||
if(!state.isOf(new_state.getBlock())) {
|
if(!state.isOf(new_state.getBlock())) {
|
||||||
if (!moved && state.get(POWERED)) updateNeighbors(state, world, pos);
|
if (!moved && state.get(POWERED)) updateNeighbors(state, world, pos);
|
||||||
world.removeBlockEntity(pos);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -159,16 +163,19 @@ public class ReFramedButtonBlock extends WaterloggableReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public boolean emitsRedstonePower(BlockState state) {
|
public boolean emitsRedstonePower(BlockState state) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) {
|
public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) {
|
||||||
if (state.get(POWERED)) tryPowerWithProjectiles(state, world, pos);
|
if (state.get(POWERED)) tryPowerWithProjectiles(state, world, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity) {
|
public void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity) {
|
||||||
if (!world.isClient && !state.get(POWERED)) tryPowerWithProjectiles(state, world, pos);
|
if (!world.isClient && !state.get(POWERED)) tryPowerWithProjectiles(state, world, pos);
|
||||||
}
|
}
|
||||||
|
@ -57,6 +57,7 @@ public class ReFramedDoorBlock extends WaterloggableReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) {
|
public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) {
|
||||||
BlockPos pos_down = pos.down();
|
BlockPos pos_down = pos.down();
|
||||||
BlockState state_down = world.getBlockState(pos_down);
|
BlockState state_down = world.getBlockState(pos_down);
|
||||||
@ -64,6 +65,7 @@ public class ReFramedDoorBlock extends WaterloggableReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public void neighborUpdate(BlockState state, World world, BlockPos pos, Block source, BlockPos sourcePos, boolean notify) {
|
public void neighborUpdate(BlockState state, World world, BlockPos pos, Block source, BlockPos sourcePos, boolean notify) {
|
||||||
if (world.isClient) return;
|
if (world.isClient) return;
|
||||||
boolean powered = world.isReceivingRedstonePower(pos)
|
boolean powered = world.isReceivingRedstonePower(pos)
|
||||||
@ -126,13 +128,6 @@ public class ReFramedDoorBlock extends WaterloggableReFramedBlock {
|
|||||||
return super.onBreak(world, pos, state, player);
|
return super.onBreak(world, pos, state, player);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState new_state, boolean moved) {
|
|
||||||
super.onStateReplaced(state, world, pos, new_state, moved);
|
|
||||||
|
|
||||||
if(!state.isOf(new_state.getBlock())) world.removeBlockEntity(pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState other, WorldAccess world, BlockPos pos, BlockPos moved) {
|
public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState other, WorldAccess world, BlockPos pos, BlockPos moved) {
|
||||||
if (direction.getAxis() == Direction.Axis.Y
|
if (direction.getAxis() == Direction.Axis.Y
|
||||||
@ -162,6 +157,7 @@ public class ReFramedDoorBlock extends WaterloggableReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public boolean canPathfindThrough(BlockState state, BlockView world, BlockPos pos, NavigationType type) {
|
public boolean canPathfindThrough(BlockState state, BlockView world, BlockPos pos, NavigationType type) {
|
||||||
return switch (type) {
|
return switch (type) {
|
||||||
case LAND, AIR -> state.get(OPEN);
|
case LAND, AIR -> state.get(OPEN);
|
||||||
@ -170,6 +166,7 @@ public class ReFramedDoorBlock extends WaterloggableReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public void onExploded(BlockState state, World world, BlockPos pos, Explosion explosion, BiConsumer<ItemStack, BlockPos> stack_merger) {
|
public void onExploded(BlockState state, World world, BlockPos pos, Explosion explosion, BiConsumer<ItemStack, BlockPos> stack_merger) {
|
||||||
if (explosion.getDestructionType() == Explosion.DestructionType.TRIGGER_BLOCK
|
if (explosion.getDestructionType() == Explosion.DestructionType.TRIGGER_BLOCK
|
||||||
&& !world.isClient()
|
&& !world.isClient()
|
||||||
@ -192,6 +189,7 @@ public class ReFramedDoorBlock extends WaterloggableReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
||||||
Direction direction = state.get(HORIZONTAL_FACING);
|
Direction direction = state.get(HORIZONTAL_FACING);
|
||||||
if (state.get(OPEN)) direction = switch (state.get(DOOR_HINGE)) {
|
if (state.get(OPEN)) direction = switch (state.get(DOOR_HINGE)) {
|
||||||
@ -202,16 +200,19 @@ public class ReFramedDoorBlock extends WaterloggableReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
||||||
return state.with(HORIZONTAL_FACING, rotation.rotate(state.get(HORIZONTAL_FACING)));
|
return state.with(HORIZONTAL_FACING, rotation.rotate(state.get(HORIZONTAL_FACING)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
||||||
return mirror == BlockMirror.NONE ? state : state.with(HORIZONTAL_FACING, mirror.apply(state.get(HORIZONTAL_FACING))).cycle(DOOR_HINGE);
|
return mirror == BlockMirror.NONE ? state : state.with(HORIZONTAL_FACING, mirror.apply(state.get(HORIZONTAL_FACING))).cycle(DOOR_HINGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public long getRenderingSeed(BlockState state, BlockPos pos) {
|
public long getRenderingSeed(BlockState state, BlockPos pos) {
|
||||||
return MathHelper.hashCode(pos.getX(), pos.down(state.get(DOUBLE_BLOCK_HALF) == DoubleBlockHalf.LOWER ? 0 : 1).getY(), pos.getZ());
|
return MathHelper.hashCode(pos.getX(), pos.down(state.get(DOUBLE_BLOCK_HALF) == DoubleBlockHalf.LOWER ? 0 : 1).getY(), pos.getZ());
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,6 @@ import net.minecraft.world.World;
|
|||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import static net.minecraft.util.shape.VoxelShapes.empty;
|
import static net.minecraft.util.shape.VoxelShapes.empty;
|
||||||
import static net.minecraft.util.shape.VoxelShapes.fullCube;
|
|
||||||
|
|
||||||
public abstract class ReFramedDoubleBlock extends ReFramedBlock {
|
public abstract class ReFramedDoubleBlock extends ReFramedBlock {
|
||||||
public ReFramedDoubleBlock(Settings settings) {
|
public ReFramedDoubleBlock(Settings settings) {
|
||||||
@ -49,14 +48,6 @@ public abstract class ReFramedDoubleBlock extends ReFramedBlock {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean matchesShape(Vec3d hit, BlockPos pos, BlockState state, int i) {
|
|
||||||
Vec3d rel = BlockHelper.getRelativePos(hit, pos);
|
|
||||||
return BlockHelper.cursorMatchesFace(
|
|
||||||
getShape(state, i),
|
|
||||||
rel
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isTransparent(BlockState state, BlockView world, BlockPos pos) {
|
public boolean isTransparent(BlockState state, BlockView world, BlockPos pos) {
|
||||||
return world.getBlockEntity(pos) instanceof ThemeableBlockEntity framed_entity
|
return world.getBlockEntity(pos) instanceof ThemeableBlockEntity framed_entity
|
||||||
@ -69,7 +60,7 @@ public abstract class ReFramedDoubleBlock extends ReFramedBlock {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) {
|
public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) {
|
||||||
return isGhost(view, pos) ? empty() : fullCube();
|
return isGhost(view, pos) ? empty() : getOutlineShape(state, view, pos, ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -57,6 +57,6 @@ public class ReFramedDoubleEntity extends ReFramedEntity {
|
|||||||
public void writeNbt(NbtCompound nbt) {
|
public void writeNbt(NbtCompound nbt) {
|
||||||
super.writeNbt(nbt);
|
super.writeNbt(nbt);
|
||||||
|
|
||||||
if(second_state != Blocks.AIR.getDefaultState()) nbt.put(BLOCKSTATE_KEY + 2, NbtHelper.fromBlockState(second_state));
|
nbt.put(BLOCKSTATE_KEY + 2, NbtHelper.fromBlockState(second_state));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -52,16 +52,15 @@ public class ReFramedEntity extends BlockEntity implements ThemeableBlockEntity
|
|||||||
if (nbt.contains(BITFIELD_KEY)) bit_field = nbt.getByte(BITFIELD_KEY);
|
if (nbt.contains(BITFIELD_KEY)) bit_field = nbt.getByte(BITFIELD_KEY);
|
||||||
|
|
||||||
// Force a chunk remesh on the client if the displayed blockstate has changed
|
// Force a chunk remesh on the client if the displayed blockstate has changed
|
||||||
if(world != null && world.isClient && !Objects.equals(rendered_state, first_state)) {
|
if(world != null && world.isClient && !Objects.equals(rendered_state, first_state))
|
||||||
ReFramed.chunkRerenderProxy.accept(world, pos);
|
ReFramed.chunkRerenderProxy.accept(world, pos);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeNbt(NbtCompound nbt) {
|
public void writeNbt(NbtCompound nbt) {
|
||||||
super.writeNbt(nbt);
|
super.writeNbt(nbt);
|
||||||
|
|
||||||
if(first_state != Blocks.AIR.getDefaultState()) nbt.put(BLOCKSTATE_KEY + 1, NbtHelper.fromBlockState(first_state));
|
nbt.put(BLOCKSTATE_KEY + 1, NbtHelper.fromBlockState(first_state));
|
||||||
if(bit_field != SOLIDITY_MASK) nbt.putByte(BITFIELD_KEY, bit_field);
|
if(bit_field != SOLIDITY_MASK) nbt.putByte(BITFIELD_KEY, bit_field);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,7 +112,7 @@ public class ReFramedEntity extends BlockEntity implements ThemeableBlockEntity
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setTheme(BlockState new_state, int i) {
|
public void setTheme(BlockState new_state, int i) {
|
||||||
if(!Objects.equals(first_state, new_state)) {
|
if(!Objects.equals(first_state, new_state) && i == 1) {
|
||||||
first_state = new_state;
|
first_state = new_state;
|
||||||
markDirtyAndDispatch();
|
markDirtyAndDispatch();
|
||||||
}
|
}
|
||||||
|
@ -56,6 +56,7 @@ public class ReFramedFenceBlock extends ConnectingReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public VoxelShape getCameraCollisionShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
public VoxelShape getCameraCollisionShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
||||||
return getOutlineShape(state, world, pos, context);
|
return getOutlineShape(state, world, pos, context);
|
||||||
}
|
}
|
||||||
@ -66,10 +67,12 @@ public class ReFramedFenceBlock extends ConnectingReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public boolean canPathfindThrough(BlockState state, BlockView world, BlockPos pos, NavigationType type) {
|
public boolean canPathfindThrough(BlockState state, BlockView world, BlockPos pos, NavigationType type) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
|
public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
|
||||||
ActionResult result = super.onUse(state, world, pos, player, hand, hit);
|
ActionResult result = super.onUse(state, world, pos, player, hand, hit);
|
||||||
if (result.isAccepted()) return result;
|
if (result.isAccepted()) return result;
|
||||||
|
@ -0,0 +1,188 @@
|
|||||||
|
package fr.adrien1106.reframed.block;
|
||||||
|
|
||||||
|
import fr.adrien1106.reframed.ReFramed;
|
||||||
|
import fr.adrien1106.reframed.util.VoxelHelper;
|
||||||
|
import fr.adrien1106.reframed.util.blocks.BlockHelper;
|
||||||
|
import fr.adrien1106.reframed.util.blocks.Edge;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.ShapeContext;
|
||||||
|
import net.minecraft.item.BlockItem;
|
||||||
|
import net.minecraft.item.ItemPlacementContext;
|
||||||
|
import net.minecraft.state.StateManager;
|
||||||
|
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 org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static fr.adrien1106.reframed.util.VoxelHelper.VoxelListBuilder;
|
||||||
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE;
|
||||||
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE_FACE;
|
||||||
|
import static net.minecraft.state.property.Properties.*;
|
||||||
|
|
||||||
|
public class ReFramedHalfLayerBlock extends LayeredReFramedBlock {
|
||||||
|
|
||||||
|
public static final VoxelShape[] HALF_LAYER_VOXELS;
|
||||||
|
|
||||||
|
public ReFramedHalfLayerBlock(Settings settings) {
|
||||||
|
super(settings);
|
||||||
|
setDefaultState(getDefaultState().with(EDGE, Edge.NORTH_DOWN).with(EDGE_FACE, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
|
||||||
|
super.appendProperties(builder.add(EDGE, EDGE_FACE));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canReplace(BlockState state, ItemPlacementContext context) {
|
||||||
|
if (super.canReplace(state, context)) return true;
|
||||||
|
|
||||||
|
if (context.getPlayer() == null
|
||||||
|
|| context.getPlayer().isSneaking()
|
||||||
|
|| !(context.getStack().getItem() instanceof BlockItem block_item)
|
||||||
|
) return false;
|
||||||
|
|
||||||
|
Edge edge = state.get(EDGE);
|
||||||
|
Direction face = edge.getDirection(state.get(EDGE_FACE));
|
||||||
|
if (block_item.getBlock() == ReFramed.SLAB)
|
||||||
|
return ReFramed.SLAB
|
||||||
|
.matchesShape(
|
||||||
|
context.getHitPos(),
|
||||||
|
context.getBlockPos(),
|
||||||
|
ReFramed.SLAB.getDefaultState().with(FACING, edge.getOtherDirection(face).getOpposite())
|
||||||
|
);
|
||||||
|
|
||||||
|
if (block_item.getBlock() == ReFramed.STEP)
|
||||||
|
return ReFramed.STEP
|
||||||
|
.matchesShape(
|
||||||
|
context.getHitPos(),
|
||||||
|
context.getBlockPos(),
|
||||||
|
ReFramed.STEP.getDefaultState().with(EDGE, edge.getOpposite(face))
|
||||||
|
);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
||||||
|
return getHalfLayerShape(
|
||||||
|
state.get(EDGE),
|
||||||
|
state.get(EDGE_FACE),
|
||||||
|
state.get(LAYERS)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable BlockState getPlacementState(ItemPlacementContext ctx) {
|
||||||
|
BlockState previous = ctx.getWorld().getBlockState(ctx.getBlockPos());
|
||||||
|
BlockState state = super.getPlacementState(ctx);
|
||||||
|
|
||||||
|
if (previous.isOf(this))
|
||||||
|
return state;
|
||||||
|
|
||||||
|
if (previous.isOf(ReFramed.SLABS_HALF_LAYER) || previous.isOf(ReFramed.STEPS_HALF_LAYER))
|
||||||
|
return previous.with(LAYERS, Math.min(8, previous.get(LAYERS) + 1));
|
||||||
|
|
||||||
|
if (previous.isOf(ReFramed.SLAB)) {
|
||||||
|
Direction face = previous.get(FACING);
|
||||||
|
Edge edge;
|
||||||
|
if (face.getAxis() == ctx.getSide().getAxis()) {
|
||||||
|
edge = BlockHelper.getPlacementEdge(ctx);
|
||||||
|
if (face == ctx.getSide()) edge = edge.getOpposite(edge.getOtherDirection(ctx.getSide()));
|
||||||
|
} else edge = Edge.getByDirections(face, ctx.getSide().getOpposite());
|
||||||
|
|
||||||
|
return ReFramed.SLABS_HALF_LAYER.getDefaultState()
|
||||||
|
.with(EDGE, edge)
|
||||||
|
.with(EDGE_FACE, edge.getDirectionIndex(face))
|
||||||
|
.with(WATERLOGGED, previous.get(WATERLOGGED));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (previous.isOf(ReFramed.STEP)) {
|
||||||
|
int face_index = 0;
|
||||||
|
Edge edge = previous.get(EDGE);
|
||||||
|
if (!ReFramed.STEP.matchesShape(
|
||||||
|
ctx.getHitPos(),
|
||||||
|
ctx.getBlockPos(),
|
||||||
|
ReFramed.STEP.getDefaultState().with(EDGE, edge.getOpposite(1))
|
||||||
|
)) face_index = 1;
|
||||||
|
return ReFramed.STEPS_HALF_LAYER.getDefaultState()
|
||||||
|
.with(EDGE, edge)
|
||||||
|
.with(EDGE_FACE, face_index)
|
||||||
|
.with(WATERLOGGED, previous.get(WATERLOGGED));
|
||||||
|
}
|
||||||
|
|
||||||
|
Edge edge = BlockHelper.getPlacementEdge(ctx);
|
||||||
|
return state.with(EDGE, edge).with(EDGE_FACE, edge.getDirectionIndex(ctx.getSide().getOpposite()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
||||||
|
Edge edge = state.get(EDGE);
|
||||||
|
Direction face = rotation.rotate(edge.getDirection(state.get(EDGE_FACE)));
|
||||||
|
edge = edge.rotate(rotation);
|
||||||
|
return state.with(EDGE, edge).with(EDGE_FACE, edge.getDirectionIndex(face));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
||||||
|
Edge edge = state.get(EDGE);
|
||||||
|
Direction face = mirror.apply(edge.getDirection(state.get(EDGE_FACE)));
|
||||||
|
edge = edge.mirror(mirror);
|
||||||
|
return state.with(EDGE, edge).with(EDGE_FACE, edge.getDirectionIndex(face));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<Integer, Integer> getThemeMap(BlockState state, BlockState new_state) {
|
||||||
|
if (new_state.isOf(ReFramed.SLABS_HALF_LAYER)
|
||||||
|
|| new_state.isOf(ReFramed.STEPS_HALF_LAYER)
|
||||||
|
) return Map.of(1, 2);
|
||||||
|
return super.getThemeMap(state, new_state);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static VoxelShape getHalfLayerShape(Edge edge, int face, int layer) {
|
||||||
|
return HALF_LAYER_VOXELS[edge.ordinal() * 16 + face * 8 + layer - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
VoxelListBuilder builder = VoxelListBuilder.create(createCuboidShape(0, 0, 0, 16, 8, 2), 192)
|
||||||
|
.add(createCuboidShape(0, 0, 0, 16, 8, 4))
|
||||||
|
.add(createCuboidShape(0, 0, 0, 16, 8, 6))
|
||||||
|
.add(createCuboidShape(0, 0, 0, 16, 8, 8))
|
||||||
|
.add(createCuboidShape(0, 0, 0, 16, 8, 10))
|
||||||
|
.add(createCuboidShape(0, 0, 0, 16, 8, 12))
|
||||||
|
.add(createCuboidShape(0, 0, 0, 16, 8, 14))
|
||||||
|
.add(createCuboidShape(0, 0, 0, 16, 8, 16));
|
||||||
|
|
||||||
|
for (int i = 0; i < 8; i++) {
|
||||||
|
builder.add(i, VoxelHelper::rotateCX, VoxelHelper::mirrorZ);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < 48; i++) {
|
||||||
|
builder.add(i, VoxelHelper::rotateCX);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < 64; i++) {
|
||||||
|
builder.add(i, VoxelHelper::rotateCY);
|
||||||
|
}
|
||||||
|
for (int i = 64; i < 80; i++) {
|
||||||
|
builder.add(i, VoxelHelper::rotateX);
|
||||||
|
}
|
||||||
|
for (int i = 80; i < 96; i++) {
|
||||||
|
builder.add(i, VoxelHelper::rotateX);
|
||||||
|
}
|
||||||
|
for (int i = 96; i < 112; i++) {
|
||||||
|
builder.add(i, VoxelHelper::rotateX);
|
||||||
|
}
|
||||||
|
for (int i = 112; i < 128; i++) {
|
||||||
|
builder.add(i, VoxelHelper::rotateX);
|
||||||
|
}
|
||||||
|
|
||||||
|
HALF_LAYER_VOXELS = builder.build();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,86 @@
|
|||||||
|
package fr.adrien1106.reframed.block;
|
||||||
|
|
||||||
|
import fr.adrien1106.reframed.ReFramed;
|
||||||
|
import fr.adrien1106.reframed.util.VoxelHelper;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.ShapeContext;
|
||||||
|
import net.minecraft.item.BlockItem;
|
||||||
|
import net.minecraft.item.ItemPlacementContext;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.Direction;
|
||||||
|
import net.minecraft.util.shape.VoxelShape;
|
||||||
|
import net.minecraft.world.BlockView;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static net.minecraft.state.property.Properties.*;
|
||||||
|
|
||||||
|
public class ReFramedHalfSlabBlock extends ReFramedSlabBlock {
|
||||||
|
|
||||||
|
public static VoxelShape[] HALF_SLAB_SHAPES;
|
||||||
|
|
||||||
|
public ReFramedHalfSlabBlock(Settings settings) {
|
||||||
|
super(settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canReplace(BlockState state, ItemPlacementContext context) {
|
||||||
|
if (context.getPlayer() == null
|
||||||
|
|| context.getPlayer().isSneaking()
|
||||||
|
|| !(context.getStack().getItem() instanceof BlockItem block_item)
|
||||||
|
) return false;
|
||||||
|
|
||||||
|
// allow replacing with slab, step, small cube and half stair
|
||||||
|
Block block = block_item.getBlock();
|
||||||
|
if (block != this) return false;
|
||||||
|
|
||||||
|
// check if the player is clicking on the inner part of the block
|
||||||
|
return ReFramed.HALF_SLABS_SLAB
|
||||||
|
.matchesShape(
|
||||||
|
context.getHitPos(),
|
||||||
|
context.getBlockPos(),
|
||||||
|
ReFramed.HALF_SLABS_SLAB.getDefaultState().with(FACING, state.get(FACING)),
|
||||||
|
2
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public BlockState getPlacementState(ItemPlacementContext ctx) {
|
||||||
|
BlockState current_state = ctx.getWorld().getBlockState(ctx.getBlockPos());
|
||||||
|
|
||||||
|
if (current_state.isOf(this))
|
||||||
|
return ReFramed.HALF_SLABS_SLAB.getDefaultState()
|
||||||
|
.with(FACING, current_state.get(FACING))
|
||||||
|
.with(WATERLOGGED, current_state.get(WATERLOGGED));
|
||||||
|
|
||||||
|
return super.getPlacementState(ctx).with(FACING, ctx.getSide().getOpposite());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
||||||
|
return getHalfSlabShape(state.get(FACING));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static VoxelShape getHalfSlabShape(Direction direction) {
|
||||||
|
return HALF_SLAB_SHAPES[direction.getId()];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<Integer, Integer> getThemeMap(BlockState state, BlockState new_state) {
|
||||||
|
if (new_state.isOf(ReFramed.HALF_SLABS_SLAB)) return Map.of(1, 1);
|
||||||
|
return super.getThemeMap(state, new_state);
|
||||||
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
HALF_SLAB_SHAPES = VoxelHelper.VoxelListBuilder.create(createCuboidShape(0, 0, 0, 16, 4, 16),6)
|
||||||
|
.add(createCuboidShape(0, 12, 0, 16, 16, 16))
|
||||||
|
.add(createCuboidShape(0, 0, 0, 16, 16, 4))
|
||||||
|
.add(createCuboidShape(0, 0, 12, 16, 16, 16))
|
||||||
|
.add(createCuboidShape(0, 0, 0, 4, 16, 16))
|
||||||
|
.add(createCuboidShape(12, 0, 0, 16, 16, 16))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,77 @@
|
|||||||
|
package fr.adrien1106.reframed.block;
|
||||||
|
|
||||||
|
import fr.adrien1106.reframed.util.VoxelHelper;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.ShapeContext;
|
||||||
|
import net.minecraft.item.ItemPlacementContext;
|
||||||
|
import net.minecraft.state.StateManager;
|
||||||
|
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 org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import static fr.adrien1106.reframed.block.ReFramedHalfSlabBlock.getHalfSlabShape;
|
||||||
|
import static fr.adrien1106.reframed.block.ReFramedSlabBlock.getSlabShape;
|
||||||
|
import static net.minecraft.state.property.Properties.FACING;
|
||||||
|
|
||||||
|
public class ReFramedHalfSlabsSlabBlock extends WaterloggableReFramedDoubleBlock {
|
||||||
|
|
||||||
|
public static VoxelShape[] HALF_SLAB_COMP_SHAPES;
|
||||||
|
|
||||||
|
public ReFramedHalfSlabsSlabBlock(Settings settings) {
|
||||||
|
super(settings);
|
||||||
|
setDefaultState(getDefaultState().with(FACING, Direction.DOWN));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
|
||||||
|
super.appendProperties(builder.add(FACING));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable BlockState getPlacementState(ItemPlacementContext ctx) {
|
||||||
|
return super.getPlacementState(ctx)
|
||||||
|
.with(FACING, ctx.getSide().getOpposite());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
||||||
|
return getSlabShape(state.get(FACING));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
||||||
|
return state
|
||||||
|
.with(FACING, rotation.rotate(state.get(FACING)));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
||||||
|
return state.with(FACING, mirror.apply(state.get(FACING)));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public VoxelShape getShape(BlockState state, int i) {
|
||||||
|
Direction face = state.get(FACING);
|
||||||
|
return i == 2
|
||||||
|
? HALF_SLAB_COMP_SHAPES[face.getId()]
|
||||||
|
: getHalfSlabShape(face);
|
||||||
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
HALF_SLAB_COMP_SHAPES = VoxelHelper.VoxelListBuilder.create(createCuboidShape(0, 4, 0, 16, 8, 16),6)
|
||||||
|
.add(createCuboidShape(0, 8, 0, 16, 12, 16))
|
||||||
|
.add(createCuboidShape(0, 0, 4, 16, 16, 8))
|
||||||
|
.add(createCuboidShape(0, 0, 8, 16, 16, 12))
|
||||||
|
.add(createCuboidShape(4, 0, 0, 8, 16, 16))
|
||||||
|
.add(createCuboidShape(8, 0, 0, 12, 16, 16))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
@ -25,6 +25,7 @@ import java.util.Map;
|
|||||||
import static fr.adrien1106.reframed.util.VoxelHelper.VoxelListBuilder;
|
import static fr.adrien1106.reframed.util.VoxelHelper.VoxelListBuilder;
|
||||||
import static fr.adrien1106.reframed.util.blocks.BlockProperties.*;
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.*;
|
||||||
import static fr.adrien1106.reframed.util.blocks.Corner.*;
|
import static fr.adrien1106.reframed.util.blocks.Corner.*;
|
||||||
|
import static net.minecraft.state.property.Properties.FACING;
|
||||||
import static net.minecraft.state.property.Properties.WATERLOGGED;
|
import static net.minecraft.state.property.Properties.WATERLOGGED;
|
||||||
|
|
||||||
public class ReFramedHalfStairBlock extends WaterloggableReFramedBlock {
|
public class ReFramedHalfStairBlock extends WaterloggableReFramedBlock {
|
||||||
@ -42,39 +43,37 @@ public class ReFramedHalfStairBlock extends WaterloggableReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public boolean canReplace(BlockState state, ItemPlacementContext context) {
|
public boolean canReplace(BlockState state, ItemPlacementContext context) {
|
||||||
if (context.getPlayer() == null) return false;
|
if (context.getPlayer() == null
|
||||||
Direction dir = state.get(CORNER).getDirection(state.get(CORNER_FACE));
|
|| context.getPlayer().isSneaking()
|
||||||
return !(
|
|
||||||
context.getPlayer().isSneaking()
|
|
||||||
|| !(context.getStack().getItem() instanceof BlockItem block_item)
|
|| !(context.getStack().getItem() instanceof BlockItem block_item)
|
||||||
|| (
|
) return false;
|
||||||
!(
|
|
||||||
block_item.getBlock() == this
|
// allow replacing with slab, step, small cube and half stair
|
||||||
&& ((ReFramedHalfStairsStairBlock) ReFramed.HALF_STAIRS_STAIR)
|
Block block = block_item.getBlock();
|
||||||
.matchesShape(
|
Corner corner = state.get(CORNER);
|
||||||
|
Direction dir = corner.getDirection(state.get(CORNER_FACE));
|
||||||
|
if (block == this || block == ReFramed.STEP)
|
||||||
|
return ReFramed.HALF_STAIRS_STAIR.matchesShape(
|
||||||
context.getHitPos(),
|
context.getHitPos(),
|
||||||
context.getBlockPos(),
|
context.getBlockPos(),
|
||||||
ReFramed.HALF_STAIRS_STAIR.getDefaultState()
|
ReFramed.HALF_STAIRS_STAIR.getDefaultState().with(EDGE, corner.getEdge(dir)),
|
||||||
.with(EDGE, state.get(CORNER).getEdge(dir)),
|
|
||||||
dir.getDirection() == Direction.AxisDirection.POSITIVE ? 1 : 2
|
dir.getDirection() == Direction.AxisDirection.POSITIVE ? 1 : 2
|
||||||
)
|
|
||||||
)
|
|
||||||
&& !(
|
|
||||||
block_item.getBlock() == ReFramed.SMALL_CUBE
|
|
||||||
&& BlockHelper.cursorMatchesFace(
|
|
||||||
ReFramed.SMALL_CUBE.getOutlineShape(
|
|
||||||
ReFramed.SMALL_CUBE.getDefaultState()
|
|
||||||
.with(CORNER, state.get(CORNER).getOpposite(state.get(CORNER_FACE))),
|
|
||||||
context.getWorld(),
|
|
||||||
context.getBlockPos(),
|
|
||||||
ShapeContext.absent()
|
|
||||||
),
|
|
||||||
BlockHelper.getRelativePos(context.getHitPos(), context.getBlockPos())
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (block == ReFramed.SMALL_CUBE)
|
||||||
|
return ReFramed.SMALL_CUBE.matchesShape(
|
||||||
|
context.getHitPos(),
|
||||||
|
context.getBlockPos(),
|
||||||
|
ReFramed.SMALL_CUBE.getDefaultState().with(CORNER, corner.change(dir))
|
||||||
|
) || ReFramed.SMALL_CUBE.matchesShape(
|
||||||
|
context.getHitPos(),
|
||||||
|
context.getBlockPos(),
|
||||||
|
ReFramed.SMALL_CUBE.getDefaultState().with(CORNER, corner.getOpposite(dir))
|
||||||
|
);
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -92,6 +91,15 @@ public class ReFramedHalfStairBlock extends WaterloggableReFramedBlock {
|
|||||||
return ReFramed.HALF_STAIRS_STAIR.getDefaultState()
|
return ReFramed.HALF_STAIRS_STAIR.getDefaultState()
|
||||||
.with(EDGE, current_state.get(CORNER).getEdge(current_state.get(CORNER).getDirection(current_state.get(CORNER_FACE))))
|
.with(EDGE, current_state.get(CORNER).getEdge(current_state.get(CORNER).getDirection(current_state.get(CORNER_FACE))))
|
||||||
.with(WATERLOGGED, current_state.get(WATERLOGGED));
|
.with(WATERLOGGED, current_state.get(WATERLOGGED));
|
||||||
|
if (current_state.isOf(ReFramed.SLAB)) {
|
||||||
|
Corner corner = BlockHelper.getPlacementCorner(ctx);
|
||||||
|
Direction face = current_state.get(FACING);
|
||||||
|
if (!corner.hasDirection(face)) corner = corner.change(face.getOpposite());
|
||||||
|
return ReFramed.SLABS_INNER_STAIR.getDefaultState()
|
||||||
|
.with(CORNER, corner)
|
||||||
|
.with(CORNER_FACE, corner.getDirectionIndex(face))
|
||||||
|
.with(WATERLOGGED, current_state.get(WATERLOGGED));
|
||||||
|
}
|
||||||
|
|
||||||
Corner corner = BlockHelper.getPlacementCorner(ctx);
|
Corner corner = BlockHelper.getPlacementCorner(ctx);
|
||||||
return super.getPlacementState(ctx)
|
return super.getPlacementState(ctx)
|
||||||
@ -100,11 +108,13 @@ public class ReFramedHalfStairBlock extends WaterloggableReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
||||||
return getHalfStairShape(state.get(CORNER), state.get(CORNER_FACE));
|
return getHalfStairShape(state.get(CORNER), state.get(CORNER_FACE));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
||||||
Corner corner = state.get(CORNER).rotate(rotation);
|
Corner corner = state.get(CORNER).rotate(rotation);
|
||||||
Direction face = state.get(CORNER).getDirection(state.get(CORNER_FACE));
|
Direction face = state.get(CORNER).getDirection(state.get(CORNER_FACE));
|
||||||
@ -112,6 +122,7 @@ public class ReFramedHalfStairBlock extends WaterloggableReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
||||||
Corner corner = state.get(CORNER).mirror(mirror);
|
Corner corner = state.get(CORNER).mirror(mirror);
|
||||||
Direction face = state.get(CORNER).getDirection(state.get(CORNER_FACE));
|
Direction face = state.get(CORNER).getDirection(state.get(CORNER_FACE));
|
||||||
@ -120,7 +131,10 @@ public class ReFramedHalfStairBlock extends WaterloggableReFramedBlock {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<Integer, Integer> getThemeMap(BlockState state, BlockState new_state) {
|
public Map<Integer, Integer> getThemeMap(BlockState state, BlockState new_state) {
|
||||||
if (new_state.isOf(ReFramed.HALF_STAIRS_SLAB)) return Map.of(1, 1);
|
if (new_state.isOf(ReFramed.HALF_STAIRS_SLAB)
|
||||||
|
|| new_state.isOf(ReFramed.HALF_STAIRS_CUBE_STAIR)
|
||||||
|
|| new_state.isOf(ReFramed.HALF_STAIRS_STEP_STAIR)
|
||||||
|
) return Map.of(1, 1);
|
||||||
if (new_state.isOf(ReFramed.HALF_STAIRS_STAIR))
|
if (new_state.isOf(ReFramed.HALF_STAIRS_STAIR))
|
||||||
return Map.of(
|
return Map.of(
|
||||||
1,
|
1,
|
||||||
|
@ -0,0 +1,48 @@
|
|||||||
|
package fr.adrien1106.reframed.block;
|
||||||
|
|
||||||
|
import fr.adrien1106.reframed.util.blocks.Corner;
|
||||||
|
import fr.adrien1106.reframed.util.blocks.Edge;
|
||||||
|
import fr.adrien1106.reframed.util.blocks.StairShape;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.ShapeContext;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.Direction;
|
||||||
|
import net.minecraft.util.shape.VoxelShape;
|
||||||
|
import net.minecraft.world.BlockView;
|
||||||
|
|
||||||
|
import static fr.adrien1106.reframed.block.ReFramedHalfStairBlock.getHalfStairShape;
|
||||||
|
import static fr.adrien1106.reframed.block.ReFramedSmallCubeBlock.getSmallCubeShape;
|
||||||
|
import static fr.adrien1106.reframed.block.ReFramedStairBlock.getStairShape;
|
||||||
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.CORNER;
|
||||||
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.CORNER_FACE;
|
||||||
|
|
||||||
|
public class ReFramedHalfStairsCubeStairBlock extends CornerDoubleReFramedBlock {
|
||||||
|
|
||||||
|
public ReFramedHalfStairsCubeStairBlock(Settings settings) {
|
||||||
|
super(settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
||||||
|
Corner corner = state.get(CORNER);
|
||||||
|
Direction face = corner.getDirection(state.get(CORNER_FACE));
|
||||||
|
Edge edge = corner.getEdge(face);
|
||||||
|
return getStairShape(
|
||||||
|
edge,
|
||||||
|
face.getDirection() == Direction.AxisDirection.POSITIVE
|
||||||
|
? StairShape.OUTER_LEFT
|
||||||
|
: StairShape.OUTER_RIGHT
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public VoxelShape getShape(BlockState state, int i) {
|
||||||
|
Corner corner = state.get(CORNER);
|
||||||
|
Direction face = corner.getDirection(state.get(CORNER_FACE));
|
||||||
|
if (i == 2) corner = corner.change(face);
|
||||||
|
return i == 2
|
||||||
|
? getSmallCubeShape(corner)
|
||||||
|
: getHalfStairShape(corner, state.get(CORNER_FACE));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -21,7 +21,6 @@ import static fr.adrien1106.reframed.block.ReFramedSmallCubeBlock.getSmallCubeSh
|
|||||||
import static fr.adrien1106.reframed.util.blocks.BlockProperties.CORNER;
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.CORNER;
|
||||||
import static fr.adrien1106.reframed.util.blocks.BlockProperties.CORNER_FACE;
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.CORNER_FACE;
|
||||||
import static fr.adrien1106.reframed.util.blocks.Corner.NORTH_EAST_DOWN;
|
import static fr.adrien1106.reframed.util.blocks.Corner.NORTH_EAST_DOWN;
|
||||||
import static net.minecraft.util.shape.VoxelShapes.empty;
|
|
||||||
|
|
||||||
public class ReFramedHalfStairsSlabBlock extends WaterloggableReFramedDoubleBlock {
|
public class ReFramedHalfStairsSlabBlock extends WaterloggableReFramedDoubleBlock {
|
||||||
|
|
||||||
@ -44,16 +43,13 @@ public class ReFramedHalfStairsSlabBlock extends WaterloggableReFramedDoubleBloc
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) {
|
@SuppressWarnings("deprecation")
|
||||||
return isGhost(view, pos) ? empty(): getOutlineShape(state, view, pos, ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
||||||
return getSlabShape(state.get(CORNER).getDirection(state.get(CORNER_FACE)));
|
return getSlabShape(state.get(CORNER).getDirection(state.get(CORNER_FACE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
||||||
Corner corner = state.get(CORNER).rotate(rotation);
|
Corner corner = state.get(CORNER).rotate(rotation);
|
||||||
Direction face = state.get(CORNER).getDirection(state.get(CORNER_FACE));
|
Direction face = state.get(CORNER).getDirection(state.get(CORNER_FACE));
|
||||||
@ -61,6 +57,7 @@ public class ReFramedHalfStairsSlabBlock extends WaterloggableReFramedDoubleBloc
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
||||||
Corner corner = state.get(CORNER).mirror(mirror);
|
Corner corner = state.get(CORNER).mirror(mirror);
|
||||||
Direction face = state.get(CORNER).getDirection(state.get(CORNER_FACE));
|
Direction face = state.get(CORNER).getDirection(state.get(CORNER_FACE));
|
||||||
|
@ -21,7 +21,6 @@ import static fr.adrien1106.reframed.block.ReFramedHalfStairBlock.getHalfStairSh
|
|||||||
import static fr.adrien1106.reframed.block.ReFramedStairBlock.getStairShape;
|
import static fr.adrien1106.reframed.block.ReFramedStairBlock.getStairShape;
|
||||||
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE;
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE;
|
||||||
import static fr.adrien1106.reframed.util.blocks.Edge.*;
|
import static fr.adrien1106.reframed.util.blocks.Edge.*;
|
||||||
import static net.minecraft.util.shape.VoxelShapes.empty;
|
|
||||||
|
|
||||||
public class ReFramedHalfStairsStairBlock extends WaterloggableReFramedDoubleBlock {
|
public class ReFramedHalfStairsStairBlock extends WaterloggableReFramedDoubleBlock {
|
||||||
public ReFramedHalfStairsStairBlock(Settings settings) {
|
public ReFramedHalfStairsStairBlock(Settings settings) {
|
||||||
@ -41,21 +40,19 @@ public class ReFramedHalfStairsStairBlock extends WaterloggableReFramedDoubleBlo
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) {
|
@SuppressWarnings("deprecation")
|
||||||
return isGhost(view, pos) ? empty(): getStairShape(state.get(EDGE), StairShape.STRAIGHT);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
||||||
return getStairShape(state.get(EDGE), StairShape.STRAIGHT);
|
return getStairShape(state.get(EDGE), StairShape.STRAIGHT);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
||||||
return state.with(EDGE, state.get(EDGE).rotate(rotation));
|
return state.with(EDGE, state.get(EDGE).rotate(rotation));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
||||||
return state.with(EDGE, state.get(EDGE).mirror(mirror));
|
return state.with(EDGE, state.get(EDGE).mirror(mirror));
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,76 @@
|
|||||||
|
package fr.adrien1106.reframed.block;
|
||||||
|
|
||||||
|
import fr.adrien1106.reframed.util.blocks.BlockHelper;
|
||||||
|
import fr.adrien1106.reframed.util.blocks.Corner;
|
||||||
|
import fr.adrien1106.reframed.util.blocks.Edge;
|
||||||
|
import fr.adrien1106.reframed.util.blocks.StairShape;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.ShapeContext;
|
||||||
|
import net.minecraft.item.ItemPlacementContext;
|
||||||
|
import net.minecraft.state.StateManager;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.Direction;
|
||||||
|
import net.minecraft.util.shape.VoxelShape;
|
||||||
|
import net.minecraft.world.BlockView;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import static fr.adrien1106.reframed.block.ReFramedHalfStairBlock.getHalfStairShape;
|
||||||
|
import static fr.adrien1106.reframed.block.ReFramedStairBlock.getStairShape;
|
||||||
|
import static fr.adrien1106.reframed.block.ReFramedStepBlock.getStepShape;
|
||||||
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.*;
|
||||||
|
|
||||||
|
public class ReFramedHalfStairsStepStairBlock extends CornerDoubleReFramedBlock {
|
||||||
|
|
||||||
|
public ReFramedHalfStairsStepStairBlock(Settings settings) {
|
||||||
|
super(settings);
|
||||||
|
setDefaultState(getDefaultState().with(CORNER_FEATURE, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
|
||||||
|
super.appendProperties(builder.add(CORNER_FEATURE));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable BlockState getPlacementState(ItemPlacementContext ctx) {
|
||||||
|
BlockState state = super.getPlacementState(ctx);
|
||||||
|
Corner corner = state.get(CORNER);
|
||||||
|
int face_index = state.get(CORNER_FACE);
|
||||||
|
Direction face = corner.getDirection(face_index);
|
||||||
|
face = BlockHelper.getPlacementEdge(ctx).getOtherDirection(face);
|
||||||
|
int feature_index = corner.getDirectionIndex(face);
|
||||||
|
return state.with(CORNER_FEATURE, feature_index > face_index ? feature_index - 1 : feature_index);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
||||||
|
Corner corner = state.get(CORNER);
|
||||||
|
int feature_index = state.get(CORNER_FEATURE), face_index = state.get(CORNER_FACE);
|
||||||
|
Direction feature_face = corner.getDirection(feature_index >= face_index ? feature_index + 1 : feature_index);
|
||||||
|
Direction face = corner.getDirection(face_index);
|
||||||
|
Edge edge = Edge.getByDirections(feature_face, face);
|
||||||
|
return getStairShape(
|
||||||
|
edge,
|
||||||
|
corner.getOtherDirection(edge).getDirection() == Direction.AxisDirection.POSITIVE
|
||||||
|
? edge.getDirectionIndex(face) == 0
|
||||||
|
? StairShape.FIRST_OUTER_LEFT
|
||||||
|
: StairShape.SECOND_OUTER_LEFT
|
||||||
|
: edge.getDirectionIndex(face) == 0
|
||||||
|
? StairShape.FIRST_OUTER_RIGHT
|
||||||
|
: StairShape.SECOND_OUTER_RIGHT
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public VoxelShape getShape(BlockState state, int i) {
|
||||||
|
Corner corner = state.get(CORNER);
|
||||||
|
int feature_index = state.get(CORNER_FEATURE), face_index = state.get(CORNER_FACE);
|
||||||
|
Direction feature_face = corner.getDirection(feature_index >= face_index ? feature_index + 1 : feature_index);
|
||||||
|
Direction face = corner.getDirection(face_index);
|
||||||
|
return i == 2
|
||||||
|
? getStepShape(Edge.getByDirections(face.getOpposite(), feature_face))
|
||||||
|
: getHalfStairShape(corner, face_index);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -4,46 +4,32 @@ import fr.adrien1106.reframed.util.VoxelHelper;
|
|||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.block.ShapeContext;
|
import net.minecraft.block.ShapeContext;
|
||||||
import net.minecraft.item.BlockItem;
|
|
||||||
import net.minecraft.item.ItemPlacementContext;
|
import net.minecraft.item.ItemPlacementContext;
|
||||||
import net.minecraft.item.ItemStack;
|
|
||||||
import net.minecraft.loot.context.LootContextParameterSet;
|
|
||||||
import net.minecraft.state.StateManager;
|
import net.minecraft.state.StateManager;
|
||||||
import net.minecraft.util.BlockMirror;
|
import net.minecraft.util.BlockMirror;
|
||||||
import net.minecraft.util.BlockRotation;
|
import net.minecraft.util.BlockRotation;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.Direction;
|
||||||
import net.minecraft.util.shape.VoxelShape;
|
import net.minecraft.util.shape.VoxelShape;
|
||||||
import net.minecraft.world.BlockView;
|
import net.minecraft.world.BlockView;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import static fr.adrien1106.reframed.util.VoxelHelper.VoxelListBuilder;
|
import static fr.adrien1106.reframed.util.VoxelHelper.VoxelListBuilder;
|
||||||
import static net.minecraft.state.property.Properties.FACING;
|
import static net.minecraft.state.property.Properties.FACING;
|
||||||
import static net.minecraft.state.property.Properties.LAYERS;
|
import static net.minecraft.state.property.Properties.LAYERS;
|
||||||
|
|
||||||
public class ReFramedLayerBlock extends ReFramedSlabBlock {
|
public class ReFramedLayerBlock extends LayeredReFramedBlock {
|
||||||
|
|
||||||
public static final VoxelShape[] LAYER_VOXELS;
|
public static final VoxelShape[] LAYER_VOXELS;
|
||||||
|
|
||||||
public ReFramedLayerBlock(Settings settings) {
|
public ReFramedLayerBlock(Settings settings) {
|
||||||
super(settings);
|
super(settings);
|
||||||
setDefaultState(getDefaultState().with(LAYERS, 1));
|
setDefaultState(getDefaultState().with(FACING, Direction.DOWN));
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<ItemStack> getDroppedStacks(BlockState state, LootContextParameterSet.Builder builder) {
|
|
||||||
List<ItemStack> drops = super.getDroppedStacks(state, builder);
|
|
||||||
drops.forEach((stack) -> {
|
|
||||||
if (stack.getItem() instanceof BlockItem bi && bi.getBlock() instanceof ReFramedLayerBlock)
|
|
||||||
stack.setCount(state.get(LAYERS));
|
|
||||||
});
|
|
||||||
return drops;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
|
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
|
||||||
super.appendProperties(builder.add(LAYERS));
|
super.appendProperties(builder.add(FACING));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -51,29 +37,22 @@ public class ReFramedLayerBlock extends ReFramedSlabBlock {
|
|||||||
return LAYER_VOXELS[state.get(FACING).getId() * 8 + state.get(LAYERS) - 1];
|
return LAYER_VOXELS[state.get(FACING).getId() * 8 + state.get(LAYERS) - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canReplace(BlockState state, ItemPlacementContext context) {
|
|
||||||
if (context.getPlayer() == null) return false;
|
|
||||||
return !(
|
|
||||||
context.getPlayer().isSneaking()
|
|
||||||
|| !(context.getStack().getItem() instanceof BlockItem block_item)
|
|
||||||
|| !(block_item.getBlock() == this && state.get(LAYERS) < 8)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @Nullable BlockState getPlacementState(ItemPlacementContext ctx) {
|
public @Nullable BlockState getPlacementState(ItemPlacementContext ctx) {
|
||||||
BlockState previous = ctx.getWorld().getBlockState(ctx.getBlockPos());
|
BlockState previous = ctx.getWorld().getBlockState(ctx.getBlockPos());
|
||||||
if (!previous.isOf(this)) return super.getPlacementState(ctx);
|
BlockState state = super.getPlacementState(ctx);
|
||||||
return previous.with(LAYERS, previous.get(LAYERS) + 1);
|
if (previous.isOf(this)) return state;
|
||||||
|
return state.with(FACING, ctx.getSide().getOpposite());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
||||||
return state.with(FACING, rotation.rotate(state.get(FACING)));
|
return state.with(FACING, rotation.rotate(state.get(FACING)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
||||||
return state.with(FACING, mirror.apply(state.get(FACING)));
|
return state.with(FACING, mirror.apply(state.get(FACING)));
|
||||||
}
|
}
|
||||||
|
@ -71,13 +71,6 @@ public class ReFramedPillarsWallBlock extends WaterloggableReFramedDoubleBlock {
|
|||||||
return getWallState(state, top_state, neighbors, top_shape, fs, world, pos);
|
return getWallState(state, top_state, neighbors, top_shape, fs, world, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState new_state, boolean moved) {
|
|
||||||
super.onStateReplaced(state, world, pos, new_state, moved);
|
|
||||||
|
|
||||||
if(!state.isOf(new_state.getBlock())) world.removeBlockEntity(pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) {
|
public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) {
|
||||||
if (isGhost(view, pos)) return empty();
|
if (isGhost(view, pos)) return empty();
|
||||||
@ -95,6 +88,7 @@ public class ReFramedPillarsWallBlock extends WaterloggableReFramedDoubleBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
||||||
VoxelShape shape = WALL_VOXELS[0];
|
VoxelShape shape = WALL_VOXELS[0];
|
||||||
for (Direction dir: Direction.Type.HORIZONTAL) {
|
for (Direction dir: Direction.Type.HORIZONTAL) {
|
||||||
@ -106,6 +100,7 @@ public class ReFramedPillarsWallBlock extends WaterloggableReFramedDoubleBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
||||||
return Direction.Type.HORIZONTAL.stream().reduce(state, (s, dir) ->
|
return Direction.Type.HORIZONTAL.stream().reduce(state, (s, dir) ->
|
||||||
s.with(getWallShape(rotation.rotate(dir)), state.get(getWallShape(dir)))
|
s.with(getWallShape(rotation.rotate(dir)), state.get(getWallShape(dir)))
|
||||||
@ -113,6 +108,7 @@ public class ReFramedPillarsWallBlock extends WaterloggableReFramedDoubleBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
||||||
return Direction.Type.HORIZONTAL.stream().reduce(state, (s, dir) ->
|
return Direction.Type.HORIZONTAL.stream().reduce(state, (s, dir) ->
|
||||||
s.with(getWallShape(mirror.apply(dir)), state.get(getWallShape(dir)))
|
s.with(getWallShape(mirror.apply(dir)), state.get(getWallShape(dir)))
|
||||||
|
@ -49,13 +49,6 @@ public class ReFramedPostFenceBlock extends WaterloggableReFramedDoubleBlock {
|
|||||||
super.appendProperties(builder.add(EAST, NORTH, SOUTH, WEST));
|
super.appendProperties(builder.add(EAST, NORTH, SOUTH, WEST));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState new_state, boolean moved) {
|
|
||||||
super.onStateReplaced(state, world, pos, new_state, moved);
|
|
||||||
|
|
||||||
if(!state.isOf(new_state.getBlock())) world.removeBlockEntity(pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlockState getStateForNeighborUpdate(BlockState state, Direction dir, BlockState other_state, WorldAccess world, BlockPos pos, BlockPos moved) {
|
public BlockState getStateForNeighborUpdate(BlockState state, Direction dir, BlockState other_state, WorldAccess world, BlockPos pos, BlockPos moved) {
|
||||||
BlockState new_state = super.getStateForNeighborUpdate(state, dir, other_state, world, pos, moved);
|
BlockState new_state = super.getStateForNeighborUpdate(state, dir, other_state, world, pos, moved);
|
||||||
@ -74,6 +67,7 @@ public class ReFramedPostFenceBlock extends WaterloggableReFramedDoubleBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
||||||
return Direction.Type.HORIZONTAL.stream().reduce(state, (s, dir) ->
|
return Direction.Type.HORIZONTAL.stream().reduce(state, (s, dir) ->
|
||||||
s.with(getConnectionProperty(rotation.rotate(dir)), state.get(getConnectionProperty(dir)))
|
s.with(getConnectionProperty(rotation.rotate(dir)), state.get(getConnectionProperty(dir)))
|
||||||
@ -81,6 +75,7 @@ public class ReFramedPostFenceBlock extends WaterloggableReFramedDoubleBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
||||||
return Direction.Type.HORIZONTAL.stream().reduce(state, (s, dir) ->
|
return Direction.Type.HORIZONTAL.stream().reduce(state, (s, dir) ->
|
||||||
s.with(getConnectionProperty(mirror.apply(dir)), state.get(getConnectionProperty(dir)))
|
s.with(getConnectionProperty(mirror.apply(dir)), state.get(getConnectionProperty(dir)))
|
||||||
@ -104,6 +99,7 @@ public class ReFramedPostFenceBlock extends WaterloggableReFramedDoubleBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
||||||
VoxelShape shape = FENCE_VOXELS[0];
|
VoxelShape shape = FENCE_VOXELS[0];
|
||||||
for (Direction dir: Direction.Type.HORIZONTAL) {
|
for (Direction dir: Direction.Type.HORIZONTAL) {
|
||||||
@ -124,6 +120,7 @@ public class ReFramedPostFenceBlock extends WaterloggableReFramedDoubleBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public VoxelShape getCameraCollisionShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
public VoxelShape getCameraCollisionShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
||||||
return getOutlineShape(state, world, pos, context);
|
return getOutlineShape(state, world, pos, context);
|
||||||
}
|
}
|
||||||
@ -134,6 +131,7 @@ public class ReFramedPostFenceBlock extends WaterloggableReFramedDoubleBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public boolean canPathfindThrough(BlockState state, BlockView world, BlockPos pos, NavigationType type) {
|
public boolean canPathfindThrough(BlockState state, BlockView world, BlockPos pos, NavigationType type) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package fr.adrien1106.reframed.block;
|
package fr.adrien1106.reframed.block;
|
||||||
|
|
||||||
import fr.adrien1106.reframed.ReFramed;
|
import fr.adrien1106.reframed.ReFramed;
|
||||||
|
import fr.adrien1106.reframed.util.blocks.Edge;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.block.ShapeContext;
|
import net.minecraft.block.ShapeContext;
|
||||||
@ -18,8 +19,9 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import static net.minecraft.state.property.Properties.AXIS;
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE;
|
||||||
import static net.minecraft.state.property.Properties.FACING;
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE_FACE;
|
||||||
|
import static net.minecraft.state.property.Properties.*;
|
||||||
|
|
||||||
public class ReFramedSlabBlock extends WaterloggableReFramedBlock {
|
public class ReFramedSlabBlock extends WaterloggableReFramedBlock {
|
||||||
|
|
||||||
@ -41,21 +43,29 @@ public class ReFramedSlabBlock extends WaterloggableReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public boolean canReplace(BlockState state, ItemPlacementContext context) {
|
public boolean canReplace(BlockState state, ItemPlacementContext context) {
|
||||||
if (context.getPlayer() == null) return false;
|
if (context.getPlayer() == null
|
||||||
return !(
|
|| context.getPlayer().isSneaking()
|
||||||
context.getPlayer().isSneaking()
|
|
||||||
|| !(context.getStack().getItem() instanceof BlockItem block_item)
|
|| !(context.getStack().getItem() instanceof BlockItem block_item)
|
||||||
|| !(
|
) return false;
|
||||||
block_item.getBlock() == this
|
|
||||||
&& ((ReFramedSlabsCubeBlock) ReFramed.SLABS_CUBE)
|
// allow replacing with slab, step, small cube and half stair
|
||||||
|
Block block = block_item.getBlock();
|
||||||
|
if (block != this
|
||||||
|
&& block != ReFramed.STEP
|
||||||
|
&& block != ReFramed.SMALL_CUBE
|
||||||
|
&& block != ReFramed.HALF_STAIR
|
||||||
|
&& block != ReFramed.HALF_LAYER
|
||||||
|
) return false;
|
||||||
|
|
||||||
|
// check if the player is clicking on the inner part of the block
|
||||||
|
return ReFramed.SLABS_CUBE
|
||||||
.matchesShape(
|
.matchesShape(
|
||||||
context.getHitPos(),
|
context.getHitPos(),
|
||||||
context.getBlockPos(),
|
context.getBlockPos(),
|
||||||
ReFramed.SLABS_CUBE.getDefaultState().with(AXIS, state.get(FACING).getAxis()),
|
ReFramed.SLABS_CUBE.getDefaultState().with(AXIS, state.get(FACING).getAxis()),
|
||||||
state.get(FACING).getDirection() == Direction.AxisDirection.POSITIVE ? 1 : 2
|
state.get(FACING).getDirection() == Direction.AxisDirection.POSITIVE ? 1 : 2
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,24 +73,39 @@ public class ReFramedSlabBlock extends WaterloggableReFramedBlock {
|
|||||||
@Override
|
@Override
|
||||||
public BlockState getPlacementState(ItemPlacementContext ctx) {
|
public BlockState getPlacementState(ItemPlacementContext ctx) {
|
||||||
BlockState current_state = ctx.getWorld().getBlockState(ctx.getBlockPos());
|
BlockState current_state = ctx.getWorld().getBlockState(ctx.getBlockPos());
|
||||||
|
|
||||||
if (current_state.isOf(this))
|
if (current_state.isOf(this))
|
||||||
return ReFramed.SLABS_CUBE.getDefaultState()
|
return ReFramed.SLABS_CUBE.getDefaultState()
|
||||||
.with(AXIS, current_state.get(FACING).getAxis());
|
.with(AXIS, current_state.get(FACING).getAxis());
|
||||||
|
|
||||||
|
if (current_state.isOf(ReFramed.HALF_LAYER)) {
|
||||||
|
Edge edge = current_state.get(EDGE);
|
||||||
|
Direction face = edge.getDirection(current_state.get(EDGE_FACE));
|
||||||
|
edge = edge.getOpposite(face);
|
||||||
|
return ReFramed.SLABS_HALF_LAYER.getDefaultState()
|
||||||
|
.with(EDGE, edge)
|
||||||
|
.with(EDGE_FACE, edge.getDirectionIndex(edge.getOtherDirection(face)))
|
||||||
|
.with(LAYERS, current_state.get(LAYERS))
|
||||||
|
.with(WATERLOGGED, current_state.get(WATERLOGGED));
|
||||||
|
}
|
||||||
|
|
||||||
return super.getPlacementState(ctx).with(FACING, ctx.getSide().getOpposite());
|
return super.getPlacementState(ctx).with(FACING, ctx.getSide().getOpposite());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
||||||
return getSlabShape(state.get(FACING));
|
return getSlabShape(state.get(FACING));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
||||||
return state.with(FACING, rotation.rotate(state.get(FACING)));
|
return state.with(FACING, rotation.rotate(state.get(FACING)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
||||||
return state.with(FACING, mirror.apply(state.get(FACING)));
|
return state.with(FACING, mirror.apply(state.get(FACING)));
|
||||||
}
|
}
|
||||||
@ -98,6 +123,11 @@ public class ReFramedSlabBlock extends WaterloggableReFramedBlock {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<Integer, Integer> getThemeMap(BlockState state, BlockState new_state) {
|
public Map<Integer, Integer> getThemeMap(BlockState state, BlockState new_state) {
|
||||||
|
if (new_state.isOf(ReFramed.SLABS_STAIR)
|
||||||
|
|| new_state.isOf(ReFramed.SLABS_OUTER_STAIR)
|
||||||
|
|| new_state.isOf(ReFramed.SLABS_INNER_STAIR)
|
||||||
|
|| new_state.isOf(ReFramed.SLABS_HALF_LAYER)
|
||||||
|
) return Map.of(1, 1);
|
||||||
if (new_state.isOf(ReFramed.SLABS_CUBE)) return Map.of(1, state.get(FACING).getDirection() == Direction.AxisDirection.POSITIVE ? 2 : 1);
|
if (new_state.isOf(ReFramed.SLABS_CUBE)) return Map.of(1, state.get(FACING).getDirection() == Direction.AxisDirection.POSITIVE ? 2 : 1);
|
||||||
return super.getThemeMap(state, new_state);
|
return super.getThemeMap(state, new_state);
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,6 @@ import net.minecraft.util.shape.VoxelShape;
|
|||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import static fr.adrien1106.reframed.block.ReFramedSlabBlock.*;
|
import static fr.adrien1106.reframed.block.ReFramedSlabBlock.*;
|
||||||
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE;
|
|
||||||
import static net.minecraft.state.property.Properties.AXIS;
|
import static net.minecraft.state.property.Properties.AXIS;
|
||||||
|
|
||||||
public class ReFramedSlabsCubeBlock extends ReFramedDoubleBlock {
|
public class ReFramedSlabsCubeBlock extends ReFramedDoubleBlock {
|
||||||
@ -33,11 +32,13 @@ public class ReFramedSlabsCubeBlock extends ReFramedDoubleBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
||||||
return state.with(AXIS, rotation.rotate(Direction.get(Direction.AxisDirection.POSITIVE, state.get(AXIS))).getAxis());
|
return state.with(AXIS, rotation.rotate(Direction.get(Direction.AxisDirection.POSITIVE, state.get(AXIS))).getAxis());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
||||||
return state.with(AXIS, mirror.apply(Direction.get(Direction.AxisDirection.POSITIVE, state.get(AXIS))).getAxis());
|
return state.with(AXIS, mirror.apply(Direction.get(Direction.AxisDirection.POSITIVE, state.get(AXIS))).getAxis());
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,62 @@
|
|||||||
|
package fr.adrien1106.reframed.block;
|
||||||
|
|
||||||
|
import fr.adrien1106.reframed.util.blocks.Edge;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.ShapeContext;
|
||||||
|
import net.minecraft.util.function.BooleanBiFunction;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.Direction;
|
||||||
|
import net.minecraft.util.shape.VoxelShape;
|
||||||
|
import net.minecraft.util.shape.VoxelShapes;
|
||||||
|
import net.minecraft.world.BlockView;
|
||||||
|
|
||||||
|
import static fr.adrien1106.reframed.block.ReFramedHalfLayerBlock.getHalfLayerShape;
|
||||||
|
import static fr.adrien1106.reframed.block.ReFramedSlabBlock.getSlabShape;
|
||||||
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE;
|
||||||
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE_FACE;
|
||||||
|
import static net.minecraft.state.property.Properties.LAYERS;
|
||||||
|
|
||||||
|
public class ReFramedSlabsHalfLayerBlock extends HalfLayerDoubleReFramedBlock {
|
||||||
|
|
||||||
|
private static final VoxelShape[] SLABS_HALF_LAYER_VOXELS = new VoxelShape[196];
|
||||||
|
|
||||||
|
public ReFramedSlabsHalfLayerBlock(Settings settings) {
|
||||||
|
super(settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
||||||
|
return getSlabsHalfLayerShape(state.get(EDGE), state.get(EDGE_FACE), state.get(LAYERS));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static VoxelShape getSlabsHalfLayerShape(Edge edge, int face, int layers) {
|
||||||
|
int i = edge.ordinal() * 16 + face * 8 + layers - 1;
|
||||||
|
VoxelShape shape = SLABS_HALF_LAYER_VOXELS[i];
|
||||||
|
if (shape == null) {
|
||||||
|
shape = VoxelShapes.combineAndSimplify(
|
||||||
|
getShape(edge, edge.getDirection(face), layers, 1),
|
||||||
|
getShape(edge, edge.getDirection(face), layers, 2),
|
||||||
|
BooleanBiFunction.OR
|
||||||
|
);
|
||||||
|
SLABS_HALF_LAYER_VOXELS[i] = shape;
|
||||||
|
}
|
||||||
|
return shape;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public VoxelShape getShape(BlockState state, int i) {
|
||||||
|
Edge edge = state.get(EDGE);
|
||||||
|
Direction face = edge.getDirection(state.get(EDGE_FACE));
|
||||||
|
return getShape(edge, face, state.get(LAYERS), i);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static VoxelShape getShape(Edge edge, Direction face, int layers, int i) {
|
||||||
|
if (i == 2) {
|
||||||
|
face = edge.getOtherDirection(face);
|
||||||
|
edge = edge.getOpposite(face);
|
||||||
|
}
|
||||||
|
return i == 2
|
||||||
|
? getHalfLayerShape(edge, edge.getDirectionIndex(face), layers)
|
||||||
|
: getSlabShape(face);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,48 @@
|
|||||||
|
package fr.adrien1106.reframed.block;
|
||||||
|
|
||||||
|
import fr.adrien1106.reframed.util.blocks.Corner;
|
||||||
|
import fr.adrien1106.reframed.util.blocks.Edge;
|
||||||
|
import fr.adrien1106.reframed.util.blocks.StairShape;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.ShapeContext;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.Direction;
|
||||||
|
import net.minecraft.util.shape.VoxelShape;
|
||||||
|
import net.minecraft.world.BlockView;
|
||||||
|
|
||||||
|
import static fr.adrien1106.reframed.block.ReFramedHalfStairBlock.getHalfStairShape;
|
||||||
|
import static fr.adrien1106.reframed.block.ReFramedSlabBlock.getSlabShape;
|
||||||
|
import static fr.adrien1106.reframed.block.ReFramedStairBlock.getStairShape;
|
||||||
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.CORNER;
|
||||||
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.CORNER_FACE;
|
||||||
|
|
||||||
|
public class ReFramedSlabsInnerStairBlock extends CornerDoubleReFramedBlock {
|
||||||
|
|
||||||
|
public ReFramedSlabsInnerStairBlock(Settings settings) {
|
||||||
|
super(settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
||||||
|
Corner corner = state.get(CORNER);
|
||||||
|
Direction face = corner.getDirection(state.get(CORNER_FACE));
|
||||||
|
Edge edge = corner.getEdge(face);
|
||||||
|
return getStairShape(
|
||||||
|
edge,
|
||||||
|
face.getDirection() == Direction.AxisDirection.POSITIVE
|
||||||
|
? StairShape.INNER_LEFT
|
||||||
|
: StairShape.INNER_RIGHT
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public VoxelShape getShape(BlockState state, int i) {
|
||||||
|
Corner corner = state.get(CORNER);
|
||||||
|
Direction face = corner.getDirection(state.get(CORNER_FACE));
|
||||||
|
if (i == 2) corner = corner.change(face);
|
||||||
|
return i == 2
|
||||||
|
? getHalfStairShape(corner, corner.getDirectionIndex(face.getOpposite()))
|
||||||
|
: getSlabShape(face);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,51 @@
|
|||||||
|
package fr.adrien1106.reframed.block;
|
||||||
|
|
||||||
|
import fr.adrien1106.reframed.util.blocks.Corner;
|
||||||
|
import fr.adrien1106.reframed.util.blocks.Edge;
|
||||||
|
import fr.adrien1106.reframed.util.blocks.StairShape;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.ShapeContext;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.Direction;
|
||||||
|
import net.minecraft.util.shape.VoxelShape;
|
||||||
|
import net.minecraft.world.BlockView;
|
||||||
|
|
||||||
|
import static fr.adrien1106.reframed.block.ReFramedSlabBlock.getSlabShape;
|
||||||
|
import static fr.adrien1106.reframed.block.ReFramedSmallCubeBlock.getSmallCubeShape;
|
||||||
|
import static fr.adrien1106.reframed.block.ReFramedStairBlock.getStairShape;
|
||||||
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.CORNER;
|
||||||
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.CORNER_FACE;
|
||||||
|
|
||||||
|
public class ReFramedSlabsOuterStairBlock extends CornerDoubleReFramedBlock {
|
||||||
|
|
||||||
|
public ReFramedSlabsOuterStairBlock(Settings settings) {
|
||||||
|
super(settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
||||||
|
Corner corner = state.get(CORNER);
|
||||||
|
Direction face = corner.getDirection(state.get(CORNER_FACE));
|
||||||
|
Edge edge = corner.getEdgeWith(face);
|
||||||
|
return getStairShape(
|
||||||
|
edge,
|
||||||
|
corner.getOtherDirection(edge).getDirection() == Direction.AxisDirection.POSITIVE
|
||||||
|
? edge.getDirectionIndex(face) == 1
|
||||||
|
? StairShape.FIRST_OUTER_LEFT
|
||||||
|
: StairShape.SECOND_OUTER_LEFT
|
||||||
|
: edge.getDirectionIndex(face) == 1
|
||||||
|
? StairShape.FIRST_OUTER_RIGHT
|
||||||
|
: StairShape.SECOND_OUTER_RIGHT
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public VoxelShape getShape(BlockState state, int i) {
|
||||||
|
Corner corner = state.get(CORNER);
|
||||||
|
Direction face = corner.getDirection(state.get(CORNER_FACE));
|
||||||
|
return i == 2
|
||||||
|
? getSmallCubeShape(corner.change(face))
|
||||||
|
: getSlabShape(face);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,51 +1,24 @@
|
|||||||
package fr.adrien1106.reframed.block;
|
package fr.adrien1106.reframed.block;
|
||||||
|
|
||||||
import fr.adrien1106.reframed.util.blocks.BlockHelper;
|
|
||||||
import fr.adrien1106.reframed.util.blocks.Edge;
|
import fr.adrien1106.reframed.util.blocks.Edge;
|
||||||
import fr.adrien1106.reframed.util.blocks.StairShape;
|
import fr.adrien1106.reframed.util.blocks.StairShape;
|
||||||
import net.minecraft.block.Block;
|
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.block.ShapeContext;
|
import net.minecraft.block.ShapeContext;
|
||||||
import net.minecraft.item.ItemPlacementContext;
|
|
||||||
import net.minecraft.state.StateManager;
|
|
||||||
import net.minecraft.util.BlockMirror;
|
|
||||||
import net.minecraft.util.BlockRotation;
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.Direction;
|
import net.minecraft.util.math.Direction;
|
||||||
import net.minecraft.util.shape.VoxelShape;
|
import net.minecraft.util.shape.VoxelShape;
|
||||||
import net.minecraft.world.BlockView;
|
import net.minecraft.world.BlockView;
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import static fr.adrien1106.reframed.block.ReFramedSlabBlock.getSlabShape;
|
import static fr.adrien1106.reframed.block.ReFramedSlabBlock.getSlabShape;
|
||||||
import static fr.adrien1106.reframed.block.ReFramedStairBlock.getStairShape;
|
import static fr.adrien1106.reframed.block.ReFramedStairBlock.getStairShape;
|
||||||
import static fr.adrien1106.reframed.block.ReFramedStepBlock.getStepShape;
|
import static fr.adrien1106.reframed.block.ReFramedStepBlock.getStepShape;
|
||||||
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE;
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE;
|
||||||
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE_FACE;
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE_FACE;
|
||||||
import static net.minecraft.util.shape.VoxelShapes.empty;
|
|
||||||
|
|
||||||
public class ReFramedSlabsStairBlock extends WaterloggableReFramedDoubleBlock {
|
public class ReFramedSlabsStairBlock extends EdgeDoubleReFramedBlock {
|
||||||
|
|
||||||
public ReFramedSlabsStairBlock(Settings settings) {
|
public ReFramedSlabsStairBlock(Settings settings) {
|
||||||
super(settings);
|
super(settings);
|
||||||
setDefaultState(getDefaultState().with(EDGE, Edge.NORTH_DOWN).with(EDGE_FACE, 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
|
|
||||||
super.appendProperties(builder.add(EDGE, EDGE_FACE));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @Nullable BlockState getPlacementState(ItemPlacementContext ctx) {
|
|
||||||
Edge edge = BlockHelper.getPlacementEdge(ctx);
|
|
||||||
return super.getPlacementState(ctx)
|
|
||||||
.with(EDGE, edge)
|
|
||||||
.with(EDGE_FACE, edge.getDirectionIndex(ctx.getSide().getOpposite()));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) {
|
|
||||||
return isGhost(view, pos) ? empty() : getOutlineShape(state, view, pos, ctx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -53,20 +26,6 @@ public class ReFramedSlabsStairBlock extends WaterloggableReFramedDoubleBlock {
|
|||||||
return getStairShape(state.get(EDGE), StairShape.STRAIGHT);
|
return getStairShape(state.get(EDGE), StairShape.STRAIGHT);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
|
||||||
Edge edge = state.get(EDGE).rotate(rotation);
|
|
||||||
Direction face = state.get(EDGE).getDirection(state.get(EDGE_FACE));
|
|
||||||
return state.with(EDGE, edge).with(EDGE_FACE, edge.getDirectionIndex(rotation.rotate(face)));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
|
||||||
Edge edge = state.get(EDGE).mirror(mirror);
|
|
||||||
Direction face = state.get(EDGE).getDirection(state.get(EDGE_FACE));
|
|
||||||
return state.with(EDGE, edge).with(EDGE_FACE, edge.getDirectionIndex(mirror.apply(face)));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VoxelShape getShape(BlockState state, int i) {
|
public VoxelShape getShape(BlockState state, int i) {
|
||||||
Edge edge = state.get(EDGE);
|
Edge edge = state.get(EDGE);
|
||||||
|
@ -25,6 +25,7 @@ import java.util.Map;
|
|||||||
import static fr.adrien1106.reframed.util.VoxelHelper.VoxelListBuilder;
|
import static fr.adrien1106.reframed.util.VoxelHelper.VoxelListBuilder;
|
||||||
import static fr.adrien1106.reframed.util.blocks.BlockProperties.*;
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.*;
|
||||||
import static fr.adrien1106.reframed.util.blocks.Corner.*;
|
import static fr.adrien1106.reframed.util.blocks.Corner.*;
|
||||||
|
import static net.minecraft.state.property.Properties.FACING;
|
||||||
import static net.minecraft.state.property.Properties.WATERLOGGED;
|
import static net.minecraft.state.property.Properties.WATERLOGGED;
|
||||||
|
|
||||||
public class ReFramedSmallCubeBlock extends WaterloggableReFramedBlock {
|
public class ReFramedSmallCubeBlock extends WaterloggableReFramedBlock {
|
||||||
@ -42,6 +43,7 @@ public class ReFramedSmallCubeBlock extends WaterloggableReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public boolean canReplace(BlockState state, ItemPlacementContext context) {
|
public boolean canReplace(BlockState state, ItemPlacementContext context) {
|
||||||
if (context.getPlayer() == null) return false;
|
if (context.getPlayer() == null) return false;
|
||||||
Corner corner = state.get(CORNER);
|
Corner corner = state.get(CORNER);
|
||||||
@ -63,21 +65,21 @@ public class ReFramedSmallCubeBlock extends WaterloggableReFramedBlock {
|
|||||||
&& !(
|
&& !(
|
||||||
block_item.getBlock() == this
|
block_item.getBlock() == this
|
||||||
&& (
|
&& (
|
||||||
((ReFramedSmallCubesStepBlock) ReFramed.SMALL_CUBES_STEP)
|
ReFramed.SMALL_CUBES_STEP
|
||||||
.matchesShape(
|
.matchesShape(
|
||||||
context.getHitPos(),
|
context.getHitPos(),
|
||||||
context.getBlockPos(),
|
context.getBlockPos(),
|
||||||
ReFramed.SMALL_CUBES_STEP.getDefaultState().with(EDGE, corner.getEdge(corner.getFirstDirection())),
|
ReFramed.SMALL_CUBES_STEP.getDefaultState().with(EDGE, corner.getEdge(corner.getFirstDirection())),
|
||||||
corner.getFirstDirection().getDirection() == Direction.AxisDirection.POSITIVE ? 1 : 2
|
corner.getFirstDirection().getDirection() == Direction.AxisDirection.POSITIVE ? 1 : 2
|
||||||
)
|
)
|
||||||
|| ((ReFramedSmallCubesStepBlock) ReFramed.SMALL_CUBES_STEP)
|
|| ReFramed.SMALL_CUBES_STEP
|
||||||
.matchesShape(
|
.matchesShape(
|
||||||
context.getHitPos(),
|
context.getHitPos(),
|
||||||
context.getBlockPos(),
|
context.getBlockPos(),
|
||||||
ReFramed.SMALL_CUBES_STEP.getDefaultState().with(EDGE, corner.getEdge(corner.getSecondDirection())),
|
ReFramed.SMALL_CUBES_STEP.getDefaultState().with(EDGE, corner.getEdge(corner.getSecondDirection())),
|
||||||
corner.getSecondDirection().getDirection() == Direction.AxisDirection.POSITIVE ? 1 : 2
|
corner.getSecondDirection().getDirection() == Direction.AxisDirection.POSITIVE ? 1 : 2
|
||||||
)
|
)
|
||||||
|| ((ReFramedSmallCubesStepBlock) ReFramed.SMALL_CUBES_STEP)
|
|| ReFramed.SMALL_CUBES_STEP
|
||||||
.matchesShape(
|
.matchesShape(
|
||||||
context.getHitPos(),
|
context.getHitPos(),
|
||||||
context.getBlockPos(),
|
context.getBlockPos(),
|
||||||
@ -94,12 +96,20 @@ public class ReFramedSmallCubeBlock extends WaterloggableReFramedBlock {
|
|||||||
public @Nullable BlockState getPlacementState(ItemPlacementContext ctx) {
|
public @Nullable BlockState getPlacementState(ItemPlacementContext ctx) {
|
||||||
BlockPos pos = ctx.getBlockPos();
|
BlockPos pos = ctx.getBlockPos();
|
||||||
BlockState current_state = ctx.getWorld().getBlockState(pos);
|
BlockState current_state = ctx.getWorld().getBlockState(pos);
|
||||||
if (current_state.isOf(ReFramed.HALF_STAIR))
|
|
||||||
return ReFramed.HALF_STAIRS_SLAB.getDefaultState()
|
if (current_state.isOf(ReFramed.HALF_STAIR)) {
|
||||||
|
BlockState new_state;
|
||||||
|
Direction face = current_state.get(CORNER).getDirection(current_state.get(CORNER_FACE));
|
||||||
|
if (matchesShape(
|
||||||
|
ctx.getHitPos(), pos,
|
||||||
|
getDefaultState().with(CORNER, current_state.get(CORNER).change(face))
|
||||||
|
)) new_state = ReFramed.HALF_STAIRS_CUBE_STAIR.getDefaultState();
|
||||||
|
else new_state = ReFramed.HALF_STAIRS_SLAB.getDefaultState();
|
||||||
|
return new_state
|
||||||
.with(CORNER, current_state.get(CORNER))
|
.with(CORNER, current_state.get(CORNER))
|
||||||
.with(CORNER_FACE, current_state.get(CORNER_FACE))
|
.with(CORNER_FACE, current_state.get(CORNER_FACE))
|
||||||
.with(WATERLOGGED, current_state.get(WATERLOGGED));
|
.with(WATERLOGGED, current_state.get(WATERLOGGED));
|
||||||
|
}
|
||||||
|
|
||||||
if (current_state.isOf(this)) {
|
if (current_state.isOf(this)) {
|
||||||
Vec3d hit = ctx.getHitPos();
|
Vec3d hit = ctx.getHitPos();
|
||||||
@ -120,20 +130,33 @@ public class ReFramedSmallCubeBlock extends WaterloggableReFramedBlock {
|
|||||||
return state.with(EDGE, corner.getEdge(corner.getThirdDirection()));
|
return state.with(EDGE, corner.getEdge(corner.getThirdDirection()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (current_state.isOf(ReFramed.SLAB)) {
|
||||||
|
Corner corner = BlockHelper.getPlacementCorner(ctx);
|
||||||
|
Direction face = current_state.get(FACING);
|
||||||
|
if (!corner.hasDirection(face)) corner = corner.change(face.getOpposite());
|
||||||
|
return ReFramed.SLABS_OUTER_STAIR.getDefaultState()
|
||||||
|
.with(CORNER, corner)
|
||||||
|
.with(CORNER_FACE, corner.getDirectionIndex(face))
|
||||||
|
.with(WATERLOGGED, current_state.get(WATERLOGGED));
|
||||||
|
}
|
||||||
|
|
||||||
return super.getPlacementState(ctx).with(CORNER, BlockHelper.getPlacementCorner(ctx));
|
return super.getPlacementState(ctx).with(CORNER, BlockHelper.getPlacementCorner(ctx));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
||||||
return getSmallCubeShape(state.get(CORNER));
|
return getSmallCubeShape(state.get(CORNER));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
||||||
return state.with(CORNER, state.get(CORNER).rotate(rotation));
|
return state.with(CORNER, state.get(CORNER).rotate(rotation));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
||||||
return state.with(CORNER, state.get(CORNER).mirror(mirror));
|
return state.with(CORNER, state.get(CORNER).mirror(mirror));
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,6 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
import static fr.adrien1106.reframed.block.ReFramedSmallCubeBlock.SMALL_CUBE_VOXELS;
|
import static fr.adrien1106.reframed.block.ReFramedSmallCubeBlock.SMALL_CUBE_VOXELS;
|
||||||
import static fr.adrien1106.reframed.block.ReFramedStepBlock.getStepShape;
|
import static fr.adrien1106.reframed.block.ReFramedStepBlock.getStepShape;
|
||||||
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE;
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE;
|
||||||
import static net.minecraft.util.shape.VoxelShapes.empty;
|
|
||||||
|
|
||||||
public class ReFramedSmallCubesStepBlock extends WaterloggableReFramedDoubleBlock {
|
public class ReFramedSmallCubesStepBlock extends WaterloggableReFramedDoubleBlock {
|
||||||
|
|
||||||
@ -39,21 +38,19 @@ public class ReFramedSmallCubesStepBlock extends WaterloggableReFramedDoubleBloc
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) {
|
@SuppressWarnings("deprecation")
|
||||||
return isGhost(view, pos) ? empty(): getStepShape(state.get(EDGE));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
||||||
return getStepShape(state.get(EDGE));
|
return getStepShape(state.get(EDGE));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
||||||
return state.with(EDGE, state.get(EDGE).rotate(rotation));
|
return state.with(EDGE, state.get(EDGE).rotate(rotation));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
||||||
return state.with(EDGE, state.get(EDGE).mirror(mirror));
|
return state.with(EDGE, state.get(EDGE).mirror(mirror));
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,6 @@ import net.minecraft.util.math.Direction;
|
|||||||
import net.minecraft.util.shape.VoxelShape;
|
import net.minecraft.util.shape.VoxelShape;
|
||||||
import net.minecraft.util.shape.VoxelShapes;
|
import net.minecraft.util.shape.VoxelShapes;
|
||||||
import net.minecraft.world.BlockView;
|
import net.minecraft.world.BlockView;
|
||||||
import net.minecraft.world.World;
|
|
||||||
import net.minecraft.world.WorldAccess;
|
import net.minecraft.world.WorldAccess;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
@ -45,6 +44,7 @@ public class ReFramedStairBlock extends WaterloggableReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public boolean canReplace(BlockState state, ItemPlacementContext context) {
|
public boolean canReplace(BlockState state, ItemPlacementContext context) {
|
||||||
if (context.getPlayer() == null) return false;
|
if (context.getPlayer() == null) return false;
|
||||||
return !(
|
return !(
|
||||||
@ -52,7 +52,7 @@ public class ReFramedStairBlock extends WaterloggableReFramedBlock {
|
|||||||
|| !(context.getStack().getItem() instanceof BlockItem block_item)
|
|| !(context.getStack().getItem() instanceof BlockItem block_item)
|
||||||
|| !(
|
|| !(
|
||||||
block_item.getBlock() == ReFramed.STEP
|
block_item.getBlock() == ReFramed.STEP
|
||||||
&& ((ReFramedStairsCubeBlock) ReFramed.STAIRS_CUBE)
|
&& ReFramed.STAIRS_CUBE
|
||||||
.matchesShape(
|
.matchesShape(
|
||||||
context.getHitPos(),
|
context.getHitPos(),
|
||||||
context.getBlockPos(),
|
context.getBlockPos(),
|
||||||
@ -87,18 +87,13 @@ public class ReFramedStairBlock extends WaterloggableReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState new_state, boolean moved) {
|
@SuppressWarnings("deprecation")
|
||||||
super.onStateReplaced(state, world, pos, new_state, moved);
|
|
||||||
|
|
||||||
if(!state.isOf(new_state.getBlock())) world.removeBlockEntity(pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
||||||
return getStairShape(state.get(EDGE), state.get(STAIR_SHAPE));
|
return getStairShape(state.get(EDGE), state.get(STAIR_SHAPE));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
||||||
Edge prev_edge = state.get(EDGE);
|
Edge prev_edge = state.get(EDGE);
|
||||||
Edge edge = prev_edge.rotate(rotation);
|
Edge edge = prev_edge.rotate(rotation);
|
||||||
@ -115,6 +110,7 @@ public class ReFramedStairBlock extends WaterloggableReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
||||||
Edge prev_edge = state.get(EDGE);
|
Edge prev_edge = state.get(EDGE);
|
||||||
Edge edge = prev_edge.mirror(mirror);
|
Edge edge = prev_edge.mirror(mirror);
|
||||||
|
@ -12,7 +12,6 @@ import net.minecraft.util.BlockRotation;
|
|||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.Direction;
|
import net.minecraft.util.math.Direction;
|
||||||
import net.minecraft.util.shape.VoxelShape;
|
import net.minecraft.util.shape.VoxelShape;
|
||||||
import net.minecraft.world.World;
|
|
||||||
import net.minecraft.world.WorldAccess;
|
import net.minecraft.world.WorldAccess;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
@ -36,6 +35,7 @@ public class ReFramedStairsCubeBlock extends ReFramedDoubleBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState neighbor_state, WorldAccess world, BlockPos pos, BlockPos moved) {
|
public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState neighbor_state, WorldAccess world, BlockPos pos, BlockPos moved) {
|
||||||
return super.getStateForNeighborUpdate(state, direction, neighbor_state, world, pos, moved)
|
return super.getStateForNeighborUpdate(state, direction, neighbor_state, world, pos, moved)
|
||||||
.with(STAIR_SHAPE, BlockHelper.getStairsShape(state.get(EDGE), world, pos));
|
.with(STAIR_SHAPE, BlockHelper.getStairsShape(state.get(EDGE), world, pos));
|
||||||
@ -52,6 +52,7 @@ public class ReFramedStairsCubeBlock extends ReFramedDoubleBlock {
|
|||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
||||||
Edge prev_edge = state.get(EDGE);
|
Edge prev_edge = state.get(EDGE);
|
||||||
Edge edge = prev_edge.rotate(rotation);
|
Edge edge = prev_edge.rotate(rotation);
|
||||||
@ -68,6 +69,7 @@ public class ReFramedStairsCubeBlock extends ReFramedDoubleBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
||||||
Edge prev_edge = state.get(EDGE);
|
Edge prev_edge = state.get(EDGE);
|
||||||
Edge edge = prev_edge.mirror(mirror);
|
Edge edge = prev_edge.mirror(mirror);
|
||||||
@ -76,13 +78,6 @@ public class ReFramedStairsCubeBlock extends ReFramedDoubleBlock {
|
|||||||
.with(EDGE, edge);
|
.with(EDGE, edge);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState new_state, boolean moved) {
|
|
||||||
super.onStateReplaced(state, world, pos, new_state, moved);
|
|
||||||
|
|
||||||
if(!state.isOf(new_state.getBlock())) world.removeBlockEntity(pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VoxelShape getShape(BlockState state, int i) {
|
public VoxelShape getShape(BlockState state, int i) {
|
||||||
Edge edge = state.get(EDGE);
|
Edge edge = state.get(EDGE);
|
||||||
|
@ -3,6 +3,7 @@ package fr.adrien1106.reframed.block;
|
|||||||
import fr.adrien1106.reframed.ReFramed;
|
import fr.adrien1106.reframed.ReFramed;
|
||||||
import fr.adrien1106.reframed.util.VoxelHelper;
|
import fr.adrien1106.reframed.util.VoxelHelper;
|
||||||
import fr.adrien1106.reframed.util.blocks.BlockHelper;
|
import fr.adrien1106.reframed.util.blocks.BlockHelper;
|
||||||
|
import fr.adrien1106.reframed.util.blocks.Corner;
|
||||||
import fr.adrien1106.reframed.util.blocks.Edge;
|
import fr.adrien1106.reframed.util.blocks.Edge;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
@ -22,10 +23,9 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import static fr.adrien1106.reframed.util.VoxelHelper.VoxelListBuilder;
|
import static fr.adrien1106.reframed.util.VoxelHelper.VoxelListBuilder;
|
||||||
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE;
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.*;
|
||||||
import static fr.adrien1106.reframed.util.blocks.BlockProperties.STAIR_SHAPE;
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.STAIR_SHAPE;
|
||||||
import static net.minecraft.state.property.Properties.*;
|
import static net.minecraft.state.property.Properties.*;
|
||||||
import static net.minecraft.state.property.Properties.WATERLOGGED;
|
|
||||||
|
|
||||||
public class ReFramedStepBlock extends WaterloggableReFramedBlock {
|
public class ReFramedStepBlock extends WaterloggableReFramedBlock {
|
||||||
|
|
||||||
@ -42,48 +42,34 @@ public class ReFramedStepBlock extends WaterloggableReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public boolean canReplace(BlockState state, ItemPlacementContext context) {
|
public boolean canReplace(BlockState state, ItemPlacementContext context) {
|
||||||
if (context.getPlayer() == null) return false;
|
if (context.getPlayer() == null
|
||||||
Edge edge = state.get(EDGE);
|
|| context.getPlayer().isSneaking()
|
||||||
return !(
|
|
||||||
context.getPlayer().isSneaking()
|
|
||||||
|| !(context.getStack().getItem() instanceof BlockItem block_item)
|
|| !(context.getStack().getItem() instanceof BlockItem block_item)
|
||||||
|| (
|
) return false;
|
||||||
!(
|
|
||||||
block_item.getBlock() == ReFramed.STAIR
|
|
||||||
&& ((ReFramedStairsCubeBlock) ReFramed.STAIRS_CUBE)
|
|
||||||
.matchesShape(
|
|
||||||
context.getHitPos(),
|
|
||||||
context.getBlockPos(),
|
|
||||||
ReFramed.STAIRS_CUBE.getDefaultState().with(EDGE, edge.opposite()),
|
|
||||||
1
|
|
||||||
)
|
|
||||||
|
|
||||||
)
|
Block block = block_item.getBlock();
|
||||||
&& !(
|
Edge edge = state.get(EDGE);
|
||||||
block_item.getBlock() == this
|
if (block == ReFramed.HALF_LAYER)
|
||||||
&& (
|
return matchesShape(
|
||||||
((ReFramedStepsSlabBlock) ReFramed.STEPS_SLAB)
|
context.getHitPos(),
|
||||||
|
context.getBlockPos(),
|
||||||
|
getDefaultState().with(EDGE, edge.getOpposite(edge.getFirstDirection()))
|
||||||
|
) || matchesShape(
|
||||||
|
context.getHitPos(),
|
||||||
|
context.getBlockPos(),
|
||||||
|
getDefaultState().with(EDGE, edge.getOpposite(edge.getSecondDirection()))
|
||||||
|
);
|
||||||
|
|
||||||
|
// allow replacing with stair
|
||||||
|
if (block != this && block != ReFramed.STAIR) return false;
|
||||||
|
|
||||||
|
return ReFramed.STAIR
|
||||||
.matchesShape(
|
.matchesShape(
|
||||||
context.getHitPos(),
|
context.getHitPos(),
|
||||||
context.getBlockPos(),
|
context.getBlockPos(),
|
||||||
ReFramed.STEPS_SLAB.getDefaultState()
|
ReFramed.STAIRS_CUBE.getDefaultState().with(EDGE, edge.opposite())
|
||||||
.with(FACING, edge.getFirstDirection())
|
|
||||||
.with(AXIS, edge.getSecondDirection().getAxis()),
|
|
||||||
edge.getSecondDirection().getDirection() == Direction.AxisDirection.POSITIVE ? 1 : 2
|
|
||||||
)
|
|
||||||
|| ((ReFramedStepsSlabBlock) ReFramed.STEPS_SLAB)
|
|
||||||
.matchesShape(
|
|
||||||
context.getHitPos(),
|
|
||||||
context.getBlockPos(),
|
|
||||||
ReFramed.STEPS_SLAB.getDefaultState()
|
|
||||||
.with(FACING, edge.getSecondDirection())
|
|
||||||
.with(AXIS, edge.getFirstDirection().getAxis()),
|
|
||||||
edge.getFirstDirection().getDirection() == Direction.AxisDirection.POSITIVE ? 1 : 2
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,6 +78,7 @@ public class ReFramedStepBlock extends WaterloggableReFramedBlock {
|
|||||||
public BlockState getPlacementState(ItemPlacementContext ctx) {
|
public BlockState getPlacementState(ItemPlacementContext ctx) {
|
||||||
BlockPos pos = ctx.getBlockPos();
|
BlockPos pos = ctx.getBlockPos();
|
||||||
BlockState current_state = ctx.getWorld().getBlockState(pos);
|
BlockState current_state = ctx.getWorld().getBlockState(pos);
|
||||||
|
|
||||||
if (current_state.isOf(ReFramed.STAIR))
|
if (current_state.isOf(ReFramed.STAIR))
|
||||||
return ReFramed.STAIRS_CUBE.getDefaultState()
|
return ReFramed.STAIRS_CUBE.getDefaultState()
|
||||||
.with(EDGE, current_state.get(EDGE))
|
.with(EDGE, current_state.get(EDGE))
|
||||||
@ -101,39 +88,91 @@ public class ReFramedStepBlock extends WaterloggableReFramedBlock {
|
|||||||
if (current_state.isOf(this)) {
|
if (current_state.isOf(this)) {
|
||||||
Vec3d hit = ctx.getHitPos();
|
Vec3d hit = ctx.getHitPos();
|
||||||
Edge edge = current_state.get(EDGE);
|
Edge edge = current_state.get(EDGE);
|
||||||
Direction dir = edge.getFirstDirection();
|
|
||||||
ReFramedStepsSlabBlock block = ((ReFramedStepsSlabBlock) ReFramed.STEPS_SLAB);
|
// Steps Slab
|
||||||
BlockState state = block.getDefaultState()
|
if (matchesShape(hit, pos,
|
||||||
.with(FACING, dir)
|
current_state.with(EDGE, edge.getOpposite(edge.getFirstDirection()))
|
||||||
.with(AXIS, edge.getOtherDirection(dir).getAxis())
|
)) return ReFramed.STEPS_SLAB.getDefaultState()
|
||||||
|
.with(FACING, edge.getFirstDirection())
|
||||||
|
.with(AXIS, edge.getSecondDirection().getAxis())
|
||||||
|
.with(WATERLOGGED, current_state.get(WATERLOGGED));
|
||||||
|
|
||||||
|
else if (matchesShape(hit, pos,
|
||||||
|
current_state.with(EDGE, edge.getOpposite(edge.getSecondDirection()))
|
||||||
|
)) return ReFramed.STEPS_SLAB.getDefaultState()
|
||||||
|
.with(FACING, edge.getSecondDirection())
|
||||||
|
.with(AXIS, edge.getFirstDirection().getAxis())
|
||||||
|
.with(WATERLOGGED, current_state.get(WATERLOGGED));
|
||||||
|
|
||||||
|
// Steps Cross
|
||||||
|
return ReFramed.STEPS_CROSS.getDefaultState()
|
||||||
|
.with(EDGE, edge)
|
||||||
.with(WATERLOGGED, current_state.get(WATERLOGGED));
|
.with(WATERLOGGED, current_state.get(WATERLOGGED));
|
||||||
if (!block.matchesShape(
|
|
||||||
hit, pos,
|
|
||||||
state,
|
|
||||||
edge.getOtherDirection(dir).getDirection() == Direction.AxisDirection.POSITIVE ? 1 : 2
|
|
||||||
)) {
|
|
||||||
dir = edge.getSecondDirection();
|
|
||||||
state = state
|
|
||||||
.with(FACING, dir)
|
|
||||||
.with(AXIS, edge.getOtherDirection(dir).getAxis());
|
|
||||||
}
|
}
|
||||||
return state;
|
|
||||||
|
if (current_state.isOf(ReFramed.SLAB)) {
|
||||||
|
Direction facing = current_state.get(FACING);
|
||||||
|
Edge edge;
|
||||||
|
|
||||||
|
// Slabs Stair
|
||||||
|
if (ctx.getSide() == facing || ctx.getSide() == facing.getOpposite())
|
||||||
|
edge = BlockHelper.getPlacementEdge(ctx);
|
||||||
|
else
|
||||||
|
edge = Edge.getByDirections(facing, ctx.getSide().getOpposite());
|
||||||
|
return ReFramed.SLABS_STAIR.getDefaultState()
|
||||||
|
.with(EDGE, edge)
|
||||||
|
.with(EDGE_FACE, edge.getDirectionIndex(facing));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current_state.isOf(ReFramed.HALF_STAIR)) {
|
||||||
|
Corner corner = current_state.get(CORNER);
|
||||||
|
int face_index = current_state.get(CORNER_FACE), feature_index;
|
||||||
|
Direction face = corner.getDirection(current_state.get(CORNER_FACE));
|
||||||
|
Direction side = ctx.getSide().getOpposite();
|
||||||
|
|
||||||
|
if (side.getAxis() == face.getAxis())
|
||||||
|
side = BlockHelper.getPlacementEdge(ctx).getOtherDirection(face == side ? face : face.getOpposite());
|
||||||
|
|
||||||
|
if (side.getAxis() != face.getAxis() && !corner.hasDirection(side))
|
||||||
|
side = corner.getOtherDirection(Edge.getByDirections(face, side.getOpposite()));
|
||||||
|
|
||||||
|
feature_index = corner.getDirectionIndex(side);
|
||||||
|
return ReFramed.HALF_STAIRS_STEP_STAIR.getDefaultState()
|
||||||
|
.with(CORNER, corner)
|
||||||
|
.with(CORNER_FACE, face_index)
|
||||||
|
.with(CORNER_FEATURE, feature_index > face_index ? feature_index - 1 : feature_index)
|
||||||
|
.with(WATERLOGGED, current_state.get(WATERLOGGED));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current_state.isOf(ReFramed.HALF_LAYER)) {
|
||||||
|
Edge edge = current_state.get(EDGE);
|
||||||
|
Direction face = edge.getDirection(current_state.get(EDGE_FACE));
|
||||||
|
edge = edge.getOpposite(face);
|
||||||
|
return ReFramed.STEPS_HALF_LAYER.getDefaultState()
|
||||||
|
.with(EDGE, edge)
|
||||||
|
.with(EDGE_FACE, edge.getDirectionIndex(edge.getOtherDirection(face)))
|
||||||
|
.with(LAYERS, current_state.get(LAYERS))
|
||||||
|
.with(WATERLOGGED, current_state.get(WATERLOGGED));
|
||||||
}
|
}
|
||||||
|
|
||||||
return super.getPlacementState(ctx).with(EDGE, BlockHelper.getPlacementEdge(ctx));
|
return super.getPlacementState(ctx).with(EDGE, BlockHelper.getPlacementEdge(ctx));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
||||||
return getStepShape(state.get(EDGE));
|
return getStepShape(state.get(EDGE));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
||||||
return state.with(EDGE, state.get(EDGE).rotate(rotation));
|
return state.with(EDGE, state.get(EDGE).rotate(rotation));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
||||||
return state.with(EDGE, state.get(EDGE).mirror(mirror));
|
return state.with(EDGE, state.get(EDGE).mirror(mirror));
|
||||||
}
|
}
|
||||||
@ -144,6 +183,9 @@ public class ReFramedStepBlock extends WaterloggableReFramedBlock {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<Integer, Integer> getThemeMap(BlockState state, BlockState new_state) {
|
public Map<Integer, Integer> getThemeMap(BlockState state, BlockState new_state) {
|
||||||
|
if (new_state.isOf(ReFramed.STEPS_CROSS)
|
||||||
|
|| new_state.isOf(ReFramed.STEPS_HALF_LAYER)
|
||||||
|
) return Map.of(1, 1);
|
||||||
if (new_state.isOf(ReFramed.STAIRS_CUBE)) return Map.of(1, 2);
|
if (new_state.isOf(ReFramed.STAIRS_CUBE)) return Map.of(1, 2);
|
||||||
if (new_state.isOf(ReFramed.STEPS_SLAB))
|
if (new_state.isOf(ReFramed.STEPS_SLAB))
|
||||||
return Map.of(
|
return Map.of(
|
||||||
|
@ -0,0 +1,87 @@
|
|||||||
|
package fr.adrien1106.reframed.block;
|
||||||
|
|
||||||
|
import fr.adrien1106.reframed.util.VoxelHelper;
|
||||||
|
import fr.adrien1106.reframed.util.blocks.BlockHelper;
|
||||||
|
import fr.adrien1106.reframed.util.blocks.Edge;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.ShapeContext;
|
||||||
|
import net.minecraft.item.ItemPlacementContext;
|
||||||
|
import net.minecraft.state.StateManager;
|
||||||
|
import net.minecraft.util.BlockMirror;
|
||||||
|
import net.minecraft.util.BlockRotation;
|
||||||
|
import net.minecraft.util.function.BooleanBiFunction;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.shape.VoxelShape;
|
||||||
|
import net.minecraft.util.shape.VoxelShapes;
|
||||||
|
import net.minecraft.world.BlockView;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import static fr.adrien1106.reframed.block.ReFramedStepBlock.getStepShape;
|
||||||
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE;
|
||||||
|
|
||||||
|
public class ReFramedStepsCrossBlock extends WaterloggableReFramedDoubleBlock {
|
||||||
|
|
||||||
|
public static VoxelShape[] STEP_CROSS_VOXELS;
|
||||||
|
|
||||||
|
public ReFramedStepsCrossBlock(Settings settings) {
|
||||||
|
super(settings);
|
||||||
|
setDefaultState(getDefaultState().with(EDGE, Edge.NORTH_DOWN));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
|
||||||
|
super.appendProperties(builder.add(EDGE));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable BlockState getPlacementState(ItemPlacementContext ctx) {
|
||||||
|
Edge edge = BlockHelper.getPlacementCorner(ctx).getEdge(ctx.getSide().getOpposite());
|
||||||
|
return super.getPlacementState(ctx).with(EDGE, edge);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
||||||
|
return STEP_CROSS_VOXELS[state.get(EDGE).ordinal()];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
||||||
|
return state.with(EDGE, state.get(EDGE).rotate(rotation));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
||||||
|
return state.with(EDGE, state.get(EDGE).mirror(mirror));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public VoxelShape getShape(BlockState state, int i) {
|
||||||
|
// return getStepShape(i == 1 ? state.get(EDGE): state.get(EDGE).opposite());
|
||||||
|
return getOutlineShape(state, null, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
VoxelShape STEP_CROSS = VoxelShapes.combineAndSimplify(
|
||||||
|
getStepShape(Edge.NORTH_DOWN),
|
||||||
|
getStepShape(Edge.SOUTH_UP),
|
||||||
|
BooleanBiFunction.OR
|
||||||
|
);
|
||||||
|
STEP_CROSS_VOXELS = VoxelHelper.VoxelListBuilder.create(STEP_CROSS, 12)
|
||||||
|
.add(VoxelHelper::rotateX)
|
||||||
|
.add(VoxelHelper::rotateX)
|
||||||
|
.add(VoxelHelper::rotateX)
|
||||||
|
.add(0, VoxelHelper::rotateCY)
|
||||||
|
.add(VoxelHelper::rotateZ)
|
||||||
|
.add(VoxelHelper::rotateZ)
|
||||||
|
.add(VoxelHelper::rotateZ)
|
||||||
|
.add(0, VoxelHelper::rotateCZ)
|
||||||
|
.add(VoxelHelper::rotateY)
|
||||||
|
.add(VoxelHelper::rotateY)
|
||||||
|
.add(VoxelHelper::rotateY)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,62 @@
|
|||||||
|
package fr.adrien1106.reframed.block;
|
||||||
|
|
||||||
|
import fr.adrien1106.reframed.util.blocks.Edge;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.ShapeContext;
|
||||||
|
import net.minecraft.util.function.BooleanBiFunction;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.Direction;
|
||||||
|
import net.minecraft.util.shape.VoxelShape;
|
||||||
|
import net.minecraft.util.shape.VoxelShapes;
|
||||||
|
import net.minecraft.world.BlockView;
|
||||||
|
|
||||||
|
import static fr.adrien1106.reframed.block.ReFramedHalfLayerBlock.getHalfLayerShape;
|
||||||
|
import static fr.adrien1106.reframed.block.ReFramedStepBlock.getStepShape;
|
||||||
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE;
|
||||||
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE_FACE;
|
||||||
|
import static net.minecraft.state.property.Properties.LAYERS;
|
||||||
|
|
||||||
|
public class ReFramedStepsHalfLayerBlock extends HalfLayerDoubleReFramedBlock {
|
||||||
|
|
||||||
|
private static final VoxelShape[] SLABS_HALF_LAYER_VOXELS = new VoxelShape[196];
|
||||||
|
|
||||||
|
public ReFramedStepsHalfLayerBlock(Settings settings) {
|
||||||
|
super(settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
||||||
|
return getStepsHalfLayerShape(state.get(EDGE), state.get(EDGE_FACE), state.get(LAYERS));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static VoxelShape getStepsHalfLayerShape(Edge edge, int face, int layers) {
|
||||||
|
int i = edge.ordinal() * 16 + face * 8 + layers - 1;
|
||||||
|
VoxelShape shape = SLABS_HALF_LAYER_VOXELS[i];
|
||||||
|
if (shape == null) {
|
||||||
|
shape = VoxelShapes.combineAndSimplify(
|
||||||
|
getShape(edge, edge.getDirection(face), layers, 1),
|
||||||
|
getShape(edge, edge.getDirection(face), layers, 2),
|
||||||
|
BooleanBiFunction.OR
|
||||||
|
);
|
||||||
|
SLABS_HALF_LAYER_VOXELS[i] = shape;
|
||||||
|
}
|
||||||
|
return shape;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public VoxelShape getShape(BlockState state, int i) {
|
||||||
|
Edge edge = state.get(EDGE);
|
||||||
|
Direction face = edge.getDirection(state.get(EDGE_FACE));
|
||||||
|
return getShape(edge, face, state.get(LAYERS), i);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static VoxelShape getShape(Edge edge, Direction face, int layers, int i) {
|
||||||
|
if (i == 2) {
|
||||||
|
face = edge.getOtherDirection(face);
|
||||||
|
edge = edge.getOpposite(face);
|
||||||
|
}
|
||||||
|
return i == 2
|
||||||
|
? getHalfLayerShape(edge, edge.getDirectionIndex(face), layers)
|
||||||
|
: getStepShape(edge);
|
||||||
|
}
|
||||||
|
}
|
@ -21,7 +21,6 @@ import static fr.adrien1106.reframed.block.ReFramedSlabBlock.getSlabShape;
|
|||||||
import static fr.adrien1106.reframed.block.ReFramedStepBlock.getStepShape;
|
import static fr.adrien1106.reframed.block.ReFramedStepBlock.getStepShape;
|
||||||
import static net.minecraft.state.property.Properties.AXIS;
|
import static net.minecraft.state.property.Properties.AXIS;
|
||||||
import static net.minecraft.state.property.Properties.FACING;
|
import static net.minecraft.state.property.Properties.FACING;
|
||||||
import static net.minecraft.util.shape.VoxelShapes.empty;
|
|
||||||
|
|
||||||
public class ReFramedStepsSlabBlock extends WaterloggableReFramedDoubleBlock {
|
public class ReFramedStepsSlabBlock extends WaterloggableReFramedDoubleBlock {
|
||||||
|
|
||||||
@ -44,16 +43,13 @@ public class ReFramedStepsSlabBlock extends WaterloggableReFramedDoubleBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) {
|
@SuppressWarnings("deprecation")
|
||||||
return isGhost(view, pos) ? empty() : getSlabShape(state.get(FACING));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
||||||
return getSlabShape(state.get(FACING));
|
return getSlabShape(state.get(FACING));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
||||||
return state
|
return state
|
||||||
.with(AXIS, rotation.rotate(Direction.get(Direction.AxisDirection.POSITIVE, state.get(AXIS))).getAxis())
|
.with(AXIS, rotation.rotate(Direction.get(Direction.AxisDirection.POSITIVE, state.get(AXIS))).getAxis())
|
||||||
@ -61,6 +57,7 @@ public class ReFramedStepsSlabBlock extends WaterloggableReFramedDoubleBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
||||||
if (state.get(FACING).getAxis() != Axis.Y)
|
if (state.get(FACING).getAxis() != Axis.Y)
|
||||||
return state.with(FACING, mirror.apply(state.get(FACING)));
|
return state.with(FACING, mirror.apply(state.get(FACING)));
|
||||||
|
@ -48,6 +48,7 @@ public class ReFramedTrapdoorBlock extends WaterloggableReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public void neighborUpdate(BlockState state, World world, BlockPos pos, Block source, BlockPos sourcePos, boolean notify) {
|
public void neighborUpdate(BlockState state, World world, BlockPos pos, Block source, BlockPos sourcePos, boolean notify) {
|
||||||
if (world.isClient) return;
|
if (world.isClient) return;
|
||||||
boolean powered = world.isReceivingRedstonePower(pos);
|
boolean powered = world.isReceivingRedstonePower(pos);
|
||||||
@ -83,13 +84,6 @@ public class ReFramedTrapdoorBlock extends WaterloggableReFramedBlock {
|
|||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState new_state, boolean moved) {
|
|
||||||
super.onStateReplaced(state, world, pos, new_state, moved);
|
|
||||||
|
|
||||||
if(!state.isOf(new_state.getBlock())) world.removeBlockEntity(pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
|
public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
|
||||||
ActionResult result = super.onUse(state, world, pos, player, hand, hit);
|
ActionResult result = super.onUse(state, world, pos, player, hand, hit);
|
||||||
@ -99,6 +93,7 @@ public class ReFramedTrapdoorBlock extends WaterloggableReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public boolean canPathfindThrough(BlockState state, BlockView world, BlockPos pos, NavigationType type) {
|
public boolean canPathfindThrough(BlockState state, BlockView world, BlockPos pos, NavigationType type) {
|
||||||
return switch (type) {
|
return switch (type) {
|
||||||
case LAND, AIR -> state.get(OPEN);
|
case LAND, AIR -> state.get(OPEN);
|
||||||
@ -107,6 +102,7 @@ public class ReFramedTrapdoorBlock extends WaterloggableReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public void onExploded(BlockState state, World world, BlockPos pos, Explosion explosion, BiConsumer<ItemStack, BlockPos> stack_merger) {
|
public void onExploded(BlockState state, World world, BlockPos pos, Explosion explosion, BiConsumer<ItemStack, BlockPos> stack_merger) {
|
||||||
if (explosion.getDestructionType() == Explosion.DestructionType.TRIGGER_BLOCK
|
if (explosion.getDestructionType() == Explosion.DestructionType.TRIGGER_BLOCK
|
||||||
&& !world.isClient()
|
&& !world.isClient()
|
||||||
@ -129,6 +125,7 @@ public class ReFramedTrapdoorBlock extends WaterloggableReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
||||||
int index;
|
int index;
|
||||||
if (!state.get(OPEN)) index = state.get(BLOCK_HALF) == BlockHalf.BOTTOM ? 0 : 1;
|
if (!state.get(OPEN)) index = state.get(BLOCK_HALF) == BlockHalf.BOTTOM ? 0 : 1;
|
||||||
@ -137,11 +134,13 @@ public class ReFramedTrapdoorBlock extends WaterloggableReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
||||||
return state.with(HORIZONTAL_FACING, rotation.rotate(state.get(HORIZONTAL_FACING)));
|
return state.with(HORIZONTAL_FACING, rotation.rotate(state.get(HORIZONTAL_FACING)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
||||||
return state.with(HORIZONTAL_FACING, mirror.apply(state.get(HORIZONTAL_FACING)));
|
return state.with(HORIZONTAL_FACING, mirror.apply(state.get(HORIZONTAL_FACING)));
|
||||||
}
|
}
|
||||||
|
@ -80,13 +80,7 @@ public class ReFramedWallBlock extends WaterloggableReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState new_state, boolean moved) {
|
@SuppressWarnings("deprecation")
|
||||||
super.onStateReplaced(state, world, pos, new_state, moved);
|
|
||||||
|
|
||||||
if(!state.isOf(new_state.getBlock())) world.removeBlockEntity(pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
||||||
VoxelShape shape = state.get(UP) ? WALL_VOXELS[0]: VoxelShapes.empty();
|
VoxelShape shape = state.get(UP) ? WALL_VOXELS[0]: VoxelShapes.empty();
|
||||||
for (Direction dir : Direction.Type.HORIZONTAL) {
|
for (Direction dir : Direction.Type.HORIZONTAL) {
|
||||||
@ -109,6 +103,7 @@ public class ReFramedWallBlock extends WaterloggableReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
||||||
return Direction.Type.HORIZONTAL.stream().reduce(state, (s, dir) ->
|
return Direction.Type.HORIZONTAL.stream().reduce(state, (s, dir) ->
|
||||||
s.with(getWallShape(rotation.rotate(dir)), state.get(getWallShape(dir)))
|
s.with(getWallShape(rotation.rotate(dir)), state.get(getWallShape(dir)))
|
||||||
@ -116,6 +111,7 @@ public class ReFramedWallBlock extends WaterloggableReFramedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
||||||
return Direction.Type.HORIZONTAL.stream().reduce(state, (s, dir) ->
|
return Direction.Type.HORIZONTAL.stream().reduce(state, (s, dir) ->
|
||||||
s.with(getWallShape(mirror.apply(dir)), state.get(getWallShape(dir)))
|
s.with(getWallShape(mirror.apply(dir)), state.get(getWallShape(dir)))
|
||||||
|
@ -33,10 +33,13 @@ public class WaterloggableReFramedBlock extends ReFramedBlock implements Waterlo
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public FluidState getFluidState(BlockState state) {
|
public FluidState getFluidState(BlockState state) {
|
||||||
return state.get(Properties.WATERLOGGED) ? Fluids.WATER.getStill(false) : super.getFluidState(state);
|
return state.get(Properties.WATERLOGGED) ? Fluids.WATER.getStill(false) : super.getFluidState(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState otherState, WorldAccess world, BlockPos pos, BlockPos moved) {
|
public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState otherState, WorldAccess world, BlockPos pos, BlockPos moved) {
|
||||||
if(state.get(Properties.WATERLOGGED)) world.scheduleFluidTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world));
|
if(state.get(Properties.WATERLOGGED)) world.scheduleFluidTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world));
|
||||||
return super.getStateForNeighborUpdate(state, direction, otherState, world, pos, moved);
|
return super.getStateForNeighborUpdate(state, direction, otherState, world, pos, moved);
|
||||||
|
@ -33,10 +33,13 @@ public class WaterloggableReFramedDoubleBlock extends ReFramedDoubleBlock implem
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public FluidState getFluidState(BlockState state) {
|
public FluidState getFluidState(BlockState state) {
|
||||||
return state.get(Properties.WATERLOGGED) ? Fluids.WATER.getStill(false) : super.getFluidState(state);
|
return state.get(Properties.WATERLOGGED) ? Fluids.WATER.getStill(false) : super.getFluidState(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState otherState, WorldAccess world, BlockPos pos, BlockPos moved) {
|
public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState otherState, WorldAccess world, BlockPos pos, BlockPos moved) {
|
||||||
if(state.get(Properties.WATERLOGGED)) world.scheduleFluidTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world));
|
if(state.get(Properties.WATERLOGGED)) world.scheduleFluidTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world));
|
||||||
return super.getStateForNeighborUpdate(state, direction, otherState, world, pos, moved);
|
return super.getStateForNeighborUpdate(state, direction, otherState, world, pos, moved);
|
||||||
|
@ -147,6 +147,67 @@ public class ReFramedClient implements ClientModInitializer {
|
|||||||
// SLABS STAIR
|
// SLABS STAIR
|
||||||
HELPER.addReFramedModel("slabs_stair" , HELPER.autoDouble(ReFramed.id("block/slabs_stair/slab"), ReFramed.id("block/slabs_stair/step")));
|
HELPER.addReFramedModel("slabs_stair" , HELPER.autoDouble(ReFramed.id("block/slabs_stair/slab"), ReFramed.id("block/slabs_stair/step")));
|
||||||
HELPER.addReFramedModel("slabs_stair_side" , HELPER.autoDouble(ReFramed.id("block/slabs_stair/side/slab"), ReFramed.id("block/slabs_stair/side/step")));
|
HELPER.addReFramedModel("slabs_stair_side" , HELPER.autoDouble(ReFramed.id("block/slabs_stair/side/slab"), ReFramed.id("block/slabs_stair/side/step")));
|
||||||
|
// SLABS OUTER STAIR
|
||||||
|
HELPER.addReFramedModel("slabs_outer_stair" , HELPER.autoDouble(ReFramed.id("block/slabs_stair/outer/slab"), ReFramed.id("block/slabs_stair/outer/cube")));
|
||||||
|
HELPER.addReFramedModel("slabs_outer_stair_side" , HELPER.autoDouble(ReFramed.id("block/slabs_stair/outer/side/slab"), ReFramed.id("block/slabs_stair/outer/side/cube")));
|
||||||
|
// SLABS OUTER STAIR
|
||||||
|
HELPER.addReFramedModel("slabs_inner_stair" , HELPER.autoDouble(ReFramed.id("block/slabs_stair/inner/slab"), ReFramed.id("block/slabs_stair/inner/half_stair")));
|
||||||
|
HELPER.addReFramedModel("slabs_inner_stair_side" , HELPER.autoDouble(ReFramed.id("block/slabs_stair/inner/side/slab"), ReFramed.id("block/slabs_stair/inner/side/half_stair")));
|
||||||
|
// SLABS OUTER STAIR
|
||||||
|
HELPER.addReFramedModel("steps_cross" , HELPER.autoDouble(ReFramed.id("block/step/down"), ReFramed.id("block/step/cross")));
|
||||||
|
// HALF STAIRS CUBE STAIR
|
||||||
|
HELPER.addReFramedModel("half_stairs_cube_stair" , HELPER.autoDouble(ReFramed.id("block/half_stair/base"), ReFramed.id("block/half_stair/stair/cube")));
|
||||||
|
HELPER.addReFramedModel("half_stairs_cube_stair_side" , HELPER.autoDouble(ReFramed.id("block/half_stair/base_side"), ReFramed.id("block/half_stair/stair/cube_side")));
|
||||||
|
// HALF STAIRS STEP STAIR
|
||||||
|
HELPER.addReFramedModel("half_stairs_step_stair_1" , HELPER.autoDouble(ReFramed.id("block/half_stair/base"), ReFramed.id("block/half_stair/stair/step_1")));
|
||||||
|
HELPER.addReFramedModel("half_stairs_step_stair_side_1", HELPER.autoDouble(ReFramed.id("block/half_stair/base_side"), ReFramed.id("block/half_stair/stair/step_side_1")));
|
||||||
|
HELPER.addReFramedModel("half_stairs_step_stair_2" , HELPER.autoDouble(ReFramed.id("block/half_stair/base"), ReFramed.id("block/half_stair/stair/step_2")));
|
||||||
|
HELPER.addReFramedModel("half_stairs_step_stair_side_2", HELPER.autoDouble(ReFramed.id("block/half_stair/base_side"), ReFramed.id("block/half_stair/stair/step_side_2")));
|
||||||
|
// HALF LAYER
|
||||||
|
// --------------------- east
|
||||||
|
HELPER.addReFramedModel("half_layer_2" , HELPER.auto(ReFramed.id("block/half_layer/east/layer_2")));
|
||||||
|
HELPER.addReFramedModel("half_layer_4" , HELPER.auto(ReFramed.id("block/half_layer/east/layer_4")));
|
||||||
|
HELPER.addReFramedModel("half_layer_6" , HELPER.auto(ReFramed.id("block/half_layer/east/layer_6")));
|
||||||
|
HELPER.addReFramedModel("half_layer_8" , HELPER.auto(ReFramed.id("block/half_layer/east/layer_8")));
|
||||||
|
HELPER.addReFramedModel("half_layer_10" , HELPER.auto(ReFramed.id("block/half_layer/east/layer_10")));
|
||||||
|
HELPER.addReFramedModel("half_layer_12" , HELPER.auto(ReFramed.id("block/half_layer/east/layer_12")));
|
||||||
|
HELPER.addReFramedModel("half_layer_14" , HELPER.auto(ReFramed.id("block/half_layer/east/layer_14")));
|
||||||
|
HELPER.addReFramedModel("half_layer_16" , HELPER.auto(ReFramed.id("block/half_layer/east/layer_16")));
|
||||||
|
// --------------------- side
|
||||||
|
HELPER.addReFramedModel("half_layer_side_2" , HELPER.auto(ReFramed.id("block/half_layer/side/layer_2")));
|
||||||
|
HELPER.addReFramedModel("half_layer_side_4" , HELPER.auto(ReFramed.id("block/half_layer/side/layer_4")));
|
||||||
|
HELPER.addReFramedModel("half_layer_side_6" , HELPER.auto(ReFramed.id("block/half_layer/side/layer_6")));
|
||||||
|
HELPER.addReFramedModel("half_layer_side_8" , HELPER.auto(ReFramed.id("block/half_layer/side/layer_8")));
|
||||||
|
HELPER.addReFramedModel("half_layer_side_10" , HELPER.auto(ReFramed.id("block/half_layer/side/layer_10")));
|
||||||
|
HELPER.addReFramedModel("half_layer_side_12" , HELPER.auto(ReFramed.id("block/half_layer/side/layer_12")));
|
||||||
|
HELPER.addReFramedModel("half_layer_side_14" , HELPER.auto(ReFramed.id("block/half_layer/side/layer_14")));
|
||||||
|
HELPER.addReFramedModel("half_layer_side_16" , HELPER.auto(ReFramed.id("block/half_layer/side/layer_16")));
|
||||||
|
// SLAB HALF LAYER
|
||||||
|
HELPER.addReFramedModel("slabs_half_inventory" , HELPER.autoDouble(new Identifier("block/slab"), ReFramed.id("block/half_layer/slab/east/layer_4")));
|
||||||
|
// STEP HALF LAYER
|
||||||
|
HELPER.addReFramedModel("steps_half_inventory" , HELPER.autoDouble(ReFramed.id("block/step/down"), ReFramed.id("block/half_layer/slab/east/layer_4")));
|
||||||
|
// --------------------- east
|
||||||
|
HELPER.addReFramedModel("second_half_layer_2" , HELPER.auto(ReFramed.id("block/half_layer/slab/east/layer_2")).setThemeIndex(2));
|
||||||
|
HELPER.addReFramedModel("second_half_layer_4" , HELPER.auto(ReFramed.id("block/half_layer/slab/east/layer_4")).setThemeIndex(2));
|
||||||
|
HELPER.addReFramedModel("second_half_layer_6" , HELPER.auto(ReFramed.id("block/half_layer/slab/east/layer_6")).setThemeIndex(2));
|
||||||
|
HELPER.addReFramedModel("second_half_layer_8" , HELPER.auto(ReFramed.id("block/half_layer/slab/east/layer_8")).setThemeIndex(2));
|
||||||
|
HELPER.addReFramedModel("second_half_layer_10" , HELPER.auto(ReFramed.id("block/half_layer/slab/east/layer_10")).setThemeIndex(2));
|
||||||
|
HELPER.addReFramedModel("second_half_layer_12" , HELPER.auto(ReFramed.id("block/half_layer/slab/east/layer_12")).setThemeIndex(2));
|
||||||
|
HELPER.addReFramedModel("second_half_layer_14" , HELPER.auto(ReFramed.id("block/half_layer/slab/east/layer_14")).setThemeIndex(2));
|
||||||
|
HELPER.addReFramedModel("second_half_layer_16" , HELPER.auto(ReFramed.id("block/half_layer/slab/east/layer_16")).setThemeIndex(2));
|
||||||
|
// --------------------- side
|
||||||
|
HELPER.addReFramedModel("second_half_layer_side_2" , HELPER.auto(ReFramed.id("block/half_layer/slab/side/layer_2")).setThemeIndex(2));
|
||||||
|
HELPER.addReFramedModel("second_half_layer_side_4" , HELPER.auto(ReFramed.id("block/half_layer/slab/side/layer_4")).setThemeIndex(2));
|
||||||
|
HELPER.addReFramedModel("second_half_layer_side_6" , HELPER.auto(ReFramed.id("block/half_layer/slab/side/layer_6")).setThemeIndex(2));
|
||||||
|
HELPER.addReFramedModel("second_half_layer_side_8" , HELPER.auto(ReFramed.id("block/half_layer/slab/side/layer_8")).setThemeIndex(2));
|
||||||
|
HELPER.addReFramedModel("second_half_layer_side_10" , HELPER.auto(ReFramed.id("block/half_layer/slab/side/layer_10")).setThemeIndex(2));
|
||||||
|
HELPER.addReFramedModel("second_half_layer_side_12" , HELPER.auto(ReFramed.id("block/half_layer/slab/side/layer_12")).setThemeIndex(2));
|
||||||
|
HELPER.addReFramedModel("second_half_layer_side_14" , HELPER.auto(ReFramed.id("block/half_layer/slab/side/layer_14")).setThemeIndex(2));
|
||||||
|
HELPER.addReFramedModel("second_half_layer_side_16" , HELPER.auto(ReFramed.id("block/half_layer/slab/side/layer_16")).setThemeIndex(2));
|
||||||
|
// HALF SLAB
|
||||||
|
HELPER.addReFramedModel("half_slab" , HELPER.auto(ReFramed.id("block/half_slab/default")));
|
||||||
|
// HALF SLABS SLAB
|
||||||
|
HELPER.addReFramedModel("half_slabs_slab" , HELPER.autoDouble(ReFramed.id("block/half_slab/default"), ReFramed.id("block/half_slab/complement")));
|
||||||
|
|
||||||
|
|
||||||
// item model assignments (in lieu of models/item/___.json)
|
// item model assignments (in lieu of models/item/___.json)
|
||||||
@ -174,6 +235,16 @@ public class ReFramedClient implements ClientModInitializer {
|
|||||||
HELPER.assignItemModel("fence_inventory" , ReFramed.FENCE);
|
HELPER.assignItemModel("fence_inventory" , ReFramed.FENCE);
|
||||||
HELPER.assignItemModel("post_fence_inventory" , ReFramed.POST_FENCE);
|
HELPER.assignItemModel("post_fence_inventory" , ReFramed.POST_FENCE);
|
||||||
HELPER.assignItemModel("slabs_stair" , ReFramed.SLABS_STAIR);
|
HELPER.assignItemModel("slabs_stair" , ReFramed.SLABS_STAIR);
|
||||||
|
HELPER.assignItemModel("slabs_outer_stair" , ReFramed.SLABS_OUTER_STAIR);
|
||||||
|
HELPER.assignItemModel("slabs_inner_stair" , ReFramed.SLABS_INNER_STAIR);
|
||||||
|
HELPER.assignItemModel("steps_cross" , ReFramed.STEPS_CROSS);
|
||||||
|
HELPER.assignItemModel("half_stairs_cube_stair" , ReFramed.HALF_STAIRS_CUBE_STAIR);
|
||||||
|
HELPER.assignItemModel("half_stairs_step_stair_1", ReFramed.HALF_STAIRS_STEP_STAIR);
|
||||||
|
HELPER.assignItemModel("half_layer_2" , ReFramed.HALF_LAYER);
|
||||||
|
HELPER.assignItemModel("slabs_half_inventory" , ReFramed.SLABS_HALF_LAYER);
|
||||||
|
HELPER.assignItemModel("steps_half_inventory" , ReFramed.STEPS_HALF_LAYER);
|
||||||
|
HELPER.assignItemModel("half_slab" , ReFramed.HALF_SLAB);
|
||||||
|
HELPER.assignItemModel("half_slabs_slab" , ReFramed.HALF_SLABS_SLAB);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void privateInit() {
|
private void privateInit() {
|
||||||
|
@ -22,17 +22,27 @@ public class GBlockstate extends FabricModelProvider {
|
|||||||
providers.put(ReFramedHalfStairBlock.class, new HalfStair());
|
providers.put(ReFramedHalfStairBlock.class, new HalfStair());
|
||||||
providers.put(ReFramedHalfStairsSlabBlock.class, new HalfStairsSlab());
|
providers.put(ReFramedHalfStairsSlabBlock.class, new HalfStairsSlab());
|
||||||
providers.put(ReFramedHalfStairsStairBlock.class, new HalfStairsStair());
|
providers.put(ReFramedHalfStairsStairBlock.class, new HalfStairsStair());
|
||||||
|
providers.put(ReFramedHalfStairsCubeStairBlock.class, new HalfStairsCubeStair());
|
||||||
|
providers.put(ReFramedHalfStairsStepStairBlock.class, new HalfStairsStepStair());
|
||||||
providers.put(ReFramedLayerBlock.class, new Layer());
|
providers.put(ReFramedLayerBlock.class, new Layer());
|
||||||
|
providers.put(ReFramedHalfLayerBlock.class, new HalfLayer());
|
||||||
providers.put(ReFramedPillarBlock.class, new Pillar());
|
providers.put(ReFramedPillarBlock.class, new Pillar());
|
||||||
providers.put(ReFramedSlabBlock.class, new Slab());
|
providers.put(ReFramedSlabBlock.class, new Slab());
|
||||||
providers.put(ReFramedSlabsCubeBlock.class, new SlabsCube());
|
providers.put(ReFramedSlabsCubeBlock.class, new SlabsCube());
|
||||||
providers.put(ReFramedSlabsStairBlock.class, new SlabsStair());
|
providers.put(ReFramedSlabsStairBlock.class, new SlabsStair());
|
||||||
|
providers.put(ReFramedSlabsOuterStairBlock.class, new SlabsOuterStair());
|
||||||
|
providers.put(ReFramedSlabsInnerStairBlock.class, new SlabsInnerStair());
|
||||||
|
providers.put(ReFramedSlabsHalfLayerBlock.class, new SlabsHalfLayer());
|
||||||
|
providers.put(ReFramedHalfSlabBlock.class, new HalfSlab());
|
||||||
|
providers.put(ReFramedHalfSlabsSlabBlock.class, new HalfSlabsSlab());
|
||||||
providers.put(ReFramedSmallCubeBlock.class, new SmallCube());
|
providers.put(ReFramedSmallCubeBlock.class, new SmallCube());
|
||||||
providers.put(ReFramedSmallCubesStepBlock.class, new SmallCubesStep());
|
providers.put(ReFramedSmallCubesStepBlock.class, new SmallCubesStep());
|
||||||
providers.put(ReFramedStairBlock.class, new Stair());
|
providers.put(ReFramedStairBlock.class, new Stair());
|
||||||
providers.put(ReFramedStairsCubeBlock.class, new StairsCube());
|
providers.put(ReFramedStairsCubeBlock.class, new StairsCube());
|
||||||
providers.put(ReFramedStepBlock.class, new Step());
|
providers.put(ReFramedStepBlock.class, new Step());
|
||||||
providers.put(ReFramedStepsSlabBlock.class, new StepsSlab());
|
providers.put(ReFramedStepsSlabBlock.class, new StepsSlab());
|
||||||
|
providers.put(ReFramedStepsCrossBlock.class, new StepsCross());
|
||||||
|
providers.put(ReFramedStepsHalfLayerBlock.class, new StepsHalfLayer());
|
||||||
providers.put(ReFramedPillarsWallBlock.class, new PillarsWall());
|
providers.put(ReFramedPillarsWallBlock.class, new PillarsWall());
|
||||||
providers.put(ReFramedWallBlock.class, new Wall());
|
providers.put(ReFramedWallBlock.class, new Wall());
|
||||||
providers.put(ReFramedPaneBlock.class, new Pane());
|
providers.put(ReFramedPaneBlock.class, new Pane());
|
||||||
|
@ -24,17 +24,27 @@ public class GRecipe extends FabricRecipeProvider {
|
|||||||
providers.put(ReFramedHalfStairBlock.class, new HalfStair());
|
providers.put(ReFramedHalfStairBlock.class, new HalfStair());
|
||||||
providers.put(ReFramedHalfStairsSlabBlock.class, new HalfStairsSlab());
|
providers.put(ReFramedHalfStairsSlabBlock.class, new HalfStairsSlab());
|
||||||
providers.put(ReFramedHalfStairsStairBlock.class, new HalfStairsStair());
|
providers.put(ReFramedHalfStairsStairBlock.class, new HalfStairsStair());
|
||||||
|
providers.put(ReFramedHalfStairsCubeStairBlock.class, new HalfStairsCubeStair());
|
||||||
|
providers.put(ReFramedHalfStairsStepStairBlock.class, new HalfStairsStepStair());
|
||||||
providers.put(ReFramedLayerBlock.class, new Layer());
|
providers.put(ReFramedLayerBlock.class, new Layer());
|
||||||
|
providers.put(ReFramedHalfLayerBlock.class, new HalfLayer());
|
||||||
providers.put(ReFramedPillarBlock.class, new Pillar());
|
providers.put(ReFramedPillarBlock.class, new Pillar());
|
||||||
providers.put(ReFramedSlabBlock.class, new Slab());
|
providers.put(ReFramedSlabBlock.class, new Slab());
|
||||||
providers.put(ReFramedSlabsCubeBlock.class, new SlabsCube());
|
providers.put(ReFramedSlabsCubeBlock.class, new SlabsCube());
|
||||||
providers.put(ReFramedSlabsStairBlock.class, new SlabsStair());
|
providers.put(ReFramedSlabsStairBlock.class, new SlabsStair());
|
||||||
|
providers.put(ReFramedSlabsOuterStairBlock.class, new SlabsOuterStair());
|
||||||
|
providers.put(ReFramedSlabsInnerStairBlock.class, new SlabsInnerStair());
|
||||||
|
providers.put(ReFramedSlabsHalfLayerBlock.class, new SlabsHalfLayer());
|
||||||
|
providers.put(ReFramedHalfSlabBlock.class, new HalfSlab());
|
||||||
|
providers.put(ReFramedHalfSlabsSlabBlock.class, new HalfSlabsSlab());
|
||||||
providers.put(ReFramedSmallCubeBlock.class, new SmallCube());
|
providers.put(ReFramedSmallCubeBlock.class, new SmallCube());
|
||||||
providers.put(ReFramedSmallCubesStepBlock.class, new SmallCubesStep());
|
providers.put(ReFramedSmallCubesStepBlock.class, new SmallCubesStep());
|
||||||
providers.put(ReFramedStairBlock.class, new Stair());
|
providers.put(ReFramedStairBlock.class, new Stair());
|
||||||
providers.put(ReFramedStairsCubeBlock.class, new StairsCube());
|
providers.put(ReFramedStairsCubeBlock.class, new StairsCube());
|
||||||
providers.put(ReFramedStepBlock.class, new Step());
|
providers.put(ReFramedStepBlock.class, new Step());
|
||||||
providers.put(ReFramedStepsSlabBlock.class, new StepsSlab());
|
providers.put(ReFramedStepsSlabBlock.class, new StepsSlab());
|
||||||
|
providers.put(ReFramedStepsCrossBlock.class, new StepsCross());
|
||||||
|
providers.put(ReFramedStepsHalfLayerBlock.class, new StepsHalfLayer());
|
||||||
providers.put(ReFramedPillarsWallBlock.class, new PillarsWall());
|
providers.put(ReFramedPillarsWallBlock.class, new PillarsWall());
|
||||||
providers.put(ReFramedWallBlock.class, new Wall());
|
providers.put(ReFramedWallBlock.class, new Wall());
|
||||||
providers.put(ReFramedPaneBlock.class, new Pane());
|
providers.put(ReFramedPaneBlock.class, new Pane());
|
||||||
|
@ -0,0 +1,77 @@
|
|||||||
|
package fr.adrien1106.reframed.generator.block;
|
||||||
|
|
||||||
|
import fr.adrien1106.reframed.ReFramed;
|
||||||
|
import fr.adrien1106.reframed.generator.GBlockstate;
|
||||||
|
import fr.adrien1106.reframed.util.blocks.Corner;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.data.client.MultipartBlockStateSupplier;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
|
|
||||||
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.CORNER;
|
||||||
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.CORNER_FACE;
|
||||||
|
import static net.minecraft.data.client.VariantSettings.Rotation.*;
|
||||||
|
|
||||||
|
public class CornerDouble {
|
||||||
|
|
||||||
|
|
||||||
|
public static MultipartBlockStateSupplier getMultipart(Block block, String model_name) {
|
||||||
|
Identifier model_id = ReFramed.id(model_name + "_special");
|
||||||
|
Identifier side_id = ReFramed.id(model_name + "_side_special");
|
||||||
|
return MultipartBlockStateSupplier.create(block)
|
||||||
|
// BOTTOM
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.EAST_SOUTH_DOWN, CORNER_FACE, 2),
|
||||||
|
GBlockstate.variant(model_id, true, R0, R0))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.SOUTH_WEST_DOWN, CORNER_FACE, 2),
|
||||||
|
GBlockstate.variant(model_id, true, R0, R90))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.WEST_NORTH_DOWN, CORNER_FACE, 2),
|
||||||
|
GBlockstate.variant(model_id, true, R0, R180))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.NORTH_EAST_DOWN, CORNER_FACE, 2),
|
||||||
|
GBlockstate.variant(model_id, true, R0, R270))
|
||||||
|
// TOP
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.NORTH_EAST_UP, CORNER_FACE, 2),
|
||||||
|
GBlockstate.variant(model_id, true, R180, R0))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.EAST_SOUTH_UP, CORNER_FACE, 2),
|
||||||
|
GBlockstate.variant(model_id, true, R180, R90))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.SOUTH_WEST_UP, CORNER_FACE, 2),
|
||||||
|
GBlockstate.variant(model_id, true, R180, R180))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.WEST_NORTH_UP, CORNER_FACE, 2),
|
||||||
|
GBlockstate.variant(model_id, true, R180, R270))
|
||||||
|
// EAST
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.EAST_SOUTH_DOWN, CORNER_FACE, 0),
|
||||||
|
GBlockstate.variant(side_id, true, R0, R0))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.EAST_SOUTH_UP, CORNER_FACE, 0),
|
||||||
|
GBlockstate.variant(side_id, true, R90, R0))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.NORTH_EAST_UP, CORNER_FACE, 1),
|
||||||
|
GBlockstate.variant(side_id, true, R180, R0))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.NORTH_EAST_DOWN, CORNER_FACE, 1),
|
||||||
|
GBlockstate.variant(side_id, true, R270, R0))
|
||||||
|
// SOUTH
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.SOUTH_WEST_DOWN, CORNER_FACE, 0),
|
||||||
|
GBlockstate.variant(side_id, true, R0, R90))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.SOUTH_WEST_UP, CORNER_FACE, 0),
|
||||||
|
GBlockstate.variant(side_id, true, R90, R90))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.EAST_SOUTH_UP, CORNER_FACE, 1),
|
||||||
|
GBlockstate.variant(side_id, true, R180, R90))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.EAST_SOUTH_DOWN, CORNER_FACE, 1),
|
||||||
|
GBlockstate.variant(side_id, true, R270, R90))
|
||||||
|
// WEST
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.WEST_NORTH_DOWN, CORNER_FACE, 0),
|
||||||
|
GBlockstate.variant(side_id, true, R0, R180))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.WEST_NORTH_UP, CORNER_FACE, 0),
|
||||||
|
GBlockstate.variant(side_id, true, R90, R180))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.SOUTH_WEST_UP, CORNER_FACE, 1),
|
||||||
|
GBlockstate.variant(side_id, true, R180, R180))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.SOUTH_WEST_DOWN, CORNER_FACE, 1),
|
||||||
|
GBlockstate.variant(side_id, true, R270, R180))
|
||||||
|
// NORTH
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.NORTH_EAST_DOWN, CORNER_FACE, 0),
|
||||||
|
GBlockstate.variant(side_id, true, R0, R270))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.NORTH_EAST_UP, CORNER_FACE, 0),
|
||||||
|
GBlockstate.variant(side_id, true, R90, R270))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.WEST_NORTH_UP, CORNER_FACE, 1),
|
||||||
|
GBlockstate.variant(side_id, true, R180, R270))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.WEST_NORTH_DOWN, CORNER_FACE, 1),
|
||||||
|
GBlockstate.variant(side_id, true, R270, R270))
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,171 @@
|
|||||||
|
package fr.adrien1106.reframed.generator.block;
|
||||||
|
|
||||||
|
import fr.adrien1106.reframed.ReFramed;
|
||||||
|
import fr.adrien1106.reframed.generator.BlockStateProvider;
|
||||||
|
import fr.adrien1106.reframed.generator.RecipeSetter;
|
||||||
|
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.data.client.BlockStateSupplier;
|
||||||
|
import net.minecraft.data.client.MultipartBlockStateSupplier;
|
||||||
|
import net.minecraft.data.server.recipe.RecipeExporter;
|
||||||
|
import net.minecraft.data.server.recipe.RecipeProvider;
|
||||||
|
import net.minecraft.data.server.recipe.ShapelessRecipeJsonBuilder;
|
||||||
|
import net.minecraft.item.ItemConvertible;
|
||||||
|
import net.minecraft.recipe.book.RecipeCategory;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static fr.adrien1106.reframed.generator.GBlockstate.variant;
|
||||||
|
import static fr.adrien1106.reframed.generator.GBlockstate.when;
|
||||||
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE;
|
||||||
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE_FACE;
|
||||||
|
import static fr.adrien1106.reframed.util.blocks.Edge.*;
|
||||||
|
import static net.minecraft.data.client.VariantSettings.Rotation.*;
|
||||||
|
import static net.minecraft.state.property.Properties.LAYERS;
|
||||||
|
|
||||||
|
public class HalfLayer implements RecipeSetter, BlockStateProvider {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRecipe(RecipeExporter exporter, ItemConvertible convertible) {
|
||||||
|
RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, convertible, ReFramed.CUBE, 16);
|
||||||
|
ShapelessRecipeJsonBuilder
|
||||||
|
.create(RecipeCategory.BUILDING_BLOCKS, convertible, 2)
|
||||||
|
.input(ReFramed.LAYER)
|
||||||
|
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
|
||||||
|
.criterion(FabricRecipeProvider.hasItem(convertible), FabricRecipeProvider.conditionsFromItem(convertible))
|
||||||
|
.offerTo(exporter);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BlockStateSupplier getMultipart(Block block) {
|
||||||
|
return getMultipart(block, "half_layer");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MultipartBlockStateSupplier getMultipart(Block block, String layer) {
|
||||||
|
Map<Integer, Identifier> layer_model = Map.of(
|
||||||
|
1, ReFramed.id(layer + "_2_special"),
|
||||||
|
2, ReFramed.id(layer + "_4_special"),
|
||||||
|
3, ReFramed.id(layer + "_6_special"),
|
||||||
|
4, ReFramed.id(layer + "_8_special"),
|
||||||
|
5, ReFramed.id(layer + "_10_special"),
|
||||||
|
6, ReFramed.id(layer + "_12_special"),
|
||||||
|
7, ReFramed.id(layer + "_14_special"),
|
||||||
|
8, ReFramed.id(layer + "_16_special")
|
||||||
|
);
|
||||||
|
Map<Integer, Identifier> layer_side = Map.of(
|
||||||
|
1, ReFramed.id(layer + "_side_2_special"),
|
||||||
|
2, ReFramed.id(layer + "_side_4_special"),
|
||||||
|
3, ReFramed.id(layer + "_side_6_special"),
|
||||||
|
4, ReFramed.id(layer + "_side_8_special"),
|
||||||
|
5, ReFramed.id(layer + "_side_10_special"),
|
||||||
|
6, ReFramed.id(layer + "_side_12_special"),
|
||||||
|
7, ReFramed.id(layer + "_side_14_special"),
|
||||||
|
8, ReFramed.id(layer + "_side_16_special")
|
||||||
|
);
|
||||||
|
MultipartBlockStateSupplier supplier = MultipartBlockStateSupplier.create(block);
|
||||||
|
// DOWN
|
||||||
|
layer_model.forEach((i, model) ->
|
||||||
|
supplier.with(when(EDGE, DOWN_EAST, EDGE_FACE, 0, LAYERS, i),
|
||||||
|
variant(model, true, R0, R0))
|
||||||
|
);
|
||||||
|
layer_model.forEach((i, model) ->
|
||||||
|
supplier.with(when(EDGE, DOWN_SOUTH, EDGE_FACE, 0, LAYERS, i),
|
||||||
|
variant(model, true, R0, R90))
|
||||||
|
);
|
||||||
|
layer_model.forEach((i, model) ->
|
||||||
|
supplier.with(when(EDGE, WEST_DOWN, EDGE_FACE, 1, LAYERS, i),
|
||||||
|
variant(model, true, R0, R180))
|
||||||
|
);
|
||||||
|
layer_model.forEach((i, model) ->
|
||||||
|
supplier.with(when(EDGE, NORTH_DOWN, EDGE_FACE, 1, LAYERS, i),
|
||||||
|
variant(model, true, R0, R270))
|
||||||
|
);
|
||||||
|
// UP
|
||||||
|
layer_model.forEach((i, model) ->
|
||||||
|
supplier.with(when(EDGE, EAST_UP, EDGE_FACE, 1, LAYERS, i),
|
||||||
|
variant(model, true, R180, R0))
|
||||||
|
);
|
||||||
|
layer_model.forEach((i, model) ->
|
||||||
|
supplier.with(when(EDGE, SOUTH_UP, EDGE_FACE, 1, LAYERS, i),
|
||||||
|
variant(model, true, R180, R90))
|
||||||
|
);
|
||||||
|
layer_model.forEach((i, model) ->
|
||||||
|
supplier.with(when(EDGE, UP_WEST, EDGE_FACE, 0, LAYERS, i),
|
||||||
|
variant(model, true, R180, R180))
|
||||||
|
);
|
||||||
|
layer_model.forEach((i, model) ->
|
||||||
|
supplier.with(when(EDGE, UP_NORTH, EDGE_FACE, 0, LAYERS, i),
|
||||||
|
variant(model, true, R180, R270))
|
||||||
|
);
|
||||||
|
// EAST
|
||||||
|
layer_side.forEach((i, model) ->
|
||||||
|
supplier.with(when(EDGE, EAST_SOUTH, EDGE_FACE, 0, LAYERS, i),
|
||||||
|
variant(model, true, R0, R0))
|
||||||
|
);
|
||||||
|
layer_side.forEach((i, model) ->
|
||||||
|
supplier.with(when(EDGE, EAST_UP, EDGE_FACE, 0, LAYERS, i),
|
||||||
|
variant(model, true, R90, R0))
|
||||||
|
);
|
||||||
|
layer_side.forEach((i, model) ->
|
||||||
|
supplier.with(when(EDGE, NORTH_EAST, EDGE_FACE, 1, LAYERS, i),
|
||||||
|
variant(model, true, R180, R0))
|
||||||
|
);
|
||||||
|
layer_side.forEach((i, model) ->
|
||||||
|
supplier.with(when(EDGE, DOWN_EAST, EDGE_FACE, 1, LAYERS, i),
|
||||||
|
variant(model, true, R270, R0))
|
||||||
|
);
|
||||||
|
// SOUTH
|
||||||
|
layer_side.forEach((i, model) ->
|
||||||
|
supplier.with(when(EDGE, SOUTH_WEST, EDGE_FACE, 0, LAYERS, i),
|
||||||
|
variant(model, true, R0, R90))
|
||||||
|
);
|
||||||
|
layer_side.forEach((i, model) ->
|
||||||
|
supplier.with(when(EDGE, SOUTH_UP, EDGE_FACE, 0, LAYERS, i),
|
||||||
|
variant(model, true, R90, R90))
|
||||||
|
);
|
||||||
|
layer_side.forEach((i, model) ->
|
||||||
|
supplier.with(when(EDGE, EAST_SOUTH, EDGE_FACE, 1, LAYERS, i),
|
||||||
|
variant(model, true, R180, R90))
|
||||||
|
);
|
||||||
|
layer_side.forEach((i, model) ->
|
||||||
|
supplier.with(when(EDGE, DOWN_SOUTH, EDGE_FACE, 1, LAYERS, i),
|
||||||
|
variant(model, true, R270, R90))
|
||||||
|
);
|
||||||
|
// WEST
|
||||||
|
layer_side.forEach((i, model) ->
|
||||||
|
supplier.with(when(EDGE, WEST_NORTH, EDGE_FACE, 0, LAYERS, i),
|
||||||
|
variant(model, true, R0, R180))
|
||||||
|
);
|
||||||
|
layer_side.forEach((i, model) ->
|
||||||
|
supplier.with(when(EDGE, UP_WEST, EDGE_FACE, 1, LAYERS, i),
|
||||||
|
variant(model, true, R90, R180))
|
||||||
|
);
|
||||||
|
layer_side.forEach((i, model) ->
|
||||||
|
supplier.with(when(EDGE, SOUTH_WEST, EDGE_FACE, 1, LAYERS, i),
|
||||||
|
variant(model, true, R180, R180))
|
||||||
|
);
|
||||||
|
layer_side.forEach((i, model) ->
|
||||||
|
supplier.with(when(EDGE, WEST_DOWN, EDGE_FACE, 0, LAYERS, i),
|
||||||
|
variant(model, true, R270, R180))
|
||||||
|
);
|
||||||
|
// NORTH
|
||||||
|
layer_side.forEach((i, model) ->
|
||||||
|
supplier.with(when(EDGE, NORTH_EAST, EDGE_FACE, 0, LAYERS, i),
|
||||||
|
variant(model, true, R0, R270))
|
||||||
|
);
|
||||||
|
layer_side.forEach((i, model) ->
|
||||||
|
supplier.with(when(EDGE, UP_NORTH, EDGE_FACE, 1, LAYERS, i),
|
||||||
|
variant(model, true, R90, R270))
|
||||||
|
);
|
||||||
|
layer_side.forEach((i, model) ->
|
||||||
|
supplier.with(when(EDGE, WEST_NORTH, EDGE_FACE, 1, LAYERS, i),
|
||||||
|
variant(model, true, R180, R270))
|
||||||
|
);
|
||||||
|
layer_side.forEach((i, model) ->
|
||||||
|
supplier.with(when(EDGE, NORTH_DOWN, EDGE_FACE, 0, LAYERS, i),
|
||||||
|
variant(model, true, R270, R270))
|
||||||
|
);
|
||||||
|
return supplier;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
package fr.adrien1106.reframed.generator.block;
|
||||||
|
|
||||||
|
import fr.adrien1106.reframed.ReFramed;
|
||||||
|
import fr.adrien1106.reframed.generator.BlockStateProvider;
|
||||||
|
import fr.adrien1106.reframed.generator.RecipeSetter;
|
||||||
|
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.data.client.MultipartBlockStateSupplier;
|
||||||
|
import net.minecraft.data.server.recipe.RecipeExporter;
|
||||||
|
import net.minecraft.data.server.recipe.RecipeProvider;
|
||||||
|
import net.minecraft.data.server.recipe.ShapelessRecipeJsonBuilder;
|
||||||
|
import net.minecraft.item.ItemConvertible;
|
||||||
|
import net.minecraft.recipe.book.RecipeCategory;
|
||||||
|
|
||||||
|
public class HalfSlab implements RecipeSetter, BlockStateProvider {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRecipe(RecipeExporter exporter, ItemConvertible convertible) {
|
||||||
|
RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, convertible, ReFramed.CUBE, 4);
|
||||||
|
ShapelessRecipeJsonBuilder
|
||||||
|
.create(RecipeCategory.BUILDING_BLOCKS, convertible, 2)
|
||||||
|
.input(ReFramed.SLAB)
|
||||||
|
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
|
||||||
|
.criterion(FabricRecipeProvider.hasItem(convertible), FabricRecipeProvider.conditionsFromItem(convertible))
|
||||||
|
.offerTo(exporter);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MultipartBlockStateSupplier getMultipart(Block block) {
|
||||||
|
return Slab.getMultipart(block, "half_slab");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
package fr.adrien1106.reframed.generator.block;
|
||||||
|
|
||||||
|
import fr.adrien1106.reframed.ReFramed;
|
||||||
|
import fr.adrien1106.reframed.generator.BlockStateProvider;
|
||||||
|
import fr.adrien1106.reframed.generator.RecipeSetter;
|
||||||
|
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.data.client.MultipartBlockStateSupplier;
|
||||||
|
import net.minecraft.data.server.recipe.RecipeExporter;
|
||||||
|
import net.minecraft.data.server.recipe.RecipeProvider;
|
||||||
|
import net.minecraft.data.server.recipe.ShapelessRecipeJsonBuilder;
|
||||||
|
import net.minecraft.item.ItemConvertible;
|
||||||
|
import net.minecraft.recipe.book.RecipeCategory;
|
||||||
|
|
||||||
|
public class HalfSlabsSlab implements RecipeSetter, BlockStateProvider {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRecipe(RecipeExporter exporter, ItemConvertible convertible) {
|
||||||
|
RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, convertible, ReFramed.CUBE, 2);
|
||||||
|
ShapelessRecipeJsonBuilder
|
||||||
|
.create(RecipeCategory.BUILDING_BLOCKS, convertible, 1)
|
||||||
|
.input(ReFramed.HALF_SLAB, 2)
|
||||||
|
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
|
||||||
|
.criterion(FabricRecipeProvider.hasItem(convertible), FabricRecipeProvider.conditionsFromItem(convertible))
|
||||||
|
.offerTo(exporter);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MultipartBlockStateSupplier getMultipart(Block block) {
|
||||||
|
return Slab.getMultipart(block, "half_slabs_slab");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
package fr.adrien1106.reframed.generator.block;
|
||||||
|
|
||||||
|
import fr.adrien1106.reframed.ReFramed;
|
||||||
|
import fr.adrien1106.reframed.generator.BlockStateProvider;
|
||||||
|
import fr.adrien1106.reframed.generator.RecipeSetter;
|
||||||
|
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.data.client.MultipartBlockStateSupplier;
|
||||||
|
import net.minecraft.data.server.recipe.RecipeExporter;
|
||||||
|
import net.minecraft.data.server.recipe.RecipeProvider;
|
||||||
|
import net.minecraft.data.server.recipe.ShapelessRecipeJsonBuilder;
|
||||||
|
import net.minecraft.item.ItemConvertible;
|
||||||
|
import net.minecraft.recipe.book.RecipeCategory;
|
||||||
|
|
||||||
|
public class HalfStairsCubeStair implements RecipeSetter, BlockStateProvider {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRecipe(RecipeExporter exporter, ItemConvertible convertible) {
|
||||||
|
RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, convertible, ReFramed.CUBE);
|
||||||
|
ShapelessRecipeJsonBuilder
|
||||||
|
.create(RecipeCategory.BUILDING_BLOCKS, convertible)
|
||||||
|
.input(ReFramed.SMALL_CUBE)
|
||||||
|
.input(ReFramed.HALF_STAIR)
|
||||||
|
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
|
||||||
|
.criterion(FabricRecipeProvider.hasItem(convertible), FabricRecipeProvider.conditionsFromItem(convertible))
|
||||||
|
.offerTo(exporter);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MultipartBlockStateSupplier getMultipart(Block block) {
|
||||||
|
return CornerDouble.getMultipart(block, "half_stairs_cube_stair");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,159 @@
|
|||||||
|
package fr.adrien1106.reframed.generator.block;
|
||||||
|
|
||||||
|
import fr.adrien1106.reframed.ReFramed;
|
||||||
|
import fr.adrien1106.reframed.generator.BlockStateProvider;
|
||||||
|
import fr.adrien1106.reframed.generator.GBlockstate;
|
||||||
|
import fr.adrien1106.reframed.generator.RecipeSetter;
|
||||||
|
import fr.adrien1106.reframed.util.blocks.Corner;
|
||||||
|
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.data.client.MultipartBlockStateSupplier;
|
||||||
|
import net.minecraft.data.server.recipe.RecipeExporter;
|
||||||
|
import net.minecraft.data.server.recipe.RecipeProvider;
|
||||||
|
import net.minecraft.data.server.recipe.ShapelessRecipeJsonBuilder;
|
||||||
|
import net.minecraft.item.ItemConvertible;
|
||||||
|
import net.minecraft.recipe.book.RecipeCategory;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
|
|
||||||
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.*;
|
||||||
|
import static net.minecraft.data.client.VariantSettings.Rotation.*;
|
||||||
|
import static net.minecraft.data.client.VariantSettings.Rotation.R270;
|
||||||
|
|
||||||
|
public class HalfStairsStepStair implements RecipeSetter, BlockStateProvider {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRecipe(RecipeExporter exporter, ItemConvertible convertible) {
|
||||||
|
RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, convertible, ReFramed.CUBE);
|
||||||
|
ShapelessRecipeJsonBuilder
|
||||||
|
.create(RecipeCategory.BUILDING_BLOCKS, convertible)
|
||||||
|
.input(ReFramed.SMALL_CUBE)
|
||||||
|
.input(ReFramed.HALF_STAIR)
|
||||||
|
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
|
||||||
|
.criterion(FabricRecipeProvider.hasItem(convertible), FabricRecipeProvider.conditionsFromItem(convertible))
|
||||||
|
.offerTo(exporter);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MultipartBlockStateSupplier getMultipart(Block block) {
|
||||||
|
Identifier model_1_id = ReFramed.id("half_stairs_step_stair_1_special");
|
||||||
|
Identifier side_1_id = ReFramed.id("half_stairs_step_stair_side_1_special");
|
||||||
|
Identifier model_2_id = ReFramed.id("half_stairs_step_stair_2_special");
|
||||||
|
Identifier side_2_id = ReFramed.id("half_stairs_step_stair_side_2_special");
|
||||||
|
return MultipartBlockStateSupplier.create(block)
|
||||||
|
// BOTTOM
|
||||||
|
// --- 1 ---
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.EAST_SOUTH_DOWN, CORNER_FACE, 2, CORNER_FEATURE, 0),
|
||||||
|
GBlockstate.variant(model_1_id, true, R0, R0))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.SOUTH_WEST_DOWN, CORNER_FACE, 2, CORNER_FEATURE, 0),
|
||||||
|
GBlockstate.variant(model_1_id, true, R0, R90))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.WEST_NORTH_DOWN, CORNER_FACE, 2, CORNER_FEATURE, 0),
|
||||||
|
GBlockstate.variant(model_1_id, true, R0, R180))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.NORTH_EAST_DOWN, CORNER_FACE, 2, CORNER_FEATURE, 0),
|
||||||
|
GBlockstate.variant(model_1_id, true, R0, R270))
|
||||||
|
// --- 2 ---
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.EAST_SOUTH_DOWN, CORNER_FACE, 2, CORNER_FEATURE, 1),
|
||||||
|
GBlockstate.variant(model_2_id, true, R0, R0))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.SOUTH_WEST_DOWN, CORNER_FACE, 2, CORNER_FEATURE, 1),
|
||||||
|
GBlockstate.variant(model_2_id, true, R0, R90))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.WEST_NORTH_DOWN, CORNER_FACE, 2, CORNER_FEATURE, 1),
|
||||||
|
GBlockstate.variant(model_2_id, true, R0, R180))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.NORTH_EAST_DOWN, CORNER_FACE, 2, CORNER_FEATURE, 1),
|
||||||
|
GBlockstate.variant(model_2_id, true, R0, R270))
|
||||||
|
// TOP
|
||||||
|
// --- 1 ---
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.NORTH_EAST_UP, CORNER_FACE, 2, CORNER_FEATURE, 1),
|
||||||
|
GBlockstate.variant(model_1_id, true, R180, R0))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.EAST_SOUTH_UP, CORNER_FACE, 2, CORNER_FEATURE, 1),
|
||||||
|
GBlockstate.variant(model_1_id, true, R180, R90))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.SOUTH_WEST_UP, CORNER_FACE, 2, CORNER_FEATURE, 1),
|
||||||
|
GBlockstate.variant(model_1_id, true, R180, R180))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.WEST_NORTH_UP, CORNER_FACE, 2, CORNER_FEATURE, 1),
|
||||||
|
GBlockstate.variant(model_1_id, true, R180, R270))
|
||||||
|
// --- 2 ---
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.NORTH_EAST_UP, CORNER_FACE, 2, CORNER_FEATURE, 0),
|
||||||
|
GBlockstate.variant(model_2_id, true, R180, R0))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.EAST_SOUTH_UP, CORNER_FACE, 2, CORNER_FEATURE, 0),
|
||||||
|
GBlockstate.variant(model_2_id, true, R180, R90))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.SOUTH_WEST_UP, CORNER_FACE, 2, CORNER_FEATURE, 0),
|
||||||
|
GBlockstate.variant(model_2_id, true, R180, R180))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.WEST_NORTH_UP, CORNER_FACE, 2, CORNER_FEATURE, 0),
|
||||||
|
GBlockstate.variant(model_2_id, true, R180, R270))
|
||||||
|
// EAST
|
||||||
|
// --- 1 ---
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.EAST_SOUTH_DOWN, CORNER_FACE, 0, CORNER_FEATURE, 0),
|
||||||
|
GBlockstate.variant(side_1_id, true, R0, R0))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.EAST_SOUTH_UP, CORNER_FACE, 0, CORNER_FEATURE, 1),
|
||||||
|
GBlockstate.variant(side_1_id, true, R90, R0))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.NORTH_EAST_UP, CORNER_FACE, 1, CORNER_FEATURE, 0),
|
||||||
|
GBlockstate.variant(side_1_id, true, R180, R0))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.NORTH_EAST_DOWN, CORNER_FACE, 1, CORNER_FEATURE, 1),
|
||||||
|
GBlockstate.variant(side_1_id, true, R270, R0))
|
||||||
|
// --- 2 ---
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.EAST_SOUTH_DOWN, CORNER_FACE, 0, CORNER_FEATURE, 1),
|
||||||
|
GBlockstate.variant(side_2_id, true, R0, R0))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.EAST_SOUTH_UP, CORNER_FACE, 0, CORNER_FEATURE, 0),
|
||||||
|
GBlockstate.variant(side_2_id, true, R90, R0))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.NORTH_EAST_UP, CORNER_FACE, 1, CORNER_FEATURE, 1),
|
||||||
|
GBlockstate.variant(side_2_id, true, R180, R0))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.NORTH_EAST_DOWN, CORNER_FACE, 1, CORNER_FEATURE, 0),
|
||||||
|
GBlockstate.variant(side_2_id, true, R270, R0))
|
||||||
|
// SOUTH
|
||||||
|
// --- 1 ---
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.SOUTH_WEST_DOWN, CORNER_FACE, 0, CORNER_FEATURE, 0),
|
||||||
|
GBlockstate.variant(side_1_id, true, R0, R90))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.SOUTH_WEST_UP, CORNER_FACE, 0, CORNER_FEATURE, 1),
|
||||||
|
GBlockstate.variant(side_1_id, true, R90, R90))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.EAST_SOUTH_UP, CORNER_FACE, 1, CORNER_FEATURE, 0),
|
||||||
|
GBlockstate.variant(side_1_id, true, R180, R90))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.EAST_SOUTH_DOWN, CORNER_FACE, 1, CORNER_FEATURE, 1),
|
||||||
|
GBlockstate.variant(side_1_id, true, R270, R90))
|
||||||
|
// --- 2 ---
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.SOUTH_WEST_DOWN, CORNER_FACE, 0, CORNER_FEATURE, 1),
|
||||||
|
GBlockstate.variant(side_2_id, true, R0, R90))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.SOUTH_WEST_UP, CORNER_FACE, 0, CORNER_FEATURE, 0),
|
||||||
|
GBlockstate.variant(side_2_id, true, R90, R90))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.EAST_SOUTH_UP, CORNER_FACE, 1, CORNER_FEATURE, 1),
|
||||||
|
GBlockstate.variant(side_2_id, true, R180, R90))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.EAST_SOUTH_DOWN, CORNER_FACE, 1, CORNER_FEATURE, 0),
|
||||||
|
GBlockstate.variant(side_2_id, true, R270, R90))
|
||||||
|
// WEST
|
||||||
|
// --- 1 ---
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.WEST_NORTH_DOWN, CORNER_FACE, 0, CORNER_FEATURE, 0),
|
||||||
|
GBlockstate.variant(side_1_id, true, R0, R180))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.WEST_NORTH_UP, CORNER_FACE, 0, CORNER_FEATURE, 1),
|
||||||
|
GBlockstate.variant(side_1_id, true, R90, R180))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.SOUTH_WEST_UP, CORNER_FACE, 1, CORNER_FEATURE, 0),
|
||||||
|
GBlockstate.variant(side_1_id, true, R180, R180))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.SOUTH_WEST_DOWN, CORNER_FACE, 1, CORNER_FEATURE, 1),
|
||||||
|
GBlockstate.variant(side_1_id, true, R270, R180))
|
||||||
|
// --- 2 ---
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.WEST_NORTH_DOWN, CORNER_FACE, 0, CORNER_FEATURE, 1),
|
||||||
|
GBlockstate.variant(side_2_id, true, R0, R180))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.WEST_NORTH_UP, CORNER_FACE, 0, CORNER_FEATURE, 0),
|
||||||
|
GBlockstate.variant(side_2_id, true, R90, R180))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.SOUTH_WEST_UP, CORNER_FACE, 1, CORNER_FEATURE, 1),
|
||||||
|
GBlockstate.variant(side_2_id, true, R180, R180))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.SOUTH_WEST_DOWN, CORNER_FACE, 1, CORNER_FEATURE, 0),
|
||||||
|
GBlockstate.variant(side_2_id, true, R270, R180))
|
||||||
|
// NORTH
|
||||||
|
// --- 1 ---
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.NORTH_EAST_DOWN, CORNER_FACE, 0, CORNER_FEATURE, 0),
|
||||||
|
GBlockstate.variant(side_1_id, true, R0, R270))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.NORTH_EAST_UP, CORNER_FACE, 0, CORNER_FEATURE, 1),
|
||||||
|
GBlockstate.variant(side_1_id, true, R90, R270))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.WEST_NORTH_UP, CORNER_FACE, 1, CORNER_FEATURE, 0),
|
||||||
|
GBlockstate.variant(side_1_id, true, R180, R270))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.WEST_NORTH_DOWN, CORNER_FACE, 1, CORNER_FEATURE, 1),
|
||||||
|
GBlockstate.variant(side_1_id, true, R270, R270))
|
||||||
|
// --- 2 ---
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.NORTH_EAST_DOWN, CORNER_FACE, 0, CORNER_FEATURE, 1),
|
||||||
|
GBlockstate.variant(side_2_id, true, R0, R270))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.NORTH_EAST_UP, CORNER_FACE, 0, CORNER_FEATURE, 0),
|
||||||
|
GBlockstate.variant(side_2_id, true, R90, R270))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.WEST_NORTH_UP, CORNER_FACE, 1, CORNER_FEATURE, 1),
|
||||||
|
GBlockstate.variant(side_2_id, true, R180, R270))
|
||||||
|
.with(GBlockstate.when(CORNER, Corner.WEST_NORTH_DOWN, CORNER_FACE, 1, CORNER_FEATURE, 0),
|
||||||
|
GBlockstate.variant(side_2_id, true, R270, R270))
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
@ -34,7 +34,11 @@ public class Slab implements RecipeSetter, BlockStateProvider {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MultipartBlockStateSupplier getMultipart(Block block) {
|
public MultipartBlockStateSupplier getMultipart(Block block) {
|
||||||
Identifier model_id = ReFramed.id("slab_special");
|
return getMultipart(block, "slab");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MultipartBlockStateSupplier getMultipart(Block block, String model_name) {
|
||||||
|
Identifier model_id = ReFramed.id(model_name + "_special");
|
||||||
return MultipartBlockStateSupplier.create(block)
|
return MultipartBlockStateSupplier.create(block)
|
||||||
.with(GBlockstate.when(FACING, Direction.DOWN),
|
.with(GBlockstate.when(FACING, Direction.DOWN),
|
||||||
GBlockstate.variant(model_id, true, R0, R0))
|
GBlockstate.variant(model_id, true, R0, R0))
|
||||||
@ -49,4 +53,6 @@ public class Slab implements RecipeSetter, BlockStateProvider {
|
|||||||
.with(GBlockstate.when(FACING, Direction.EAST),
|
.with(GBlockstate.when(FACING, Direction.EAST),
|
||||||
GBlockstate.variant(model_id, true, R90, R270));
|
GBlockstate.variant(model_id, true, R90, R270));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,93 @@
|
|||||||
|
package fr.adrien1106.reframed.generator.block;
|
||||||
|
|
||||||
|
import fr.adrien1106.reframed.ReFramed;
|
||||||
|
import fr.adrien1106.reframed.generator.BlockStateProvider;
|
||||||
|
import fr.adrien1106.reframed.generator.RecipeSetter;
|
||||||
|
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.data.client.BlockStateSupplier;
|
||||||
|
import net.minecraft.data.server.recipe.RecipeExporter;
|
||||||
|
import net.minecraft.data.server.recipe.RecipeProvider;
|
||||||
|
import net.minecraft.data.server.recipe.ShapelessRecipeJsonBuilder;
|
||||||
|
import net.minecraft.item.ItemConvertible;
|
||||||
|
import net.minecraft.recipe.book.RecipeCategory;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
|
|
||||||
|
import static fr.adrien1106.reframed.generator.GBlockstate.variant;
|
||||||
|
import static fr.adrien1106.reframed.generator.GBlockstate.when;
|
||||||
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE;
|
||||||
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE_FACE;
|
||||||
|
import static fr.adrien1106.reframed.util.blocks.Edge.*;
|
||||||
|
import static net.minecraft.data.client.VariantSettings.Rotation.*;
|
||||||
|
import static net.minecraft.data.client.When.anyOf;
|
||||||
|
|
||||||
|
public class SlabsHalfLayer implements RecipeSetter, BlockStateProvider {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRecipe(RecipeExporter exporter, ItemConvertible convertible) {
|
||||||
|
RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, convertible, ReFramed.CUBE, 2);
|
||||||
|
ShapelessRecipeJsonBuilder
|
||||||
|
.create(RecipeCategory.BUILDING_BLOCKS, convertible)
|
||||||
|
.input(ReFramed.HALF_LAYER)
|
||||||
|
.input(ReFramed.SLAB)
|
||||||
|
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
|
||||||
|
.criterion(FabricRecipeProvider.hasItem(convertible), FabricRecipeProvider.conditionsFromItem(convertible))
|
||||||
|
.offerTo(exporter);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BlockStateSupplier getMultipart(Block block) {
|
||||||
|
Identifier slab_model = ReFramed.id("slab_special");
|
||||||
|
return HalfLayer.getMultipart(block, "second_half_layer")
|
||||||
|
.with(
|
||||||
|
anyOf(
|
||||||
|
when(EDGE, DOWN_EAST, EDGE_FACE, 0),
|
||||||
|
when(EDGE, DOWN_SOUTH, EDGE_FACE, 0),
|
||||||
|
when(EDGE, WEST_DOWN, EDGE_FACE, 1),
|
||||||
|
when(EDGE, NORTH_DOWN, EDGE_FACE, 1)
|
||||||
|
),
|
||||||
|
variant(slab_model, true, R0, R0))
|
||||||
|
.with(
|
||||||
|
anyOf(
|
||||||
|
when(EDGE, EAST_SOUTH, EDGE_FACE, 1),
|
||||||
|
when(EDGE, DOWN_SOUTH, EDGE_FACE, 1),
|
||||||
|
when(EDGE, SOUTH_WEST, EDGE_FACE, 0),
|
||||||
|
when(EDGE, SOUTH_UP, EDGE_FACE, 0)
|
||||||
|
),
|
||||||
|
variant(slab_model, true, R90, R0))
|
||||||
|
.with(
|
||||||
|
anyOf(
|
||||||
|
when(EDGE, UP_WEST, EDGE_FACE, 0),
|
||||||
|
when(EDGE, UP_NORTH, EDGE_FACE, 0),
|
||||||
|
when(EDGE, EAST_UP, EDGE_FACE, 1),
|
||||||
|
when(EDGE, SOUTH_UP, EDGE_FACE, 1)
|
||||||
|
),
|
||||||
|
variant(slab_model, true, R180, R0))
|
||||||
|
.with(
|
||||||
|
anyOf(
|
||||||
|
when(EDGE, WEST_NORTH, EDGE_FACE, 1),
|
||||||
|
when(EDGE, UP_NORTH, EDGE_FACE, 1),
|
||||||
|
when(EDGE, NORTH_EAST, EDGE_FACE, 0),
|
||||||
|
when(EDGE, NORTH_DOWN, EDGE_FACE, 0)
|
||||||
|
),
|
||||||
|
variant(slab_model, true, R270, R0))
|
||||||
|
.with(
|
||||||
|
anyOf(
|
||||||
|
when(EDGE, SOUTH_WEST, EDGE_FACE, 1),
|
||||||
|
when(EDGE, UP_WEST, EDGE_FACE, 1),
|
||||||
|
when(EDGE, WEST_NORTH, EDGE_FACE, 0),
|
||||||
|
when(EDGE, WEST_DOWN, EDGE_FACE, 0)
|
||||||
|
),
|
||||||
|
variant(slab_model, true, R90, R90))
|
||||||
|
.with(
|
||||||
|
anyOf(
|
||||||
|
when(EDGE, NORTH_EAST, EDGE_FACE, 1),
|
||||||
|
when(EDGE, DOWN_EAST, EDGE_FACE, 1),
|
||||||
|
when(EDGE, EAST_SOUTH, EDGE_FACE, 0),
|
||||||
|
when(EDGE, EAST_UP, EDGE_FACE, 0)
|
||||||
|
),
|
||||||
|
variant(slab_model, true, R90, R270))
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
package fr.adrien1106.reframed.generator.block;
|
||||||
|
|
||||||
|
import fr.adrien1106.reframed.ReFramed;
|
||||||
|
import fr.adrien1106.reframed.generator.BlockStateProvider;
|
||||||
|
import fr.adrien1106.reframed.generator.RecipeSetter;
|
||||||
|
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.data.client.MultipartBlockStateSupplier;
|
||||||
|
import net.minecraft.data.server.recipe.RecipeExporter;
|
||||||
|
import net.minecraft.data.server.recipe.RecipeProvider;
|
||||||
|
import net.minecraft.data.server.recipe.ShapelessRecipeJsonBuilder;
|
||||||
|
import net.minecraft.item.ItemConvertible;
|
||||||
|
import net.minecraft.recipe.book.RecipeCategory;
|
||||||
|
|
||||||
|
public class SlabsInnerStair implements RecipeSetter, BlockStateProvider {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRecipe(RecipeExporter exporter, ItemConvertible convertible) {
|
||||||
|
RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, convertible, ReFramed.CUBE);
|
||||||
|
ShapelessRecipeJsonBuilder
|
||||||
|
.create(RecipeCategory.BUILDING_BLOCKS, convertible)
|
||||||
|
.input(ReFramed.HALF_STAIR)
|
||||||
|
.input(ReFramed.SLAB)
|
||||||
|
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
|
||||||
|
.criterion(FabricRecipeProvider.hasItem(convertible), FabricRecipeProvider.conditionsFromItem(convertible))
|
||||||
|
.offerTo(exporter);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MultipartBlockStateSupplier getMultipart(Block block) {
|
||||||
|
return CornerDouble.getMultipart(block, "slabs_inner_stair");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
package fr.adrien1106.reframed.generator.block;
|
||||||
|
|
||||||
|
import fr.adrien1106.reframed.ReFramed;
|
||||||
|
import fr.adrien1106.reframed.generator.BlockStateProvider;
|
||||||
|
import fr.adrien1106.reframed.generator.RecipeSetter;
|
||||||
|
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.data.client.MultipartBlockStateSupplier;
|
||||||
|
import net.minecraft.data.server.recipe.RecipeExporter;
|
||||||
|
import net.minecraft.data.server.recipe.RecipeProvider;
|
||||||
|
import net.minecraft.data.server.recipe.ShapelessRecipeJsonBuilder;
|
||||||
|
import net.minecraft.item.ItemConvertible;
|
||||||
|
import net.minecraft.recipe.book.RecipeCategory;
|
||||||
|
|
||||||
|
public class SlabsOuterStair implements RecipeSetter, BlockStateProvider {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRecipe(RecipeExporter exporter, ItemConvertible convertible) {
|
||||||
|
RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, convertible, ReFramed.CUBE);
|
||||||
|
ShapelessRecipeJsonBuilder
|
||||||
|
.create(RecipeCategory.BUILDING_BLOCKS, convertible)
|
||||||
|
.input(ReFramed.SMALL_CUBE)
|
||||||
|
.input(ReFramed.SLAB)
|
||||||
|
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
|
||||||
|
.criterion(FabricRecipeProvider.hasItem(convertible), FabricRecipeProvider.conditionsFromItem(convertible))
|
||||||
|
.offerTo(exporter);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MultipartBlockStateSupplier getMultipart(Block block) {
|
||||||
|
return CornerDouble.getMultipart(block, "slabs_outer_stair");
|
||||||
|
}
|
||||||
|
}
|
@ -2,23 +2,15 @@ package fr.adrien1106.reframed.generator.block;
|
|||||||
|
|
||||||
import fr.adrien1106.reframed.ReFramed;
|
import fr.adrien1106.reframed.ReFramed;
|
||||||
import fr.adrien1106.reframed.generator.BlockStateProvider;
|
import fr.adrien1106.reframed.generator.BlockStateProvider;
|
||||||
import fr.adrien1106.reframed.generator.GBlockstate;
|
|
||||||
import fr.adrien1106.reframed.generator.RecipeSetter;
|
import fr.adrien1106.reframed.generator.RecipeSetter;
|
||||||
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
|
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.data.client.BlockStateSupplier;
|
import net.minecraft.data.client.BlockStateSupplier;
|
||||||
import net.minecraft.data.client.MultipartBlockStateSupplier;
|
|
||||||
import net.minecraft.data.server.recipe.RecipeExporter;
|
import net.minecraft.data.server.recipe.RecipeExporter;
|
||||||
import net.minecraft.data.server.recipe.RecipeProvider;
|
import net.minecraft.data.server.recipe.RecipeProvider;
|
||||||
import net.minecraft.data.server.recipe.ShapelessRecipeJsonBuilder;
|
import net.minecraft.data.server.recipe.ShapelessRecipeJsonBuilder;
|
||||||
import net.minecraft.item.ItemConvertible;
|
import net.minecraft.item.ItemConvertible;
|
||||||
import net.minecraft.recipe.book.RecipeCategory;
|
import net.minecraft.recipe.book.RecipeCategory;
|
||||||
import net.minecraft.util.Identifier;
|
|
||||||
|
|
||||||
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE;
|
|
||||||
import static fr.adrien1106.reframed.util.blocks.Edge.*;
|
|
||||||
import static fr.adrien1106.reframed.util.blocks.Edge.SOUTH_UP;
|
|
||||||
import static net.minecraft.data.client.VariantSettings.Rotation.*;
|
|
||||||
|
|
||||||
public class SmallCubesStep implements RecipeSetter, BlockStateProvider {
|
public class SmallCubesStep implements RecipeSetter, BlockStateProvider {
|
||||||
|
|
||||||
@ -35,35 +27,6 @@ public class SmallCubesStep implements RecipeSetter, BlockStateProvider {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlockStateSupplier getMultipart(Block block) {
|
public BlockStateSupplier getMultipart(Block block) {
|
||||||
Identifier model_id = ReFramed.id("small_cubes_step_special");
|
return Step.getMultipart(block, "small_cubes_step", "small_cubes_step_reverse");
|
||||||
Identifier reverse_model_id = ReFramed.id("small_cubes_step_reverse_special");
|
|
||||||
return MultipartBlockStateSupplier.create(block)
|
|
||||||
/* X AXIS */
|
|
||||||
.with(GBlockstate.when(EDGE, DOWN_EAST),
|
|
||||||
GBlockstate.variant(model_id, true, R0, R0))
|
|
||||||
.with(GBlockstate.when(EDGE, EAST_UP),
|
|
||||||
GBlockstate.variant(reverse_model_id, true, R180, R0))
|
|
||||||
.with(GBlockstate.when(EDGE, UP_WEST),
|
|
||||||
GBlockstate.variant(model_id, true, R180, R180))
|
|
||||||
.with(GBlockstate.when(EDGE, WEST_DOWN),
|
|
||||||
GBlockstate.variant(reverse_model_id, true, R0, R180))
|
|
||||||
/* Y AXIS */
|
|
||||||
.with(GBlockstate.when(EDGE, EAST_SOUTH),
|
|
||||||
GBlockstate.variant(model_id, true, R90, R0))
|
|
||||||
.with(GBlockstate.when(EDGE, SOUTH_WEST),
|
|
||||||
GBlockstate.variant(model_id, true, R90, R90))
|
|
||||||
.with(GBlockstate.when(EDGE, WEST_NORTH),
|
|
||||||
GBlockstate.variant(model_id, true, R90, R180))
|
|
||||||
.with(GBlockstate.when(EDGE, NORTH_EAST),
|
|
||||||
GBlockstate.variant(model_id, true, R90, R270))
|
|
||||||
/* Z AXIS */
|
|
||||||
.with(GBlockstate.when(EDGE, DOWN_SOUTH),
|
|
||||||
GBlockstate.variant(reverse_model_id, true, R0, R90))
|
|
||||||
.with(GBlockstate.when(EDGE, NORTH_DOWN),
|
|
||||||
GBlockstate.variant(model_id, true, R0, R270))
|
|
||||||
.with(GBlockstate.when(EDGE, UP_NORTH),
|
|
||||||
GBlockstate.variant(reverse_model_id, true, R180, R270))
|
|
||||||
.with(GBlockstate.when(EDGE, SOUTH_UP),
|
|
||||||
GBlockstate.variant(model_id, true, R180, R90));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -36,17 +36,26 @@ public class Step implements RecipeSetter, BlockStateProvider {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlockStateSupplier getMultipart(Block block) {
|
public BlockStateSupplier getMultipart(Block block) {
|
||||||
Identifier model_id = ReFramed.id("step_special");
|
return getMultipart(block, "step");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BlockStateSupplier getMultipart(Block block, String model_name) {
|
||||||
|
return getMultipart(block, model_name, model_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BlockStateSupplier getMultipart(Block block, String model_name, String reverse_model_name) {
|
||||||
|
Identifier model_id = ReFramed.id(model_name + "_special");
|
||||||
|
Identifier reverse_model_id = ReFramed.id(reverse_model_name + "_special");
|
||||||
return MultipartBlockStateSupplier.create(block)
|
return MultipartBlockStateSupplier.create(block)
|
||||||
/* X AXIS */
|
/* X AXIS */
|
||||||
.with(GBlockstate.when(EDGE, DOWN_EAST),
|
.with(GBlockstate.when(EDGE, DOWN_EAST),
|
||||||
GBlockstate.variant(model_id, true, R0, R0))
|
GBlockstate.variant(model_id, true, R0, R0))
|
||||||
.with(GBlockstate.when(EDGE, EAST_UP),
|
.with(GBlockstate.when(EDGE, EAST_UP),
|
||||||
GBlockstate.variant(model_id, true, R180, R0))
|
GBlockstate.variant(reverse_model_id, true, R180, R0))
|
||||||
.with(GBlockstate.when(EDGE, UP_WEST),
|
.with(GBlockstate.when(EDGE, UP_WEST),
|
||||||
GBlockstate.variant(model_id, true, R180, R180))
|
GBlockstate.variant(model_id, true, R180, R180))
|
||||||
.with(GBlockstate.when(EDGE, WEST_DOWN),
|
.with(GBlockstate.when(EDGE, WEST_DOWN),
|
||||||
GBlockstate.variant(model_id, true, R0, R180))
|
GBlockstate.variant(reverse_model_id, true, R0, R180))
|
||||||
/* Y AXIS */
|
/* Y AXIS */
|
||||||
.with(GBlockstate.when(EDGE, EAST_SOUTH),
|
.with(GBlockstate.when(EDGE, EAST_SOUTH),
|
||||||
GBlockstate.variant(model_id, true, R90, R0))
|
GBlockstate.variant(model_id, true, R90, R0))
|
||||||
@ -58,11 +67,11 @@ public class Step implements RecipeSetter, BlockStateProvider {
|
|||||||
GBlockstate.variant(model_id, true, R90, R270))
|
GBlockstate.variant(model_id, true, R90, R270))
|
||||||
/* Z AXIS */
|
/* Z AXIS */
|
||||||
.with(GBlockstate.when(EDGE, DOWN_SOUTH),
|
.with(GBlockstate.when(EDGE, DOWN_SOUTH),
|
||||||
GBlockstate.variant(model_id, true, R0, R90))
|
GBlockstate.variant(reverse_model_id, true, R0, R90))
|
||||||
.with(GBlockstate.when(EDGE, NORTH_DOWN),
|
.with(GBlockstate.when(EDGE, NORTH_DOWN),
|
||||||
GBlockstate.variant(model_id, true, R0, R270))
|
GBlockstate.variant(model_id, true, R0, R270))
|
||||||
.with(GBlockstate.when(EDGE, UP_NORTH),
|
.with(GBlockstate.when(EDGE, UP_NORTH),
|
||||||
GBlockstate.variant(model_id, true, R180, R270))
|
GBlockstate.variant(reverse_model_id, true, R180, R270))
|
||||||
.with(GBlockstate.when(EDGE, SOUTH_UP),
|
.with(GBlockstate.when(EDGE, SOUTH_UP),
|
||||||
GBlockstate.variant(model_id, true, R180, R90));
|
GBlockstate.variant(model_id, true, R180, R90));
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,34 @@
|
|||||||
|
package fr.adrien1106.reframed.generator.block;
|
||||||
|
|
||||||
|
import fr.adrien1106.reframed.ReFramed;
|
||||||
|
import fr.adrien1106.reframed.generator.BlockStateProvider;
|
||||||
|
import fr.adrien1106.reframed.generator.RecipeSetter;
|
||||||
|
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.data.client.BlockStateSupplier;
|
||||||
|
import net.minecraft.data.server.recipe.RecipeExporter;
|
||||||
|
import net.minecraft.data.server.recipe.RecipeProvider;
|
||||||
|
import net.minecraft.data.server.recipe.ShapedRecipeJsonBuilder;
|
||||||
|
import net.minecraft.item.ItemConvertible;
|
||||||
|
import net.minecraft.recipe.book.RecipeCategory;
|
||||||
|
|
||||||
|
public class StepsCross implements RecipeSetter, BlockStateProvider {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRecipe(RecipeExporter exporter, ItemConvertible convertible) {
|
||||||
|
RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, convertible, ReFramed.CUBE, 2);
|
||||||
|
ShapedRecipeJsonBuilder
|
||||||
|
.create(RecipeCategory.BUILDING_BLOCKS, convertible, 8)
|
||||||
|
.pattern(" I")
|
||||||
|
.pattern("I ")
|
||||||
|
.input('I', ReFramed.STEP)
|
||||||
|
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
|
||||||
|
.criterion(FabricRecipeProvider.hasItem(convertible), FabricRecipeProvider.conditionsFromItem(convertible))
|
||||||
|
.offerTo(exporter);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BlockStateSupplier getMultipart(Block block) {
|
||||||
|
return Step.getMultipart(block, "steps_cross");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,69 @@
|
|||||||
|
package fr.adrien1106.reframed.generator.block;
|
||||||
|
|
||||||
|
import fr.adrien1106.reframed.ReFramed;
|
||||||
|
import fr.adrien1106.reframed.generator.BlockStateProvider;
|
||||||
|
import fr.adrien1106.reframed.generator.GBlockstate;
|
||||||
|
import fr.adrien1106.reframed.generator.RecipeSetter;
|
||||||
|
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.data.client.BlockStateSupplier;
|
||||||
|
import net.minecraft.data.server.recipe.RecipeExporter;
|
||||||
|
import net.minecraft.data.server.recipe.RecipeProvider;
|
||||||
|
import net.minecraft.data.server.recipe.ShapelessRecipeJsonBuilder;
|
||||||
|
import net.minecraft.item.ItemConvertible;
|
||||||
|
import net.minecraft.recipe.book.RecipeCategory;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
|
|
||||||
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE;
|
||||||
|
import static fr.adrien1106.reframed.util.blocks.Edge.*;
|
||||||
|
import static net.minecraft.data.client.VariantSettings.Rotation.*;
|
||||||
|
|
||||||
|
public class StepsHalfLayer implements RecipeSetter, BlockStateProvider {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRecipe(RecipeExporter exporter, ItemConvertible convertible) {
|
||||||
|
RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, convertible, ReFramed.CUBE, 4);
|
||||||
|
ShapelessRecipeJsonBuilder
|
||||||
|
.create(RecipeCategory.BUILDING_BLOCKS, convertible)
|
||||||
|
.input(ReFramed.HALF_LAYER)
|
||||||
|
.input(ReFramed.STEP)
|
||||||
|
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
|
||||||
|
.criterion(FabricRecipeProvider.hasItem(convertible), FabricRecipeProvider.conditionsFromItem(convertible))
|
||||||
|
.offerTo(exporter);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BlockStateSupplier getMultipart(Block block) {
|
||||||
|
Identifier step_model = ReFramed.id("step_special");
|
||||||
|
return HalfLayer.getMultipart(block, "second_half_layer")
|
||||||
|
/* X AXIS */
|
||||||
|
.with(GBlockstate.when(EDGE, DOWN_EAST),
|
||||||
|
GBlockstate.variant(step_model, true, R0, R0))
|
||||||
|
.with(GBlockstate.when(EDGE, EAST_UP),
|
||||||
|
GBlockstate.variant(step_model, true, R180, R0))
|
||||||
|
.with(GBlockstate.when(EDGE, UP_WEST),
|
||||||
|
GBlockstate.variant(step_model, true, R180, R180))
|
||||||
|
.with(GBlockstate.when(EDGE, WEST_DOWN),
|
||||||
|
GBlockstate.variant(step_model, true, R0, R180))
|
||||||
|
/* Y AXIS */
|
||||||
|
.with(GBlockstate.when(EDGE, EAST_SOUTH),
|
||||||
|
GBlockstate.variant(step_model, true, R90, R0))
|
||||||
|
.with(GBlockstate.when(EDGE, SOUTH_WEST),
|
||||||
|
GBlockstate.variant(step_model, true, R90, R90))
|
||||||
|
.with(GBlockstate.when(EDGE, WEST_NORTH),
|
||||||
|
GBlockstate.variant(step_model, true, R90, R180))
|
||||||
|
.with(GBlockstate.when(EDGE, NORTH_EAST),
|
||||||
|
GBlockstate.variant(step_model, true, R90, R270))
|
||||||
|
/* Z AXIS */
|
||||||
|
.with(GBlockstate.when(EDGE, DOWN_SOUTH),
|
||||||
|
GBlockstate.variant(step_model, true, R0, R90))
|
||||||
|
.with(GBlockstate.when(EDGE, NORTH_DOWN),
|
||||||
|
GBlockstate.variant(step_model, true, R0, R270))
|
||||||
|
.with(GBlockstate.when(EDGE, UP_NORTH),
|
||||||
|
GBlockstate.variant(step_model, true, R180, R270))
|
||||||
|
.with(GBlockstate.when(EDGE, SOUTH_UP),
|
||||||
|
GBlockstate.variant(step_model, true, R180, R90))
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -9,7 +9,7 @@ import net.minecraft.block.Block;
|
|||||||
import net.minecraft.data.client.MultipartBlockStateSupplier;
|
import net.minecraft.data.client.MultipartBlockStateSupplier;
|
||||||
import net.minecraft.data.server.recipe.RecipeExporter;
|
import net.minecraft.data.server.recipe.RecipeExporter;
|
||||||
import net.minecraft.data.server.recipe.RecipeProvider;
|
import net.minecraft.data.server.recipe.RecipeProvider;
|
||||||
import net.minecraft.data.server.recipe.ShapelessRecipeJsonBuilder;
|
import net.minecraft.data.server.recipe.ShapedRecipeJsonBuilder;
|
||||||
import net.minecraft.item.ItemConvertible;
|
import net.minecraft.item.ItemConvertible;
|
||||||
import net.minecraft.recipe.book.RecipeCategory;
|
import net.minecraft.recipe.book.RecipeCategory;
|
||||||
import net.minecraft.util.Identifier;
|
import net.minecraft.util.Identifier;
|
||||||
@ -25,9 +25,10 @@ public class StepsSlab implements RecipeSetter, BlockStateProvider {
|
|||||||
@Override
|
@Override
|
||||||
public void setRecipe(RecipeExporter exporter, ItemConvertible convertible) {
|
public void setRecipe(RecipeExporter exporter, ItemConvertible convertible) {
|
||||||
RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, convertible, ReFramed.CUBE, 2);
|
RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, convertible, ReFramed.CUBE, 2);
|
||||||
ShapelessRecipeJsonBuilder
|
ShapedRecipeJsonBuilder
|
||||||
.create(RecipeCategory.BUILDING_BLOCKS, convertible)
|
.create(RecipeCategory.BUILDING_BLOCKS, convertible)
|
||||||
.input(ReFramed.STEP, 2)
|
.pattern("II")
|
||||||
|
.input('I', ReFramed.STEP)
|
||||||
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
|
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
|
||||||
.criterion(FabricRecipeProvider.hasItem(convertible), FabricRecipeProvider.conditionsFromItem(convertible))
|
.criterion(FabricRecipeProvider.hasItem(convertible), FabricRecipeProvider.conditionsFromItem(convertible))
|
||||||
.offerTo(exporter);
|
.offerTo(exporter);
|
||||||
|
@ -74,7 +74,14 @@ public class ReFramedBlueprintWrittenItem extends Item {
|
|||||||
stacks.stream().map(inventory::getSlotWithStack).forEach(index -> inventory.removeStack(index, 1));
|
stacks.stream().map(inventory::getSlotWithStack).forEach(index -> inventory.removeStack(index, 1));
|
||||||
player.playSound(SoundEvents.ENTITY_ITEM_PICKUP, 0.5f, 0.5f);
|
player.playSound(SoundEvents.ENTITY_ITEM_PICKUP, 0.5f, 0.5f);
|
||||||
}
|
}
|
||||||
frame_entity.readNbt(tag);
|
for (int i = 1; tag.contains(BLOCKSTATE_KEY + i); i++) {
|
||||||
|
BlockState state = NbtHelper.toBlockState(
|
||||||
|
Registries.BLOCK.getReadOnlyWrapper(),
|
||||||
|
tag.getCompound(BLOCKSTATE_KEY + i)
|
||||||
|
);
|
||||||
|
frame_entity.setTheme(state, i);
|
||||||
|
}
|
||||||
|
if (world.isClient) ReFramed.chunkRerenderProxy.accept(world, pos);
|
||||||
world.playSound(player, player.getBlockPos(), SoundEvents.ITEM_BOOK_PAGE_TURN, SoundCategory.PLAYERS);
|
world.playSound(player, player.getBlockPos(), SoundEvents.ITEM_BOOK_PAGE_TURN, SoundCategory.PLAYERS);
|
||||||
|
|
||||||
return ActionResult.SUCCESS;
|
return ActionResult.SUCCESS;
|
||||||
|
@ -43,7 +43,7 @@ public class ReFramedHammerItem extends Item {
|
|||||||
world.playSound(player, pos, SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.BLOCKS, 1f, 1.1f);
|
world.playSound(player, pos, SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.BLOCKS, 1f, 1.1f);
|
||||||
}
|
}
|
||||||
frame_entity.setTheme(Blocks.AIR.getDefaultState(), theme_index);
|
frame_entity.setTheme(Blocks.AIR.getDefaultState(), theme_index);
|
||||||
ReFramed.chunkRerenderProxy.accept(world, pos);
|
if (world.isClient) ReFramed.chunkRerenderProxy.accept(world, pos);
|
||||||
return ActionResult.SUCCESS;
|
return ActionResult.SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -52,7 +52,7 @@ public class ReFramedScrewdriverItem extends Item {
|
|||||||
case Z -> Direction.Axis.X;
|
case Z -> Direction.Axis.X;
|
||||||
}
|
}
|
||||||
), theme_index);
|
), theme_index);
|
||||||
ReFramed.chunkRerenderProxy.accept(world, pos);
|
if (world.isClient) ReFramed.chunkRerenderProxy.accept(world, pos);
|
||||||
return ActionResult.SUCCESS;
|
return ActionResult.SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -201,5 +201,24 @@ public class VoxelHelper {
|
|||||||
}
|
}
|
||||||
return shapes;
|
return shapes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* build a new set of voxels based on the combination of two sets of voxels
|
||||||
|
* @param long_voxels - the first set of voxels
|
||||||
|
* @param short_voxels - the second set of voxels
|
||||||
|
* @param mapping_function - the function to map the index of the first set to the index of the second set
|
||||||
|
* @return the array of added voxels
|
||||||
|
*/
|
||||||
|
public static VoxelShape[] buildFrom(VoxelShape[] long_voxels, VoxelShape[] short_voxels, Function<Integer, Integer> mapping_function) {
|
||||||
|
VoxelShape[] shapes = new VoxelShape[long_voxels.length];
|
||||||
|
for (int i = 0; i < shapes.length; i++) {
|
||||||
|
shapes[i] = VoxelShapes.combineAndSimplify(
|
||||||
|
long_voxels[i],
|
||||||
|
short_voxels[mapping_function.apply(i)],
|
||||||
|
BooleanBiFunction.OR
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return shapes;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,5 +10,6 @@ public class BlockProperties {
|
|||||||
public static final IntProperty EDGE_FACE = IntProperty.of("face", 0, 1);
|
public static final IntProperty EDGE_FACE = IntProperty.of("face", 0, 1);
|
||||||
public static final EnumProperty<Corner> CORNER = EnumProperty.of("corner", Corner.class);
|
public static final EnumProperty<Corner> CORNER = EnumProperty.of("corner", Corner.class);
|
||||||
public static final IntProperty CORNER_FACE = IntProperty.of("face", 0, 2);
|
public static final IntProperty CORNER_FACE = IntProperty.of("face", 0, 2);
|
||||||
|
public static final IntProperty CORNER_FEATURE = IntProperty.of("corner_feature", 0, 1);
|
||||||
public static final EnumProperty<StairShape> STAIR_SHAPE = EnumProperty.of("shape", StairShape.class);
|
public static final EnumProperty<StairShape> STAIR_SHAPE = EnumProperty.of("shape", StairShape.class);
|
||||||
}
|
}
|
||||||
|
@ -116,6 +116,14 @@ public enum Corner implements StringIdentifiable {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Edge getEdgeWith(Direction direction) {
|
||||||
|
return Edge.getByDirections(
|
||||||
|
first_direction == direction ? first_direction : second_direction,
|
||||||
|
first_direction == direction ? second_direction : third_direction
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public Direction getOtherDirection(Edge edge) {
|
public Direction getOtherDirection(Edge edge) {
|
||||||
if (edge.getFirstDirection() != second_direction && edge.getSecondDirection() != second_direction) return second_direction;
|
if (edge.getFirstDirection() != second_direction && edge.getSecondDirection() != second_direction) return second_direction;
|
||||||
if (edge.getFirstDirection() != third_direction && edge.getSecondDirection() != third_direction) return third_direction;
|
if (edge.getFirstDirection() != third_direction && edge.getSecondDirection() != third_direction) return third_direction;
|
||||||
@ -137,4 +145,13 @@ public enum Corner implements StringIdentifiable {
|
|||||||
mirror.apply(third_direction)
|
mirror.apply(third_direction)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Corner change(Direction face) {
|
||||||
|
Direction opposite = face.getOpposite();
|
||||||
|
return getByDirections(
|
||||||
|
first_direction == face ? opposite : first_direction,
|
||||||
|
second_direction == face ? opposite : second_direction,
|
||||||
|
third_direction == face ? opposite : third_direction
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [8, 0, 0],
|
||||||
|
"to": [16, 10, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [0, 6, 8, 16], "texture": "#side", "cullface": "north"},
|
||||||
|
"east": {"uv": [0, 6, 16, 16], "texture": "#side", "cullface": "east"},
|
||||||
|
"south": {"uv": [8, 6, 16, 16], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [0, 6, 16, 16], "texture": "#side"},
|
||||||
|
"up": {"uv": [8, 0, 16, 16], "texture": "#top"},
|
||||||
|
"down": {"uv": [8, 0, 16, 16], "texture": "#bottom", "cullface": "down"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [8, 0, 0],
|
||||||
|
"to": [16, 12, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [0, 4, 8, 16], "texture": "#side", "cullface": "north"},
|
||||||
|
"east": {"uv": [0, 4, 16, 16], "texture": "#side", "cullface": "east"},
|
||||||
|
"south": {"uv": [8, 4, 16, 16], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [0, 4, 16, 16], "texture": "#side"},
|
||||||
|
"up": {"uv": [8, 0, 16, 16], "texture": "#top"},
|
||||||
|
"down": {"uv": [8, 0, 16, 16], "texture": "#bottom", "cullface": "down"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [8, 0, 0],
|
||||||
|
"to": [16, 14, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [0, 2, 8, 16], "texture": "#side", "cullface": "north"},
|
||||||
|
"east": {"uv": [0, 2, 16, 16], "texture": "#side", "cullface": "east"},
|
||||||
|
"south": {"uv": [8, 2, 16, 16], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [0, 2, 16, 16], "texture": "#side"},
|
||||||
|
"up": {"uv": [8, 0, 16, 16], "texture": "#top"},
|
||||||
|
"down": {"uv": [8, 0, 16, 16], "texture": "#bottom", "cullface": "down"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [8, 0, 0],
|
||||||
|
"to": [16, 16, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [0, 0, 8, 16], "texture": "#side", "cullface": "north"},
|
||||||
|
"east": {"uv": [0, 0, 16, 16], "texture": "#side", "cullface": "east"},
|
||||||
|
"south": {"uv": [8, 0, 16, 16], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [0, 0, 16, 16], "texture": "#side"},
|
||||||
|
"up": {"uv": [8, 0, 16, 16], "texture": "#top", "cullface": "up"},
|
||||||
|
"down": {"uv": [8, 0, 16, 16], "texture": "#bottom", "cullface": "down"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [8, 0, 0],
|
||||||
|
"to": [16, 2, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [0, 14, 8, 16], "texture": "#side", "cullface": "north"},
|
||||||
|
"east": {"uv": [0, 14, 16, 16], "texture": "#side", "cullface": "east"},
|
||||||
|
"south": {"uv": [8, 14, 16, 16], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [0, 14, 16, 16], "texture": "#side"},
|
||||||
|
"up": {"uv": [8, 0, 16, 16], "texture": "#top"},
|
||||||
|
"down": {"uv": [8, 0, 16, 16], "texture": "#bottom", "cullface": "down"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [8, 0, 0],
|
||||||
|
"to": [16, 4, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [0, 12, 8, 16], "texture": "#side", "cullface": "north"},
|
||||||
|
"east": {"uv": [0, 12, 16, 16], "texture": "#side", "cullface": "east"},
|
||||||
|
"south": {"uv": [8, 12, 16, 16], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [0, 12, 16, 16], "texture": "#side"},
|
||||||
|
"up": {"uv": [8, 0, 16, 16], "texture": "#top"},
|
||||||
|
"down": {"uv": [8, 0, 16, 16], "texture": "#bottom", "cullface": "down"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [8, 0, 0],
|
||||||
|
"to": [16, 6, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [0, 10, 8, 16], "texture": "#side", "cullface": "north"},
|
||||||
|
"east": {"uv": [0, 10, 16, 16], "texture": "#side", "cullface": "east"},
|
||||||
|
"south": {"uv": [8, 10, 16, 16], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [0, 10, 16, 16], "texture": "#side"},
|
||||||
|
"up": {"uv": [8, 0, 16, 16], "texture": "#top"},
|
||||||
|
"down": {"uv": [8, 0, 16, 16], "texture": "#bottom", "cullface": "down"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [8, 0, 0],
|
||||||
|
"to": [16, 8, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [0, 8, 8, 16], "texture": "#side", "cullface": "north"},
|
||||||
|
"east": {"uv": [0, 8, 16, 16], "texture": "#side", "cullface": "east"},
|
||||||
|
"south": {"uv": [8, 8, 16, 16], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [0, 8, 16, 16], "texture": "#side"},
|
||||||
|
"up": {"uv": [8, 0, 16, 16], "texture": "#top"},
|
||||||
|
"down": {"uv": [8, 0, 16, 16], "texture": "#bottom", "cullface": "down"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [6, 0, 8],
|
||||||
|
"to": [16, 16, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [0, 0, 10, 16], "texture": "#side"},
|
||||||
|
"east": {"uv": [0, 0, 8, 16], "texture": "#side", "cullface": "east"},
|
||||||
|
"south": {"uv": [6, 0, 16, 16], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [8, 0, 16, 16], "texture": "#side"},
|
||||||
|
"up": {"uv": [6, 8, 16, 16], "texture": "#top", "cullface": "up"},
|
||||||
|
"down": {"uv": [6, 0, 16, 8], "texture": "#bottom", "cullface": "down"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [4, 0, 8],
|
||||||
|
"to": [16, 16, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [0, 0, 12, 16], "texture": "#side"},
|
||||||
|
"east": {"uv": [0, 0, 8, 16], "texture": "#side", "cullface": "east"},
|
||||||
|
"south": {"uv": [4, 0, 16, 16], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [8, 0, 16, 16], "texture": "#side"},
|
||||||
|
"up": {"uv": [4, 8, 16, 16], "texture": "#top", "cullface": "up"},
|
||||||
|
"down": {"uv": [4, 0, 16, 8], "texture": "#bottom", "cullface": "down"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [2, 0, 8],
|
||||||
|
"to": [16, 16, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [0, 0, 14, 16], "texture": "#side"},
|
||||||
|
"east": {"uv": [0, 0, 8, 16], "texture": "#side", "cullface": "east"},
|
||||||
|
"south": {"uv": [2, 0, 16, 16], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [8, 0, 16, 16], "texture": "#side"},
|
||||||
|
"up": {"uv": [2, 8, 16, 16], "texture": "#top", "cullface": "up"},
|
||||||
|
"down": {"uv": [2, 0, 16, 8], "texture": "#bottom", "cullface": "down"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [0, 0, 8],
|
||||||
|
"to": [16, 16, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [0, 0, 16, 16], "texture": "#side"},
|
||||||
|
"east": {"uv": [0, 0, 8, 16], "texture": "#side", "cullface": "east"},
|
||||||
|
"south": {"uv": [0, 0, 16, 16], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [8, 0, 16, 16], "texture": "#side", "cullface": "west"},
|
||||||
|
"up": {"uv": [0, 8, 16, 16], "texture": "#top", "cullface": "up"},
|
||||||
|
"down": {"uv": [0, 0, 16, 8], "texture": "#bottom", "cullface": "down"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [14, 0, 8],
|
||||||
|
"to": [16, 16, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [0, 0, 2, 16], "texture": "#side"},
|
||||||
|
"east": {"uv": [0, 0, 8, 16], "texture": "#side", "cullface": "east"},
|
||||||
|
"south": {"uv": [14, 0, 16, 16], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [8, 0, 16, 16], "texture": "#side"},
|
||||||
|
"up": {"uv": [14, 8, 16, 16], "texture": "#top", "cullface": "up"},
|
||||||
|
"down": {"uv": [14, 0, 16, 8], "texture": "#bottom", "cullface": "down"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [12, 0, 8],
|
||||||
|
"to": [16, 16, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [0, 0, 4, 16], "texture": "#side"},
|
||||||
|
"east": {"uv": [0, 0, 8, 16], "texture": "#side", "cullface": "east"},
|
||||||
|
"south": {"uv": [12, 0, 16, 16], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [8, 0, 16, 16], "texture": "#side"},
|
||||||
|
"up": {"uv": [12, 8, 16, 16], "texture": "#top", "cullface": "up"},
|
||||||
|
"down": {"uv": [12, 0, 16, 8], "texture": "#bottom", "cullface": "down"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [10, 0, 8],
|
||||||
|
"to": [16, 16, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [0, 0, 6, 16], "texture": "#side"},
|
||||||
|
"east": {"uv": [0, 0, 8, 16], "texture": "#side", "cullface": "east"},
|
||||||
|
"south": {"uv": [10, 0, 16, 16], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [8, 0, 16, 16], "texture": "#side"},
|
||||||
|
"up": {"uv": [10, 8, 16, 16], "texture": "#top", "cullface": "up"},
|
||||||
|
"down": {"uv": [10, 0, 16, 8], "texture": "#bottom", "cullface": "down"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [8, 0, 8],
|
||||||
|
"to": [16, 16, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [0, 0, 8, 16], "texture": "#side"},
|
||||||
|
"east": {"uv": [0, 0, 8, 16], "texture": "#side", "cullface": "east"},
|
||||||
|
"south": {"uv": [8, 0, 16, 16], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [8, 0, 16, 16], "texture": "#side"},
|
||||||
|
"up": {"uv": [8, 8, 16, 16], "texture": "#top", "cullface": "up"},
|
||||||
|
"down": {"uv": [8, 0, 16, 8], "texture": "#bottom", "cullface": "down"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [6, 8, 0],
|
||||||
|
"to": [16, 16, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [0, 16, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [0, 0, 10, 8], "texture": "#side", "cullface": "north"},
|
||||||
|
"east": {"uv": [0, 0, 16, 8], "texture": "#side", "cullface": "east"},
|
||||||
|
"south": {"uv": [6, 0, 16, 8], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [0, 0, 16, 8], "texture": "#side"},
|
||||||
|
"up": {"uv": [6, 0, 16, 16], "texture": "#top", "cullface": "up"},
|
||||||
|
"down": {"uv": [6, 0, 16, 16], "texture": "#bottom"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [4, 8, 0],
|
||||||
|
"to": [16, 16, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [0, 16, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [0, 0, 12, 8], "texture": "#side", "cullface": "north"},
|
||||||
|
"east": {"uv": [0, 0, 16, 8], "texture": "#side", "cullface": "east"},
|
||||||
|
"south": {"uv": [4, 0, 16, 8], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [0, 0, 16, 8], "texture": "#side"},
|
||||||
|
"up": {"uv": [4, 0, 16, 16], "texture": "#top", "cullface": "up"},
|
||||||
|
"down": {"uv": [4, 0, 16, 16], "texture": "#bottom"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [2, 8, 0],
|
||||||
|
"to": [16, 16, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [0, 16, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [0, 0, 14, 8], "texture": "#side", "cullface": "north"},
|
||||||
|
"east": {"uv": [0, 0, 16, 8], "texture": "#side", "cullface": "east"},
|
||||||
|
"south": {"uv": [2, 0, 16, 8], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [0, 0, 16, 8], "texture": "#side"},
|
||||||
|
"up": {"uv": [2, 0, 16, 16], "texture": "#top", "cullface": "up"},
|
||||||
|
"down": {"uv": [2, 0, 16, 16], "texture": "#bottom"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [0, 8, 0],
|
||||||
|
"to": [16, 16, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [0, 16, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [0, 0, 16, 8], "texture": "#side", "cullface": "north"},
|
||||||
|
"east": {"uv": [0, 0, 16, 8], "texture": "#side", "cullface": "east"},
|
||||||
|
"south": {"uv": [0, 0, 16, 8], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [0, 0, 16, 8], "texture": "#side", "cullface": "west"},
|
||||||
|
"up": {"uv": [0, 0, 16, 16], "texture": "#top", "cullface": "up"},
|
||||||
|
"down": {"uv": [0, 0, 16, 16], "texture": "#bottom"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [14, 8, 0],
|
||||||
|
"to": [16, 16, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [0, 16, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [0, 0, 2, 8], "texture": "#side", "cullface": "north"},
|
||||||
|
"east": {"uv": [0, 0, 16, 8], "texture": "#side", "cullface": "east"},
|
||||||
|
"south": {"uv": [14, 0, 16, 8], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [0, 0, 16, 8], "texture": "#side"},
|
||||||
|
"up": {"uv": [14, 0, 16, 16], "texture": "#top", "cullface": "up"},
|
||||||
|
"down": {"uv": [14, 0, 16, 16], "texture": "#bottom"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [12, 8, 0],
|
||||||
|
"to": [16, 16, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [0, 16, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [0, 0, 4, 8], "texture": "#side", "cullface": "north"},
|
||||||
|
"east": {"uv": [0, 0, 16, 8], "texture": "#side", "cullface": "east"},
|
||||||
|
"south": {"uv": [12, 0, 16, 8], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [0, 0, 16, 8], "texture": "#side"},
|
||||||
|
"up": {"uv": [12, 0, 16, 16], "texture": "#top", "cullface": "up"},
|
||||||
|
"down": {"uv": [12, 0, 16, 16], "texture": "#bottom"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [10, 8, 0],
|
||||||
|
"to": [16, 16, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [0, 16, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [0, 0, 6, 8], "texture": "#side", "cullface": "north"},
|
||||||
|
"east": {"uv": [0, 0, 16, 8], "texture": "#side", "cullface": "east"},
|
||||||
|
"south": {"uv": [10, 0, 16, 8], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [0, 0, 16, 8], "texture": "#side"},
|
||||||
|
"up": {"uv": [10, 0, 16, 16], "texture": "#top", "cullface": "up"},
|
||||||
|
"down": {"uv": [10, 0, 16, 16], "texture": "#bottom"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [8, 8, 0],
|
||||||
|
"to": [16, 16, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [0, 16, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [0, 0, 8, 8], "texture": "#side", "cullface": "north"},
|
||||||
|
"east": {"uv": [0, 0, 16, 8], "texture": "#side", "cullface": "east"},
|
||||||
|
"south": {"uv": [8, 0, 16, 8], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [0, 0, 16, 8], "texture": "#side"},
|
||||||
|
"up": {"uv": [8, 0, 16, 16], "texture": "#top", "cullface": "up"},
|
||||||
|
"down": {"uv": [8, 0, 16, 16], "texture": "#bottom"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [0, 0, 6],
|
||||||
|
"to": [8, 16, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [-8, 8, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [8, 0, 16, 16], "texture": "#side"},
|
||||||
|
"east": {"uv": [0, 0, 10, 16], "texture": "#side"},
|
||||||
|
"south": {"uv": [0, 0, 8, 16], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [6, 0, 16, 16], "texture": "#side", "cullface": "east"},
|
||||||
|
"up": {"uv": [0, 6, 8, 16], "texture": "#top", "cullface": "up"},
|
||||||
|
"down": {"uv": [0, 0, 8, 10], "texture": "#bottom", "cullface": "down"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [0, 0, 4],
|
||||||
|
"to": [8, 16, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [-8, 8, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [8, 0, 16, 16], "texture": "#side"},
|
||||||
|
"east": {"uv": [0, 0, 12, 16], "texture": "#side"},
|
||||||
|
"south": {"uv": [0, 0, 8, 16], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [4, 0, 16, 16], "texture": "#side", "cullface": "east"},
|
||||||
|
"up": {"uv": [0, 4, 8, 16], "texture": "#top", "cullface": "up"},
|
||||||
|
"down": {"uv": [0, 0, 8, 12], "texture": "#bottom", "cullface": "down"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [0, 0, 2],
|
||||||
|
"to": [8, 16, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [-8, 8, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [8, 0, 16, 16], "texture": "#side"},
|
||||||
|
"east": {"uv": [0, 0, 14, 16], "texture": "#side"},
|
||||||
|
"south": {"uv": [0, 0, 8, 16], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [2, 0, 16, 16], "texture": "#side", "cullface": "east"},
|
||||||
|
"up": {"uv": [0, 2, 8, 16], "texture": "#top", "cullface": "up"},
|
||||||
|
"down": {"uv": [0, 0, 8, 14], "texture": "#bottom", "cullface": "down"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [0, 0, 0],
|
||||||
|
"to": [8, 16, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [-8, 8, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [8, 0, 16, 16], "texture": "#side", "cullface": "north"},
|
||||||
|
"east": {"uv": [0, 0, 16, 16], "texture": "#side"},
|
||||||
|
"south": {"uv": [0, 0, 8, 16], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [0, 0, 16, 16], "texture": "#side", "cullface": "east"},
|
||||||
|
"up": {"uv": [0, 0, 8, 16], "texture": "#top", "cullface": "up"},
|
||||||
|
"down": {"uv": [0, 0, 8, 16], "texture": "#bottom", "cullface": "down"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [0, 0, 14],
|
||||||
|
"to": [8, 16, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [-8, 8, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [8, 0, 16, 16], "texture": "#side"},
|
||||||
|
"east": {"uv": [0, 0, 2, 16], "texture": "#side"},
|
||||||
|
"south": {"uv": [0, 0, 8, 16], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [14, 0, 16, 16], "texture": "#side", "cullface": "east"},
|
||||||
|
"up": {"uv": [0, 14, 8, 16], "texture": "#top", "cullface": "up"},
|
||||||
|
"down": {"uv": [0, 0, 8, 2], "texture": "#bottom", "cullface": "down"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [0, 0, 12],
|
||||||
|
"to": [8, 16, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [-8, 8, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [8, 0, 16, 16], "texture": "#side"},
|
||||||
|
"east": {"uv": [0, 0, 4, 16], "texture": "#side"},
|
||||||
|
"south": {"uv": [0, 0, 8, 16], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [12, 0, 16, 16], "texture": "#side", "cullface": "east"},
|
||||||
|
"up": {"uv": [0, 12, 8, 16], "texture": "#top", "cullface": "up"},
|
||||||
|
"down": {"uv": [0, 0, 8, 4], "texture": "#bottom", "cullface": "down"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [0, 0, 10],
|
||||||
|
"to": [8, 16, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [-8, 8, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [8, 0, 16, 16], "texture": "#side"},
|
||||||
|
"east": {"uv": [0, 0, 6, 16], "texture": "#side"},
|
||||||
|
"south": {"uv": [0, 0, 8, 16], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [10, 0, 16, 16], "texture": "#side", "cullface": "east"},
|
||||||
|
"up": {"uv": [0, 10, 8, 16], "texture": "#top", "cullface": "up"},
|
||||||
|
"down": {"uv": [0, 0, 8, 6], "texture": "#bottom", "cullface": "down"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"credit": "Made with Blockbench",
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "#side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [0, 0, 8],
|
||||||
|
"to": [8, 16, 16],
|
||||||
|
"rotation": {"angle": 0, "axis": "y", "origin": [-8, 8, 0]},
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [8, 0, 16, 16], "texture": "#side"},
|
||||||
|
"east": {"uv": [0, 0, 8, 16], "texture": "#side"},
|
||||||
|
"south": {"uv": [0, 0, 8, 16], "texture": "#side", "cullface": "south"},
|
||||||
|
"west": {"uv": [8, 0, 16, 16], "texture": "#side", "cullface": "east"},
|
||||||
|
"up": {"uv": [0, 8, 8, 16], "texture": "#top", "cullface": "up"},
|
||||||
|
"down": {"uv": [0, 0, 8, 8], "texture": "#bottom", "cullface": "down"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user