Fence and wall templates!

This commit is contained in:
quat1024 2023-07-06 00:45:12 -04:00
parent b2b18e294c
commit 8d0e3ea912
25 changed files with 1042 additions and 10 deletions

View File

@ -2,9 +2,11 @@ package io.github.cottonmc.templates;
import io.github.cottonmc.templates.api.TemplateInteractionUtil; import io.github.cottonmc.templates.api.TemplateInteractionUtil;
import io.github.cottonmc.templates.block.TemplateBlock; import io.github.cottonmc.templates.block.TemplateBlock;
import io.github.cottonmc.templates.block.TemplateFenceBlock;
import io.github.cottonmc.templates.block.TemplateSlabBlock; import io.github.cottonmc.templates.block.TemplateSlabBlock;
import io.github.cottonmc.templates.block.TemplateSlopeBlock; import io.github.cottonmc.templates.block.TemplateSlopeBlock;
import io.github.cottonmc.templates.block.TemplateEntity; import io.github.cottonmc.templates.block.TemplateEntity;
import io.github.cottonmc.templates.block.TemplateWallBlock;
import net.fabricmc.api.ModInitializer; import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup; import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup;
import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder; import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder;
@ -28,13 +30,15 @@ public class Templates implements ModInitializer {
public static final String MODID = "templates"; public static final String MODID = "templates";
public static final Block CUBE = Registry.register(Registries.BLOCK, id("cube"), new TemplateBlock(TemplateInteractionUtil.makeSettings())); public static final Block CUBE = Registry.register(Registries.BLOCK, id("cube"), new TemplateBlock(TemplateInteractionUtil.makeSettings()));
public static final Block SLOPE = Registry.register(Registries.BLOCK, id("slope"), new TemplateSlopeBlock(TemplateInteractionUtil.makeSettings())); public static final Block FENCE = Registry.register(Registries.BLOCK, id("fence"), new TemplateFenceBlock(TemplateInteractionUtil.makeSettings()));
public static final Block SLAB = Registry.register(Registries.BLOCK, id("slab"), new TemplateSlabBlock(TemplateInteractionUtil.makeSettings())); public static final Block SLAB = Registry.register(Registries.BLOCK, id("slab"), new TemplateSlabBlock(TemplateInteractionUtil.makeSettings()));
public static final Block SLOPE = Registry.register(Registries.BLOCK, id("slope"), new TemplateSlopeBlock(TemplateInteractionUtil.makeSettings()));
public static final Block WALL = Registry.register(Registries.BLOCK, id("wall"), new TemplateWallBlock(TemplateInteractionUtil.makeSettings()));
//N.B. it's fine to make your own block entity type instead of gluing additional blocks to this one //N.B. it's fine to make your own block entity type instead of gluing additional blocks to this one
public static final BlockEntityType<TemplateEntity> TEMPLATE_BLOCK_ENTITY = Registry.register( public static final BlockEntityType<TemplateEntity> TEMPLATE_BLOCK_ENTITY = Registry.register(
Registries.BLOCK_ENTITY_TYPE, id("slope"), Registries.BLOCK_ENTITY_TYPE, id("slope"),
FabricBlockEntityTypeBuilder.create(Templates::makeTemplateBlockEntity, CUBE, SLOPE, SLAB).build(null) FabricBlockEntityTypeBuilder.create(Templates::makeTemplateBlockEntity, CUBE, FENCE, SLAB, SLOPE, WALL).build(null)
); );
@SuppressWarnings("unused") @SuppressWarnings("unused")
@ -53,8 +57,10 @@ public class Templates implements ModInitializer {
@Override @Override
public void onInitialize() { public void onInitialize() {
Registry.register(Registries.ITEM, id("cube"), new BlockItem(CUBE, new Item.Settings())); Registry.register(Registries.ITEM, id("cube"), new BlockItem(CUBE, new Item.Settings()));
Registry.register(Registries.ITEM, id("slope"), new BlockItem(SLOPE, new Item.Settings())); Registry.register(Registries.ITEM, id("fence"), new BlockItem(FENCE, new Item.Settings()));
Registry.register(Registries.ITEM, id("slab"), new BlockItem(SLAB, new Item.Settings())); Registry.register(Registries.ITEM, id("slab"), new BlockItem(SLAB, new Item.Settings()));
Registry.register(Registries.ITEM, id("slope"), new BlockItem(SLOPE, new Item.Settings()));
Registry.register(Registries.ITEM, id("wall"), new BlockItem(WALL, new Item.Settings()));
} }
public static Identifier id(String path) { public static Identifier id(String path) {
@ -68,7 +74,9 @@ public class Templates implements ModInitializer {
private static void fillItemGroup(ItemGroup.DisplayContext ctx, ItemGroup.Entries ent) { private static void fillItemGroup(ItemGroup.DisplayContext ctx, ItemGroup.Entries ent) {
ent.add(CUBE); ent.add(CUBE);
ent.add(SLOPE); ent.add(FENCE);
ent.add(SLAB); ent.add(SLAB);
ent.add(SLOPE);
ent.add(WALL);
} }
} }

View File

@ -54,15 +54,24 @@ public class TemplatesClient implements ClientModInitializer {
ModelLoadingRegistry.INSTANCE.registerResourceProvider(rm -> provider); //block models ModelLoadingRegistry.INSTANCE.registerResourceProvider(rm -> provider); //block models
ModelLoadingRegistry.INSTANCE.registerVariantProvider(rm -> provider); //item models ModelLoadingRegistry.INSTANCE.registerVariantProvider(rm -> provider); //item models
BlockRenderLayerMap.INSTANCE.putBlocks(RenderLayer.getCutout(), Templates.CUBE, Templates.SLOPE, Templates.SLAB); BlockRenderLayerMap.INSTANCE.putBlocks(RenderLayer.getCutout(), Templates.CUBE, Templates.FENCE, Templates.SLAB, Templates.SLOPE, Templates.WALL);
provider.addTemplateModel(Templates.id("cube_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/cube"))); provider.addTemplateModel(Templates.id("cube_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/cube")));
provider.addTemplateModel(Templates.id("fence_post_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/fence_post")));
provider.addTemplateModel(Templates.id("fence_side_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/fence_side")));
provider.addTemplateModel(Templates.id("fence_inventory_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/fence_inventory")));
provider.addTemplateModel(Templates.id("slab_bottom_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/slab_bottom"))); provider.addTemplateModel(Templates.id("slab_bottom_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/slab_bottom")));
provider.addTemplateModel(Templates.id("slab_top_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/slab_top"))); provider.addTemplateModel(Templates.id("slab_top_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/slab_top")));
provider.addTemplateModel(Templates.id("slope_special"), new RetexturedMeshUnbakedModel(Templates.id("block/slope_base"), SlopeBaseMesh::make)); provider.addTemplateModel(Templates.id("slope_special"), new RetexturedMeshUnbakedModel(Templates.id("block/slope_base"), SlopeBaseMesh::make));
provider.addTemplateModel(Templates.id("wall_inventory_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/wall_inventory")));
provider.addTemplateModel(Templates.id("wall_post_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/wall_post")));
provider.addTemplateModel(Templates.id("wall_side_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/wall_side")));
provider.addTemplateModel(Templates.id("wall_side_tall_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/wall_side_tall")));
provider.assignItemModel(Templates.id("cube_special"), Templates.CUBE); provider.assignItemModel(Templates.id("cube_special"), Templates.CUBE);
provider.assignItemModel(Templates.id("fence_inventory_special"), Templates.FENCE);
provider.assignItemModel(Templates.id("slope_special"), Templates.SLOPE); provider.assignItemModel(Templates.id("slope_special"), Templates.SLOPE);
provider.assignItemModel(Templates.id("slab_bottom_special"), Templates.SLAB); provider.assignItemModel(Templates.id("slab_bottom_special"), Templates.SLAB);
provider.assignItemModel(Templates.id("wall_inventory_special"), Templates.WALL);
} }
} }

