Automatic face identifying vastly cuts down the amount of custom models needed

This commit is contained in:
quat1024 2023-07-09 00:43:55 -04:00
parent ab27f36134
commit db3730bb21
25 changed files with 156 additions and 1384 deletions

View File

@ -30,56 +30,42 @@ The only other requirement is that your block *must* have a block entity that bo
## Creating the custom model ## Creating the custom model
TL;DR: Look at `assets/templates/blockstates`, look at `assets/templates/models/block`, and look at the bottom of `TemplatesClient`. (TL;DR look at `assets/templates/blockstates` and the bottom of `TemplatesClient`)
### Using a JSON model To make a model retexturable, Templates has to know which faces you want to retexture, and which side of the block they correspond to. There are currently three ways to tell Templates your intentions:
We will construct a `RetexturedJsonModelUnbakedModel`. You need the ID of the json model to retexture. ### `UnbakedAutoRetexturedModel`
The base model can have a `parent` of anything you want. To make a surface retexturable, give it the texture `templates:templates_special/down`, `templates:templates_special/north`, `templates:templates_special/east` (etc). These textures will be *replaced* at runtime by the corresponding region of the corresponding texture of the template's theme block. (For example, a surface textured using `templates:templates_special/north` will look like the north side of the template's theme.) Pass the ID of a JSON model to retexture. All quads that face east will be textured with the east side of the theme, all quads that face up will be textured with the top side of the theme, etc. There is no way to skip a face.
If possible, I don't recommend making a wholly *new* json model. If you have an existing model that defines `north`, `south`, `east` etc texture variables, just use this: Most of Templates's blocks use this model.
```json **TODO**: this does not work well with `multipart` models with differently-rotated parts, like the fence model (consisting of 1 fence post and 1 fence-side model that gets rotated around to fill all 4 sides)
{
"parent": "yourmod:your/cool/json/model",
"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"
}
}
```
(If your model has texture variables that look more like `up/down/side` instead of `up/down/north/south/east/west`, you *can* cheat and assign something like `templates:templates_special/east` to the `side` texture slot - but imagine a player retexturing your template to look like a sideways log, which is not rotationally symmetric. It won't work as expected.) ### `UnbakedJsonRetexturedModel`
Finally, if your base model is a multipart model, *and* you plan on using it as an item model, I need a representative blockstate in order to select the correct configuration of the base model. Pick one and pass it as the second parameter to `RetexturedJsonModelUnbakedModel`. If the base model is not a multipart model, this is not required. Pass the ID of a JSON model to retexture. All quads textured with `templates:templates_special/east` will be textured with the east side of the theme, all quads textured with `templates:templates_special/up` will be retextured with the top side of the theme, etc. Quads textured with any other texture will be passed through unaltered.
That's all you need to construct a `RetexturedJsonModelUnbakedModel`, so to finish things off, [register it.](#registering-the-custom-model) Templates's lever uses this model - `AutoRetexturedModel` was not appropriate because I did not want to retexture the lever arm.
### Using a custom `Mesh`-based model (This works better with multipart models.)
If you have a shape in mind that can't be represented with a json model (like a perfect 45 degree wedge), this is a good option. ### `UnbakedMeshRetexturedModel`
We will construct a `RetexturedMeshUnbakedModel`. You need two things - the ID of a parent model, and a `Supplier<>` of a `Mesh` to retexture. Pass either a `Supplier<Mesh>` or a `Function<Function<SpriteIdentifier, Sprite>, Mesh>` (i.e. a function with an optional `Function<SpriteIdentifier, Sprite>` argument, and a return type of `Mesh`). All quads `.tag()`ged with `Direction.EAST.ordinal() + 1` will be textured with the east side of the theme, all quads tagged with `Direction.UP.ordinal() + 1` will be retextured with the top side of the theme, etc. Give these faces UV coordinates ranging from 0 to 1.
Ideally, the parent model should have a parent of `block/block`, or at least define *some* non-default rotations (smokey the bear voice *Only You Can Prevent Weirdly Rotated First-Person Models*) and set `"gui_light": "front"` (lest the item model look weird). You should use a json model for this, but keep in mind that no quads will be read from the json model - it's only used to source all the miscellaneous `BakedModel` options. Quads with the tag `0` will be passed through unaltered (hence the `+ 1` bias), and they expect UV coordinates that already point to an appropriate region of the block atlas (which is where the `Function<SpriteIdentifier, Sprite>` argument comes in - query it for sprites and put their UV coordinates on the model)
When building the `Mesh`, if you want a face to be dynamically retextured, `.tag()` it with the `.ordinal() + 1` of the `Direction` it corresponds to, and give the face UV coordinates ranging from 0 to 1. (For example, if you tag a face with `3` (`Direction.NORTH.ordinal() + 1`), it will be retextured to the north side of the template's theme.) (To construct this type, you will also need to pass the identifier of a "base model", which can be a regular JSON model. Miscellaneous `BakedModel` properties like rotations, AO, `isSideLit`, etc will be sourced from it.)
(TODO: implement a system for baking unchanging `Sprite`s onto the mesh, potentially by "registering" more tags; the problem is you don't have access to sprite uvs at mesh building time. Or just provide a way to get sprite UVs at mesh building time...?) Templates's slope blocks use this model, because it's otherwise impossible to make triangle-shaped faces in a JSON model.
That's all you need in order to construct a `RetexturedMeshUnbakedModel`, so to finish things off, [register it.](#registering-the-custom-model) ## Registering your model
## Registering the custom model
1. Decide on an ID for your special model that's *different* from the ID used for the base model. 1. Decide on an ID for your special model that's *different* from the ID used for the base model.
* If your base model lives at `yourmod:block/awesome_template`, something like `yourmod:awesome_template_special` would do. * If your base model lives at `yourmod:block/awesome_template`, something like `yourmod:awesome_template_special` would do.
2. Register it using `TemplatesClient.provider.addTemplateModel`. 2. Register it using `TemplatesClient.provider.addTemplateModel`.
3. Create a blockstate json for your block, and point it at the ID you decided for your special model in 1). 3. Create a blockstate json for your block, and point it at the ID you decided for your special model in 1).
* You may rotate the blockmodel with the `x` and `y` properties. You can also toggle `uvlock`. Things should work as expected. * You may use the `x`, `y`, and `uvlock` properties as normal.
You may create a regular item model, or use ours by calling `TemplatesClient.provider.assignItemModel`, passing the ID of the special model & the items you want to assign it to. (The reason you have to do this instead of simply creating a regular item model and setting its `parent`, is that `JsonUnbakedModel`s can't have non-`JsonUnbakedModel`s as their `parent`, and even a trivial item model with only the `parent` field set counts as a `JsonUnbakedModel`. This isn't a problem for block models because blockstates are a layer of indirection before model loading.) You may create a regular item model, or use ours by calling `TemplatesClient.provider.assignItemModel`, passing the ID of the special model & the items you want to assign it to. (The reason you have to do this instead of simply creating a regular item model and setting its `parent`, is that `JsonUnbakedModel`s can't have non-`JsonUnbakedModel`s as their `parent`, and even a trivial item model with only the `parent` field set counts as a `JsonUnbakedModel`. This isn't a problem for block models because blockstates are a layer of indirection before model loading.)

View File

@ -1,7 +1,8 @@
package io.github.cottonmc.templates; package io.github.cottonmc.templates;
import io.github.cottonmc.templates.model.RetexturedJsonModelUnbakedModel; import io.github.cottonmc.templates.model.UnbakedAutoRetexturedModel;
import io.github.cottonmc.templates.model.RetexturedMeshUnbakedModel; import io.github.cottonmc.templates.model.UnbakedJsonRetexturedModel;
import io.github.cottonmc.templates.model.UnbakedMeshRetexturedModel;
import io.github.cottonmc.templates.model.SlopeBaseMesh; import io.github.cottonmc.templates.model.SlopeBaseMesh;
import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap;
@ -57,42 +58,46 @@ public class TemplatesClient implements ClientModInitializer {
BlockRenderLayerMap.INSTANCE.putBlocks(RenderLayer.getCutout(), Templates.BLOCKS.toArray(new Block[0])); BlockRenderLayerMap.INSTANCE.putBlocks(RenderLayer.getCutout(), Templates.BLOCKS.toArray(new Block[0]));
//vanilla style //vanilla style models (using "auto" method)
provider.addTemplateModel(Templates.id("button_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/button"))); provider.addTemplateModel(Templates.id("button_special"), new UnbakedAutoRetexturedModel(new Identifier("block/button")));
provider.addTemplateModel(Templates.id("button_pressed_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/button_pressed"))); provider.addTemplateModel(Templates.id("button_pressed_special"), new UnbakedAutoRetexturedModel(new Identifier("block/button_pressed")));
provider.addTemplateModel(Templates.id("carpet_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/carpet"))); provider.addTemplateModel(Templates.id("carpet_special"), new UnbakedAutoRetexturedModel(new Identifier("block/carpet")));
provider.addTemplateModel(Templates.id("cube_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/cube"))); provider.addTemplateModel(Templates.id("cube_special"), new UnbakedAutoRetexturedModel(new Identifier("block/cube")));
provider.addTemplateModel(Templates.id("fence_post_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/fence_post"))); provider.addTemplateModel(Templates.id("fence_post_special"), new UnbakedAutoRetexturedModel(new Identifier("block/fence_post")));
provider.addTemplateModel(Templates.id("fence_side_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/fence_side"))); provider.addTemplateModel(Templates.id("fence_side_special"), new UnbakedAutoRetexturedModel(new Identifier("block/fence_side")));
provider.addTemplateModel(Templates.id("fence_gate_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/fence_gate"))); provider.addTemplateModel(Templates.id("fence_gate_special"), new UnbakedAutoRetexturedModel(new Identifier("block/template_fence_gate")));
provider.addTemplateModel(Templates.id("fence_gate_open_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/fence_gate_open"))); provider.addTemplateModel(Templates.id("fence_gate_open_special"), new UnbakedAutoRetexturedModel(new Identifier("block/template_fence_gate_open")));
provider.addTemplateModel(Templates.id("fence_gate_wall_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/fence_gate_wall"))); provider.addTemplateModel(Templates.id("fence_gate_wall_special"), new UnbakedAutoRetexturedModel(new Identifier("block/template_fence_gate_wall")));
provider.addTemplateModel(Templates.id("fence_gate_wall_open_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/fence_gate_wall_open"))); provider.addTemplateModel(Templates.id("fence_gate_wall_open_special"), new UnbakedAutoRetexturedModel(new Identifier("block/template_fence_gate_wall_open")));
provider.addTemplateModel(Templates.id("lever_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/lever"))); provider.addTemplateModel(Templates.id("pressure_plate_up_special"), new UnbakedAutoRetexturedModel(new Identifier("block/pressure_plate_up")));
provider.addTemplateModel(Templates.id("lever_on_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/lever_on"))); provider.addTemplateModel(Templates.id("pressure_plate_down_special"), new UnbakedAutoRetexturedModel(new Identifier("block/pressure_plate_down")));
provider.addTemplateModel(Templates.id("pressure_plate_up_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/pressure_plate_up"))); provider.addTemplateModel(Templates.id("slab_bottom_special"), new UnbakedAutoRetexturedModel(new Identifier("block/slab")));
provider.addTemplateModel(Templates.id("pressure_plate_down_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/pressure_plate_down"))); provider.addTemplateModel(Templates.id("slab_top_special"), new UnbakedAutoRetexturedModel(new Identifier("block/slab_top")));
provider.addTemplateModel(Templates.id("slab_bottom_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/slab_bottom"))); provider.addTemplateModel(Templates.id("wall_post_special"), new UnbakedAutoRetexturedModel(new Identifier("block/template_wall_post")));
provider.addTemplateModel(Templates.id("slab_top_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/slab_top"))); provider.addTemplateModel(Templates.id("wall_side_special"), new UnbakedAutoRetexturedModel(new Identifier("block/template_wall_side")));
provider.addTemplateModel(Templates.id("wall_post_special"), new RetexturedJsonModelUnbakedModel(Templates.id("block/wall_post"))); provider.addTemplateModel(Templates.id("wall_side_tall_special"), new UnbakedAutoRetexturedModel(new Identifier("block/template_wall_side_tall")));
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")));
//meshes //vanilla style models (using "special-sprite replacement" method)
provider.addTemplateModel(Templates.id("slope_special"), new RetexturedMeshUnbakedModel(Templates.id("block/slope_base"), SlopeBaseMesh::make)); provider.addTemplateModel(Templates.id("lever_special"), new UnbakedJsonRetexturedModel(Templates.id("block/lever")));
provider.addTemplateModel(Templates.id("lever_on_special"), new UnbakedJsonRetexturedModel(Templates.id("block/lever_on")));
//item only models -- TODO move to item/ prolly //mesh models
provider.addTemplateModel(Templates.id("button_inventory_special"), new RetexturedJsonModelUnbakedModel(Templates.id("item/button_inventory"))); provider.addTemplateModel(Templates.id("slope_special"), new UnbakedMeshRetexturedModel(Templates.id("block/slope_base"), SlopeBaseMesh::make));
provider.addTemplateModel(Templates.id("fence_inventory_special"), new RetexturedJsonModelUnbakedModel(Templates.id("item/fence_inventory")));
provider.addTemplateModel(Templates.id("wall_inventory_special"), new RetexturedJsonModelUnbakedModel(Templates.id("item/wall_inventory")));
provider.assignItemModel(Templates.id("button_special"), Templates.BUTTON); //item only models
provider.addTemplateModel(Templates.id("button_inventory_special"), new UnbakedAutoRetexturedModel(new Identifier("block/button_inventory")));
provider.addTemplateModel(Templates.id("fence_inventory_special"), new UnbakedAutoRetexturedModel(new Identifier("block/fence_inventory")));
provider.addTemplateModel(Templates.id("fence_post_inventory_special"), new UnbakedAutoRetexturedModel(Templates.id("block/fence_post_inventory")));
provider.addTemplateModel(Templates.id("wall_inventory_special"), new UnbakedAutoRetexturedModel(new Identifier("block/wall_inventory")));
//item model assignments (in lieu of models/item/___.json)
provider.assignItemModel(Templates.id("button_inventory_special"), Templates.BUTTON);
provider.assignItemModel(Templates.id("carpet_special"), Templates.CARPET); provider.assignItemModel(Templates.id("carpet_special"), Templates.CARPET);
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("fence_inventory_special"), Templates.FENCE);
provider.assignItemModel(Templates.id("fence_gate_special"), Templates.FENCE_GATE); provider.assignItemModel(Templates.id("fence_gate_special"), Templates.FENCE_GATE);
provider.assignItemModel(Templates.id("lever_special"), Templates.LEVER); //TODO vanilla uses its own item model provider.assignItemModel(Templates.id("lever_special"), Templates.LEVER); //TODO vanilla uses its own item model
provider.assignItemModel(Templates.id("fence_post_special"), Templates.POST); provider.assignItemModel(Templates.id("fence_post_inventory_special"), Templates.POST);
provider.assignItemModel(Templates.id("pressure_plate_up_special"), Templates.PRESSURE_PLATE); provider.assignItemModel(Templates.id("pressure_plate_up_special"), Templates.PRESSURE_PLATE);
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);

