Compare commits

..

6 Commits

86 changed files with 3950 additions and 967 deletions

View File

@ -9,7 +9,7 @@ loader_version=0.15.6
# Mod Properties # Mod Properties
modrinth_id = jCpoCBpn modrinth_id = jCpoCBpn
mod_version = 1.5.6 mod_version = 1.5.7
maven_group = fr.adrien1106 maven_group = fr.adrien1106
archives_base_name = ReFramed archives_base_name = ReFramed
mod_id = reframed mod_id = reframed

View File

@ -28,16 +28,17 @@ import java.util.stream.Stream;
import static fr.adrien1106.reframed.util.blocks.BlockProperties.LIGHT; import static fr.adrien1106.reframed.util.blocks.BlockProperties.LIGHT;
/** /**
* TODO Dynamic Ambient Occlusion -> for v1.6 * TODO Dynamic Ambient Occlusion -> for v1.6
* TODO add minecraft models like wall fence etc -> for v1.6 * TODO add minecraft models like wall fence etc -> for v1.6
* TODO better connected textures -> maybe v1.6 ? * TODO better connected textures -> maybe v1.6 ?
* TODO support continuity overlays -> not scheduled * TODO support continuity overlays -> not scheduled
* TODO better state caching per models (e.g. wall only has 3 max per model) -> not scheduled
*/ */
public class ReFramed implements ModInitializer { 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 CUBE, SMALL_CUBE, SMALL_CUBES_STEP, STAIR, HALF_STAIR, STAIRS_CUBE, HALF_STAIRS_SLAB, HALF_STAIRS_STAIR, SLAB, SLABS_CUBE, STEP, STEPS_SLAB, LAYER, PILLAR; public static Block CUBE, SMALL_CUBE, SMALL_CUBES_STEP, STAIR, HALF_STAIR, STAIRS_CUBE, HALF_STAIRS_SLAB, HALF_STAIRS_STAIR, SLAB, SLABS_CUBE, STEP, STEPS_SLAB, LAYER, PILLAR, WALL;
public static final ArrayList<Item> ITEMS = new ArrayList<>(); public static final ArrayList<Item> ITEMS = new ArrayList<>();
public static Item HAMMER, SCREWDRIVER, BLUEPRINT, BLUEPRINT_WRITTEN; public static Item HAMMER, SCREWDRIVER, BLUEPRINT, BLUEPRINT_WRITTEN;
@ -65,6 +66,7 @@ public class ReFramed implements ModInitializer {
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)));
PILLAR = registerBlock("pillar" , new ReFramedPillarBlock(cp(Blocks.OAK_FENCE))); PILLAR = registerBlock("pillar" , new ReFramedPillarBlock(cp(Blocks.OAK_FENCE)));
WALL = registerBlock("wall" , new ReframedWallBlock(cp(Blocks.OAK_FENCE)));
HAMMER = registerItem("hammer" , new ReFramedHammerItem(new Item.Settings().maxCount(1))); HAMMER = registerItem("hammer" , new ReFramedHammerItem(new Item.Settings().maxCount(1)));
SCREWDRIVER = registerItem("screwdriver" , new ReFramedScrewdriverItem(new Item.Settings().maxCount(1))); SCREWDRIVER = registerItem("screwdriver" , new ReFramedScrewdriverItem(new Item.Settings().maxCount(1)));

View File