View File

@ -0,0 +1,78 @@
package io.github.cottonmc.templates.block;
import com.google.common.base.MoreObjects;
import io.github.cottonmc.templates.Templates;
import io.github.cottonmc.templates.api.TemplateInteractionUtil;
import net.minecraft.block.Block;
import net.minecraft.block.BlockEntityProvider;
import net.minecraft.block.BlockState;
import net.minecraft.block.FenceBlock;
import net.minecraft.block.ShapeContext;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.state.StateManager;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand;
import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.util.shape.VoxelShape;
import net.minecraft.world.BlockView;
import net.minecraft.world.World;
import org.jetbrains.annotations.Nullable;
public class TemplateFenceBlock extends FenceBlock implements BlockEntityProvider {
public TemplateFenceBlock(Settings settings) {
super(settings);
setDefaultState(TemplateInteractionUtil.setDefaultStates(getDefaultState()));
}
@Nullable
@Override
public BlockEntity createBlockEntity(BlockPos pos, BlockState state) {
return Templates.TEMPLATE_BLOCK_ENTITY.instantiate(pos, state);
}
@Override
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
super.appendProperties(TemplateInteractionUtil.appendProperties(builder));
}
@Override
public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
return TemplateInteractionUtil.onUse(state, world, pos, player, hand, hit);
}
@Override
public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) {
TemplateInteractionUtil.onStateReplaced(state, world, pos, newState, moved);
super.onStateReplaced(state, world, pos, newState, moved);
}
@Override
public void onPlaced(World world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) {
TemplateInteractionUtil.onPlaced(world, pos, state, placer, stack);
}
@Override
public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) {
return MoreObjects.firstNonNull(TemplateInteractionUtil.getCollisionShape(state), super.getCollisionShape(state, view, pos, ctx));
}
@Override
public boolean emitsRedstonePower(BlockState state) {
return TemplateInteractionUtil.emitsRedstonePower(state);
}
@Override
public int getWeakRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) {
return TemplateInteractionUtil.getWeakRedstonePower(state, view, pos, dir);
}
@Override
public int getStrongRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) {
return TemplateInteractionUtil.getStrongRedstonePower(state, view, pos, dir);
}
}