View File

@ -0,0 +1,90 @@
package io.github.cottonmc.templates.model;
import io.github.cottonmc.templates.TemplatesClient;
import net.fabricmc.fabric.api.renderer.v1.Renderer;
import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial;
import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh;
import net.fabricmc.fabric.api.renderer.v1.mesh.MeshBuilder;
import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.client.render.model.BakedModel;
import net.minecraft.client.render.model.BakedQuad;
import net.minecraft.client.render.model.Baker;
import net.minecraft.client.render.model.ModelBakeSettings;
import net.minecraft.client.render.model.UnbakedModel;
import net.minecraft.client.texture.Sprite;
import net.minecraft.client.util.SpriteIdentifier;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.Direction;
import net.minecraft.util.math.random.Random;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
import java.util.Collections;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.function.Function;
public class UnbakedAutoRetexturedModel implements UnbakedModel {
public UnbakedAutoRetexturedModel(Identifier parent) {
this(parent, Blocks.AIR.getDefaultState());
}
public UnbakedAutoRetexturedModel(Identifier parent, BlockState itemModelState) {
this.parent = parent;
this.itemModelState = itemModelState;
}
protected final Identifier parent;
protected final BlockState itemModelState;
@Override
public Collection<Identifier> getModelDependencies() {
return Collections.singletonList(parent);
}
@Override
public void setParents(Function<Identifier, UnbakedModel> function) {
function.apply(parent).setParents(function);
}
@Nullable
@Override
public BakedModel bake(Baker baker, Function<SpriteIdentifier, Sprite> spriteLookup, ModelBakeSettings modelBakeSettings, Identifier identifier) {
ConcurrentMap<BlockState, Mesh> jsonToMesh = new ConcurrentHashMap<>();
return new RetexturingBakedModel(
baker.bake(parent, modelBakeSettings),
TemplatesClient.provider.getOrCreateTemplateApperanceManager(spriteLookup),
modelBakeSettings,
itemModelState
) {
@Override
protected Mesh getBaseMesh(BlockState state) {
//Convert models to retexturable Meshes lazily, the first time we encounter each blockstate
return jsonToMesh.computeIfAbsent(state, this::convertModel);
}
private Mesh convertModel(BlockState state) {
Renderer r = TemplatesClient.getFabricRenderer();
MeshBuilder builder = r.meshBuilder();
QuadEmitter emitter = builder.getEmitter();
RenderMaterial mat = tam.getCachedMaterial(state);
Random rand = Random.create(42);
for(Direction cullFace : DIRECTIONS_AND_NULL) {
for(BakedQuad quad : wrapped.getQuads(state, cullFace, rand)) {
emitter.fromVanilla(quad, mat, cullFace);
QuadUvBounds.read(emitter).normalizeUv(emitter, quad.getSprite());
emitter.tag(emitter.lightFace().ordinal() + 1);
emitter.emit();
}
}
return builder.build();
}
};
}
}