@ -1,13 +1,9 @@
package fr.adrien1106.reframed.block; package fr.adrien1106.reframed.block;
import fr.adrien1106.reframed.ReFramed; import fr.adrien1106.reframed.ReFramed;
import fr.adrien1106.reframed.generator.RecipeSetter;
import fr.adrien1106.reframed.util.blocks.BlockHelper; import fr.adrien1106.reframed.util.blocks.BlockHelper;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
import net.minecraft.block.*; import net.minecraft.block.*;
import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntity;
import net.minecraft.data.server.recipe.RecipeExporter;
import net.minecraft.data.server.recipe.ShapedRecipeJsonBuilder;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.BlockItem; import net.minecraft.item.BlockItem;
@ -16,7 +12,6 @@ import net.minecraft.item.ItemStack;
import net.minecraft.item.Items; import net.minecraft.item.Items;
import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtHelper; import net.minecraft.nbt.NbtHelper;
import net.minecraft.recipe.book.RecipeCategory;
import net.minecraft.registry.Registries; import net.minecraft.registry.Registries;
import net.minecraft.state.StateManager; import net.minecraft.state.StateManager;
import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResult;
@ -41,7 +36,7 @@ import java.util.stream.IntStream;
import static fr.adrien1106.reframed.block.ReFramedEntity.BLOCKSTATE_KEY; import static fr.adrien1106.reframed.block.ReFramedEntity.BLOCKSTATE_KEY;
import static fr.adrien1106.reframed.util.blocks.BlockProperties.LIGHT; import static fr.adrien1106.reframed.util.blocks.BlockProperties.LIGHT;
public class ReFramedBlock extends Block implements BlockEntityProvider, RecipeSetter { public class ReFramedBlock extends Block implements BlockEntityProvider {
public ReFramedBlock(Settings settings) { public ReFramedBlock(Settings settings) {
super(settings); super(settings);
@ -225,18 +220,4 @@ public class ReFramedBlock extends Block implements BlockEntityProvider, RecipeS
public Map<Integer, Integer> getThemeMap(BlockState state, BlockState new_state) { public Map<Integer, Integer> getThemeMap(BlockState state, BlockState new_state) {
return Map.of(); return Map.of();
} }
@Override
public void setRecipe(RecipeExporter exporter) {
ShapedRecipeJsonBuilder
.create(RecipeCategory.BUILDING_BLOCKS, this)
.pattern("III")
.pattern("I~I")
.pattern("III")
.input('I', Items.BAMBOO)
.input('~', Items.STRING)
.criterion(FabricRecipeProvider.hasItem(Items.BAMBOO), FabricRecipeProvider.conditionsFromItem(Items.BAMBOO))
.criterion(FabricRecipeProvider.hasItem(this), FabricRecipeProvider.conditionsFromItem(this))
.offerTo(exporter);
}
} }

View File

@ -1,25 +1,15 @@
package fr.adrien1106.reframed.block; package fr.adrien1106.reframed.block;
import fr.adrien1106.reframed.ReFramed; import fr.adrien1106.reframed.ReFramed;
import fr.adrien1106.reframed.generator.BlockStateProvider;
import fr.adrien1106.reframed.generator.GBlockstate;
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.Corner;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
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.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.ShapedRecipeJsonBuilder;
import net.minecraft.item.BlockItem; import net.minecraft.item.BlockItem;
import net.minecraft.item.ItemPlacementContext; import net.minecraft.item.ItemPlacementContext;
import net.minecraft.recipe.book.RecipeCategory;
import net.minecraft.state.StateManager; import net.minecraft.state.StateManager;
import net.minecraft.util.Identifier;
import net.minecraft.util.function.BooleanBiFunction; import net.minecraft.util.function.BooleanBiFunction;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction;
@ -33,10 +23,9 @@ 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.data.client.VariantSettings.Rotation.*;
import static net.minecraft.state.property.Properties.WATERLOGGED; import static net.minecraft.state.property.Properties.WATERLOGGED;
public class ReFramedHalfStairBlock extends WaterloggableReFramedBlock implements BlockStateProvider { public class ReFramedHalfStairBlock extends WaterloggableReFramedBlock {
public static final VoxelShape[] HALF_STAIR_VOXELS; public static final VoxelShape[] HALF_STAIR_VOXELS;
@ -137,87 +126,6 @@ public class ReFramedHalfStairBlock extends WaterloggableReFramedBlock implement
return super.getThemeMap(state, new_state); return super.getThemeMap(state, new_state);
} }
@Override
public BlockStateSupplier getMultipart() {
return getHalfStairMultipart(
this,
ReFramed.id("half_stair_down_special"),
ReFramed.id("half_stair_side_special")
);
}
public static BlockStateSupplier getHalfStairMultipart(Block block, Identifier model_down, Identifier model_side) {
return MultipartBlockStateSupplier.create(block)
.with(GBlockstate.when(CORNER, NORTH_EAST_DOWN, CORNER_FACE, 1),
GBlockstate.variant(model_side, true, R0, R0))
.with(GBlockstate.when(CORNER, NORTH_EAST_DOWN, CORNER_FACE, 0),
GBlockstate.variant(model_side, true, R90, R270))
.with(GBlockstate.when(CORNER, NORTH_EAST_DOWN, CORNER_FACE, 2),
GBlockstate.variant(model_down, true, R0, R0))
.with(GBlockstate.when(CORNER, EAST_SOUTH_DOWN, CORNER_FACE, 1),
GBlockstate.variant(model_side, true, R0, R90))
.with(GBlockstate.when(CORNER, EAST_SOUTH_DOWN, CORNER_FACE, 0),
GBlockstate.variant(model_side, true, R90, R0))
.with(GBlockstate.when(CORNER, EAST_SOUTH_DOWN, CORNER_FACE, 2),
GBlockstate.variant(model_down, true, R0, R90))
.with(GBlockstate.when(CORNER, SOUTH_WEST_DOWN, CORNER_FACE, 1),
GBlockstate.variant(model_side, true, R0, R180))
.with(GBlockstate.when(CORNER, SOUTH_WEST_DOWN, CORNER_FACE, 0),
GBlockstate.variant(model_side, true, R90, R90))
.with(GBlockstate.when(CORNER, SOUTH_WEST_DOWN, CORNER_FACE, 2),
GBlockstate.variant(model_down, true, R0, R180))
.with(GBlockstate.when(CORNER, WEST_NORTH_DOWN, CORNER_FACE, 1),
GBlockstate.variant(model_side, true, R0, R270))
.with(GBlockstate.when(CORNER, WEST_NORTH_DOWN, CORNER_FACE, 0),
GBlockstate.variant(model_side, true, R90, R180))
.with(GBlockstate.when(CORNER, WEST_NORTH_DOWN, CORNER_FACE, 2),
GBlockstate.variant(model_down, true, R0, R270))
.with(GBlockstate.when(CORNER, EAST_SOUTH_UP, CORNER_FACE, 0),
GBlockstate.variant(model_side, true, R180, R0))
.with(GBlockstate.when(CORNER, EAST_SOUTH_UP, CORNER_FACE, 1),
GBlockstate.variant(model_side, true, R270, R90))
.with(GBlockstate.when(CORNER, EAST_SOUTH_UP, CORNER_FACE, 2),
GBlockstate.variant(model_down, true, R180, R0))
.with(GBlockstate.when(CORNER, SOUTH_WEST_UP, CORNER_FACE, 0),
GBlockstate.variant(model_side, true, R180, R90))
.with(GBlockstate.when(CORNER, SOUTH_WEST_UP, CORNER_FACE, 1),
GBlockstate.variant(model_side, true, R270, R180))
.with(GBlockstate.when(CORNER, SOUTH_WEST_UP, CORNER_FACE, 2),
GBlockstate.variant(model_down, true, R180, R90))
.with(GBlockstate.when(CORNER, WEST_NORTH_UP, CORNER_FACE, 0),
GBlockstate.variant(model_side, true, R180, R180))
.with(GBlockstate.when(CORNER, WEST_NORTH_UP, CORNER_FACE, 1),
GBlockstate.variant(model_side, true, R270, R270))
.with(GBlockstate.when(CORNER, WEST_NORTH_UP, CORNER_FACE, 2),
GBlockstate.variant(model_down, true, R180, R180))
.with(GBlockstate.when(CORNER, NORTH_EAST_UP, CORNER_FACE, 0),
GBlockstate.variant(model_side, true, R180, R270))
.with(GBlockstate.when(CORNER, NORTH_EAST_UP, CORNER_FACE, 1),
GBlockstate.variant(model_side, true, R270, R0))
.with(GBlockstate.when(CORNER, NORTH_EAST_UP, CORNER_FACE, 2),
GBlockstate.variant(model_down, true, R180, R270));
}
@Override
public void setRecipe(RecipeExporter exporter) {
RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, this, ReFramed.CUBE, 2);
ShapedRecipeJsonBuilder
.create(RecipeCategory.BUILDING_BLOCKS, this, 4)
.pattern("I ")
.pattern("II ")
.input('I', ReFramed.CUBE)
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
.criterion(FabricRecipeProvider.hasItem(this), FabricRecipeProvider.conditionsFromItem(this))
.offerTo(exporter);
}
static { static {
final VoxelShape HALF_STAIR = VoxelShapes.combineAndSimplify( final VoxelShape HALF_STAIR = VoxelShapes.combineAndSimplify(
createCuboidShape(8, 0, 0, 16, 16, 8), createCuboidShape(8, 0, 0, 16, 16, 8),

View File

@ -1,19 +1,11 @@
package fr.adrien1106.reframed.block; package fr.adrien1106.reframed.block;
import fr.adrien1106.reframed.ReFramed;
import fr.adrien1106.reframed.generator.BlockStateProvider;
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.Corner;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
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.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.ItemPlacementContext; import net.minecraft.item.ItemPlacementContext;
import net.minecraft.recipe.book.RecipeCategory;
import net.minecraft.state.StateManager; import net.minecraft.state.StateManager;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShape;
@ -21,7 +13,6 @@ import net.minecraft.world.BlockView;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import static fr.adrien1106.reframed.block.ReFramedHalfStairBlock.HALF_STAIR_VOXELS; import static fr.adrien1106.reframed.block.ReFramedHalfStairBlock.HALF_STAIR_VOXELS;
import static fr.adrien1106.reframed.block.ReFramedHalfStairBlock.getHalfStairMultipart;
import static fr.adrien1106.reframed.block.ReFramedSlabBlock.getSlabShape; import static fr.adrien1106.reframed.block.ReFramedSlabBlock.getSlabShape;
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.util.blocks.BlockProperties.CORNER; import static fr.adrien1106.reframed.util.blocks.BlockProperties.CORNER;
@ -29,7 +20,7 @@ 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; import static net.minecraft.util.shape.VoxelShapes.empty;
public class ReFramedHalfStairsSlabBlock extends WaterloggableReFramedDoubleBlock implements BlockStateProvider { public class ReFramedHalfStairsSlabBlock extends WaterloggableReFramedDoubleBlock {
private record ModelCacheKey(Corner corner, int face) {} private record ModelCacheKey(Corner corner, int face) {}
@ -79,25 +70,4 @@ public class ReFramedHalfStairsSlabBlock extends WaterloggableReFramedDoubleBloc
? SMALL_CUBE_VOXELS[corner.getOpposite(face).getID()] ? SMALL_CUBE_VOXELS[corner.getOpposite(face).getID()]
: HALF_STAIR_VOXELS[face + corner.getID() * 3]; : HALF_STAIR_VOXELS[face + corner.getID() * 3];
} }
@Override
public BlockStateSupplier getMultipart() {
return getHalfStairMultipart(
this,
ReFramed.id("half_stairs_slab_down_special"),
ReFramed.id("half_stairs_slab_side_special")
);
}
@Override
public void setRecipe(RecipeExporter exporter) {
RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, this, ReFramed.CUBE, 2);
ShapelessRecipeJsonBuilder
.create(RecipeCategory.BUILDING_BLOCKS, this)
.input(ReFramed.HALF_STAIR)
.input(ReFramed.SMALL_CUBE)
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
.criterion(FabricRecipeProvider.hasItem(this), FabricRecipeProvider.conditionsFromItem(this))
.offerTo(exporter);
}
} }

View File

@ -1,25 +1,14 @@
package fr.adrien1106.reframed.block; package fr.adrien1106.reframed.block;
import fr.adrien1106.reframed.ReFramed;
import fr.adrien1106.reframed.generator.BlockStateProvider;
import fr.adrien1106.reframed.generator.GBlockstate;
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.Corner;
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.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
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.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.ItemPlacementContext; import net.minecraft.item.ItemPlacementContext;
import net.minecraft.recipe.book.RecipeCategory;
import net.minecraft.state.StateManager; import net.minecraft.state.StateManager;
import net.minecraft.util.Identifier;
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;
@ -30,10 +19,9 @@ import static fr.adrien1106.reframed.block.ReFramedHalfStairBlock.HALF_STAIR_VOX
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.data.client.VariantSettings.Rotation.*;
import static net.minecraft.util.shape.VoxelShapes.empty; import static net.minecraft.util.shape.VoxelShapes.empty;
public class ReFramedHalfStairsStairBlock extends WaterloggableReFramedDoubleBlock implements BlockStateProvider { public class ReFramedHalfStairsStairBlock extends WaterloggableReFramedDoubleBlock {
public ReFramedHalfStairsStairBlock(Settings settings) { public ReFramedHalfStairsStairBlock(Settings settings) {
super(settings); super(settings);
setDefaultState(getDefaultState().with(EDGE, NORTH_DOWN)); setDefaultState(getDefaultState().with(EDGE, NORTH_DOWN));
@ -89,50 +77,4 @@ public class ReFramedHalfStairsStairBlock extends WaterloggableReFramedDoubleBlo
public int getTopThemeIndex(BlockState state) { public int getTopThemeIndex(BlockState state) {
return 2; return 2;
} }
@Override
public BlockStateSupplier getMultipart() {
Identifier model_id = ReFramed.id("half_stairs_stair_down_special");
Identifier side_model_id = ReFramed.id("half_stairs_stair_side_special");
Identifier reverse_model_id = ReFramed.id("half_stairs_stair_reverse_special");
return MultipartBlockStateSupplier.create(this)
/* X AXIS */
.with(GBlockstate.when(EDGE, NORTH_DOWN),
GBlockstate.variant(side_model_id, true, R90, R180))
.with(GBlockstate.when(EDGE, DOWN_SOUTH),
GBlockstate.variant(side_model_id, true, R0, R180))
.with(GBlockstate.when(EDGE, SOUTH_UP),
GBlockstate.variant(side_model_id, true, R270, R180))
.with(GBlockstate.when(EDGE, UP_NORTH),
GBlockstate.variant(side_model_id, true, R180, R180))
/* Y AXIS */
.with(GBlockstate.when(EDGE, NORTH_EAST),
GBlockstate.variant(model_id, true, R0, R0))
.with(GBlockstate.when(EDGE, EAST_SOUTH),
GBlockstate.variant(model_id, true, R0, R90))
.with(GBlockstate.when(EDGE, SOUTH_WEST),
GBlockstate.variant(model_id, true, R0, R180))
.with(GBlockstate.when(EDGE, WEST_NORTH),
GBlockstate.variant(model_id, true, R0, R270))
/* Z AXIS */
.with(GBlockstate.when(EDGE, DOWN_EAST),
GBlockstate.variant(reverse_model_id, true, R0, R90))
.with(GBlockstate.when(EDGE, EAST_UP),
GBlockstate.variant(side_model_id, true, R180, R270))
.with(GBlockstate.when(EDGE, UP_WEST),
GBlockstate.variant(reverse_model_id, true, R180, R90))
.with(GBlockstate.when(EDGE, WEST_DOWN),
GBlockstate.variant(side_model_id, true, R0, R270));
}
@Override
public void setRecipe(RecipeExporter exporter) {
RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, this, ReFramed.CUBE, 2);
ShapelessRecipeJsonBuilder
.create(RecipeCategory.BUILDING_BLOCKS, this)
.input(ReFramed.HALF_STAIR, 2)
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
.criterion(FabricRecipeProvider.hasItem(this), FabricRecipeProvider.conditionsFromItem(this))
.offerTo(exporter);
}
} }

View File

@ -1,16 +1,12 @@
package fr.adrien1106.reframed.block; package fr.adrien1106.reframed.block;
import fr.adrien1106.reframed.ReFramed;
import fr.adrien1106.reframed.generator.GBlockstate;
import fr.adrien1106.reframed.util.VoxelHelper; 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.data.client.MultipartBlockStateSupplier;
import net.minecraft.item.BlockItem; import net.minecraft.item.BlockItem;
import net.minecraft.item.ItemPlacementContext; import net.minecraft.item.ItemPlacementContext;
import net.minecraft.state.StateManager; import net.minecraft.state.StateManager;
import net.minecraft.util.Identifier;
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;
@ -18,7 +14,6 @@ import net.minecraft.world.BlockView;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import static fr.adrien1106.reframed.util.VoxelHelper.VoxelListBuilder; import static fr.adrien1106.reframed.util.VoxelHelper.VoxelListBuilder;
import static net.minecraft.data.client.VariantSettings.Rotation.*;
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;
@ -68,29 +63,6 @@ public class ReFramedLayerBlock extends ReFramedSlabBlock {
return previous.with(LAYERS, previous.get(LAYERS) + 1); return previous.with(LAYERS, previous.get(LAYERS) + 1);
} }
@Override
public MultipartBlockStateSupplier getMultipart() {
String model_pattern = "layer_x_special";
MultipartBlockStateSupplier supplier = MultipartBlockStateSupplier.create(this);
for (int i = 1; i <= 8; i++) {
Identifier model = ReFramed.id(model_pattern.replace("x", i + ""));
supplier
.with(GBlockstate.when(FACING, Direction.DOWN, LAYERS, i),
GBlockstate.variant(model, true, R0, R0))
.with(GBlockstate.when(FACING, Direction.SOUTH, LAYERS, i),
GBlockstate.variant(model, true, R90, R0))
.with(GBlockstate.when(FACING, Direction.UP, LAYERS, i),
GBlockstate.variant(model, true, R180, R0))
.with(GBlockstate.when(FACING, Direction.NORTH, LAYERS, i),
GBlockstate.variant(model, true, R270, R0))
.with(GBlockstate.when(FACING, Direction.WEST, LAYERS, i),
GBlockstate.variant(model, true, R90, R90))
.with(GBlockstate.when(FACING, Direction.EAST, LAYERS, i),
GBlockstate.variant(model, true, R90, R270));
}
return supplier;
}
static { static {
VoxelListBuilder builder = VoxelListBuilder.create(createCuboidShape(0, 0, 0, 16, 2, 16), 48) VoxelListBuilder builder = VoxelListBuilder.create(createCuboidShape(0, 0, 0, 16, 2, 16), 48)
.add(createCuboidShape(0, 0, 0, 16, 4, 16)) .add(createCuboidShape(0, 0, 0, 16, 4, 16))

View File

@ -1,18 +1,12 @@
package fr.adrien1106.reframed.block; package fr.adrien1106.reframed.block;
import fr.adrien1106.reframed.ReFramed;
import fr.adrien1106.reframed.generator.BlockStateProvider;
import fr.adrien1106.reframed.generator.GBlockstate;
import fr.adrien1106.reframed.util.VoxelHelper; 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.data.client.BlockStateSupplier;
import net.minecraft.data.client.MultipartBlockStateSupplier;
import net.minecraft.item.BlockItem; import net.minecraft.item.BlockItem;
import net.minecraft.item.ItemPlacementContext; import net.minecraft.item.ItemPlacementContext;
import net.minecraft.state.StateManager; import net.minecraft.state.StateManager;
import net.minecraft.util.Identifier;
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;
@ -21,10 +15,9 @@ import org.jetbrains.annotations.Nullable;
import java.util.Map; import java.util.Map;
import static net.minecraft.data.client.VariantSettings.Rotation.*;
import static net.minecraft.state.property.Properties.AXIS; import static net.minecraft.state.property.Properties.AXIS;
public class ReFramedPillarBlock extends WaterloggableReFramedBlock implements BlockStateProvider { public class ReFramedPillarBlock extends WaterloggableReFramedBlock {
public static final VoxelShape[] PILLAR_VOXELS; public static final VoxelShape[] PILLAR_VOXELS;
@ -80,18 +73,6 @@ public class ReFramedPillarBlock extends WaterloggableReFramedBlock implements B
return super.getThemeMap(state, new_state); return super.getThemeMap(state, new_state);
} }
@Override
public BlockStateSupplier getMultipart() {
Identifier model_id = ReFramed.id("pillar_special");
return MultipartBlockStateSupplier.create(this)
.with(GBlockstate.when(AXIS, Direction.Axis.X),
GBlockstate.variant(model_id, true, R90, R90))
.with(GBlockstate.when(AXIS, Direction.Axis.Y),
GBlockstate.variant(model_id, true, R0, R0))
.with(GBlockstate.when(AXIS, Direction.Axis.Z),
GBlockstate.variant(model_id, true, R90, R0));
}
static { static {
final VoxelShape PILLAR = createCuboidShape(0, 4, 4, 16, 12, 12); final VoxelShape PILLAR = createCuboidShape(0, 4, 4, 16, 12, 12);
PILLAR_VOXELS = VoxelHelper.VoxelListBuilder.create(PILLAR, 3) PILLAR_VOXELS = VoxelHelper.VoxelListBuilder.create(PILLAR, 3)

View File

@ -1,21 +1,12 @@
package fr.adrien1106.reframed.block; package fr.adrien1106.reframed.block;
import fr.adrien1106.reframed.ReFramed; import fr.adrien1106.reframed.ReFramed;
import fr.adrien1106.reframed.generator.BlockStateProvider;
import fr.adrien1106.reframed.generator.GBlockstate;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
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.data.client.MultipartBlockStateSupplier;
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.BlockItem; import net.minecraft.item.BlockItem;
import net.minecraft.item.ItemPlacementContext; import net.minecraft.item.ItemPlacementContext;
import net.minecraft.recipe.book.RecipeCategory;
import net.minecraft.state.StateManager; import net.minecraft.state.StateManager;
import net.minecraft.util.Identifier;
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;
@ -25,11 +16,10 @@ import org.jetbrains.annotations.Nullable;
import java.util.Map; import java.util.Map;
import static net.minecraft.data.client.VariantSettings.Rotation.*;
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;
public class ReFramedSlabBlock extends WaterloggableReFramedBlock implements BlockStateProvider { public class ReFramedSlabBlock extends WaterloggableReFramedBlock {
protected static final VoxelShape DOWN = VoxelShapes.cuboid(0f, 0f, 0f, 1f, 0.5f, 1f); protected static final VoxelShape DOWN = VoxelShapes.cuboid(0f, 0f, 0f, 1f, 0.5f, 1f);
protected static final VoxelShape UP = VoxelShapes.cuboid(0f, 0.5f, 0f, 1f, 1f, 1f); protected static final VoxelShape UP = VoxelShapes.cuboid(0f, 0.5f, 0f, 1f, 1f, 1f);
@ -108,34 +98,4 @@ public class ReFramedSlabBlock extends WaterloggableReFramedBlock implements Blo
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);
} }
@Override
public MultipartBlockStateSupplier getMultipart() {
Identifier model_id = ReFramed.id("slab_special");
return MultipartBlockStateSupplier.create(this)
.with(GBlockstate.when(FACING, Direction.DOWN),
GBlockstate.variant(model_id, true, R0, R0))
.with(GBlockstate.when(FACING, Direction.SOUTH),
GBlockstate.variant(model_id, true, R90, R0))
.with(GBlockstate.when(FACING, Direction.UP),
GBlockstate.variant(model_id, true, R180, R0))
.with(GBlockstate.when(FACING, Direction.NORTH),
GBlockstate.variant(model_id, true, R270, R0))
.with(GBlockstate.when(FACING, Direction.WEST),
GBlockstate.variant(model_id, true, R90, R90))
.with(GBlockstate.when(FACING, Direction.EAST),
GBlockstate.variant(model_id, true, R90, R270));
}
@Override
public void setRecipe(RecipeExporter exporter) {
RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, this, ReFramed.CUBE, 2);
ShapedRecipeJsonBuilder
.create(RecipeCategory.BUILDING_BLOCKS, this, 6)
.pattern("III")
.input('I', ReFramed.CUBE)
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
.criterion(FabricRecipeProvider.hasItem(this), FabricRecipeProvider.conditionsFromItem(this))
.offerTo(exporter);
}
} }

View File

@ -1,28 +1,17 @@
package fr.adrien1106.reframed.block; package fr.adrien1106.reframed.block;
import fr.adrien1106.reframed.ReFramed;
import fr.adrien1106.reframed.generator.BlockStateProvider;
import fr.adrien1106.reframed.generator.GBlockstate;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
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.ItemPlacementContext; import net.minecraft.item.ItemPlacementContext;
import net.minecraft.recipe.book.RecipeCategory;
import net.minecraft.state.StateManager; import net.minecraft.state.StateManager;
import net.minecraft.util.Identifier;
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 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 net.minecraft.data.client.VariantSettings.Rotation.*;
import static net.minecraft.state.property.Properties.AXIS; import static net.minecraft.state.property.Properties.AXIS;
public class ReFramedSlabsCubeBlock extends ReFramedDoubleBlock implements BlockStateProvider { public class ReFramedSlabsCubeBlock extends ReFramedDoubleBlock {
public ReFramedSlabsCubeBlock(Settings settings) { public ReFramedSlabsCubeBlock(Settings settings) {
super(settings); super(settings);
@ -63,27 +52,4 @@ public class ReFramedSlabsCubeBlock extends ReFramedDoubleBlock implements Block
public int getTopThemeIndex(BlockState state) { public int getTopThemeIndex(BlockState state) {
return 2; return 2;
} }
@Override
public MultipartBlockStateSupplier getMultipart() {
Identifier model_id = ReFramed.id("double_slab_special");
return MultipartBlockStateSupplier.create(this)
.with(GBlockstate.when(AXIS, Direction.Axis.Y),
GBlockstate.variant(model_id, true, R0, R0))
.with(GBlockstate.when(AXIS, Direction.Axis.Z),
GBlockstate.variant(model_id, true, R270, R0))
.with(GBlockstate.when(AXIS, Direction.Axis.X),
GBlockstate.variant(model_id, true, R90, R90));
}
@Override
public void setRecipe(RecipeExporter exporter) {
RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, this, ReFramed.CUBE);
ShapelessRecipeJsonBuilder
.create(RecipeCategory.BUILDING_BLOCKS, this)
.input(ReFramed.SLAB, 2)
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
.criterion(FabricRecipeProvider.hasItem(this), FabricRecipeProvider.conditionsFromItem(this))
.offerTo(exporter);
}
} }

View File

@ -1,25 +1,15 @@
package fr.adrien1106.reframed.block; package fr.adrien1106.reframed.block;
import fr.adrien1106.reframed.ReFramed; import fr.adrien1106.reframed.ReFramed;
import fr.adrien1106.reframed.generator.BlockStateProvider;
import fr.adrien1106.reframed.generator.GBlockstate;
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.Corner;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
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.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.BlockItem; import net.minecraft.item.BlockItem;
import net.minecraft.item.ItemPlacementContext; import net.minecraft.item.ItemPlacementContext;
import net.minecraft.recipe.book.RecipeCategory;
import net.minecraft.state.StateManager; import net.minecraft.state.StateManager;
import net.minecraft.util.Identifier;
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.math.Vec3d;
@ -33,10 +23,9 @@ 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.data.client.VariantSettings.Rotation.*;
import static net.minecraft.state.property.Properties.WATERLOGGED; import static net.minecraft.state.property.Properties.WATERLOGGED;
public class ReFramedSmallCubeBlock extends WaterloggableReFramedBlock implements BlockStateProvider { public class ReFramedSmallCubeBlock extends WaterloggableReFramedBlock {
public static final VoxelShape[] SMALL_CUBE_VOXELS; public static final VoxelShape[] SMALL_CUBE_VOXELS;
@ -159,39 +148,6 @@ public class ReFramedSmallCubeBlock extends WaterloggableReFramedBlock implement
return super.getThemeMap(state, new_state); return super.getThemeMap(state, new_state);
} }
@Override
public BlockStateSupplier getMultipart() {
Identifier small_cube_id = ReFramed.id("small_cube_special");
return MultipartBlockStateSupplier.create(this)
.with(GBlockstate.when(CORNER, NORTH_EAST_DOWN),
GBlockstate.variant(small_cube_id, true, R0, R0))
.with(GBlockstate.when(CORNER, EAST_SOUTH_DOWN),
GBlockstate.variant(small_cube_id, true, R0, R90))
.with(GBlockstate.when(CORNER, SOUTH_WEST_DOWN),
GBlockstate.variant(small_cube_id, true, R0, R180))
.with(GBlockstate.when(CORNER, WEST_NORTH_DOWN),
GBlockstate.variant(small_cube_id, true, R0, R270))
.with(GBlockstate.when(CORNER, EAST_SOUTH_UP),
GBlockstate.variant(small_cube_id, true, R180, R0))
.with(GBlockstate.when(CORNER, SOUTH_WEST_UP),
GBlockstate.variant(small_cube_id, true, R180, R90))
.with(GBlockstate.when(CORNER, WEST_NORTH_UP),
GBlockstate.variant(small_cube_id, true, R180, R180))
.with(GBlockstate.when(CORNER, NORTH_EAST_UP),
GBlockstate.variant(small_cube_id, true, R180, R270));
}
@Override
public void setRecipe(RecipeExporter exporter) {
RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, this, ReFramed.CUBE, 8);
ShapelessRecipeJsonBuilder
.create(RecipeCategory.BUILDING_BLOCKS, this, 8)
.input(ReFramed.CUBE)
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
.criterion(FabricRecipeProvider.hasItem(this), FabricRecipeProvider.conditionsFromItem(this))
.offerTo(exporter);
}
static { static {
final VoxelShape SMALL_CUBE = VoxelShapes.cuboid(.5f, 0f, 0f, 1f, .5f, .5f); final VoxelShape SMALL_CUBE = VoxelShapes.cuboid(.5f, 0f, 0f, 1f, .5f, .5f);

View File

@ -1,24 +1,13 @@
package fr.adrien1106.reframed.block; package fr.adrien1106.reframed.block;
import fr.adrien1106.reframed.ReFramed;
import fr.adrien1106.reframed.generator.BlockStateProvider;
import fr.adrien1106.reframed.generator.GBlockstate;
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.Corner;
import fr.adrien1106.reframed.util.blocks.Edge; import fr.adrien1106.reframed.util.blocks.Edge;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
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.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.ItemPlacementContext; import net.minecraft.item.ItemPlacementContext;
import net.minecraft.recipe.book.RecipeCategory;
import net.minecraft.state.StateManager; import net.minecraft.state.StateManager;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShape;
import net.minecraft.world.BlockView; import net.minecraft.world.BlockView;
@ -27,11 +16,9 @@ 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 fr.adrien1106.reframed.util.blocks.Edge.*;
import static net.minecraft.data.client.VariantSettings.Rotation.*;
import static net.minecraft.util.shape.VoxelShapes.empty; import static net.minecraft.util.shape.VoxelShapes.empty;
public class ReFramedSmallCubesStepBlock extends WaterloggableReFramedDoubleBlock implements BlockStateProvider { public class ReFramedSmallCubesStepBlock extends WaterloggableReFramedDoubleBlock {
public ReFramedSmallCubesStepBlock(Settings settings) { public ReFramedSmallCubesStepBlock(Settings settings) {
super(settings); super(settings);
@ -85,49 +72,4 @@ public class ReFramedSmallCubesStepBlock extends WaterloggableReFramedDoubleBloc
public int getTopThemeIndex(BlockState state) { public int getTopThemeIndex(BlockState state) {
return 2; return 2;
} }
@Override
public BlockStateSupplier getMultipart() {
Identifier model_id = ReFramed.id("small_cubes_step_special");
Identifier reverse_model_id = ReFramed.id("small_cubes_step_reverse_special");
return MultipartBlockStateSupplier.create(this)
/* 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));
}
@Override
public void setRecipe(RecipeExporter exporter) {
RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, this, ReFramed.CUBE, 4);
ShapelessRecipeJsonBuilder
.create(RecipeCategory.BUILDING_BLOCKS, this)
.input(ReFramed.SMALL_CUBE, 2)
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
.criterion(FabricRecipeProvider.hasItem(this), FabricRecipeProvider.conditionsFromItem(this))
.offerTo(exporter);
}
} }

View File

@ -1,26 +1,16 @@
package fr.adrien1106.reframed.block; package fr.adrien1106.reframed.block;
import fr.adrien1106.reframed.ReFramed; import fr.adrien1106.reframed.ReFramed;
import fr.adrien1106.reframed.generator.BlockStateProvider;
import fr.adrien1106.reframed.generator.GBlockstate;
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.Edge; import fr.adrien1106.reframed.util.blocks.Edge;
import fr.adrien1106.reframed.util.blocks.StairShape; import fr.adrien1106.reframed.util.blocks.StairShape;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
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.data.client.MultipartBlockStateSupplier;
import net.minecraft.data.client.When;
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.BlockItem; import net.minecraft.item.BlockItem;
import net.minecraft.item.ItemPlacementContext; import net.minecraft.item.ItemPlacementContext;
import net.minecraft.recipe.book.RecipeCategory;
import net.minecraft.state.StateManager; import net.minecraft.state.StateManager;
import net.minecraft.util.Identifier;
import net.minecraft.util.function.BooleanBiFunction; import net.minecraft.util.function.BooleanBiFunction;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction;
@ -37,11 +27,9 @@ import java.util.stream.Stream;
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.EDGE;
import static fr.adrien1106.reframed.util.blocks.BlockProperties.STAIR_SHAPE; import static fr.adrien1106.reframed.util.blocks.BlockProperties.STAIR_SHAPE;
import static fr.adrien1106.reframed.util.blocks.Edge.*;
import static fr.adrien1106.reframed.util.blocks.StairShape.*; import static fr.adrien1106.reframed.util.blocks.StairShape.*;
import static net.minecraft.data.client.VariantSettings.Rotation.*;
public class ReFramedStairBlock extends WaterloggableReFramedBlock implements BlockStateProvider { public class ReFramedStairBlock extends WaterloggableReFramedBlock {
public static final VoxelShape[] STAIR_VOXELS; public static final VoxelShape[] STAIR_VOXELS;
private record ModelCacheKey(Edge edge, StairShape shape) {} private record ModelCacheKey(Edge edge, StairShape shape) {}
@ -128,248 +116,6 @@ public class ReFramedStairBlock extends WaterloggableReFramedBlock implements Bl
return super.getThemeMap(state, new_state); return super.getThemeMap(state, new_state);
} }
@Override
public MultipartBlockStateSupplier getMultipart() {
return getStairMultipart(this, false);
}
public static MultipartBlockStateSupplier getStairMultipart(Block block, boolean is_double) {
String infix = is_double ? "s_cube" : "";
Identifier straight_id = ReFramed.id("stair" + infix + "_special");
Identifier double_outer_id = ReFramed.id("outers_stair" + infix + "_special");
Identifier inner_id = ReFramed.id("inner_stair" + infix + "_special");
Identifier outer_id = ReFramed.id("outer_stair" + infix + "_special");
Identifier outer_side_id = ReFramed.id("outer_side_stair" + infix + "_special");
return MultipartBlockStateSupplier.create(block)
/* STRAIGHT X AXIS */
.with(GBlockstate.when(EDGE, DOWN_EAST, STAIR_SHAPE, STRAIGHT),
GBlockstate.variant(straight_id, true, R0, R0))
.with(GBlockstate.when(EDGE, EAST_UP, STAIR_SHAPE, STRAIGHT),
GBlockstate.variant(straight_id, true, R180, R0))
.with(GBlockstate.when(EDGE, UP_WEST, STAIR_SHAPE, STRAIGHT),
GBlockstate.variant(straight_id, true, R180, R180))
.with(GBlockstate.when(EDGE, WEST_DOWN, STAIR_SHAPE, STRAIGHT),
GBlockstate.variant(straight_id, true, R0, R180))
/* STRAIGHT Y AXIS */
.with(GBlockstate.when(EDGE, EAST_SOUTH, STAIR_SHAPE, STRAIGHT),
GBlockstate.variant(straight_id, true, R90, R0))
.with(GBlockstate.when(EDGE, SOUTH_WEST, STAIR_SHAPE, STRAIGHT),
GBlockstate.variant(straight_id, true, R90, R90))
.with(GBlockstate.when(EDGE, WEST_NORTH, STAIR_SHAPE, STRAIGHT),
GBlockstate.variant(straight_id, true, R90, R180))
.with(GBlockstate.when(EDGE, NORTH_EAST, STAIR_SHAPE, STRAIGHT),
GBlockstate.variant(straight_id, true, R90, R270))
/* STRAIGHT Z AXIS */
.with(GBlockstate.when(EDGE, DOWN_SOUTH, STAIR_SHAPE, STRAIGHT),
GBlockstate.variant(straight_id, true, R0, R90))
.with(GBlockstate.when(EDGE, NORTH_DOWN, STAIR_SHAPE, STRAIGHT),
GBlockstate.variant(straight_id, true, R0, R270))
.with(GBlockstate.when(EDGE, UP_NORTH, STAIR_SHAPE, STRAIGHT),
GBlockstate.variant(straight_id, true, R180, R270))
.with(GBlockstate.when(EDGE, SOUTH_UP, STAIR_SHAPE, STRAIGHT),
GBlockstate.variant(straight_id, true, R180, R90))
/* INNER BOTTOM */
.with(When.anyOf(
GBlockstate.when(EDGE, NORTH_DOWN, STAIR_SHAPE, INNER_RIGHT),
GBlockstate.when(EDGE, WEST_NORTH, STAIR_SHAPE, INNER_RIGHT),
GBlockstate.when(EDGE, WEST_DOWN, STAIR_SHAPE, INNER_RIGHT)),
GBlockstate.variant(inner_id, true, R0, R180))
.with(When.anyOf(
GBlockstate.when(EDGE, NORTH_DOWN, STAIR_SHAPE, INNER_LEFT),
GBlockstate.when(EDGE, NORTH_EAST, STAIR_SHAPE, INNER_RIGHT),
GBlockstate.when(EDGE, DOWN_EAST, STAIR_SHAPE, INNER_RIGHT)),
GBlockstate.variant(inner_id, true, R0, R270))
.with(When.anyOf(
GBlockstate.when(EDGE, DOWN_SOUTH, STAIR_SHAPE, INNER_LEFT),
GBlockstate.when(EDGE, EAST_SOUTH, STAIR_SHAPE, INNER_RIGHT),
GBlockstate.when(EDGE, DOWN_EAST, STAIR_SHAPE, INNER_LEFT)),
GBlockstate.variant(inner_id, true, R0, R0))
.with(When.anyOf(
GBlockstate.when(EDGE, DOWN_SOUTH, STAIR_SHAPE, INNER_RIGHT),
GBlockstate.when(EDGE, SOUTH_WEST, STAIR_SHAPE, INNER_RIGHT),
GBlockstate.when(EDGE, WEST_DOWN, STAIR_SHAPE, INNER_LEFT)),
GBlockstate.variant(inner_id, true, R0, R90))
/* INNER TOP */
.with(When.anyOf(
GBlockstate.when(EDGE, EAST_UP, STAIR_SHAPE, INNER_RIGHT),
GBlockstate.when(EDGE, NORTH_EAST, STAIR_SHAPE, INNER_LEFT),
GBlockstate.when(EDGE, UP_NORTH, STAIR_SHAPE, INNER_LEFT)),
GBlockstate.variant(inner_id, true, R180, R0))
.with(When.anyOf(
GBlockstate.when(EDGE, EAST_UP, STAIR_SHAPE, INNER_LEFT),
GBlockstate.when(EDGE, EAST_SOUTH, STAIR_SHAPE, INNER_LEFT),
GBlockstate.when(EDGE, SOUTH_UP, STAIR_SHAPE, INNER_LEFT)),
GBlockstate.variant(inner_id, true, R180, R90))
.with(When.anyOf(
GBlockstate.when(EDGE, SOUTH_UP, STAIR_SHAPE, INNER_RIGHT),
GBlockstate.when(EDGE, SOUTH_WEST, STAIR_SHAPE, INNER_LEFT),
GBlockstate.when(EDGE, UP_WEST, STAIR_SHAPE, INNER_LEFT)),
GBlockstate.variant(inner_id, true, R180, R180))
.with(When.anyOf(
GBlockstate.when(EDGE, UP_NORTH, STAIR_SHAPE, INNER_RIGHT),
GBlockstate.when(EDGE, WEST_NORTH, STAIR_SHAPE, INNER_LEFT),
GBlockstate.when(EDGE, UP_WEST, STAIR_SHAPE, INNER_RIGHT)),
GBlockstate.variant(inner_id, true, R180, R270))
/* OUTER BOTTOM */
.with(When.anyOf(
GBlockstate.when(EDGE, DOWN_SOUTH, STAIR_SHAPE, SECOND_OUTER_LEFT),
GBlockstate.when(EDGE, DOWN_EAST, STAIR_SHAPE, SECOND_OUTER_LEFT)),
GBlockstate.variant(outer_id, true, R0, R0))
.with(When.anyOf(
GBlockstate.when(EDGE, DOWN_SOUTH, STAIR_SHAPE, SECOND_OUTER_RIGHT),
GBlockstate.when(EDGE, WEST_DOWN, STAIR_SHAPE, FIRST_OUTER_LEFT)),
GBlockstate.variant(outer_id, true, R0, R90))
.with(When.anyOf(
GBlockstate.when(EDGE, NORTH_DOWN, STAIR_SHAPE, FIRST_OUTER_RIGHT),
GBlockstate.when(EDGE, WEST_DOWN, STAIR_SHAPE, FIRST_OUTER_RIGHT)),
GBlockstate.variant(outer_id, true, R0, R180))
.with(When.anyOf(
GBlockstate.when(EDGE, NORTH_DOWN, STAIR_SHAPE, FIRST_OUTER_LEFT),
GBlockstate.when(EDGE, DOWN_EAST, STAIR_SHAPE, SECOND_OUTER_RIGHT)),
GBlockstate.variant(outer_id, true, R0, R270))
/* OUTER TOP */
.with(When.anyOf(
GBlockstate.when(EDGE, UP_NORTH, STAIR_SHAPE, SECOND_OUTER_LEFT),
GBlockstate.when(EDGE, EAST_UP, STAIR_SHAPE, FIRST_OUTER_RIGHT)),
GBlockstate.variant(outer_id, true, R180, R0))
.with(When.anyOf(
GBlockstate.when(EDGE, SOUTH_UP, STAIR_SHAPE, FIRST_OUTER_LEFT),
GBlockstate.when(EDGE, EAST_UP, STAIR_SHAPE, FIRST_OUTER_LEFT)),
GBlockstate.variant(outer_id, true, R180, R90))
.with(When.anyOf(
GBlockstate.when(EDGE, SOUTH_UP, STAIR_SHAPE, FIRST_OUTER_RIGHT),
GBlockstate.when(EDGE, UP_WEST, STAIR_SHAPE, SECOND_OUTER_LEFT)),
GBlockstate.variant(outer_id, true, R180, R180))
.with(When.anyOf(
GBlockstate.when(EDGE, UP_NORTH, STAIR_SHAPE, SECOND_OUTER_RIGHT),
GBlockstate.when(EDGE, UP_WEST, STAIR_SHAPE, SECOND_OUTER_RIGHT)),
GBlockstate.variant(outer_id, true, R180, R270))
/* OUTER EAST */
.with(When.anyOf(
GBlockstate.when(EDGE, EAST_SOUTH, STAIR_SHAPE, SECOND_OUTER_RIGHT),
GBlockstate.when(EDGE, DOWN_EAST, STAIR_SHAPE, FIRST_OUTER_LEFT)),
GBlockstate.variant(outer_side_id, true, R0, R0))
.with(When.anyOf(
GBlockstate.when(EDGE, EAST_SOUTH, STAIR_SHAPE, SECOND_OUTER_LEFT),
GBlockstate.when(EDGE, EAST_UP, STAIR_SHAPE, SECOND_OUTER_LEFT)),
GBlockstate.variant(outer_side_id, true, R90, R0))
.with(When.anyOf(
GBlockstate.when(EDGE, NORTH_EAST, STAIR_SHAPE, FIRST_OUTER_LEFT),
GBlockstate.when(EDGE, EAST_UP, STAIR_SHAPE, SECOND_OUTER_RIGHT)),
GBlockstate.variant(outer_side_id, true, R180, R0))
.with(When.anyOf(
GBlockstate.when(EDGE, NORTH_EAST, STAIR_SHAPE, FIRST_OUTER_RIGHT),
GBlockstate.when(EDGE, DOWN_EAST, STAIR_SHAPE, FIRST_OUTER_RIGHT)),
GBlockstate.variant(outer_side_id, true, R270, R0))
/* OUTER SOUTH */
.with(When.anyOf(
GBlockstate.when(EDGE, SOUTH_WEST, STAIR_SHAPE, SECOND_OUTER_RIGHT),
GBlockstate.when(EDGE, DOWN_SOUTH, STAIR_SHAPE, FIRST_OUTER_RIGHT)),
GBlockstate.variant(outer_side_id, true, R0, R90))
.with(When.anyOf(
GBlockstate.when(EDGE, SOUTH_WEST, STAIR_SHAPE, SECOND_OUTER_LEFT),
GBlockstate.when(EDGE, SOUTH_UP, STAIR_SHAPE, SECOND_OUTER_RIGHT)),
GBlockstate.variant(outer_side_id, true, R90, R90))
.with(When.anyOf(
GBlockstate.when(EDGE, EAST_SOUTH, STAIR_SHAPE, FIRST_OUTER_LEFT),
GBlockstate.when(EDGE, SOUTH_UP, STAIR_SHAPE, SECOND_OUTER_LEFT)),
GBlockstate.variant(outer_side_id, true, R180, R90))
.with(When.anyOf(
GBlockstate.when(EDGE, EAST_SOUTH, STAIR_SHAPE, FIRST_OUTER_RIGHT),
GBlockstate.when(EDGE, DOWN_SOUTH, STAIR_SHAPE, FIRST_OUTER_LEFT)),
GBlockstate.variant(outer_side_id, true, R270, R90))
/* OUTER WEST */
.with(When.anyOf(
GBlockstate.when(EDGE, WEST_NORTH, STAIR_SHAPE, SECOND_OUTER_RIGHT),
GBlockstate.when(EDGE, WEST_DOWN, STAIR_SHAPE, SECOND_OUTER_RIGHT)),
GBlockstate.variant(outer_side_id, true, R0, R180))
.with(When.anyOf(
GBlockstate.when(EDGE, WEST_NORTH, STAIR_SHAPE, SECOND_OUTER_LEFT),
GBlockstate.when(EDGE, UP_WEST, STAIR_SHAPE, FIRST_OUTER_RIGHT)),
GBlockstate.variant(outer_side_id, true, R90, R180))
.with(When.anyOf(
GBlockstate.when(EDGE, SOUTH_WEST, STAIR_SHAPE, FIRST_OUTER_LEFT),
GBlockstate.when(EDGE, UP_WEST, STAIR_SHAPE, FIRST_OUTER_LEFT)),
GBlockstate.variant(outer_side_id, true, R180, R180))
.with(When.anyOf(
GBlockstate.when(EDGE, SOUTH_WEST, STAIR_SHAPE, FIRST_OUTER_RIGHT),
GBlockstate.when(EDGE, WEST_DOWN, STAIR_SHAPE, SECOND_OUTER_LEFT)),
GBlockstate.variant(outer_side_id, true, R270, R180))
/* OUTER NORTH */
.with(When.anyOf(
GBlockstate.when(EDGE, NORTH_EAST, STAIR_SHAPE, SECOND_OUTER_RIGHT),
GBlockstate.when(EDGE, NORTH_DOWN, STAIR_SHAPE, SECOND_OUTER_LEFT)),
GBlockstate.variant(outer_side_id, true, R0, R270))
.with(When.anyOf(
GBlockstate.when(EDGE, NORTH_EAST, STAIR_SHAPE, SECOND_OUTER_LEFT),
GBlockstate.when(EDGE, UP_NORTH, STAIR_SHAPE, FIRST_OUTER_LEFT)),
GBlockstate.variant(outer_side_id, true, R90, R270))
.with(When.anyOf(
GBlockstate.when(EDGE, WEST_NORTH, STAIR_SHAPE, FIRST_OUTER_LEFT),
GBlockstate.when(EDGE, UP_NORTH, STAIR_SHAPE, FIRST_OUTER_RIGHT)),
GBlockstate.variant(outer_side_id, true, R180, R270))
.with(When.anyOf(
GBlockstate.when(EDGE, WEST_NORTH, STAIR_SHAPE, FIRST_OUTER_RIGHT),
GBlockstate.when(EDGE, NORTH_DOWN, STAIR_SHAPE, SECOND_OUTER_RIGHT)),
GBlockstate.variant(outer_side_id, true, R270, R270))
/* OUTER BOTTOM */
.with(When.anyOf(
GBlockstate.when(EDGE, DOWN_SOUTH, STAIR_SHAPE, OUTER_LEFT),
GBlockstate.when(EDGE, DOWN_EAST, STAIR_SHAPE, OUTER_LEFT),
GBlockstate.when(EDGE, EAST_SOUTH, STAIR_SHAPE, OUTER_RIGHT)),
GBlockstate.variant(double_outer_id, true, R0, R0))
.with(When.anyOf(
GBlockstate.when(EDGE, DOWN_SOUTH, STAIR_SHAPE, OUTER_RIGHT),
GBlockstate.when(EDGE, WEST_DOWN, STAIR_SHAPE, OUTER_LEFT),
GBlockstate.when(EDGE, SOUTH_WEST, STAIR_SHAPE, OUTER_RIGHT)),
GBlockstate.variant(double_outer_id, true, R0, R90))
.with(When.anyOf(
GBlockstate.when(EDGE, NORTH_DOWN, STAIR_SHAPE, OUTER_RIGHT),
GBlockstate.when(EDGE, WEST_DOWN, STAIR_SHAPE, OUTER_RIGHT),
GBlockstate.when(EDGE, WEST_NORTH, STAIR_SHAPE, OUTER_RIGHT)),
GBlockstate.variant(double_outer_id, true, R0, R180))
.with(When.anyOf(
GBlockstate.when(EDGE, NORTH_DOWN, STAIR_SHAPE, OUTER_LEFT),
GBlockstate.when(EDGE, DOWN_EAST, STAIR_SHAPE, OUTER_RIGHT),
GBlockstate.when(EDGE, NORTH_EAST, STAIR_SHAPE, OUTER_RIGHT)),
GBlockstate.variant(double_outer_id, true, R0, R270))
/* OUTER TOP */
.with(When.anyOf(
GBlockstate.when(EDGE, UP_NORTH, STAIR_SHAPE, OUTER_LEFT),
GBlockstate.when(EDGE, EAST_UP, STAIR_SHAPE, OUTER_RIGHT),
GBlockstate.when(EDGE, NORTH_EAST, STAIR_SHAPE, OUTER_LEFT)),
GBlockstate.variant(double_outer_id, true, R180, R0))
.with(When.anyOf(
GBlockstate.when(EDGE, SOUTH_UP, STAIR_SHAPE, OUTER_LEFT),
GBlockstate.when(EDGE, EAST_UP, STAIR_SHAPE, OUTER_LEFT),
GBlockstate.when(EDGE, EAST_SOUTH, STAIR_SHAPE, OUTER_LEFT)),
GBlockstate.variant(double_outer_id, true, R180, R90))
.with(When.anyOf(
GBlockstate.when(EDGE, SOUTH_UP, STAIR_SHAPE, OUTER_RIGHT),
GBlockstate.when(EDGE, UP_WEST, STAIR_SHAPE, OUTER_LEFT),
GBlockstate.when(EDGE, SOUTH_WEST, STAIR_SHAPE, OUTER_LEFT)),
GBlockstate.variant(double_outer_id, true, R180, R180))
.with(When.anyOf(
GBlockstate.when(EDGE, UP_NORTH, STAIR_SHAPE, OUTER_RIGHT),
GBlockstate.when(EDGE, UP_WEST, STAIR_SHAPE, OUTER_RIGHT),
GBlockstate.when(EDGE, WEST_NORTH, STAIR_SHAPE, OUTER_LEFT)),
GBlockstate.variant(double_outer_id, true, R180, R270));
}
@Override
public void setRecipe(RecipeExporter exporter) {
RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, this, ReFramed.CUBE);
ShapedRecipeJsonBuilder
.create(RecipeCategory.BUILDING_BLOCKS, this, 4)
.pattern("I ")
.pattern("II ")
.pattern("III")
.input('I', ReFramed.CUBE)
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
.criterion(FabricRecipeProvider.hasItem(this), FabricRecipeProvider.conditionsFromItem(this))
.offerTo(exporter);
}
static { static {
final VoxelShape STRAIGHT = VoxelShapes.combineAndSimplify( final VoxelShape STRAIGHT = VoxelShapes.combineAndSimplify(
createCuboidShape(0, 8, 0, 16, 16, 8), createCuboidShape(0, 8, 0, 16, 16, 8),

View File

@ -1,19 +1,11 @@
package fr.adrien1106.reframed.block; package fr.adrien1106.reframed.block;
import fr.adrien1106.reframed.ReFramed;
import fr.adrien1106.reframed.generator.BlockStateProvider;
import fr.adrien1106.reframed.util.blocks.BlockHelper; 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.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
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.ItemPlacementContext; import net.minecraft.item.ItemPlacementContext;
import net.minecraft.recipe.book.RecipeCategory;
import net.minecraft.state.StateManager; import net.minecraft.state.StateManager;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction;
@ -27,7 +19,7 @@ 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;
import static fr.adrien1106.reframed.util.blocks.BlockProperties.STAIR_SHAPE; import static fr.adrien1106.reframed.util.blocks.BlockProperties.STAIR_SHAPE;
public class ReFramedStairsCubeBlock extends ReFramedDoubleBlock implements BlockStateProvider { public class ReFramedStairsCubeBlock extends ReFramedDoubleBlock {
private static final VoxelShape[] STAIRS_CUBE_VOXELS = VoxelListBuilder.buildFrom(STAIR_VOXELS); private static final VoxelShape[] STAIRS_CUBE_VOXELS = VoxelListBuilder.buildFrom(STAIR_VOXELS);
private record ModelCacheKey(Edge edge, StairShape shape) {} private record ModelCacheKey(Edge edge, StairShape shape) {}
@ -80,21 +72,4 @@ public class ReFramedStairsCubeBlock extends ReFramedDoubleBlock implements Bloc
StairShape shape = state.get(STAIR_SHAPE); StairShape shape = state.get(STAIR_SHAPE);
return i == 2 ? STAIRS_CUBE_VOXELS[edge.getID() * 9 + shape.getID()] : getStairShape(edge, shape); return i == 2 ? STAIRS_CUBE_VOXELS[edge.getID() * 9 + shape.getID()] : getStairShape(edge, shape);
} }
@Override
public MultipartBlockStateSupplier getMultipart() {
return getStairMultipart(this, true);
}
@Override
public void setRecipe(RecipeExporter exporter) {
RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, this, ReFramed.CUBE);
ShapelessRecipeJsonBuilder
.create(RecipeCategory.BUILDING_BLOCKS, this)
.input(ReFramed.STAIR)
.input(ReFramed.STEP)
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
.criterion(FabricRecipeProvider.hasItem(this), FabricRecipeProvider.conditionsFromItem(this))
.offerTo(exporter);
}
} }

View File

@ -1,25 +1,15 @@
package fr.adrien1106.reframed.block; package fr.adrien1106.reframed.block;
import fr.adrien1106.reframed.ReFramed; import fr.adrien1106.reframed.ReFramed;
import fr.adrien1106.reframed.generator.BlockStateProvider;
import fr.adrien1106.reframed.generator.GBlockstate;
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.Edge; import fr.adrien1106.reframed.util.blocks.Edge;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
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.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.ShapedRecipeJsonBuilder;
import net.minecraft.item.BlockItem; import net.minecraft.item.BlockItem;
import net.minecraft.item.ItemPlacementContext; import net.minecraft.item.ItemPlacementContext;
import net.minecraft.recipe.book.RecipeCategory;
import net.minecraft.state.StateManager; import net.minecraft.state.StateManager;
import net.minecraft.util.Identifier;
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.math.Vec3d;
@ -32,12 +22,10 @@ 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.EDGE;
import static fr.adrien1106.reframed.util.blocks.BlockProperties.STAIR_SHAPE; import static fr.adrien1106.reframed.util.blocks.BlockProperties.STAIR_SHAPE;
import static fr.adrien1106.reframed.util.blocks.Edge.*;
import static net.minecraft.data.client.VariantSettings.Rotation.*;
import static net.minecraft.state.property.Properties.*; import static net.minecraft.state.property.Properties.*;
import static net.minecraft.state.property.Properties.WATERLOGGED; import static net.minecraft.state.property.Properties.WATERLOGGED;
public class ReFramedStepBlock extends WaterloggableReFramedBlock implements BlockStateProvider { public class ReFramedStepBlock extends WaterloggableReFramedBlock {
public static final VoxelShape[] STEP_VOXELS; public static final VoxelShape[] STEP_VOXELS;
@ -164,51 +152,6 @@ public class ReFramedStepBlock extends WaterloggableReFramedBlock implements Blo
return super.getThemeMap(state, new_state); return super.getThemeMap(state, new_state);
} }
@Override
public BlockStateSupplier getMultipart() {
Identifier model_id = ReFramed.id("step_special");
return MultipartBlockStateSupplier.create(this)
/* X AXIS */
.with(GBlockstate.when(EDGE, DOWN_EAST),
GBlockstate.variant(model_id, true, R0, R0))
.with(GBlockstate.when(EDGE, EAST_UP),
GBlockstate.variant(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(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(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(model_id, true, R180, R270))
.with(GBlockstate.when(EDGE, SOUTH_UP),
GBlockstate.variant(model_id, true, R180, R90));
}
@Override
public void setRecipe(RecipeExporter exporter) {
RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, this, ReFramed.CUBE, 4);
ShapedRecipeJsonBuilder
.create(RecipeCategory.BUILDING_BLOCKS, this, 8)
.pattern("II")
.input('I', ReFramed.CUBE)
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
.criterion(FabricRecipeProvider.hasItem(this), FabricRecipeProvider.conditionsFromItem(this))
.offerTo(exporter);
}
static { static {
final VoxelShape STEP = createCuboidShape(0, 0, 0, 16, 8, 8); final VoxelShape STEP = createCuboidShape(0, 0, 0, 16, 8, 8);

View File

@ -1,22 +1,12 @@
package fr.adrien1106.reframed.block; package fr.adrien1106.reframed.block;
import fr.adrien1106.reframed.ReFramed;
import fr.adrien1106.reframed.generator.BlockStateProvider;
import fr.adrien1106.reframed.generator.GBlockstate;
import fr.adrien1106.reframed.util.blocks.BlockHelper; import fr.adrien1106.reframed.util.blocks.BlockHelper;
import fr.adrien1106.reframed.util.blocks.Edge; import fr.adrien1106.reframed.util.blocks.Edge;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
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.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.ItemPlacementContext; import net.minecraft.item.ItemPlacementContext;
import net.minecraft.recipe.book.RecipeCategory;
import net.minecraft.state.StateManager; import net.minecraft.state.StateManager;
import net.minecraft.util.Identifier;
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.Direction.Axis; import net.minecraft.util.math.Direction.Axis;
@ -27,12 +17,11 @@ 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.ReFramedStepBlock.getStepShape; import static fr.adrien1106.reframed.block.ReFramedStepBlock.getStepShape;
import static net.minecraft.data.client.VariantSettings.Rotation.*;
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; import static net.minecraft.util.shape.VoxelShapes.empty;
public class ReFramedStepsSlabBlock extends WaterloggableReFramedDoubleBlock implements BlockStateProvider { public class ReFramedStepsSlabBlock extends WaterloggableReFramedDoubleBlock {
private record ModelCacheKey(Direction facing, Axis axis) {} private record ModelCacheKey(Direction facing, Axis axis) {}
public ReFramedStepsSlabBlock(Settings settings) { public ReFramedStepsSlabBlock(Settings settings) {
@ -90,47 +79,4 @@ public class ReFramedStepsSlabBlock extends WaterloggableReFramedDoubleBlock imp
public int getTopThemeIndex(BlockState state) { public int getTopThemeIndex(BlockState state) {
return 2; return 2;
} }
@Override
public MultipartBlockStateSupplier getMultipart() {
Identifier step_id = ReFramed.id("steps_slab_special");
Identifier step_side_id = ReFramed.id("steps_slab_side_special");
return MultipartBlockStateSupplier.create(this)
.with(GBlockstate.when(FACING, Direction.DOWN, AXIS, Axis.X),
GBlockstate.variant(step_id, true, R0, R180))
.with(GBlockstate.when(FACING, Direction.DOWN, AXIS, Axis.Z),
GBlockstate.variant(step_id, true, R0, R270))
.with(GBlockstate.when(FACING, Direction.UP, AXIS, Axis.X),
GBlockstate.variant(step_id, true, R180, R180))
.with(GBlockstate.when(FACING, Direction.UP, AXIS, Axis.Z),
GBlockstate.variant(step_id, true, R180, R270))
.with(GBlockstate.when(FACING, Direction.EAST, AXIS, Axis.Z),
GBlockstate.variant(step_side_id, true, R0, R0))
.with(GBlockstate.when(FACING, Direction.EAST, AXIS, Axis.Y),
GBlockstate.variant(step_side_id, true, R90, R0))
.with(GBlockstate.when(FACING, Direction.SOUTH, AXIS, Axis.X),
GBlockstate.variant(step_side_id, true, R180, R90))
.with(GBlockstate.when(FACING, Direction.SOUTH, AXIS, Axis.Y),
GBlockstate.variant(step_side_id, true, R90, R90))
.with(GBlockstate.when(FACING, Direction.WEST, AXIS, Axis.Z),
GBlockstate.variant(step_side_id, true, R180, R180))
.with(GBlockstate.when(FACING, Direction.WEST, AXIS, Axis.Y),
GBlockstate.variant(step_side_id, true, R90, R180))
.with(GBlockstate.when(FACING, Direction.NORTH, AXIS, Axis.X),
GBlockstate.variant(step_side_id, true, R0, R270))
.with(GBlockstate.when(FACING, Direction.NORTH, AXIS, Axis.Y),
GBlockstate.variant(step_side_id, true, R90, R270));
}
@Override
public void setRecipe(RecipeExporter exporter) {
RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, this, ReFramed.CUBE, 2);
ShapelessRecipeJsonBuilder
.create(RecipeCategory.BUILDING_BLOCKS, this)
.input(ReFramed.STEP, 2)
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
.criterion(FabricRecipeProvider.hasItem(this), FabricRecipeProvider.conditionsFromItem(this))
.offerTo(exporter);
}
} }

View File

@ -0,0 +1,217 @@
package fr.adrien1106.reframed.block;
import fr.adrien1106.reframed.util.VoxelHelper;
import net.minecraft.block.*;
import net.minecraft.block.enums.WallShape;
import net.minecraft.item.ItemPlacementContext;
import net.minecraft.registry.tag.BlockTags;
import net.minecraft.state.StateManager;
import net.minecraft.state.property.Property;
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 net.minecraft.world.World;
import net.minecraft.world.WorldAccess;
import org.jetbrains.annotations.Nullable;
import java.util.stream.Stream;
import static net.minecraft.state.property.Properties.*;
public class ReframedWallBlock extends WaterloggableReFramedBlock {
public static final VoxelShape[] WALL_VOXELS;
private record ModelCacheKey(boolean up, WallShape east, WallShape north, WallShape west, WallShape south) {}
public ReframedWallBlock(Settings settings) {
super(settings);
setDefaultState(getDefaultState()
.with(UP, true)
.with(EAST_WALL_SHAPE, WallShape.NONE)
.with(NORTH_WALL_SHAPE, WallShape.NONE)
.with(WEST_WALL_SHAPE, WallShape.NONE)
.with(SOUTH_WALL_SHAPE, WallShape.NONE)
);
}
@Override
public Object getModelCacheKey(BlockState state) {
return new ModelCacheKey(
state.get(UP),
state.get(EAST_WALL_SHAPE),
state.get(NORTH_WALL_SHAPE),
state.get(WEST_WALL_SHAPE),
state.get(SOUTH_WALL_SHAPE)
);
}
@Override
public int getModelStateCount() {
return 162;
}
@Override
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
super.appendProperties(builder.add(UP, EAST_WALL_SHAPE, NORTH_WALL_SHAPE, SOUTH_WALL_SHAPE, WEST_WALL_SHAPE));
}
@Override
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);
if (dir == Direction.DOWN) return new_state;
BlockState top_state = dir == Direction.UP? other_state: world.getBlockState(pos.up());
boolean fs = top_state.isSideSolidFullSquare(world, pos.up(), Direction.DOWN);
VoxelShape top_shape = fs ? null : top_state.getCollisionShape(world, pos.up()).getFace(Direction.DOWN);
if (dir == Direction.UP) {
for (Direction d : Direction.Type.HORIZONTAL) {
Property<WallShape> wall_shape = getWallShape(d);
if (state.get(wall_shape) == WallShape.NONE) continue;
new_state = new_state.with(
wall_shape,
fs
|| (top_state.contains(wall_shape) && top_state.get(wall_shape) != WallShape.NONE)
|| shouldUseTall(WALL_VOXELS[dir.ordinal() + 3], top_shape)
? WallShape.TALL
: WallShape.LOW
);
}
return new_state.with(UP, shouldHavePost(new_state, top_state, top_shape));
}
boolean side_full = other_state.isSideSolidFullSquare(world, moved, dir.getOpposite());
if (shouldConnectTo(other_state, side_full, dir.getOpposite())) {
new_state = new_state.with(
getWallShape(dir),
fs || shouldUseTall(WALL_VOXELS[dir.ordinal() + 3], top_shape)
? WallShape.TALL
: WallShape.LOW
);
} else new_state = new_state.with(getWallShape(dir), WallShape.NONE);
return new_state.with(UP, shouldHavePost(new_state, top_state, top_shape));
}
@Override
public @Nullable BlockState getPlacementState(ItemPlacementContext ctx) {
BlockState state = super.getPlacementState(ctx);
World world = ctx.getWorld();
BlockPos pos = ctx.getBlockPos();
BlockState top_state = world.getBlockState(pos.up());
boolean fs = top_state.isSideSolidFullSquare(world, pos.up(), Direction.DOWN);
VoxelShape top_shape = fs ? null : top_state.getCollisionShape(world, pos.up()).getFace(Direction.DOWN);
for (Direction dir : Direction.Type.HORIZONTAL) {
BlockPos offset = pos.offset(dir);
BlockState neighbor = world.getBlockState(offset);
boolean side_full = neighbor.isSideSolidFullSquare(world, offset, dir.getOpposite());
if (shouldConnectTo(neighbor, side_full, dir.getOpposite())) {
state = state.with(
getWallShape(dir),
fs || shouldUseTall(WALL_VOXELS[dir.ordinal() + 3], top_shape)
? WallShape.TALL
: WallShape.LOW
);
}
}
return state.with(UP, shouldHavePost(state, top_state, top_shape));
}
@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
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
VoxelShape shape = state.get(UP) ? WALL_VOXELS[0]: VoxelShapes.empty();
for (Direction dir : Direction.Type.HORIZONTAL) {
WallShape wall_shape = state.get(getWallShape(dir));
if (wall_shape != WallShape.NONE)
shape = VoxelShapes.union(shape, WALL_VOXELS[1 + (wall_shape.ordinal()-1) * 4 + (dir.ordinal() - 2)]);
}
return shape;
}
@Override
public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) {
VoxelShape shape = state.get(UP) ? WALL_VOXELS[9]: VoxelShapes.empty();
for (Direction dir : Direction.Type.HORIZONTAL) {
if (state.get(getWallShape(dir)) != WallShape.NONE)
shape = VoxelShapes.union(shape, WALL_VOXELS[8 + dir.ordinal()]);
}
return shape;
}
private static boolean shouldHavePost(BlockState state, BlockState top_state, VoxelShape top_shape) {
// above has post
if (top_state.contains(NORTH_WALL_SHAPE) && top_state.get(UP)) return true;
if (Stream.of(Direction.SOUTH, Direction.EAST) // Opposites are different
.anyMatch(dir -> state.get(getWallShape(dir)) != state.get(getWallShape(dir.getOpposite())))
) return true;
// no sides
if (Direction.Type.HORIZONTAL.stream().allMatch(dir -> state.get(getWallShape(dir)) == WallShape.NONE))
return true;
// tall Matching sides
if (Stream.of(Direction.SOUTH, Direction.EAST)
.anyMatch(dir ->
state.get(getWallShape(dir)) == WallShape.TALL
&& state.get(getWallShape(dir.getOpposite())) == WallShape.TALL
)) return false;
return top_state.isIn(BlockTags.WALL_POST_OVERRIDE) || top_shape == null || shouldUseTall(WALL_VOXELS[0], top_shape);
}
private static boolean shouldConnectTo(BlockState state, boolean side_full, Direction side) {
Block block = state.getBlock();
boolean bl = block instanceof FenceGateBlock && FenceGateBlock.canWallConnect(state, side);
return state.isIn(BlockTags.WALLS) || !WallBlock.cannotConnect(state) && side_full || block instanceof PaneBlock || bl;
}
private static boolean shouldUseTall(VoxelShape self_shape, VoxelShape other_shape) {
return !VoxelShapes.matchesAnywhere(
self_shape,
other_shape,
BooleanBiFunction.ONLY_FIRST
);
}
private static Property<WallShape> getWallShape(Direction dir) {
return switch (dir) {
case EAST -> EAST_WALL_SHAPE;
case NORTH -> NORTH_WALL_SHAPE;
case WEST -> WEST_WALL_SHAPE;
case SOUTH -> SOUTH_WALL_SHAPE;
default -> null;
};
}
static {
VoxelShape POST = createCuboidShape(4, 0, 4, 12, 16, 12);
VoxelShape POST_COLLISION = createCuboidShape(4, 0, 4, 12, 24, 12);
VoxelShape LOW = createCuboidShape(5, 0, 0, 11, 14, 8);
VoxelShape TALL = createCuboidShape(5, 0, 0, 11, 16, 8);
VoxelShape SIDE_COLLISION = createCuboidShape(5, 0, 0, 11, 24, 8);
WALL_VOXELS = VoxelHelper.VoxelListBuilder.create(POST, 14)
.add(LOW)
.add(VoxelHelper::mirrorZ)
.add(VoxelHelper::rotateY)
.add(VoxelHelper::mirrorX)
.add(TALL)
.add(VoxelHelper::mirrorZ)
.add(VoxelHelper::rotateY)
.add(VoxelHelper::mirrorX)
.add(POST_COLLISION)
.add(SIDE_COLLISION)
.add(VoxelHelper::mirrorZ)
.add(VoxelHelper::rotateY)
.add(VoxelHelper::mirrorX)
.build();
}
}

View File

@ -27,70 +27,110 @@ public class ReFramedClient implements ClientModInitializer {
BlockRenderLayerMap.INSTANCE.putBlocks(RenderLayer.getCutout(), ReFramed.BLOCKS.toArray(new Block[0])); BlockRenderLayerMap.INSTANCE.putBlocks(RenderLayer.getCutout(), ReFramed.BLOCKS.toArray(new Block[0]));
// CUBE // CUBE
HELPER.addReFramedModel("cube_special" , HELPER.auto(new Identifier("block/cube"))); HELPER.addReFramedModel("cube" , HELPER.auto(new Identifier("block/cube")));
// SMALL_CUBE // SMALL_CUBE
HELPER.addReFramedModel("small_cube_special" , HELPER.auto(ReFramed.id("block/small_cube/base"))); HELPER.addReFramedModel("small_cube" , HELPER.auto(ReFramed.id("block/small_cube/base")));
// SMALL_CUBES_STEP // SMALL_CUBES_STEP
HELPER.addReFramedModel("small_cubes_step_special" , HELPER.autoDouble(ReFramed.id("block/small_cube/base"), ReFramed.id("block/small_cube/step/base"))); HELPER.addReFramedModel("small_cubes_step" , HELPER.autoDouble(ReFramed.id("block/small_cube/base"), ReFramed.id("block/small_cube/step/base")));
HELPER.addReFramedModel("small_cubes_step_reverse_special" , HELPER.autoDouble(ReFramed.id("block/small_cube/step/base"), ReFramed.id("block/small_cube/base"))); HELPER.addReFramedModel("small_cubes_step_reverse" , HELPER.autoDouble(ReFramed.id("block/small_cube/step/base"), ReFramed.id("block/small_cube/base")));
// SLAB // SLAB
HELPER.addReFramedModel("slab_special" , HELPER.auto(new Identifier("block/slab"))); HELPER.addReFramedModel("slab" , HELPER.auto(new Identifier("block/slab")));
// SLAB_CUBE // SLAB_CUBE
HELPER.addReFramedModel("double_slab_special" , HELPER.autoDouble(new Identifier("block/slab"), new Identifier("block/slab_top"))); HELPER.addReFramedModel("double_slab" , HELPER.autoDouble(new Identifier("block/slab"), new Identifier("block/slab_top")));
// STAIR // STAIR
HELPER.addReFramedModel("stair_special" , HELPER.auto(ReFramed.id("block/stair/straight"))); HELPER.addReFramedModel("stair" , HELPER.auto(ReFramed.id("block/stair/straight")));
HELPER.addReFramedModel("outers_stair_special" , HELPER.auto(ReFramed.id("block/stair/double_outer"))); HELPER.addReFramedModel("outers_stair" , HELPER.auto(ReFramed.id("block/stair/double_outer")));
HELPER.addReFramedModel("inner_stair_special" , HELPER.auto(ReFramed.id("block/stair/inner"))); HELPER.addReFramedModel("inner_stair" , HELPER.auto(ReFramed.id("block/stair/inner")));
HELPER.addReFramedModel("outer_stair_special" , HELPER.auto(ReFramed.id("block/stair/outer"))); HELPER.addReFramedModel("outer_stair" , HELPER.auto(ReFramed.id("block/stair/outer")));
HELPER.addReFramedModel("outer_side_stair_special" , HELPER.auto(ReFramed.id("block/stair/outer_side"))); HELPER.addReFramedModel("outer_side_stair" , HELPER.auto(ReFramed.id("block/stair/outer_side")));
// STAIRS_CUBE // STAIRS_CUBE
HELPER.addReFramedModel("stairs_cube_special" , HELPER.autoDouble(ReFramed.id("block/stair/straight"), ReFramed.id("block/stair/cube/straight"))); HELPER.addReFramedModel("stairs_cube" , HELPER.autoDouble(ReFramed.id("block/stair/straight"), ReFramed.id("block/stair/cube/straight")));
HELPER.addReFramedModel("outers_stairs_cube_special" , HELPER.autoDouble(ReFramed.id("block/stair/double_outer"), ReFramed.id("block/stair/cube/double_outer"))); HELPER.addReFramedModel("outers_stairs_cube" , HELPER.autoDouble(ReFramed.id("block/stair/double_outer"), ReFramed.id("block/stair/cube/double_outer")));
HELPER.addReFramedModel("inner_stairs_cube_special" , HELPER.autoDouble(ReFramed.id("block/stair/inner"), ReFramed.id("block/stair/cube/inner"))); HELPER.addReFramedModel("inner_stairs_cube" , HELPER.autoDouble(ReFramed.id("block/stair/inner"), ReFramed.id("block/stair/cube/inner")));
HELPER.addReFramedModel("outer_stairs_cube_special" , HELPER.autoDouble(ReFramed.id("block/stair/outer"), ReFramed.id("block/stair/cube/outer"))); HELPER.addReFramedModel("outer_stairs_cube" , HELPER.autoDouble(ReFramed.id("block/stair/outer"), ReFramed.id("block/stair/cube/outer")));
HELPER.addReFramedModel("outer_side_stairs_cube_special" , HELPER.autoDouble(ReFramed.id("block/stair/outer_side"), ReFramed.id("block/stair/cube/outer_side"))); HELPER.addReFramedModel("outer_side_stairs_cube" , HELPER.autoDouble(ReFramed.id("block/stair/outer_side"), ReFramed.id("block/stair/cube/outer_side")));
// HALF_STAIR // HALF_STAIR
HELPER.addReFramedModel("half_stair_down_special" , HELPER.auto(ReFramed.id("block/half_stair/down"))); HELPER.addReFramedModel("half_stair_down" , HELPER.auto(ReFramed.id("block/half_stair/down")));
HELPER.addReFramedModel("half_stair_side_special" , HELPER.auto(ReFramed.id("block/half_stair/side"))); HELPER.addReFramedModel("half_stair_side" , HELPER.auto(ReFramed.id("block/half_stair/side")));
// HALF_STAIRS_SLAB // HALF_STAIRS_SLAB
HELPER.addReFramedModel("half_stairs_slab_down_special" , HELPER.autoDouble(ReFramed.id("block/half_stair/down"), ReFramed.id("block/half_stair/slab/down"))); HELPER.addReFramedModel("half_stairs_slab_down" , HELPER.autoDouble(ReFramed.id("block/half_stair/down"), ReFramed.id("block/half_stair/slab/down")));
HELPER.addReFramedModel("half_stairs_slab_side_special" , HELPER.autoDouble(ReFramed.id("block/half_stair/side"), ReFramed.id("block/half_stair/slab/side"))); HELPER.addReFramedModel("half_stairs_slab_side" , HELPER.autoDouble(ReFramed.id("block/half_stair/side"), ReFramed.id("block/half_stair/slab/side")));
// HALF_STAIRS_STAIR // HALF_STAIRS_STAIR
HELPER.addReFramedModel("half_stairs_stair_down_special" , HELPER.autoDouble(ReFramed.id("block/half_stair/down"), ReFramed.id("block/half_stair/stair/down"))); HELPER.addReFramedModel("half_stairs_stair_down" , HELPER.autoDouble(ReFramed.id("block/half_stair/down"), ReFramed.id("block/half_stair/stair/down")));
HELPER.addReFramedModel("half_stairs_stair_side_special" , HELPER.autoDouble(ReFramed.id("block/half_stair/side"), ReFramed.id("block/half_stair/stair/side"))); HELPER.addReFramedModel("half_stairs_stair_side" , HELPER.autoDouble(ReFramed.id("block/half_stair/side"), ReFramed.id("block/half_stair/stair/side")));
HELPER.addReFramedModel("half_stairs_stair_reverse_special" , HELPER.autoDouble(ReFramed.id("block/half_stair/stair/side"), ReFramed.id("block/half_stair/side"))); HELPER.addReFramedModel("half_stairs_stair_reverse" , HELPER.autoDouble(ReFramed.id("block/half_stair/stair/side"), ReFramed.id("block/half_stair/side")));
// STEP // STEP
HELPER.addReFramedModel("step_special" , HELPER.auto(ReFramed.id("block/step/down"))); HELPER.addReFramedModel("step" , HELPER.auto(ReFramed.id("block/step/down")));
// STEPS_SLAB // STEPS_SLAB
HELPER.addReFramedModel("steps_slab_special" , HELPER.autoDouble(ReFramed.id("block/step/down"), ReFramed.id("block/step/slab/down"))); HELPER.addReFramedModel("steps_slab" , HELPER.autoDouble(ReFramed.id("block/step/down"), ReFramed.id("block/step/slab/down")));
HELPER.addReFramedModel("steps_slab_side_special" , HELPER.autoDouble(ReFramed.id("block/step/side"), ReFramed.id("block/step/slab/side"))); HELPER.addReFramedModel("steps_slab_side" , HELPER.autoDouble(ReFramed.id("block/step/side"), ReFramed.id("block/step/slab/side")));
// LAYER // LAYER
HELPER.addReFramedModel("layer_1_special" , HELPER.auto(new Identifier("block/snow_height2"))); HELPER.addReFramedModel("layer_1" , HELPER.auto(new Identifier("block/snow_height2")));
HELPER.addReFramedModel("layer_2_special" , HELPER.auto(new Identifier("block/snow_height4"))); HELPER.addReFramedModel("layer_2" , HELPER.auto(new Identifier("block/snow_height4")));
HELPER.addReFramedModel("layer_3_special" , HELPER.auto(new Identifier("block/snow_height6"))); HELPER.addReFramedModel("layer_3" , HELPER.auto(new Identifier("block/snow_height6")));
HELPER.addReFramedModel("layer_4_special" , HELPER.auto(new Identifier("block/snow_height8"))); HELPER.addReFramedModel("layer_4" , HELPER.auto(new Identifier("block/snow_height8")));
HELPER.addReFramedModel("layer_5_special" , HELPER.auto(new Identifier("block/snow_height10"))); HELPER.addReFramedModel("layer_5" , HELPER.auto(new Identifier("block/snow_height10")));
HELPER.addReFramedModel("layer_6_special" , HELPER.auto(new Identifier("block/snow_height12"))); HELPER.addReFramedModel("layer_6" , HELPER.auto(new Identifier("block/snow_height12")));
HELPER.addReFramedModel("layer_7_special" , HELPER.auto(new Identifier("block/snow_height14"))); HELPER.addReFramedModel("layer_7" , HELPER.auto(new Identifier("block/snow_height14")));
HELPER.addReFramedModel("layer_8_special" , HELPER.auto(new Identifier("block/cube"))); HELPER.addReFramedModel("layer_8" , HELPER.auto(new Identifier("block/cube")));
// PILLAR // PILLAR
HELPER.addReFramedModel("pillar_special" , HELPER.auto(ReFramed.id("block/pillar"))); HELPER.addReFramedModel("pillar" , HELPER.auto(ReFramed.id("block/pillar")));
// WALL
HELPER.addReFramedModel("wall_inventory" , HELPER.auto(ReFramed.id("block/wall/inventory/default")));
// --------------------- pillar
HELPER.addReFramedModel("wall_core" , HELPER.auto(ReFramed.id("block/wall/pillar/core")));
HELPER.addReFramedModel("wall_pillar_low" , HELPER.auto(ReFramed.id("block/wall/pillar/low")));
HELPER.addReFramedModel("wall_pillar_tall" , HELPER.auto(ReFramed.id("block/wall/pillar/tall")));
HELPER.addReFramedModel("wall_pillar_none" , HELPER.auto(ReFramed.id("block/wall/pillar/none")));
// --------------------- side
HELPER.addReFramedModel("wall_side_low" , HELPER.auto(ReFramed.id("block/wall/side/low")));
HELPER.addReFramedModel("wall_side_tall" , HELPER.auto(ReFramed.id("block/wall/side/tall")));
// --------------------- junction
HELPER.addReFramedModel("wall_low_e" , HELPER.auto(ReFramed.id("block/wall/junction/low")));
HELPER.addReFramedModel("wall_tall_e" , HELPER.auto(ReFramed.id("block/wall/junction/tall")));
// --------------------- junction_i
HELPER.addReFramedModel("wall_low_i" , HELPER.auto(ReFramed.id("block/wall/junction/low_i")));
HELPER.addReFramedModel("wall_tall_i" , HELPER.auto(ReFramed.id("block/wall/junction/tall_i")));
HELPER.addReFramedModel("wall_low_tall_i" , HELPER.auto(ReFramed.id("block/wall/junction/low_tall_i")));
// --------------------- junction_c
HELPER.addReFramedModel("wall_low_c" , HELPER.auto(ReFramed.id("block/wall/junction/low_c")));
HELPER.addReFramedModel("wall_tall_c" , HELPER.auto(ReFramed.id("block/wall/junction/tall_c")));
HELPER.addReFramedModel("wall_low_tall_c" , HELPER.auto(ReFramed.id("block/wall/junction/low_tall_c")));
HELPER.addReFramedModel("wall_tall_low_c" , HELPER.auto(ReFramed.id("block/wall/junction/tall_low_c")));
// --------------------- junction_t
HELPER.addReFramedModel("wall_low_t" , HELPER.auto(ReFramed.id("block/wall/junction/low_t")));
HELPER.addReFramedModel("wall_tall_t" , HELPER.auto(ReFramed.id("block/wall/junction/tall_t")));
HELPER.addReFramedModel("wall_tall_low_c_t" , HELPER.auto(ReFramed.id("block/wall/junction/tall_low_c_t")));
HELPER.addReFramedModel("wall_tall_i_low_t" , HELPER.auto(ReFramed.id("block/wall/junction/tall_i_low_t")));
HELPER.addReFramedModel("wall_low_i_tall_t" , HELPER.auto(ReFramed.id("block/wall/junction/low_i_tall_t")));
HELPER.addReFramedModel("wall_low_tall_c_t" , HELPER.auto(ReFramed.id("block/wall/junction/low_tall_c_t")));
HELPER.addReFramedModel("wall_low_c_tall_t" , HELPER.auto(ReFramed.id("block/wall/junction/low_c_tall_t")));
HELPER.addReFramedModel("wall_tall_c_low_t" , HELPER.auto(ReFramed.id("block/wall/junction/tall_c_low_t")));
// --------------------- junction_x
HELPER.addReFramedModel("wall_low_x" , HELPER.auto(ReFramed.id("block/wall/junction/low_x")));
HELPER.addReFramedModel("wall_tall_x" , HELPER.auto(ReFramed.id("block/wall/junction/tall_x")));
HELPER.addReFramedModel("wall_tall_i_low_i_x" , HELPER.auto(ReFramed.id("block/wall/junction/tall_i_low_i_x")));
HELPER.addReFramedModel("wall_tall_low_t_x" , HELPER.auto(ReFramed.id("block/wall/junction/tall_low_t_x")));
HELPER.addReFramedModel("wall_tall_c_low_c_x" , HELPER.auto(ReFramed.id("block/wall/junction/tall_c_low_c_x")));
HELPER.addReFramedModel("wall_tall_t_low_x" , HELPER.auto(ReFramed.id("block/wall/junction/tall_t_low_x")));
//item model assignments (in lieu of models/item/___.json) //item model assignments (in lieu of models/item/___.json)
HELPER.assignItemModel("cube_special" , ReFramed.CUBE); HELPER.assignItemModel("cube" , ReFramed.CUBE);
HELPER.assignItemModel("small_cube_special" , ReFramed.SMALL_CUBE); HELPER.assignItemModel("small_cube" , ReFramed.SMALL_CUBE);
HELPER.assignItemModel("small_cubes_step_special" , ReFramed.SMALL_CUBES_STEP); HELPER.assignItemModel("small_cubes_step" , ReFramed.SMALL_CUBES_STEP);
HELPER.assignItemModel("slab_special" , ReFramed.SLAB); HELPER.assignItemModel("slab" , ReFramed.SLAB);
HELPER.assignItemModel("double_slab_special" , ReFramed.SLABS_CUBE); HELPER.assignItemModel("double_slab" , ReFramed.SLABS_CUBE);
HELPER.assignItemModel("stair_special" , ReFramed.STAIR); HELPER.assignItemModel("stair" , ReFramed.STAIR);
HELPER.assignItemModel("stairs_cube_special" , ReFramed.STAIRS_CUBE); HELPER.assignItemModel("stairs_cube" , ReFramed.STAIRS_CUBE);
HELPER.assignItemModel("half_stair_down_special" , ReFramed.HALF_STAIR); HELPER.assignItemModel("half_stair_down" , ReFramed.HALF_STAIR);
HELPER.assignItemModel("half_stairs_slab_down_special" , ReFramed.HALF_STAIRS_SLAB); HELPER.assignItemModel("half_stairs_slab_down" , ReFramed.HALF_STAIRS_SLAB);
HELPER.assignItemModel("half_stairs_stair_down_special", ReFramed.HALF_STAIRS_STAIR); HELPER.assignItemModel("half_stairs_stair_down", ReFramed.HALF_STAIRS_STAIR);
HELPER.assignItemModel("step_special" , ReFramed.STEP); HELPER.assignItemModel("step" , ReFramed.STEP);
HELPER.assignItemModel("steps_slab_special" , ReFramed.STEPS_SLAB); HELPER.assignItemModel("steps_slab" , ReFramed.STEPS_SLAB);
HELPER.assignItemModel("layer_1_special" , ReFramed.LAYER); HELPER.assignItemModel("layer_1" , ReFramed.LAYER);
HELPER.assignItemModel("pillar_special" , ReFramed.PILLAR); HELPER.assignItemModel("pillar" , ReFramed.PILLAR);
HELPER.assignItemModel("wall_inventory" , ReFramed.WALL);
} }
private void privateInit() { private void privateInit() {

View File

@ -40,15 +40,15 @@ public class ReFramedClientHelper {
} }
public void addReFramedModel(String id, UnbakedModel unbaked) { public void addReFramedModel(String id, UnbakedModel unbaked) {
prov.addReFramedModel(ReFramed.id(id), unbaked); prov.addReFramedModel(ReFramed.id(id + "_special"), unbaked);
} }
public void assignItemModel(String id, ItemConvertible... item_convertibles) { public void assignItemModel(String id, ItemConvertible... item_convertibles) {
prov.assignItemModel(ReFramed.id(id), item_convertibles); prov.assignItemModel(ReFramed.id(id + "_special"), item_convertibles);
} }
public CamoAppearanceManager getCamoApperanceManager(Function<SpriteIdentifier, Sprite> spriteLookup) { public CamoAppearanceManager getCamoAppearanceManager(Function<SpriteIdentifier, Sprite> spriteLookup) {
return prov.getCamoApperanceManager(spriteLookup); return prov.getCamoAppearanceManager(spriteLookup);
} }
public @NotNull Renderer getFabricRenderer() { public @NotNull Renderer getFabricRenderer() {

View File

@ -44,7 +44,7 @@ public class ReFramedModelProvider implements ModelResourceProvider, ModelVarian
/// camo appearance manager cache /// camo appearance manager cache
public CamoAppearanceManager getCamoApperanceManager(Function<SpriteIdentifier, Sprite> spriteLookup) { public CamoAppearanceManager getCamoAppearanceManager(Function<SpriteIdentifier, Sprite> spriteLookup) {
//This is kind of needlessly sketchy using the "volatile double checked locking" pattern. //This is kind of needlessly sketchy using the "volatile double checked locking" pattern.
//I'd like all frame models to use the same CamoApperanceManager, despite the model //I'd like all frame models to use the same CamoApperanceManager, despite the model
//baking process happening concurrently on several threads, but I also don't want to //baking process happening concurrently on several threads, but I also don't want to

View File

@ -114,7 +114,9 @@ public abstract class RetexturingBakedModel extends ForwardingBakedModel {
if (camo instanceof WeightedComputedAppearance wca) model_id = wca.getAppearanceIndex(seed); if (camo instanceof WeightedComputedAppearance wca) model_id = wca.getAppearanceIndex(seed);
int tint = 0xFF000000 | MinecraftClient.getInstance().getBlockColors().getColor(theme, world, pos, 0); int tint = 0xFF000000 | MinecraftClient.getInstance().getBlockColors().getColor(theme, world, pos, 0);
Mesh untintedMesh = getRetexturedMesh(new MeshCacheKey(frame_block.getModelCacheKey(state), camo, model_id), state); MeshCacheKey key = new MeshCacheKey(frame_block.getModelCacheKey(state), camo, model_id);
// do not clutter the cache with single-use meshes
Mesh untintedMesh = camo.hashCode() == -1 ? transformMesh(key, state) : getRetexturedMesh(key, state);
//The specific tint might vary a lot; imagine grass color smoothly changing. Trying to bake the tint into //The specific tint might vary a lot; imagine grass color smoothly changing. Trying to bake the tint into
//the cached mesh will pollute it with a ton of single-use meshes with only slightly different colors. //the cached mesh will pollute it with a ton of single-use meshes with only slightly different colors.

View File

@ -33,7 +33,7 @@ public class UnbakedAutoRetexturedModel extends UnbakedRetexturedModel {
public BakedModel bake(Baker baker, Function<SpriteIdentifier, Sprite> texture_getter, ModelBakeSettings bake_settings, Identifier identifier) { public BakedModel bake(Baker baker, Function<SpriteIdentifier, Sprite> texture_getter, ModelBakeSettings bake_settings, Identifier identifier) {
return new RetexturingBakedModel( return new RetexturingBakedModel(
baker.bake(parent, bake_settings), baker.bake(parent, bake_settings),
ReFramedClient.HELPER.getCamoApperanceManager(texture_getter), ReFramedClient.HELPER.getCamoAppearanceManager(texture_getter),
theme_index, theme_index,
bake_settings, bake_settings,
item_state, item_state,

View File

@ -41,7 +41,7 @@ public class UnbakedJsonRetexturedModel extends UnbakedRetexturedModel {
return new RetexturingBakedModel( return new RetexturingBakedModel(
baker.bake(parent, bake_settings), baker.bake(parent, bake_settings),
ReFramedClient.HELPER.getCamoApperanceManager(spriteLookup), ReFramedClient.HELPER.getCamoAppearanceManager(spriteLookup),
theme_index, theme_index,
bake_settings, bake_settings,
item_state, item_state,

View File

@ -20,8 +20,9 @@ public abstract class UnbakedRetexturedModel implements UnbakedModel {
this.parent = parent; this.parent = parent;
} }
public void setThemeIndex(int theme_index) { public UnbakedRetexturedModel setThemeIndex(int theme_index) {
this.theme_index = theme_index; this.theme_index = theme_index;
return this;
} }
@Override @Override

View File

@ -95,7 +95,7 @@ public class CamoAppearanceManager {
model = dynamic_model.computeQuads(world, state, pos, theme_index); model = dynamic_model.computeQuads(world, state, pos, theme_index);
// if model isn't rebaked its just wrapped (i.e. not dynamic and may be cached) // if model isn't rebaked its just wrapped (i.e. not dynamic and may be cached)
if (model instanceof RebakedModel) { if (model instanceof RebakedModel) {
CamoAppearance appearance = computeAppearance(model, state); CamoAppearance appearance = computeAppearance(model, state, !item);
if (item) APPEARANCE_CACHE.put(state, appearance); if (item) APPEARANCE_CACHE.put(state, appearance);
return appearance; return appearance;
} }
@ -104,7 +104,7 @@ public class CamoAppearanceManager {
// refresh cache // refresh cache
if (APPEARANCE_CACHE.asMap().containsKey(state)) return APPEARANCE_CACHE.getIfPresent(state); if (APPEARANCE_CACHE.asMap().containsKey(state)) return APPEARANCE_CACHE.getIfPresent(state);
CamoAppearance appearance = computeAppearance(model, state); CamoAppearance appearance = computeAppearance(model, state, false);
APPEARANCE_CACHE.put(state, appearance); APPEARANCE_CACHE.put(state, appearance);
return appearance; return appearance;
} }
@ -118,7 +118,7 @@ public class CamoAppearanceManager {
// The computeIfAbsent map update will work without corrupting the map, but there will be some "wasted effort" computing the value twice. // The computeIfAbsent map update will work without corrupting the map, but there will be some "wasted effort" computing the value twice.
// The results are going to be the same, apart from their serialNumbers differing (= their equals & hashCode differing). // The results are going to be the same, apart from their serialNumbers differing (= their equals & hashCode differing).
// Tiny amount of wasted space in some caches if CamoAppearances are used as a map key, then. IMO it's not a critical issue. // Tiny amount of wasted space in some caches if CamoAppearances are used as a map key, then. IMO it's not a critical issue.
private CamoAppearance computeAppearance(BakedModel model, BlockState state) { private CamoAppearance computeAppearance(BakedModel model, BlockState state, boolean is_dynamic) {
if(state.getBlock() == Blocks.BARRIER) return barrierItemAppearance; if(state.getBlock() == Blocks.BARRIER) return barrierItemAppearance;
if (!(model instanceof WeightedBakedModelAccessor weighted_model)) { if (!(model instanceof WeightedBakedModelAccessor weighted_model)) {
@ -126,7 +126,7 @@ public class CamoAppearanceManager {
getAppearance(model), getAppearance(model),
getCachedMaterial(state, true), getCachedMaterial(state, true),
getCachedMaterial(state, false), getCachedMaterial(state, false),
serial_number.getAndIncrement() is_dynamic ? -1 : serial_number.getAndIncrement()
); );
} }
List<Weighted.Present<Appearance>> appearances = weighted_model.getModels().stream() List<Weighted.Present<Appearance>> appearances = weighted_model.getModels().stream()
@ -137,7 +137,7 @@ public class CamoAppearanceManager {
appearances, appearances,
getCachedMaterial(state, true), getCachedMaterial(state, true),
getCachedMaterial(state, false), getCachedMaterial(state, false),
serial_number.getAndIncrement() is_dynamic ? -1 : serial_number.getAndIncrement()
); );
} }

View File

@ -1,7 +1,8 @@
package fr.adrien1106.reframed.generator; package fr.adrien1106.reframed.generator;
import net.minecraft.block.Block;
import net.minecraft.data.client.BlockStateSupplier; import net.minecraft.data.client.BlockStateSupplier;
public interface BlockStateProvider { public interface BlockStateProvider {
BlockStateSupplier getMultipart(); BlockStateSupplier getMultipart(Block block);
} }

View File

@ -1,14 +1,23 @@
package fr.adrien1106.reframed.generator; package fr.adrien1106.reframed.generator;
import fr.adrien1106.reframed.ReFramed; import fr.adrien1106.reframed.ReFramed;
import fr.adrien1106.reframed.block.*;
import fr.adrien1106.reframed.generator.block.*;
import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagProvider.BlockTagProvider; import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagProvider.BlockTagProvider;
import net.minecraft.block.Block;
import net.minecraft.registry.RegistryWrapper.WrapperLookup; import net.minecraft.registry.RegistryWrapper.WrapperLookup;
import net.minecraft.registry.tag.BlockTags; import net.minecraft.registry.tag.BlockTags;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
public class GBlockTag extends BlockTagProvider { public class GBlockTag extends BlockTagProvider {
private static final Map<Class<? extends Block>, TagGetter> providers = new HashMap<>();
static {
providers.put(ReframedWallBlock.class, new Wall());
}
public GBlockTag(FabricDataOutput output, CompletableFuture<WrapperLookup> registries) { public GBlockTag(FabricDataOutput output, CompletableFuture<WrapperLookup> registries) {
super(output, registries); super(output, registries);
@ -17,6 +26,10 @@ public class GBlockTag extends BlockTagProvider {
@Override @Override
protected void configure(WrapperLookup arg) { protected void configure(WrapperLookup arg) {
FabricTagBuilder builder = getOrCreateTagBuilder(BlockTags.AXE_MINEABLE); FabricTagBuilder builder = getOrCreateTagBuilder(BlockTags.AXE_MINEABLE);
ReFramed.BLOCKS.forEach(builder::add); ReFramed.BLOCKS.forEach((block) -> {
if (providers.containsKey(block.getClass()))
providers.get(block.getClass()).getTags().forEach((tag) -> getOrCreateTagBuilder(tag).add(block));
builder.add(block);
});
} }
} }

View File

@ -1,17 +1,39 @@
package fr.adrien1106.reframed.generator; package fr.adrien1106.reframed.generator;
import fr.adrien1106.reframed.ReFramed; import fr.adrien1106.reframed.ReFramed;
import fr.adrien1106.reframed.block.*;
import fr.adrien1106.reframed.generator.block.*;
import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricModelProvider; import net.fabricmc.fabric.api.datagen.v1.provider.FabricModelProvider;
import net.minecraft.block.Block;
import net.minecraft.data.client.*; import net.minecraft.data.client.*;
import net.minecraft.state.property.Property; import net.minecraft.state.property.Property;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects; import java.util.Objects;
import static net.minecraft.data.client.VariantSettings.Rotation.R0; import static net.minecraft.data.client.VariantSettings.Rotation.R0;
public class GBlockstate extends FabricModelProvider { public class GBlockstate extends FabricModelProvider {
private static final Map<Class<? extends Block>, BlockStateProvider> providers = new HashMap<>();
static {
providers.put(ReFramedHalfStairBlock.class, new HalfStair());
providers.put(ReFramedHalfStairsSlabBlock.class, new HalfStairsSlab());
providers.put(ReFramedHalfStairsStairBlock.class, new HalfStairsStair());
providers.put(ReFramedLayerBlock.class, new Layer());
providers.put(ReFramedPillarBlock.class, new Pillar());
providers.put(ReFramedSlabBlock.class, new Slab());
providers.put(ReFramedSlabsCubeBlock.class, new SlabsCube());
providers.put(ReFramedSmallCubeBlock.class, new SmallCube());
providers.put(ReFramedSmallCubesStepBlock.class, new SmallCubesStep());
providers.put(ReFramedStairBlock.class, new Stair());
providers.put(ReFramedStairsCubeBlock.class, new StairsCube());
providers.put(ReFramedStepBlock.class, new Step());
providers.put(ReFramedStepsSlabBlock.class, new StepsSlab());
providers.put(ReframedWallBlock.class, new Wall());
}
public GBlockstate(FabricDataOutput output) { public GBlockstate(FabricDataOutput output) {
super(output); super(output);
@ -23,7 +45,7 @@ public class GBlockstate extends FabricModelProvider {
.forEach(model_generator::excludeFromSimpleItemModelGeneration); .forEach(model_generator::excludeFromSimpleItemModelGeneration);
ReFramed.BLOCKS.stream() ReFramed.BLOCKS.stream()
.map(block -> { .map(block -> {
if (block instanceof BlockStateProvider multipart_block) return multipart_block.getMultipart(); if (providers.containsKey(block.getClass())) return providers.get(block.getClass()).getMultipart(block);
return VariantsBlockStateSupplier.create( return VariantsBlockStateSupplier.create(
block, block,
GBlockstate.variant( GBlockstate.variant(
@ -54,11 +76,57 @@ public class GBlockstate extends FabricModelProvider {
return When.create().set(property_1, value_1); return When.create().set(property_1, value_1);
} }
public static <T extends Comparable<T>, U extends Comparable<U>> When when(Property<T> property_1, T value_1, Property<U> property_2, U value_2) { public static <T extends Comparable<T>,
return When.allOf(when(property_1, value_1), when(property_2, value_2)); U extends Comparable<U>> When when(Property<T> property_1, T value_1,
Property<U> property_2, U value_2) {
return When.allOf(
when(property_1, value_1),
when(property_2, value_2)
);
} }
public static <T extends Comparable<T>, U extends Comparable<U>, V extends Comparable<V>> When when(Property<T> property_1, T value_1, Property<U> property_2, U value_2, Property<V> property_3, V value_3) { public static <T extends Comparable<T>,
return When.allOf(when(property_1, value_1), when(property_2, value_2), when(property_3, value_3)); U extends Comparable<U>,
V extends Comparable<V>> When when(Property<T> property_1, T value_1,
Property<U> property_2, U value_2,
Property<V> property_3, V value_3) {
return When.allOf(
when(property_1, value_1),
when(property_2, value_2),
when(property_3, value_3)
);
}
public static <T extends Comparable<T>,
U extends Comparable<U>,
V extends Comparable<V>,
W extends Comparable<W>> When when(Property<T> property_1, T value_1,
Property<U> property_2, U value_2,
Property<V> property_3, V value_3,
Property<W> property_4, W value_4) {
return When.allOf(
when(property_1, value_1),
when(property_2, value_2),
when(property_3, value_3),
when(property_4, value_4)
);
}
public static <T extends Comparable<T>,
U extends Comparable<U>,
V extends Comparable<V>,
W extends Comparable<W>,
X extends Comparable<X>> When when(Property<T> property_1, T value_1,
Property<U> property_2, U value_2,
Property<V> property_3, V value_3,
Property<W> property_4, W value_4,
Property<X> property_5, X value_5) {
return When.allOf(
when(property_1, value_1),
when(property_2, value_2),
when(property_3, value_3),
when(property_4, value_4),
when(property_5, value_5)
);
} }
} }

View File

@ -1,11 +1,45 @@
package fr.adrien1106.reframed.generator; package fr.adrien1106.reframed.generator;
import fr.adrien1106.reframed.ReFramed; import fr.adrien1106.reframed.ReFramed;
import fr.adrien1106.reframed.block.*;
import fr.adrien1106.reframed.generator.block.*;
import fr.adrien1106.reframed.generator.item.Blueprint;
import fr.adrien1106.reframed.generator.item.Hammer;
import fr.adrien1106.reframed.generator.item.Screwdriver;
import fr.adrien1106.reframed.item.ReFramedBlueprintItem;
import fr.adrien1106.reframed.item.ReFramedHammerItem;
import fr.adrien1106.reframed.item.ReFramedScrewdriverItem;
import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider; import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
import net.minecraft.data.server.recipe.RecipeExporter; import net.minecraft.data.server.recipe.RecipeExporter;
import net.minecraft.item.ItemConvertible;
import java.util.HashMap;
import java.util.Map;
public class GRecipe extends FabricRecipeProvider { public class GRecipe extends FabricRecipeProvider {
private static final Map<Class<? extends ItemConvertible>, RecipeSetter> providers = new HashMap<>();
static {
providers.put(ReFramedBlock.class, new Cube());
providers.put(ReFramedHalfStairBlock.class, new HalfStair());
providers.put(ReFramedHalfStairsSlabBlock.class, new HalfStairsSlab());
providers.put(ReFramedHalfStairsStairBlock.class, new HalfStairsStair());
providers.put(ReFramedLayerBlock.class, new Layer());
providers.put(ReFramedPillarBlock.class, new Pillar());
providers.put(ReFramedSlabBlock.class, new Slab());
providers.put(ReFramedSlabsCubeBlock.class, new SlabsCube());
providers.put(ReFramedSmallCubeBlock.class, new SmallCube());
providers.put(ReFramedSmallCubesStepBlock.class, new SmallCubesStep());
providers.put(ReFramedStairBlock.class, new Stair());
providers.put(ReFramedStairsCubeBlock.class, new StairsCube());
providers.put(ReFramedStepBlock.class, new Step());
providers.put(ReFramedStepsSlabBlock.class, new StepsSlab());
providers.put(ReframedWallBlock.class, new Wall());
providers.put(ReFramedBlueprintItem.class, new Blueprint());
providers.put(ReFramedHammerItem.class, new Hammer());
providers.put(ReFramedScrewdriverItem.class, new Screwdriver());
}
public GRecipe(FabricDataOutput output) { public GRecipe(FabricDataOutput output) {
super(output); super(output);
} }
@ -13,10 +47,10 @@ public class GRecipe extends FabricRecipeProvider {
@Override @Override
public void generate(RecipeExporter exporter) { public void generate(RecipeExporter exporter) {
ReFramed.BLOCKS.forEach(block -> { ReFramed.BLOCKS.forEach(block -> {
if (block instanceof RecipeSetter provider) provider.setRecipe(exporter); if (providers.containsKey(block.getClass())) providers.get(block.getClass()).setRecipe(exporter, block);
}); });
ReFramed.ITEMS.forEach(item -> { ReFramed.ITEMS.forEach(item -> {
if (item instanceof RecipeSetter provider) provider.setRecipe(exporter); if (providers.containsKey(item.getClass())) providers.get(item.getClass()).setRecipe(exporter, item);
}); });
} }
} }

View File

@ -1,8 +1,9 @@
package fr.adrien1106.reframed.generator; package fr.adrien1106.reframed.generator;
import net.minecraft.data.server.recipe.RecipeExporter; import net.minecraft.data.server.recipe.RecipeExporter;
import net.minecraft.item.ItemConvertible;
public interface RecipeSetter { public interface RecipeSetter {
void setRecipe(RecipeExporter exporter); void setRecipe(RecipeExporter exporter, ItemConvertible convertible);
} }

View File

@ -0,0 +1,11 @@
package fr.adrien1106.reframed.generator;
import net.minecraft.block.Block;
import net.minecraft.registry.tag.TagKey;
import java.util.List;
public interface TagGetter {
List<TagKey<Block>> getTags();
}

View File

@ -0,0 +1,26 @@
package fr.adrien1106.reframed.generator.block;
import fr.adrien1106.reframed.generator.RecipeSetter;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
import net.minecraft.data.server.recipe.RecipeExporter;
import net.minecraft.data.server.recipe.ShapedRecipeJsonBuilder;
import net.minecraft.item.ItemConvertible;
import net.minecraft.item.Items;
import net.minecraft.recipe.book.RecipeCategory;
public class Cube implements RecipeSetter {
@Override
public void setRecipe(RecipeExporter exporter, ItemConvertible convertible) {
ShapedRecipeJsonBuilder
.create(RecipeCategory.BUILDING_BLOCKS, convertible)
.pattern("III")
.pattern("I~I")
.pattern("III")
.input('I', Items.BAMBOO)
.input('~', Items.STRING)
.criterion(FabricRecipeProvider.hasItem(Items.BAMBOO), FabricRecipeProvider.conditionsFromItem(Items.BAMBOO))
.criterion(FabricRecipeProvider.hasItem(convertible), FabricRecipeProvider.conditionsFromItem(convertible))
.offerTo(exporter);
}
}

View File

@ -0,0 +1,106 @@
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.client.MultipartBlockStateSupplier;
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;
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 fr.adrien1106.reframed.util.blocks.Corner.*;
import static fr.adrien1106.reframed.util.blocks.Corner.NORTH_EAST_UP;
import static net.minecraft.data.client.VariantSettings.Rotation.*;
public class HalfStair 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, 4)
.pattern("I ")
.pattern("II")
.input('I', ReFramed.CUBE)
.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,
ReFramed.id("half_stair_down_special"),
ReFramed.id("half_stair_side_special")
);
}
public static BlockStateSupplier getMultipart(Block block, Identifier model_down, Identifier model_side) {
return MultipartBlockStateSupplier.create(block)
.with(GBlockstate.when(CORNER, NORTH_EAST_DOWN, CORNER_FACE, 1),
GBlockstate.variant(model_side, true, R0, R0))
.with(GBlockstate.when(CORNER, NORTH_EAST_DOWN, CORNER_FACE, 0),
GBlockstate.variant(model_side, true, R90, R270))
.with(GBlockstate.when(CORNER, NORTH_EAST_DOWN, CORNER_FACE, 2),
GBlockstate.variant(model_down, true, R0, R0))
.with(GBlockstate.when(CORNER, EAST_SOUTH_DOWN, CORNER_FACE, 1),
GBlockstate.variant(model_side, true, R0, R90))
.with(GBlockstate.when(CORNER, EAST_SOUTH_DOWN, CORNER_FACE, 0),
GBlockstate.variant(model_side, true, R90, R0))
.with(GBlockstate.when(CORNER, EAST_SOUTH_DOWN, CORNER_FACE, 2),
GBlockstate.variant(model_down, true, R0, R90))
.with(GBlockstate.when(CORNER, SOUTH_WEST_DOWN, CORNER_FACE, 1),
GBlockstate.variant(model_side, true, R0, R180))
.with(GBlockstate.when(CORNER, SOUTH_WEST_DOWN, CORNER_FACE, 0),
GBlockstate.variant(model_side, true, R90, R90))
.with(GBlockstate.when(CORNER, SOUTH_WEST_DOWN, CORNER_FACE, 2),
GBlockstate.variant(model_down, true, R0, R180))
.with(GBlockstate.when(CORNER, WEST_NORTH_DOWN, CORNER_FACE, 1),
GBlockstate.variant(model_side, true, R0, R270))
.with(GBlockstate.when(CORNER, WEST_NORTH_DOWN, CORNER_FACE, 0),
GBlockstate.variant(model_side, true, R90, R180))
.with(GBlockstate.when(CORNER, WEST_NORTH_DOWN, CORNER_FACE, 2),
GBlockstate.variant(model_down, true, R0, R270))
.with(GBlockstate.when(CORNER, EAST_SOUTH_UP, CORNER_FACE, 0),
GBlockstate.variant(model_side, true, R180, R0))
.with(GBlockstate.when(CORNER, EAST_SOUTH_UP, CORNER_FACE, 1),
GBlockstate.variant(model_side, true, R270, R90))
.with(GBlockstate.when(CORNER, EAST_SOUTH_UP, CORNER_FACE, 2),
GBlockstate.variant(model_down, true, R180, R0))
.with(GBlockstate.when(CORNER, SOUTH_WEST_UP, CORNER_FACE, 0),
GBlockstate.variant(model_side, true, R180, R90))
.with(GBlockstate.when(CORNER, SOUTH_WEST_UP, CORNER_FACE, 1),
GBlockstate.variant(model_side, true, R270, R180))
.with(GBlockstate.when(CORNER, SOUTH_WEST_UP, CORNER_FACE, 2),
GBlockstate.variant(model_down, true, R180, R90))
.with(GBlockstate.when(CORNER, WEST_NORTH_UP, CORNER_FACE, 0),
GBlockstate.variant(model_side, true, R180, R180))
.with(GBlockstate.when(CORNER, WEST_NORTH_UP, CORNER_FACE, 1),
GBlockstate.variant(model_side, true, R270, R270))
.with(GBlockstate.when(CORNER, WEST_NORTH_UP, CORNER_FACE, 2),
GBlockstate.variant(model_down, true, R180, R180))
.with(GBlockstate.when(CORNER, NORTH_EAST_UP, CORNER_FACE, 0),
GBlockstate.variant(model_side, true, R180, R270))
.with(GBlockstate.when(CORNER, NORTH_EAST_UP, CORNER_FACE, 1),
GBlockstate.variant(model_side, true, R270, R0))
.with(GBlockstate.when(CORNER, NORTH_EAST_UP, CORNER_FACE, 2),
GBlockstate.variant(model_down, true, R180, R270));
}
}

View File

@ -0,0 +1,37 @@
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;
public class HalfStairsSlab 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_STAIR)
.input(ReFramed.SMALL_CUBE)
.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 HalfStair.getMultipart(
block,
ReFramed.id("half_stairs_slab_down_special"),
ReFramed.id("half_stairs_slab_side_special")
);
}
}

View File

@ -0,0 +1,70 @@
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.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.EDGE;
import static fr.adrien1106.reframed.util.blocks.Edge.*;
import static fr.adrien1106.reframed.util.blocks.Edge.WEST_DOWN;
import static net.minecraft.data.client.VariantSettings.Rotation.*;
public class HalfStairsStair 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_STAIR, 2)
.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 model_id = ReFramed.id("half_stairs_stair_down_special");
Identifier side_model_id = ReFramed.id("half_stairs_stair_side_special");
Identifier reverse_model_id = ReFramed.id("half_stairs_stair_reverse_special");
return MultipartBlockStateSupplier.create(block)
/* X AXIS */
.with(GBlockstate.when(EDGE, NORTH_DOWN),
GBlockstate.variant(side_model_id, true, R90, R180))
.with(GBlockstate.when(EDGE, DOWN_SOUTH),
GBlockstate.variant(side_model_id, true, R0, R180))
.with(GBlockstate.when(EDGE, SOUTH_UP),
GBlockstate.variant(side_model_id, true, R270, R180))
.with(GBlockstate.when(EDGE, UP_NORTH),
GBlockstate.variant(side_model_id, true, R180, R180))
/* Y AXIS */
.with(GBlockstate.when(EDGE, NORTH_EAST),
GBlockstate.variant(model_id, true, R0, R0))
.with(GBlockstate.when(EDGE, EAST_SOUTH),
GBlockstate.variant(model_id, true, R0, R90))
.with(GBlockstate.when(EDGE, SOUTH_WEST),
GBlockstate.variant(model_id, true, R0, R180))
.with(GBlockstate.when(EDGE, WEST_NORTH),
GBlockstate.variant(model_id, true, R0, R270))
/* Z AXIS */
.with(GBlockstate.when(EDGE, DOWN_EAST),
GBlockstate.variant(reverse_model_id, true, R0, R90))
.with(GBlockstate.when(EDGE, EAST_UP),
GBlockstate.variant(side_model_id, true, R180, R270))
.with(GBlockstate.when(EDGE, UP_WEST),
GBlockstate.variant(reverse_model_id, true, R180, R90))
.with(GBlockstate.when(EDGE, WEST_DOWN),
GBlockstate.variant(side_model_id, true, R0, R270));
}
}

View File

@ -0,0 +1,58 @@
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.MultipartBlockStateSupplier;
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;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.Direction;
import static net.minecraft.data.client.VariantSettings.Rotation.*;
import static net.minecraft.state.property.Properties.FACING;
import static net.minecraft.state.property.Properties.LAYERS;
public class Layer implements RecipeSetter, BlockStateProvider {
@Override
public void setRecipe(RecipeExporter exporter, ItemConvertible convertible) {
RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, convertible, ReFramed.CUBE, 8);
ShapedRecipeJsonBuilder
.create(RecipeCategory.BUILDING_BLOCKS, convertible, 16)
.pattern("II")
.input('I', ReFramed.CUBE)
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
.criterion(FabricRecipeProvider.hasItem(convertible), FabricRecipeProvider.conditionsFromItem(convertible))
.offerTo(exporter);
}
@Override
public MultipartBlockStateSupplier getMultipart(Block block) {
String model_pattern = "layer_x_special";
MultipartBlockStateSupplier supplier = MultipartBlockStateSupplier.create(block);
for (int i = 1; i <= 8; i++) {
Identifier model = ReFramed.id(model_pattern.replace("x", i + ""));
supplier
.with(GBlockstate.when(FACING, Direction.DOWN, LAYERS, i),
GBlockstate.variant(model, true, R0, R0))
.with(GBlockstate.when(FACING, Direction.SOUTH, LAYERS, i),
GBlockstate.variant(model, true, R90, R0))
.with(GBlockstate.when(FACING, Direction.UP, LAYERS, i),
GBlockstate.variant(model, true, R180, R0))
.with(GBlockstate.when(FACING, Direction.NORTH, LAYERS, i),
GBlockstate.variant(model, true, R270, R0))
.with(GBlockstate.when(FACING, Direction.WEST, LAYERS, i),
GBlockstate.variant(model, true, R90, R90))
.with(GBlockstate.when(FACING, Direction.EAST, LAYERS, i),
GBlockstate.variant(model, true, R90, R270));
}
return supplier;
}
}

View File

@ -0,0 +1,49 @@
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.client.MultipartBlockStateSupplier;
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;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.Direction;
import static net.minecraft.data.client.VariantSettings.Rotation.R0;
import static net.minecraft.data.client.VariantSettings.Rotation.R90;
import static net.minecraft.state.property.Properties.AXIS;
public class Pillar implements RecipeSetter, BlockStateProvider {
@Override
public void setRecipe(RecipeExporter exporter, ItemConvertible convertible) {
RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, convertible, ReFramed.CUBE, 4);
ShapedRecipeJsonBuilder
.create(RecipeCategory.BUILDING_BLOCKS, convertible, 8)
.pattern("I")
.pattern("I")
.input('I', ReFramed.CUBE)
.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 model_id = ReFramed.id("pillar_special");
return MultipartBlockStateSupplier.create(block)
.with(GBlockstate.when(AXIS, Direction.Axis.X),
GBlockstate.variant(model_id, true, R90, R90))
.with(GBlockstate.when(AXIS, Direction.Axis.Y),
GBlockstate.variant(model_id, true, R0, R0))
.with(GBlockstate.when(AXIS, Direction.Axis.Z),
GBlockstate.variant(model_id, true, R90, R0));
}
}

View File

@ -0,0 +1,52 @@
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.MultipartBlockStateSupplier;
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;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.Direction;
import static net.minecraft.data.client.VariantSettings.Rotation.*;
import static net.minecraft.state.property.Properties.FACING;
public class Slab 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, 6)
.pattern("III")
.input('I', ReFramed.CUBE)
.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_id = ReFramed.id("slab_special");
return MultipartBlockStateSupplier.create(block)
.with(GBlockstate.when(FACING, Direction.DOWN),
GBlockstate.variant(model_id, true, R0, R0))
.with(GBlockstate.when(FACING, Direction.SOUTH),
GBlockstate.variant(model_id, true, R90, R0))
.with(GBlockstate.when(FACING, Direction.UP),
GBlockstate.variant(model_id, true, R180, R0))
.with(GBlockstate.when(FACING, Direction.NORTH),
GBlockstate.variant(model_id, true, R270, R0))
.with(GBlockstate.when(FACING, Direction.WEST),
GBlockstate.variant(model_id, true, R90, R90))
.with(GBlockstate.when(FACING, Direction.EAST),
GBlockstate.variant(model_id, true, R90, R270));
}
}

View File

@ -0,0 +1,46 @@
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.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 net.minecraft.util.math.Direction;
import static net.minecraft.data.client.VariantSettings.Rotation.*;
import static net.minecraft.data.client.VariantSettings.Rotation.R90;
import static net.minecraft.state.property.Properties.AXIS;
public class SlabsCube 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.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) {
Identifier model_id = ReFramed.id("double_slab_special");
return MultipartBlockStateSupplier.create(block)
.with(GBlockstate.when(AXIS, Direction.Axis.Y),
GBlockstate.variant(model_id, true, R0, R0))
.with(GBlockstate.when(AXIS, Direction.Axis.Z),
GBlockstate.variant(model_id, true, R270, R0))
.with(GBlockstate.when(AXIS, Direction.Axis.X),
GBlockstate.variant(model_id, true, R90, R90));
}
}

View File

@ -0,0 +1,57 @@
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.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.CORNER;
import static fr.adrien1106.reframed.util.blocks.Corner.*;
import static fr.adrien1106.reframed.util.blocks.Corner.NORTH_EAST_UP;
import static net.minecraft.data.client.VariantSettings.Rotation.*;
public class SmallCube implements RecipeSetter, BlockStateProvider {
@Override
public void setRecipe(RecipeExporter exporter, ItemConvertible convertible) {
RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, convertible, ReFramed.CUBE, 8);
ShapelessRecipeJsonBuilder
.create(RecipeCategory.BUILDING_BLOCKS, convertible, 8)
.input(ReFramed.CUBE)
.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 small_cube_id = ReFramed.id("small_cube_special");
return MultipartBlockStateSupplier.create(block)
.with(GBlockstate.when(CORNER, NORTH_EAST_DOWN),
GBlockstate.variant(small_cube_id, true, R0, R0))
.with(GBlockstate.when(CORNER, EAST_SOUTH_DOWN),
GBlockstate.variant(small_cube_id, true, R0, R90))
.with(GBlockstate.when(CORNER, SOUTH_WEST_DOWN),
GBlockstate.variant(small_cube_id, true, R0, R180))
.with(GBlockstate.when(CORNER, WEST_NORTH_DOWN),
GBlockstate.variant(small_cube_id, true, R0, R270))
.with(GBlockstate.when(CORNER, EAST_SOUTH_UP),
GBlockstate.variant(small_cube_id, true, R180, R0))
.with(GBlockstate.when(CORNER, SOUTH_WEST_UP),
GBlockstate.variant(small_cube_id, true, R180, R90))
.with(GBlockstate.when(CORNER, WEST_NORTH_UP),
GBlockstate.variant(small_cube_id, true, R180, R180))
.with(GBlockstate.when(CORNER, NORTH_EAST_UP),
GBlockstate.variant(small_cube_id, true, R180, R270));
}
}

View File

@ -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.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.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 {
@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.SMALL_CUBE, 2)
.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 model_id = ReFramed.id("small_cubes_step_special");
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));
}
}

View File

@ -0,0 +1,267 @@
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.MultipartBlockStateSupplier;
import net.minecraft.data.client.When;
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;
import net.minecraft.util.Identifier;
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE;
import static fr.adrien1106.reframed.util.blocks.BlockProperties.STAIR_SHAPE;
import static fr.adrien1106.reframed.util.blocks.Edge.*;
import static fr.adrien1106.reframed.util.blocks.StairShape.*;
import static net.minecraft.data.client.VariantSettings.Rotation.*;
public class Stair implements RecipeSetter, BlockStateProvider {
@Override
public void setRecipe(RecipeExporter exporter, ItemConvertible convertible) {
RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, convertible, ReFramed.CUBE);
ShapedRecipeJsonBuilder
.create(RecipeCategory.BUILDING_BLOCKS, convertible, 4)
.pattern("I ")
.pattern("II ")
.pattern("III")
.input('I', ReFramed.CUBE)
.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 getMultipart(block, false);
}
public static MultipartBlockStateSupplier getMultipart(Block block, boolean is_double) {
String infix = is_double ? "s_cube" : "";
Identifier straight_id = ReFramed.id("stair" + infix + "_special");
Identifier double_outer_id = ReFramed.id("outers_stair" + infix + "_special");
Identifier inner_id = ReFramed.id("inner_stair" + infix + "_special");
Identifier outer_id = ReFramed.id("outer_stair" + infix + "_special");
Identifier outer_side_id = ReFramed.id("outer_side_stair" + infix + "_special");
return MultipartBlockStateSupplier.create(block)
/* STRAIGHT X AXIS */
.with(GBlockstate.when(EDGE, DOWN_EAST, STAIR_SHAPE, STRAIGHT),
GBlockstate.variant(straight_id, true, R0, R0))
.with(GBlockstate.when(EDGE, EAST_UP, STAIR_SHAPE, STRAIGHT),
GBlockstate.variant(straight_id, true, R180, R0))
.with(GBlockstate.when(EDGE, UP_WEST, STAIR_SHAPE, STRAIGHT),
GBlockstate.variant(straight_id, true, R180, R180))
.with(GBlockstate.when(EDGE, WEST_DOWN, STAIR_SHAPE, STRAIGHT),
GBlockstate.variant(straight_id, true, R0, R180))
/* STRAIGHT Y AXIS */
.with(GBlockstate.when(EDGE, EAST_SOUTH, STAIR_SHAPE, STRAIGHT),
GBlockstate.variant(straight_id, true, R90, R0))
.with(GBlockstate.when(EDGE, SOUTH_WEST, STAIR_SHAPE, STRAIGHT),
GBlockstate.variant(straight_id, true, R90, R90))
.with(GBlockstate.when(EDGE, WEST_NORTH, STAIR_SHAPE, STRAIGHT),
GBlockstate.variant(straight_id, true, R90, R180))
.with(GBlockstate.when(EDGE, NORTH_EAST, STAIR_SHAPE, STRAIGHT),
GBlockstate.variant(straight_id, true, R90, R270))
/* STRAIGHT Z AXIS */
.with(GBlockstate.when(EDGE, DOWN_SOUTH, STAIR_SHAPE, STRAIGHT),
GBlockstate.variant(straight_id, true, R0, R90))
.with(GBlockstate.when(EDGE, NORTH_DOWN, STAIR_SHAPE, STRAIGHT),
GBlockstate.variant(straight_id, true, R0, R270))
.with(GBlockstate.when(EDGE, UP_NORTH, STAIR_SHAPE, STRAIGHT),
GBlockstate.variant(straight_id, true, R180, R270))
.with(GBlockstate.when(EDGE, SOUTH_UP, STAIR_SHAPE, STRAIGHT),
GBlockstate.variant(straight_id, true, R180, R90))
/* INNER BOTTOM */
.with(When.anyOf(
GBlockstate.when(EDGE, NORTH_DOWN, STAIR_SHAPE, INNER_RIGHT),
GBlockstate.when(EDGE, WEST_NORTH, STAIR_SHAPE, INNER_RIGHT),
GBlockstate.when(EDGE, WEST_DOWN, STAIR_SHAPE, INNER_RIGHT)),
GBlockstate.variant(inner_id, true, R0, R180))
.with(When.anyOf(
GBlockstate.when(EDGE, NORTH_DOWN, STAIR_SHAPE, INNER_LEFT),
GBlockstate.when(EDGE, NORTH_EAST, STAIR_SHAPE, INNER_RIGHT),
GBlockstate.when(EDGE, DOWN_EAST, STAIR_SHAPE, INNER_RIGHT)),
GBlockstate.variant(inner_id, true, R0, R270))
.with(When.anyOf(
GBlockstate.when(EDGE, DOWN_SOUTH, STAIR_SHAPE, INNER_LEFT),
GBlockstate.when(EDGE, EAST_SOUTH, STAIR_SHAPE, INNER_RIGHT),
GBlockstate.when(EDGE, DOWN_EAST, STAIR_SHAPE, INNER_LEFT)),
GBlockstate.variant(inner_id, true, R0, R0))
.with(When.anyOf(
GBlockstate.when(EDGE, DOWN_SOUTH, STAIR_SHAPE, INNER_RIGHT),
GBlockstate.when(EDGE, SOUTH_WEST, STAIR_SHAPE, INNER_RIGHT),
GBlockstate.when(EDGE, WEST_DOWN, STAIR_SHAPE, INNER_LEFT)),
GBlockstate.variant(inner_id, true, R0, R90))
/* INNER TOP */
.with(When.anyOf(
GBlockstate.when(EDGE, EAST_UP, STAIR_SHAPE, INNER_RIGHT),
GBlockstate.when(EDGE, NORTH_EAST, STAIR_SHAPE, INNER_LEFT),
GBlockstate.when(EDGE, UP_NORTH, STAIR_SHAPE, INNER_LEFT)),
GBlockstate.variant(inner_id, true, R180, R0))
.with(When.anyOf(
GBlockstate.when(EDGE, EAST_UP, STAIR_SHAPE, INNER_LEFT),
GBlockstate.when(EDGE, EAST_SOUTH, STAIR_SHAPE, INNER_LEFT),
GBlockstate.when(EDGE, SOUTH_UP, STAIR_SHAPE, INNER_LEFT)),
GBlockstate.variant(inner_id, true, R180, R90))
.with(When.anyOf(
GBlockstate.when(EDGE, SOUTH_UP, STAIR_SHAPE, INNER_RIGHT),
GBlockstate.when(EDGE, SOUTH_WEST, STAIR_SHAPE, INNER_LEFT),
GBlockstate.when(EDGE, UP_WEST, STAIR_SHAPE, INNER_LEFT)),
GBlockstate.variant(inner_id, true, R180, R180))
.with(When.anyOf(
GBlockstate.when(EDGE, UP_NORTH, STAIR_SHAPE, INNER_RIGHT),
GBlockstate.when(EDGE, WEST_NORTH, STAIR_SHAPE, INNER_LEFT),
GBlockstate.when(EDGE, UP_WEST, STAIR_SHAPE, INNER_RIGHT)),
GBlockstate.variant(inner_id, true, R180, R270))
/* OUTER BOTTOM */
.with(When.anyOf(
GBlockstate.when(EDGE, DOWN_SOUTH, STAIR_SHAPE, SECOND_OUTER_LEFT),
GBlockstate.when(EDGE, DOWN_EAST, STAIR_SHAPE, SECOND_OUTER_LEFT)),
GBlockstate.variant(outer_id, true, R0, R0))
.with(When.anyOf(
GBlockstate.when(EDGE, DOWN_SOUTH, STAIR_SHAPE, SECOND_OUTER_RIGHT),
GBlockstate.when(EDGE, WEST_DOWN, STAIR_SHAPE, FIRST_OUTER_LEFT)),
GBlockstate.variant(outer_id, true, R0, R90))
.with(When.anyOf(
GBlockstate.when(EDGE, NORTH_DOWN, STAIR_SHAPE, FIRST_OUTER_RIGHT),
GBlockstate.when(EDGE, WEST_DOWN, STAIR_SHAPE, FIRST_OUTER_RIGHT)),
GBlockstate.variant(outer_id, true, R0, R180))
.with(When.anyOf(
GBlockstate.when(EDGE, NORTH_DOWN, STAIR_SHAPE, FIRST_OUTER_LEFT),
GBlockstate.when(EDGE, DOWN_EAST, STAIR_SHAPE, SECOND_OUTER_RIGHT)),
GBlockstate.variant(outer_id, true, R0, R270))
/* OUTER TOP */
.with(When.anyOf(
GBlockstate.when(EDGE, UP_NORTH, STAIR_SHAPE, SECOND_OUTER_LEFT),
GBlockstate.when(EDGE, EAST_UP, STAIR_SHAPE, FIRST_OUTER_RIGHT)),
GBlockstate.variant(outer_id, true, R180, R0))
.with(When.anyOf(
GBlockstate.when(EDGE, SOUTH_UP, STAIR_SHAPE, FIRST_OUTER_LEFT),
GBlockstate.when(EDGE, EAST_UP, STAIR_SHAPE, FIRST_OUTER_LEFT)),
GBlockstate.variant(outer_id, true, R180, R90))
.with(When.anyOf(
GBlockstate.when(EDGE, SOUTH_UP, STAIR_SHAPE, FIRST_OUTER_RIGHT),
GBlockstate.when(EDGE, UP_WEST, STAIR_SHAPE, SECOND_OUTER_LEFT)),
GBlockstate.variant(outer_id, true, R180, R180))
.with(When.anyOf(
GBlockstate.when(EDGE, UP_NORTH, STAIR_SHAPE, SECOND_OUTER_RIGHT),
GBlockstate.when(EDGE, UP_WEST, STAIR_SHAPE, SECOND_OUTER_RIGHT)),
GBlockstate.variant(outer_id, true, R180, R270))
/* OUTER EAST */
.with(When.anyOf(
GBlockstate.when(EDGE, EAST_SOUTH, STAIR_SHAPE, SECOND_OUTER_RIGHT),
GBlockstate.when(EDGE, DOWN_EAST, STAIR_SHAPE, FIRST_OUTER_LEFT)),
GBlockstate.variant(outer_side_id, true, R0, R0))
.with(When.anyOf(
GBlockstate.when(EDGE, EAST_SOUTH, STAIR_SHAPE, SECOND_OUTER_LEFT),
GBlockstate.when(EDGE, EAST_UP, STAIR_SHAPE, SECOND_OUTER_LEFT)),
GBlockstate.variant(outer_side_id, true, R90, R0))
.with(When.anyOf(
GBlockstate.when(EDGE, NORTH_EAST, STAIR_SHAPE, FIRST_OUTER_LEFT),
GBlockstate.when(EDGE, EAST_UP, STAIR_SHAPE, SECOND_OUTER_RIGHT)),
GBlockstate.variant(outer_side_id, true, R180, R0))
.with(When.anyOf(
GBlockstate.when(EDGE, NORTH_EAST, STAIR_SHAPE, FIRST_OUTER_RIGHT),
GBlockstate.when(EDGE, DOWN_EAST, STAIR_SHAPE, FIRST_OUTER_RIGHT)),
GBlockstate.variant(outer_side_id, true, R270, R0))
/* OUTER SOUTH */
.with(When.anyOf(
GBlockstate.when(EDGE, SOUTH_WEST, STAIR_SHAPE, SECOND_OUTER_RIGHT),
GBlockstate.when(EDGE, DOWN_SOUTH, STAIR_SHAPE, FIRST_OUTER_RIGHT)),
GBlockstate.variant(outer_side_id, true, R0, R90))
.with(When.anyOf(
GBlockstate.when(EDGE, SOUTH_WEST, STAIR_SHAPE, SECOND_OUTER_LEFT),
GBlockstate.when(EDGE, SOUTH_UP, STAIR_SHAPE, SECOND_OUTER_RIGHT)),
GBlockstate.variant(outer_side_id, true, R90, R90))
.with(When.anyOf(
GBlockstate.when(EDGE, EAST_SOUTH, STAIR_SHAPE, FIRST_OUTER_LEFT),
GBlockstate.when(EDGE, SOUTH_UP, STAIR_SHAPE, SECOND_OUTER_LEFT)),
GBlockstate.variant(outer_side_id, true, R180, R90))
.with(When.anyOf(
GBlockstate.when(EDGE, EAST_SOUTH, STAIR_SHAPE, FIRST_OUTER_RIGHT),
GBlockstate.when(EDGE, DOWN_SOUTH, STAIR_SHAPE, FIRST_OUTER_LEFT)),
GBlockstate.variant(outer_side_id, true, R270, R90))
/* OUTER WEST */
.with(When.anyOf(
GBlockstate.when(EDGE, WEST_NORTH, STAIR_SHAPE, SECOND_OUTER_RIGHT),
GBlockstate.when(EDGE, WEST_DOWN, STAIR_SHAPE, SECOND_OUTER_RIGHT)),
GBlockstate.variant(outer_side_id, true, R0, R180))
.with(When.anyOf(
GBlockstate.when(EDGE, WEST_NORTH, STAIR_SHAPE, SECOND_OUTER_LEFT),
GBlockstate.when(EDGE, UP_WEST, STAIR_SHAPE, FIRST_OUTER_RIGHT)),
GBlockstate.variant(outer_side_id, true, R90, R180))
.with(When.anyOf(
GBlockstate.when(EDGE, SOUTH_WEST, STAIR_SHAPE, FIRST_OUTER_LEFT),
GBlockstate.when(EDGE, UP_WEST, STAIR_SHAPE, FIRST_OUTER_LEFT)),
GBlockstate.variant(outer_side_id, true, R180, R180))
.with(When.anyOf(
GBlockstate.when(EDGE, SOUTH_WEST, STAIR_SHAPE, FIRST_OUTER_RIGHT),
GBlockstate.when(EDGE, WEST_DOWN, STAIR_SHAPE, SECOND_OUTER_LEFT)),
GBlockstate.variant(outer_side_id, true, R270, R180))
/* OUTER NORTH */
.with(When.anyOf(
GBlockstate.when(EDGE, NORTH_EAST, STAIR_SHAPE, SECOND_OUTER_RIGHT),
GBlockstate.when(EDGE, NORTH_DOWN, STAIR_SHAPE, SECOND_OUTER_LEFT)),
GBlockstate.variant(outer_side_id, true, R0, R270))
.with(When.anyOf(
GBlockstate.when(EDGE, NORTH_EAST, STAIR_SHAPE, SECOND_OUTER_LEFT),
GBlockstate.when(EDGE, UP_NORTH, STAIR_SHAPE, FIRST_OUTER_LEFT)),
GBlockstate.variant(outer_side_id, true, R90, R270))
.with(When.anyOf(
GBlockstate.when(EDGE, WEST_NORTH, STAIR_SHAPE, FIRST_OUTER_LEFT),
GBlockstate.when(EDGE, UP_NORTH, STAIR_SHAPE, FIRST_OUTER_RIGHT)),
GBlockstate.variant(outer_side_id, true, R180, R270))
.with(When.anyOf(
GBlockstate.when(EDGE, WEST_NORTH, STAIR_SHAPE, FIRST_OUTER_RIGHT),
GBlockstate.when(EDGE, NORTH_DOWN, STAIR_SHAPE, SECOND_OUTER_RIGHT)),
GBlockstate.variant(outer_side_id, true, R270, R270))
/* OUTER BOTTOM */
.with(When.anyOf(
GBlockstate.when(EDGE, DOWN_SOUTH, STAIR_SHAPE, OUTER_LEFT),
GBlockstate.when(EDGE, DOWN_EAST, STAIR_SHAPE, OUTER_LEFT),
GBlockstate.when(EDGE, EAST_SOUTH, STAIR_SHAPE, OUTER_RIGHT)),
GBlockstate.variant(double_outer_id, true, R0, R0))
.with(When.anyOf(
GBlockstate.when(EDGE, DOWN_SOUTH, STAIR_SHAPE, OUTER_RIGHT),
GBlockstate.when(EDGE, WEST_DOWN, STAIR_SHAPE, OUTER_LEFT),
GBlockstate.when(EDGE, SOUTH_WEST, STAIR_SHAPE, OUTER_RIGHT)),
GBlockstate.variant(double_outer_id, true, R0, R90))
.with(When.anyOf(
GBlockstate.when(EDGE, NORTH_DOWN, STAIR_SHAPE, OUTER_RIGHT),
GBlockstate.when(EDGE, WEST_DOWN, STAIR_SHAPE, OUTER_RIGHT),
GBlockstate.when(EDGE, WEST_NORTH, STAIR_SHAPE, OUTER_RIGHT)),
GBlockstate.variant(double_outer_id, true, R0, R180))
.with(When.anyOf(
GBlockstate.when(EDGE, NORTH_DOWN, STAIR_SHAPE, OUTER_LEFT),
GBlockstate.when(EDGE, DOWN_EAST, STAIR_SHAPE, OUTER_RIGHT),
GBlockstate.when(EDGE, NORTH_EAST, STAIR_SHAPE, OUTER_RIGHT)),
GBlockstate.variant(double_outer_id, true, R0, R270))
/* OUTER TOP */
.with(When.anyOf(
GBlockstate.when(EDGE, UP_NORTH, STAIR_SHAPE, OUTER_LEFT),
GBlockstate.when(EDGE, EAST_UP, STAIR_SHAPE, OUTER_RIGHT),
GBlockstate.when(EDGE, NORTH_EAST, STAIR_SHAPE, OUTER_LEFT)),
GBlockstate.variant(double_outer_id, true, R180, R0))
.with(When.anyOf(
GBlockstate.when(EDGE, SOUTH_UP, STAIR_SHAPE, OUTER_LEFT),
GBlockstate.when(EDGE, EAST_UP, STAIR_SHAPE, OUTER_LEFT),
GBlockstate.when(EDGE, EAST_SOUTH, STAIR_SHAPE, OUTER_LEFT)),
GBlockstate.variant(double_outer_id, true, R180, R90))
.with(When.anyOf(
GBlockstate.when(EDGE, SOUTH_UP, STAIR_SHAPE, OUTER_RIGHT),
GBlockstate.when(EDGE, UP_WEST, STAIR_SHAPE, OUTER_LEFT),
GBlockstate.when(EDGE, SOUTH_WEST, STAIR_SHAPE, OUTER_LEFT)),
GBlockstate.variant(double_outer_id, true, R180, R180))
.with(When.anyOf(
GBlockstate.when(EDGE, UP_NORTH, STAIR_SHAPE, OUTER_RIGHT),
GBlockstate.when(EDGE, UP_WEST, STAIR_SHAPE, OUTER_RIGHT),
GBlockstate.when(EDGE, WEST_NORTH, STAIR_SHAPE, OUTER_LEFT)),
GBlockstate.variant(double_outer_id, true, R180, R270));
}
}

View File

@ -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 StairsCube 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.STAIR)
.input(ReFramed.STEP)
.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 Stair.getMultipart(block, true);
}
}

View File

@ -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.client.MultipartBlockStateSupplier;
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;
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 Step implements RecipeSetter, BlockStateProvider {
@Override
public void setRecipe(RecipeExporter exporter, ItemConvertible convertible) {
RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, convertible, ReFramed.CUBE, 4);
ShapedRecipeJsonBuilder
.create(RecipeCategory.BUILDING_BLOCKS, convertible, 8)
.pattern("II")
.input('I', ReFramed.CUBE)
.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 model_id = ReFramed.id("step_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(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(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(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(model_id, true, R180, R270))
.with(GBlockstate.when(EDGE, SOUTH_UP),
GBlockstate.variant(model_id, true, R180, R90));
}
}

View File

@ -0,0 +1,66 @@
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.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 net.minecraft.util.math.Direction;
import static net.minecraft.data.client.VariantSettings.Rotation.*;
import static net.minecraft.data.client.VariantSettings.Rotation.R270;
import static net.minecraft.state.property.Properties.AXIS;
import static net.minecraft.state.property.Properties.FACING;
public class StepsSlab 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.STEP, 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) {
Identifier step_id = ReFramed.id("steps_slab_special");
Identifier step_side_id = ReFramed.id("steps_slab_side_special");
return MultipartBlockStateSupplier.create(block)
.with(GBlockstate.when(FACING, Direction.DOWN, AXIS, Direction.Axis.X),
GBlockstate.variant(step_id, true, R0, R180))
.with(GBlockstate.when(FACING, Direction.DOWN, AXIS, Direction.Axis.Z),
GBlockstate.variant(step_id, true, R0, R270))
.with(GBlockstate.when(FACING, Direction.UP, AXIS, Direction.Axis.X),
GBlockstate.variant(step_id, true, R180, R180))
.with(GBlockstate.when(FACING, Direction.UP, AXIS, Direction.Axis.Z),
GBlockstate.variant(step_id, true, R180, R270))
.with(GBlockstate.when(FACING, Direction.EAST, AXIS, Direction.Axis.Z),
GBlockstate.variant(step_side_id, true, R0, R0))
.with(GBlockstate.when(FACING, Direction.EAST, AXIS, Direction.Axis.Y),
GBlockstate.variant(step_side_id, true, R90, R0))
.with(GBlockstate.when(FACING, Direction.SOUTH, AXIS, Direction.Axis.X),
GBlockstate.variant(step_side_id, true, R180, R90))
.with(GBlockstate.when(FACING, Direction.SOUTH, AXIS, Direction.Axis.Y),
GBlockstate.variant(step_side_id, true, R90, R90))
.with(GBlockstate.when(FACING, Direction.WEST, AXIS, Direction.Axis.Z),
GBlockstate.variant(step_side_id, true, R180, R180))
.with(GBlockstate.when(FACING, Direction.WEST, AXIS, Direction.Axis.Y),
GBlockstate.variant(step_side_id, true, R90, R180))
.with(GBlockstate.when(FACING, Direction.NORTH, AXIS, Direction.Axis.X),
GBlockstate.variant(step_side_id, true, R0, R270))
.with(GBlockstate.when(FACING, Direction.NORTH, AXIS, Direction.Axis.Y),
GBlockstate.variant(step_side_id, true, R90, R270));
}
}

View File

@ -0,0 +1,788 @@
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.generator.TagGetter;
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.ShapedRecipeJsonBuilder;
import net.minecraft.item.ItemConvertible;
import net.minecraft.recipe.book.RecipeCategory;
import net.minecraft.registry.tag.BlockTags;
import net.minecraft.registry.tag.TagKey;
import net.minecraft.util.Identifier;
import java.util.List;
import static net.minecraft.block.enums.WallShape.*;
import static net.minecraft.data.client.VariantSettings.Rotation.*;
import static net.minecraft.state.property.Properties.*;
public class Wall implements RecipeSetter, TagGetter, BlockStateProvider {
@Override
public void setRecipe(RecipeExporter exporter, ItemConvertible convertible) {
RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, convertible, ReFramed.CUBE, 1);
ShapedRecipeJsonBuilder
.create(RecipeCategory.BUILDING_BLOCKS, convertible, 4)
.pattern("III")
.pattern("III")
.input('I', ReFramed.CUBE)
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
.criterion(FabricRecipeProvider.hasItem(convertible), FabricRecipeProvider.conditionsFromItem(convertible))
.offerTo(exporter);
}
@Override
public List<TagKey<Block>> getTags() {
return List.of(BlockTags.WALLS);
}
@Override
public BlockStateSupplier getMultipart(Block block) {
Identifier
side_low = ReFramed.id("wall_side_low_special"),
side_tall = ReFramed.id("wall_side_tall_special"),
pillar_low = ReFramed.id("wall_pillar_low_special"),
pillar_tall = ReFramed.id("wall_pillar_tall_special"),
pillar_none = ReFramed.id("wall_pillar_none_special"),
low_e = ReFramed.id("wall_low_e_special"),
tall_e = ReFramed.id("wall_tall_e_special"),
low_i = ReFramed.id("wall_low_i_special"),
tall_i = ReFramed.id("wall_tall_i_special"),
low_tall_i = ReFramed.id("wall_low_tall_i_special"),
low_c = ReFramed.id("wall_low_c_special"),
tall_c = ReFramed.id("wall_tall_c_special"),
low_tall_c = ReFramed.id("wall_low_tall_c_special"),
tall_low_c = ReFramed.id("wall_tall_low_c_special"),
low_t = ReFramed.id("wall_low_t_special"),
tall_t = ReFramed.id("wall_tall_t_special"),
tall_low_c_t = ReFramed.id("wall_tall_low_c_t_special"),
tall_i_low_t = ReFramed.id("wall_tall_i_low_t_special"),
low_i_tall_t = ReFramed.id("wall_low_i_tall_t_special"),
low_tall_c_t = ReFramed.id("wall_low_tall_c_t_special"),
low_c_tall_t = ReFramed.id("wall_low_c_tall_t_special"),
tall_c_low_t = ReFramed.id("wall_tall_c_low_t_special"),
tall_i_low_i_x = ReFramed.id("wall_tall_i_low_i_x_special"),
tall_low_t_x = ReFramed.id("wall_tall_low_t_x_special"),
tall_c_low_c_x = ReFramed.id("wall_tall_c_low_c_x_special"),
tall_t_low_x = ReFramed.id("wall_tall_t_low_x_special");
return MultipartBlockStateSupplier.create(block)
// PILLAR CORE
.with(GBlockstate.when(UP, true),
GBlockstate.variant(ReFramed.id("wall_core_special"), true, R0, R0))
// LOW
.with(GBlockstate.when(NORTH_WALL_SHAPE, LOW),
GBlockstate.variant(side_low, true, R0, R0))
.with(GBlockstate.when(EAST_WALL_SHAPE, LOW),
GBlockstate.variant(side_low, true, R0, R90))
.with(GBlockstate.when(SOUTH_WALL_SHAPE, LOW),
GBlockstate.variant(side_low, true, R0, R180))
.with(GBlockstate.when(WEST_WALL_SHAPE, LOW),
GBlockstate.variant(side_low, true, R0, R270))
// TALL
.with(GBlockstate.when(NORTH_WALL_SHAPE, TALL),
GBlockstate.variant(side_tall, true, R0, R0))
.with(GBlockstate.when(EAST_WALL_SHAPE, TALL),
GBlockstate.variant(side_tall, true, R0, R90))
.with(GBlockstate.when(SOUTH_WALL_SHAPE, TALL),
GBlockstate.variant(side_tall, true, R0, R180))
.with(GBlockstate.when(WEST_WALL_SHAPE, TALL),
GBlockstate.variant(side_tall, true, R0, R270))
// PILLAR LOW
.with(GBlockstate.when(NORTH_WALL_SHAPE, LOW, UP, true),
GBlockstate.variant(pillar_low, true, R0, R0))
.with(GBlockstate.when(EAST_WALL_SHAPE, LOW, UP, true),
GBlockstate.variant(pillar_low, true, R0, R90))
.with(GBlockstate.when(SOUTH_WALL_SHAPE, LOW, UP, true),
GBlockstate.variant(pillar_low, true, R0, R180))
.with(GBlockstate.when(WEST_WALL_SHAPE, LOW, UP, true),
GBlockstate.variant(pillar_low, true, R0, R270))
// PILLAR TALL
.with(GBlockstate.when(NORTH_WALL_SHAPE, TALL, UP, true),
GBlockstate.variant(pillar_tall, true, R0, R0))
.with(GBlockstate.when(EAST_WALL_SHAPE, TALL, UP, true),
GBlockstate.variant(pillar_tall, true, R0, R90))
.with(GBlockstate.when(SOUTH_WALL_SHAPE, TALL, UP, true),
GBlockstate.variant(pillar_tall, true, R0, R180))
.with(GBlockstate.when(WEST_WALL_SHAPE, TALL, UP, true),
GBlockstate.variant(pillar_tall, true, R0, R270))
// PILLAR NONE
.with(GBlockstate.when(NORTH_WALL_SHAPE, NONE, UP, true),
GBlockstate.variant(pillar_none, true, R0, R0))
.with(GBlockstate.when(EAST_WALL_SHAPE, NONE, UP, true),
GBlockstate.variant(pillar_none, true, R0, R90))
.with(GBlockstate.when(SOUTH_WALL_SHAPE, NONE, UP, true),
GBlockstate.variant(pillar_none, true, R0, R180))
.with(GBlockstate.when(WEST_WALL_SHAPE, NONE, UP, true),
GBlockstate.variant(pillar_none, true, R0, R270))
// JUNCTION LOW
.with(GBlockstate.when(
NORTH_WALL_SHAPE, LOW,
EAST_WALL_SHAPE, NONE,
SOUTH_WALL_SHAPE, NONE,
WEST_WALL_SHAPE, NONE,
UP, false
),
GBlockstate.variant(low_e, true, R0, R0))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, NONE,
EAST_WALL_SHAPE, LOW,
SOUTH_WALL_SHAPE, NONE,
WEST_WALL_SHAPE, NONE,
UP, false
),
GBlockstate.variant(low_e, true, R0, R90))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, NONE,
EAST_WALL_SHAPE, NONE,
SOUTH_WALL_SHAPE, LOW,
WEST_WALL_SHAPE, NONE,
UP, false
),
GBlockstate.variant(low_e, true, R0, R180))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, NONE,
EAST_WALL_SHAPE, NONE,
SOUTH_WALL_SHAPE, NONE,
WEST_WALL_SHAPE, LOW,
UP, false
),
GBlockstate.variant(low_e, true, R0, R270))
// JUNCTION TALL
.with(GBlockstate.when(
NORTH_WALL_SHAPE, TALL,
EAST_WALL_SHAPE, NONE,
SOUTH_WALL_SHAPE, NONE,
WEST_WALL_SHAPE, NONE,
UP, false
),
GBlockstate.variant(tall_e, true, R0, R0))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, NONE,
EAST_WALL_SHAPE, TALL,
SOUTH_WALL_SHAPE, NONE,
WEST_WALL_SHAPE, NONE,
UP, false
),
GBlockstate.variant(tall_e, true, R0, R90))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, NONE,
EAST_WALL_SHAPE, NONE,
SOUTH_WALL_SHAPE, TALL,
WEST_WALL_SHAPE, NONE,
UP, false
),
GBlockstate.variant(tall_e, true, R0, R180))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, NONE,
EAST_WALL_SHAPE, NONE,
SOUTH_WALL_SHAPE, NONE,
WEST_WALL_SHAPE, TALL,
UP, false
),
GBlockstate.variant(tall_e, true, R0, R270))
// JUNCTION LOW I
.with(GBlockstate.when(
NORTH_WALL_SHAPE, LOW,
EAST_WALL_SHAPE, NONE,
SOUTH_WALL_SHAPE, LOW,
WEST_WALL_SHAPE, NONE,
UP, false
),
GBlockstate.variant(low_i, true, R0, R0))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, NONE,
EAST_WALL_SHAPE, LOW,
SOUTH_WALL_SHAPE, NONE,
WEST_WALL_SHAPE, LOW,
UP, false
),
GBlockstate.variant(low_i, true, R0, R90))
// JUNCTION TALL I
.with(GBlockstate.when(
NORTH_WALL_SHAPE, TALL,
EAST_WALL_SHAPE, NONE,
SOUTH_WALL_SHAPE, TALL,
WEST_WALL_SHAPE, NONE,
UP, false
),
GBlockstate.variant(tall_i, true, R0, R0))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, NONE,
EAST_WALL_SHAPE, TALL,
SOUTH_WALL_SHAPE, NONE,
WEST_WALL_SHAPE, TALL,
UP, false
),
GBlockstate.variant(tall_i, true, R0, R90))
// JUNCTION LOW TALL I
.with(GBlockstate.when(
NORTH_WALL_SHAPE, LOW,
EAST_WALL_SHAPE, NONE,
SOUTH_WALL_SHAPE, TALL,
WEST_WALL_SHAPE, NONE,
UP, false
),
GBlockstate.variant(low_tall_i, true, R0, R0))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, NONE,
EAST_WALL_SHAPE, LOW,
SOUTH_WALL_SHAPE, NONE,
WEST_WALL_SHAPE, TALL,
UP, false
),
GBlockstate.variant(low_tall_i, true, R0, R90))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, TALL,
EAST_WALL_SHAPE, NONE,
SOUTH_WALL_SHAPE, LOW,
WEST_WALL_SHAPE, NONE,
UP, false
),
GBlockstate.variant(low_tall_i, true, R0, R180))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, NONE,
EAST_WALL_SHAPE, TALL,
SOUTH_WALL_SHAPE, NONE,
WEST_WALL_SHAPE, LOW,
UP, false
),
GBlockstate.variant(low_tall_i, true, R0, R270))
// JUNCTION LOW C
.with(GBlockstate.when(
NORTH_WALL_SHAPE, LOW,
EAST_WALL_SHAPE, NONE,
SOUTH_WALL_SHAPE, NONE,
WEST_WALL_SHAPE, LOW,
UP, false
),
GBlockstate.variant(low_c, true, R0, R0))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, LOW,
EAST_WALL_SHAPE, LOW,
SOUTH_WALL_SHAPE, NONE,
WEST_WALL_SHAPE, NONE,
UP, false
),
GBlockstate.variant(low_c, true, R0, R90))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, NONE,
EAST_WALL_SHAPE, LOW,
SOUTH_WALL_SHAPE, LOW,
WEST_WALL_SHAPE, NONE,
UP, false
),
GBlockstate.variant(low_c, true, R0, R180))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, NONE,
EAST_WALL_SHAPE, NONE,
SOUTH_WALL_SHAPE, LOW,
WEST_WALL_SHAPE, LOW,
UP, false
),
GBlockstate.variant(low_c, true, R0, R270))
// JUNCTION TALL C
.with(GBlockstate.when(
NORTH_WALL_SHAPE, TALL,
EAST_WALL_SHAPE, NONE,
SOUTH_WALL_SHAPE, NONE,
WEST_WALL_SHAPE, TALL,
UP, false
),
GBlockstate.variant(tall_c, true, R0, R0))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, TALL,
EAST_WALL_SHAPE, TALL,
SOUTH_WALL_SHAPE, NONE,
WEST_WALL_SHAPE, NONE,
UP, false
),
GBlockstate.variant(tall_c, true, R0, R90))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, NONE,
EAST_WALL_SHAPE, TALL,
SOUTH_WALL_SHAPE, TALL,
WEST_WALL_SHAPE, NONE,
UP, false
),
GBlockstate.variant(tall_c, true, R0, R180))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, NONE,
EAST_WALL_SHAPE, NONE,
SOUTH_WALL_SHAPE, TALL,
WEST_WALL_SHAPE, TALL,
UP, false
),
GBlockstate.variant(tall_c, true, R0, R270))
// JUNCTION LOW TALL C
.with(GBlockstate.when(
NORTH_WALL_SHAPE, LOW,
EAST_WALL_SHAPE, NONE,
SOUTH_WALL_SHAPE, NONE,
WEST_WALL_SHAPE, TALL,
UP, false
),
GBlockstate.variant(low_tall_c, true, R0, R0))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, TALL,
EAST_WALL_SHAPE, LOW,
SOUTH_WALL_SHAPE, NONE,
WEST_WALL_SHAPE, NONE,
UP, false
),
GBlockstate.variant(low_tall_c, true, R0, R90))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, NONE,
EAST_WALL_SHAPE, TALL,
SOUTH_WALL_SHAPE, LOW,
WEST_WALL_SHAPE, NONE,
UP, false
),
GBlockstate.variant(low_tall_c, true, R0, R180))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, NONE,
EAST_WALL_SHAPE, NONE,
SOUTH_WALL_SHAPE, TALL,
WEST_WALL_SHAPE, LOW,
UP, false
),
GBlockstate.variant(low_tall_c, true, R0, R270))
// JUNCTION TALL LOW C
.with(GBlockstate.when(
NORTH_WALL_SHAPE, TALL,
EAST_WALL_SHAPE, NONE,
SOUTH_WALL_SHAPE, NONE,
WEST_WALL_SHAPE, LOW,
UP, false
),
GBlockstate.variant(tall_low_c, true, R0, R0))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, LOW,
EAST_WALL_SHAPE, TALL,
SOUTH_WALL_SHAPE, NONE,
WEST_WALL_SHAPE, NONE,
UP, false
),
GBlockstate.variant(tall_low_c, true, R0, R90))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, NONE,
EAST_WALL_SHAPE, LOW,
SOUTH_WALL_SHAPE, TALL,
WEST_WALL_SHAPE, NONE,
UP, false
),
GBlockstate.variant(tall_low_c, true, R0, R180))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, NONE,
EAST_WALL_SHAPE, NONE,
SOUTH_WALL_SHAPE, LOW,
WEST_WALL_SHAPE, TALL,
UP, false
),
GBlockstate.variant(tall_low_c, true, R0, R270))
// JUNCTION LOW T
.with(GBlockstate.when(
NORTH_WALL_SHAPE, LOW,
EAST_WALL_SHAPE, LOW,
SOUTH_WALL_SHAPE, NONE,
WEST_WALL_SHAPE, LOW,
UP, false
),
GBlockstate.variant(low_t, true, R0, R0))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, LOW,
EAST_WALL_SHAPE, LOW,
SOUTH_WALL_SHAPE, LOW,
WEST_WALL_SHAPE, NONE,
UP, false
),
GBlockstate.variant(low_t, true, R0, R90))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, NONE,
EAST_WALL_SHAPE, LOW,
SOUTH_WALL_SHAPE, LOW,
WEST_WALL_SHAPE, LOW,
UP, false
),
GBlockstate.variant(low_t, true, R0, R180))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, LOW,
EAST_WALL_SHAPE, NONE,
SOUTH_WALL_SHAPE, LOW,
WEST_WALL_SHAPE, LOW,
UP, false
),
GBlockstate.variant(low_t, true, R0, R270))
// JUNCTION TALL T
.with(GBlockstate.when(
NORTH_WALL_SHAPE, TALL,
EAST_WALL_SHAPE, TALL,
SOUTH_WALL_SHAPE, NONE,
WEST_WALL_SHAPE, TALL,
UP, false
),
GBlockstate.variant(tall_t, true, R0, R0))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, TALL,
EAST_WALL_SHAPE, TALL,
SOUTH_WALL_SHAPE, TALL,
WEST_WALL_SHAPE, NONE,
UP, false
),
GBlockstate.variant(tall_t, true, R0, R90))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, NONE,
EAST_WALL_SHAPE, TALL,
SOUTH_WALL_SHAPE, TALL,
WEST_WALL_SHAPE, TALL,
UP, false
),
GBlockstate.variant(tall_t, true, R0, R180))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, TALL,
EAST_WALL_SHAPE, NONE,
SOUTH_WALL_SHAPE, TALL,
WEST_WALL_SHAPE, TALL,
UP, false
),
GBlockstate.variant(tall_t, true, R0, R270))
// JUNCTION TALL LOW C T
.with(GBlockstate.when(
NORTH_WALL_SHAPE, LOW,
EAST_WALL_SHAPE, TALL,
SOUTH_WALL_SHAPE, NONE,
WEST_WALL_SHAPE, LOW,
UP, false
),
GBlockstate.variant(tall_low_c_t, true, R0, R0))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, LOW,
EAST_WALL_SHAPE, LOW,
SOUTH_WALL_SHAPE, TALL,
WEST_WALL_SHAPE, NONE,
UP, false
),
GBlockstate.variant(tall_low_c_t, true, R0, R90))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, NONE,
EAST_WALL_SHAPE, LOW,
SOUTH_WALL_SHAPE, LOW,
WEST_WALL_SHAPE, TALL,
UP, false
),
GBlockstate.variant(tall_low_c_t, true, R0, R180))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, TALL,
EAST_WALL_SHAPE, NONE,
SOUTH_WALL_SHAPE, LOW,
WEST_WALL_SHAPE, LOW,
UP, false
),
GBlockstate.variant(tall_low_c_t, true, R0, R270))
// JUNCTION TALL I LOW T
.with(GBlockstate.when(
NORTH_WALL_SHAPE, LOW,
EAST_WALL_SHAPE, TALL,
SOUTH_WALL_SHAPE, NONE,
WEST_WALL_SHAPE, TALL,
UP, false
),
GBlockstate.variant(tall_i_low_t, true, R0, R0))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, TALL,
EAST_WALL_SHAPE, LOW,
SOUTH_WALL_SHAPE, TALL,
WEST_WALL_SHAPE, NONE,
UP, false
),
GBlockstate.variant(tall_i_low_t, true, R0, R90))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, NONE,
EAST_WALL_SHAPE, TALL,
SOUTH_WALL_SHAPE, LOW,
WEST_WALL_SHAPE, TALL,
UP, false
),
GBlockstate.variant(tall_i_low_t, true, R0, R180))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, TALL,
EAST_WALL_SHAPE, NONE,
SOUTH_WALL_SHAPE, TALL,
WEST_WALL_SHAPE, LOW,
UP, false
),
GBlockstate.variant(tall_i_low_t, true, R0, R270))
// JUNCTION LOW I TALL T
.with(GBlockstate.when(
NORTH_WALL_SHAPE, TALL,
EAST_WALL_SHAPE, LOW,
SOUTH_WALL_SHAPE, NONE,
WEST_WALL_SHAPE, LOW,
UP, false
),
GBlockstate.variant(low_i_tall_t, true, R0, R0))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, LOW,
EAST_WALL_SHAPE, TALL,
SOUTH_WALL_SHAPE, LOW,
WEST_WALL_SHAPE, NONE,
UP, false
),
GBlockstate.variant(low_i_tall_t, true, R0, R90))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, NONE,
EAST_WALL_SHAPE, LOW,
SOUTH_WALL_SHAPE, TALL,
WEST_WALL_SHAPE, LOW,
UP, false
),
GBlockstate.variant(low_i_tall_t, true, R0, R180))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, LOW,
EAST_WALL_SHAPE, NONE,
SOUTH_WALL_SHAPE, LOW,
WEST_WALL_SHAPE, TALL,
UP, false
),
GBlockstate.variant(low_i_tall_t, true, R0, R270))
// JUNCTION LOW TALL C T
.with(GBlockstate.when(
NORTH_WALL_SHAPE, TALL,
EAST_WALL_SHAPE, LOW,
SOUTH_WALL_SHAPE, NONE,
WEST_WALL_SHAPE, TALL,
UP, false
),
GBlockstate.variant(low_tall_c_t, true, R0, R0))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, TALL,
EAST_WALL_SHAPE, TALL,
SOUTH_WALL_SHAPE, LOW,
WEST_WALL_SHAPE, NONE,
UP, false
),
GBlockstate.variant(low_tall_c_t, true, R0, R90))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, NONE,
EAST_WALL_SHAPE, TALL,
SOUTH_WALL_SHAPE, TALL,
WEST_WALL_SHAPE, LOW,
UP, false
),
GBlockstate.variant(low_tall_c_t, true, R0, R180))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, LOW,
EAST_WALL_SHAPE, NONE,
SOUTH_WALL_SHAPE, TALL,
WEST_WALL_SHAPE, TALL,
UP, false
),
GBlockstate.variant(low_tall_c_t, true, R0, R270))
// JUNCTION LOW C TALL T
.with(GBlockstate.when(
NORTH_WALL_SHAPE, LOW,
EAST_WALL_SHAPE, LOW,
SOUTH_WALL_SHAPE, NONE,
WEST_WALL_SHAPE, TALL,
UP, false
),
GBlockstate.variant(low_c_tall_t, true, R0, R0))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, TALL,
EAST_WALL_SHAPE, LOW,
SOUTH_WALL_SHAPE, LOW,
WEST_WALL_SHAPE, NONE,
UP, false
),
GBlockstate.variant(low_c_tall_t, true, R0, R90))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, NONE,
EAST_WALL_SHAPE, TALL,
SOUTH_WALL_SHAPE, LOW,
WEST_WALL_SHAPE, LOW,
UP, false
),
GBlockstate.variant(low_c_tall_t, true, R0, R180))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, LOW,
EAST_WALL_SHAPE, NONE,
SOUTH_WALL_SHAPE, TALL,
WEST_WALL_SHAPE, LOW,
UP, false
),
GBlockstate.variant(low_c_tall_t, true, R0, R270))
// JUNCTION TALL C LOW T
.with(GBlockstate.when(
NORTH_WALL_SHAPE, TALL,
EAST_WALL_SHAPE, TALL,
SOUTH_WALL_SHAPE, NONE,
WEST_WALL_SHAPE, LOW,
UP, false
),
GBlockstate.variant(tall_c_low_t, true, R0, R0))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, LOW,
EAST_WALL_SHAPE, TALL,
SOUTH_WALL_SHAPE, TALL,
WEST_WALL_SHAPE, NONE,
UP, false
),
GBlockstate.variant(tall_c_low_t, true, R0, R90))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, NONE,
EAST_WALL_SHAPE, LOW,
SOUTH_WALL_SHAPE, TALL,
WEST_WALL_SHAPE, TALL,
UP, false
),
GBlockstate.variant(tall_c_low_t, true, R0, R180))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, TALL,
EAST_WALL_SHAPE, NONE,
SOUTH_WALL_SHAPE, LOW,
WEST_WALL_SHAPE, TALL,
UP, false
),
GBlockstate.variant(tall_c_low_t, true, R0, R270))
// JUNCTION X
.with(GBlockstate.when(
NORTH_WALL_SHAPE, LOW,
EAST_WALL_SHAPE, LOW,
SOUTH_WALL_SHAPE, LOW,
WEST_WALL_SHAPE, LOW,
UP, false
),
GBlockstate.variant(ReFramed.id("wall_low_x_special"), true, R0, R0))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, TALL,
EAST_WALL_SHAPE, TALL,
SOUTH_WALL_SHAPE, TALL,
WEST_WALL_SHAPE, TALL,
UP, false
),
GBlockstate.variant(ReFramed.id("wall_tall_x_special"), true, R0, R0))
// JUNCTION I X
.with(GBlockstate.when(
NORTH_WALL_SHAPE, LOW,
EAST_WALL_SHAPE, TALL,
SOUTH_WALL_SHAPE, LOW,
WEST_WALL_SHAPE, TALL,
UP, false
),
GBlockstate.variant(tall_i_low_i_x, true, R0, R0))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, TALL,
EAST_WALL_SHAPE, LOW,
SOUTH_WALL_SHAPE, TALL,
WEST_WALL_SHAPE, LOW,
UP, false
),
GBlockstate.variant(tall_i_low_i_x, true, R0, R90))
// JUNCTION TALL LOW T X
.with(GBlockstate.when(
NORTH_WALL_SHAPE, LOW,
EAST_WALL_SHAPE, TALL,
SOUTH_WALL_SHAPE, LOW,
WEST_WALL_SHAPE, LOW,
UP, false
),
GBlockstate.variant(tall_low_t_x, true, R0, R0))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, LOW,
EAST_WALL_SHAPE, LOW,
SOUTH_WALL_SHAPE, TALL,
WEST_WALL_SHAPE, LOW,
UP, false
),
GBlockstate.variant(tall_low_t_x, true, R0, R90))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, LOW,
EAST_WALL_SHAPE, LOW,
SOUTH_WALL_SHAPE, LOW,
WEST_WALL_SHAPE, TALL,
UP, false
),
GBlockstate.variant(tall_low_t_x, true, R0, R180))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, TALL,
EAST_WALL_SHAPE, LOW,
SOUTH_WALL_SHAPE, LOW,
WEST_WALL_SHAPE, LOW,
UP, false
),
GBlockstate.variant(tall_low_t_x, true, R0, R270))
// JUNCTION TALL C LOW C X
.with(GBlockstate.when(
NORTH_WALL_SHAPE, TALL,
EAST_WALL_SHAPE, TALL,
SOUTH_WALL_SHAPE, LOW,
WEST_WALL_SHAPE, LOW,
UP, false
),
GBlockstate.variant(tall_c_low_c_x, true, R0, R0))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, LOW,
EAST_WALL_SHAPE, TALL,
SOUTH_WALL_SHAPE, TALL,
WEST_WALL_SHAPE, LOW,
UP, false
),
GBlockstate.variant(tall_c_low_c_x, true, R0, R90))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, LOW,
EAST_WALL_SHAPE, LOW,
SOUTH_WALL_SHAPE, TALL,
WEST_WALL_SHAPE, TALL,
UP, false
),
GBlockstate.variant(tall_c_low_c_x, true, R0, R180))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, TALL,
EAST_WALL_SHAPE, LOW,
SOUTH_WALL_SHAPE, LOW,
WEST_WALL_SHAPE, TALL,
UP, false
),
GBlockstate.variant(tall_c_low_c_x, true, R0, R270))
// JUNCTION TALL C LOW C X
.with(GBlockstate.when(
NORTH_WALL_SHAPE, TALL,
EAST_WALL_SHAPE, TALL,
SOUTH_WALL_SHAPE, LOW,
WEST_WALL_SHAPE, TALL,
UP, false
),
GBlockstate.variant(tall_t_low_x, true, R0, R0))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, TALL,
EAST_WALL_SHAPE, TALL,
SOUTH_WALL_SHAPE, TALL,
WEST_WALL_SHAPE, LOW,
UP, false
),
GBlockstate.variant(tall_t_low_x, true, R0, R90))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, LOW,
EAST_WALL_SHAPE, TALL,
SOUTH_WALL_SHAPE, TALL,
WEST_WALL_SHAPE, TALL,
UP, false
),
GBlockstate.variant(tall_t_low_x, true, R0, R180))
.with(GBlockstate.when(
NORTH_WALL_SHAPE, TALL,
EAST_WALL_SHAPE, LOW,
SOUTH_WALL_SHAPE, TALL,
WEST_WALL_SHAPE, TALL,
UP, false
),
GBlockstate.variant(tall_t_low_x, true, R0, R270));
}
}