View File

@ -0,0 +1,121 @@
package io.github.cottonmc.templates.block;
import com.google.common.base.MoreObjects;
import io.github.cottonmc.templates.Templates;
import io.github.cottonmc.templates.api.TemplateInteractionUtil;
import io.github.cottonmc.templates.mixin.WallBlockAccessor;
import net.minecraft.block.Block;
import net.minecraft.block.BlockEntityProvider;
import net.minecraft.block.BlockState;
import net.minecraft.block.ShapeContext;
import net.minecraft.block.WallBlock;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.enums.WallShape;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.state.StateManager;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand;
import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.math.BlockPos;
import net.minecraft.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 org.jetbrains.annotations.Nullable;
import java.util.HashMap;
import java.util.Map;
public class TemplateWallBlock extends WallBlock implements BlockEntityProvider {
public TemplateWallBlock(Settings settings) {
super(settings);
setDefaultState(TemplateInteractionUtil.setDefaultStates(getDefaultState()));
initNewShapemaps(); //WallBlock specific haxx
}
@Nullable
@Override
public BlockEntity createBlockEntity(BlockPos pos, BlockState state) {
return Templates.TEMPLATE_BLOCK_ENTITY.instantiate(pos, state);
}
@Override
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
super.appendProperties(TemplateInteractionUtil.appendProperties(builder));
}
@Override
public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
return TemplateInteractionUtil.onUse(state, world, pos, player, hand, hit);
}
@Override
public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) {
TemplateInteractionUtil.onStateReplaced(state, world, pos, newState, moved);
super.onStateReplaced(state, world, pos, newState, moved);
}
@Override
public void onPlaced(World world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) {
TemplateInteractionUtil.onPlaced(world, pos, state, placer, stack);
}
@Override
public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) {
return MoreObjects.firstNonNull(TemplateInteractionUtil.getCollisionShape(state), getNewShape(state, newCollisionShapeMap));
}
@Override
public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) {
return getNewShape(state, newShapeMap);
}
@Override
public boolean emitsRedstonePower(BlockState state) {
return TemplateInteractionUtil.emitsRedstonePower(state);
}
@Override
public int getWeakRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) {
return TemplateInteractionUtil.getWeakRedstonePower(state, view, pos, dir);
}
@Override
public int getStrongRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) {
return TemplateInteractionUtil.getStrongRedstonePower(state, view, pos, dir);
}
//Shapemap heck (WallBlock has a map keyed on BlockState, but since we add more blockstates most of those map lookups fail)
protected static record ShapeKey(boolean up, WallShape north, WallShape east, WallShape south, WallShape west) {
static ShapeKey fromBlockstate(BlockState state) {
return new ShapeKey(
state.get(WallBlock.UP),
state.get(WallBlock.NORTH_SHAPE),
state.get(WallBlock.EAST_SHAPE),
state.get(WallBlock.SOUTH_SHAPE),
state.get(WallBlock.WEST_SHAPE)
);
}
}
protected Map<ShapeKey, VoxelShape> newShapeMap = new HashMap<>();
protected Map<ShapeKey, VoxelShape> newCollisionShapeMap = new HashMap<>();
protected void initNewShapemaps() {
initNewShapemap(((WallBlockAccessor) this).templates$getShapeMap(), newShapeMap);
initNewShapemap(((WallBlockAccessor) this).templates$getCollisionShapeMap(), newCollisionShapeMap);
}
protected void initNewShapemap(Map<BlockState, VoxelShape> oldShapeMap, Map<ShapeKey, VoxelShape> newShapeMap) {
oldShapeMap.forEach((state, shape) -> newShapeMap.putIfAbsent(ShapeKey.fromBlockstate(state), shape));
}
protected VoxelShape getNewShape(BlockState state, Map<ShapeKey, VoxelShape> shapes) {
return shapes.getOrDefault(ShapeKey.fromBlockstate(state), VoxelShapes.empty());
}
}