View File

@ -29,12 +29,12 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentMap;
import java.util.function.Function; import java.util.function.Function;
public class RetexturedJsonModelUnbakedModel implements UnbakedModel { public class UnbakedJsonRetexturedModel implements UnbakedModel {
public RetexturedJsonModelUnbakedModel(Identifier parent) { public UnbakedJsonRetexturedModel(Identifier parent) {
this(parent, Blocks.AIR.getDefaultState()); this(parent, Blocks.AIR.getDefaultState());
} }
public RetexturedJsonModelUnbakedModel(Identifier parent, BlockState itemModelState) { public UnbakedJsonRetexturedModel(Identifier parent, BlockState itemModelState) {
this.parent = parent; this.parent = parent;
this.itemModelState = itemModelState; this.itemModelState = itemModelState;
} }

View File

@ -17,12 +17,12 @@ import java.util.Collections;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Supplier; import java.util.function.Supplier;
public class RetexturedMeshUnbakedModel implements UnbakedModel { public class UnbakedMeshRetexturedModel implements UnbakedModel {
public RetexturedMeshUnbakedModel(Identifier parent, Supplier<Mesh> baseMeshFactory) { public UnbakedMeshRetexturedModel(Identifier parent, Supplier<Mesh> baseMeshFactory) {
this(parent, __ -> baseMeshFactory.get()); this(parent, __ -> baseMeshFactory.get());
} }
public RetexturedMeshUnbakedModel(Identifier parent, Function<Function<SpriteIdentifier, Sprite>, Mesh> baseMeshFactory) { public UnbakedMeshRetexturedModel(Identifier parent, Function<Function<SpriteIdentifier, Sprite>, Mesh> baseMeshFactory) {
this.parent = parent; this.parent = parent;
this.baseMeshFactory = baseMeshFactory; this.baseMeshFactory = baseMeshFactory;
} }

View File

@ -1,44 +0,0 @@
{
"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"
},
"elements": [
{
"from": [5, 0, 6],
"to": [11, 2, 10],
"faces": {
"down": {
"uv": [5, 6, 11, 10],
"texture": "#down",
"cullface": "down"
},
"up": {
"uv": [5, 6, 11, 10],
"texture": "#up"
},
"north": {
"uv": [5, 14, 11, 16],
"texture": "#north"
},
"south": {
"uv": [5, 14, 11, 16],
"texture": "#south"
},
"west": {
"uv": [6, 14, 10, 16],
"texture": "#west"
},
"east": {
"uv": [6, 14, 10, 16],
"texture": "#east"
}
}
}
]
}

View File

@ -1,44 +0,0 @@
{
"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"
},
"elements": [
{
"from": [5, 0, 6],
"to": [11, 1.02, 10],
"faces": {
"down": {
"uv": [5, 6, 11, 10],
"texture": "#down",
"cullface": "down"
},
"up": {
"uv": [5, 6, 11, 10],
"texture": "#up"
},
"north": {
"uv": [5, 14, 11, 15],
"texture": "#north"
},
"south": {
"uv": [5, 14, 11, 15],
"texture": "#south"
},
"west": {
"uv": [6, 14, 10, 15],
"texture": "#west"
},
"east": {
"uv": [6, 14, 10, 15],
"texture": "#east"
}
}
}
]
}

View File

@ -1,48 +0,0 @@
{
"parent": "block/thin_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": [0, 0, 0],
"to": [16, 1, 16],
"faces": {
"down": {
"uv": [0, 0, 16, 16],
"texture": "#down",
"cullface": "down"
},
"up": {
"uv": [0, 0, 16, 16],
"texture": "#up"
},
"north": {
"uv": [0, 15, 16, 16],
"texture": "#north",
"cullface": "north"
},
"south": {
"uv": [0, 15, 16, 16],
"texture": "#south",
"cullface": "south"
},
"west": {
"uv": [0, 15, 16, 16],
"texture": "#west",
"cullface": "west"
},
"east": {
"uv": [0, 15, 16, 16],
"texture": "#east",
"cullface": "east"
}
}
}
]
}