View File

@ -0,0 +1,25 @@
package fr.adrien1106.reframed.generator.item;
import fr.adrien1106.reframed.generator.RecipeSetter;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
import net.minecraft.data.server.recipe.RecipeExporter;
import net.minecraft.data.server.recipe.ShapedRecipeJsonBuilder;
import net.minecraft.item.ItemConvertible;
import net.minecraft.item.Items;
import net.minecraft.recipe.book.RecipeCategory;
public class Blueprint implements RecipeSetter {
@Override
public void setRecipe(RecipeExporter exporter, ItemConvertible convertible) {
ShapedRecipeJsonBuilder
.create(RecipeCategory.TOOLS, convertible, 3)
.pattern("PI")
.pattern("PP")
.input('P', Items.PAPER)
.input('I', Items.INK_SAC)
.criterion(FabricRecipeProvider.hasItem(Items.PAPER), FabricRecipeProvider.conditionsFromItem(Items.PAPER))
.criterion(FabricRecipeProvider.hasItem(convertible), FabricRecipeProvider.conditionsFromItem(convertible))
.offerTo(exporter);
}
}

View File

@ -0,0 +1,28 @@
package fr.adrien1106.reframed.generator.item;
import fr.adrien1106.reframed.ReFramed;
import fr.adrien1106.reframed.generator.RecipeSetter;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
import net.minecraft.data.server.recipe.RecipeExporter;
import net.minecraft.data.server.recipe.ShapedRecipeJsonBuilder;
import net.minecraft.item.ItemConvertible;
import net.minecraft.item.Items;
import net.minecraft.recipe.book.RecipeCategory;
public class Hammer implements RecipeSetter {
@Override
public void setRecipe(RecipeExporter exporter, ItemConvertible convertible) {
ShapedRecipeJsonBuilder
.create(RecipeCategory.TOOLS, convertible)
.pattern(" CI")
.pattern(" ~C")
.pattern("~ ")
.input('I', Items.IRON_INGOT)
.input('C', ReFramed.CUBE)
.input('~', Items.STICK)
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
.criterion(FabricRecipeProvider.hasItem(convertible), FabricRecipeProvider.conditionsFromItem(convertible))
.offerTo(exporter);
}
}