View File

@ -0,0 +1,15 @@
package io.github.cottonmc.templates.mixin;
import net.minecraft.block.BlockState;
import net.minecraft.block.WallBlock;
import net.minecraft.util.shape.VoxelShape;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import java.util.Map;
@Mixin(WallBlock.class)
public interface WallBlockAccessor {
@Accessor("shapeMap") Map<BlockState, VoxelShape> templates$getShapeMap();
@Accessor("collisionShapeMap") Map<BlockState, VoxelShape> templates$getCollisionShapeMap();
}

View File

@ -15,6 +15,7 @@ import net.fabricmc.fabric.api.rendering.data.v1.RenderAttachedBlockView;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.client.render.model.BakedModel; import net.minecraft.client.render.model.BakedModel;
import net.minecraft.client.render.model.BakedQuad; import net.minecraft.client.render.model.BakedQuad;
import net.minecraft.client.render.model.ModelBakeSettings;
import net.minecraft.client.texture.Sprite; import net.minecraft.client.texture.Sprite;
import net.minecraft.client.util.SpriteIdentifier; import net.minecraft.client.util.SpriteIdentifier;
import net.minecraft.item.BlockItem; import net.minecraft.item.BlockItem;
@ -29,15 +30,17 @@ import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.random.Random; import net.minecraft.util.math.random.Random;
import net.minecraft.world.BlockRenderView; import net.minecraft.world.BlockRenderView;
import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Supplier; import java.util.function.Supplier;
public class RetexturedJsonModelBakedModel extends ForwardingBakedModel { public class RetexturedJsonModelBakedModel extends ForwardingBakedModel {
public RetexturedJsonModelBakedModel(BakedModel baseModel, TemplateAppearanceManager tam, Function<SpriteIdentifier, Sprite> spriteLookup, BlockState itemModelState) { public RetexturedJsonModelBakedModel(BakedModel baseModel, TemplateAppearanceManager tam, ModelBakeSettings settings, Function<SpriteIdentifier, Sprite> spriteLookup, BlockState itemModelState) {
this.wrapped = baseModel; this.wrapped = baseModel;
this.tam = tam; this.tam = tam;
this.facePermutation = MeshTransformUtil.facePermutation(settings);
this.itemModelState = itemModelState; this.itemModelState = itemModelState;
for(int i = 0; i < DIRECTIONS.length; i++) { for(int i = 0; i < DIRECTIONS.length; i++) {
@ -47,6 +50,7 @@ public class RetexturedJsonModelBakedModel extends ForwardingBakedModel {
} }
private final TemplateAppearanceManager tam; private final TemplateAppearanceManager tam;
private final Map<Direction, Direction> facePermutation;
private final Sprite[] specialSprites = new Sprite[DIRECTIONS.length]; private final Sprite[] specialSprites = new Sprite[DIRECTIONS.length];
private final BlockState itemModelState; private final BlockState itemModelState;
@ -105,8 +109,8 @@ public class RetexturedJsonModelBakedModel extends ForwardingBakedModel {
bounds.remap( bounds.remap(
emitter, emitter,
specialSprites[i], specialSprites[i],
key.appearance().getSprite(DIRECTIONS[i]), key.appearance().getSprite(facePermutation.get(DIRECTIONS[i])),
key.appearance().getBakeFlags(DIRECTIONS[i]) key.appearance().getBakeFlags(facePermutation.get(DIRECTIONS[i]))
); );
break; break;
} }

View File

@ -45,6 +45,7 @@ public class RetexturedJsonModelUnbakedModel implements UnbakedModel {
return new RetexturedJsonModelBakedModel( return new RetexturedJsonModelBakedModel(
baker.bake(parent, modelBakeSettings), baker.bake(parent, modelBakeSettings),
TemplatesClient.provider.getOrCreateTemplateApperanceManager(spriteLookup), TemplatesClient.provider.getOrCreateTemplateApperanceManager(spriteLookup),
modelBakeSettings,
spriteLookup, spriteLookup,
itemModelState itemModelState
); );

View File

@ -0,0 +1,48 @@
{
"multipart": [
{
"apply": {
"model": "templates:fence_post_special"
}
},
{
"apply": {
"model": "templates:fence_side_special",
"uvlock": true
},
"when": {
"north": "true"
}
},
{
"apply": {
"model": "templates:fence_side_special",
"uvlock": true,
"y": 90
},
"when": {
"east": "true"
}
},
{
"apply": {
"model": "templates:fence_side_special",
"uvlock": true,
"y": 180
},
"when": {
"south": "true"
}
},
{
"apply": {
"model": "templates:fence_side_special",
"uvlock": true,
"y": 270
},
"when": {
"west": "true"
}
}
]
}

View File

@ -0,0 +1,90 @@
{
"multipart": [
{
"apply": {
"model": "templates:wall_post_special"
},
"when": {
"up": "true"
}
},
{
"apply": {
"model": "templates:wall_side_special",
"uvlock": true
},
"when": {
"north": "low"
}
},
{
"apply": {
"model": "templates:wall_side_special",
"uvlock": true,
"y": 90
},
"when": {
"east": "low"
}
},
{
"apply": {
"model": "templates:wall_side_special",
"uvlock": true,
"y": 180
},
"when": {
"south": "low"
}
},
{
"apply": {
"model": "templates:wall_side_special",
"uvlock": true,
"y": 270
},
"when": {
"west": "low"
}
},
{
"apply": {
"model": "templates:wall_side_tall_special",
"uvlock": true
},
"when": {
"north": "tall"
}
},
{
"apply": {
"model": "templates:wall_side_tall_special",
"uvlock": true,
"y": 90
},
"when": {
"east": "tall"
}
},
{
"apply": {
"model": "templates:wall_side_tall_special",
"uvlock": true,
"y": 180
},
"when": {
"south": "tall"
}
},
{
"apply": {
"model": "templates:wall_side_tall_special",
"uvlock": true,
"y": 270
},
"when": {
"west": "tall"
}
}
]
}

View File

@ -2,6 +2,8 @@
"itemGroup.templates.tab": "Templates", "itemGroup.templates.tab": "Templates",
"block.templates.cube": "Cube Template", "block.templates.cube": "Cube Template",
"block.templates.fence": "Fence Template",
"block.templates.slope": "Slope Template", "block.templates.slope": "Slope Template",
"block.templates.slab": "Slab Template" "block.templates.slab": "Slab Template",
"block.templates.wall": "Wall Template"
} }

View File

@ -0,0 +1,243 @@
{
"parent": "minecraft:block/block",
"textures": {
"down": "templates:templates_special/down",
"up": "templates:templates_special/up",
"north": "templates:templates_special/north",
"south": "templates:templates_special/south",
"west": "templates:templates_special/west",
"east": "templates:templates_special/east"
},
"display": {
"gui": {
"rotation": [30, 135, 0],
"translation": [0, 0, 0],
"scale": [0.625, 0.625, 0.625]
},
"fixed": {
"rotation": [0, 90, 0],
"translation": [0, 0, 0],
"scale": [0.5, 0.5, 0.5]
}
},
"elements": [
{
"from": [6, 0, 0],
"to": [10, 16, 4],
"faces": {
"down": {
"uv": [6, 0, 10, 4],
"texture": "#down",
"cullface": "down"
},
"up": {
"uv": [6, 0, 10, 4],
"texture": "#up"
},
"north": {
"uv": [6, 0, 10, 16],
"texture": "#north"
},
"south": {
"uv": [6, 0, 10, 16],
"texture": "#south"
},
"west": {
"uv": [0, 0, 4, 16],
"texture": "#west"
},
"east": {
"uv": [0, 0, 4, 16],
"texture": "#east"
}
},
"__comment": "Left post"
},
{
"from": [6, 0, 12],
"to": [10, 16, 16],
"faces": {
"down": {
"uv": [6, 12, 10, 16],
"texture": "#down",
"cullface": "down"
},
"up": {
"uv": [6, 12, 10, 16],
"texture": "#up"
},
"north": {
"uv": [6, 0, 10, 16],
"texture": "#north"
},
"south": {
"uv": [6, 0, 10, 16],
"texture": "#south"
},
"west": {
"uv": [12, 0, 16, 16],
"texture": "#west"
},
"east": {
"uv": [12, 0, 16, 16],
"texture": "#east"
}
},
"__comment": "Right post"
},
{
"from": [7, 12, 0],
"to": [9, 15, 16],
"faces": {
"down": {
"uv": [7, 0, 9, 16],
"texture": "#down"
},
"up": {
"uv": [7, 0, 9, 16],
"texture": "#up"
},
"west": {
"uv": [0, 1, 16, 4],
"texture": "#west"
},
"east": {
"uv": [0, 1, 16, 4],
"texture": "#east"
}
},
"__comment": "Top bar"
},
{
"from": [7, 12, -2],
"to": [9, 15, 0],
"faces": {
"down": {
"uv": [7, 0, 9, 2],
"texture": "#down"
},
"up": {
"uv": [7, 14, 9, 16],
"texture": "#up"
},
"north": {
"uv": [7, 1, 9, 4],
"texture": "#north"
},
"west": {
"uv": [14, 1, 16, 4],
"texture": "#west"
},
"east": {
"uv": [0, 1, 2, 4],
"texture": "#east"
}
},
"__comment": "Top bar left"
},
{
"from": [7, 12, 16],
"to": [9, 15, 18],
"faces": {
"down": {
"uv": [7, 14, 9, 16],
"texture": "#down"
},
"up": {
"uv": [7, 0, 9, 2],
"texture": "#up"
},
"south": {
"uv": [7, 1, 9, 4],
"texture": "#south"
},
"west": {
"uv": [0, 1, 2, 4],
"texture": "#west"
},
"east": {
"uv": [14, 1, 16, 4],
"texture": "#east"
}
},
"__comment": "Top bar right"
},
{
"from": [7, 6, 0],
"to": [9, 9, 16],
"faces": {
"down": {
"uv": [7, 0, 9, 16],
"texture": "#down"
},
"up": {
"uv": [7, 0, 9, 16],
"texture": "#up"
},
"west": {
"uv": [0, 7, 16, 10],
"texture": "#west"
},
"east": {
"uv": [0, 7, 16, 10],
"texture": "#east"
}
},
"__comment": "Lower bar"
},
{
"from": [7, 6, -2],
"to": [9, 9, 0],
"faces": {
"down": {
"uv": [7, 0, 9, 2],
"texture": "#down"
},
"up": {
"uv": [7, 14, 9, 16],
"texture": "#up"
},
"north": {
"uv": [7, 7, 9, 10],
"texture": "#north"
},
"west": {
"uv": [14, 7, 16, 10],
"texture": "#west"
},
"east": {
"uv": [0, 7, 2, 10],
"texture": "#east"
}
},
"__comment": "Lower bar left"
},
{
"from": [7, 6, 16],
"to": [9, 9, 18],
"faces": {
"down": {
"uv": [7, 14, 9, 16],
"texture": "#down"
},
"up": {
"uv": [7, 0, 9, 2],
"texture": "#up"
},
"south": {
"uv": [7, 7, 9, 10],
"texture": "#south"
},
"west": {
"uv": [0, 7, 2, 10],
"texture": "#west"
},
"east": {
"uv": [14, 7, 16, 10],
"texture": "#east"
}
},
"__comment": "Lower bar right"
}
]
}

View File

@ -0,0 +1,46 @@
{
"parent": "minecraft:block/block",
"textures": {
"down": "templates:templates_special/down",
"up": "templates:templates_special/up",
"north": "templates:templates_special/north",
"south": "templates:templates_special/south",
"west": "templates:templates_special/west",
"east": "templates:templates_special/east"
},
"elements": [
{
"from": [6, 0, 6],
"to": [10, 16, 10],
"faces": {
"down": {
"uv": [6, 6, 10, 10],
"texture": "#down",
"cullface": "down"
},
"up": {
"uv": [6, 6, 10, 10],
"texture": "#up",
"cullface": "up"
},
"north": {
"uv": [6, 0, 10, 16],
"texture": "#north"
},
"south": {
"uv": [6, 0, 10, 16],
"texture": "#south"
},
"west": {
"uv": [6, 0, 10, 16],
"texture": "#west"
},
"east": {
"uv": [6, 0, 10, 16],
"texture": "#east"
}
},
"__comment": "Center post"
}
]
}

View File

@ -0,0 +1,68 @@
{
"textures": {
"down": "templates:templates_special/down",
"up": "templates:templates_special/up",
"north": "templates:templates_special/north",
"south": "templates:templates_special/south",
"west": "templates:templates_special/west",
"east": "templates:templates_special/east"
},
"elements": [
{
"from": [7, 12, 0],
"to": [9, 15, 9],
"faces": {
"down": {
"uv": [7, 0, 9, 9],
"texture": "#down"
},
"up": {
"uv": [7, 0, 9, 9],
"texture": "#up"
},
"north": {
"uv": [7, 1, 9, 4],
"texture": "#north",
"cullface": "north"
},
"west": {
"uv": [0, 1, 9, 4],
"texture": "#west"
},
"east": {
"uv": [0, 1, 9, 4],
"texture": "#east"
}
},
"__comment": "top bar"
},
{
"from": [7, 6, 0],
"to": [9, 9, 9],
"faces": {
"down": {
"uv": [7, 0, 9, 9],
"texture": "#down"
},
"up": {
"uv": [7, 0, 9, 9],
"texture": "#up"
},
"north": {
"uv": [7, 7, 9, 10],
"texture": "#north",
"cullface": "north"
},
"west": {
"uv": [0, 7, 9, 10],
"texture": "#west"
},
"east": {
"uv": [0, 7, 9, 10],
"texture": "#east"
}
},
"__comment": "lower bar"
}
]
}

View File

@ -0,0 +1,91 @@
{
"parent": "block/block",
"textures": {
"down": "templates:templates_special/down",
"up": "templates:templates_special/up",
"north": "templates:templates_special/north",
"south": "templates:templates_special/south",
"west": "templates:templates_special/west",
"east": "templates:templates_special/east"
},
"display": {
"gui": {
"rotation": [30, 135, 0],
"translation": [0, 0, 0],
"scale": [0.625, 0.625, 0.625]
},
"fixed": {
"rotation": [0, 90, 0],
"translation": [0, 0, 0],
"scale": [0.5, 0.5, 0.5]
}
},
"elements": [
{
"from": [4, 0, 4],
"to": [12, 16, 12],
"faces": {
"down": {
"uv": [4, 4, 12, 12],
"texture": "#down",
"cullface": "down"
},
"up": {
"uv": [4, 4, 12, 12],
"texture": "#up"
},
"north": {
"uv": [4, 0, 12, 16],
"texture": "#north"
},
"south": {
"uv": [4, 0, 12, 16],
"texture": "#south"
},
"west": {
"uv": [4, 0, 12, 16],
"texture": "#west"
},
"east": {
"uv": [4, 0, 12, 16],
"texture": "#east"
}
},
"__comment": "Center post"
},
{
"from": [5, 0, 0],
"to": [11, 13, 16],
"faces": {
"down": {
"uv": [5, 0, 11, 16],
"texture": "#down",
"cullface": "down"
},
"up": {
"uv": [5, 0, 11, 16],
"texture": "#up"
},
"north": {
"uv": [5, 3, 11, 16],
"texture": "#north",
"cullface": "north"
},
"south": {
"uv": [5, 3, 11, 16],
"texture": "#south",
"cullface": "south"
},
"west": {
"uv": [0, 3, 16, 16],
"texture": "#west"
},
"east": {
"uv": [0, 3, 16, 16],
"texture": "#east"
}
},
"__comment": "Full wall"
}
]
}

View File

@ -0,0 +1,40 @@
{
"parent": "minecraft:block/block",
"textures": {
"down": "templates:templates_special/down",
"up": "templates:templates_special/up",
"north": "templates:templates_special/north",
"south": "templates:templates_special/south",
"west": "templates:templates_special/west",
"east": "templates:templates_special/east"
},
"elements": [
{
"from": [4, 0, 4],
"to": [12, 16, 12],
"faces": {
"down": {
"texture": "#down",
"cullface": "down"
},
"up": {
"texture": "#up",
"cullface": "up"
},
"north": {
"texture": "#north"
},
"south": {
"texture": "#south"
},
"west": {
"texture": "#west"
},
"east": {
"texture": "#east"
}
},
"__comment": "Center post"
}
]
}

View File

@ -0,0 +1,37 @@
{
"parent": "minecraft:block/block",
"textures": {
"down": "templates:templates_special/down",
"up": "templates:templates_special/up",
"north": "templates:templates_special/north",
"south": "templates:templates_special/south",
"west": "templates:templates_special/west",
"east": "templates:templates_special/east"
},
"elements": [
{
"from": [5, 0, 0],
"to": [11, 14, 8],
"faces": {
"down": {
"texture": "#down",
"cullface": "down"
},
"up": {
"texture": "#up"
},
"north": {
"texture": "#north",
"cullface": "north"
},
"west": {
"texture": "#west"
},
"east": {
"texture": "#east"
}
},
"__comment": "wall"
}
]
}

View File

@ -0,0 +1,37 @@
{
"parent": "minecraft:block/block",
"textures": {
"down": "templates:templates_special/down",
"up": "templates:templates_special/up",
"north": "templates:templates_special/north",
"south": "templates:templates_special/south",
"west": "templates:templates_special/west",
"east": "templates:templates_special/east"
},
"elements": [
{
"from": [5, 0, 0],
"to": [11, 16, 8],
"faces": {
"down": {
"texture": "#down",
"cullface": "down"
},
"up": {
"texture": "#up",
"cullface": "up"
},
"north": {
"texture": "#north",
"cullface": "north"
},
"west": {
"texture": "#west"
},
"east": {
"texture": "#east"
}
}
}
]
}

View File

@ -0,0 +1,6 @@
{
"replace": false,
"values": [
"templates:wall"
]
}

View File

@ -0,0 +1,6 @@
{
"replace": false,
"values": [
"templates:fence"
]
}

View File

@ -3,8 +3,10 @@
"rewards": { "rewards": {
"recipes": [ "recipes": [
"templates:cube", "templates:cube",
"templates:fence",
"templates:slab", "templates:slab",
"templates:slope" "templates:slope",
"templates:wall"
] ]
}, },
"criteria": { "criteria": {

View File

@ -0,0 +1,19 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "templates:fence"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View File

@ -0,0 +1,19 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "templates:wall"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View File

@ -0,0 +1,20 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"I~I",
"I~I"
],
"key": {
"I": {
"item": "minecraft:bamboo"
},
"~": {
"item": "minecraft:string"
}
},
"result": {
"item": "templates:fence",
"count": 8
},
"group": "templates"
}

View File

@ -0,0 +1,21 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
" ~ ",
"III",
"III"
],
"key": {
"I": {
"item": "minecraft:bamboo"
},
"~": {
"item": "minecraft:string"
}
},
"result": {
"item": "templates:wall",
"count": 8
},
"group": "templates"
}

View File

@ -3,6 +3,7 @@
"package": "io.github.cottonmc.templates.mixin", "package": "io.github.cottonmc.templates.mixin",
"compatibilityLevel": "JAVA_17", "compatibilityLevel": "JAVA_17",
"mixins": [ "mixins": [
"WallBlockAccessor",
"particles.MixinEntity", "particles.MixinEntity",
"particles.MixinLivingEntity" "particles.MixinLivingEntity"
], ],