View File

@ -1,11 +0,0 @@
{
"parent": "minecraft:block/cube",
"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"
}
}

View File

@ -1,112 +0,0 @@
{ "parent": "block/block",
"display": {
"gui": {
"rotation": [ 30, 45, 0 ],
"translation": [ 0, -1, 0],
"scale":[ 0.8, 0.8, 0.8 ]
},
"head": {
"rotation": [ 0, 0, 0 ],
"translation": [ 0, -3, -6],
"scale":[ 1, 1, 1]
}
},
"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": [
{ "__comment": "Left-hand post",
"from": [ 0, 5, 7 ],
"to": [ 2, 16, 9 ],
"faces": {
"down": { "uv": [ 0, 7, 2, 9 ], "texture": "#down" },
"up": { "uv": [ 0, 7, 2, 9 ], "texture": "#up" },
"north": { "uv": [ 0, 0, 2, 11 ], "texture": "#north" },
"south": { "uv": [ 0, 0, 2, 11 ], "texture": "#south" },
"west": { "uv": [ 7, 0, 9, 11 ], "texture": "#west", "cullface": "west" },
"east": { "uv": [ 7, 0, 9, 11 ], "texture": "#east" }
}
},
{ "__comment": "Right-hand post",
"from": [ 14, 5, 7 ],
"to": [ 16, 16, 9 ],
"faces": {
"down": { "uv": [ 14, 7, 16, 9 ], "texture": "#down" },
"up": { "uv": [ 14, 7, 16, 9 ], "texture": "#up" },
"north": { "uv": [ 14, 0, 16, 11 ], "texture": "#north" },
"south": { "uv": [ 14, 0, 16, 11 ], "texture": "#south" },
"west": { "uv": [ 7, 0, 9, 11 ], "texture": "#west" },
"east": { "uv": [ 7, 0, 9, 11 ], "texture": "#east", "cullface": "east" }
}
},
{ "__comment": "Inner vertical post of left-hand gate door",
"from": [ 6, 6, 7 ],
"to": [ 8, 15, 9 ],
"faces": {
"down": { "uv": [ 6, 7, 8, 9 ], "texture": "#down" },
"up": { "uv": [ 6, 7, 8, 9 ], "texture": "#up" },
"north": { "uv": [ 6, 1, 8, 10 ], "texture": "#north" },
"south": { "uv": [ 6, 1, 8, 10 ], "texture": "#south" },
"west": { "uv": [ 7, 1, 9, 10 ], "texture": "#west" },
"east": { "uv": [ 7, 1, 9, 10 ], "texture": "#east" }
}
},
{ "__comment": "Inner vertical post of right-hand gate door",
"from": [ 8, 6, 7 ],
"to": [ 10, 15, 9 ],
"faces": {
"down": { "uv": [ 8, 7, 10, 9 ], "texture": "#down" },
"up": { "uv": [ 8, 7, 10, 9 ], "texture": "#up" },
"north": { "uv": [ 8, 1, 10, 10 ], "texture": "#north" },
"south": { "uv": [ 8, 1, 10, 10 ], "texture": "#south" },
"west": { "uv": [ 7, 1, 9, 10 ], "texture": "#west" },
"east": { "uv": [ 7, 1, 9, 10 ], "texture": "#east" }
}
},
{ "__comment": "Lower horizontal bar of left-hand gate door",
"from": [ 2, 6, 7 ],
"to": [ 6, 9, 9 ],
"faces": {
"down": { "uv": [ 2, 7, 6, 9 ], "texture": "#down" },
"up": { "uv": [ 2, 7, 6, 9 ], "texture": "#up" },
"north": { "uv": [ 2, 7, 6, 10 ], "texture": "#north" },
"south": { "uv": [ 2, 7, 6, 10 ], "texture": "#south" }
}
},
{ "__comment": "Upper horizontal bar of left-hand gate door",
"from": [ 2, 12, 7 ],
"to": [ 6, 15, 9 ],
"faces": {
"down": { "uv": [ 2, 7, 6, 9 ], "texture": "#down" },
"up": { "uv": [ 2, 7, 6, 9 ], "texture": "#up" },
"north": { "uv": [ 2, 1, 6, 4 ], "texture": "#north" },
"south": { "uv": [ 2, 1, 6, 4 ], "texture": "#south" }
}
},
{ "__comment": "Lower horizontal bar of right-hand gate door",
"from": [ 10, 6, 7 ],
"to": [ 14, 9, 9 ],
"faces": {
"down": { "uv": [ 10, 7, 14, 9 ], "texture": "#down" },
"up": { "uv": [ 10, 7, 14, 9 ], "texture": "#up" },
"north": { "uv": [ 10, 7, 14, 10 ], "texture": "#north" },
"south": { "uv": [ 10, 7, 14, 10 ], "texture": "#south" }
}
},
{ "__comment": "Upper horizontal bar of right-hand gate door",
"from": [ 10, 12, 7 ],
"to": [ 14, 15, 9 ],
"faces": {
"down": { "uv": [ 10, 7, 14, 9 ], "texture": "#down" },
"up": { "uv": [ 10, 7, 14, 9 ], "texture": "#up" },
"north": { "uv": [ 10, 1, 14, 4 ], "texture": "#north" },
"south": { "uv": [ 10, 1, 14, 4 ], "texture": "#south" }
}
}
]
}