View File

@ -0,0 +1,27 @@
package fr.adrien1106.reframed.generator.item;
import fr.adrien1106.reframed.ReFramed;
import fr.adrien1106.reframed.generator.RecipeSetter;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
import net.minecraft.data.server.recipe.RecipeExporter;
import net.minecraft.data.server.recipe.ShapedRecipeJsonBuilder;
import net.minecraft.item.ItemConvertible;
import net.minecraft.item.Items;
import net.minecraft.recipe.book.RecipeCategory;
public class Screwdriver implements RecipeSetter {
@Override
public void setRecipe(RecipeExporter exporter, ItemConvertible convertible) {
ShapedRecipeJsonBuilder
.create(RecipeCategory.TOOLS, convertible)
.pattern(" I")
.pattern(" I ")
.pattern("C ")
.input('I', Items.IRON_INGOT)
.input('C', ReFramed.CUBE)
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
.criterion(FabricRecipeProvider.hasItem(convertible), FabricRecipeProvider.conditionsFromItem(convertible))
.offerTo(exporter);
}
}

View File

@ -2,23 +2,17 @@ package fr.adrien1106.reframed.item;
import fr.adrien1106.reframed.ReFramed; import fr.adrien1106.reframed.ReFramed;
import fr.adrien1106.reframed.block.ReFramedEntity; import fr.adrien1106.reframed.block.ReFramedEntity;
import fr.adrien1106.reframed.generator.RecipeSetter;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.data.server.recipe.RecipeExporter;
import net.minecraft.data.server.recipe.ShapedRecipeJsonBuilder;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemUsageContext; import net.minecraft.item.ItemUsageContext;
import net.minecraft.item.Items;
import net.minecraft.recipe.book.RecipeCategory;
import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundCategory;
import net.minecraft.sound.SoundEvents; import net.minecraft.sound.SoundEvents;
import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResult;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
public class ReFramedBlueprintItem extends Item implements RecipeSetter { public class ReFramedBlueprintItem extends Item {
public ReFramedBlueprintItem(Settings settings) { public ReFramedBlueprintItem(Settings settings) {
super(settings); super(settings);
} }
@ -39,17 +33,4 @@ public class ReFramedBlueprintItem extends Item implements RecipeSetter {
return ActionResult.SUCCESS; return ActionResult.SUCCESS;
} }
@Override
public void setRecipe(RecipeExporter exporter) {
ShapedRecipeJsonBuilder
.create(RecipeCategory.TOOLS, this, 3)
.pattern("PI")
.pattern("PP")
.input('P', Items.PAPER)
.input('I', Items.INK_SAC)
.criterion(FabricRecipeProvider.hasItem(Items.PAPER), FabricRecipeProvider.conditionsFromItem(Items.PAPER))
.criterion(FabricRecipeProvider.hasItem(this), FabricRecipeProvider.conditionsFromItem(this))
.offerTo(exporter);
}
} }

