1.21.8
This commit is contained in:
80
.tmp-mc/assets/minecraft/blockstates/oak_fence_gate.json
Normal file
80
.tmp-mc/assets/minecraft/blockstates/oak_fence_gate.json
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
{
|
||||||
|
"variants": {
|
||||||
|
"facing=east,in_wall=false,open=false": {
|
||||||
|
"model": "minecraft:block/oak_fence_gate",
|
||||||
|
"uvlock": true,
|
||||||
|
"y": 270
|
||||||
|
},
|
||||||
|
"facing=east,in_wall=false,open=true": {
|
||||||
|
"model": "minecraft:block/oak_fence_gate_open",
|
||||||
|
"uvlock": true,
|
||||||
|
"y": 270
|
||||||
|
},
|
||||||
|
"facing=east,in_wall=true,open=false": {
|
||||||
|
"model": "minecraft:block/oak_fence_gate_wall",
|
||||||
|
"uvlock": true,
|
||||||
|
"y": 270
|
||||||
|
},
|
||||||
|
"facing=east,in_wall=true,open=true": {
|
||||||
|
"model": "minecraft:block/oak_fence_gate_wall_open",
|
||||||
|
"uvlock": true,
|
||||||
|
"y": 270
|
||||||
|
},
|
||||||
|
"facing=north,in_wall=false,open=false": {
|
||||||
|
"model": "minecraft:block/oak_fence_gate",
|
||||||
|
"uvlock": true,
|
||||||
|
"y": 180
|
||||||
|
},
|
||||||
|
"facing=north,in_wall=false,open=true": {
|
||||||
|
"model": "minecraft:block/oak_fence_gate_open",
|
||||||
|
"uvlock": true,
|
||||||
|
"y": 180
|
||||||
|
},
|
||||||
|
"facing=north,in_wall=true,open=false": {
|
||||||
|
"model": "minecraft:block/oak_fence_gate_wall",
|
||||||
|
"uvlock": true,
|
||||||
|
"y": 180
|
||||||
|
},
|
||||||
|
"facing=north,in_wall=true,open=true": {
|
||||||
|
"model": "minecraft:block/oak_fence_gate_wall_open",
|
||||||
|
"uvlock": true,
|
||||||
|
"y": 180
|
||||||
|
},
|
||||||
|
"facing=south,in_wall=false,open=false": {
|
||||||
|
"model": "minecraft:block/oak_fence_gate",
|
||||||
|
"uvlock": true
|
||||||
|
},
|
||||||
|
"facing=south,in_wall=false,open=true": {
|
||||||
|
"model": "minecraft:block/oak_fence_gate_open",
|
||||||
|
"uvlock": true
|
||||||
|
},
|
||||||
|
"facing=south,in_wall=true,open=false": {
|
||||||
|
"model": "minecraft:block/oak_fence_gate_wall",
|
||||||
|
"uvlock": true
|
||||||
|
},
|
||||||
|
"facing=south,in_wall=true,open=true": {
|
||||||
|
"model": "minecraft:block/oak_fence_gate_wall_open",
|
||||||
|
"uvlock": true
|
||||||
|
},
|
||||||
|
"facing=west,in_wall=false,open=false": {
|
||||||
|
"model": "minecraft:block/oak_fence_gate",
|
||||||
|
"uvlock": true,
|
||||||
|
"y": 90
|
||||||
|
},
|
||||||
|
"facing=west,in_wall=false,open=true": {
|
||||||
|
"model": "minecraft:block/oak_fence_gate_open",
|
||||||
|
"uvlock": true,
|
||||||
|
"y": 90
|
||||||
|
},
|
||||||
|
"facing=west,in_wall=true,open=false": {
|
||||||
|
"model": "minecraft:block/oak_fence_gate_wall",
|
||||||
|
"uvlock": true,
|
||||||
|
"y": 90
|
||||||
|
},
|
||||||
|
"facing=west,in_wall=true,open=true": {
|
||||||
|
"model": "minecraft:block/oak_fence_gate_wall_open",
|
||||||
|
"uvlock": true,
|
||||||
|
"y": 90
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
107
.tmp-mc/assets/minecraft/models/block/template_fence_gate.json
Normal file
107
.tmp-mc/assets/minecraft/models/block/template_fence_gate.json
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
{ "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": {
|
||||||
|
"particle": "#texture"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{ "__comment": "Left-hand post",
|
||||||
|
"from": [ 0, 5, 7 ],
|
||||||
|
"to": [ 2, 16, 9 ],
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 0, 7, 2, 9 ], "texture": "#texture" },
|
||||||
|
"up": { "uv": [ 0, 7, 2, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 0, 0, 2, 11 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 0, 0, 2, 11 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture", "cullface": "west" },
|
||||||
|
"east": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__comment": "Right-hand post",
|
||||||
|
"from": [ 14, 5, 7 ],
|
||||||
|
"to": [ 16, 16, 9 ],
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 14, 7, 16, 9 ], "texture": "#texture" },
|
||||||
|
"up": { "uv": [ 14, 7, 16, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 14, 0, 16, 11 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 14, 0, 16, 11 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture", "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": "#texture" },
|
||||||
|
"up": { "uv": [ 6, 7, 8, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 6, 1, 8, 10 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 6, 1, 8, 10 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 7, 1, 9, 10 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 7, 1, 9, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 8, 7, 10, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 8, 1, 10, 10 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 8, 1, 10, 10 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 7, 1, 9, 10 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 7, 1, 9, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 2, 7, 6, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 2, 7, 6, 10 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 2, 7, 6, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 2, 7, 6, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 2, 1, 6, 4 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 2, 1, 6, 4 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 10, 7, 14, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 10, 7, 14, 10 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 10, 7, 14, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 10, 7, 14, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 10, 1, 14, 4 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 10, 1, 14, 4 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,95 @@
|
|||||||
|
{
|
||||||
|
"textures": {
|
||||||
|
"particle": "#texture"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{ "__comment": "Left-hand post",
|
||||||
|
"from": [ 0, 5, 7 ],
|
||||||
|
"to": [ 2, 16, 9 ],
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 0, 7, 2, 9 ], "texture": "#texture" },
|
||||||
|
"up": { "uv": [ 0, 7, 2, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 0, 0, 2, 11 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 0, 0, 2, 11 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture", "cullface": "west" },
|
||||||
|
"east": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__comment": "Right-hand post",
|
||||||
|
"from": [ 14, 5, 7 ],
|
||||||
|
"to": [ 16, 16, 9 ],
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 14, 7, 16, 9 ], "texture": "#texture" },
|
||||||
|
"up": { "uv": [ 14, 7, 16, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 14, 0, 16, 11 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 14, 0, 16, 11 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture", "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": "#texture" },
|
||||||
|
"up": { "uv": [ 0, 13, 2, 15 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 0, 1, 2, 10 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 0, 1, 2, 10 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 13, 1, 15, 10 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 13, 1, 15, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 14, 13, 16, 15 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 14, 1, 16, 10 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 14, 1, 16, 10 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 13, 1, 15, 10 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 13, 1, 15, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 0, 9, 2, 13 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 13, 7, 15, 10 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 13, 7, 15, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 0, 9, 2, 13 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 13, 1, 15, 4 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 13, 1, 15, 4 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 14, 9, 16, 13 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 13, 7, 15, 10 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 13, 7, 15, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 14, 9, 16, 13 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 13, 1, 15, 4 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 13, 1, 15, 4 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
{
|
||||||
|
"ambientocclusion": true,
|
||||||
|
"textures": {
|
||||||
|
"particle": "#texture"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{ "__comment": "Left-hand post",
|
||||||
|
"from": [ 0, 2, 7 ],
|
||||||
|
"to": [ 2, 13, 9 ],
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 0, 7, 2, 9 ], "texture": "#texture" },
|
||||||
|
"up": { "uv": [ 0, 7, 2, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 0, 0, 2, 11 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 0, 0, 2, 11 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture", "cullface": "west" },
|
||||||
|
"east": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__comment": "Right-hand post",
|
||||||
|
"from": [ 14, 2, 7 ],
|
||||||
|
"to": [ 16, 13, 9 ],
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 14, 7, 16, 9 ], "texture": "#texture" },
|
||||||
|
"up": { "uv": [ 14, 7, 16, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 14, 0, 16, 11 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 14, 0, 16, 11 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture", "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": "#texture" },
|
||||||
|
"up": { "uv": [ 6, 7, 8, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 6, 1, 8, 10 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 6, 1, 8, 10 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 7, 1, 9, 10 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 7, 1, 9, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 8, 7, 10, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 8, 1, 10, 10 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 8, 1, 10, 10 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 7, 1, 9, 10 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 7, 1, 9, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 2, 7, 6, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 2, 7, 6, 10 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 2, 7, 6, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 2, 7, 6, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 2, 1, 6, 4 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 2, 1, 6, 4 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 10, 7, 14, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 10, 7, 14, 10 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 10, 7, 14, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 10, 7, 14, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 10, 1, 14, 4 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 10, 1, 14, 4 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
{
|
||||||
|
"ambientocclusion": true,
|
||||||
|
"textures": {
|
||||||
|
"particle": "#texture"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{ "__comment": "Left-hand post",
|
||||||
|
"from": [ 0, 2, 7 ],
|
||||||
|
"to": [ 2, 13, 9 ],
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 0, 7, 2, 9 ], "texture": "#texture" },
|
||||||
|
"up": { "uv": [ 0, 7, 2, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 0, 0, 2, 11 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 0, 0, 2, 11 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture", "cullface": "west" },
|
||||||
|
"east": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__comment": "Right-hand post",
|
||||||
|
"from": [ 14, 2, 7 ],
|
||||||
|
"to": [ 16, 13, 9 ],
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 14, 7, 16, 9 ], "texture": "#texture" },
|
||||||
|
"up": { "uv": [ 14, 7, 16, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 14, 0, 16, 11 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 14, 0, 16, 11 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture", "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": "#texture" },
|
||||||
|
"up": { "uv": [ 0, 13, 2, 15 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 0, 1, 2, 10 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 0, 1, 2, 10 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 13, 1, 15, 10 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 13, 1, 15, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 14, 13, 16, 15 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 14, 1, 16, 10 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 14, 1, 16, 10 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 13, 1, 15, 10 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 13, 1, 15, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 0, 9, 2, 13 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 13, 7, 15, 10 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 13, 7, 15, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 0, 9, 2, 13 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 13, 1, 15, 4 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 13, 1, 15, 4 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 14, 9, 16, 13 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 13, 7, 15, 10 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 13, 7, 15, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 14, 9, 16, 13 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 13, 1, 15, 4 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 13, 1, 15, 4 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
107
assets/minecraft/models/block/template_fence_gate.json
Normal file
107
assets/minecraft/models/block/template_fence_gate.json
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
{ "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": {
|
||||||
|
"particle": "#texture"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{ "__comment": "Left-hand post",
|
||||||
|
"from": [ 0, 5, 7 ],
|
||||||
|
"to": [ 2, 16, 9 ],
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 0, 7, 2, 9 ], "texture": "#texture" },
|
||||||
|
"up": { "uv": [ 0, 7, 2, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 0, 0, 2, 11 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 0, 0, 2, 11 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture", "cullface": "west" },
|
||||||
|
"east": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__comment": "Right-hand post",
|
||||||
|
"from": [ 14, 5, 7 ],
|
||||||
|
"to": [ 16, 16, 9 ],
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 14, 7, 16, 9 ], "texture": "#texture" },
|
||||||
|
"up": { "uv": [ 14, 7, 16, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 14, 0, 16, 11 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 14, 0, 16, 11 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture", "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": "#texture" },
|
||||||
|
"up": { "uv": [ 6, 7, 8, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 6, 1, 8, 10 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 6, 1, 8, 10 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 7, 1, 9, 10 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 7, 1, 9, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 8, 7, 10, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 8, 1, 10, 10 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 8, 1, 10, 10 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 7, 1, 9, 10 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 7, 1, 9, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 2, 7, 6, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 2, 7, 6, 10 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 2, 7, 6, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 2, 7, 6, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 2, 1, 6, 4 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 2, 1, 6, 4 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 10, 7, 14, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 10, 7, 14, 10 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 10, 7, 14, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 10, 7, 14, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 10, 1, 14, 4 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 10, 1, 14, 4 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
95
assets/minecraft/models/block/template_fence_gate_open.json
Normal file
95
assets/minecraft/models/block/template_fence_gate_open.json
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
{
|
||||||
|
"textures": {
|
||||||
|
"particle": "#texture"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{ "__comment": "Left-hand post",
|
||||||
|
"from": [ 0, 5, 7 ],
|
||||||
|
"to": [ 2, 16, 9 ],
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 0, 7, 2, 9 ], "texture": "#texture" },
|
||||||
|
"up": { "uv": [ 0, 7, 2, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 0, 0, 2, 11 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 0, 0, 2, 11 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture", "cullface": "west" },
|
||||||
|
"east": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__comment": "Right-hand post",
|
||||||
|
"from": [ 14, 5, 7 ],
|
||||||
|
"to": [ 16, 16, 9 ],
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 14, 7, 16, 9 ], "texture": "#texture" },
|
||||||
|
"up": { "uv": [ 14, 7, 16, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 14, 0, 16, 11 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 14, 0, 16, 11 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture", "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": "#texture" },
|
||||||
|
"up": { "uv": [ 0, 13, 2, 15 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 0, 1, 2, 10 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 0, 1, 2, 10 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 13, 1, 15, 10 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 13, 1, 15, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 14, 13, 16, 15 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 14, 1, 16, 10 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 14, 1, 16, 10 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 13, 1, 15, 10 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 13, 1, 15, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 0, 9, 2, 13 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 13, 7, 15, 10 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 13, 7, 15, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 0, 9, 2, 13 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 13, 1, 15, 4 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 13, 1, 15, 4 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 14, 9, 16, 13 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 13, 7, 15, 10 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 13, 7, 15, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 14, 9, 16, 13 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 13, 1, 15, 4 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 13, 1, 15, 4 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
96
assets/minecraft/models/block/template_fence_gate_wall.json
Normal file
96
assets/minecraft/models/block/template_fence_gate_wall.json
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
{
|
||||||
|
"ambientocclusion": true,
|
||||||
|
"textures": {
|
||||||
|
"particle": "#texture"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{ "__comment": "Left-hand post",
|
||||||
|
"from": [ 0, 2, 7 ],
|
||||||
|
"to": [ 2, 13, 9 ],
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 0, 7, 2, 9 ], "texture": "#texture" },
|
||||||
|
"up": { "uv": [ 0, 7, 2, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 0, 0, 2, 11 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 0, 0, 2, 11 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture", "cullface": "west" },
|
||||||
|
"east": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__comment": "Right-hand post",
|
||||||
|
"from": [ 14, 2, 7 ],
|
||||||
|
"to": [ 16, 13, 9 ],
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 14, 7, 16, 9 ], "texture": "#texture" },
|
||||||
|
"up": { "uv": [ 14, 7, 16, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 14, 0, 16, 11 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 14, 0, 16, 11 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture", "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": "#texture" },
|
||||||
|
"up": { "uv": [ 6, 7, 8, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 6, 1, 8, 10 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 6, 1, 8, 10 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 7, 1, 9, 10 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 7, 1, 9, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 8, 7, 10, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 8, 1, 10, 10 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 8, 1, 10, 10 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 7, 1, 9, 10 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 7, 1, 9, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 2, 7, 6, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 2, 7, 6, 10 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 2, 7, 6, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 2, 7, 6, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 2, 1, 6, 4 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 2, 1, 6, 4 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 10, 7, 14, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 10, 7, 14, 10 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 10, 7, 14, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 10, 7, 14, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 10, 1, 14, 4 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 10, 1, 14, 4 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
{
|
||||||
|
"ambientocclusion": true,
|
||||||
|
"textures": {
|
||||||
|
"particle": "#texture"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{ "__comment": "Left-hand post",
|
||||||
|
"from": [ 0, 2, 7 ],
|
||||||
|
"to": [ 2, 13, 9 ],
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 0, 7, 2, 9 ], "texture": "#texture" },
|
||||||
|
"up": { "uv": [ 0, 7, 2, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 0, 0, 2, 11 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 0, 0, 2, 11 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture", "cullface": "west" },
|
||||||
|
"east": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__comment": "Right-hand post",
|
||||||
|
"from": [ 14, 2, 7 ],
|
||||||
|
"to": [ 16, 13, 9 ],
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 14, 7, 16, 9 ], "texture": "#texture" },
|
||||||
|
"up": { "uv": [ 14, 7, 16, 9 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 14, 0, 16, 11 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 14, 0, 16, 11 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 7, 0, 9, 11 ], "texture": "#texture", "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": "#texture" },
|
||||||
|
"up": { "uv": [ 0, 13, 2, 15 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 0, 1, 2, 10 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 0, 1, 2, 10 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 13, 1, 15, 10 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 13, 1, 15, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 14, 13, 16, 15 ], "texture": "#texture" },
|
||||||
|
"north": { "uv": [ 14, 1, 16, 10 ], "texture": "#texture" },
|
||||||
|
"south": { "uv": [ 14, 1, 16, 10 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 13, 1, 15, 10 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 13, 1, 15, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 0, 9, 2, 13 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 13, 7, 15, 10 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 13, 7, 15, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 0, 9, 2, 13 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 13, 1, 15, 4 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 13, 1, 15, 4 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 14, 9, 16, 13 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 13, 7, 15, 10 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 13, 7, 15, 10 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "__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": "#texture" },
|
||||||
|
"up": { "uv": [ 14, 9, 16, 13 ], "texture": "#texture" },
|
||||||
|
"west": { "uv": [ 13, 1, 15, 4 ], "texture": "#texture" },
|
||||||
|
"east": { "uv": [ 13, 1, 15, 4 ], "texture": "#texture" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
package com.straice.smoothdoors.client.anim;
|
||||||
|
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.DoorBlock;
|
||||||
|
import net.minecraft.block.ShapeContext;
|
||||||
|
import net.minecraft.block.enums.DoorHinge;
|
||||||
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.Box;
|
||||||
|
import net.minecraft.util.math.Direction;
|
||||||
|
import net.minecraft.util.math.RotationAxis;
|
||||||
|
import net.minecraft.world.BlockRenderView;
|
||||||
|
|
||||||
|
final class DoorAnimation {
|
||||||
|
|
||||||
|
private DoorAnimation() {}
|
||||||
|
|
||||||
|
static void apply(BlockState state, float angleDeg, MatrixStack matrices, BlockRenderView world) {
|
||||||
|
if (world == null) return;
|
||||||
|
|
||||||
|
Direction facing = state.get(DoorBlock.FACING);
|
||||||
|
DoorHinge hinge = state.get(DoorBlock.HINGE);
|
||||||
|
|
||||||
|
Direction hingeSide = (hinge == DoorHinge.RIGHT)
|
||||||
|
? facing.rotateYClockwise()
|
||||||
|
: facing.rotateYCounterclockwise();
|
||||||
|
|
||||||
|
Box bb = state.getOutlineShape(world, BlockPos.ORIGIN, ShapeContext.absent()).getBoundingBox();
|
||||||
|
|
||||||
|
float cx = (float) ((bb.minX + bb.maxX) * 0.5);
|
||||||
|
float cz = (float) ((bb.minZ + bb.maxZ) * 0.5);
|
||||||
|
|
||||||
|
float pivotX = cx;
|
||||||
|
float pivotZ = cz;
|
||||||
|
|
||||||
|
switch (hingeSide) {
|
||||||
|
case EAST -> pivotX = (float) bb.maxX;
|
||||||
|
case WEST -> pivotX = (float) bb.minX;
|
||||||
|
case SOUTH -> pivotZ = (float) bb.maxZ;
|
||||||
|
case NORTH -> pivotZ = (float) bb.minZ;
|
||||||
|
default -> {
|
||||||
|
pivotX = cx;
|
||||||
|
pivotZ = cz;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
float thickness = (facing == Direction.NORTH || facing == Direction.SOUTH)
|
||||||
|
? (float) (bb.maxZ - bb.minZ)
|
||||||
|
: (float) (bb.maxX - bb.minX);
|
||||||
|
float halfT = thickness * 0.5f;
|
||||||
|
|
||||||
|
float dX = 0.0f;
|
||||||
|
float dZ = 0.0f;
|
||||||
|
switch (facing) {
|
||||||
|
case NORTH -> dZ = halfT;
|
||||||
|
case SOUTH -> dZ = -halfT;
|
||||||
|
case WEST -> dX = halfT;
|
||||||
|
case EAST -> dX = -halfT;
|
||||||
|
default -> {
|
||||||
|
dX = 0.0f;
|
||||||
|
dZ = 0.0f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
double rad = Math.toRadians(angleDeg);
|
||||||
|
float cos = (float) Math.cos(rad);
|
||||||
|
float sin = (float) Math.sin(rad);
|
||||||
|
float rotDX = dX * cos - dZ * sin;
|
||||||
|
float rotDZ = dX * sin + dZ * cos;
|
||||||
|
float shiftX = dX - rotDX;
|
||||||
|
float shiftZ = dZ - rotDZ;
|
||||||
|
|
||||||
|
matrices.translate(shiftX, 0.0f, shiftZ);
|
||||||
|
matrices.translate(pivotX, 0.0f, pivotZ);
|
||||||
|
matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(angleDeg));
|
||||||
|
matrices.translate(-pivotX, 0.0f, -pivotZ);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,234 @@
|
|||||||
|
package com.straice.smoothdoors.client.anim;
|
||||||
|
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.FenceGateBlock;
|
||||||
|
import net.minecraft.client.MinecraftClient;
|
||||||
|
import net.minecraft.client.render.RenderLayers;
|
||||||
|
import net.minecraft.client.render.VertexConsumer;
|
||||||
|
import net.minecraft.client.render.VertexConsumerProvider;
|
||||||
|
import net.minecraft.client.render.block.BlockModelRenderer;
|
||||||
|
import net.minecraft.client.render.model.BakedQuad;
|
||||||
|
import net.minecraft.client.render.model.BlockModelPart;
|
||||||
|
import net.minecraft.client.render.model.BlockStateModel;
|
||||||
|
import net.minecraft.client.texture.Sprite;
|
||||||
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
|
import net.minecraft.util.math.Direction;
|
||||||
|
import net.minecraft.util.math.RotationAxis;
|
||||||
|
import net.minecraft.util.math.random.Random;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.EnumMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
final class FenceGateAnimation {
|
||||||
|
|
||||||
|
private static final float POST_EDGE = 2.0f / 16.0f;
|
||||||
|
private static final float EDGE_EPS = 1.0e-4f;
|
||||||
|
|
||||||
|
private FenceGateAnimation() {}
|
||||||
|
|
||||||
|
static void render(BlockState state, float angleDeg, MatrixStack matrices,
|
||||||
|
VertexConsumerProvider consumers, int light, int overlay) {
|
||||||
|
MinecraftClient mc = MinecraftClient.getInstance();
|
||||||
|
if (mc.world == null) return;
|
||||||
|
|
||||||
|
Direction facing = state.get(FenceGateBlock.FACING);
|
||||||
|
boolean leftRightIsX = facing.getAxis() == Direction.Axis.Z;
|
||||||
|
|
||||||
|
BlockStateModel baseModel = mc.getBlockRenderManager().getModel(state);
|
||||||
|
FenceGateModels models = splitFenceGateModels(baseModel, leftRightIsX);
|
||||||
|
if (models.isEmpty()) return;
|
||||||
|
|
||||||
|
int tint = mc.getBlockColors().getColor(state, null, null, 0);
|
||||||
|
float r = ((tint >> 16) & 0xFF) / 255.0f;
|
||||||
|
float g = ((tint >> 8) & 0xFF) / 255.0f;
|
||||||
|
float b = (tint & 0xFF) / 255.0f;
|
||||||
|
|
||||||
|
VertexConsumer consumer = consumers.getBuffer(RenderLayers.getEntityBlockLayer(state));
|
||||||
|
|
||||||
|
if (models.posts != null) {
|
||||||
|
BlockModelRenderer.render(matrices.peek(), consumer, models.posts, r, g, b, light, overlay);
|
||||||
|
}
|
||||||
|
|
||||||
|
float leftPivotX = leftRightIsX ? (1.0f / 16.0f) : 0.5f;
|
||||||
|
float leftPivotZ = leftRightIsX ? 0.5f : (1.0f / 16.0f);
|
||||||
|
float rightPivotX = leftRightIsX ? (15.0f / 16.0f) : 0.5f;
|
||||||
|
float rightPivotZ = leftRightIsX ? 0.5f : (15.0f / 16.0f);
|
||||||
|
|
||||||
|
if (models.left != null) {
|
||||||
|
matrices.push();
|
||||||
|
matrices.translate(leftPivotX, 0.0f, leftPivotZ);
|
||||||
|
matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(-angleDeg));
|
||||||
|
matrices.translate(-leftPivotX, 0.0f, -leftPivotZ);
|
||||||
|
BlockModelRenderer.render(matrices.peek(), consumer, models.left, r, g, b, light, overlay);
|
||||||
|
matrices.pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (models.right != null) {
|
||||||
|
matrices.push();
|
||||||
|
matrices.translate(rightPivotX, 0.0f, rightPivotZ);
|
||||||
|
matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(angleDeg));
|
||||||
|
matrices.translate(-rightPivotX, 0.0f, -rightPivotZ);
|
||||||
|
BlockModelRenderer.render(matrices.peek(), consumer, models.right, r, g, b, light, overlay);
|
||||||
|
matrices.pop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static FenceGateModels splitFenceGateModels(BlockStateModel model, boolean leftRightIsX) {
|
||||||
|
List<BlockModelPart> parts = model.getParts(Random.create(42L));
|
||||||
|
List<BlockModelPart> posts = new ArrayList<>();
|
||||||
|
List<BlockModelPart> left = new ArrayList<>();
|
||||||
|
List<BlockModelPart> right = new ArrayList<>();
|
||||||
|
|
||||||
|
for (BlockModelPart part : parts) {
|
||||||
|
FenceGateCollector postsCollector = new FenceGateCollector();
|
||||||
|
FenceGateCollector leftCollector = new FenceGateCollector();
|
||||||
|
FenceGateCollector rightCollector = new FenceGateCollector();
|
||||||
|
|
||||||
|
for (Direction dir : Direction.values()) {
|
||||||
|
addFenceGateQuads(part, dir, leftRightIsX, postsCollector, leftCollector, rightCollector);
|
||||||
|
}
|
||||||
|
addFenceGateQuads(part, null, leftRightIsX, postsCollector, leftCollector, rightCollector);
|
||||||
|
|
||||||
|
if (!postsCollector.isEmpty()) posts.add(postsCollector.toPart(part));
|
||||||
|
if (!leftCollector.isEmpty()) left.add(leftCollector.toPart(part));
|
||||||
|
if (!rightCollector.isEmpty()) right.add(rightCollector.toPart(part));
|
||||||
|
}
|
||||||
|
|
||||||
|
return new FenceGateModels(
|
||||||
|
posts.isEmpty() ? null : new StaticBlockStateModel(posts, model.particleSprite()),
|
||||||
|
left.isEmpty() ? null : new StaticBlockStateModel(left, model.particleSprite()),
|
||||||
|
right.isEmpty() ? null : new StaticBlockStateModel(right, model.particleSprite())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void addFenceGateQuads(BlockModelPart part, Direction dir, boolean leftRightIsX,
|
||||||
|
FenceGateCollector posts, FenceGateCollector left, FenceGateCollector right) {
|
||||||
|
List<BakedQuad> quads = part.getQuads(dir);
|
||||||
|
if (quads.isEmpty()) return;
|
||||||
|
|
||||||
|
for (BakedQuad quad : quads) {
|
||||||
|
FenceGateSection section = classifyFenceGateQuad(quad, leftRightIsX);
|
||||||
|
switch (section) {
|
||||||
|
case POSTS -> posts.add(dir, quad);
|
||||||
|
case LEFT -> left.add(dir, quad);
|
||||||
|
case RIGHT -> right.add(dir, quad);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static FenceGateSection classifyFenceGateQuad(BakedQuad quad, boolean leftRightIsX) {
|
||||||
|
int[] data = quad.vertexData();
|
||||||
|
if (data.length < 8) return FenceGateSection.LEFT;
|
||||||
|
|
||||||
|
int stride = data.length / 4;
|
||||||
|
float min = Float.POSITIVE_INFINITY;
|
||||||
|
float max = Float.NEGATIVE_INFINITY;
|
||||||
|
int coordOffset = leftRightIsX ? 0 : 2;
|
||||||
|
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
int base = i * stride + coordOffset;
|
||||||
|
float coord = Float.intBitsToFloat(data[base]);
|
||||||
|
min = Math.min(min, coord);
|
||||||
|
max = Math.max(max, coord);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (max <= POST_EDGE + EDGE_EPS || min >= (1.0f - POST_EDGE) - EDGE_EPS) {
|
||||||
|
return FenceGateSection.POSTS;
|
||||||
|
}
|
||||||
|
|
||||||
|
float center = (min + max) * 0.5f;
|
||||||
|
return center <= 0.5f ? FenceGateSection.LEFT : FenceGateSection.RIGHT;
|
||||||
|
}
|
||||||
|
|
||||||
|
private enum FenceGateSection { POSTS, LEFT, RIGHT }
|
||||||
|
|
||||||
|
private static final class FenceGateModels {
|
||||||
|
final BlockStateModel posts;
|
||||||
|
final BlockStateModel left;
|
||||||
|
final BlockStateModel right;
|
||||||
|
|
||||||
|
FenceGateModels(BlockStateModel posts, BlockStateModel left, BlockStateModel right) {
|
||||||
|
this.posts = posts;
|
||||||
|
this.left = left;
|
||||||
|
this.right = right;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean isEmpty() {
|
||||||
|
return posts == null && left == null && right == null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final class FenceGateCollector {
|
||||||
|
private final EnumMap<Direction, List<BakedQuad>> faceQuads = new EnumMap<>(Direction.class);
|
||||||
|
private final List<BakedQuad> unculled = new ArrayList<>();
|
||||||
|
|
||||||
|
void add(Direction face, BakedQuad quad) {
|
||||||
|
if (face == null) {
|
||||||
|
unculled.add(quad);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
faceQuads.computeIfAbsent(face, k -> new ArrayList<>()).add(quad);
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean isEmpty() {
|
||||||
|
return unculled.isEmpty() && faceQuads.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
BlockModelPart toPart(BlockModelPart template) {
|
||||||
|
return new StaticBlockModelPart(faceQuads, unculled, template.useAmbientOcclusion(), template.particleSprite());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final class StaticBlockModelPart implements BlockModelPart {
|
||||||
|
private final EnumMap<Direction, List<BakedQuad>> faceQuads;
|
||||||
|
private final List<BakedQuad> unculled;
|
||||||
|
private final boolean useAo;
|
||||||
|
private final Sprite particleSprite;
|
||||||
|
|
||||||
|
StaticBlockModelPart(EnumMap<Direction, List<BakedQuad>> faceQuads, List<BakedQuad> unculled,
|
||||||
|
boolean useAo, Sprite particleSprite) {
|
||||||
|
this.faceQuads = faceQuads;
|
||||||
|
this.unculled = unculled;
|
||||||
|
this.useAo = useAo;
|
||||||
|
this.particleSprite = particleSprite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<BakedQuad> getQuads(Direction face) {
|
||||||
|
if (face == null) return unculled;
|
||||||
|
List<BakedQuad> quads = faceQuads.get(face);
|
||||||
|
return (quads == null) ? List.of() : quads;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean useAmbientOcclusion() {
|
||||||
|
return useAo;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Sprite particleSprite() {
|
||||||
|
return particleSprite;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final class StaticBlockStateModel implements BlockStateModel {
|
||||||
|
private final List<BlockModelPart> parts;
|
||||||
|
private final Sprite particleSprite;
|
||||||
|
|
||||||
|
StaticBlockStateModel(List<BlockModelPart> parts, Sprite particleSprite) {
|
||||||
|
this.parts = parts;
|
||||||
|
this.particleSprite = particleSprite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addParts(Random random, List<BlockModelPart> out) {
|
||||||
|
out.addAll(parts);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Sprite particleSprite() {
|
||||||
|
return particleSprite;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,7 +5,6 @@ import com.straice.smoothdoors.config.SddConfigManager;
|
|||||||
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
|
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
|
||||||
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
|
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
|
||||||
import net.minecraft.block.*;
|
import net.minecraft.block.*;
|
||||||
import net.minecraft.block.enums.BlockHalf;
|
|
||||||
import net.minecraft.block.enums.DoorHinge;
|
import net.minecraft.block.enums.DoorHinge;
|
||||||
import net.minecraft.block.enums.DoubleBlockHalf;
|
import net.minecraft.block.enums.DoubleBlockHalf;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
@@ -14,7 +13,6 @@ import net.minecraft.client.render.VertexConsumerProvider;
|
|||||||
import net.minecraft.client.render.WorldRenderer;
|
import net.minecraft.client.render.WorldRenderer;
|
||||||
import net.minecraft.client.util.math.MatrixStack;
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
import net.minecraft.util.math.*;
|
import net.minecraft.util.math.*;
|
||||||
import net.minecraft.util.shape.VoxelShape;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
@@ -22,7 +20,7 @@ public final class SddAnimator {
|
|||||||
|
|
||||||
private static final MinecraftClient MC = MinecraftClient.getInstance();
|
private static final MinecraftClient MC = MinecraftClient.getInstance();
|
||||||
|
|
||||||
// Duración base (segundos) a speed = 1.0x
|
// Base duration (seconds) at speed = 1.0x
|
||||||
private static final float BASE_DURATION_S = 0.35f;
|
private static final float BASE_DURATION_S = 0.35f;
|
||||||
|
|
||||||
private static final Long2ObjectOpenHashMap<Anim> ANIMS = new Long2ObjectOpenHashMap<>();
|
private static final Long2ObjectOpenHashMap<Anim> ANIMS = new Long2ObjectOpenHashMap<>();
|
||||||
@@ -44,7 +42,7 @@ public final class SddAnimator {
|
|||||||
|
|
||||||
// === API usada por mixins ===
|
// === API usada por mixins ===
|
||||||
|
|
||||||
/** Oculta el bloque vanilla mientras animamos (evita “doble puertaâ€ÂÂ). */
|
/** Oculta el bloque vanilla mientras animamos (evita doble puerta). */
|
||||||
public static boolean shouldHideInChunk(BlockPos pos, BlockState state) {
|
public static boolean shouldHideInChunk(BlockPos pos, BlockState state) {
|
||||||
synchronized (ANIMS) {
|
synchronized (ANIMS) {
|
||||||
if (ANIMS.containsKey(pos.asLong())) return true;
|
if (ANIMS.containsKey(pos.asLong())) return true;
|
||||||
@@ -160,7 +158,7 @@ public final class SddAnimator {
|
|||||||
|
|
||||||
matrices.push();
|
matrices.push();
|
||||||
|
|
||||||
// Fijo en mundo: bloque - cámara
|
// Fijo en mundo: bloque - camara
|
||||||
matrices.translate(
|
matrices.translate(
|
||||||
pos.getX() - camPos.x,
|
pos.getX() - camPos.x,
|
||||||
pos.getY() - camPos.y,
|
pos.getY() - camPos.y,
|
||||||
@@ -170,10 +168,13 @@ public final class SddAnimator {
|
|||||||
float eased = easeInOut(t);
|
float eased = easeInOut(t);
|
||||||
float angleDeg = lerpAngleDeg(anim.fromOpen, anim.toOpen, eased, anim.kind, state);
|
float angleDeg = lerpAngleDeg(anim.fromOpen, anim.toOpen, eased, anim.kind, state);
|
||||||
|
|
||||||
applyTransform(anim.kind, state, angleDeg, matrices);
|
|
||||||
|
|
||||||
int light = WorldRenderer.getLightmapCoordinates((net.minecraft.world.BlockRenderView) MC.world, pos);
|
int light = WorldRenderer.getLightmapCoordinates((net.minecraft.world.BlockRenderView) MC.world, pos);
|
||||||
|
if (anim.kind == Kind.FENCE_GATE) {
|
||||||
|
FenceGateAnimation.render(state, angleDeg, matrices, consumers, light, OverlayTexture.DEFAULT_UV);
|
||||||
|
} else {
|
||||||
|
applyTransform(anim.kind, state, angleDeg, matrices);
|
||||||
MC.getBlockRenderManager().renderBlockAsEntity(state, matrices, consumers, light, OverlayTexture.DEFAULT_UV);
|
MC.getBlockRenderManager().renderBlockAsEntity(state, matrices, consumers, light, OverlayTexture.DEFAULT_UV);
|
||||||
|
}
|
||||||
|
|
||||||
matrices.pop();
|
matrices.pop();
|
||||||
}
|
}
|
||||||
@@ -207,7 +208,7 @@ public final class SddAnimator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// === ÃÂÂngulos y transforms ===
|
// === Angulos y transforms ===
|
||||||
|
|
||||||
private static float lerpAngleDeg(boolean fromOpen, boolean toOpen, float t, Kind kind, BlockState state) {
|
private static float lerpAngleDeg(boolean fromOpen, boolean toOpen, float t, Kind kind, BlockState state) {
|
||||||
float a = angleFor(kind, state, fromOpen);
|
float a = angleFor(kind, state, fromOpen);
|
||||||
@@ -230,142 +231,11 @@ public final class SddAnimator {
|
|||||||
|
|
||||||
private static void applyTransform(Kind kind, BlockState state, float angleDeg, MatrixStack matrices) {
|
private static void applyTransform(Kind kind, BlockState state, float angleDeg, MatrixStack matrices) {
|
||||||
switch (kind) {
|
switch (kind) {
|
||||||
case DOOR -> transformDoor(state, angleDeg, matrices);
|
case DOOR -> DoorAnimation.apply(state, angleDeg, matrices, MC.world);
|
||||||
case TRAPDOOR -> transformTrapdoor(state, angleDeg, matrices);
|
case TRAPDOOR -> TrapdoorAnimation.apply(state, angleDeg, matrices, MC.world);
|
||||||
case FENCE_GATE -> transformFenceGate(state, angleDeg, matrices);
|
case FENCE_GATE -> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* FIX del pivote:
|
|
||||||
* Estabas rotando alrededor de una “punta†(esquina). Una puerta real rota alrededor de la lÃÂÂnea de bisagra:
|
|
||||||
* - Coordenada del eje de bisagra (hingeSide): en el BORDE del modelo (min/max del bounding box)
|
|
||||||
* - Coordenada perpendicular: en el CENTRO del modelo (centro del bounding box)
|
|
||||||
*
|
|
||||||
* Esto quita el efecto de que la animación “empiece por encima/encima†y que parezca que se desplaza.
|
|
||||||
*/
|
|
||||||
private static void transformDoor(BlockState state, float angleDeg, MatrixStack matrices) {
|
|
||||||
if (MC.world == null) return;
|
|
||||||
|
|
||||||
Direction facing = state.get(DoorBlock.FACING);
|
|
||||||
DoorHinge hinge = state.get(DoorBlock.HINGE);
|
|
||||||
|
|
||||||
Direction hingeSide = (hinge == DoorHinge.RIGHT)
|
|
||||||
? facing.rotateYClockwise()
|
|
||||||
: facing.rotateYCounterclockwise();
|
|
||||||
|
|
||||||
Box bb = state.getOutlineShape(MC.world, BlockPos.ORIGIN, ShapeContext.absent()).getBoundingBox();
|
|
||||||
|
|
||||||
float cx = (float) ((bb.minX + bb.maxX) * 0.5);
|
|
||||||
float cz = (float) ((bb.minZ + bb.maxZ) * 0.5);
|
|
||||||
|
|
||||||
float pivotX = cx;
|
|
||||||
float pivotZ = cz;
|
|
||||||
|
|
||||||
switch (hingeSide) {
|
|
||||||
case EAST -> pivotX = (float) bb.maxX;
|
|
||||||
case WEST -> pivotX = (float) bb.minX;
|
|
||||||
case SOUTH -> pivotZ = (float) bb.maxZ;
|
|
||||||
case NORTH -> pivotZ = (float) bb.minZ;
|
|
||||||
default -> {
|
|
||||||
pivotX = cx;
|
|
||||||
pivotZ = cz;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
float thickness = (facing == Direction.NORTH || facing == Direction.SOUTH)
|
|
||||||
? (float) (bb.maxZ - bb.minZ)
|
|
||||||
: (float) (bb.maxX - bb.minX);
|
|
||||||
float halfT = thickness * 0.5f;
|
|
||||||
|
|
||||||
float dX = 0.0f;
|
|
||||||
float dZ = 0.0f;
|
|
||||||
switch (facing) {
|
|
||||||
case NORTH -> dZ = halfT;
|
|
||||||
case SOUTH -> dZ = -halfT;
|
|
||||||
case WEST -> dX = halfT;
|
|
||||||
case EAST -> dX = -halfT;
|
|
||||||
default -> {
|
|
||||||
dX = 0.0f;
|
|
||||||
dZ = 0.0f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
double rad = Math.toRadians(angleDeg);
|
|
||||||
float cos = (float) Math.cos(rad);
|
|
||||||
float sin = (float) Math.sin(rad);
|
|
||||||
float rotDX = dX * cos - dZ * sin;
|
|
||||||
float rotDZ = dX * sin + dZ * cos;
|
|
||||||
float shiftX = dX - rotDX;
|
|
||||||
float shiftZ = dZ - rotDZ;
|
|
||||||
|
|
||||||
matrices.translate(shiftX, 0.0f, shiftZ);
|
|
||||||
matrices.translate(pivotX, 0.0f, pivotZ);
|
|
||||||
matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(angleDeg));
|
|
||||||
matrices.translate(-pivotX, 0.0f, -pivotZ);
|
|
||||||
}
|
|
||||||
|
|
||||||
// (trapdoors/gates luego los ajustamos)
|
|
||||||
private static void transformTrapdoor(BlockState state, float baseAngleDeg, MatrixStack matrices) {
|
|
||||||
if (MC.world == null) return;
|
|
||||||
|
|
||||||
Direction facing = state.get(TrapdoorBlock.FACING);
|
|
||||||
BlockHalf half = state.get(TrapdoorBlock.HALF);
|
|
||||||
|
|
||||||
VoxelShape collShape = state.getCollisionShape(MC.world, BlockPos.ORIGIN, ShapeContext.absent());
|
|
||||||
Box bb = collShape.isEmpty()
|
|
||||||
? state.getOutlineShape(MC.world, BlockPos.ORIGIN, ShapeContext.absent()).getBoundingBox()
|
|
||||||
: collShape.getBoundingBox();
|
|
||||||
|
|
||||||
float angle;
|
|
||||||
switch (facing) {
|
|
||||||
case NORTH -> angle = baseAngleDeg;
|
|
||||||
case SOUTH -> angle = -baseAngleDeg;
|
|
||||||
case EAST -> angle = baseAngleDeg;
|
|
||||||
case WEST -> angle = -baseAngleDeg;
|
|
||||||
default -> angle = baseAngleDeg;
|
|
||||||
}
|
|
||||||
if (half == BlockHalf.TOP) angle = -angle;
|
|
||||||
|
|
||||||
float pivotX = (float) ((bb.minX + bb.maxX) * 0.5);
|
|
||||||
float pivotZ = (float) ((bb.minZ + bb.maxZ) * 0.5);
|
|
||||||
Direction hingeSide = facing.getOpposite();
|
|
||||||
switch (hingeSide) {
|
|
||||||
case NORTH -> pivotZ = (float) bb.minZ;
|
|
||||||
case SOUTH -> pivotZ = (float) bb.maxZ;
|
|
||||||
case WEST -> pivotX = (float) bb.minX;
|
|
||||||
case EAST -> pivotX = (float) bb.maxX;
|
|
||||||
default -> {
|
|
||||||
pivotX = (float) ((bb.minX + bb.maxX) * 0.5);
|
|
||||||
pivotZ = (float) ((bb.minZ + bb.maxZ) * 0.5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
float thickness = (float) (bb.maxY - bb.minY);
|
|
||||||
float halfT = thickness > 0.0f ? thickness * 0.5f : (3.0f / 32.0f);
|
|
||||||
|
|
||||||
float pivotYClosed = (half == BlockHalf.TOP) ? (float) bb.maxY - halfT : (float) bb.minY + halfT;
|
|
||||||
float pivotYOpen = (half == BlockHalf.TOP) ? (float) bb.maxY : (float) bb.minY;
|
|
||||||
|
|
||||||
float progress = MathHelper.clamp(Math.abs(angle) / 90.0f, 0.0f, 1.0f);
|
|
||||||
float pivotY = MathHelper.lerp(progress, pivotYClosed, pivotYOpen);
|
|
||||||
float pivotXInterp = pivotX;
|
|
||||||
float pivotZInterp = pivotZ;
|
|
||||||
|
|
||||||
matrices.translate(pivotXInterp, pivotY, pivotZInterp);
|
|
||||||
|
|
||||||
if (facing == Direction.NORTH || facing == Direction.SOUTH) {
|
|
||||||
matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(angle));
|
|
||||||
} else {
|
|
||||||
matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(angle));
|
|
||||||
}
|
|
||||||
|
|
||||||
matrices.translate(-pivotXInterp, -pivotY, -pivotZInterp);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void transformFenceGate(BlockState state, float angleDeg, MatrixStack matrices) {
|
|
||||||
matrices.translate(0.5f, 0.0f, 0.5f);
|
|
||||||
matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(angleDeg));
|
|
||||||
matrices.translate(-0.5f, 0.0f, -0.5f);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// === Utilidades ===
|
// === Utilidades ===
|
||||||
@@ -511,4 +381,3 @@ public final class SddAnimator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,87 @@
|
|||||||
|
package com.straice.smoothdoors.client.anim;
|
||||||
|
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.ShapeContext;
|
||||||
|
import net.minecraft.block.TrapdoorBlock;
|
||||||
|
import net.minecraft.block.enums.BlockHalf;
|
||||||
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.Box;
|
||||||
|
import net.minecraft.util.math.Direction;
|
||||||
|
import net.minecraft.util.math.RotationAxis;
|
||||||
|
import net.minecraft.util.shape.VoxelShape;
|
||||||
|
import net.minecraft.world.BlockRenderView;
|
||||||
|
|
||||||
|
final class TrapdoorAnimation {
|
||||||
|
|
||||||
|
private TrapdoorAnimation() {}
|
||||||
|
|
||||||
|
static void apply(BlockState state, float baseAngleDeg, MatrixStack matrices, BlockRenderView world) {
|
||||||
|
if (world == null) return;
|
||||||
|
|
||||||
|
Direction facing = state.get(TrapdoorBlock.FACING);
|
||||||
|
BlockHalf half = state.get(TrapdoorBlock.HALF);
|
||||||
|
|
||||||
|
VoxelShape collShape = state.getCollisionShape(world, BlockPos.ORIGIN, ShapeContext.absent());
|
||||||
|
Box bb = collShape.isEmpty()
|
||||||
|
? state.getOutlineShape(world, BlockPos.ORIGIN, ShapeContext.absent()).getBoundingBox()
|
||||||
|
: collShape.getBoundingBox();
|
||||||
|
|
||||||
|
Direction hingeSide = facing.getOpposite();
|
||||||
|
|
||||||
|
float pivotX = (float) ((bb.minX + bb.maxX) * 0.5);
|
||||||
|
float pivotZ = (float) ((bb.minZ + bb.maxZ) * 0.5);
|
||||||
|
switch (hingeSide) {
|
||||||
|
case NORTH -> pivotZ = (float) bb.minZ;
|
||||||
|
case SOUTH -> pivotZ = (float) bb.maxZ;
|
||||||
|
case WEST -> pivotX = (float) bb.minX;
|
||||||
|
case EAST -> pivotX = (float) bb.maxX;
|
||||||
|
default -> {
|
||||||
|
pivotX = (float) ((bb.minX + bb.maxX) * 0.5);
|
||||||
|
pivotZ = (float) ((bb.minZ + bb.maxZ) * 0.5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
float pivotY = (half == BlockHalf.TOP) ? (float) bb.maxY : (float) bb.minY;
|
||||||
|
|
||||||
|
float angle;
|
||||||
|
switch (hingeSide) {
|
||||||
|
case NORTH, EAST -> angle = -baseAngleDeg;
|
||||||
|
case SOUTH, WEST -> angle = baseAngleDeg;
|
||||||
|
default -> angle = baseAngleDeg;
|
||||||
|
}
|
||||||
|
if (half == BlockHalf.TOP) angle = -angle;
|
||||||
|
|
||||||
|
float thickness = (float) (bb.maxY - bb.minY);
|
||||||
|
float halfT = thickness > 0.0f ? thickness * 0.5f : (3.0f / 32.0f);
|
||||||
|
float dY = (half == BlockHalf.TOP) ? -halfT : halfT;
|
||||||
|
|
||||||
|
double rad = Math.toRadians(angle);
|
||||||
|
float cos = (float) Math.cos(rad);
|
||||||
|
float sin = (float) Math.sin(rad);
|
||||||
|
|
||||||
|
float shiftX = 0.0f;
|
||||||
|
float shiftY = 0.0f;
|
||||||
|
float shiftZ = 0.0f;
|
||||||
|
if (hingeSide == Direction.NORTH || hingeSide == Direction.SOUTH) {
|
||||||
|
float rotY = dY * cos;
|
||||||
|
float rotZ = dY * sin;
|
||||||
|
shiftY = dY - rotY;
|
||||||
|
shiftZ = -rotZ;
|
||||||
|
} else {
|
||||||
|
float rotX = -dY * sin;
|
||||||
|
float rotY = dY * cos;
|
||||||
|
shiftX = -rotX;
|
||||||
|
shiftY = dY - rotY;
|
||||||
|
}
|
||||||
|
|
||||||
|
matrices.translate(shiftX, shiftY, shiftZ);
|
||||||
|
matrices.translate(pivotX, pivotY, pivotZ);
|
||||||
|
if (hingeSide == Direction.NORTH || hingeSide == Direction.SOUTH) {
|
||||||
|
matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(angle));
|
||||||
|
} else {
|
||||||
|
matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(angle));
|
||||||
|
}
|
||||||
|
matrices.translate(-pivotX, -pivotY, -pivotZ);
|
||||||
|
matrices.translate(-shiftX, -shiftY, -shiftZ);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -57,11 +57,11 @@ public class SddConfigScreen extends Screen {
|
|||||||
|
|
||||||
// Fence gates row
|
// Fence gates row
|
||||||
addDrawableChild(toggle(leftX, y, colW, h,
|
addDrawableChild(toggle(leftX, y, colW, h,
|
||||||
() -> "Fences | Use: " + (cfg.connectFenceGates ? "ON" : "OFF"),
|
() -> "Gates | Use: " + (cfg.connectFenceGates ? "ON" : "OFF"),
|
||||||
() -> cfg.connectFenceGates = !cfg.connectFenceGates));
|
() -> cfg.connectFenceGates = !cfg.connectFenceGates));
|
||||||
|
|
||||||
addDrawableChild(toggle(rightX, y, colW, h,
|
addDrawableChild(toggle(rightX, y, colW, h,
|
||||||
() -> "Fences | Redstone: " + (cfg.redstoneDoubleFenceGates ? "ON" : "OFF"),
|
() -> "Gates | Redstone: " + (cfg.redstoneDoubleFenceGates ? "ON" : "OFF"),
|
||||||
() -> cfg.redstoneDoubleFenceGates = !cfg.redstoneDoubleFenceGates));
|
() -> cfg.redstoneDoubleFenceGates = !cfg.redstoneDoubleFenceGates));
|
||||||
|
|
||||||
y += 34;
|
y += 34;
|
||||||
@@ -78,7 +78,7 @@ public class SddConfigScreen extends Screen {
|
|||||||
y += 24;
|
y += 24;
|
||||||
|
|
||||||
addDrawableChild(toggle(centerX - 120, y, 240, h,
|
addDrawableChild(toggle(centerX - 120, y, 240, h,
|
||||||
() -> "Animation Fences: " + (cfg.animateFenceGates ? "ON" : "OFF"),
|
() -> "Animation Gates: " + (cfg.animateFenceGates ? "ON" : "OFF"),
|
||||||
() -> cfg.animateFenceGates = !cfg.animateFenceGates));
|
() -> cfg.animateFenceGates = !cfg.animateFenceGates));
|
||||||
y += 34;
|
y += 34;
|
||||||
|
|
||||||
@@ -98,7 +98,7 @@ public class SddConfigScreen extends Screen {
|
|||||||
y += 24;
|
y += 24;
|
||||||
|
|
||||||
addDrawableChild(new SpeedSlider(centerX - 120, y, 240, h,
|
addDrawableChild(new SpeedSlider(centerX - 120, y, 240, h,
|
||||||
"Speed Fences", cfg.fenceGateSpeed, v -> {
|
"Speed Gates", cfg.fenceGateSpeed, v -> {
|
||||||
cfg.fenceGateSpeed = v;
|
cfg.fenceGateSpeed = v;
|
||||||
SddConfigManager.save();
|
SddConfigManager.save();
|
||||||
}));
|
}));
|
||||||
|
|||||||
Reference in New Issue
Block a user