View File

@ -1,100 +0,0 @@
{
"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": [
{ "__comment": "Left-hand post",
"from": [ 0, 5, 7 ],
"to": [ 2, 16, 9 ],
"faces": {
"down": { "uv": [ 0, 7, 2, 9 ], "texture": "#down" },
"up": { "uv": [ 0, 7, 2, 9 ], "texture": "#up" },
"north": { "uv": [ 0, 0, 2, 11 ], "texture": "#north" },
"south": { "uv": [ 0, 0, 2, 11 ], "texture": "#south" },
"west": { "uv": [ 7, 0, 9, 11 ], "texture": "#west", "cullface": "west" },
"east": { "uv": [ 7, 0, 9, 11 ], "texture": "#east" }
}
},
{ "__comment": "Right-hand post",
"from": [ 14, 5, 7 ],
"to": [ 16, 16, 9 ],
"faces": {
"down": { "uv": [ 14, 7, 16, 9 ], "texture": "#down" },
"up": { "uv": [ 14, 7, 16, 9 ], "texture": "#up" },
"north": { "uv": [ 14, 0, 16, 11 ], "texture": "#north" },
"south": { "uv": [ 14, 0, 16, 11 ], "texture": "#south" },
"west": { "uv": [ 7, 0, 9, 11 ], "texture": "#west" },
"east": { "uv": [ 7, 0, 9, 11 ], "texture": "#east", "cullface": "east" }
}
},
{ "__comment": "Inner vertical post of left-hand gate door",
"from": [ 0, 6, 13 ],
"to": [ 2, 15, 15 ],
"faces": {
"down": { "uv": [ 0, 13, 2, 15 ], "texture": "#down" },
"up": { "uv": [ 0, 13, 2, 15 ], "texture": "#up" },
"north": { "uv": [ 0, 1, 2, 10 ], "texture": "#north" },
"south": { "uv": [ 0, 1, 2, 10 ], "texture": "#south" },
"west": { "uv": [ 13, 1, 15, 10 ], "texture": "#west" },
"east": { "uv": [ 13, 1, 15, 10 ], "texture": "#east" }
}
},
{ "__comment": "Inner vertical post of right-hand gate door",
"from": [ 14, 6, 13 ],
"to": [ 16, 15, 15 ],
"faces": {
"down": { "uv": [ 14, 13, 16, 15 ], "texture": "#down" },
"up": { "uv": [ 14, 13, 16, 15 ], "texture": "#up" },
"north": { "uv": [ 14, 1, 16, 10 ], "texture": "#north" },
"south": { "uv": [ 14, 1, 16, 10 ], "texture": "#south" },
"west": { "uv": [ 13, 1, 15, 10 ], "texture": "#west" },
"east": { "uv": [ 13, 1, 15, 10 ], "texture": "#east" }
}
},
{ "__comment": "Lower horizontal bar of left-hand gate door",
"from": [ 0, 6, 9 ],
"to": [ 2, 9, 13 ],
"faces": {
"down": { "uv": [ 0, 9, 2, 13 ], "texture": "#down" },
"up": { "uv": [ 0, 9, 2, 13 ], "texture": "#up" },
"west": { "uv": [ 13, 7, 15, 10 ], "texture": "#north" },
"east": { "uv": [ 13, 7, 15, 10 ], "texture": "#south" }
}
},
{ "__comment": "Upper horizontal bar of left-hand gate door",
"from": [ 0, 12, 9 ],
"to": [ 2, 15, 13 ],
"faces": {
"down": { "uv": [ 0, 9, 2, 13 ], "texture": "#down" },
"up": { "uv": [ 0, 9, 2, 13 ], "texture": "#up" },
"west": { "uv": [ 13, 1, 15, 4 ], "texture": "#north" },
"east": { "uv": [ 13, 1, 15, 4 ], "texture": "#south" }
}
},
{ "__comment": "Lower horizontal bar of left-hand gate door",
"from": [ 14, 6, 9 ],
"to": [ 16, 9, 13 ],
"faces": {
"down": { "uv": [ 14, 9, 16, 13 ], "texture": "#down" },
"up": { "uv": [ 14, 9, 16, 13 ], "texture": "#up" },
"west": { "uv": [ 13, 7, 15, 10 ], "texture": "#north" },
"east": { "uv": [ 13, 7, 15, 10 ], "texture": "#south" }
}
},
{ "__comment": "Upper horizontal bar of left-hand gate door",
"from": [ 14, 12, 9 ],
"to": [ 16, 15, 13 ],
"faces": {
"down": { "uv": [ 14, 9, 16, 13 ], "texture": "#down" },
"up": { "uv": [ 14, 9, 16, 13 ], "texture": "#up" },
"west": { "uv": [ 13, 1, 15, 4 ], "texture": "#north" },
"east": { "uv": [ 13, 1, 15, 4 ], "texture": "#south" }
}
}
]
}