View File

@ -2,26 +2,20 @@ package fr.adrien1106.reframed.item;
import fr.adrien1106.reframed.ReFramed; import fr.adrien1106.reframed.ReFramed;
import fr.adrien1106.reframed.block.ReFramedDoubleBlock; import fr.adrien1106.reframed.block.ReFramedDoubleBlock;
import fr.adrien1106.reframed.generator.RecipeSetter;
import fr.adrien1106.reframed.util.blocks.ThemeableBlockEntity; import fr.adrien1106.reframed.util.blocks.ThemeableBlockEntity;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.data.server.recipe.RecipeExporter;
import net.minecraft.data.server.recipe.ShapedRecipeJsonBuilder;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemUsageContext; import net.minecraft.item.ItemUsageContext;
import net.minecraft.item.Items;
import net.minecraft.recipe.book.RecipeCategory;
import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundCategory;
import net.minecraft.sound.SoundEvents; import net.minecraft.sound.SoundEvents;
import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResult;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
public class ReFramedHammerItem extends Item implements RecipeSetter { public class ReFramedHammerItem extends Item {
public ReFramedHammerItem(Settings settings) { public ReFramedHammerItem(Settings settings) {
super(settings); super(settings);
} }
@ -52,19 +46,4 @@ public class ReFramedHammerItem extends Item implements RecipeSetter {
ReFramed.chunkRerenderProxy.accept(world, pos); ReFramed.chunkRerenderProxy.accept(world, pos);
return ActionResult.SUCCESS; return ActionResult.SUCCESS;
} }
@Override
public void setRecipe(RecipeExporter exporter) {
ShapedRecipeJsonBuilder
.create(RecipeCategory.TOOLS, this)
.pattern(" CI")
.pattern(" ~C")
.pattern("~ ")
.input('I', Items.IRON_INGOT)
.input('C', ReFramed.CUBE)
.input('~', Items.STICK)
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
.criterion(FabricRecipeProvider.hasItem(this), FabricRecipeProvider.conditionsFromItem(this))
.offerTo(exporter);
}
} }