View File

@ -1,101 +0,0 @@
{
"ambientocclusion": true,
"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": [
{ "__comment": "Left-hand post",
"from": [ 0, 2, 7 ],
"to": [ 2, 13, 9 ],
"faces": {
"down": { "uv": [ 0, 7, 2, 9 ], "texture": "#down" },
"up": { "uv": [ 0, 7, 2, 9 ], "texture": "#up" },
"north": { "uv": [ 0, 0, 2, 11 ], "texture": "#north" },
"south": { "uv": [ 0, 0, 2, 11 ], "texture": "#south" },
"west": { "uv": [ 7, 0, 9, 11 ], "texture": "#west", "cullface": "west" },
"east": { "uv": [ 7, 0, 9, 11 ], "texture": "#east" }
}
},
{ "__comment": "Right-hand post",
"from": [ 14, 2, 7 ],
"to": [ 16, 13, 9 ],
"faces": {
"down": { "uv": [ 14, 7, 16, 9 ], "texture": "#down" },
"up": { "uv": [ 14, 7, 16, 9 ], "texture": "#up" },
"north": { "uv": [ 14, 0, 16, 11 ], "texture": "#north" },
"south": { "uv": [ 14, 0, 16, 11 ], "texture": "#south" },
"west": { "uv": [ 7, 0, 9, 11 ], "texture": "#west" },
"east": { "uv": [ 7, 0, 9, 11 ], "texture": "#east", "cullface": "east" }
}
},
{ "__comment": "Inner vertical post of left-hand gate door",
"from": [ 6, 3, 7 ],
"to": [ 8, 12, 9 ],
"faces": {
"down": { "uv": [ 6, 7, 8, 9 ], "texture": "#down" },
"up": { "uv": [ 6, 7, 8, 9 ], "texture": "#up" },
"north": { "uv": [ 6, 1, 8, 10 ], "texture": "#north" },
"south": { "uv": [ 6, 1, 8, 10 ], "texture": "#south" },
"west": { "uv": [ 7, 1, 9, 10 ], "texture": "#west" },
"east": { "uv": [ 7, 1, 9, 10 ], "texture": "#east" }
}
},
{ "__comment": "Inner vertical post of right-hand gate door",
"from": [ 8, 3, 7 ],
"to": [ 10, 12, 9 ],
"faces": {
"down": { "uv": [ 8, 7, 10, 9 ], "texture": "#down" },
"up": { "uv": [ 8, 7, 10, 9 ], "texture": "#up" },
"north": { "uv": [ 8, 1, 10, 10 ], "texture": "#north" },
"south": { "uv": [ 8, 1, 10, 10 ], "texture": "#south" },
"west": { "uv": [ 7, 1, 9, 10 ], "texture": "#west" },
"east": { "uv": [ 7, 1, 9, 10 ], "texture": "#east" }
}
},
{ "__comment": "Lower horizontal bar of left-hand gate door",
"from": [ 2, 3, 7 ],
"to": [ 6, 6, 9 ],
"faces": {
"down": { "uv": [ 2, 7, 6, 9 ], "texture": "#down" },
"up": { "uv": [ 2, 7, 6, 9 ], "texture": "#up" },
"north": { "uv": [ 2, 7, 6, 10 ], "texture": "#north" },
"south": { "uv": [ 2, 7, 6, 10 ], "texture": "#south" }
}
},
{ "__comment": "Upper horizontal bar of left-hand gate door",
"from": [ 2, 9, 7 ],
"to": [ 6, 12, 9 ],
"faces": {
"down": { "uv": [ 2, 7, 6, 9 ], "texture": "#down" },
"up": { "uv": [ 2, 7, 6, 9 ], "texture": "#up" },
"north": { "uv": [ 2, 1, 6, 4 ], "texture": "#north" },
"south": { "uv": [ 2, 1, 6, 4 ], "texture": "#south" }
}
},
{ "__comment": "Lower horizontal bar of right-hand gate door",
"from": [ 10, 3, 7 ],
"to": [ 14, 6, 9 ],
"faces": {
"down": { "uv": [ 10, 7, 14, 9 ], "texture": "#down" },
"up": { "uv": [ 10, 7, 14, 9 ], "texture": "#up" },
"north": { "uv": [ 10, 7, 14, 10 ], "texture": "#north" },
"south": { "uv": [ 10, 7, 14, 10 ], "texture": "#south" }
}
},
{ "__comment": "Upper horizontal bar of right-hand gate door",
"from": [ 10, 9, 7 ],
"to": [ 14, 12, 9 ],
"faces": {
"down": { "uv": [ 10, 7, 14, 9 ], "texture": "#down" },
"up": { "uv": [ 10, 7, 14, 9 ], "texture": "#up" },
"north": { "uv": [ 10, 1, 14, 4 ], "texture": "#north" },
"south": { "uv": [ 10, 1, 14, 4 ], "texture": "#south" }
}
}
]
}