View File

@ -2,17 +2,11 @@ package fr.adrien1106.reframed.item;
import fr.adrien1106.reframed.ReFramed; import fr.adrien1106.reframed.ReFramed;
import fr.adrien1106.reframed.block.ReFramedDoubleBlock; import fr.adrien1106.reframed.block.ReFramedDoubleBlock;
import fr.adrien1106.reframed.generator.RecipeSetter;
import fr.adrien1106.reframed.util.blocks.ThemeableBlockEntity; import fr.adrien1106.reframed.util.blocks.ThemeableBlockEntity;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.data.server.recipe.RecipeExporter;
import net.minecraft.data.server.recipe.ShapedRecipeJsonBuilder;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemUsageContext; import net.minecraft.item.ItemUsageContext;
import net.minecraft.item.Items;
import net.minecraft.recipe.book.RecipeCategory;
import net.minecraft.sound.BlockSoundGroup; import net.minecraft.sound.BlockSoundGroup;
import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundCategory;
import net.minecraft.state.property.Properties; import net.minecraft.state.property.Properties;
@ -21,7 +15,7 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction;
import net.minecraft.world.World; import net.minecraft.world.World;
public class ReFramedScrewdriverItem extends Item implements RecipeSetter { public class ReFramedScrewdriverItem extends Item {
public ReFramedScrewdriverItem(Settings settings) { public ReFramedScrewdriverItem(Settings settings) {
super(settings); super(settings);
@ -61,18 +55,4 @@ public class ReFramedScrewdriverItem extends Item implements RecipeSetter {
ReFramed.chunkRerenderProxy.accept(world, pos); ReFramed.chunkRerenderProxy.accept(world, pos);
return ActionResult.SUCCESS; return ActionResult.SUCCESS;
} }
@Override
public void setRecipe(RecipeExporter exporter) {
ShapedRecipeJsonBuilder
.create(RecipeCategory.TOOLS, this)
.pattern(" I")
.pattern(" I ")
.pattern("C ")
.input('I', Items.IRON_INGOT)
.input('C', ReFramed.CUBE)
.criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE))
.criterion(FabricRecipeProvider.hasItem(this), FabricRecipeProvider.conditionsFromItem(this))
.offerTo(exporter);
}
} }