View File

@ -1,101 +0,0 @@
{
"ambientocclusion": true,
"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": [
{ "__comment": "Left-hand post",
"from": [ 0, 2, 7 ],
"to": [ 2, 13, 9 ],
"faces": {
"down": { "uv": [ 0, 7, 2, 9 ], "texture": "#down" },
"up": { "uv": [ 0, 7, 2, 9 ], "texture": "#up" },
"north": { "uv": [ 0, 0, 2, 11 ], "texture": "#north" },
"south": { "uv": [ 0, 0, 2, 11 ], "texture": "#south" },
"west": { "uv": [ 7, 0, 9, 11 ], "texture": "#west", "cullface": "west" },
"east": { "uv": [ 7, 0, 9, 11 ], "texture": "#east" }
}
},
{ "__comment": "Right-hand post",
"from": [ 14, 2, 7 ],
"to": [ 16, 13, 9 ],
"faces": {
"down": { "uv": [ 14, 7, 16, 9 ], "texture": "#down" },
"up": { "uv": [ 14, 7, 16, 9 ], "texture": "#up" },
"north": { "uv": [ 14, 0, 16, 11 ], "texture": "#north" },
"south": { "uv": [ 14, 0, 16, 11 ], "texture": "#south" },
"west": { "uv": [ 7, 0, 9, 11 ], "texture": "#west" },
"east": { "uv": [ 7, 0, 9, 11 ], "texture": "#east", "cullface": "east" }
}
},
{ "__comment": "Inner vertical post of left-hand gate door",
"from": [ 0, 3, 13 ],
"to": [ 2, 12, 15 ],
"faces": {
"down": { "uv": [ 0, 13, 2, 15 ], "texture": "#down" },
"up": { "uv": [ 0, 13, 2, 15 ], "texture": "#up" },
"north": { "uv": [ 0, 1, 2, 10 ], "texture": "#north" },
"south": { "uv": [ 0, 1, 2, 10 ], "texture": "#south" },
"west": { "uv": [ 13, 1, 15, 10 ], "texture": "#west" },
"east": { "uv": [ 13, 1, 15, 10 ], "texture": "#east" }
}
},
{ "__comment": "Inner vertical post of right-hand gate door",
"from": [ 14, 3, 13 ],
"to": [ 16, 12, 15 ],
"faces": {
"down": { "uv": [ 14, 13, 16, 15 ], "texture": "#down" },
"up": { "uv": [ 14, 13, 16, 15 ], "texture": "#up" },
"north": { "uv": [ 14, 1, 16, 10 ], "texture": "#north" },
"south": { "uv": [ 14, 1, 16, 10 ], "texture": "#south" },
"west": { "uv": [ 13, 1, 15, 10 ], "texture": "#west" },
"east": { "uv": [ 13, 1, 15, 10 ], "texture": "#east" }
}
},
{ "__comment": "Lower horizontal bar of left-hand gate door",
"from": [ 0, 3, 9 ],
"to": [ 2, 6, 13 ],
"faces": {
"down": { "uv": [ 0, 9, 2, 13 ], "texture": "#down" },
"up": { "uv": [ 0, 9, 2, 13 ], "texture": "#up" },
"west": { "uv": [ 13, 7, 15, 10 ], "texture": "#north" },
"east": { "uv": [ 13, 7, 15, 10 ], "texture": "#south" }
}
},
{ "__comment": "Upper horizontal bar of left-hand gate door",
"from": [ 0, 9, 9 ],
"to": [ 2, 12, 13 ],
"faces": {
"down": { "uv": [ 0, 9, 2, 13 ], "texture": "#down" },
"up": { "uv": [ 0, 9, 2, 13 ], "texture": "#up" },
"west": { "uv": [ 13, 1, 15, 4 ], "texture": "#north" },
"east": { "uv": [ 13, 1, 15, 4 ], "texture": "#south" }
}
},
{ "__comment": "Lower horizontal bar of left-hand gate door",
"from": [ 14, 3, 9 ],
"to": [ 16, 6, 13 ],
"faces": {
"down": { "uv": [ 14, 9, 16, 13 ], "texture": "#down" },
"up": { "uv": [ 14, 9, 16, 13 ], "texture": "#up" },
"west": { "uv": [ 13, 7, 15, 10 ], "texture": "#north" },
"east": { "uv": [ 13, 7, 15, 10 ], "texture": "#south" }
}
},
{ "__comment": "Upper horizontal bar of left-hand gate door",
"from": [ 14, 9, 9 ],
"to": [ 16, 12, 13 ],
"faces": {
"down": { "uv": [ 14, 9, 16, 13 ], "texture": "#down" },
"up": { "uv": [ 14, 9, 16, 13 ], "texture": "#up" },
"west": { "uv": [ 13, 1, 15, 4 ], "texture": "#north" },
"east": { "uv": [ 13, 1, 15, 4 ], "texture": "#south" }
}
}
]
}

View File

@ -1,12 +1,7 @@
{ {
"parent": "minecraft:block/block", "parent": "minecraft:block/block",
"textures": { "textures": {
"down": "templates:templates_special/down", "particle": "#texture"
"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": [ "elements": [
{ {
@ -15,29 +10,29 @@
"faces": { "faces": {
"down": { "down": {
"uv": [6, 6, 10, 10], "uv": [6, 6, 10, 10],
"texture": "#down", "texture": "#texture",
"cullface": "down" "cullface": "down"
}, },
"up": { "up": {
"uv": [6, 6, 10, 10], "uv": [6, 6, 10, 10],
"texture": "#up", "texture": "#texture",
"cullface": "up" "cullface": "up"
}, },
"north": { "north": {
"uv": [6, 0, 10, 16], "uv": [6, 0, 10, 16],
"texture": "#north" "texture": "#texture"
}, },
"south": { "south": {
"uv": [6, 0, 10, 16], "uv": [6, 0, 10, 16],
"texture": "#south" "texture": "#texture"
}, },
"west": { "west": {
"uv": [6, 0, 10, 16], "uv": [6, 0, 10, 16],
"texture": "#west" "texture": "#texture"
}, },
"east": { "east": {
"uv": [6, 0, 10, 16], "uv": [6, 0, 10, 16],
"texture": "#east" "texture": "#texture"
} }
}, },
"__comment": "Center post" "__comment": "Center post"

View File

@ -1,68 +0,0 @@
{
"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

@ -1,44 +0,0 @@
{
"parent": "minecraft:block/thin_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": [1, 0, 1],
"to": [15, 0.5, 15],
"faces": {
"down": {
"uv": [1, 1, 15, 15],
"texture": "#down",
"cullface": "down"
},
"up": {
"uv": [1, 1, 15, 15],
"texture": "#up"
},
"north": {
"uv": [1, 15, 15, 15.5],
"texture": "#north"
},
"south": {
"uv": [1, 15, 15, 15.5],
"texture": "#south"
},
"west": {
"uv": [1, 15, 15, 15.5],
"texture": "#west"
},
"east": {
"uv": [1, 15, 15, 15.5],
"texture": "#east"
}
}
}
]
}

View File

@ -1,44 +0,0 @@
{
"parent": "minecraft:block/thin_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": [1, 0, 1],
"to": [15, 1, 15],
"faces": {
"down": {
"uv": [1, 1, 15, 15],
"texture": "#down",
"cullface": "down"
},
"up": {
"uv": [1, 1, 15, 15],
"texture": "#up"
},
"north": {
"uv": [1, 15, 15, 16],
"texture": "#north"
},
"south": {
"uv": [1, 15, 15, 16],
"texture": "#south"
},
"west": {
"uv": [1, 15, 15, 16],
"texture": "#west"
},
"east": {
"uv": [1, 15, 15, 16],
"texture": "#east"
}
}
}
]
}

View File

@ -1,48 +0,0 @@
{
"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": [0, 0, 0],
"to": [16, 8, 16],
"faces": {
"down": {
"uv": [0, 0, 16, 16],
"texture": "#down",
"cullface": "down"
},
"up": {
"uv": [0, 0, 16, 16],
"texture": "#up"
},
"north": {
"uv": [0, 8, 16, 16],
"texture": "#north",
"cullface": "north"
},
"south": {
"uv": [0, 8, 16, 16],
"texture": "#south",
"cullface": "south"
},
"west": {
"uv": [0, 8, 16, 16],
"texture": "#west",
"cullface": "west"
},
"east": {
"uv": [0, 8, 16, 16],
"texture": "#east",
"cullface": "east"
}
}
}
]
}

View File

@ -1,48 +0,0 @@
{
"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": [0, 8, 0],
"to": [16, 16, 16],
"faces": {
"down": {
"uv": [0, 0, 16, 16],
"texture": "#down"
},
"up": {
"uv": [0, 0, 16, 16],
"texture": "#up",
"cullface": "up"
},
"north": {
"uv": [0, 0, 16, 8],
"texture": "#north",
"cullface": "north"
},
"south": {
"uv": [0, 0, 16, 8],
"texture": "#south",
"cullface": "south"
},
"west": {
"uv": [0, 0, 16, 8],
"texture": "#west",
"cullface": "west"
},
"east": {
"uv": [0, 0, 16, 8],
"texture": "#east",
"cullface": "east"
}
}
}
]
}

View File

@ -1,40 +0,0 @@
{
"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

@ -1,37 +0,0 @@
{
"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

@ -1,37 +0,0 @@
{
"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

@ -1,43 +0,0 @@
{
"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"
},
"elements": [
{
"from": [5, 6, 6],
"to": [11, 10, 10],
"faces": {
"down": {
"uv": [5, 6, 11, 10],
"texture": "#down"
},
"up": {
"uv": [5, 10, 11, 6],
"texture": "#up"
},
"north": {
"uv": [5, 12, 11, 16],
"texture": "#north"
},
"south": {
"uv": [5, 12, 11, 16],
"texture": "#south"
},
"west": {
"uv": [6, 12, 10, 16],
"texture": "#west"
},
"east": {
"uv": [6, 12, 10, 16],
"texture": "#east"
}
}
}
]
}

View File

@ -1,243 +0,0 @@
{
"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

@ -1,91 +0,0 @@
{
"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"
}
]
}