View File

@ -0,0 +1,35 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [4, 0, 4],
"to": [5, 14, 5],
"faces": {
"north": {"uv": [11, 2, 12, 16], "texture": "#side"},
"west": {"uv": [4, 2, 5, 16], "texture": "#side"},
"down": {"uv": [4, 11, 5, 12], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 0, 4],
"to": [11, 14, 5],
"faces": {
"north": {"uv": [5, 2, 11, 16], "texture": "#side"},
"down": {"uv": [5, 11, 11, 12], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [4, 14, 4],
"to": [11, 16, 5],
"faces": {
"north": {"uv": [5, 0, 12, 2], "texture": "#side"},
"west": {"uv": [4, 0, 5, 2], "texture": "#side"},
"up": {"uv": [5, 4, 12, 5], "texture": "#top", "cullface": "up"}
}
}
]
}

View File

@ -0,0 +1,28 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [4, 0, 4],
"to": [5, 16, 5],
"faces": {
"north": {"uv": [11, 0, 12, 16], "texture": "#side"},
"west": {"uv": [4, 0, 5, 16], "texture": "#side"},
"up": {"uv": [4, 4, 5, 5], "texture": "#top", "cullface": "up"},
"down": {"uv": [4, 11, 5, 12], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 0, 4],
"to": [11, 16, 5],
"faces": {
"north": {"uv": [5, 0, 11, 16], "texture": "#side"},
"up": {"uv": [5, 4, 11, 5], "texture": "#top", "cullface": "up"},
"down": {"uv": [5, 11, 11, 12], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,21 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [5, 0, 0],
"to": [11, 14, 4],
"faces": {
"north": {"uv": [5, 2, 11, 16], "texture": "#side", "cullface": "north"},
"east": {"uv": [12, 2, 16, 16], "texture": "#side"},
"south": {"uv": [5, 2, 11, 16], "texture": "#side"},
"west": {"uv": [0, 2, 4, 16], "texture": "#side"},
"up": {"uv": [5, 0, 11, 4], "texture": "#top"},
"down": {"uv": [5, 12, 11, 16], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,21 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [5, 0, 0],
"to": [11, 16, 4],
"faces": {
"north": {"uv": [5, 0, 11, 16], "texture": "#side", "cullface": "north"},
"east": {"uv": [12, 0, 16, 16], "texture": "#side"},
"south": {"uv": [5, 0, 11, 16], "texture": "#side"},
"west": {"uv": [0, 0, 4, 16], "texture": "#side"},
"up": {"uv": [5, 0, 11, 4], "texture": "#top", "cullface": "up"},
"down": {"uv": [5, 12, 11, 16], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,43 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [5, 0, 0],
"to": [11, 14, 4],
"faces": {
"north": {"uv": [5, 2, 11, 16], "texture": "#side", "cullface": "north"},
"east": {"uv": [12, 2, 16, 16], "texture": "#side"},
"west": {"uv": [0, 2, 4, 16], "texture": "#side"},
"up": {"uv": [5, 0, 11, 4], "texture": "#top"},
"down": {"uv": [5, 12, 11, 16], "texture": "#bottom"}
}
},
{
"from": [5, 0, 12],
"to": [11, 14, 16],
"faces": {
"east": {"uv": [0, 2, 4, 16], "texture": "#side"},
"south": {"uv": [5, 2, 11, 16], "texture": "#side", "cullface": "south"},
"west": {"uv": [12, 2, 16, 16], "texture": "#side"},
"up": {"uv": [5, 12, 11, 16], "texture": "#top"},
"down": {"uv": [5, 0, 11, 4], "texture": "#bottom"}
}
},
{
"from": [4, 0, 4],
"to": [12, 16, 12],
"faces": {
"north": {"uv": [4, 0, 12, 16], "texture": "#side"},
"east": {"uv": [4, 0, 12, 16], "texture": "#side"},
"south": {"uv": [4, 0, 12, 16], "texture": "#side", "cullface": "south"},
"west": {"uv": [4, 0, 12, 16], "texture": "#side"},
"up": {"uv": [4, 4, 12, 12], "texture": "#top"},
"down": {"uv": [4, 4, 12, 12], "texture": "#bottom"}
}
}
]
}

View File

@ -0,0 +1,20 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [5, 0, 4],
"to": [11, 14, 8],
"faces": {
"east": {"uv": [8, 2, 12, 16], "texture": "#side"},
"south": {"uv": [5, 2, 11, 16], "texture": "#side"},
"west": {"uv": [4, 2, 8, 16], "texture": "#side"},
"up": {"uv": [5, 4, 11, 8], "texture": "#top"},
"down": {"uv": [5, 8, 11, 12], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,57 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [5, 0, 4],
"to": [11, 14, 5],
"faces": {
"east": {"uv": [11, 2, 12, 16], "texture": "#side"},
"west": {"uv": [4, 2, 5, 16], "texture": "#side"},
"up": {"uv": [5, 4, 11, 5], "texture": "#top"},
"down": {"uv": [5, 11, 11, 12], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [8, 0, 5],
"to": [11, 14, 8],
"faces": {
"east": {"uv": [8, 2, 11, 16], "texture": "#side"},
"south": {"uv": [8, 2, 11, 16], "texture": "#side"},
"up": {"uv": [8, 5, 11, 8], "texture": "#top"},
"down": {"uv": [8, 8, 11, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 0, 8],
"to": [8, 14, 11],
"faces": {
"east": {"uv": [5, 2, 8, 16], "texture": "#side"},
"south": {"uv": [5, 2, 8, 16], "texture": "#side"},
"up": {"uv": [5, 8, 8, 11], "texture": "#top"},
"down": {"uv": [5, 5, 8, 8], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 0, 5],
"to": [8, 14, 8],
"faces": {
"up": {"uv": [5, 5, 8, 8], "texture": "#top"},
"down": {"uv": [5, 8, 8, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [4, 0, 5],
"to": [5, 14, 11],
"faces": {
"north": {"uv": [11, 2, 12, 16], "texture": "#side"},
"south": {"uv": [4, 2, 5, 16], "texture": "#side"},
"up": {"uv": [4, 5, 5, 11], "texture": "#top"},
"down": {"uv": [4, 5, 5, 11], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,66 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [5, 0, 4],
"to": [11, 14, 5],
"faces": {
"east": {"uv": [11, 2, 12, 16], "texture": "#side"},
"west": {"uv": [4, 2, 5, 16], "texture": "#side"},
"up": {"uv": [5, 4, 11, 5], "texture": "#top"},
"down": {"uv": [5, 11, 11, 12], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [8, 0, 5],
"to": [11, 14, 11],
"faces": {
"south": {"uv": [8, 2, 11, 16], "texture": "#side"},
"up": {"uv": [8, 5, 11, 11], "texture": "#top"},
"down": {"uv": [8, 5, 11, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 14, 5],
"to": [8, 16, 11],
"faces": {
"north": {"uv": [8, 0, 11, 2], "texture": "#side"},
"east": {"uv": [5, 0, 11, 2], "texture": "#side"},
"south": {"uv": [5, 0, 8, 2], "texture": "#side"},
"up": {"uv": [5, 5, 8, 11], "texture": "#top", "cullface": "up"}
}
},
{
"from": [5, 0, 5],
"to": [8, 14, 11],
"faces": {
"south": {"uv": [5, 2, 8, 16], "texture": "#side"},
"down": {"uv": [5, 5, 8, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [11, 0, 5],
"to": [12, 14, 11],
"faces": {
"north": {"uv": [4, 2, 5, 16], "texture": "#side"},
"south": {"uv": [11, 2, 12, 16], "texture": "#side"},
"up": {"uv": [11, 5, 12, 11], "texture": "#top"},
"down": {"uv": [11, 5, 12, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [4, 0, 5],
"to": [5, 16, 11],
"faces": {
"north": {"uv": [11, 0, 12, 16], "texture": "#side"},
"south": {"uv": [4, 0, 5, 16], "texture": "#side"},
"up": {"uv": [4, 5, 5, 11], "texture": "#top", "cullface": "up"},
"down": {"uv": [4, 5, 5, 11], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,19 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [5, 0, 4],
"to": [11, 14, 12],
"faces": {
"east": {"uv": [4, 2, 12, 16], "texture": "#side"},
"west": {"uv": [4, 2, 12, 16], "texture": "#side"},
"up": {"uv": [5, 4, 11, 12], "texture": "#top"},
"down": {"uv": [5, 4, 11, 12], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,65 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [5, 0, 4],
"to": [11, 16, 5],
"faces": {
"east": {"uv": [11, 0, 12, 16], "texture": "#side"},
"west": {"uv": [4, 0, 5, 16], "texture": "#side"},
"up": {"uv": [5, 4, 11, 5], "texture": "#top", "cullface": "up"},
"down": {"uv": [5, 11, 11, 12], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 0, 8],
"to": [11, 14, 11],
"faces": {
"south": {"uv": [5, 2, 11, 16], "texture": "#side"},
"up": {"uv": [5, 8, 11, 11], "texture": "#top"},
"down": {"uv": [5, 5, 11, 8], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 14, 5],
"to": [11, 16, 8],
"faces": {
"east": {"uv": [8, 0, 11, 2], "texture": "#side"},
"south": {"uv": [5, 0, 11, 2], "texture": "#side"},
"west": {"uv": [5, 0, 8, 2], "texture": "#side"},
"up": {"uv": [5, 5, 11, 8], "texture": "#top", "cullface": "up"}
}
},
{
"from": [5, 0, 5],
"to": [11, 14, 8],
"faces": {
"down": {"uv": [5, 8, 11, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [4, 0, 5],
"to": [5, 14, 11],
"faces": {
"north": {"uv": [11, 2, 12, 16], "texture": "#side"},
"south": {"uv": [4, 2, 5, 16], "texture": "#side"},
"up": {"uv": [4, 5, 5, 11], "texture": "#top"},
"down": {"uv": [4, 5, 5, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [11, 0, 5],
"to": [12, 14, 11],
"faces": {
"north": {"uv": [4, 2, 5, 16], "texture": "#side"},
"south": {"uv": [11, 2, 12, 16], "texture": "#side"},
"up": {"uv": [11, 5, 12, 11], "texture": "#top"},
"down": {"uv": [11, 5, 12, 11], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,48 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [5, 0, 4],
"to": [11, 14, 5],
"faces": {
"east": {"uv": [11, 2, 12, 16], "texture": "#side"},
"west": {"uv": [4, 2, 5, 16], "texture": "#side"},
"up": {"uv": [5, 4, 11, 5], "texture": "#top"},
"down": {"uv": [5, 11, 11, 12], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 0, 5],
"to": [11, 14, 11],
"faces": {
"south": {"uv": [5, 2, 11, 16], "texture": "#side"},
"up": {"uv": [5, 5, 11, 11], "texture": "#top"},
"down": {"uv": [5, 5, 11, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [4, 0, 5],
"to": [5, 14, 11],
"faces": {
"north": {"uv": [11, 2, 12, 16], "texture": "#side"},
"south": {"uv": [4, 2, 5, 16], "texture": "#side"},
"up": {"uv": [4, 5, 5, 11], "texture": "#top"},
"down": {"uv": [4, 5, 5, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [11, 0, 5],
"to": [12, 14, 11],
"faces": {
"north": {"uv": [4, 2, 5, 16], "texture": "#side"},
"south": {"uv": [11, 2, 12, 16], "texture": "#side"},
"up": {"uv": [11, 5, 12, 11], "texture": "#top"},
"down": {"uv": [11, 5, 12, 11], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,65 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [5, 0, 4],
"to": [11, 14, 5],
"faces": {
"east": {"uv": [11, 2, 12, 16], "texture": "#side"},
"west": {"uv": [4, 2, 5, 16], "texture": "#side"},
"up": {"uv": [5, 4, 11, 5], "texture": "#top"},
"down": {"uv": [5, 11, 11, 12], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [8, 0, 5],
"to": [11, 14, 8],
"faces": {
"east": {"uv": [8, 2, 11, 16], "texture": "#side"},
"south": {"uv": [8, 2, 11, 16], "texture": "#side"},
"up": {"uv": [8, 5, 11, 8], "texture": "#top"},
"down": {"uv": [8, 8, 11, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 14, 5],
"to": [8, 16, 8],
"faces": {
"north": {"uv": [8, 0, 11, 2], "texture": "#side"},
"east": {"uv": [8, 0, 11, 2], "texture": "#side"},
"up": {"uv": [5, 5, 8, 8], "texture": "#top", "cullface": "up"}
}
},
{
"from": [5, 0, 8],
"to": [8, 16, 11],
"faces": {
"east": {"uv": [5, 0, 8, 16], "texture": "#side"},
"south": {"uv": [5, 0, 8, 16], "texture": "#side"},
"up": {"uv": [5, 8, 8, 11], "texture": "#top", "cullface": "up"},
"down": {"uv": [5, 5, 8, 8], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 0, 5],
"to": [8, 14, 8],
"faces": {
"down": {"uv": [5, 8, 8, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [4, 0, 5],
"to": [5, 16, 11],
"faces": {
"north": {"uv": [11, 0, 12, 16], "texture": "#side"},
"south": {"uv": [4, 0, 5, 16], "texture": "#side"},
"up": {"uv": [4, 5, 5, 11], "texture": "#top", "cullface": "up"},
"down": {"uv": [4, 5, 5, 11], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,88 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [5, 0, 4],
"to": [11, 16, 5],
"faces": {
"east": {"uv": [11, 0, 12, 16], "texture": "#side"},
"west": {"uv": [4, 0, 5, 16], "texture": "#side"},
"up": {"uv": [5, 4, 11, 5], "texture": "#top", "cullface": "up"},
"down": {"uv": [5, 11, 11, 12], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [8, 0, 8],
"to": [11, 14, 11],
"faces": {
"south": {"uv": [8, 2, 11, 16], "texture": "#side"},
"up": {"uv": [8, 8, 11, 11], "texture": "#top"},
"down": {"uv": [8, 5, 11, 8], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [8, 14, 5],
"to": [11, 16, 8],
"faces": {
"east": {"uv": [8, 0, 11, 2], "texture": "#side"},
"south": {"uv": [8, 0, 11, 2], "texture": "#side"},
"up": {"uv": [8, 5, 11, 8], "texture": "#top", "cullface": "up"}
}
},
{
"from": [5, 14, 8],
"to": [8, 16, 11],
"faces": {
"east": {"uv": [5, 0, 8, 2], "texture": "#side"},
"south": {"uv": [5, 0, 8, 2], "texture": "#side"},
"up": {"uv": [5, 8, 8, 11], "texture": "#top", "cullface": "up"}
}
},
{
"from": [5, 14, 5],
"to": [8, 16, 8],
"faces": {
"up": {"uv": [5, 5, 8, 8], "texture": "#top", "cullface": "up"}
}
},
{
"from": [5, 0, 5],
"to": [11, 14, 8],
"faces": {
"down": {"uv": [5, 8, 11, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 0, 8],
"to": [8, 14, 11],
"faces": {
"south": {"uv": [5, 2, 8, 16], "texture": "#side"},
"down": {"uv": [5, 5, 8, 8], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [4, 0, 5],
"to": [5, 16, 11],
"faces": {
"north": {"uv": [11, 0, 12, 16], "texture": "#side"},
"south": {"uv": [4, 0, 5, 16], "texture": "#side"},
"up": {"uv": [4, 5, 5, 11], "texture": "#top", "cullface": "up"},
"down": {"uv": [4, 5, 5, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [11, 0, 5],
"to": [12, 14, 11],
"faces": {
"north": {"uv": [4, 2, 5, 16], "texture": "#side"},
"south": {"uv": [11, 2, 12, 16], "texture": "#side"},
"up": {"uv": [11, 5, 12, 11], "texture": "#top"},
"down": {"uv": [11, 5, 12, 11], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,38 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [5, 0, 4],
"to": [11, 14, 8],
"faces": {
"east": {"uv": [8, 2, 12, 16], "texture": "#side"},
"west": {"uv": [4, 2, 8, 16], "texture": "#side"},
"up": {"uv": [5, 4, 11, 8], "texture": "#top"},
"down": {"uv": [5, 8, 11, 12], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 14, 8],
"to": [11, 16, 12],
"faces": {
"north": {"uv": [5, 0, 11, 2], "texture": "#side"},
"east": {"uv": [4, 0, 8, 2], "texture": "#side"},
"west": {"uv": [8, 0, 12, 2], "texture": "#side"},
"up": {"uv": [5, 8, 11, 12], "texture": "#top", "cullface": "up"}
}
},
{
"from": [5, 0, 8],
"to": [11, 14, 12],
"faces": {
"east": {"uv": [4, 2, 8, 16], "texture": "#side"},
"west": {"uv": [8, 2, 12, 16], "texture": "#side"},
"down": {"uv": [5, 4, 11, 8], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,57 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [5, 0, 4],
"to": [11, 14, 5],
"faces": {
"east": {"uv": [11, 2, 12, 16], "texture": "#side"},
"west": {"uv": [4, 2, 5, 16], "texture": "#side"},
"up": {"uv": [5, 4, 11, 5], "texture": "#top"},
"down": {"uv": [5, 11, 11, 12], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 0, 11],
"to": [11, 14, 12],
"faces": {
"east": {"uv": [4, 2, 5, 16], "texture": "#side"},
"west": {"uv": [11, 2, 12, 16], "texture": "#side"},
"up": {"uv": [5, 11, 11, 12], "texture": "#top"},
"down": {"uv": [5, 4, 11, 5], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 0, 5],
"to": [11, 14, 11],
"faces": {
"up": {"uv": [5, 5, 11, 11], "texture": "#top"},
"down": {"uv": [5, 5, 11, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [4, 0, 5],
"to": [5, 14, 11],
"faces": {
"north": {"uv": [11, 2, 12, 16], "texture": "#side"},
"south": {"uv": [4, 2, 5, 16], "texture": "#side"},
"up": {"uv": [4, 5, 5, 11], "texture": "#top"},
"down": {"uv": [4, 5, 5, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [11, 0, 5],
"to": [12, 14, 11],
"faces": {
"north": {"uv": [4, 2, 5, 16], "texture": "#side"},
"south": {"uv": [11, 2, 12, 16], "texture": "#side"},
"up": {"uv": [11, 5, 12, 11], "texture": "#top"},
"down": {"uv": [11, 5, 12, 11], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,20 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [5, 0, 4],
"to": [11, 16, 8],
"faces": {
"east": {"uv": [8, 0, 12, 16], "texture": "#side"},
"south": {"uv": [5, 0, 11, 16], "texture": "#side"},
"west": {"uv": [4, 0, 8, 16], "texture": "#side"},
"up": {"uv": [5, 4, 11, 8], "texture": "#top", "cullface": "up"},
"down": {"uv": [5, 8, 11, 12], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,57 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [5, 0, 4],
"to": [11, 16, 5],
"faces": {
"east": {"uv": [11, 0, 12, 16], "texture": "#side"},
"west": {"uv": [4, 0, 5, 16], "texture": "#side"},
"up": {"uv": [5, 4, 11, 5], "texture": "#top", "cullface": "up"},
"down": {"uv": [5, 11, 11, 12], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [8, 0, 5],
"to": [11, 16, 8],
"faces": {
"east": {"uv": [8, 0, 11, 16], "texture": "#side"},
"south": {"uv": [8, 0, 11, 16], "texture": "#side"},
"up": {"uv": [8, 5, 11, 8], "texture": "#top", "cullface": "up"},
"down": {"uv": [8, 8, 11, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 0, 8],
"to": [8, 16, 11],
"faces": {
"east": {"uv": [5, 0, 8, 16], "texture": "#side"},
"south": {"uv": [5, 0, 8, 16], "texture": "#side"},
"up": {"uv": [5, 8, 8, 11], "texture": "#top", "cullface": "up"},
"down": {"uv": [5, 5, 8, 8], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 0, 5],
"to": [8, 16, 8],
"faces": {
"up": {"uv": [5, 5, 8, 8], "texture": "#top", "cullface": "up"},
"down": {"uv": [5, 8, 8, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [4, 0, 5],
"to": [5, 16, 11],
"faces": {
"north": {"uv": [11, 0, 12, 16], "texture": "#side"},
"south": {"uv": [4, 0, 5, 16], "texture": "#side"},
"up": {"uv": [4, 5, 5, 11], "texture": "#top", "cullface": "up"},
"down": {"uv": [4, 5, 5, 11], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,96 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [5, 0, 4],
"to": [11, 16, 5],
"faces": {
"east": {"uv": [11, 0, 12, 16], "texture": "#side"},
"west": {"uv": [4, 0, 5, 16], "texture": "#side"},
"up": {"uv": [5, 4, 11, 5], "texture": "#top", "cullface": "up"},
"down": {"uv": [5, 11, 11, 12], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 0, 11],
"to": [11, 14, 12],
"faces": {
"east": {"uv": [4, 2, 5, 16], "texture": "#side"},
"west": {"uv": [11, 2, 12, 16], "texture": "#side"},
"up": {"uv": [5, 11, 11, 12], "texture": "#top"},
"down": {"uv": [5, 4, 11, 5], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 0, 8],
"to": [8, 14, 11],
"faces": {
"up": {"uv": [5, 8, 8, 11], "texture": "#top"},
"down": {"uv": [5, 5, 8, 8], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [8, 14, 8],
"to": [11, 16, 11],
"faces": {
"south": {"uv": [8, 0, 11, 2], "texture": "#side"},
"west": {"uv": [8, 0, 11, 2], "texture": "#side"},
"up": {"uv": [8, 8, 11, 11], "texture": "#top", "cullface": "up"}
}
},
{
"from": [8, 14, 5],
"to": [11, 16, 8],
"faces": {
"up": {"uv": [8, 5, 11, 8], "texture": "#top", "cullface": "up"}
}
},
{
"from": [5, 14, 5],
"to": [8, 16, 8],
"faces": {
"south": {"uv": [5, 0, 8, 2], "texture": "#side"},
"west": {"uv": [5, 0, 8, 2], "texture": "#side"},
"up": {"uv": [5, 5, 8, 8], "texture": "#top", "cullface": "up"}
}
},
{
"from": [8, 0, 5],
"to": [11, 14, 11],
"faces": {
"down": {"uv": [8, 5, 11, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 0, 5],
"to": [8, 14, 8],
"faces": {
"down": {"uv": [5, 8, 8, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [4, 0, 5],
"to": [5, 14, 11],
"faces": {
"north": {"uv": [11, 2, 12, 16], "texture": "#side"},
"south": {"uv": [4, 2, 5, 16], "texture": "#side"},
"up": {"uv": [4, 5, 5, 11], "texture": "#top"},
"down": {"uv": [4, 5, 5, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [11, 0, 5],
"to": [12, 16, 11],
"faces": {
"north": {"uv": [4, 0, 5, 16], "texture": "#side"},
"south": {"uv": [11, 0, 12, 16], "texture": "#side"},
"up": {"uv": [11, 5, 12, 11], "texture": "#top", "cullface": "up"},
"down": {"uv": [11, 5, 12, 11], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,88 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [5, 0, 4],
"to": [11, 16, 5],
"faces": {
"east": {"uv": [11, 0, 12, 16], "texture": "#side"},
"west": {"uv": [4, 0, 5, 16], "texture": "#side"},
"up": {"uv": [5, 4, 11, 5], "texture": "#top", "cullface": "up"},
"down": {"uv": [5, 11, 11, 12], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 0, 8],
"to": [8, 14, 11],
"faces": {
"south": {"uv": [5, 2, 8, 16], "texture": "#side"},
"up": {"uv": [5, 8, 8, 11], "texture": "#top"},
"down": {"uv": [5, 5, 8, 8], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 14, 5],
"to": [8, 16, 8],
"faces": {
"south": {"uv": [5, 0, 8, 2], "texture": "#side"},
"west": {"uv": [5, 0, 8, 2], "texture": "#side"},
"up": {"uv": [5, 5, 8, 8], "texture": "#top", "cullface": "up"}
}
},
{
"from": [8, 14, 8],
"to": [11, 16, 11],
"faces": {
"south": {"uv": [8, 0, 11, 2], "texture": "#side"},
"west": {"uv": [8, 0, 11, 2], "texture": "#side"},
"up": {"uv": [8, 8, 11, 11], "texture": "#top", "cullface": "up"}
}
},
{
"from": [8, 14, 5],
"to": [11, 16, 8],
"faces": {
"up": {"uv": [8, 5, 11, 8], "texture": "#top", "cullface": "up"}
}
},
{
"from": [5, 0, 5],
"to": [11, 14, 8],
"faces": {
"down": {"uv": [5, 8, 11, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [8, 0, 8],
"to": [11, 14, 11],
"faces": {
"south": {"uv": [8, 2, 11, 16], "texture": "#side"},
"down": {"uv": [8, 5, 11, 8], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [11, 0, 5],
"to": [12, 16, 11],
"faces": {
"north": {"uv": [4, 0, 5, 16], "texture": "#side"},
"south": {"uv": [11, 0, 12, 16], "texture": "#side"},
"up": {"uv": [11, 5, 12, 11], "texture": "#top", "cullface": "up"},
"down": {"uv": [11, 5, 12, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [4, 0, 5],
"to": [5, 14, 11],
"faces": {
"north": {"uv": [11, 2, 12, 16], "texture": "#side"},
"south": {"uv": [4, 2, 5, 16], "texture": "#side"},
"up": {"uv": [4, 5, 5, 11], "texture": "#top"},
"down": {"uv": [4, 5, 5, 11], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,19 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [5, 0, 4],
"to": [11, 16, 12],
"faces": {
"east": {"uv": [4, 0, 12, 16], "texture": "#side"},
"west": {"uv": [4, 0, 12, 16], "texture": "#side"},
"up": {"uv": [5, 4, 11, 12], "texture": "#top", "cullface": "up"},
"down": {"uv": [5, 4, 11, 12], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,65 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [5, 0, 4],
"to": [11, 14, 5],
"faces": {
"east": {"uv": [11, 0, 12, 16], "texture": "#side"},
"west": {"uv": [4, 0, 5, 16], "texture": "#side"},
"up": {"uv": [5, 4, 11, 5], "texture": "#top"},
"down": {"uv": [5, 11, 11, 12], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 0, 11],
"to": [11, 14, 12],
"faces": {
"east": {"uv": [4, 2, 5, 16], "texture": "#side"},
"west": {"uv": [11, 2, 12, 16], "texture": "#side"},
"up": {"uv": [5, 11, 11, 12], "texture": "#top"},
"down": {"uv": [5, 4, 11, 5], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 14, 5],
"to": [11, 16, 11],
"faces": {
"north": {"uv": [5, 0, 11, 2], "texture": "#side"},
"south": {"uv": [5, 0, 11, 2], "texture": "#side"},
"up": {"uv": [5, 5, 11, 11], "texture": "#top", "cullface": "up"}
}
},
{
"from": [5, 0, 5],
"to": [11, 14, 11],
"faces": {
"down": {"uv": [5, 5, 11, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [4, 0, 5],
"to": [5, 16, 11],
"faces": {
"north": {"uv": [11, 0, 12, 16], "texture": "#side"},
"south": {"uv": [4, 0, 5, 16], "texture": "#side"},
"up": {"uv": [4, 5, 5, 11], "texture": "#top", "cullface": "up"},
"down": {"uv": [4, 5, 5, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [11, 0, 5],
"to": [12, 16, 11],
"faces": {
"north": {"uv": [4, 0, 5, 16], "texture": "#side"},
"south": {"uv": [11, 0, 12, 16], "texture": "#side"},
"up": {"uv": [11, 5, 12, 11], "texture": "#top", "cullface": "up"},
"down": {"uv": [11, 5, 12, 11], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,56 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [5, 0, 4],
"to": [11, 14, 5],
"faces": {
"east": {"uv": [11, 2, 12, 16], "texture": "#side"},
"west": {"uv": [4, 2, 5, 16], "texture": "#side"},
"up": {"uv": [5, 4, 11, 5], "texture": "#top"},
"down": {"uv": [5, 11, 11, 12], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 14, 5],
"to": [11, 16, 11],
"faces": {
"north": {"uv": [5, 0, 11, 2], "texture": "#side"},
"south": {"uv": [5, 0, 11, 2], "texture": "#side"},
"up": {"uv": [5, 5, 11, 11], "texture": "#top", "cullface": "up"}
}
},
{
"from": [5, 0, 5],
"to": [11, 14, 11],
"faces": {
"south": {"uv": [5, 2, 11, 16], "texture": "#side"},
"down": {"uv": [5, 5, 11, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [4, 0, 5],
"to": [5, 16, 11],
"faces": {
"north": {"uv": [11, 0, 12, 16], "texture": "#side"},
"south": {"uv": [4, 0, 5, 16], "texture": "#side"},
"up": {"uv": [4, 5, 5, 11], "texture": "#top", "cullface": "up"},
"down": {"uv": [4, 5, 5, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [11, 0, 5],
"to": [12, 16, 11],
"faces": {
"north": {"uv": [4, 0, 5, 16], "texture": "#side"},
"south": {"uv": [11, 0, 12, 16], "texture": "#side"},
"up": {"uv": [11, 5, 12, 11], "texture": "#top", "cullface": "up"},
"down": {"uv": [11, 5, 12, 11], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,65 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [5, 0, 4],
"to": [11, 16, 5],
"faces": {
"east": {"uv": [11, 0, 12, 16], "texture": "#side"},
"west": {"uv": [4, 0, 5, 16], "texture": "#side"},
"up": {"uv": [5, 4, 11, 5], "texture": "#top", "cullface": "up"},
"down": {"uv": [5, 11, 11, 12], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 0, 8],
"to": [8, 14, 11],
"faces": {
"east": {"uv": [5, 2, 8, 16], "texture": "#side"},
"south": {"uv": [5, 2, 8, 16], "texture": "#side"},
"up": {"uv": [5, 8, 8, 11], "texture": "#top"},
"down": {"uv": [5, 5, 8, 8], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 14, 5],
"to": [8, 16, 8],
"faces": {
"south": {"uv": [5, 0, 8, 2], "texture": "#side"},
"west": {"uv": [5, 0, 8, 2], "texture": "#side"},
"up": {"uv": [5, 5, 8, 8], "texture": "#top", "cullface": "up"}
}
},
{
"from": [8, 0, 5],
"to": [11, 16, 8],
"faces": {
"east": {"uv": [8, 0, 11, 16], "texture": "#side"},
"south": {"uv": [8, 0, 11, 16], "texture": "#side"},
"up": {"uv": [8, 5, 11, 8], "texture": "#top", "cullface": "up"},
"down": {"uv": [8, 8, 11, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 0, 5],
"to": [8, 14, 8],
"faces": {
"down": {"uv": [5, 8, 8, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [4, 0, 5],
"to": [5, 14, 11],
"faces": {
"north": {"uv": [11, 2, 12, 16], "texture": "#side"},
"south": {"uv": [4, 2, 5, 16], "texture": "#side"},
"up": {"uv": [4, 5, 5, 11], "texture": "#top"},
"down": {"uv": [4, 5, 5, 11], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,66 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [5, 0, 4],
"to": [11, 14, 5],
"faces": {
"east": {"uv": [11, 2, 12, 16], "texture": "#side"},
"west": {"uv": [4, 2, 5, 16], "texture": "#side"},
"up": {"uv": [5, 4, 11, 5], "texture": "#top"},
"down": {"uv": [5, 11, 11, 12], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 0, 5],
"to": [8, 14, 11],
"faces": {
"south": {"uv": [5, 2, 8, 16], "texture": "#side"},
"up": {"uv": [5, 5, 8, 11], "texture": "#top"},
"down": {"uv": [5, 5, 8, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [8, 14, 5],
"to": [11, 16, 11],
"faces": {
"north": {"uv": [5, 0, 8, 2], "texture": "#side"},
"south": {"uv": [8, 0, 11, 2], "texture": "#side"},
"west": {"uv": [5, 0, 11, 2], "texture": "#side"},
"up": {"uv": [8, 5, 11, 11], "texture": "#top", "cullface": "up"}
}
},
{
"from": [8, 0, 5],
"to": [11, 14, 11],
"faces": {
"south": {"uv": [8, 2, 11, 16], "texture": "#side"},
"down": {"uv": [8, 5, 11, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [4, 0, 5],
"to": [5, 14, 11],
"faces": {
"north": {"uv": [11, 2, 12, 16], "texture": "#side"},
"south": {"uv": [4, 2, 5, 16], "texture": "#side"},
"up": {"uv": [4, 5, 5, 11], "texture": "#top"},
"down": {"uv": [4, 5, 5, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [11, 0, 5],
"to": [12, 16, 11],
"faces": {
"north": {"uv": [4, 0, 5, 16], "texture": "#side"},
"south": {"uv": [11, 0, 12, 16], "texture": "#side"},
"up": {"uv": [11, 5, 12, 11], "texture": "#top", "cullface": "up"},
"down": {"uv": [11, 5, 12, 11], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,74 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [5, 0, 4],
"to": [11, 14, 5],
"faces": {
"east": {"uv": [11, 2, 12, 16], "texture": "#side"},
"west": {"uv": [4, 2, 5, 16], "texture": "#side"},
"up": {"uv": [5, 4, 11, 5], "texture": "#top"},
"down": {"uv": [5, 11, 11, 12], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 0, 11],
"to": [11, 14, 12],
"faces": {
"east": {"uv": [4, 2, 5, 16], "texture": "#side"},
"west": {"uv": [11, 2, 12, 16], "texture": "#side"},
"up": {"uv": [5, 11, 11, 12], "texture": "#top"},
"down": {"uv": [5, 4, 11, 5], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 0, 5],
"to": [8, 14, 11],
"faces": {
"up": {"uv": [5, 5, 8, 11], "texture": "#top"},
"down": {"uv": [5, 5, 8, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [8, 14, 5],
"to": [11, 16, 11],
"faces": {
"north": {"uv": [5, 0, 8, 2], "texture": "#side"},
"south": {"uv": [8, 0, 11, 2], "texture": "#side"},
"west": {"uv": [5, 0, 11, 2], "texture": "#side"},
"up": {"uv": [8, 5, 11, 11], "texture": "#top", "cullface": "up"}
}
},
{
"from": [8, 0, 5],
"to": [11, 14, 11],
"faces": {
"down": {"uv": [8, 5, 11, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [4, 0, 5],
"to": [5, 14, 11],
"faces": {
"north": {"uv": [11, 2, 12, 16], "texture": "#side"},
"south": {"uv": [4, 2, 5, 16], "texture": "#side"},
"up": {"uv": [4, 5, 5, 11], "texture": "#top"},
"down": {"uv": [4, 5, 5, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [11, 0, 5],
"to": [12, 16, 11],
"faces": {
"north": {"uv": [4, 0, 5, 16], "texture": "#side"},
"south": {"uv": [11, 0, 12, 16], "texture": "#side"},
"up": {"uv": [11, 5, 12, 11], "texture": "#top", "cullface": "up"},
"down": {"uv": [11, 5, 12, 11], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,48 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [5, 0, 4],
"to": [11, 16, 5],
"faces": {
"east": {"uv": [11, 0, 12, 16], "texture": "#side"},
"west": {"uv": [4, 0, 5, 16], "texture": "#side"},
"up": {"uv": [5, 4, 11, 5], "texture": "#top", "cullface": "up"},
"down": {"uv": [5, 11, 11, 12], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 0, 5],
"to": [11, 16, 11],
"faces": {
"south": {"uv": [5, 0, 11, 16], "texture": "#side"},
"up": {"uv": [5, 5, 11, 11], "texture": "#top", "cullface": "up"},
"down": {"uv": [5, 5, 11, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [4, 0, 5],
"to": [5, 16, 11],
"faces": {
"north": {"uv": [11, 0, 12, 16], "texture": "#side"},
"south": {"uv": [4, 0, 5, 16], "texture": "#side"},
"up": {"uv": [4, 5, 5, 11], "texture": "#top", "cullface": "up"},
"down": {"uv": [4, 5, 5, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [11, 0, 5],
"to": [12, 16, 11],
"faces": {
"north": {"uv": [4, 0, 5, 16], "texture": "#side"},
"south": {"uv": [11, 0, 12, 16], "texture": "#side"},
"up": {"uv": [11, 5, 12, 11], "texture": "#top", "cullface": "up"},
"down": {"uv": [11, 5, 12, 11], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,64 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [5, 0, 4],
"to": [11, 16, 5],
"faces": {
"east": {"uv": [11, 0, 12, 16], "texture": "#side"},
"west": {"uv": [4, 0, 5, 16], "texture": "#side"},
"up": {"uv": [5, 4, 11, 5], "texture": "#top", "cullface": "up"},
"down": {"uv": [5, 11, 11, 12], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 0, 11],
"to": [11, 14, 12],
"faces": {
"east": {"uv": [4, 2, 5, 16], "texture": "#side"},
"west": {"uv": [11, 2, 12, 16], "texture": "#side"},
"up": {"uv": [5, 11, 11, 12], "texture": "#top"},
"down": {"uv": [5, 4, 11, 5], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 14, 5],
"to": [11, 16, 11],
"faces": {
"south": {"uv": [5, 0, 11, 2], "texture": "#side"},
"up": {"uv": [5, 5, 11, 11], "texture": "#top", "cullface": "up"}
}
},
{
"from": [5, 0, 5],
"to": [11, 14, 11],
"faces": {
"down": {"uv": [5, 5, 11, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [4, 0, 5],
"to": [5, 16, 11],
"faces": {
"north": {"uv": [11, 0, 12, 16], "texture": "#side"},
"south": {"uv": [4, 0, 5, 16], "texture": "#side"},
"up": {"uv": [4, 5, 5, 11], "texture": "#top", "cullface": "up"},
"down": {"uv": [4, 5, 5, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [11, 0, 5],
"to": [12, 16, 11],
"faces": {
"north": {"uv": [4, 0, 5, 16], "texture": "#side"},
"south": {"uv": [11, 0, 12, 16], "texture": "#side"},
"up": {"uv": [11, 5, 12, 11], "texture": "#top", "cullface": "up"},
"down": {"uv": [11, 5, 12, 11], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,57 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [5, 0, 4],
"to": [11, 16, 5],
"faces": {
"east": {"uv": [11, 0, 12, 16], "texture": "#side"},
"west": {"uv": [4, 0, 5, 16], "texture": "#side"},
"up": {"uv": [5, 4, 11, 5], "texture": "#top", "cullface": "up"},
"down": {"uv": [5, 11, 11, 12], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 0, 11],
"to": [11, 16, 12],
"faces": {
"east": {"uv": [4, 0, 5, 16], "texture": "#side"},
"west": {"uv": [11, 0, 12, 16], "texture": "#side"},
"up": {"uv": [5, 11, 11, 12], "texture": "#top", "cullface": "up"},
"down": {"uv": [5, 4, 11, 5], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 0, 5],
"to": [11, 16, 11],
"faces": {
"up": {"uv": [5, 5, 11, 11], "texture": "#top", "cullface": "up"},
"down": {"uv": [5, 5, 11, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [4, 0, 5],
"to": [5, 16, 11],
"faces": {
"north": {"uv": [11, 0, 12, 16], "texture": "#side"},
"south": {"uv": [4, 0, 5, 16], "texture": "#side"},
"up": {"uv": [4, 5, 5, 11], "texture": "#top", "cullface": "up"},
"down": {"uv": [4, 5, 5, 11], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [11, 0, 5],
"to": [12, 16, 11],
"faces": {
"north": {"uv": [4, 0, 5, 16], "texture": "#side"},
"south": {"uv": [11, 0, 12, 16], "texture": "#side"},
"up": {"uv": [11, 5, 12, 11], "texture": "#top", "cullface": "up"},
"down": {"uv": [11, 5, 12, 11], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,17 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [5, 0, 5],
"to": [11, 16, 11],
"faces": {
"up": {"uv": [5, 5, 11, 11], "texture": "#top", "cullface": "up"},
"down": {"uv": [5, 5, 11, 11], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,34 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [4, 0, 4],
"to": [5, 14, 5],
"faces": {
"north": {"uv": [11, 2, 12, 16], "texture": "#side"},
"west": {"uv": [4, 2, 5, 16], "texture": "#side"},
"down": {"uv": [4, 11, 5, 12], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 0, 4],
"to": [11, 14, 5],
"faces": {
"down": {"uv": [5, 11, 11, 12], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [4, 14, 4],
"to": [11, 16, 5],
"faces": {
"north": {"uv": [5, 0, 12, 2], "texture": "#side"},
"west": {"uv": [4, 0, 5, 2], "texture": "#side"},
"up": {"uv": [5, 4, 12, 5], "texture": "#top", "cullface": "up"}
}
}
]
}

View File

@ -0,0 +1,28 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [4, 0, 4],
"to": [5, 16, 5],
"faces": {
"north": {"uv": [11, 0, 12, 16], "texture": "#side"},
"west": {"uv": [4, 0, 5, 16], "texture": "#side"},
"up": {"uv": [4, 4, 5, 5], "texture": "#top", "cullface": "up"},
"down": {"uv": [4, 11, 5, 12], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 0, 4],
"to": [11, 16, 5],
"faces": {
"north": {"uv": [5, 0, 11, 16], "texture": "#side"},
"up": {"uv": [5, 4, 11, 5], "texture": "#top", "cullface": "up"},
"down": {"uv": [5, 11, 11, 12], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,27 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [4, 0, 4],
"to": [5, 16, 5],
"faces": {
"north": {"uv": [11, 0, 12, 16], "texture": "#side"},
"west": {"uv": [4, 0, 5, 16], "texture": "#side"},
"up": {"uv": [4, 4, 5, 5], "texture": "#top", "cullface": "up"},
"down": {"uv": [4, 11, 5, 12], "texture": "#bottom", "cullface": "down"}
}
},
{
"from": [5, 0, 4],
"to": [11, 16, 5],
"faces": {
"up": {"uv": [5, 4, 11, 5], "texture": "#top", "cullface": "up"},
"down": {"uv": [5, 11, 11, 12], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,20 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [5, 0, 0],
"to": [11, 14, 4],
"faces": {
"north": {"uv": [5, 2, 11, 16], "texture": "#side", "cullface": "north"},
"east": {"uv": [12, 2, 16, 16], "texture": "#side"},
"west": {"uv": [0, 2, 4, 16], "texture": "#side"},
"up": {"uv": [5, 0, 11, 4], "texture": "#top"},
"down": {"uv": [5, 12, 11, 16], "texture": "#bottom", "cullface": "down"}
}
}
]
}

View File

@ -0,0 +1,20 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{
"from": [5, 0, 0],
"to": [11, 16, 4],
"faces": {
"north": {"uv": [5, 0, 11, 16], "texture": "#side", "cullface": "north"},
"east": {"uv": [12, 0, 16, 16], "texture": "#side"},
"west": {"uv": [0, 0, 4, 16], "texture": "#side"},
"up": {"uv": [5, 0, 11, 4], "texture": "#top", "cullface": "up"},
"down": {"uv": [5, 12, 11, 16], "texture": "#bottom", "cullface": "down"}
}
}
]
}