Merge branch 'mc1.15/dev' into mc1.15/ponder-ui
This commit is contained in:
commit
550744da92
96 changed files with 1540 additions and 1356 deletions
|
@ -16,7 +16,7 @@ a579c40c43dc2174afb66f42d00d0c4a0efaaeee assets/create/blockstates/andesite_bric
|
|||
96b5284693da168ab8e0809d86515b5f1a7e763f assets/create/blockstates/andesite_cobblestone_stairs.json
|
||||
82bd82270aff7d51e9239680ef4dd7b5c899ceb0 assets/create/blockstates/andesite_cobblestone_wall.json
|
||||
9639b901ffdd2ecccab5575c5c9e6c7b5c901e02 assets/create/blockstates/andesite_encased_shaft.json
|
||||
7187eba21a32e6954261cc71008ec1834a2e8af7 assets/create/blockstates/andesite_funnel.json
|
||||
53cf4cfd94db1f44e9865b9fe5db383d01a12671 assets/create/blockstates/andesite_funnel.json
|
||||
398922758a6219544e5b85c91c9cf8a543b437e5 assets/create/blockstates/andesite_pillar.json
|
||||
1d2d8081581e07d9be4b382aede4f2de4401cc6b assets/create/blockstates/andesite_tunnel.json
|
||||
e555e3c2b2d3f01440e48db4ba88f7e00fd99b6f assets/create/blockstates/basin.json
|
||||
|
@ -34,7 +34,7 @@ ee1299a15fca849eb42bf81507f85a54c167bbfe assets/create/blockstates/brass_belt_fu
|
|||
8b1dd00adcc7e74c5a9feed069e2610b15a338cb assets/create/blockstates/brass_block.json
|
||||
b8dd6e505943e06706d0718ece620ab3cf943650 assets/create/blockstates/brass_casing.json
|
||||
288bad07593a8a2c8efaf44bba0ffb0011d36cd3 assets/create/blockstates/brass_encased_shaft.json
|
||||
8b5e88dea4e10ba3c74f0f161e49fed31a376ea1 assets/create/blockstates/brass_funnel.json
|
||||
adfbd6cc5e44a0f431180aedbe65a19428299d8e assets/create/blockstates/brass_funnel.json
|
||||
672eedcd3520c6d39603449165a23be9c612c620 assets/create/blockstates/brass_tunnel.json
|
||||
11ebdd9bd0815833e62ec1bea03a4cdd86ce00f3 assets/create/blockstates/brown_sail.json
|
||||
e81608346d43406ee72cae0f78b8bcfb37ba2d75 assets/create/blockstates/brown_seat.json
|
||||
|
@ -401,19 +401,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j
|
|||
7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json
|
||||
b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json
|
||||
e3f618c5b622d21880de858678d1802cbf65e615 assets/create/lang/en_ud.json
|
||||
9797de418101ddd344ac8ec2b91fb2ba25ea504e assets/create/lang/en_us.json
|
||||
64b7f0ddac53567a3a23cd29774fdb2b93f9e777 assets/create/lang/unfinished/de_de.json
|
||||
54ea6fa80308ee8908ae2596e8bcaa6d9e5d0731 assets/create/lang/unfinished/es_es.json
|
||||
c1bf9ae424ffe72ba3684d1aa359f2b4a2bb2e88 assets/create/lang/unfinished/es_mx.json
|
||||
104eeb4b28ce3be1c0fc7ce2b779dc79dc1e2f5d assets/create/lang/unfinished/fr_fr.json
|
||||
da5819debc20d7a65c3f8472889f8be1e9bc97c5 assets/create/lang/unfinished/it_it.json
|
||||
c697d1f20b6482e03a42cbdd9c2fad1b63094dcb assets/create/lang/unfinished/ja_jp.json
|
||||
0746089d44ec5328f8ce8c8cf2328b2de5ec885e assets/create/lang/unfinished/ko_kr.json
|
||||
cac8ff78aecfbf596af332d21406fddca9f53d5a assets/create/lang/unfinished/nl_nl.json
|
||||
7424b098208ec7d3a06c6bf614a303b12944d4b5 assets/create/lang/unfinished/pt_br.json
|
||||
95adcdad2f75c548cac7cdf61fd141b08e451f50 assets/create/lang/unfinished/ru_ru.json
|
||||
be41354ccd7dbfbc60a4e36cf37388c7c7a4f88d assets/create/lang/unfinished/zh_cn.json
|
||||
241fd40fc3ceba47f58c83da244fca4efd969b05 assets/create/lang/unfinished/zh_tw.json
|
||||
69eecffe64535bdf97970f09d3fd18ffa1dae05b assets/create/lang/en_us.json
|
||||
b61608001cf56be4b8dc32bec82a763610b558fc assets/create/lang/unfinished/de_de.json
|
||||
03756500794e32ff51549269a33b824acaeb74e4 assets/create/lang/unfinished/es_es.json
|
||||
eebffed3ac6127426f8702ee0303cf9669741476 assets/create/lang/unfinished/es_mx.json
|
||||
600126988d661c32b917643fb57c57848f58373f assets/create/lang/unfinished/fr_fr.json
|
||||
fadd7a77044e77183ca72484ec8fa6ddf14312bf assets/create/lang/unfinished/it_it.json
|
||||
51f49b662a8acc436ab98d1fa6287b97be2e5acc assets/create/lang/unfinished/ja_jp.json
|
||||
a92852c60438845b5672c0f2049cc059140644b6 assets/create/lang/unfinished/ko_kr.json
|
||||
daafb42a5c92310dcb9aa223e5e9683be1fa4487 assets/create/lang/unfinished/nl_nl.json
|
||||
be51f53337c9f91d722ffc592070e01115cd575c assets/create/lang/unfinished/pt_br.json
|
||||
464e5a32896c5b6a3c201d1979c98654c672ad89 assets/create/lang/unfinished/ru_ru.json
|
||||
7e12449d2bacf443f8f97ba42bfd82b00a69129c assets/create/lang/unfinished/zh_cn.json
|
||||
cf33f05e397956a60cc386e4244cf96a57b9c152 assets/create/lang/unfinished/zh_tw.json
|
||||
846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json
|
||||
1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json
|
||||
1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json
|
||||
|
@ -461,18 +461,14 @@ ad255a62a5f54b578db06e89fd7160001f905675 assets/create/models/block/andesite_cob
|
|||
a033fbac3129bba9211c6c4a0e16c905643afa39 assets/create/models/block/andesite_cobblestone_stairs_outer.json
|
||||
1c574ee47aeb6fcb305bfc95dd131e153b795a0e assets/create/models/block/andesite_cobblestone_wall_post.json
|
||||
0ed983628e8868f77301bea1111570d3631f24fb assets/create/models/block/andesite_cobblestone_wall_side.json
|
||||
7d5faceb2a8d67acddd39625da6d5853f07ea8bd assets/create/models/block/andesite_funnel_ceiling_pull.json
|
||||
82393ded7287660d16549e321317dfe4488cc81d assets/create/models/block/andesite_funnel_ceiling_pull_powered.json
|
||||
40d7adae3b5eecd8ed08445b2d7f43d7a0684837 assets/create/models/block/andesite_funnel_ceiling_push.json
|
||||
940cace1d38fef0d5d88a391b0ba8cf690b38a44 assets/create/models/block/andesite_funnel_ceiling_push_powered.json
|
||||
c77c660ea142419e93754c9702445c269dbcd0cc assets/create/models/block/andesite_funnel_floor_pull.json
|
||||
16d402c764364254a704a13736bd68455edc28ba assets/create/models/block/andesite_funnel_floor_pull_powered.json
|
||||
6a809d0e0e53b845b587276444cb7b64a1e15e81 assets/create/models/block/andesite_funnel_floor_push.json
|
||||
6eac3e4f593e4182f5c216a900136a62ea953fb5 assets/create/models/block/andesite_funnel_floor_push_powered.json
|
||||
cc187c98c62b47f5bdb6e5187f52d3d927486376 assets/create/models/block/andesite_funnel_wall_pull.json
|
||||
525cf080df53a428d1321d25c2021b5f3b80a4e6 assets/create/models/block/andesite_funnel_wall_pull_powered.json
|
||||
78fcd6a91a84f5824e3e0006609b6f01760238d4 assets/create/models/block/andesite_funnel_wall_push.json
|
||||
6c48d1a0b8cb007a6eddaa9b2f6cb8a98334d34e assets/create/models/block/andesite_funnel_wall_push_powered.json
|
||||
8d4e4a7c6ad6d45c7aa7ca3105a025511571ff26 assets/create/models/block/andesite_funnel_horizontal_pull.json
|
||||
9841d6a09a09bf4d5d6a39bdc4904d86b3a825f8 assets/create/models/block/andesite_funnel_horizontal_pull_powered.json
|
||||
86d5df6e365d9b2e9682f0839f61058360828ba2 assets/create/models/block/andesite_funnel_horizontal_push.json
|
||||
50af1ff6ce9af162d4e438f21952c7215608dc8e assets/create/models/block/andesite_funnel_horizontal_push_powered.json
|
||||
618d6ca90addb5913c72789f6188c957afa503f3 assets/create/models/block/andesite_funnel_vertical_pull.json
|
||||
45365708fa75e2cd3d0702fb0e4960861ada27ab assets/create/models/block/andesite_funnel_vertical_pull_powered.json
|
||||
53bdeba42894242088e8f7e7734a101fa998d0e4 assets/create/models/block/andesite_funnel_vertical_push.json
|
||||
3e88fa45e22868dae92a014e589585d37eb465ad assets/create/models/block/andesite_funnel_vertical_push_powered.json
|
||||
b1d0bb538fc8285b7d3fd77a977d78a104b83b62 assets/create/models/block/andesite_pillar.json
|
||||
aaf2e4259bcfcedd3400e9acb2d64c0cf06f7fb1 assets/create/models/block/andesite_tunnel/cross.json
|
||||
75f628178fa21a2bd301eea8d1cebf7e94f7d5cc assets/create/models/block/andesite_tunnel/straight.json
|
||||
|
@ -513,18 +509,14 @@ dfc6250e28e12ff193a45891978ec50c406fc0c2 assets/create/models/block/brass_belt_f
|
|||
97410a12b7c1461f88fb633f26ff566a0636b627 assets/create/models/block/brass_belt_funnel__retracted.json
|
||||
71d0ad31d89d4ea3f243c6003b17f57fd168c933 assets/create/models/block/brass_block.json
|
||||
166a5c053a81e6aadc24509ed24dc144a7255969 assets/create/models/block/brass_casing.json
|
||||
f5f689dc8be53e560878d3dde7b6eda6b3bf28e3 assets/create/models/block/brass_funnel_ceiling_pull.json
|
||||
142a56e522c74268d0b418985eb3fd285e371295 assets/create/models/block/brass_funnel_ceiling_pull_powered.json
|
||||
e583d701961b68223778d28edc0e2686c1a5c5df assets/create/models/block/brass_funnel_ceiling_push.json
|
||||
ccb2b596c3f190c26fdec06dd2b53ac3e59b1ff2 assets/create/models/block/brass_funnel_ceiling_push_powered.json
|
||||
7f541d8235326fea3ecb370c4cf2913867f439ad assets/create/models/block/brass_funnel_floor_pull.json
|
||||
5277d7c614991a5bce0e9234c4094f02c6d201c2 assets/create/models/block/brass_funnel_floor_pull_powered.json
|
||||
1831d87b5a9784c12cecefbb9d3173c29f4ddc87 assets/create/models/block/brass_funnel_floor_push.json
|
||||
6aee078641719086c9a98ebd1c0d0d61cd4d33a9 assets/create/models/block/brass_funnel_floor_push_powered.json
|
||||
aa86ddeeb41aea5bd85dd488d932fbc913828b1f assets/create/models/block/brass_funnel_wall_pull.json
|
||||
161b420ee4f41d436177e20314dcbe61ecec53a8 assets/create/models/block/brass_funnel_wall_pull_powered.json
|
||||
24362e71ca3a6d0f2dbf129909eceb8b3937a66b assets/create/models/block/brass_funnel_wall_push.json
|
||||
76cdebba3116be88926d9640917e579377ef3134 assets/create/models/block/brass_funnel_wall_push_powered.json
|
||||
f7fd1f49857eca94e4135e65c85127510d666e4f assets/create/models/block/brass_funnel_horizontal_pull.json
|
||||
45a23298ad03fd3b5dc2757dcd7edc18b8cce222 assets/create/models/block/brass_funnel_horizontal_pull_powered.json
|
||||
a9fc7210d44b47202438668f11b31099e82c9ebd assets/create/models/block/brass_funnel_horizontal_push.json
|
||||
4049bf503ec2ee22412c59e05299de20319b0dc6 assets/create/models/block/brass_funnel_horizontal_push_powered.json
|
||||
320e377a4380ac637bff2e0535f229c52d886437 assets/create/models/block/brass_funnel_vertical_pull.json
|
||||
28c2f8ca6403f98b82e3a0eadb608a41490cc96f assets/create/models/block/brass_funnel_vertical_pull_powered.json
|
||||
c4c46d47854c9a6cf8f410006a35bbc8e599f0d5 assets/create/models/block/brass_funnel_vertical_push.json
|
||||
fd6f6607a4742fa87dfe1768927a29dc4975ce7a assets/create/models/block/brass_funnel_vertical_push_powered.json
|
||||
520087db8d479c66f85f3483af813fb668f27503 assets/create/models/block/brass_tunnel/cross.json
|
||||
347ed67bf3426e323354e2d959fc9563dc7eeecd assets/create/models/block/brass_tunnel/straight.json
|
||||
a959e03ca339badb49fe58ba53d86a84352e91f3 assets/create/models/block/brass_tunnel/t_left.json
|
||||
|
|
|
@ -1,183 +1,99 @@
|
|||
{
|
||||
"variants": {
|
||||
"extracting=false,face=floor,facing=north,powered=false": {
|
||||
"model": "create:block/andesite_funnel_floor_pull"
|
||||
},
|
||||
"extracting=true,face=floor,facing=north,powered=false": {
|
||||
"model": "create:block/andesite_funnel_floor_push"
|
||||
},
|
||||
"extracting=false,face=wall,facing=north,powered=false": {
|
||||
"model": "create:block/andesite_funnel_wall_pull"
|
||||
},
|
||||
"extracting=true,face=wall,facing=north,powered=false": {
|
||||
"model": "create:block/andesite_funnel_wall_push"
|
||||
},
|
||||
"extracting=false,face=ceiling,facing=north,powered=false": {
|
||||
"model": "create:block/andesite_funnel_ceiling_pull"
|
||||
},
|
||||
"extracting=true,face=ceiling,facing=north,powered=false": {
|
||||
"model": "create:block/andesite_funnel_ceiling_push"
|
||||
},
|
||||
"extracting=false,face=floor,facing=south,powered=false": {
|
||||
"model": "create:block/andesite_funnel_floor_pull",
|
||||
"extracting=false,facing=down,powered=false": {
|
||||
"model": "create:block/andesite_funnel_vertical_pull",
|
||||
"x": 180,
|
||||
"y": 180
|
||||
},
|
||||
"extracting=true,face=floor,facing=south,powered=false": {
|
||||
"model": "create:block/andesite_funnel_floor_push",
|
||||
"extracting=true,facing=down,powered=false": {
|
||||
"model": "create:block/andesite_funnel_vertical_push",
|
||||
"x": 180,
|
||||
"y": 180
|
||||
},
|
||||
"extracting=false,face=wall,facing=south,powered=false": {
|
||||
"model": "create:block/andesite_funnel_wall_pull",
|
||||
"extracting=false,facing=up,powered=false": {
|
||||
"model": "create:block/andesite_funnel_vertical_pull",
|
||||
"y": 180
|
||||
},
|
||||
"extracting=true,face=wall,facing=south,powered=false": {
|
||||
"model": "create:block/andesite_funnel_wall_push",
|
||||
"extracting=true,facing=up,powered=false": {
|
||||
"model": "create:block/andesite_funnel_vertical_push",
|
||||
"y": 180
|
||||
},
|
||||
"extracting=false,face=ceiling,facing=south,powered=false": {
|
||||
"model": "create:block/andesite_funnel_ceiling_pull",
|
||||
"extracting=false,facing=north,powered=false": {
|
||||
"model": "create:block/andesite_funnel_horizontal_pull"
|
||||
},
|
||||
"extracting=true,facing=north,powered=false": {
|
||||
"model": "create:block/andesite_funnel_horizontal_push"
|
||||
},
|
||||
"extracting=false,facing=south,powered=false": {
|
||||
"model": "create:block/andesite_funnel_horizontal_pull",
|
||||
"y": 180
|
||||
},
|
||||
"extracting=true,face=ceiling,facing=south,powered=false": {
|
||||
"model": "create:block/andesite_funnel_ceiling_push",
|
||||
"extracting=true,facing=south,powered=false": {
|
||||
"model": "create:block/andesite_funnel_horizontal_push",
|
||||
"y": 180
|
||||
},
|
||||
"extracting=false,face=floor,facing=west,powered=false": {
|
||||
"model": "create:block/andesite_funnel_floor_pull",
|
||||
"extracting=false,facing=west,powered=false": {
|
||||
"model": "create:block/andesite_funnel_horizontal_pull",
|
||||
"y": 270
|
||||
},
|
||||
"extracting=true,face=floor,facing=west,powered=false": {
|
||||
"model": "create:block/andesite_funnel_floor_push",
|
||||
"extracting=true,facing=west,powered=false": {
|
||||
"model": "create:block/andesite_funnel_horizontal_push",
|
||||
"y": 270
|
||||
},
|
||||
"extracting=false,face=wall,facing=west,powered=false": {
|
||||
"model": "create:block/andesite_funnel_wall_pull",
|
||||
"y": 270
|
||||
},
|
||||
"extracting=true,face=wall,facing=west,powered=false": {
|
||||
"model": "create:block/andesite_funnel_wall_push",
|
||||
"y": 270
|
||||
},
|
||||
"extracting=false,face=ceiling,facing=west,powered=false": {
|
||||
"model": "create:block/andesite_funnel_ceiling_pull",
|
||||
"y": 270
|
||||
},
|
||||
"extracting=true,face=ceiling,facing=west,powered=false": {
|
||||
"model": "create:block/andesite_funnel_ceiling_push",
|
||||
"y": 270
|
||||
},
|
||||
"extracting=false,face=floor,facing=east,powered=false": {
|
||||
"model": "create:block/andesite_funnel_floor_pull",
|
||||
"extracting=false,facing=east,powered=false": {
|
||||
"model": "create:block/andesite_funnel_horizontal_pull",
|
||||
"y": 90
|
||||
},
|
||||
"extracting=true,face=floor,facing=east,powered=false": {
|
||||
"model": "create:block/andesite_funnel_floor_push",
|
||||
"extracting=true,facing=east,powered=false": {
|
||||
"model": "create:block/andesite_funnel_horizontal_push",
|
||||
"y": 90
|
||||
},
|
||||
"extracting=false,face=wall,facing=east,powered=false": {
|
||||
"model": "create:block/andesite_funnel_wall_pull",
|
||||
"y": 90
|
||||
},
|
||||
"extracting=true,face=wall,facing=east,powered=false": {
|
||||
"model": "create:block/andesite_funnel_wall_push",
|
||||
"y": 90
|
||||
},
|
||||
"extracting=false,face=ceiling,facing=east,powered=false": {
|
||||
"model": "create:block/andesite_funnel_ceiling_pull",
|
||||
"y": 90
|
||||
},
|
||||
"extracting=true,face=ceiling,facing=east,powered=false": {
|
||||
"model": "create:block/andesite_funnel_ceiling_push",
|
||||
"y": 90
|
||||
},
|
||||
"extracting=false,face=floor,facing=north,powered=true": {
|
||||
"model": "create:block/andesite_funnel_floor_pull_powered"
|
||||
},
|
||||
"extracting=true,face=floor,facing=north,powered=true": {
|
||||
"model": "create:block/andesite_funnel_floor_push_powered"
|
||||
},
|
||||
"extracting=false,face=wall,facing=north,powered=true": {
|
||||
"model": "create:block/andesite_funnel_wall_pull_powered"
|
||||
},
|
||||
"extracting=true,face=wall,facing=north,powered=true": {
|
||||
"model": "create:block/andesite_funnel_wall_push_powered"
|
||||
},
|
||||
"extracting=false,face=ceiling,facing=north,powered=true": {
|
||||
"model": "create:block/andesite_funnel_ceiling_pull_powered"
|
||||
},
|
||||
"extracting=true,face=ceiling,facing=north,powered=true": {
|
||||
"model": "create:block/andesite_funnel_ceiling_push_powered"
|
||||
},
|
||||
"extracting=false,face=floor,facing=south,powered=true": {
|
||||
"model": "create:block/andesite_funnel_floor_pull_powered",
|
||||
"extracting=false,facing=down,powered=true": {
|
||||
"model": "create:block/andesite_funnel_vertical_pull_powered",
|
||||
"x": 180,
|
||||
"y": 180
|
||||
},
|
||||
"extracting=true,face=floor,facing=south,powered=true": {
|
||||
"model": "create:block/andesite_funnel_floor_push_powered",
|
||||
"extracting=true,facing=down,powered=true": {
|
||||
"model": "create:block/andesite_funnel_vertical_push_powered",
|
||||
"x": 180,
|
||||
"y": 180
|
||||
},
|
||||
"extracting=false,face=wall,facing=south,powered=true": {
|
||||
"model": "create:block/andesite_funnel_wall_pull_powered",
|
||||
"extracting=false,facing=up,powered=true": {
|
||||
"model": "create:block/andesite_funnel_vertical_pull_powered",
|
||||
"y": 180
|
||||
},
|
||||
"extracting=true,face=wall,facing=south,powered=true": {
|
||||
"model": "create:block/andesite_funnel_wall_push_powered",
|
||||
"extracting=true,facing=up,powered=true": {
|
||||
"model": "create:block/andesite_funnel_vertical_push_powered",
|
||||
"y": 180
|
||||
},
|
||||
"extracting=false,face=ceiling,facing=south,powered=true": {
|
||||
"model": "create:block/andesite_funnel_ceiling_pull_powered",
|
||||
"extracting=false,facing=north,powered=true": {
|
||||
"model": "create:block/andesite_funnel_horizontal_pull_powered"
|
||||
},
|
||||
"extracting=true,facing=north,powered=true": {
|
||||
"model": "create:block/andesite_funnel_horizontal_push_powered"
|
||||
},
|
||||
"extracting=false,facing=south,powered=true": {
|
||||
"model": "create:block/andesite_funnel_horizontal_pull_powered",
|
||||
"y": 180
|
||||
},
|
||||
"extracting=true,face=ceiling,facing=south,powered=true": {
|
||||
"model": "create:block/andesite_funnel_ceiling_push_powered",
|
||||
"extracting=true,facing=south,powered=true": {
|
||||
"model": "create:block/andesite_funnel_horizontal_push_powered",
|
||||
"y": 180
|
||||
},
|
||||
"extracting=false,face=floor,facing=west,powered=true": {
|
||||
"model": "create:block/andesite_funnel_floor_pull_powered",
|
||||
"extracting=false,facing=west,powered=true": {
|
||||
"model": "create:block/andesite_funnel_horizontal_pull_powered",
|
||||
"y": 270
|
||||
},
|
||||
"extracting=true,face=floor,facing=west,powered=true": {
|
||||
"model": "create:block/andesite_funnel_floor_push_powered",
|
||||
"extracting=true,facing=west,powered=true": {
|
||||
"model": "create:block/andesite_funnel_horizontal_push_powered",
|
||||
"y": 270
|
||||
},
|
||||
"extracting=false,face=wall,facing=west,powered=true": {
|
||||
"model": "create:block/andesite_funnel_wall_pull_powered",
|
||||
"y": 270
|
||||
},
|
||||
"extracting=true,face=wall,facing=west,powered=true": {
|
||||
"model": "create:block/andesite_funnel_wall_push_powered",
|
||||
"y": 270
|
||||
},
|
||||
"extracting=false,face=ceiling,facing=west,powered=true": {
|
||||
"model": "create:block/andesite_funnel_ceiling_pull_powered",
|
||||
"y": 270
|
||||
},
|
||||
"extracting=true,face=ceiling,facing=west,powered=true": {
|
||||
"model": "create:block/andesite_funnel_ceiling_push_powered",
|
||||
"y": 270
|
||||
},
|
||||
"extracting=false,face=floor,facing=east,powered=true": {
|
||||
"model": "create:block/andesite_funnel_floor_pull_powered",
|
||||
"extracting=false,facing=east,powered=true": {
|
||||
"model": "create:block/andesite_funnel_horizontal_pull_powered",
|
||||
"y": 90
|
||||
},
|
||||
"extracting=true,face=floor,facing=east,powered=true": {
|
||||
"model": "create:block/andesite_funnel_floor_push_powered",
|
||||
"y": 90
|
||||
},
|
||||
"extracting=false,face=wall,facing=east,powered=true": {
|
||||
"model": "create:block/andesite_funnel_wall_pull_powered",
|
||||
"y": 90
|
||||
},
|
||||
"extracting=true,face=wall,facing=east,powered=true": {
|
||||
"model": "create:block/andesite_funnel_wall_push_powered",
|
||||
"y": 90
|
||||
},
|
||||
"extracting=false,face=ceiling,facing=east,powered=true": {
|
||||
"model": "create:block/andesite_funnel_ceiling_pull_powered",
|
||||
"y": 90
|
||||
},
|
||||
"extracting=true,face=ceiling,facing=east,powered=true": {
|
||||
"model": "create:block/andesite_funnel_ceiling_push_powered",
|
||||
"extracting=true,facing=east,powered=true": {
|
||||
"model": "create:block/andesite_funnel_horizontal_push_powered",
|
||||
"y": 90
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,183 +1,99 @@
|
|||
{
|
||||
"variants": {
|
||||
"extracting=false,face=floor,facing=north,powered=false": {
|
||||
"model": "create:block/brass_funnel_floor_pull"
|
||||
},
|
||||
"extracting=true,face=floor,facing=north,powered=false": {
|
||||
"model": "create:block/brass_funnel_floor_push"
|
||||
},
|
||||
"extracting=false,face=wall,facing=north,powered=false": {
|
||||
"model": "create:block/brass_funnel_wall_pull"
|
||||
},
|
||||
"extracting=true,face=wall,facing=north,powered=false": {
|
||||
"model": "create:block/brass_funnel_wall_push"
|
||||
},
|
||||
"extracting=false,face=ceiling,facing=north,powered=false": {
|
||||
"model": "create:block/brass_funnel_ceiling_pull"
|
||||
},
|
||||
"extracting=true,face=ceiling,facing=north,powered=false": {
|
||||
"model": "create:block/brass_funnel_ceiling_push"
|
||||
},
|
||||
"extracting=false,face=floor,facing=south,powered=false": {
|
||||
"model": "create:block/brass_funnel_floor_pull",
|
||||
"extracting=false,facing=down,powered=false": {
|
||||
"model": "create:block/brass_funnel_vertical_pull",
|
||||
"x": 180,
|
||||
"y": 180
|
||||
},
|
||||
"extracting=true,face=floor,facing=south,powered=false": {
|
||||
"model": "create:block/brass_funnel_floor_push",
|
||||
"extracting=true,facing=down,powered=false": {
|
||||
"model": "create:block/brass_funnel_vertical_push",
|
||||
"x": 180,
|
||||
"y": 180
|
||||
},
|
||||
"extracting=false,face=wall,facing=south,powered=false": {
|
||||
"model": "create:block/brass_funnel_wall_pull",
|
||||
"extracting=false,facing=up,powered=false": {
|
||||
"model": "create:block/brass_funnel_vertical_pull",
|
||||
"y": 180
|
||||
},
|
||||
"extracting=true,face=wall,facing=south,powered=false": {
|
||||
"model": "create:block/brass_funnel_wall_push",
|
||||
"extracting=true,facing=up,powered=false": {
|
||||
"model": "create:block/brass_funnel_vertical_push",
|
||||
"y": 180
|
||||
},
|
||||
"extracting=false,face=ceiling,facing=south,powered=false": {
|
||||
"model": "create:block/brass_funnel_ceiling_pull",
|
||||
"extracting=false,facing=north,powered=false": {
|
||||
"model": "create:block/brass_funnel_horizontal_pull"
|
||||
},
|
||||
"extracting=true,facing=north,powered=false": {
|
||||
"model": "create:block/brass_funnel_horizontal_push"
|
||||
},
|
||||
"extracting=false,facing=south,powered=false": {
|
||||
"model": "create:block/brass_funnel_horizontal_pull",
|
||||
"y": 180
|
||||
},
|
||||
"extracting=true,face=ceiling,facing=south,powered=false": {
|
||||
"model": "create:block/brass_funnel_ceiling_push",
|
||||
"extracting=true,facing=south,powered=false": {
|
||||
"model": "create:block/brass_funnel_horizontal_push",
|
||||
"y": 180
|
||||
},
|
||||
"extracting=false,face=floor,facing=west,powered=false": {
|
||||
"model": "create:block/brass_funnel_floor_pull",
|
||||
"extracting=false,facing=west,powered=false": {
|
||||
"model": "create:block/brass_funnel_horizontal_pull",
|
||||
"y": 270
|
||||
},
|
||||
"extracting=true,face=floor,facing=west,powered=false": {
|
||||
"model": "create:block/brass_funnel_floor_push",
|
||||
"extracting=true,facing=west,powered=false": {
|
||||
"model": "create:block/brass_funnel_horizontal_push",
|
||||
"y": 270
|
||||
},
|
||||
"extracting=false,face=wall,facing=west,powered=false": {
|
||||
"model": "create:block/brass_funnel_wall_pull",
|
||||
"y": 270
|
||||
},
|
||||
"extracting=true,face=wall,facing=west,powered=false": {
|
||||
"model": "create:block/brass_funnel_wall_push",
|
||||
"y": 270
|
||||
},
|
||||
"extracting=false,face=ceiling,facing=west,powered=false": {
|
||||
"model": "create:block/brass_funnel_ceiling_pull",
|
||||
"y": 270
|
||||
},
|
||||
"extracting=true,face=ceiling,facing=west,powered=false": {
|
||||
"model": "create:block/brass_funnel_ceiling_push",
|
||||
"y": 270
|
||||
},
|
||||
"extracting=false,face=floor,facing=east,powered=false": {
|
||||
"model": "create:block/brass_funnel_floor_pull",
|
||||
"extracting=false,facing=east,powered=false": {
|
||||
"model": "create:block/brass_funnel_horizontal_pull",
|
||||
"y": 90
|
||||
},
|
||||
"extracting=true,face=floor,facing=east,powered=false": {
|
||||
"model": "create:block/brass_funnel_floor_push",
|
||||
"extracting=true,facing=east,powered=false": {
|
||||
"model": "create:block/brass_funnel_horizontal_push",
|
||||
"y": 90
|
||||
},
|
||||
"extracting=false,face=wall,facing=east,powered=false": {
|
||||
"model": "create:block/brass_funnel_wall_pull",
|
||||
"y": 90
|
||||
},
|
||||
"extracting=true,face=wall,facing=east,powered=false": {
|
||||
"model": "create:block/brass_funnel_wall_push",
|
||||
"y": 90
|
||||
},
|
||||
"extracting=false,face=ceiling,facing=east,powered=false": {
|
||||
"model": "create:block/brass_funnel_ceiling_pull",
|
||||
"y": 90
|
||||
},
|
||||
"extracting=true,face=ceiling,facing=east,powered=false": {
|
||||
"model": "create:block/brass_funnel_ceiling_push",
|
||||
"y": 90
|
||||
},
|
||||
"extracting=false,face=floor,facing=north,powered=true": {
|
||||
"model": "create:block/brass_funnel_floor_pull_powered"
|
||||
},
|
||||
"extracting=true,face=floor,facing=north,powered=true": {
|
||||
"model": "create:block/brass_funnel_floor_push_powered"
|
||||
},
|
||||
"extracting=false,face=wall,facing=north,powered=true": {
|
||||
"model": "create:block/brass_funnel_wall_pull_powered"
|
||||
},
|
||||
"extracting=true,face=wall,facing=north,powered=true": {
|
||||
"model": "create:block/brass_funnel_wall_push_powered"
|
||||
},
|
||||
"extracting=false,face=ceiling,facing=north,powered=true": {
|
||||
"model": "create:block/brass_funnel_ceiling_pull_powered"
|
||||
},
|
||||
"extracting=true,face=ceiling,facing=north,powered=true": {
|
||||
"model": "create:block/brass_funnel_ceiling_push_powered"
|
||||
},
|
||||
"extracting=false,face=floor,facing=south,powered=true": {
|
||||
"model": "create:block/brass_funnel_floor_pull_powered",
|
||||
"extracting=false,facing=down,powered=true": {
|
||||
"model": "create:block/brass_funnel_vertical_pull_powered",
|
||||
"x": 180,
|
||||
"y": 180
|
||||
},
|
||||
"extracting=true,face=floor,facing=south,powered=true": {
|
||||
"model": "create:block/brass_funnel_floor_push_powered",
|
||||
"extracting=true,facing=down,powered=true": {
|
||||
"model": "create:block/brass_funnel_vertical_push_powered",
|
||||
"x": 180,
|
||||
"y": 180
|
||||
},
|
||||
"extracting=false,face=wall,facing=south,powered=true": {
|
||||
"model": "create:block/brass_funnel_wall_pull_powered",
|
||||
"extracting=false,facing=up,powered=true": {
|
||||
"model": "create:block/brass_funnel_vertical_pull_powered",
|
||||
"y": 180
|
||||
},
|
||||
"extracting=true,face=wall,facing=south,powered=true": {
|
||||
"model": "create:block/brass_funnel_wall_push_powered",
|
||||
"extracting=true,facing=up,powered=true": {
|
||||
"model": "create:block/brass_funnel_vertical_push_powered",
|
||||
"y": 180
|
||||
},
|
||||
"extracting=false,face=ceiling,facing=south,powered=true": {
|
||||
"model": "create:block/brass_funnel_ceiling_pull_powered",
|
||||
"extracting=false,facing=north,powered=true": {
|
||||
"model": "create:block/brass_funnel_horizontal_pull_powered"
|
||||
},
|
||||
"extracting=true,facing=north,powered=true": {
|
||||
"model": "create:block/brass_funnel_horizontal_push_powered"
|
||||
},
|
||||
"extracting=false,facing=south,powered=true": {
|
||||
"model": "create:block/brass_funnel_horizontal_pull_powered",
|
||||
"y": 180
|
||||
},
|
||||
"extracting=true,face=ceiling,facing=south,powered=true": {
|
||||
"model": "create:block/brass_funnel_ceiling_push_powered",
|
||||
"extracting=true,facing=south,powered=true": {
|
||||
"model": "create:block/brass_funnel_horizontal_push_powered",
|
||||
"y": 180
|
||||
},
|
||||
"extracting=false,face=floor,facing=west,powered=true": {
|
||||
"model": "create:block/brass_funnel_floor_pull_powered",
|
||||
"extracting=false,facing=west,powered=true": {
|
||||
"model": "create:block/brass_funnel_horizontal_pull_powered",
|
||||
"y": 270
|
||||
},
|
||||
"extracting=true,face=floor,facing=west,powered=true": {
|
||||
"model": "create:block/brass_funnel_floor_push_powered",
|
||||
"extracting=true,facing=west,powered=true": {
|
||||
"model": "create:block/brass_funnel_horizontal_push_powered",
|
||||
"y": 270
|
||||
},
|
||||
"extracting=false,face=wall,facing=west,powered=true": {
|
||||
"model": "create:block/brass_funnel_wall_pull_powered",
|
||||
"y": 270
|
||||
},
|
||||
"extracting=true,face=wall,facing=west,powered=true": {
|
||||
"model": "create:block/brass_funnel_wall_push_powered",
|
||||
"y": 270
|
||||
},
|
||||
"extracting=false,face=ceiling,facing=west,powered=true": {
|
||||
"model": "create:block/brass_funnel_ceiling_pull_powered",
|
||||
"y": 270
|
||||
},
|
||||
"extracting=true,face=ceiling,facing=west,powered=true": {
|
||||
"model": "create:block/brass_funnel_ceiling_push_powered",
|
||||
"y": 270
|
||||
},
|
||||
"extracting=false,face=floor,facing=east,powered=true": {
|
||||
"model": "create:block/brass_funnel_floor_pull_powered",
|
||||
"extracting=false,facing=east,powered=true": {
|
||||
"model": "create:block/brass_funnel_horizontal_pull_powered",
|
||||
"y": 90
|
||||
},
|
||||
"extracting=true,face=floor,facing=east,powered=true": {
|
||||
"model": "create:block/brass_funnel_floor_push_powered",
|
||||
"y": 90
|
||||
},
|
||||
"extracting=false,face=wall,facing=east,powered=true": {
|
||||
"model": "create:block/brass_funnel_wall_pull_powered",
|
||||
"y": 90
|
||||
},
|
||||
"extracting=true,face=wall,facing=east,powered=true": {
|
||||
"model": "create:block/brass_funnel_wall_push_powered",
|
||||
"y": 90
|
||||
},
|
||||
"extracting=false,face=ceiling,facing=east,powered=true": {
|
||||
"model": "create:block/brass_funnel_ceiling_pull_powered",
|
||||
"y": 90
|
||||
},
|
||||
"extracting=true,face=ceiling,facing=east,powered=true": {
|
||||
"model": "create:block/brass_funnel_ceiling_push_powered",
|
||||
"extracting=true,facing=east,powered=true": {
|
||||
"model": "create:block/brass_funnel_horizontal_push_powered",
|
||||
"y": 90
|
||||
}
|
||||
}
|
||||
|
|
|
@ -824,11 +824,12 @@
|
|||
"create.gui.goggles.at_current_speed": "at current speed",
|
||||
"create.gui.goggles.pole_length": "Pole Length:",
|
||||
"create.gui.assembly.exception": "This Contraption was unable to assemble:",
|
||||
"create.gui.assembly.exception.unmovableBlock": "Unmovable Block (%4$s) at [%1$s %2$s %3$s]",
|
||||
"create.gui.assembly.exception.chunkNotLoaded": "The Block at [%1$s %2$s %3$s] was not in a loaded chunk",
|
||||
"create.gui.assembly.exception.unmovableBlock": "Unmovable Block (%4$s) at [%1$s,%2$s,%3$s]",
|
||||
"create.gui.assembly.exception.chunkNotLoaded": "The Block at [%1$s,%2$s,%3$s] was not in a loaded chunk",
|
||||
"create.gui.assembly.exception.structureTooLarge": "There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s",
|
||||
"create.gui.assembly.exception.tooManyPistonPoles": "There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s",
|
||||
"create.gui.assembly.exception.noPistonPoles": "The Piston is missing some extension Poles",
|
||||
"create.gui.assembly.exception.not_enough_sails": "Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required",
|
||||
"create.gui.gauge.info_header": "Gauge Information:",
|
||||
"create.gui.speedometer.title": "Rotation Speed",
|
||||
"create.gui.stressometer.title": "Network Stress",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 1001",
|
||||
"_": "Missing Localizations: 1003",
|
||||
|
||||
"_": "->------------------------] Game Elements [------------------------<-",
|
||||
|
||||
|
@ -825,11 +825,12 @@
|
|||
"create.gui.goggles.at_current_speed": "UNLOCALIZED: at current speed",
|
||||
"create.gui.goggles.pole_length": "UNLOCALIZED: Pole Length:",
|
||||
"create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:",
|
||||
"create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]",
|
||||
"create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk",
|
||||
"create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s,%2$s,%3$s]",
|
||||
"create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s,%2$s,%3$s] was not in a loaded chunk",
|
||||
"create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s",
|
||||
"create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s",
|
||||
"create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles",
|
||||
"create.gui.assembly.exception.not_enough_sails": "UNLOCALIZED: Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required",
|
||||
"create.gui.gauge.info_header": "UNLOCALIZED: Gauge Information:",
|
||||
"create.gui.speedometer.title": "UNLOCALIZED: Rotation Speed",
|
||||
"create.gui.stressometer.title": "UNLOCALIZED: Network Stress",
|
||||
|
@ -1834,6 +1835,7 @@
|
|||
"create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.",
|
||||
"create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.",
|
||||
"create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections",
|
||||
"create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.",
|
||||
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items",
|
||||
|
||||
"_": "Thank you for translating Create!"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 43",
|
||||
"_": "Missing Localizations: 45",
|
||||
|
||||
"_": "->------------------------] Game Elements [------------------------<-",
|
||||
|
||||
|
@ -830,6 +830,7 @@
|
|||
"create.gui.assembly.exception.structureTooLarge": "Hay demasiados bloques incluídos en el artilugio.\nEl máximo configurado es: %1$s",
|
||||
"create.gui.assembly.exception.tooManyPistonPoles": "Hay demasiadas Pértigas de extensión conectadas a este Pistón.\nEl máximo configurado es: %1$s",
|
||||
"create.gui.assembly.exception.noPistonPoles": "Faltan pértigas de extensión para el Pistón",
|
||||
"create.gui.assembly.exception.not_enough_sails": "UNLOCALIZED: Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required",
|
||||
"create.gui.gauge.info_header": "Información sobre el medidor:",
|
||||
"create.gui.speedometer.title": "Velocidad de rotación",
|
||||
"create.gui.stressometer.title": "Estrés de la red",
|
||||
|
@ -1834,6 +1835,7 @@
|
|||
"create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.",
|
||||
"create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.",
|
||||
"create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections",
|
||||
"create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.",
|
||||
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items",
|
||||
|
||||
"_": "Thank you for translating Create!"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 931",
|
||||
"_": "Missing Localizations: 933",
|
||||
|
||||
"_": "->------------------------] Game Elements [------------------------<-",
|
||||
|
||||
|
@ -825,11 +825,12 @@
|
|||
"create.gui.goggles.at_current_speed": "UNLOCALIZED: at current speed",
|
||||
"create.gui.goggles.pole_length": "UNLOCALIZED: Pole Length:",
|
||||
"create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:",
|
||||
"create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]",
|
||||
"create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk",
|
||||
"create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s,%2$s,%3$s]",
|
||||
"create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s,%2$s,%3$s] was not in a loaded chunk",
|
||||
"create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s",
|
||||
"create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s",
|
||||
"create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles",
|
||||
"create.gui.assembly.exception.not_enough_sails": "UNLOCALIZED: Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required",
|
||||
"create.gui.gauge.info_header": "UNLOCALIZED: Gauge Information:",
|
||||
"create.gui.speedometer.title": "UNLOCALIZED: Rotation Speed",
|
||||
"create.gui.stressometer.title": "UNLOCALIZED: Network Stress",
|
||||
|
@ -1834,6 +1835,7 @@
|
|||
"create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.",
|
||||
"create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.",
|
||||
"create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections",
|
||||
"create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.",
|
||||
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items",
|
||||
|
||||
"_": "Thank you for translating Create!"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 713",
|
||||
"_": "Missing Localizations: 715",
|
||||
|
||||
"_": "->------------------------] Game Elements [------------------------<-",
|
||||
|
||||
|
@ -825,11 +825,12 @@
|
|||
"create.gui.goggles.at_current_speed": "À la vitesse actuelle",
|
||||
"create.gui.goggles.pole_length": "Longueur de la barre",
|
||||
"create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:",
|
||||
"create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]",
|
||||
"create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk",
|
||||
"create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s,%2$s,%3$s]",
|
||||
"create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s,%2$s,%3$s] was not in a loaded chunk",
|
||||
"create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s",
|
||||
"create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s",
|
||||
"create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles",
|
||||
"create.gui.assembly.exception.not_enough_sails": "UNLOCALIZED: Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required",
|
||||
"create.gui.gauge.info_header": "Informations sur la jauge:",
|
||||
"create.gui.speedometer.title": "Vitesse de rotation",
|
||||
"create.gui.stressometer.title": "Stress du réseau",
|
||||
|
@ -1834,6 +1835,7 @@
|
|||
"create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.",
|
||||
"create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.",
|
||||
"create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections",
|
||||
"create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.",
|
||||
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items",
|
||||
|
||||
"_": "Thank you for translating Create!"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 48",
|
||||
"_": "Missing Localizations: 50",
|
||||
|
||||
"_": "->------------------------] Game Elements [------------------------<-",
|
||||
|
||||
|
@ -825,11 +825,12 @@
|
|||
"create.gui.goggles.at_current_speed": "Alla velocità attuale",
|
||||
"create.gui.goggles.pole_length": "Lunghezza palo:",
|
||||
"create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:",
|
||||
"create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]",
|
||||
"create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk",
|
||||
"create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s,%2$s,%3$s]",
|
||||
"create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s,%2$s,%3$s] was not in a loaded chunk",
|
||||
"create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s",
|
||||
"create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s",
|
||||
"create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles",
|
||||
"create.gui.assembly.exception.not_enough_sails": "UNLOCALIZED: Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required",
|
||||
"create.gui.gauge.info_header": "Informazioni sul calibro:",
|
||||
"create.gui.speedometer.title": "Velocità di rotazione",
|
||||
"create.gui.stressometer.title": "Stress della rete",
|
||||
|
@ -1834,6 +1835,7 @@
|
|||
"create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.",
|
||||
"create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.",
|
||||
"create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections",
|
||||
"create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.",
|
||||
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items",
|
||||
|
||||
"_": "Thank you for translating Create!"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 55",
|
||||
"_": "Missing Localizations: 57",
|
||||
|
||||
"_": "->------------------------] Game Elements [------------------------<-",
|
||||
|
||||
|
@ -825,11 +825,12 @@
|
|||
"create.gui.goggles.at_current_speed": "現在の速度",
|
||||
"create.gui.goggles.pole_length": "ポールの長さ:",
|
||||
"create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:",
|
||||
"create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]",
|
||||
"create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk",
|
||||
"create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s,%2$s,%3$s]",
|
||||
"create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s,%2$s,%3$s] was not in a loaded chunk",
|
||||
"create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s",
|
||||
"create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s",
|
||||
"create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles",
|
||||
"create.gui.assembly.exception.not_enough_sails": "UNLOCALIZED: Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required",
|
||||
"create.gui.gauge.info_header": "計器の情報:",
|
||||
"create.gui.speedometer.title": "回転速度",
|
||||
"create.gui.stressometer.title": "ネットワークの応力",
|
||||
|
@ -1834,6 +1835,7 @@
|
|||
"create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.",
|
||||
"create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.",
|
||||
"create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections",
|
||||
"create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.",
|
||||
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items",
|
||||
|
||||
"_": "Thank you for translating Create!"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 102",
|
||||
"_": "Missing Localizations: 104",
|
||||
|
||||
"_": "->------------------------] Game Elements [------------------------<-",
|
||||
|
||||
|
@ -825,11 +825,12 @@
|
|||
"create.gui.goggles.at_current_speed": "현재 에너지량",
|
||||
"create.gui.goggles.pole_length": "UNLOCALIZED: Pole Length:",
|
||||
"create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:",
|
||||
"create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]",
|
||||
"create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk",
|
||||
"create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s,%2$s,%3$s]",
|
||||
"create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s,%2$s,%3$s] was not in a loaded chunk",
|
||||
"create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s",
|
||||
"create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s",
|
||||
"create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles",
|
||||
"create.gui.assembly.exception.not_enough_sails": "UNLOCALIZED: Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required",
|
||||
"create.gui.gauge.info_header": "게이지 정보:",
|
||||
"create.gui.speedometer.title": "회전 속도",
|
||||
"create.gui.stressometer.title": "네트워크 부하",
|
||||
|
@ -1834,6 +1835,7 @@
|
|||
"create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.",
|
||||
"create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.",
|
||||
"create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections",
|
||||
"create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.",
|
||||
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items",
|
||||
|
||||
"_": "Thank you for translating Create!"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 1200",
|
||||
"_": "Missing Localizations: 1202",
|
||||
|
||||
"_": "->------------------------] Game Elements [------------------------<-",
|
||||
|
||||
|
@ -825,11 +825,12 @@
|
|||
"create.gui.goggles.at_current_speed": "UNLOCALIZED: at current speed",
|
||||
"create.gui.goggles.pole_length": "UNLOCALIZED: Pole Length:",
|
||||
"create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:",
|
||||
"create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]",
|
||||
"create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk",
|
||||
"create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s,%2$s,%3$s]",
|
||||
"create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s,%2$s,%3$s] was not in a loaded chunk",
|
||||
"create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s",
|
||||
"create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s",
|
||||
"create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles",
|
||||
"create.gui.assembly.exception.not_enough_sails": "UNLOCALIZED: Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required",
|
||||
"create.gui.gauge.info_header": "UNLOCALIZED: Gauge Information:",
|
||||
"create.gui.speedometer.title": "UNLOCALIZED: Rotation Speed",
|
||||
"create.gui.stressometer.title": "UNLOCALIZED: Network Stress",
|
||||
|
@ -1834,6 +1835,7 @@
|
|||
"create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.",
|
||||
"create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.",
|
||||
"create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections",
|
||||
"create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.",
|
||||
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items",
|
||||
|
||||
"_": "Thank you for translating Create!"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 1266",
|
||||
"_": "Missing Localizations: 1268",
|
||||
|
||||
"_": "->------------------------] Game Elements [------------------------<-",
|
||||
|
||||
|
@ -825,11 +825,12 @@
|
|||
"create.gui.goggles.at_current_speed": "UNLOCALIZED: at current speed",
|
||||
"create.gui.goggles.pole_length": "UNLOCALIZED: Pole Length:",
|
||||
"create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:",
|
||||
"create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]",
|
||||
"create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk",
|
||||
"create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s,%2$s,%3$s]",
|
||||
"create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s,%2$s,%3$s] was not in a loaded chunk",
|
||||
"create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s",
|
||||
"create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s",
|
||||
"create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles",
|
||||
"create.gui.assembly.exception.not_enough_sails": "UNLOCALIZED: Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required",
|
||||
"create.gui.gauge.info_header": "UNLOCALIZED: Gauge Information:",
|
||||
"create.gui.speedometer.title": "UNLOCALIZED: Rotation Speed",
|
||||
"create.gui.stressometer.title": "UNLOCALIZED: Network Stress",
|
||||
|
@ -1834,6 +1835,7 @@
|
|||
"create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.",
|
||||
"create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.",
|
||||
"create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections",
|
||||
"create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.",
|
||||
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items",
|
||||
|
||||
"_": "Thank you for translating Create!"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 52",
|
||||
"_": "Missing Localizations: 54",
|
||||
|
||||
"_": "->------------------------] Game Elements [------------------------<-",
|
||||
|
||||
|
@ -825,11 +825,12 @@
|
|||
"create.gui.goggles.at_current_speed": "На текущей скорости",
|
||||
"create.gui.goggles.pole_length": "Длина поршня",
|
||||
"create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:",
|
||||
"create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]",
|
||||
"create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk",
|
||||
"create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s,%2$s,%3$s]",
|
||||
"create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s,%2$s,%3$s] was not in a loaded chunk",
|
||||
"create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s",
|
||||
"create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s",
|
||||
"create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles",
|
||||
"create.gui.assembly.exception.not_enough_sails": "UNLOCALIZED: Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required",
|
||||
"create.gui.gauge.info_header": "Калибровочная информация:",
|
||||
"create.gui.speedometer.title": "Скорость вращения",
|
||||
"create.gui.stressometer.title": "Сетевой момент",
|
||||
|
@ -1834,6 +1835,7 @@
|
|||
"create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.",
|
||||
"create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.",
|
||||
"create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections",
|
||||
"create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.",
|
||||
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items",
|
||||
|
||||
"_": "Thank you for translating Create!"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 50",
|
||||
"_": "Missing Localizations: 52",
|
||||
|
||||
"_": "->------------------------] Game Elements [------------------------<-",
|
||||
|
||||
|
@ -825,11 +825,12 @@
|
|||
"create.gui.goggles.at_current_speed": "当前速度应力值",
|
||||
"create.gui.goggles.pole_length": "活塞杆长度:",
|
||||
"create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:",
|
||||
"create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]",
|
||||
"create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk",
|
||||
"create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s,%2$s,%3$s]",
|
||||
"create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s,%2$s,%3$s] was not in a loaded chunk",
|
||||
"create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s",
|
||||
"create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s",
|
||||
"create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles",
|
||||
"create.gui.assembly.exception.not_enough_sails": "UNLOCALIZED: Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required",
|
||||
"create.gui.gauge.info_header": "仪表信息:",
|
||||
"create.gui.speedometer.title": "旋转速度",
|
||||
"create.gui.stressometer.title": "网络应力",
|
||||
|
@ -1834,6 +1835,7 @@
|
|||
"create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.",
|
||||
"create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.",
|
||||
"create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections",
|
||||
"create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.",
|
||||
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items",
|
||||
|
||||
"_": "Thank you for translating Create!"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 55",
|
||||
"_": "Missing Localizations: 57",
|
||||
|
||||
"_": "->------------------------] Game Elements [------------------------<-",
|
||||
|
||||
|
@ -825,11 +825,12 @@
|
|||
"create.gui.goggles.at_current_speed": "現在速度動能值",
|
||||
"create.gui.goggles.pole_length": "UNLOCALIZED: Pole Length:",
|
||||
"create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:",
|
||||
"create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]",
|
||||
"create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk",
|
||||
"create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s,%2$s,%3$s]",
|
||||
"create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s,%2$s,%3$s] was not in a loaded chunk",
|
||||
"create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s",
|
||||
"create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s",
|
||||
"create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles",
|
||||
"create.gui.assembly.exception.not_enough_sails": "UNLOCALIZED: Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required",
|
||||
"create.gui.gauge.info_header": "儀表訊息:",
|
||||
"create.gui.speedometer.title": "旋轉速度",
|
||||
"create.gui.stressometer.title": "網路動能",
|
||||
|
@ -1834,6 +1835,7 @@
|
|||
"create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.",
|
||||
"create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.",
|
||||
"create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections",
|
||||
"create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.",
|
||||
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items",
|
||||
|
||||
"_": "Thank you for translating Create!"
|
||||
|
|
|
@ -1,11 +0,0 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_ceiling",
|
||||
"textures": {
|
||||
"particle": "create:block/andesite_casing",
|
||||
"7": "create:block/andesite_funnel_plating",
|
||||
"6": "create:block/andesite_funnel_powered",
|
||||
"5": "create:block/andesite_funnel_tall_powered",
|
||||
"2_2": "create:block/andesite_funnel_pull",
|
||||
"3": "create:block/andesite_funnel_back"
|
||||
}
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_ceiling",
|
||||
"textures": {
|
||||
"particle": "create:block/andesite_casing",
|
||||
"7": "create:block/andesite_funnel_plating",
|
||||
"6": "create:block/andesite_funnel",
|
||||
"5": "create:block/andesite_funnel_tall",
|
||||
"2_2": "create:block/andesite_funnel_push",
|
||||
"3": "create:block/andesite_funnel_back"
|
||||
}
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_ceiling",
|
||||
"textures": {
|
||||
"particle": "create:block/andesite_casing",
|
||||
"7": "create:block/andesite_funnel_plating",
|
||||
"6": "create:block/andesite_funnel_powered",
|
||||
"5": "create:block/andesite_funnel_tall_powered",
|
||||
"2_2": "create:block/andesite_funnel_push",
|
||||
"3": "create:block/andesite_funnel_back"
|
||||
}
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_floor",
|
||||
"textures": {
|
||||
"particle": "create:block/andesite_casing",
|
||||
"7": "create:block/andesite_funnel_plating",
|
||||
"6": "create:block/andesite_funnel",
|
||||
"5": "create:block/andesite_funnel_tall",
|
||||
"2_2": "create:block/andesite_funnel_pull",
|
||||
"3": "create:block/andesite_funnel_back"
|
||||
}
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_floor",
|
||||
"textures": {
|
||||
"particle": "create:block/andesite_casing",
|
||||
"7": "create:block/andesite_funnel_plating",
|
||||
"6": "create:block/andesite_funnel",
|
||||
"5": "create:block/andesite_funnel_tall",
|
||||
"2_2": "create:block/andesite_funnel_push",
|
||||
"3": "create:block/andesite_funnel_back"
|
||||
}
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_floor",
|
||||
"textures": {
|
||||
"particle": "create:block/andesite_casing",
|
||||
"7": "create:block/andesite_funnel_plating",
|
||||
"6": "create:block/andesite_funnel_powered",
|
||||
"5": "create:block/andesite_funnel_tall_powered",
|
||||
"2_2": "create:block/andesite_funnel_push",
|
||||
"3": "create:block/andesite_funnel_back"
|
||||
}
|
||||
}
|
|
@ -1,11 +1,11 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_ceiling",
|
||||
"parent": "create:block/funnel/block_horizontal",
|
||||
"textures": {
|
||||
"particle": "create:block/andesite_casing",
|
||||
"7": "create:block/andesite_funnel_plating",
|
||||
"6": "create:block/andesite_funnel",
|
||||
"5": "create:block/andesite_funnel_tall",
|
||||
"2_2": "create:block/andesite_funnel_pull",
|
||||
"3": "create:block/andesite_funnel_back"
|
||||
"3": "create:block/andesite_funnel_back",
|
||||
"6": "create:block/andesite_funnel"
|
||||
}
|
||||
}
|
|
@ -1,11 +1,11 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_floor",
|
||||
"parent": "create:block/funnel/block_horizontal",
|
||||
"textures": {
|
||||
"particle": "create:block/andesite_casing",
|
||||
"7": "create:block/andesite_funnel_plating",
|
||||
"6": "create:block/andesite_funnel_powered",
|
||||
"5": "create:block/andesite_funnel_tall_powered",
|
||||
"2_2": "create:block/andesite_funnel_pull",
|
||||
"3": "create:block/andesite_funnel_back"
|
||||
"3": "create:block/andesite_funnel_back",
|
||||
"6": "create:block/andesite_funnel_powered"
|
||||
}
|
||||
}
|
|
@ -1,11 +1,11 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_wall",
|
||||
"parent": "create:block/funnel/block_horizontal",
|
||||
"textures": {
|
||||
"particle": "create:block/andesite_casing",
|
||||
"7": "create:block/andesite_funnel_plating",
|
||||
"6": "create:block/andesite_funnel",
|
||||
"5": "create:block/andesite_funnel_tall",
|
||||
"2_2": "create:block/andesite_funnel_push",
|
||||
"3": "create:block/andesite_funnel_back"
|
||||
"3": "create:block/andesite_funnel_back",
|
||||
"6": "create:block/andesite_funnel"
|
||||
}
|
||||
}
|
|
@ -1,11 +1,11 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_wall",
|
||||
"parent": "create:block/funnel/block_horizontal",
|
||||
"textures": {
|
||||
"particle": "create:block/andesite_casing",
|
||||
"7": "create:block/andesite_funnel_plating",
|
||||
"6": "create:block/andesite_funnel_powered",
|
||||
"5": "create:block/andesite_funnel_tall_powered",
|
||||
"2_2": "create:block/andesite_funnel_push",
|
||||
"3": "create:block/andesite_funnel_back"
|
||||
"3": "create:block/andesite_funnel_back",
|
||||
"6": "create:block/andesite_funnel_powered"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_vertical",
|
||||
"textures": {
|
||||
"particle": "create:block/andesite_casing",
|
||||
"7": "create:block/andesite_funnel_plating",
|
||||
"5": "create:block/andesite_funnel_tall",
|
||||
"2_2": "create:block/andesite_funnel_pull",
|
||||
"3": "create:block/andesite_funnel_back",
|
||||
"8": "create:block/andesite_casing",
|
||||
"9": "create:block/andesite_funnel_slope",
|
||||
"10": "create:block/funnel_open"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_vertical",
|
||||
"textures": {
|
||||
"particle": "create:block/andesite_casing",
|
||||
"7": "create:block/andesite_funnel_plating",
|
||||
"5": "create:block/andesite_funnel_tall_powered",
|
||||
"2_2": "create:block/andesite_funnel_pull",
|
||||
"3": "create:block/andesite_funnel_back",
|
||||
"8": "create:block/andesite_casing",
|
||||
"9": "create:block/andesite_funnel_slope",
|
||||
"10": "create:block/funnel_closed"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_vertical",
|
||||
"textures": {
|
||||
"particle": "create:block/andesite_casing",
|
||||
"7": "create:block/andesite_funnel_plating",
|
||||
"5": "create:block/andesite_funnel_tall",
|
||||
"2_2": "create:block/andesite_funnel_push",
|
||||
"3": "create:block/andesite_funnel_back",
|
||||
"8": "create:block/andesite_casing",
|
||||
"9": "create:block/andesite_funnel_slope",
|
||||
"10": "create:block/funnel_open"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_vertical",
|
||||
"textures": {
|
||||
"particle": "create:block/andesite_casing",
|
||||
"7": "create:block/andesite_funnel_plating",
|
||||
"5": "create:block/andesite_funnel_tall_powered",
|
||||
"2_2": "create:block/andesite_funnel_push",
|
||||
"3": "create:block/andesite_funnel_back",
|
||||
"8": "create:block/andesite_casing",
|
||||
"9": "create:block/andesite_funnel_slope",
|
||||
"10": "create:block/funnel_closed"
|
||||
}
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_wall",
|
||||
"textures": {
|
||||
"particle": "create:block/andesite_casing",
|
||||
"7": "create:block/andesite_funnel_plating",
|
||||
"6": "create:block/andesite_funnel",
|
||||
"5": "create:block/andesite_funnel_tall",
|
||||
"2_2": "create:block/andesite_funnel_pull",
|
||||
"3": "create:block/andesite_funnel_back"
|
||||
}
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_wall",
|
||||
"textures": {
|
||||
"particle": "create:block/andesite_casing",
|
||||
"7": "create:block/andesite_funnel_plating",
|
||||
"6": "create:block/andesite_funnel_powered",
|
||||
"5": "create:block/andesite_funnel_tall_powered",
|
||||
"2_2": "create:block/andesite_funnel_pull",
|
||||
"3": "create:block/andesite_funnel_back"
|
||||
}
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_ceiling",
|
||||
"textures": {
|
||||
"particle": "create:block/brass_casing",
|
||||
"7": "create:block/brass_funnel_plating",
|
||||
"6": "create:block/brass_funnel",
|
||||
"5": "create:block/brass_funnel_tall",
|
||||
"2_2": "create:block/brass_funnel_pull",
|
||||
"3": "create:block/brass_funnel_back"
|
||||
}
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_ceiling",
|
||||
"textures": {
|
||||
"particle": "create:block/brass_casing",
|
||||
"7": "create:block/brass_funnel_plating",
|
||||
"6": "create:block/brass_funnel_powered",
|
||||
"5": "create:block/brass_funnel_tall_powered",
|
||||
"2_2": "create:block/brass_funnel_pull",
|
||||
"3": "create:block/brass_funnel_back"
|
||||
}
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_ceiling",
|
||||
"textures": {
|
||||
"particle": "create:block/brass_casing",
|
||||
"7": "create:block/brass_funnel_plating",
|
||||
"6": "create:block/brass_funnel_powered",
|
||||
"5": "create:block/brass_funnel_tall_powered",
|
||||
"2_2": "create:block/brass_funnel_push",
|
||||
"3": "create:block/brass_funnel_back"
|
||||
}
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_floor",
|
||||
"textures": {
|
||||
"particle": "create:block/brass_casing",
|
||||
"7": "create:block/brass_funnel_plating",
|
||||
"6": "create:block/brass_funnel",
|
||||
"5": "create:block/brass_funnel_tall",
|
||||
"2_2": "create:block/brass_funnel_pull",
|
||||
"3": "create:block/brass_funnel_back"
|
||||
}
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_floor",
|
||||
"textures": {
|
||||
"particle": "create:block/brass_casing",
|
||||
"7": "create:block/brass_funnel_plating",
|
||||
"6": "create:block/brass_funnel",
|
||||
"5": "create:block/brass_funnel_tall",
|
||||
"2_2": "create:block/brass_funnel_push",
|
||||
"3": "create:block/brass_funnel_back"
|
||||
}
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_floor",
|
||||
"textures": {
|
||||
"particle": "create:block/brass_casing",
|
||||
"7": "create:block/brass_funnel_plating",
|
||||
"6": "create:block/brass_funnel_powered",
|
||||
"5": "create:block/brass_funnel_tall_powered",
|
||||
"2_2": "create:block/brass_funnel_push",
|
||||
"3": "create:block/brass_funnel_back"
|
||||
}
|
||||
}
|
|
@ -1,11 +1,11 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_wall",
|
||||
"parent": "create:block/funnel/block_horizontal",
|
||||
"textures": {
|
||||
"particle": "create:block/brass_casing",
|
||||
"7": "create:block/brass_funnel_plating",
|
||||
"6": "create:block/brass_funnel",
|
||||
"5": "create:block/brass_funnel_tall",
|
||||
"2_2": "create:block/brass_funnel_pull",
|
||||
"3": "create:block/brass_funnel_back"
|
||||
"3": "create:block/brass_funnel_back",
|
||||
"6": "create:block/brass_funnel"
|
||||
}
|
||||
}
|
|
@ -1,11 +1,11 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_floor",
|
||||
"parent": "create:block/funnel/block_horizontal",
|
||||
"textures": {
|
||||
"particle": "create:block/brass_casing",
|
||||
"7": "create:block/brass_funnel_plating",
|
||||
"6": "create:block/brass_funnel_powered",
|
||||
"5": "create:block/brass_funnel_tall_powered",
|
||||
"2_2": "create:block/brass_funnel_pull",
|
||||
"3": "create:block/brass_funnel_back"
|
||||
"3": "create:block/brass_funnel_back",
|
||||
"6": "create:block/brass_funnel_powered"
|
||||
}
|
||||
}
|
|
@ -1,11 +1,11 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_ceiling",
|
||||
"parent": "create:block/funnel/block_horizontal",
|
||||
"textures": {
|
||||
"particle": "create:block/brass_casing",
|
||||
"7": "create:block/brass_funnel_plating",
|
||||
"6": "create:block/brass_funnel",
|
||||
"5": "create:block/brass_funnel_tall",
|
||||
"2_2": "create:block/brass_funnel_push",
|
||||
"3": "create:block/brass_funnel_back"
|
||||
"3": "create:block/brass_funnel_back",
|
||||
"6": "create:block/brass_funnel"
|
||||
}
|
||||
}
|
|
@ -1,11 +1,11 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_wall",
|
||||
"parent": "create:block/funnel/block_horizontal",
|
||||
"textures": {
|
||||
"particle": "create:block/brass_casing",
|
||||
"7": "create:block/brass_funnel_plating",
|
||||
"6": "create:block/brass_funnel_powered",
|
||||
"5": "create:block/brass_funnel_tall_powered",
|
||||
"2_2": "create:block/brass_funnel_push",
|
||||
"3": "create:block/brass_funnel_back"
|
||||
"3": "create:block/brass_funnel_back",
|
||||
"6": "create:block/brass_funnel_powered"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_vertical",
|
||||
"textures": {
|
||||
"particle": "create:block/brass_casing",
|
||||
"7": "create:block/brass_funnel_plating",
|
||||
"5": "create:block/brass_funnel_tall",
|
||||
"2_2": "create:block/brass_funnel_pull",
|
||||
"3": "create:block/brass_funnel_back",
|
||||
"8": "create:block/brass_casing",
|
||||
"9": "create:block/brass_funnel_slope",
|
||||
"10": "create:block/funnel_open"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_vertical",
|
||||
"textures": {
|
||||
"particle": "create:block/brass_casing",
|
||||
"7": "create:block/brass_funnel_plating",
|
||||
"5": "create:block/brass_funnel_tall_powered",
|
||||
"2_2": "create:block/brass_funnel_pull",
|
||||
"3": "create:block/brass_funnel_back",
|
||||
"8": "create:block/brass_casing",
|
||||
"9": "create:block/brass_funnel_slope",
|
||||
"10": "create:block/funnel_closed"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_vertical",
|
||||
"textures": {
|
||||
"particle": "create:block/brass_casing",
|
||||
"7": "create:block/brass_funnel_plating",
|
||||
"5": "create:block/brass_funnel_tall",
|
||||
"2_2": "create:block/brass_funnel_push",
|
||||
"3": "create:block/brass_funnel_back",
|
||||
"8": "create:block/brass_casing",
|
||||
"9": "create:block/brass_funnel_slope",
|
||||
"10": "create:block/funnel_open"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_vertical",
|
||||
"textures": {
|
||||
"particle": "create:block/brass_casing",
|
||||
"7": "create:block/brass_funnel_plating",
|
||||
"5": "create:block/brass_funnel_tall_powered",
|
||||
"2_2": "create:block/brass_funnel_push",
|
||||
"3": "create:block/brass_funnel_back",
|
||||
"8": "create:block/brass_casing",
|
||||
"9": "create:block/brass_funnel_slope",
|
||||
"10": "create:block/funnel_closed"
|
||||
}
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_wall",
|
||||
"textures": {
|
||||
"particle": "create:block/brass_casing",
|
||||
"7": "create:block/brass_funnel_plating",
|
||||
"6": "create:block/brass_funnel_powered",
|
||||
"5": "create:block/brass_funnel_tall_powered",
|
||||
"2_2": "create:block/brass_funnel_pull",
|
||||
"3": "create:block/brass_funnel_back"
|
||||
}
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
{
|
||||
"parent": "create:block/funnel/block_wall",
|
||||
"textures": {
|
||||
"particle": "create:block/brass_casing",
|
||||
"7": "create:block/brass_funnel_plating",
|
||||
"6": "create:block/brass_funnel",
|
||||
"5": "create:block/brass_funnel_tall",
|
||||
"2_2": "create:block/brass_funnel_push",
|
||||
"3": "create:block/brass_funnel_back"
|
||||
}
|
||||
}
|
|
@ -133,6 +133,8 @@ import com.simibubi.create.content.logistics.block.funnel.AndesiteFunnelBlock;
|
|||
import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock;
|
||||
import com.simibubi.create.content.logistics.block.funnel.BeltFunnelGenerator;
|
||||
import com.simibubi.create.content.logistics.block.funnel.BrassFunnelBlock;
|
||||
import com.simibubi.create.content.logistics.block.funnel.FunnelGenerator;
|
||||
import com.simibubi.create.content.logistics.block.funnel.FunnelItem;
|
||||
import com.simibubi.create.content.logistics.block.funnel.FunnelMovementBehaviour;
|
||||
import com.simibubi.create.content.logistics.block.inventories.AdjustableCrateBlock;
|
||||
import com.simibubi.create.content.logistics.block.inventories.CreativeCrateBlock;
|
||||
|
@ -1081,7 +1083,10 @@ public class AllBlocks {
|
|||
.initialProperties(SharedProperties::stone)
|
||||
.tag(AllBlockTags.SAFE_NBT.tag)
|
||||
.onRegister(addMovementBehaviour(FunnelMovementBehaviour.andesite()))
|
||||
.transform(BuilderTransformers.funnel("andesite", Create.asResource("block/andesite_casing")))
|
||||
.blockstate(new FunnelGenerator("andesite")::generate)
|
||||
.item(FunnelItem::new)
|
||||
.model(FunnelGenerator.itemModel("andesite"))
|
||||
.build()
|
||||
.register();
|
||||
|
||||
public static final BlockEntry<BeltFunnelBlock> ANDESITE_BELT_FUNNEL =
|
||||
|
@ -1097,7 +1102,10 @@ public class AllBlocks {
|
|||
.initialProperties(SharedProperties::softMetal)
|
||||
.tag(AllBlockTags.SAFE_NBT.tag)
|
||||
.onRegister(addMovementBehaviour(FunnelMovementBehaviour.brass()))
|
||||
.transform(BuilderTransformers.funnel("brass", Create.asResource("block/brass_casing")))
|
||||
.blockstate(new FunnelGenerator("brass")::generate)
|
||||
.item(FunnelItem::new)
|
||||
.model(FunnelGenerator.itemModel("brass"))
|
||||
.build()
|
||||
.register();
|
||||
|
||||
public static final BlockEntry<BeltFunnelBlock> BRASS_BELT_FUNNEL =
|
||||
|
|
|
@ -78,7 +78,7 @@ public class AllShapes {
|
|||
.add(0.1, 1, 10, 15.9, 5, 14)
|
||||
.add(0.1, -3, 11, 15.9, 1, 15)
|
||||
.forHorizontal(NORTH),
|
||||
FUNNEL = shape(2, 2, 14, 14, 14, 18).add(1, 8, 12, 15, 15, 14)
|
||||
FUNNEL_WALL = shape(2, 2, 14, 14, 14, 18).add(1, 8, 12, 15, 15, 14)
|
||||
.add(0.1, 13, 7, 15.9, 15, 11)
|
||||
.add(0.1, 9, 8, 15.9, 13, 12)
|
||||
.add(0.1, 5, 9, 15.9, 9, 13)
|
||||
|
|
|
@ -9,7 +9,7 @@ import net.minecraft.util.text.ITextComponent;
|
|||
import net.minecraft.util.text.TranslationTextComponent;
|
||||
|
||||
public class AssemblyException extends Exception {
|
||||
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
public final ITextComponent component;
|
||||
private BlockPos position = null;
|
||||
|
@ -21,7 +21,8 @@ public class AssemblyException extends Exception {
|
|||
CompoundNBT nbt = new CompoundNBT();
|
||||
nbt.putString("Component", ITextComponent.Serializer.toJson(exception.component));
|
||||
if (exception.hasPosition())
|
||||
nbt.putLong("Position", exception.getPosition().toLong());
|
||||
nbt.putLong("Position", exception.getPosition()
|
||||
.toLong());
|
||||
|
||||
compound.put("LastException", nbt);
|
||||
}
|
||||
|
@ -48,38 +49,35 @@ public class AssemblyException extends Exception {
|
|||
}
|
||||
|
||||
public static AssemblyException unmovableBlock(BlockPos pos, BlockState state) {
|
||||
AssemblyException e = new AssemblyException("unmovableBlock",
|
||||
pos.getX(),
|
||||
pos.getY(),
|
||||
pos.getZ(),
|
||||
new TranslationTextComponent(state.getBlock().getTranslationKey()));
|
||||
AssemblyException e = new AssemblyException("unmovableBlock", pos.getX(), pos.getY(), pos.getZ(),
|
||||
new TranslationTextComponent(state.getBlock()
|
||||
.getTranslationKey()));
|
||||
e.position = pos;
|
||||
return e;
|
||||
}
|
||||
|
||||
public static AssemblyException unloadedChunk(BlockPos pos) {
|
||||
AssemblyException e = new AssemblyException("chunkNotLoaded",
|
||||
pos.getX(),
|
||||
pos.getY(),
|
||||
pos.getZ());
|
||||
AssemblyException e = new AssemblyException("chunkNotLoaded", pos.getX(), pos.getY(), pos.getZ());
|
||||
e.position = pos;
|
||||
return e;
|
||||
}
|
||||
|
||||
public static AssemblyException structureTooLarge() {
|
||||
return new AssemblyException("structureTooLarge",
|
||||
AllConfigs.SERVER.kinetics.maxBlocksMoved.get());
|
||||
return new AssemblyException("structureTooLarge", AllConfigs.SERVER.kinetics.maxBlocksMoved.get());
|
||||
}
|
||||
|
||||
public static AssemblyException tooManyPistonPoles() {
|
||||
return new AssemblyException("tooManyPistonPoles",
|
||||
AllConfigs.SERVER.kinetics.maxPistonPoles.get());
|
||||
return new AssemblyException("tooManyPistonPoles", AllConfigs.SERVER.kinetics.maxPistonPoles.get());
|
||||
}
|
||||
|
||||
public static AssemblyException noPistonPoles() {
|
||||
return new AssemblyException("noPistonPoles");
|
||||
}
|
||||
|
||||
public static AssemblyException notEnoughSails(int sails) {
|
||||
return new AssemblyException("not_enough_sails", sails, AllConfigs.SERVER.kinetics.minimumWindmillSails.get());
|
||||
}
|
||||
|
||||
public String getFormattedText() {
|
||||
return component.getFormattedText();
|
||||
}
|
||||
|
|
|
@ -712,16 +712,15 @@ public abstract class Contraption {
|
|||
}
|
||||
|
||||
ListNBT superglueNBT = new ListNBT();
|
||||
for (Pair<BlockPos, Direction> glueEntry : superglue) {
|
||||
CompoundNBT c = new CompoundNBT();
|
||||
c.put("Pos", NBTUtil.writeBlockPos(glueEntry.getKey()));
|
||||
c.putByte("Direction", (byte) glueEntry.getValue()
|
||||
.getIndex());
|
||||
superglueNBT.add(c);
|
||||
}
|
||||
|
||||
ListNBT storageNBT = new ListNBT();
|
||||
if (!spawnPacket) {
|
||||
for (Pair<BlockPos, Direction> glueEntry : superglue) {
|
||||
CompoundNBT c = new CompoundNBT();
|
||||
c.put("Pos", NBTUtil.writeBlockPos(glueEntry.getKey()));
|
||||
c.putByte("Direction", (byte) glueEntry.getValue().getIndex());
|
||||
superglueNBT.add(c);
|
||||
}
|
||||
|
||||
for (BlockPos pos : storage.keySet()) {
|
||||
CompoundNBT c = new CompoundNBT();
|
||||
MountedStorage mountedStorage = storage.get(pos);
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
package com.simibubi.create.content.contraptions.components.structureMovement;
|
||||
|
||||
import static net.minecraft.util.text.TextFormatting.GRAY;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation;
|
||||
import com.simibubi.create.foundation.item.TooltipHelper;
|
||||
import com.simibubi.create.foundation.utility.Lang;
|
||||
|
||||
import net.minecraft.util.text.TextFormatting;
|
||||
|
@ -18,9 +21,16 @@ public interface IDisplayAssemblyExceptions {
|
|||
if (!tooltip.isEmpty())
|
||||
tooltip.add("");
|
||||
|
||||
String spacing = IHaveGoggleInformation.spacing;
|
||||
tooltip.add(IHaveGoggleInformation.spacing + TextFormatting.GOLD + Lang.translate("gui.assembly.exception"));
|
||||
String text = e.getFormattedText();
|
||||
Arrays.stream(text.split("\n")).forEach(l -> tooltip.add(IHaveGoggleInformation.spacing + TextFormatting.GRAY + l));
|
||||
|
||||
Arrays.stream(e.getFormattedText()
|
||||
.split("\n"))
|
||||
.forEach(l -> {
|
||||
List<String> cutString = TooltipHelper.cutString(spacing + l, GRAY, TextFormatting.WHITE);
|
||||
for (int i = 0; i < cutString.size(); i++)
|
||||
tooltip.add((i == 0 ? "" : spacing) + cutString.get(i));
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Ass
|
|||
import com.simibubi.create.content.contraptions.components.structureMovement.Contraption;
|
||||
import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter;
|
||||
import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType;
|
||||
import com.simibubi.create.foundation.config.AllConfigs;
|
||||
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
|
@ -21,7 +22,7 @@ public class BearingContraption extends Contraption {
|
|||
|
||||
protected int sailBlocks;
|
||||
protected Direction facing;
|
||||
|
||||
|
||||
private boolean isWindmill;
|
||||
|
||||
public BearingContraption() {}
|
||||
|
@ -38,8 +39,8 @@ public class BearingContraption extends Contraption {
|
|||
return false;
|
||||
startMoving(world);
|
||||
expandBoundsAroundAxis(facing.getAxis());
|
||||
if (isWindmill && sailBlocks == 0)
|
||||
return false;
|
||||
if (isWindmill && sailBlocks < AllConfigs.SERVER.kinetics.minimumWindmillSails.get())
|
||||
throw AssemblyException.notEnoughSails(sailBlocks);
|
||||
if (blocks.isEmpty())
|
||||
return false;
|
||||
return true;
|
||||
|
|
|
@ -46,8 +46,6 @@ public class MechanicalPistonTileEntity extends LinearActuatorTileEntity {
|
|||
if (!(world.getBlockState(pos)
|
||||
.getBlock() instanceof MechanicalPistonBlock))
|
||||
return;
|
||||
if (getMovementSpeed() == 0)
|
||||
return;
|
||||
|
||||
Direction direction = getBlockState().get(BlockStateProperties.FACING);
|
||||
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
package com.simibubi.create.content.logistics.block.funnel;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.state.DirectionProperty;
|
||||
import net.minecraft.state.StateContainer.Builder;
|
||||
import net.minecraft.state.properties.BlockStateProperties;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Mirror;
|
||||
import net.minecraft.util.Rotation;
|
||||
|
||||
public class AbstractDirectionalFunnelBlock extends AbstractFunnelBlock {
|
||||
|
||||
public static final DirectionProperty FACING = BlockStateProperties.FACING;
|
||||
|
||||
protected AbstractDirectionalFunnelBlock(Properties p_i48377_1_) {
|
||||
super(p_i48377_1_);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void fillStateContainer(Builder<Block, BlockState> builder) {
|
||||
super.fillStateContainer(builder.add(FACING));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Direction getFacing(BlockState state) {
|
||||
return state.get(FACING);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState rotate(BlockState state, Rotation rot) {
|
||||
return state.with(FACING, rot.rotate(state.get(FACING)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState mirror(BlockState state, Mirror mirrorIn) {
|
||||
return state.rotate(mirrorIn.toRotation(state.get(FACING)));
|
||||
}
|
||||
|
||||
}
|
|
@ -12,7 +12,6 @@ import com.simibubi.create.foundation.utility.BlockHelper;
|
|||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.HorizontalBlock;
|
||||
import net.minecraft.client.particle.ParticleManager;
|
||||
import net.minecraft.item.BlockItemUseContext;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
@ -28,7 +27,7 @@ import net.minecraft.world.World;
|
|||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
|
||||
public abstract class AbstractFunnelBlock extends HorizontalBlock implements ITE<FunnelTileEntity>, IWrenchable {
|
||||
public abstract class AbstractFunnelBlock extends Block implements ITE<FunnelTileEntity>, IWrenchable {
|
||||
|
||||
public static final BooleanProperty POWERED = BlockStateProperties.POWERED;
|
||||
|
||||
|
@ -39,16 +38,13 @@ public abstract class AbstractFunnelBlock extends HorizontalBlock implements ITE
|
|||
|
||||
@Override
|
||||
public BlockState getStateForPlacement(BlockItemUseContext context) {
|
||||
Direction facing = context.getPlacementHorizontalFacing()
|
||||
.getOpposite();
|
||||
return getDefaultState().with(HORIZONTAL_FACING, facing)
|
||||
.with(POWERED, context.getWorld()
|
||||
.isBlockPowered(context.getPos()));
|
||||
return getDefaultState().with(POWERED, context.getWorld()
|
||||
.isBlockPowered(context.getPos()));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void fillStateContainer(Builder<Block, BlockState> builder) {
|
||||
super.fillStateContainer(builder.add(POWERED, HORIZONTAL_FACING));
|
||||
super.fillStateContainer(builder.add(POWERED));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -120,9 +116,7 @@ public abstract class AbstractFunnelBlock extends HorizontalBlock implements ITE
|
|||
return ((AbstractFunnelBlock) state.getBlock()).getFacing(state);
|
||||
}
|
||||
|
||||
protected Direction getFacing(BlockState state) {
|
||||
return state.get(BlockStateProperties.HORIZONTAL_FACING);
|
||||
}
|
||||
protected abstract Direction getFacing(BlockState state);
|
||||
|
||||
@Override
|
||||
public void onReplaced(BlockState p_196243_1_, World p_196243_2_, BlockPos p_196243_3_, BlockState p_196243_4_,
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
package com.simibubi.create.content.logistics.block.funnel;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.state.DirectionProperty;
|
||||
import net.minecraft.state.StateContainer.Builder;
|
||||
import net.minecraft.state.properties.BlockStateProperties;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Mirror;
|
||||
import net.minecraft.util.Rotation;
|
||||
|
||||
public abstract class AbstractHorizontalFunnelBlock extends AbstractFunnelBlock {
|
||||
|
||||
public static final DirectionProperty HORIZONTAL_FACING = BlockStateProperties.HORIZONTAL_FACING;
|
||||
|
||||
protected AbstractHorizontalFunnelBlock(Properties p_i48377_1_) {
|
||||
super(p_i48377_1_);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void fillStateContainer(Builder<Block, BlockState> builder) {
|
||||
super.fillStateContainer(builder.add(HORIZONTAL_FACING));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Direction getFacing(BlockState state) {
|
||||
return state.get(HORIZONTAL_FACING);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState rotate(BlockState p_185499_1_, Rotation p_185499_2_) {
|
||||
return p_185499_1_.with(HORIZONTAL_FACING, p_185499_2_.rotate(p_185499_1_.get(HORIZONTAL_FACING)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState mirror(BlockState p_185471_1_, Mirror p_185471_2_) {
|
||||
return p_185471_1_.rotate(p_185471_2_.toRotation(p_185471_1_.get(HORIZONTAL_FACING)));
|
||||
}
|
||||
|
||||
}
|
|
@ -15,7 +15,7 @@ public class AndesiteFunnelBlock extends FunnelBlock {
|
|||
|
||||
@Override
|
||||
public BlockState getEquivalentBeltFunnel(IBlockReader world, BlockPos pos, BlockState state) {
|
||||
Direction facing = state.get(HORIZONTAL_FACING);
|
||||
Direction facing = getFunnelFacing(state);
|
||||
return AllBlocks.ANDESITE_BELT_FUNNEL.getDefaultState()
|
||||
.with(BeltFunnelBlock.HORIZONTAL_FACING, facing)
|
||||
.with(POWERED, state.get(POWERED));
|
||||
|
|
|
@ -35,7 +35,7 @@ import net.minecraft.world.IWorld;
|
|||
import net.minecraft.world.IWorldReader;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class BeltFunnelBlock extends AbstractFunnelBlock implements ISpecialBlockItemRequirement {
|
||||
public class BeltFunnelBlock extends AbstractHorizontalFunnelBlock implements ISpecialBlockItemRequirement {
|
||||
|
||||
private BlockEntry<? extends FunnelBlock> parent;
|
||||
public static final IProperty<Shape> SHAPE = EnumProperty.create("shape", Shape.class);
|
||||
|
@ -124,7 +124,7 @@ public class BeltFunnelBlock extends AbstractFunnelBlock implements ISpecialBloc
|
|||
parentState = parentState.with(POWERED, true);
|
||||
if (state.get(SHAPE) == Shape.PUSHING)
|
||||
parentState = parentState.with(FunnelBlock.EXTRACTING, true);
|
||||
return parentState.with(FunnelBlock.HORIZONTAL_FACING, state.get(HORIZONTAL_FACING));
|
||||
return parentState.with(FunnelBlock.FACING, state.get(HORIZONTAL_FACING));
|
||||
}
|
||||
Shape updatedShape =
|
||||
getShapeForPosition(world, pos, state.get(HORIZONTAL_FACING), state.get(SHAPE) == Shape.PUSHING);
|
||||
|
|
|
@ -15,7 +15,7 @@ public class BrassFunnelBlock extends FunnelBlock {
|
|||
|
||||
@Override
|
||||
public BlockState getEquivalentBeltFunnel(IBlockReader world, BlockPos pos, BlockState state) {
|
||||
Direction facing = state.get(HORIZONTAL_FACING);
|
||||
Direction facing = getFacing(state);
|
||||
return AllBlocks.BRASS_BELT_FUNNEL.getDefaultState()
|
||||
.with(BeltFunnelBlock.HORIZONTAL_FACING, facing)
|
||||
.with(POWERED, state.get(POWERED));
|
||||
|
|
|
@ -14,10 +14,7 @@ import net.minecraft.item.BlockItemUseContext;
|
|||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.ItemUseContext;
|
||||
import net.minecraft.state.BooleanProperty;
|
||||
import net.minecraft.state.EnumProperty;
|
||||
import net.minecraft.state.StateContainer.Builder;
|
||||
import net.minecraft.state.properties.AttachFace;
|
||||
import net.minecraft.state.properties.BlockStateProperties;
|
||||
import net.minecraft.util.ActionResultType;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Direction.AxisDirection;
|
||||
|
@ -31,15 +28,13 @@ import net.minecraft.world.IBlockReader;
|
|||
import net.minecraft.world.IWorld;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public abstract class FunnelBlock extends AbstractFunnelBlock {
|
||||
public abstract class FunnelBlock extends AbstractDirectionalFunnelBlock {
|
||||
|
||||
public static final EnumProperty<AttachFace> FACE = BlockStateProperties.FACE;
|
||||
public static final BooleanProperty EXTRACTING = BooleanProperty.create("extracting");
|
||||
|
||||
public FunnelBlock(Properties p_i48415_1_) {
|
||||
super(p_i48415_1_);
|
||||
setDefaultState(getDefaultState().with(FACE, AttachFace.WALL)
|
||||
.with(EXTRACTING, false));
|
||||
setDefaultState(getDefaultState().with(EXTRACTING, false));
|
||||
}
|
||||
|
||||
public abstract BlockState getEquivalentBeltFunnel(IBlockReader world, BlockPos pos, BlockState state);
|
||||
|
@ -53,13 +48,7 @@ public abstract class FunnelBlock extends AbstractFunnelBlock {
|
|||
state = state.with(EXTRACTING, !sneak);
|
||||
|
||||
for (Direction direction : context.getNearestLookingDirections()) {
|
||||
BlockState blockstate;
|
||||
if (direction.getAxis() == Direction.Axis.Y)
|
||||
blockstate = state.with(FACE, direction == Direction.UP ? AttachFace.CEILING : AttachFace.FLOOR)
|
||||
.with(HORIZONTAL_FACING, context.getPlacementHorizontalFacing());
|
||||
else
|
||||
blockstate = state.with(FACE, AttachFace.WALL)
|
||||
.with(HORIZONTAL_FACING, direction.getOpposite());
|
||||
BlockState blockstate = state.with(FACING, direction.getOpposite());
|
||||
if (blockstate.isValidPosition(context.getWorld(), context.getPos()))
|
||||
return blockstate.with(POWERED, state.get(POWERED));
|
||||
}
|
||||
|
@ -69,7 +58,7 @@ public abstract class FunnelBlock extends AbstractFunnelBlock {
|
|||
|
||||
@Override
|
||||
protected void fillStateContainer(Builder<Block, BlockState> builder) {
|
||||
super.fillStateContainer(builder.add(FACE, EXTRACTING));
|
||||
super.fillStateContainer(builder.add(EXTRACTING));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -137,26 +126,17 @@ public abstract class FunnelBlock extends AbstractFunnelBlock {
|
|||
return !state.get(POWERED) && !state.get(EXTRACTING);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Direction getFacing(BlockState state) {
|
||||
if (state.get(FACE) == AttachFace.CEILING)
|
||||
return Direction.DOWN;
|
||||
if (state.get(FACE) == AttachFace.FLOOR)
|
||||
return Direction.UP;
|
||||
return super.getFacing(state);
|
||||
}
|
||||
|
||||
@Override
|
||||
public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext context) {
|
||||
AttachFace attachFace = state.get(FACE);
|
||||
return attachFace == AttachFace.CEILING ? AllShapes.FUNNEL_CEILING
|
||||
: attachFace == AttachFace.FLOOR ? AllShapes.FUNNEL_FLOOR
|
||||
: AllShapes.FUNNEL.get(state.get(HORIZONTAL_FACING));
|
||||
Direction facing = state.get(FACING);
|
||||
return facing == Direction.DOWN ? AllShapes.FUNNEL_CEILING
|
||||
: facing == Direction.UP ? AllShapes.FUNNEL_FLOOR : AllShapes.FUNNEL_WALL.get(facing);
|
||||
}
|
||||
|
||||
@Override
|
||||
public VoxelShape getCollisionShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext context) {
|
||||
if (context.getEntity() instanceof ItemEntity && state.get(FACE) == AttachFace.WALL)
|
||||
if (context.getEntity() instanceof ItemEntity && getFacing(state).getAxis()
|
||||
.isHorizontal())
|
||||
return AllShapes.FUNNEL_COLLISION.get(getFacing(state));
|
||||
return getShape(state, world, pos, context);
|
||||
}
|
||||
|
@ -164,7 +144,8 @@ public abstract class FunnelBlock extends AbstractFunnelBlock {
|
|||
@Override
|
||||
public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState p_196271_3_, IWorld world,
|
||||
BlockPos pos, BlockPos p_196271_6_) {
|
||||
if (state.get(FACE) != AttachFace.WALL || direction != Direction.DOWN)
|
||||
if (getFacing(state).getAxis()
|
||||
.isVertical() || direction != Direction.DOWN)
|
||||
return state;
|
||||
BlockState equivalentFunnel = getEquivalentBeltFunnel(null, null, state);
|
||||
if (BeltFunnelBlock.isOnValidBelt(equivalentFunnel, world, pos))
|
||||
|
|
|
@ -8,7 +8,6 @@ import com.simibubi.create.foundation.utility.MatrixStacker;
|
|||
import com.simibubi.create.foundation.utility.VecHelper;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.state.properties.AttachFace;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Direction.Axis;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
|
@ -36,50 +35,24 @@ public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided {
|
|||
}
|
||||
}
|
||||
|
||||
if (state.getBlock() instanceof FunnelBlock) {
|
||||
if (state.get(FunnelBlock.FACE) == AttachFace.WALL)
|
||||
return VecHelper.rotateCentered(VecHelper.voxelSpace(8, 12.1, 8.7f), horizontalAngle, Axis.Y);
|
||||
Vec3d southLocation = VecHelper.voxelSpace(8, funnelFacing == Direction.DOWN ? 6.5f : 9.5f, 13f);
|
||||
return VecHelper.rotateCentered(southLocation,
|
||||
AngleHelper.horizontalAngle(state.get(AbstractFunnelBlock.HORIZONTAL_FACING)), Axis.Y);
|
||||
if (!funnelFacing.getAxis()
|
||||
.isHorizontal()) {
|
||||
Vec3d southLocation = VecHelper.voxelSpace(8, funnelFacing == Direction.DOWN ? 14 : 2, 15.5f);
|
||||
return VecHelper.rotateCentered(southLocation, horizontalAngle, Axis.Y);
|
||||
}
|
||||
|
||||
return Vec3d.ZERO;
|
||||
|
||||
// if (!funnelFacing.getAxis()
|
||||
// .isHorizontal()) {
|
||||
// Vec3d southLocation = VecHelper.voxelSpace(8, funnelFacing == Direction.DOWN ? 3 : 13, 15.5f);
|
||||
// return VecHelper.rotateCentered(southLocation, horizontalAngle, Axis.Y);
|
||||
// }
|
||||
//
|
||||
// Direction verticalDirection = DirectionHelper.rotateAround(getSide(), funnelFacing.rotateY()
|
||||
// .getAxis());
|
||||
// if (funnelFacing.getAxis() == Axis.Z)
|
||||
// verticalDirection = verticalDirection.getOpposite();
|
||||
// float yRot = -AngleHelper.horizontalAngle(verticalDirection) + 180;
|
||||
// float xRot = -90;
|
||||
// boolean alongX = funnelFacing.getAxis() == Axis.X;
|
||||
// float zRotLast = alongX ^ funnelFacing.getAxisDirection() == AxisDirection.POSITIVE ? 180 : 0;
|
||||
//
|
||||
// Vec3d vec = VecHelper.voxelSpace(8, 13, .5f);
|
||||
// vec = vec.subtract(.5, .5, .5);
|
||||
// vec = VecHelper.rotate(vec, zRotLast, Axis.Z);
|
||||
// vec = VecHelper.rotate(vec, yRot, Axis.Y);
|
||||
// vec = VecHelper.rotate(vec, alongX ? 0 : xRot, Axis.X);
|
||||
// vec = VecHelper.rotate(vec, alongX ? xRot : 0, Axis.Z);
|
||||
// vec = vec.add(.5, .5, .5);
|
||||
// return vec;
|
||||
|
||||
return VecHelper.rotateCentered(VecHelper.voxelSpace(8, 12.1, 8.7f), horizontalAngle, Axis.Y);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void rotate(BlockState state, MatrixStack ms) {
|
||||
Direction facing = FunnelBlock.getFunnelFacing(state);
|
||||
|
||||
// if (facing.getAxis()
|
||||
// .isVertical()) {
|
||||
// super.rotate(state, ms);
|
||||
// return;
|
||||
// }
|
||||
if (facing.getAxis()
|
||||
.isVertical()) {
|
||||
super.rotate(state, ms);
|
||||
return;
|
||||
}
|
||||
|
||||
boolean isBeltFunnel = state.getBlock() instanceof BeltFunnelBlock;
|
||||
if (isBeltFunnel && state.get(BeltFunnelBlock.SHAPE) != Shape.EXTENDED) {
|
||||
|
@ -92,15 +65,13 @@ public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided {
|
|||
}
|
||||
|
||||
if (state.getBlock() instanceof FunnelBlock) {
|
||||
if (state.get(FunnelBlock.FACE) == AttachFace.WALL) {
|
||||
super.rotate(state, ms);
|
||||
MatrixStacker.of(ms)
|
||||
.rotateX(-22.5f);
|
||||
return;
|
||||
}
|
||||
super.rotate(state, ms);
|
||||
MatrixStacker.of(ms)
|
||||
.rotateX(-22.5f);
|
||||
return;
|
||||
}
|
||||
|
||||
float yRot = AngleHelper.horizontalAngle(state.get(AbstractFunnelBlock.HORIZONTAL_FACING))
|
||||
float yRot = AngleHelper.horizontalAngle(AbstractFunnelBlock.getFunnelFacing(state))
|
||||
+ (facing == Direction.DOWN ? 180 : 0);
|
||||
MatrixStacker.of(ms)
|
||||
.rotateY(yRot)
|
||||
|
@ -113,6 +84,10 @@ public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided {
|
|||
|
||||
if (facing == null)
|
||||
return false;
|
||||
if (facing.getAxis()
|
||||
.isVertical())
|
||||
return direction.getAxis()
|
||||
.isHorizontal();
|
||||
if (state.getBlock() instanceof BeltFunnelBlock && state.get(BeltFunnelBlock.SHAPE) == Shape.EXTENDED)
|
||||
return direction == Direction.UP;
|
||||
return direction == facing;
|
||||
|
|
|
@ -0,0 +1,80 @@
|
|||
package com.simibubi.create.content.logistics.block.funnel;
|
||||
|
||||
import com.simibubi.create.Create;
|
||||
import com.simibubi.create.foundation.data.SpecialBlockStateGen;
|
||||
import com.tterrag.registrate.providers.DataGenContext;
|
||||
import com.tterrag.registrate.providers.RegistrateBlockstateProvider;
|
||||
import com.tterrag.registrate.providers.RegistrateItemModelProvider;
|
||||
import com.tterrag.registrate.util.nullness.NonNullBiConsumer;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraftforge.client.model.generators.BlockModelBuilder;
|
||||
import net.minecraftforge.client.model.generators.ModelFile;
|
||||
|
||||
public class FunnelGenerator extends SpecialBlockStateGen {
|
||||
|
||||
private String type;
|
||||
private ResourceLocation particleTexture;
|
||||
|
||||
public FunnelGenerator(String type) {
|
||||
this.type = type;
|
||||
this.particleTexture = Create.asResource("block/" + type + "_casing");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getXRotation(BlockState state) {
|
||||
return state.get(FunnelBlock.FACING) == Direction.DOWN ? 180 : 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getYRotation(BlockState state) {
|
||||
return horizontalAngle(state.get(FunnelBlock.FACING)) + 180;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T extends Block> ModelFile getModel(DataGenContext<Block, T> c, RegistrateBlockstateProvider p,
|
||||
BlockState s) {
|
||||
String powered = s.get(FunnelBlock.POWERED) ? "_powered" : "";
|
||||
String closed = s.get(FunnelBlock.POWERED) ? "_closed" : "_open";
|
||||
String extracting = s.get(FunnelBlock.EXTRACTING) ? "_push" : "_pull";
|
||||
Direction facing = s.get(FunnelBlock.FACING);
|
||||
boolean horizontal = facing.getAxis()
|
||||
.isHorizontal();
|
||||
String parent = horizontal ? "horizontal" : "vertical";
|
||||
|
||||
BlockModelBuilder model = p.models()
|
||||
.withExistingParent("block/" + type + "_funnel_" + parent + extracting + powered,
|
||||
p.modLoc("block/funnel/block_" + parent))
|
||||
.texture("particle", particleTexture)
|
||||
.texture("7", p.modLoc("block/" + type + "_funnel_plating"))
|
||||
.texture("5", p.modLoc("block/" + type + "_funnel_tall" + powered))
|
||||
.texture("2_2", p.modLoc("block/" + type + "_funnel" + extracting))
|
||||
.texture("3", p.modLoc("block/" + type + "_funnel_back"));
|
||||
|
||||
if (horizontal)
|
||||
return model.texture("6", p.modLoc("block/" + type + "_funnel" + powered));
|
||||
|
||||
return model.texture("8", particleTexture)
|
||||
.texture("9", p.modLoc("block/" + type + "_funnel_slope"))
|
||||
.texture("10", p.modLoc("block/funnel" + closed));
|
||||
}
|
||||
|
||||
public static NonNullBiConsumer<DataGenContext<Item, FunnelItem>, RegistrateItemModelProvider> itemModel(
|
||||
String type) {
|
||||
ResourceLocation particleTexture = Create.asResource("block/" + type + "_casing");
|
||||
return (c, p) -> {
|
||||
p.withExistingParent("item/" + type + "_funnel", p.modLoc("block/funnel/item"))
|
||||
.texture("particle", particleTexture)
|
||||
.texture("7", p.modLoc("block/" + type + "_funnel_plating"))
|
||||
.texture("2", p.modLoc("block/" + type + "_funnel_neutral"))
|
||||
.texture("6", p.modLoc("block/" + type + "_funnel"))
|
||||
.texture("5", p.modLoc("block/" + type + "_funnel_tall"))
|
||||
.texture("3", p.modLoc("block/" + type + "_funnel_back"));
|
||||
};
|
||||
}
|
||||
|
||||
}
|
|
@ -6,7 +6,6 @@ import net.minecraft.block.Block;
|
|||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.item.BlockItem;
|
||||
import net.minecraft.item.BlockItemUseContext;
|
||||
import net.minecraft.state.properties.AttachFace;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
|
@ -38,10 +37,12 @@ public class FunnelItem extends BlockItem {
|
|||
return state;
|
||||
if (!(state.getBlock() instanceof FunnelBlock))
|
||||
return state;
|
||||
if (state.get(FunnelBlock.FACE) != AttachFace.WALL)
|
||||
if (state.get(FunnelBlock.FACING)
|
||||
.getAxis()
|
||||
.isVertical())
|
||||
return state;
|
||||
|
||||
Direction direction = state.get(FunnelBlock.HORIZONTAL_FACING);
|
||||
Direction direction = state.get(FunnelBlock.FACING);
|
||||
FunnelBlock block = (FunnelBlock) getBlock();
|
||||
Block beltFunnelBlock = block.getEquivalentBeltFunnel(world, pos, state)
|
||||
.getBlock();
|
||||
|
|
|
@ -26,7 +26,6 @@ import net.minecraft.block.BlockState;
|
|||
import net.minecraft.entity.item.ItemEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.state.properties.AttachFace;
|
||||
import net.minecraft.state.properties.BlockStateProperties;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.tileentity.TileEntityType;
|
||||
|
@ -259,7 +258,7 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn
|
|||
return false;
|
||||
if (!(blockState.getBlock() instanceof FunnelBlock))
|
||||
return false;
|
||||
return blockState.get(FunnelBlock.FACE) == AttachFace.FLOOR;
|
||||
return FunnelBlock.getFunnelFacing(blockState) == Direction.UP;
|
||||
}
|
||||
|
||||
private boolean supportsFiltering() {
|
||||
|
|
|
@ -1,9 +1,5 @@
|
|||
package com.simibubi.create.content.logistics.block.mechanicalArm;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||
import com.simibubi.create.AllBlockPartials;
|
||||
|
@ -25,10 +21,10 @@ import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBe
|
|||
import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour;
|
||||
import com.simibubi.create.foundation.utility.NBTHelper;
|
||||
import com.simibubi.create.foundation.utility.VecHelper;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.block.ComposterBlock;
|
||||
import net.minecraft.block.JukeboxBlock;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.MusicDiscItem;
|
||||
|
@ -50,10 +46,14 @@ import net.minecraftforge.common.util.LazyOptional;
|
|||
import net.minecraftforge.items.CapabilityItemHandler;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
import net.minecraftforge.items.ItemHandlerHelper;
|
||||
import net.minecraftforge.items.wrapper.InvWrapper;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public abstract class ArmInteractionPoint {
|
||||
|
||||
static enum Mode {
|
||||
enum Mode {
|
||||
DEPOSIT, TAKE
|
||||
}
|
||||
|
||||
|
@ -65,20 +65,21 @@ public abstract class ArmInteractionPoint {
|
|||
private ArmAngleTarget cachedAngles;
|
||||
|
||||
private static ImmutableMap<ArmInteractionPoint, Supplier<ArmInteractionPoint>> POINTS =
|
||||
ImmutableMap.<ArmInteractionPoint, Supplier<ArmInteractionPoint>>builder()
|
||||
.put(new Saw(), Saw::new)
|
||||
.put(new Belt(), Belt::new)
|
||||
.put(new Depot(), Depot::new)
|
||||
.put(new Chute(), Chute::new)
|
||||
.put(new Basin(), Basin::new)
|
||||
.put(new Funnel(), Funnel::new)
|
||||
.put(new Jukebox(), Jukebox::new)
|
||||
.put(new Crafter(), Crafter::new)
|
||||
.put(new Deployer(), Deployer::new)
|
||||
.put(new Millstone(), Millstone::new)
|
||||
.put(new BlazeBurner(), BlazeBurner::new)
|
||||
.put(new CrushingWheels(), CrushingWheels::new)
|
||||
.build();
|
||||
ImmutableMap.<ArmInteractionPoint, Supplier<ArmInteractionPoint>>builder()
|
||||
.put(new Saw(), Saw::new)
|
||||
.put(new Belt(), Belt::new)
|
||||
.put(new Depot(), Depot::new)
|
||||
.put(new Chute(), Chute::new)
|
||||
.put(new Basin(), Basin::new)
|
||||
.put(new Funnel(), Funnel::new)
|
||||
.put(new Jukebox(), Jukebox::new)
|
||||
.put(new Crafter(), Crafter::new)
|
||||
.put(new Deployer(), Deployer::new)
|
||||
.put(new Composter(), Composter::new)
|
||||
.put(new Millstone(), Millstone::new)
|
||||
.put(new BlazeBurner(), BlazeBurner::new)
|
||||
.put(new CrushingWheels(), CrushingWheels::new)
|
||||
.build();
|
||||
|
||||
public ArmInteractionPoint() {
|
||||
cachedHandler = LazyOptional.empty();
|
||||
|
@ -118,8 +119,8 @@ public abstract class ArmInteractionPoint {
|
|||
|
||||
ArmAngleTarget getTargetAngles(BlockPos armPos, boolean ceiling) {
|
||||
if (cachedAngles == null)
|
||||
cachedAngles =
|
||||
new ArmAngleTarget(armPos, getInteractionPositionVector(), getInteractionDirection(), ceiling);
|
||||
cachedAngles = new ArmAngleTarget(armPos, getInteractionPositionVector(), getInteractionDirection(), ceiling);
|
||||
|
||||
return cachedAngles;
|
||||
}
|
||||
|
||||
|
@ -166,8 +167,7 @@ public abstract class ArmInteractionPoint {
|
|||
|
||||
for (ArmInteractionPoint armInteractionPoint : POINTS.keySet())
|
||||
if (armInteractionPoint.isValid(world, pos, state))
|
||||
point = POINTS.get(armInteractionPoint)
|
||||
.get();
|
||||
point = POINTS.get(armInteractionPoint).get();
|
||||
|
||||
if (point != null) {
|
||||
point.state = state;
|
||||
|
@ -222,7 +222,7 @@ public abstract class ArmInteractionPoint {
|
|||
@Override
|
||||
boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) {
|
||||
return AllBlocks.MECHANICAL_SAW.has(state) && state.get(SawBlock.FACING) == Direction.UP
|
||||
&& ((KineticTileEntity) reader.getTileEntity(pos)).getSpeed() != 0;
|
||||
&& ((KineticTileEntity) reader.getTileEntity(pos)).getSpeed() != 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -245,6 +245,25 @@ public abstract class ArmInteractionPoint {
|
|||
|
||||
}
|
||||
|
||||
static class Composter extends TopFaceArmInteractionPoint {
|
||||
|
||||
@Override
|
||||
Vec3d getInteractionPositionVector() {
|
||||
return new Vec3d(pos).add(.5f, 13 / 16f, .5f);
|
||||
}
|
||||
|
||||
@Override
|
||||
boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) {
|
||||
return Blocks.COMPOSTER.equals(state.getBlock());
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
IItemHandler getHandler(World world) {
|
||||
return new InvWrapper(((ComposterBlock) Blocks.COMPOSTER).createInventory(world.getBlockState(pos), world, pos));
|
||||
}
|
||||
}
|
||||
|
||||
static class Deployer extends ArmInteractionPoint {
|
||||
|
||||
@Override
|
||||
|
@ -254,14 +273,12 @@ public abstract class ArmInteractionPoint {
|
|||
|
||||
@Override
|
||||
Direction getInteractionDirection() {
|
||||
return state.get(DeployerBlock.FACING)
|
||||
.getOpposite();
|
||||
return state.get(DeployerBlock.FACING).getOpposite();
|
||||
}
|
||||
|
||||
@Override
|
||||
Vec3d getInteractionPositionVector() {
|
||||
return super.getInteractionPositionVector()
|
||||
.add(new Vec3d(getInteractionDirection().getDirectionVec()).scale(.65f));
|
||||
return super.getInteractionPositionVector().add(new Vec3d(getInteractionDirection().getDirectionVec()).scale(.65f));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -281,15 +298,13 @@ public abstract class ArmInteractionPoint {
|
|||
@Override
|
||||
ItemStack insert(World world, ItemStack stack, boolean simulate) {
|
||||
ItemStack input = stack.copy();
|
||||
if (!BlazeBurnerBlock.tryInsert(state, world, pos, input, false, true)
|
||||
.getResult()
|
||||
.isEmpty()) {
|
||||
if (!BlazeBurnerBlock.tryInsert(state, world, pos, input, false, true).getResult().isEmpty()) {
|
||||
return stack;
|
||||
}
|
||||
ActionResult<ItemStack> res = BlazeBurnerBlock.tryInsert(state, world, pos, input, false, simulate);
|
||||
return res.getType() == ActionResultType.SUCCESS
|
||||
? ItemHandlerHelper.copyStackWithSize(stack, stack.getCount() - 1)
|
||||
: stack;
|
||||
? ItemHandlerHelper.copyStackWithSize(stack, stack.getCount() - 1)
|
||||
: stack;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -306,8 +321,7 @@ public abstract class ArmInteractionPoint {
|
|||
|
||||
@Override
|
||||
Direction getInteractionDirection() {
|
||||
return state.get(MechanicalCrafterBlock.HORIZONTAL_FACING)
|
||||
.getOpposite();
|
||||
return state.get(MechanicalCrafterBlock.HORIZONTAL_FACING).getOpposite();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -325,8 +339,7 @@ public abstract class ArmInteractionPoint {
|
|||
|
||||
@Override
|
||||
Vec3d getInteractionPositionVector() {
|
||||
return super.getInteractionPositionVector()
|
||||
.add(new Vec3d(getInteractionDirection().getDirectionVec()).scale(.5f));
|
||||
return super.getInteractionPositionVector().add(new Vec3d(getInteractionDirection().getDirectionVec()).scale(.5f));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -361,8 +374,7 @@ public abstract class ArmInteractionPoint {
|
|||
return stack;
|
||||
JukeboxBlock jukeboxBlock = (JukeboxBlock) state.getBlock();
|
||||
JukeboxTileEntity jukeboxTE = (JukeboxTileEntity) tileEntity;
|
||||
if (!jukeboxTE.getRecord()
|
||||
.isEmpty())
|
||||
if (!jukeboxTE.getRecord().isEmpty())
|
||||
return stack;
|
||||
if (!(stack.getItem() instanceof MusicDiscItem))
|
||||
return stack;
|
||||
|
@ -370,7 +382,7 @@ public abstract class ArmInteractionPoint {
|
|||
ItemStack toInsert = remainder.split(1);
|
||||
if (!simulate && !world.isRemote) {
|
||||
jukeboxBlock.insertRecord(world, pos, state, toInsert);
|
||||
world.playEvent((PlayerEntity) null, 1010, pos, Item.getIdFromItem(toInsert.getItem()));
|
||||
world.playEvent(null, 1010, pos, Item.getIdFromItem(toInsert.getItem()));
|
||||
AllTriggers.triggerForNearbyPlayers(AllTriggers.MUSICAL_ARM, world, pos, 10);
|
||||
}
|
||||
return remainder;
|
||||
|
@ -401,8 +413,7 @@ public abstract class ArmInteractionPoint {
|
|||
|
||||
@Override
|
||||
boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) {
|
||||
return AllBlocks.BELT.has(state) && !(reader.getBlockState(pos.up())
|
||||
.getBlock() instanceof BeltTunnelBlock);
|
||||
return AllBlocks.BELT.has(state) && !(reader.getBlockState(pos.up()).getBlock() instanceof BeltTunnelBlock);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -418,9 +429,7 @@ public abstract class ArmInteractionPoint {
|
|||
|
||||
@Override
|
||||
Vec3d getInteractionPositionVector() {
|
||||
return VecHelper.getCenterOf(pos)
|
||||
.add(new Vec3d(FunnelBlock.getFunnelFacing(state)
|
||||
.getDirectionVec()).scale(-.15f));
|
||||
return VecHelper.getCenterOf(pos).add(new Vec3d(FunnelBlock.getFunnelFacing(state).getDirectionVec()).scale(-.15f));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -435,8 +444,7 @@ public abstract class ArmInteractionPoint {
|
|||
|
||||
@Override
|
||||
Direction getInteractionDirection() {
|
||||
return FunnelBlock.getFunnelFacing(state)
|
||||
.getOpposite();
|
||||
return FunnelBlock.getFunnelFacing(state).getOpposite();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -13,16 +13,17 @@ import net.minecraft.fluid.Fluid;
|
|||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.registries.ForgeRegistries;
|
||||
|
||||
public class AllTriggers {
|
||||
|
||||
private static final List<CriterionTriggerBase<?>> triggers = new LinkedList<>();
|
||||
|
||||
public static RegistryTrigger<Fluid> INFINITE_FLUID = add(new RegistryTrigger<>("infinite_fluid", Fluid.class));
|
||||
public static RegistryTrigger<Block> BRACKET_APPLY_TRIGGER = add(new RegistryTrigger<>("bracket_apply", Block.class));
|
||||
public static EnumTrigger<InWorldProcessing.Type> FAN_PROCESSING = add(new EnumTrigger<>("fan_processing", InWorldProcessing.Type.class));
|
||||
public static final RegistryTrigger<Fluid> INFINITE_FLUID = add(new RegistryTrigger<>("infinite_fluid", ForgeRegistries.FLUIDS));
|
||||
public static final RegistryTrigger<Block> BRACKET_APPLY_TRIGGER = add(new RegistryTrigger<>("bracket_apply", ForgeRegistries.BLOCKS));
|
||||
public static final EnumTrigger<InWorldProcessing.Type> FAN_PROCESSING = add(new EnumTrigger<>("fan_processing", InWorldProcessing.Type.class));
|
||||
|
||||
public static SimpleTrigger
|
||||
public static final SimpleTrigger
|
||||
ROTATION = simple("rotation"),
|
||||
OVERSTRESSED = simple("overstressed"),
|
||||
SHIFTING_GEARS = simple("shifting_gears"),
|
||||
|
@ -99,9 +100,6 @@ public class AllTriggers {
|
|||
}
|
||||
|
||||
public static List<ServerPlayerEntity> getPlayersInRange(World world, BlockPos pos, int range) {
|
||||
List<ServerPlayerEntity> players =
|
||||
world.getEntitiesWithinAABB(ServerPlayerEntity.class, new AxisAlignedBB(pos).grow(range));
|
||||
return players;
|
||||
return world.getEntitiesWithinAABB(ServerPlayerEntity.class, new AxisAlignedBB(pos).grow(range));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -4,7 +4,6 @@ import mcp.MethodsReturnNonnullByDefault;
|
|||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraftforge.registries.IForgeRegistry;
|
||||
import net.minecraftforge.registries.IForgeRegistryEntry;
|
||||
import net.minecraftforge.registries.RegistryManager;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import javax.annotation.ParametersAreNonnullByDefault;
|
||||
|
@ -14,15 +13,14 @@ import javax.annotation.ParametersAreNonnullByDefault;
|
|||
public class RegistryTrigger<T extends IForgeRegistryEntry<T>> extends StringSerializableTrigger<T> {
|
||||
private final IForgeRegistry<T> registry;
|
||||
|
||||
public RegistryTrigger(String id, Class<T> registryType) {
|
||||
public RegistryTrigger(String id, IForgeRegistry<T> registry) {
|
||||
super(id);
|
||||
this.registry = RegistryManager.ACTIVE.getRegistry(registryType);
|
||||
this.registry = registry;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
protected T getValue(String key) {
|
||||
|
||||
return registry.getValue(new ResourceLocation(key));
|
||||
}
|
||||
|
||||
|
|
|
@ -10,7 +10,6 @@ import javax.annotation.ParametersAreNonnullByDefault;
|
|||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Supplier;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.StreamSupport;
|
||||
|
@ -18,7 +17,12 @@ import java.util.stream.StreamSupport;
|
|||
@MethodsReturnNonnullByDefault
|
||||
@ParametersAreNonnullByDefault
|
||||
public abstract class StringSerializableTrigger<T> extends CriterionTriggerBase<StringSerializableTrigger.Instance<T>> {
|
||||
public StringSerializableTrigger(String id) {
|
||||
|
||||
protected String getJsonKey() {
|
||||
return "accepted_entries";
|
||||
}
|
||||
|
||||
protected StringSerializableTrigger(String id) {
|
||||
super(id);
|
||||
}
|
||||
|
||||
|
@ -32,32 +36,30 @@ public abstract class StringSerializableTrigger<T> extends CriterionTriggerBase<
|
|||
}
|
||||
|
||||
public ITriggerable constructTriggerFor(@Nullable T entry) {
|
||||
BiConsumer<ServerPlayerEntity, T> trigger = this::trigger;
|
||||
return player -> trigger.accept(player, entry);
|
||||
return player -> trigger(player, entry);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Instance<T> deserializeInstance(JsonObject json, JsonDeserializationContext context) {
|
||||
if (json.has("accepted_entries")) {
|
||||
JsonArray elements = json.getAsJsonArray("accepted_entries");
|
||||
if (json.has(getJsonKey())) {
|
||||
JsonArray elements = json.getAsJsonArray(getJsonKey());
|
||||
return new Instance<>(this,
|
||||
StreamSupport.stream(elements.spliterator(), false).map(JsonElement::getAsString)
|
||||
.map(rl -> {
|
||||
T entry = getValue(rl);
|
||||
.map(key -> {
|
||||
T entry = getValue(key);
|
||||
if (entry == null)
|
||||
throw new JsonSyntaxException("Unknown entry '" + rl + "'");
|
||||
throw new JsonSyntaxException("Unknown entry '" + key + "'");
|
||||
return entry;
|
||||
}).collect(Collectors.toSet()));
|
||||
}
|
||||
|
||||
return forEntries((T) null);
|
||||
return new Instance<>(this, null);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
abstract protected T getValue(String key);
|
||||
protected abstract T getValue(String key);
|
||||
|
||||
@Nullable
|
||||
abstract protected String getKey(T value);
|
||||
protected abstract String getKey(T value);
|
||||
|
||||
public static class Instance<T> extends CriterionTriggerBase.Instance {
|
||||
|
||||
|
@ -84,7 +86,7 @@ public abstract class StringSerializableTrigger<T> extends CriterionTriggerBase<
|
|||
JsonArray elements = new JsonArray();
|
||||
|
||||
if (entries == null) {
|
||||
jsonobject.add("accepted_entries", elements);
|
||||
jsonobject.add(trigger.getJsonKey(), elements);
|
||||
return jsonobject;
|
||||
}
|
||||
|
||||
|
@ -96,7 +98,7 @@ public abstract class StringSerializableTrigger<T> extends CriterionTriggerBase<
|
|||
elements.add(key);
|
||||
}
|
||||
|
||||
jsonobject.add("accepted_entries", elements);
|
||||
jsonobject.add(trigger.getJsonKey(), elements);
|
||||
return jsonobject;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,44 +1,87 @@
|
|||
package com.simibubi.create.foundation.command;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
import com.mojang.brigadier.CommandDispatcher;
|
||||
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
|
||||
import com.mojang.brigadier.tree.CommandNode;
|
||||
import com.mojang.brigadier.tree.LiteralCommandNode;
|
||||
|
||||
import net.minecraft.command.CommandSource;
|
||||
import net.minecraft.command.Commands;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
public class AllCommands {
|
||||
|
||||
public static Predicate<CommandSource> sourceIsPlayer = (cs) -> cs.getEntity() instanceof PlayerEntity;
|
||||
|
||||
public static void register(CommandDispatcher<CommandSource> dispatcher) {
|
||||
|
||||
LiteralCommandNode<CommandSource> createRoot = dispatcher.register(Commands.literal("create")
|
||||
//general purpose
|
||||
.then(ToggleDebugCommand.register())
|
||||
.then(OverlayConfigCommand.register())
|
||||
.then(FixLightingCommand.register())
|
||||
.then(ReplaceInCommandBlocksCommand.register())
|
||||
.then(HighlightCommand.register())
|
||||
.then(ToggleExperimentalRenderingCommand.register())
|
||||
LiteralCommandNode<CommandSource> util = buildUtilityCommands();
|
||||
|
||||
//dev-util
|
||||
//Comment out for release
|
||||
.then(ClearBufferCacheCommand.register())
|
||||
.then(ChunkUtilCommand.register())
|
||||
//.then(KillTPSCommand.register())
|
||||
LiteralCommandNode<CommandSource> createRoot = dispatcher.register(Commands.literal("create")
|
||||
.requires(cs -> cs.hasPermissionLevel(0))
|
||||
//general purpose
|
||||
.then(new ToggleExperimentalRenderingCommand().register())
|
||||
.then(new ToggleDebugCommand().register())
|
||||
.then(OverlayConfigCommand.register())
|
||||
.then(FixLightingCommand.register())
|
||||
.then(HighlightCommand.register())
|
||||
.then(CouplingCommand.register())
|
||||
|
||||
//utility
|
||||
.then(util)
|
||||
);
|
||||
|
||||
createRoot.addChild(buildRedirect("u", util));
|
||||
|
||||
CommandNode<CommandSource> c = dispatcher.findNode(Collections.singleton("c"));
|
||||
if (c != null)
|
||||
return;
|
||||
|
||||
dispatcher.register(Commands.literal("c")
|
||||
.redirect(createRoot)
|
||||
);
|
||||
dispatcher.getRoot().addChild(buildRedirect("c", createRoot));
|
||||
|
||||
}
|
||||
|
||||
|
||||
private static LiteralCommandNode<CommandSource> buildUtilityCommands() {
|
||||
|
||||
return Commands.literal("util")
|
||||
.then(FlySpeedCommand.register())
|
||||
.then(ReplaceInCommandBlocksCommand.register())
|
||||
.then(ClearBufferCacheCommand.register())
|
||||
.then(ChunkUtilCommand.register())
|
||||
//.then(KillTPSCommand.register())
|
||||
.build();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* *****
|
||||
* https://github.com/VelocityPowered/Velocity/blob/8abc9c80a69158ebae0121fda78b55c865c0abad/proxy/src/main/java/com/velocitypowered/proxy/util/BrigadierUtils.java#L38
|
||||
* *****
|
||||
* <p>
|
||||
* Returns a literal node that redirects its execution to
|
||||
* the given destination node.
|
||||
*
|
||||
* @param alias the command alias
|
||||
* @param destination the destination node
|
||||
*
|
||||
* @return the built node
|
||||
*/
|
||||
public static LiteralCommandNode<CommandSource> buildRedirect(final String alias, final LiteralCommandNode<CommandSource> destination) {
|
||||
// Redirects only work for nodes with children, but break the top argument-less command.
|
||||
// Manually adding the root command after setting the redirect doesn't fix it.
|
||||
// See https://github.com/Mojang/brigadier/issues/46). Manually clone the node instead.
|
||||
LiteralArgumentBuilder<CommandSource> builder = LiteralArgumentBuilder
|
||||
.<CommandSource>literal(alias)
|
||||
.requires(destination.getRequirement())
|
||||
.forward(
|
||||
destination.getRedirect(), destination.getRedirectModifier(), destination.isFork())
|
||||
.executes(destination.getCommand());
|
||||
for (CommandNode<CommandSource> child : destination.getChildren()) {
|
||||
builder.then(child);
|
||||
}
|
||||
return builder.build();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,45 @@
|
|||
package com.simibubi.create.foundation.command;
|
||||
|
||||
import com.mojang.brigadier.Command;
|
||||
import com.mojang.brigadier.builder.ArgumentBuilder;
|
||||
import net.minecraft.command.CommandSource;
|
||||
import net.minecraft.command.Commands;
|
||||
import net.minecraft.entity.player.ServerPlayerEntity;
|
||||
|
||||
public abstract class ConfigureConfigCommand {
|
||||
|
||||
protected final String commandLiteral;
|
||||
|
||||
ConfigureConfigCommand(String commandLiteral) {
|
||||
this.commandLiteral = commandLiteral;
|
||||
}
|
||||
|
||||
ArgumentBuilder<CommandSource, ?> register() {
|
||||
return Commands.literal(this.commandLiteral)
|
||||
.requires(cs -> cs.hasPermissionLevel(0))
|
||||
.then(Commands.literal("on")
|
||||
.executes(ctx -> {
|
||||
ServerPlayerEntity player = ctx.getSource().asPlayer();
|
||||
sendPacket(player, String.valueOf(true));
|
||||
|
||||
return Command.SINGLE_SUCCESS;
|
||||
})
|
||||
)
|
||||
.then(Commands.literal("off")
|
||||
.executes(ctx -> {
|
||||
ServerPlayerEntity player = ctx.getSource().asPlayer();
|
||||
sendPacket(player, String.valueOf(false));
|
||||
|
||||
return Command.SINGLE_SUCCESS;
|
||||
})
|
||||
)
|
||||
.executes(ctx -> {
|
||||
ServerPlayerEntity player = ctx.getSource().asPlayer();
|
||||
sendPacket(player, "info");
|
||||
|
||||
return Command.SINGLE_SUCCESS;
|
||||
});
|
||||
}
|
||||
|
||||
protected abstract void sendPacket(ServerPlayerEntity player, String option);
|
||||
}
|
|
@ -1,23 +1,25 @@
|
|||
package com.simibubi.create.foundation.command;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
|
||||
import com.simibubi.create.content.contraptions.goggles.GoggleConfigScreen;
|
||||
import com.simibubi.create.foundation.config.AllConfigs;
|
||||
import com.simibubi.create.foundation.gui.ScreenOpener;
|
||||
import com.simibubi.create.foundation.networking.SimplePacketBase;
|
||||
import com.simibubi.create.foundation.render.backend.FastRenderDispatcher;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.entity.player.ClientPlayerEntity;
|
||||
import net.minecraft.network.PacketBuffer;
|
||||
import net.minecraft.util.text.ITextComponent;
|
||||
import net.minecraft.util.text.StringTextComponent;
|
||||
import net.minecraft.util.text.TextFormatting;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.minecraftforge.common.ForgeConfig;
|
||||
import net.minecraftforge.fml.DistExecutor;
|
||||
import net.minecraftforge.fml.network.NetworkEvent;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class ConfigureConfigPacket extends SimplePacketBase {
|
||||
|
||||
|
@ -79,23 +81,44 @@ public class ConfigureConfigPacket extends SimplePacketBase {
|
|||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
private static void rainbowDebug(String value) {
|
||||
ClientPlayerEntity player = Minecraft.getInstance().player;
|
||||
if (player == null || "".equals(value)) return;
|
||||
|
||||
if (value.equals("info")) {
|
||||
ITextComponent text = new StringTextComponent("Rainbow Debug Utility is currently: ").appendSibling(boolToText(AllConfigs.CLIENT.rainbowDebug.get()));
|
||||
player.sendStatusMessage(text, false);
|
||||
return;
|
||||
}
|
||||
|
||||
AllConfigs.CLIENT.rainbowDebug.set(Boolean.parseBoolean(value));
|
||||
ITextComponent text = boolToText(AllConfigs.CLIENT.rainbowDebug.get()).appendSibling(new StringTextComponent(" Rainbow Debug Utility").applyTextStyle(TextFormatting.WHITE));
|
||||
player.sendStatusMessage(text, false);
|
||||
}
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
private static void experimentalRendering(String value) {
|
||||
if (!"".equals(value)) {
|
||||
AllConfigs.CLIENT.experimentalRendering.set(Boolean.parseBoolean(value));
|
||||
ClientPlayerEntity player = Minecraft.getInstance().player;
|
||||
if (player == null || "".equals(value)) return;
|
||||
|
||||
if (value.equals("info")) {
|
||||
ITextComponent text = new StringTextComponent("Experimental Rendering is currently: ").appendSibling(boolToText(AllConfigs.CLIENT.experimentalRendering.get()));
|
||||
player.sendStatusMessage(text, false);
|
||||
return;
|
||||
}
|
||||
|
||||
AllConfigs.CLIENT.experimentalRendering.set(Boolean.parseBoolean(value));
|
||||
ITextComponent text = boolToText(AllConfigs.CLIENT.experimentalRendering.get()).appendSibling(new StringTextComponent(" Experimental Rendering").applyTextStyle(TextFormatting.WHITE));
|
||||
player.sendStatusMessage(text, false);
|
||||
|
||||
FastRenderDispatcher.refresh();
|
||||
}
|
||||
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
private static void overlayReset(String value) {
|
||||
AllConfigs.CLIENT.overlayOffsetX.set(0);
|
||||
AllConfigs.CLIENT.overlayOffsetY.set(0);
|
||||
}
|
||||
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
private static void overlayScreen(String value) {
|
||||
ScreenOpener.open(new GoggleConfigScreen());
|
||||
|
@ -106,5 +129,11 @@ public class ConfigureConfigPacket extends SimplePacketBase {
|
|||
ForgeConfig.CLIENT.experimentalForgeLightPipelineEnabled.set(true);
|
||||
Minecraft.getInstance().worldRenderer.loadRenderers();
|
||||
}
|
||||
|
||||
private static ITextComponent boolToText(boolean b) {
|
||||
return b
|
||||
? new StringTextComponent("enabled").applyTextStyle(TextFormatting.DARK_GREEN)
|
||||
: new StringTextComponent("disabled").applyTextStyle(TextFormatting.RED);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,136 @@
|
|||
package com.simibubi.create.foundation.command;
|
||||
|
||||
import com.mojang.brigadier.Command;
|
||||
import com.mojang.brigadier.builder.ArgumentBuilder;
|
||||
import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
|
||||
import com.simibubi.create.content.contraptions.components.structureMovement.train.CouplingHandler;
|
||||
import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.CapabilityMinecartController;
|
||||
import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.MinecartController;
|
||||
import com.simibubi.create.foundation.utility.Iterate;
|
||||
import net.minecraft.command.CommandSource;
|
||||
import net.minecraft.command.Commands;
|
||||
import net.minecraft.command.arguments.EntityArgument;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.item.minecart.AbstractMinecartEntity;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.util.text.StringTextComponent;
|
||||
import net.minecraftforge.common.util.LazyOptional;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
public class CouplingCommand {
|
||||
|
||||
public static final SimpleCommandExceptionType ONLY_MINECARTS_ALLOWED = new SimpleCommandExceptionType(new StringTextComponent("Only Minecarts can be coupled"));
|
||||
public static final SimpleCommandExceptionType SAME_DIMENSION = new SimpleCommandExceptionType(new StringTextComponent("Minecarts have to be in the same Dimension"));
|
||||
|
||||
public static ArgumentBuilder<CommandSource, ?> register() {
|
||||
|
||||
return Commands.literal("coupling")
|
||||
.requires(cs -> cs.hasPermissionLevel(2))
|
||||
.then(Commands.literal("add")
|
||||
.then(Commands.argument("cart1", EntityArgument.entity())
|
||||
.then(Commands.argument("cart2", EntityArgument.entity())
|
||||
.executes(ctx -> {
|
||||
Entity cart1 = EntityArgument.getEntity(ctx, "cart1");
|
||||
if (!(cart1 instanceof AbstractMinecartEntity))
|
||||
throw ONLY_MINECARTS_ALLOWED.create();
|
||||
|
||||
Entity cart2 = EntityArgument.getEntity(ctx, "cart2");
|
||||
if (!(cart2 instanceof AbstractMinecartEntity))
|
||||
throw ONLY_MINECARTS_ALLOWED.create();
|
||||
|
||||
if (!cart1.getEntityWorld().equals(cart2.getEntityWorld()))
|
||||
throw SAME_DIMENSION.create();
|
||||
|
||||
Entity source = ctx.getSource().getEntity();
|
||||
|
||||
CouplingHandler.tryToCoupleCarts(source instanceof PlayerEntity ? (PlayerEntity) source : null, cart1.getEntityWorld(), cart1.getEntityId(), cart2.getEntityId());
|
||||
|
||||
return Command.SINGLE_SUCCESS;
|
||||
})
|
||||
)
|
||||
)
|
||||
)
|
||||
.then(Commands.literal("remove")
|
||||
.then(Commands.argument("cart1", EntityArgument.entity())
|
||||
.then(Commands.argument("cart2", EntityArgument.entity())
|
||||
.executes(ctx -> {
|
||||
Entity cart1 = EntityArgument.getEntity(ctx, "cart1");
|
||||
if (!(cart1 instanceof AbstractMinecartEntity))
|
||||
throw ONLY_MINECARTS_ALLOWED.create();
|
||||
|
||||
Entity cart2 = EntityArgument.getEntity(ctx, "cart2");
|
||||
if (!(cart2 instanceof AbstractMinecartEntity))
|
||||
throw ONLY_MINECARTS_ALLOWED.create();
|
||||
|
||||
LazyOptional<MinecartController> cart1Capability = cart1.getCapability(CapabilityMinecartController.MINECART_CONTROLLER_CAPABILITY);
|
||||
if (!cart1Capability.isPresent()) {
|
||||
ctx.getSource().sendFeedback(new StringTextComponent("Minecart has no Couplings Attached"), true);
|
||||
return 0;
|
||||
}
|
||||
|
||||
MinecartController cart1Controller = cart1Capability.orElse(null);
|
||||
|
||||
int cart1Couplings = (cart1Controller.isConnectedToCoupling() ? 1 : 0) + (cart1Controller.isLeadingCoupling() ? 1 : 0);
|
||||
if (cart1Couplings == 0) {
|
||||
ctx.getSource().sendFeedback(new StringTextComponent("Minecart has no Couplings Attached"), true);
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (boolean bool : Iterate.trueAndFalse) {
|
||||
UUID coupledCart = cart1Controller.getCoupledCart(bool);
|
||||
if (coupledCart == null)
|
||||
continue;
|
||||
|
||||
if (coupledCart != cart2.getUniqueID())
|
||||
continue;
|
||||
|
||||
MinecartController cart2Controller = CapabilityMinecartController.getIfPresent(cart1.getEntityWorld(), coupledCart);
|
||||
if (cart2Controller == null)
|
||||
return 0;
|
||||
|
||||
cart1Controller.removeConnection(bool);
|
||||
cart2Controller.removeConnection(!bool);
|
||||
return Command.SINGLE_SUCCESS;
|
||||
}
|
||||
|
||||
ctx.getSource().sendFeedback(new StringTextComponent("The specified Carts are not coupled"), true);
|
||||
|
||||
return 0;
|
||||
})
|
||||
)
|
||||
)
|
||||
)
|
||||
.then(Commands.literal("removeAll")
|
||||
.then(Commands.argument("cart", EntityArgument.entity())
|
||||
.executes(ctx -> {
|
||||
Entity cart = EntityArgument.getEntity(ctx, "cart");
|
||||
if (!(cart instanceof AbstractMinecartEntity))
|
||||
throw ONLY_MINECARTS_ALLOWED.create();
|
||||
|
||||
LazyOptional<MinecartController> capability = cart.getCapability(CapabilityMinecartController.MINECART_CONTROLLER_CAPABILITY);
|
||||
if (!capability.isPresent()) {
|
||||
ctx.getSource().sendFeedback(new StringTextComponent("Minecart has no Couplings Attached"), true);
|
||||
return 0;
|
||||
}
|
||||
|
||||
MinecartController controller = capability.orElse(null);
|
||||
|
||||
int couplings = (controller.isConnectedToCoupling() ? 1 : 0) + (controller.isLeadingCoupling() ? 1 : 0);
|
||||
if (couplings == 0) {
|
||||
ctx.getSource().sendFeedback(new StringTextComponent("Minecart has no Couplings Attached"), true);
|
||||
return 0;
|
||||
}
|
||||
|
||||
controller.decouple();
|
||||
|
||||
ctx.getSource().sendFeedback(new StringTextComponent("Removed " + couplings + " couplings from the Minecart"), true);
|
||||
|
||||
return couplings;
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
package com.simibubi.create.foundation.command;
|
||||
|
||||
import com.mojang.brigadier.Command;
|
||||
import com.mojang.brigadier.arguments.FloatArgumentType;
|
||||
import com.mojang.brigadier.builder.ArgumentBuilder;
|
||||
import com.mojang.brigadier.context.CommandContext;
|
||||
import net.minecraft.command.CommandSource;
|
||||
import net.minecraft.command.Commands;
|
||||
import net.minecraft.command.arguments.EntityArgument;
|
||||
import net.minecraft.entity.player.ServerPlayerEntity;
|
||||
import net.minecraft.network.play.server.SPlayerAbilitiesPacket;
|
||||
import net.minecraft.util.text.StringTextComponent;
|
||||
|
||||
public class FlySpeedCommand {
|
||||
|
||||
public static ArgumentBuilder<CommandSource, ?> register() {
|
||||
return Commands.literal("flySpeed")
|
||||
.requires(cs -> cs.hasPermissionLevel(2))
|
||||
.then(Commands.argument("speed", FloatArgumentType.floatArg(0))
|
||||
.then(Commands.argument("target", EntityArgument.player())
|
||||
.executes(ctx -> sendFlySpeedUpdate(
|
||||
ctx,
|
||||
EntityArgument.getPlayer(ctx, "target"),
|
||||
FloatArgumentType.getFloat(ctx, "speed")
|
||||
)
|
||||
)
|
||||
)
|
||||
.executes(ctx -> sendFlySpeedUpdate(
|
||||
ctx,
|
||||
ctx.getSource().asPlayer(),
|
||||
FloatArgumentType.getFloat(ctx, "speed")
|
||||
)
|
||||
)
|
||||
)
|
||||
.then(Commands.literal("reset")
|
||||
.then(Commands.argument("target", EntityArgument.player())
|
||||
.executes(ctx -> sendFlySpeedUpdate(
|
||||
ctx,
|
||||
EntityArgument.getPlayer(ctx, "target"),
|
||||
0.05f
|
||||
)
|
||||
)
|
||||
)
|
||||
.executes(ctx -> sendFlySpeedUpdate(
|
||||
ctx,
|
||||
ctx.getSource().asPlayer(),
|
||||
0.05f
|
||||
)
|
||||
)
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
private static int sendFlySpeedUpdate(CommandContext<CommandSource> ctx, ServerPlayerEntity player, float speed) {
|
||||
SPlayerAbilitiesPacket packet = new SPlayerAbilitiesPacket(player.abilities);
|
||||
packet.setFlySpeed(speed);
|
||||
player.connection.sendPacket(packet);
|
||||
|
||||
ctx.getSource().sendFeedback(new StringTextComponent("Temporarily set " + player.getName().getFormattedText() + "'s Flying Speed to: " + speed), true);
|
||||
|
||||
return Command.SINGLE_SUCCESS;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,38 +1,20 @@
|
|||
package com.simibubi.create.foundation.command;
|
||||
|
||||
import com.mojang.brigadier.Command;
|
||||
import com.mojang.brigadier.arguments.BoolArgumentType;
|
||||
import com.mojang.brigadier.builder.ArgumentBuilder;
|
||||
import com.simibubi.create.foundation.networking.AllPackets;
|
||||
|
||||
import net.minecraft.command.CommandSource;
|
||||
import net.minecraft.command.Commands;
|
||||
import net.minecraft.entity.player.ServerPlayerEntity;
|
||||
import net.minecraft.util.text.StringTextComponent;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.fml.DistExecutor;
|
||||
import net.minecraftforge.fml.network.PacketDistributor;
|
||||
|
||||
public class ToggleDebugCommand {
|
||||
public class ToggleDebugCommand extends ConfigureConfigCommand {
|
||||
|
||||
static ArgumentBuilder<CommandSource, ?> register() {
|
||||
return Commands.literal("toggleDebug")
|
||||
.requires(cs -> cs.hasPermissionLevel(0))
|
||||
.then(Commands.argument("value", BoolArgumentType.bool())
|
||||
.executes(ctx -> {
|
||||
boolean value = BoolArgumentType.getBool(ctx, "value");
|
||||
//DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> AllConfigs.CLIENT.rainbowDebug.set(value));
|
||||
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ConfigureConfigPacket.Actions.rainbowDebug.performAction(String.valueOf(value)));
|
||||
public ToggleDebugCommand() {
|
||||
super("rainbowDebug");
|
||||
}
|
||||
|
||||
DistExecutor.unsafeRunWhenOn(Dist.DEDICATED_SERVER, () -> () ->
|
||||
AllPackets.channel.send(
|
||||
PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) ctx.getSource().getEntity()),
|
||||
new ConfigureConfigPacket(ConfigureConfigPacket.Actions.rainbowDebug.name(), String.valueOf(value))));
|
||||
|
||||
ctx.getSource().sendFeedback(new StringTextComponent((value ? "enabled" : "disabled") + " rainbow debug"), true);
|
||||
|
||||
return Command.SINGLE_SUCCESS;
|
||||
})
|
||||
);
|
||||
@Override
|
||||
protected void sendPacket(ServerPlayerEntity player, String option) {
|
||||
AllPackets.channel.send(
|
||||
PacketDistributor.PLAYER.with(() -> player),
|
||||
new ConfigureConfigPacket(ConfigureConfigPacket.Actions.rainbowDebug.name(), option)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,36 +1,20 @@
|
|||
package com.simibubi.create.foundation.command;
|
||||
|
||||
import com.mojang.brigadier.arguments.BoolArgumentType;
|
||||
import com.mojang.brigadier.builder.ArgumentBuilder;
|
||||
import com.simibubi.create.foundation.networking.AllPackets;
|
||||
|
||||
import net.minecraft.command.CommandSource;
|
||||
import net.minecraft.command.Commands;
|
||||
import net.minecraft.entity.player.ServerPlayerEntity;
|
||||
import net.minecraft.util.text.StringTextComponent;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.fml.DistExecutor;
|
||||
import net.minecraftforge.fml.network.PacketDistributor;
|
||||
|
||||
public class ToggleExperimentalRenderingCommand {
|
||||
public class ToggleExperimentalRenderingCommand extends ConfigureConfigCommand {
|
||||
|
||||
static ArgumentBuilder<CommandSource, ?> register() {
|
||||
return Commands.literal("experimentalRendering")
|
||||
.requires(cs -> cs.hasPermissionLevel(0))
|
||||
.then(Commands.argument("value", BoolArgumentType.bool())
|
||||
.executes(ctx -> {
|
||||
boolean value = BoolArgumentType.getBool(ctx, "value");
|
||||
//DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> AllConfigs.CLIENT.rainbowDebug.set(value));
|
||||
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ConfigureConfigPacket.Actions.experimentalRendering.performAction(String.valueOf(value)));
|
||||
public ToggleExperimentalRenderingCommand() {
|
||||
super("experimentalRendering");
|
||||
}
|
||||
|
||||
DistExecutor.unsafeRunWhenOn(Dist.DEDICATED_SERVER, () -> () ->
|
||||
AllPackets.channel.send(
|
||||
PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) ctx.getSource().getEntity()),
|
||||
new ConfigureConfigPacket(ConfigureConfigPacket.Actions.experimentalRendering.name(), String.valueOf(value))));
|
||||
|
||||
ctx.getSource().sendFeedback(new StringTextComponent((value ? "enabled" : "disabled") + " experimental rendering"), true);
|
||||
|
||||
return 1;
|
||||
}));
|
||||
@Override
|
||||
protected void sendPacket(ServerPlayerEntity player, String option) {
|
||||
AllPackets.channel.send(
|
||||
PacketDistributor.PLAYER.with(() -> player),
|
||||
new ConfigureConfigPacket(ConfigureConfigPacket.Actions.experimentalRendering.name(), option)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,6 +14,7 @@ public class CKinetics extends ConfigBase {
|
|||
e(DeployerAggroSetting.CREEPERS, "ignoreDeployerAttacks", Comments.ignoreDeployerAttacks);
|
||||
public ConfigInt kineticValidationFrequency = i(60, 5, "kineticValidationFrequency", Comments.kineticValidationFrequency);
|
||||
public ConfigFloat crankHungerMultiplier = f(.01f, 0, 1, "crankHungerMultiplier", Comments.crankHungerMultiplier);
|
||||
public ConfigInt minimumWindmillSails = i(8, 0, "minimumWindmillSails", Comments.minimumWindmillSails);
|
||||
|
||||
public ConfigGroup fan = group(1, "encasedFan", "Encased Fan");
|
||||
public ConfigInt fanPushDistance = i(20, 5, "fanPushDistance", Comments.fanPushDistance);
|
||||
|
@ -79,6 +80,7 @@ public class CKinetics extends ConfigBase {
|
|||
static String furnaceEngineSpeed = "Base rotation speed for the furnace engine generator";
|
||||
static String disableStress = "Disable the Stress mechanic altogether.";
|
||||
static String kineticValidationFrequency = "Game ticks between Kinetic Blocks checking whether their source is still valid.";
|
||||
static String minimumWindmillSails = "Amount of sail-type blocks required for a windmill to assemble successfully.";
|
||||
}
|
||||
|
||||
public static enum DeployerAggroSetting {
|
||||
|
|
|
@ -6,7 +6,6 @@ import static com.simibubi.create.foundation.data.CreateRegistrate.connectedText
|
|||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
|
@ -22,8 +21,6 @@ import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftBlock
|
|||
import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock;
|
||||
import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock.Shape;
|
||||
import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelItem;
|
||||
import com.simibubi.create.content.logistics.block.funnel.FunnelBlock;
|
||||
import com.simibubi.create.content.logistics.block.funnel.FunnelItem;
|
||||
import com.simibubi.create.content.logistics.block.inventories.CrateBlock;
|
||||
import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry;
|
||||
import com.simibubi.create.foundation.config.StressConfigDefaults;
|
||||
|
@ -32,7 +29,6 @@ import com.tterrag.registrate.builders.BlockBuilder;
|
|||
import com.tterrag.registrate.util.nullness.NonNullUnaryOperator;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.item.DyeColor;
|
||||
import net.minecraft.item.Item;
|
||||
|
@ -99,41 +95,6 @@ public class BuilderTransformers {
|
|||
.simpleItem();
|
||||
}
|
||||
|
||||
public static <B extends FunnelBlock> NonNullUnaryOperator<BlockBuilder<B, CreateRegistrate>> funnel(String type,
|
||||
ResourceLocation particleTexture) {
|
||||
return b -> {
|
||||
return b.blockstate((c, p) -> {
|
||||
Function<BlockState, ModelFile> model = s -> {
|
||||
String powered = s.get(FunnelBlock.POWERED) ? "_powered" : "";
|
||||
String extracting = s.get(FunnelBlock.EXTRACTING) ? "_push" : "_pull";
|
||||
String face = s.get(FunnelBlock.FACE)
|
||||
.getName();
|
||||
return p.models()
|
||||
.withExistingParent("block/" + type + "_funnel_" + face + extracting + powered,
|
||||
p.modLoc("block/funnel/block_" + face))
|
||||
.texture("particle", particleTexture)
|
||||
.texture("7", p.modLoc("block/" + type + "_funnel_plating"))
|
||||
.texture("6", p.modLoc("block/" + type + "_funnel" + powered))
|
||||
.texture("5", p.modLoc("block/" + type + "_funnel_tall" + powered))
|
||||
.texture("2_2", p.modLoc("block/" + type + "_funnel" + extracting))
|
||||
.texture("3", p.modLoc("block/" + type + "_funnel_back"));
|
||||
};
|
||||
p.horizontalFaceBlock(c.get(), model);
|
||||
})
|
||||
.item(FunnelItem::new)
|
||||
.model((c, p) -> {
|
||||
p.withExistingParent("item/" + type + "_funnel", p.modLoc("block/funnel/item"))
|
||||
.texture("particle", particleTexture)
|
||||
.texture("7", p.modLoc("block/" + type + "_funnel_plating"))
|
||||
.texture("2", p.modLoc("block/" + type + "_funnel_neutral"))
|
||||
.texture("6", p.modLoc("block/" + type + "_funnel"))
|
||||
.texture("5", p.modLoc("block/" + type + "_funnel_tall"))
|
||||
.texture("3", p.modLoc("block/" + type + "_funnel_back"));
|
||||
})
|
||||
.build();
|
||||
};
|
||||
}
|
||||
|
||||
public static <B extends BeltTunnelBlock> NonNullUnaryOperator<BlockBuilder<B, CreateRegistrate>> beltTunnel(
|
||||
String type, ResourceLocation particleTexture) {
|
||||
return b -> b.initialProperties(SharedProperties::stone)
|
||||
|
|
|
@ -18,7 +18,7 @@ import net.minecraft.tileentity.TileEntity;
|
|||
import net.minecraft.util.math.BlockPos;
|
||||
|
||||
public class KineticRenderer extends InstancedTileRenderer<BasicProgram> {
|
||||
public static int MAX_ORIGIN_DISTANCE = 1000;
|
||||
public static int MAX_ORIGIN_DISTANCE = 100;
|
||||
|
||||
public BlockPos originCoordinate = BlockPos.ZERO;
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@ import java.util.Map;
|
|||
import java.util.function.Consumer;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
import com.simibubi.create.foundation.render.backend.gl.versioned.GlFunctions;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.lwjgl.opengl.GL;
|
||||
|
@ -44,16 +45,12 @@ public class Backend {
|
|||
private static boolean enabled;
|
||||
|
||||
public static GLCapabilities capabilities;
|
||||
private static MapBuffer mapBuffer;
|
||||
public static GlFunctions functions;
|
||||
|
||||
public Backend() {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
|
||||
public static void mapBuffer(int target, int offset, int length, Consumer<ByteBuffer> upload) {
|
||||
mapBuffer.mapBuffer(target, offset, length, upload);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a shader program. TODO: replace with forge registry?
|
||||
*/
|
||||
|
@ -71,47 +68,21 @@ public class Backend {
|
|||
return (P) programs.get(spec);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the most compatible version of a specific OpenGL feature by iterating over enum constants in order.
|
||||
*
|
||||
* @param clazz The class of the versioning enum.
|
||||
* @param <V> The type of the versioning enum.
|
||||
* @return The first defined enum variant to return true.
|
||||
*/
|
||||
public static <V extends Enum<V> & GlVersioned> V getLatest(Class<V> clazz) {
|
||||
return getLatest(clazz, capabilities);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the most compatible version of a specific OpenGL feature by iterating over enum constants in order.
|
||||
*
|
||||
* @param clazz The class of the versioning enum.
|
||||
* @param caps The current system's supported features.
|
||||
* @param <V> The type of the versioning enum.
|
||||
* @return The first defined enum variant to return true.
|
||||
*/
|
||||
public static <V extends Enum<V> & GlVersioned> V getLatest(Class<V> clazz, GLCapabilities caps) {
|
||||
V[] constants = clazz.getEnumConstants();
|
||||
V last = constants[constants.length - 1];
|
||||
if (!last.supported(caps)) {
|
||||
throw new IllegalStateException("");
|
||||
}
|
||||
|
||||
return Arrays.stream(constants).filter(it -> it.supported(caps)).findFirst().orElse(last);
|
||||
public static boolean available() {
|
||||
return canUseVBOs();
|
||||
}
|
||||
|
||||
public static boolean canUseInstancing() {
|
||||
return enabled && gl33();
|
||||
return enabled &&
|
||||
functions.vertexArrayObjectsSupported() &&
|
||||
functions.drawInstancedSupported() &&
|
||||
functions.instancedArraysSupported();
|
||||
}
|
||||
|
||||
public static boolean canUseVBOs() {
|
||||
return enabled && gl20();
|
||||
}
|
||||
|
||||
public static boolean available() {
|
||||
return enabled && gl20();
|
||||
}
|
||||
|
||||
public static boolean gl33() {
|
||||
return capabilities.OpenGL33;
|
||||
}
|
||||
|
@ -136,7 +107,7 @@ public class Backend {
|
|||
private static void onResourceManagerReload(IResourceManager manager, Predicate<IResourceType> predicate) {
|
||||
if (predicate.test(VanillaResourceType.SHADERS)) {
|
||||
capabilities = GL.createCapabilities();
|
||||
mapBuffer = getLatest(MapBuffer.class);
|
||||
functions = new GlFunctions(capabilities);
|
||||
|
||||
OptifineHandler.refresh();
|
||||
refresh();
|
||||
|
|
|
@ -73,12 +73,7 @@ public class FastRenderDispatcher {
|
|||
|
||||
layer.startDrawing();
|
||||
|
||||
RenderSystem.enableDepthTest();
|
||||
RenderSystem.enableCull();
|
||||
GL11.glCullFace(GL11.GL_BACK);
|
||||
CreateClient.kineticRenderer.render(layer, viewProjection, cameraX, cameraY, cameraZ);
|
||||
RenderSystem.disableCull();
|
||||
//RenderSystem.disableDepthTest();
|
||||
|
||||
layer.endDrawing();
|
||||
}
|
||||
|
|
|
@ -3,9 +3,9 @@ package com.simibubi.create.foundation.render.backend.gl;
|
|||
import java.nio.ByteBuffer;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.lwjgl.opengl.GL20;
|
||||
|
||||
import com.simibubi.create.foundation.render.backend.Backend;
|
||||
import com.simibubi.create.foundation.render.backend.gl.versioned.GlFunctions;
|
||||
import org.lwjgl.opengl.GL20;
|
||||
|
||||
public class GlBuffer extends GlObject {
|
||||
|
||||
|
@ -35,11 +35,11 @@ public class GlBuffer extends GlObject {
|
|||
}
|
||||
|
||||
public void map(int length, Consumer<ByteBuffer> upload) {
|
||||
Backend.mapBuffer(bufferType, 0, length, upload);
|
||||
Backend.functions.mapBuffer(bufferType, 0, length, upload);
|
||||
}
|
||||
|
||||
public void map(int offset, int length, Consumer<ByteBuffer> upload) {
|
||||
Backend.mapBuffer(bufferType, offset, length, upload);
|
||||
Backend.functions.mapBuffer(bufferType, offset, length, upload);
|
||||
}
|
||||
|
||||
protected void deleteInternal(int handle) {
|
||||
|
|
|
@ -2,19 +2,20 @@ package com.simibubi.create.foundation.render.backend.gl;
|
|||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import com.simibubi.create.foundation.render.backend.Backend;
|
||||
import org.lwjgl.opengl.GL30;
|
||||
|
||||
public class GlVertexArray extends GlObject {
|
||||
public GlVertexArray() {
|
||||
setHandle(GL30.glGenVertexArrays());
|
||||
setHandle(Backend.functions.genVertexArrays());
|
||||
}
|
||||
|
||||
public void bind() {
|
||||
GL30.glBindVertexArray(handle());
|
||||
Backend.functions.bindVertexArray(handle());
|
||||
}
|
||||
|
||||
public void unbind() {
|
||||
GL30.glBindVertexArray(0);
|
||||
Backend.functions.bindVertexArray(0);
|
||||
}
|
||||
|
||||
public void with(Consumer<GlVertexArray> action) {
|
||||
|
@ -24,6 +25,6 @@ public class GlVertexArray extends GlObject {
|
|||
}
|
||||
|
||||
protected void deleteInternal(int handle) {
|
||||
GL30.glDeleteVertexArrays(handle);
|
||||
Backend.functions.deleteVertexArrays(handle);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,54 @@
|
|||
package com.simibubi.create.foundation.render.backend.gl.versioned;
|
||||
|
||||
import org.lwjgl.opengl.*;
|
||||
|
||||
public enum DrawInstanced implements GlVersioned {
|
||||
GL31_DRAW_INSTANCED {
|
||||
@Override
|
||||
public boolean supported(GLCapabilities caps) {
|
||||
return caps.OpenGL31;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawArraysInstanced(int mode, int first, int count, int primcount) {
|
||||
GL31.glDrawArraysInstanced(mode, first, count, primcount);
|
||||
}
|
||||
},
|
||||
ARB_DRAW_INSTANCED {
|
||||
@Override
|
||||
public boolean supported(GLCapabilities caps) {
|
||||
return caps.GL_ARB_draw_instanced;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawArraysInstanced(int mode, int first, int count, int primcount) {
|
||||
ARBDrawInstanced.glDrawArraysInstancedARB(mode, first, count, primcount);
|
||||
}
|
||||
},
|
||||
EXT_DRAW_INSTANCED {
|
||||
@Override
|
||||
public boolean supported(GLCapabilities caps) {
|
||||
return caps.GL_EXT_draw_instanced;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawArraysInstanced(int mode, int first, int count, int primcount) {
|
||||
EXTDrawInstanced.glDrawArraysInstancedEXT(mode, first, count, primcount);
|
||||
}
|
||||
},
|
||||
UNSUPPORTED {
|
||||
@Override
|
||||
public boolean supported(GLCapabilities caps) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawArraysInstanced(int mode, int first, int count, int primcount) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}
|
||||
|
||||
;
|
||||
|
||||
public abstract void drawArraysInstanced(int mode, int first, int count, int primcount);
|
||||
}
|
|
@ -0,0 +1,85 @@
|
|||
package com.simibubi.create.foundation.render.backend.gl.versioned;
|
||||
|
||||
import org.lwjgl.opengl.GLCapabilities;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.Arrays;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
* An instance of this class stores information
|
||||
* about what OpenGL features are available.
|
||||
*
|
||||
* Each field stores an enum variant that provides access to the
|
||||
* most appropriate version of a feature for the current system.
|
||||
*/
|
||||
public class GlFunctions {
|
||||
public final MapBuffer mapBuffer;
|
||||
|
||||
public final VertexArrayObject vertexArrayObject;
|
||||
public final InstancedArrays instancedArrays;
|
||||
public final DrawInstanced drawInstanced;
|
||||
|
||||
public GlFunctions(GLCapabilities caps) {
|
||||
mapBuffer = getLatest(MapBuffer.class, caps);
|
||||
|
||||
vertexArrayObject = getLatest(VertexArrayObject.class, caps);
|
||||
instancedArrays = getLatest(InstancedArrays.class, caps);
|
||||
drawInstanced = getLatest(DrawInstanced.class, caps);
|
||||
}
|
||||
|
||||
public void mapBuffer(int target, int offset, int length, Consumer<ByteBuffer> upload) {
|
||||
mapBuffer.mapBuffer(target, offset, length, upload);
|
||||
}
|
||||
|
||||
public void vertexAttribDivisor(int index, int divisor) {
|
||||
instancedArrays.vertexAttribDivisor(index, divisor);
|
||||
}
|
||||
|
||||
public void drawArraysInstanced(int mode, int first, int count, int primcount) {
|
||||
drawInstanced.drawArraysInstanced(mode, first, count, primcount);
|
||||
}
|
||||
|
||||
public int genVertexArrays() {
|
||||
return vertexArrayObject.genVertexArrays();
|
||||
}
|
||||
|
||||
public void deleteVertexArrays(int array) {
|
||||
vertexArrayObject.deleteVertexArrays(array);
|
||||
}
|
||||
|
||||
public void bindVertexArray(int array) {
|
||||
vertexArrayObject.bindVertexArray(array);
|
||||
}
|
||||
|
||||
public boolean vertexArrayObjectsSupported() {
|
||||
return vertexArrayObject != VertexArrayObject.UNSUPPORTED;
|
||||
}
|
||||
|
||||
public boolean instancedArraysSupported() {
|
||||
return instancedArrays != InstancedArrays.UNSUPPORTED;
|
||||
}
|
||||
|
||||
public boolean drawInstancedSupported() {
|
||||
return drawInstanced != DrawInstanced.UNSUPPORTED;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the most compatible version of a specific OpenGL feature by iterating over enum constants in order.
|
||||
*
|
||||
* @param clazz The class of the versioning enum.
|
||||
* @param caps The current system's supported features.
|
||||
* @param <V> The type of the versioning enum.
|
||||
* @return The first defined enum variant to return true.
|
||||
*/
|
||||
public static <V extends Enum<V> & GlVersioned> V getLatest(Class<V> clazz, GLCapabilities caps) {
|
||||
V[] constants = clazz.getEnumConstants();
|
||||
V last = constants[constants.length - 1];
|
||||
if (!last.supported(caps)) {
|
||||
throw new IllegalStateException("");
|
||||
}
|
||||
|
||||
return Arrays.stream(constants).filter(it -> it.supported(caps)).findFirst().get();
|
||||
}
|
||||
}
|
||||
|
|
@ -2,7 +2,15 @@ package com.simibubi.create.foundation.render.backend.gl.versioned;
|
|||
|
||||
import org.lwjgl.opengl.GLCapabilities;
|
||||
|
||||
|
||||
/**
|
||||
* This interface should be implemented by enums such that the
|
||||
* last defined variant <em>always</em> returns <code>true</code>.
|
||||
*/
|
||||
public interface GlVersioned {
|
||||
/**
|
||||
* Queries whether this variant is supported by the current system.
|
||||
* @param caps The {@link GLCapabilities} reported by the current system.
|
||||
* @return <code>true</code> if this variant is supported, or if this is the last defined variant.
|
||||
*/
|
||||
boolean supported(GLCapabilities caps);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
package com.simibubi.create.foundation.render.backend.gl.versioned;
|
||||
|
||||
import org.lwjgl.opengl.*;
|
||||
|
||||
public enum InstancedArrays implements GlVersioned {
|
||||
GL33_INSTANCED_ARRAYS {
|
||||
@Override
|
||||
public boolean supported(GLCapabilities caps) {
|
||||
return caps.OpenGL33;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void vertexAttribDivisor(int index, int divisor) {
|
||||
GL33.glVertexAttribDivisor(index, divisor);
|
||||
}
|
||||
},
|
||||
ARB_INSTANCED_ARRAYS {
|
||||
@Override
|
||||
public boolean supported(GLCapabilities caps) {
|
||||
return caps.GL_ARB_instanced_arrays;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void vertexAttribDivisor(int index, int divisor) {
|
||||
ARBInstancedArrays.glVertexAttribDivisorARB(index, divisor);
|
||||
}
|
||||
},
|
||||
UNSUPPORTED {
|
||||
@Override
|
||||
public boolean supported(GLCapabilities caps) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void vertexAttribDivisor(int index, int divisor) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}
|
||||
|
||||
;
|
||||
|
||||
public abstract void vertexAttribDivisor(int index, int divisor);
|
||||
}
|
|
@ -0,0 +1,77 @@
|
|||
package com.simibubi.create.foundation.render.backend.gl.versioned;
|
||||
|
||||
import org.lwjgl.opengl.*;
|
||||
|
||||
public enum VertexArrayObject implements GlVersioned {
|
||||
GL30_VAO {
|
||||
@Override
|
||||
public boolean supported(GLCapabilities caps) {
|
||||
return caps.OpenGL30;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int genVertexArrays() {
|
||||
return GL30.glGenVertexArrays();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void bindVertexArray(int array) {
|
||||
GL30.glBindVertexArray(array);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteVertexArrays(int array) {
|
||||
GL30.glDeleteVertexArrays(array);
|
||||
}
|
||||
},
|
||||
ARB_VAO {
|
||||
@Override
|
||||
public boolean supported(GLCapabilities caps) {
|
||||
return caps.GL_ARB_vertex_array_object;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int genVertexArrays() {
|
||||
return ARBVertexArrayObject.glGenVertexArrays();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void bindVertexArray(int array) {
|
||||
ARBVertexArrayObject.glBindVertexArray(array);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteVertexArrays(int array) {
|
||||
ARBVertexArrayObject.glDeleteVertexArrays(array);
|
||||
}
|
||||
},
|
||||
UNSUPPORTED {
|
||||
@Override
|
||||
public boolean supported(GLCapabilities caps) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int genVertexArrays() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void bindVertexArray(int array) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteVertexArrays(int array) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}
|
||||
|
||||
;
|
||||
|
||||
public abstract int genVertexArrays();
|
||||
|
||||
public abstract void bindVertexArray(int array);
|
||||
|
||||
public abstract void deleteVertexArrays(int array);
|
||||
}
|
|
@ -5,11 +5,10 @@ import java.nio.ByteBuffer;
|
|||
import java.util.ArrayList;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import com.simibubi.create.foundation.render.backend.Backend;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
import org.lwjgl.opengl.GL15;
|
||||
import org.lwjgl.opengl.GL20;
|
||||
import org.lwjgl.opengl.GL31;
|
||||
import org.lwjgl.opengl.GL33;
|
||||
|
||||
import com.simibubi.create.foundation.render.RenderMath;
|
||||
import com.simibubi.create.foundation.render.backend.BufferedModel;
|
||||
|
@ -116,7 +115,7 @@ public abstract class InstancedModel<D extends InstanceData> extends BufferedMod
|
|||
protected void doRender() {
|
||||
vao.with(vao -> {
|
||||
renderSetup();
|
||||
GL31.glDrawArraysInstanced(GL11.GL_QUADS, 0, vertexCount, glInstanceCount);
|
||||
Backend.functions.drawArraysInstanced(GL11.GL_QUADS, 0, vertexCount, glInstanceCount);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -163,7 +162,7 @@ public abstract class InstancedModel<D extends InstanceData> extends BufferedMod
|
|||
instanceFormat.vertexAttribPointers(staticAttributes);
|
||||
|
||||
for (int i = 0; i < instanceFormat.getShaderAttributeCount(); i++) {
|
||||
GL33.glVertexAttribDivisor(i + staticAttributes, 1);
|
||||
Backend.functions.vertexAttribDivisor(i + staticAttributes, 1);
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
@ -174,11 +174,12 @@
|
|||
"create.gui.goggles.pole_length": "Pole Length:",
|
||||
|
||||
"create.gui.assembly.exception": "This Contraption was unable to assemble:",
|
||||
"create.gui.assembly.exception.unmovableBlock": "Unmovable Block (%4$s) at [%1$s %2$s %3$s]",
|
||||
"create.gui.assembly.exception.chunkNotLoaded": "The Block at [%1$s %2$s %3$s] was not in a loaded chunk",
|
||||
"create.gui.assembly.exception.unmovableBlock": "Unmovable Block (%4$s) at [%1$s,%2$s,%3$s]",
|
||||
"create.gui.assembly.exception.chunkNotLoaded": "The Block at [%1$s,%2$s,%3$s] was not in a loaded chunk",
|
||||
"create.gui.assembly.exception.structureTooLarge": "There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s",
|
||||
"create.gui.assembly.exception.tooManyPistonPoles": "There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s",
|
||||
"create.gui.assembly.exception.noPistonPoles": "The Piston is missing some extension Poles",
|
||||
"create.gui.assembly.exception.not_enough_sails": "Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required",
|
||||
|
||||
"create.gui.gauge.info_header": "Gauge Information:",
|
||||
"create.gui.speedometer.title": "Rotation Speed",
|
||||
|
|
|
@ -1,134 +0,0 @@
|
|||
{
|
||||
"credit": "Made with Blockbench",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"3": "create:block/brass_funnel_back",
|
||||
"5": "create:block/brass_funnel_tall",
|
||||
"6": "create:block/brass_funnel",
|
||||
"7": "create:block/brass_funnel_plating",
|
||||
"2_2": "create:block/brass_funnel_pull"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"name": "LeftWall",
|
||||
"from": [14, 6, 0],
|
||||
"to": [16.05, 12, 16],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 2]},
|
||||
"faces": {
|
||||
"north": {"uv": [14, 0, 16, 6], "rotation": 180, "texture": "#2_2"},
|
||||
"east": {"uv": [0, 0, 16, 6], "rotation": 180, "texture": "#2_2"},
|
||||
"south": {"uv": [0, 0, 2, 6], "rotation": 180, "texture": "#2_2"},
|
||||
"west": {"uv": [0, 12, 16, 6], "texture": "#2_2"},
|
||||
"up": {"uv": [15, 0, 16, 8], "texture": "#7"},
|
||||
"down": {"uv": [0, 0, 1, 8], "rotation": 180, "texture": "#7"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "LeftWall",
|
||||
"from": [-0.05, 6, 0],
|
||||
"to": [2, 12, 16],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 2]},
|
||||
"faces": {
|
||||
"north": {"uv": [2, 0, 0, 6], "texture": "#2_2"},
|
||||
"east": {"uv": [0, 6, 16, 12], "rotation": 180, "texture": "#2_2"},
|
||||
"south": {"uv": [14, 0, 16, 6], "rotation": 180, "texture": "#2_2"},
|
||||
"west": {"uv": [0, 6, 16, 0], "texture": "#2_2"},
|
||||
"up": {"uv": [8, 0, 9, 8], "texture": "#7"},
|
||||
"down": {"uv": [7, 0, 8, 8], "rotation": 180, "texture": "#7"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Top",
|
||||
"from": [2, 6, 0],
|
||||
"to": [14, 12, 6],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 2]},
|
||||
"faces": {
|
||||
"north": {"uv": [2, 0, 14, 6], "rotation": 180, "texture": "#2_2"},
|
||||
"south": {"uv": [9, 13, 15, 16], "rotation": 180, "texture": "#7"},
|
||||
"up": {"uv": [9, 0, 15, 3], "texture": "#7"},
|
||||
"down": {"uv": [1, 0, 7, 3], "rotation": 180, "texture": "#7"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Top",
|
||||
"from": [2, 6, 14],
|
||||
"to": [14, 12, 16],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 18]},
|
||||
"faces": {
|
||||
"north": {"uv": [15, 13, 9, 16], "rotation": 180, "texture": "#7"},
|
||||
"south": {"uv": [14, 0, 2, 6], "rotation": 180, "texture": "#2_2"},
|
||||
"up": {"uv": [9, 3, 15, 0], "texture": "#7"},
|
||||
"down": {"uv": [0.5, 12.5, 7.5, 11.5], "texture": "#7"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Top",
|
||||
"from": [2, 7, 6],
|
||||
"to": [14, 8, 15],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 2]},
|
||||
"faces": {
|
||||
"down": {"uv": [0, 9, 6, 13.5], "rotation": 180, "texture": "#3"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [1, 11, 1],
|
||||
"to": [15, 14, 15],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [9, 21, 10]},
|
||||
"faces": {
|
||||
"north": {"uv": [9, 6.5, 16, 8], "rotation": 180, "texture": "#3"},
|
||||
"east": {"uv": [9, 6.5, 16, 8], "rotation": 180, "texture": "#3"},
|
||||
"south": {"uv": [9, 6.5, 16, 8], "rotation": 180, "texture": "#3"},
|
||||
"west": {"uv": [9, 6.5, 16, 8], "rotation": 180, "texture": "#3"},
|
||||
"up": {"uv": [0, 0, 6, 6], "rotation": 90, "texture": "#3"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Back",
|
||||
"from": [2.1, 14, 2.05],
|
||||
"to": [13.9, 18.1, 14.1],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 6, 24.1]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"},
|
||||
"east": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"},
|
||||
"south": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"},
|
||||
"west": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"},
|
||||
"up": {"uv": [6, 8, 12, 14], "texture": "#3"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Back",
|
||||
"from": [2.1, 11.9, 2.05],
|
||||
"to": [13.9, 14, 13.1],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 22, 24.1]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 1.5, 6, 0.5], "rotation": 180, "texture": "#6"},
|
||||
"east": {"uv": [2.5, 0.5, 8, 1.5], "texture": "#5"},
|
||||
"west": {"uv": [2.5, 1.5, 8, 0.5], "rotation": 180, "texture": "#5"}
|
||||
}
|
||||
}
|
||||
],
|
||||
"groups": [
|
||||
{
|
||||
"name": "block_retracted",
|
||||
"origin": [8, 8, 8],
|
||||
"children": [
|
||||
{
|
||||
"name": "BeltFunnel",
|
||||
"origin": [9, -4, 8],
|
||||
"children": [
|
||||
{
|
||||
"name": "FrontSection",
|
||||
"origin": [9, -4, 8],
|
||||
"children": [0, 1, 2, 3, 4, 5]
|
||||
},
|
||||
{
|
||||
"name": "Base",
|
||||
"origin": [9, -4, 8],
|
||||
"children": [6, 7]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,147 +0,0 @@
|
|||
{
|
||||
"credit": "Made with Blockbench",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"3": "create:block/brass_funnel_back",
|
||||
"5": "create:block/brass_funnel_tall",
|
||||
"6": "create:block/brass_funnel",
|
||||
"7": "create:block/brass_funnel_plating",
|
||||
"2_2": "create:block/brass_funnel_pull"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"name": "LeftWall",
|
||||
"from": [14, 6, -2],
|
||||
"to": [16.05, 12, 14],
|
||||
"rotation": {"angle": -22.5, "axis": "x", "origin": [8, 12, 0]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 0, 2, 6], "texture": "#2_2"},
|
||||
"east": {"uv": [0, 0, 16, 6], "rotation": 180, "texture": "#2_2"},
|
||||
"south": {"uv": [14, 0, 16, 6], "texture": "#2_2"},
|
||||
"west": {"uv": [0, 12, 16, 6], "texture": "#2_2"},
|
||||
"up": {"uv": [15, 0, 16, 8], "texture": "#7"},
|
||||
"down": {"uv": [0, 0, 1, 8], "rotation": 180, "texture": "#7"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "LeftWall",
|
||||
"from": [-0.05, 6, -2],
|
||||
"to": [2, 12, 14],
|
||||
"rotation": {"angle": -22.5, "axis": "x", "origin": [8, 12, 0]},
|
||||
"faces": {
|
||||
"north": {"uv": [16, 0, 14, 6], "rotation": 180, "texture": "#2_2"},
|
||||
"east": {"uv": [0, 6, 16, 12], "rotation": 180, "texture": "#2_2"},
|
||||
"south": {"uv": [0, 0, 2, 6], "texture": "#2_2"},
|
||||
"west": {"uv": [0, 6, 16, 0], "texture": "#2_2"},
|
||||
"up": {"uv": [8, 0, 9, 8], "texture": "#7"},
|
||||
"down": {"uv": [7, 0, 8, 8], "rotation": 180, "texture": "#7"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Top",
|
||||
"from": [2, 6, -2],
|
||||
"to": [14, 12, 4],
|
||||
"rotation": {"angle": -22.5, "axis": "x", "origin": [8, 12, 0]},
|
||||
"faces": {
|
||||
"north": {"uv": [2, 0, 14, 6], "rotation": 180, "texture": "#2_2"},
|
||||
"south": {"uv": [9, 13, 15, 16], "rotation": 180, "texture": "#7"},
|
||||
"up": {"uv": [9, 0, 15, 3], "texture": "#7"},
|
||||
"down": {"uv": [1, 0, 7, 3], "rotation": 180, "texture": "#7"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Top",
|
||||
"from": [2, 7, 4],
|
||||
"to": [14, 8, 13],
|
||||
"rotation": {"angle": -22.5, "axis": "x", "origin": [8, 12, 0]},
|
||||
"faces": {
|
||||
"down": {"uv": [0, 9, 6, 13.5], "rotation": 180, "texture": "#3"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Top",
|
||||
"from": [0.05, 12, 14],
|
||||
"to": [15.95, 15.95, 16],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 17, 2]},
|
||||
"faces": {
|
||||
"north": {"uv": [8, 11, 16, 13], "rotation": 180, "texture": "#7"},
|
||||
"east": {"uv": [16, 11, 15, 13], "texture": "#7"},
|
||||
"south": {"uv": [8, 11, 16, 13], "rotation": 180, "texture": "#7"},
|
||||
"west": {"uv": [9, 11, 8, 13], "texture": "#7"},
|
||||
"up": {"uv": [0, 13.5, 8, 14.5], "texture": "#7"},
|
||||
"down": {"uv": [0, 11.5, 8, 12.5], "texture": "#7"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Top",
|
||||
"from": [0, 14, 13.1],
|
||||
"to": [16, 16, 14],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 17, 1.1]},
|
||||
"faces": {
|
||||
"east": {"uv": [6, 13, 5, 13.5], "rotation": 270, "texture": "#7"},
|
||||
"south": {"uv": [0, 13.5, 8, 14.5], "rotation": 180, "texture": "#7"},
|
||||
"west": {"uv": [7, 13, 6, 13.5], "rotation": 270, "texture": "#7"},
|
||||
"up": {"uv": [0, 13, 8, 13.5], "texture": "#7"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [1, 11, 0],
|
||||
"to": [15, 14, 7],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [9, 21, 9]},
|
||||
"faces": {
|
||||
"north": {"uv": [6.5, 0, 8, 6], "rotation": 270, "texture": "#3"},
|
||||
"east": {"uv": [1, 6.5, 4.5, 8], "rotation": 180, "texture": "#3"},
|
||||
"west": {"uv": [1, 6, 4.5, 7.5], "texture": "#3"},
|
||||
"up": {"uv": [8, 0, 11.5, 6], "rotation": 90, "texture": "#3"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Back",
|
||||
"from": [2.1, 14, 1.05],
|
||||
"to": [13.9, 18.1, 13.1],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 6, 23.1]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"},
|
||||
"east": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"},
|
||||
"south": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"},
|
||||
"west": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"},
|
||||
"up": {"uv": [6, 8, 12, 14], "texture": "#3"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Back",
|
||||
"from": [2.1, 11.9, 1.05],
|
||||
"to": [13.9, 14, 12.1],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 22, 23.1]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 1.5, 6, 0.5], "rotation": 180, "texture": "#6"},
|
||||
"east": {"uv": [2.5, 0.5, 8, 1.5], "texture": "#5"},
|
||||
"west": {"uv": [2.5, 1.5, 8, 0.5], "rotation": 180, "texture": "#5"}
|
||||
}
|
||||
}
|
||||
],
|
||||
"groups": [
|
||||
{
|
||||
"name": "block_retracted",
|
||||
"origin": [8, 8, 8],
|
||||
"children": [
|
||||
{
|
||||
"name": "BeltFunnel",
|
||||
"origin": [9, -4, 8],
|
||||
"children": [
|
||||
{
|
||||
"name": "FrontSection",
|
||||
"origin": [9, -4, 8],
|
||||
"children": [0, 1, 2, 3, 4, 5, 6]
|
||||
},
|
||||
{
|
||||
"name": "Base",
|
||||
"origin": [9, -4, 8],
|
||||
"children": [7, 8]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,134 +0,0 @@
|
|||
{
|
||||
"credit": "Made with Blockbench",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"3": "create:block/brass_funnel_back",
|
||||
"5": "create:block/brass_funnel_tall",
|
||||
"6": "create:block/brass_funnel",
|
||||
"7": "create:block/brass_funnel_plating",
|
||||
"2_2": "create:block/brass_funnel_pull"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"name": "LeftWall",
|
||||
"from": [-0.05, 4, 0],
|
||||
"to": [2, 10, 16],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 4, 2]},
|
||||
"faces": {
|
||||
"north": {"uv": [14, 0, 16, 6], "texture": "#2_2"},
|
||||
"east": {"uv": [0, 12, 16, 6], "rotation": 180, "texture": "#2_2"},
|
||||
"south": {"uv": [0, 0, 2, 6], "texture": "#2_2"},
|
||||
"west": {"uv": [0, 0, 16, 6], "texture": "#2_2"},
|
||||
"up": {"uv": [0, 0, 1, 8], "texture": "#7"},
|
||||
"down": {"uv": [15, 0, 16, 8], "rotation": 180, "texture": "#7"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "LeftWall",
|
||||
"from": [14, 4, 0],
|
||||
"to": [16.05, 10, 16],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 4, 2]},
|
||||
"faces": {
|
||||
"north": {"uv": [2, 0, 0, 6], "rotation": 180, "texture": "#2_2"},
|
||||
"east": {"uv": [0, 6, 16, 0], "rotation": 180, "texture": "#2_2"},
|
||||
"south": {"uv": [14, 0, 16, 6], "texture": "#2_2"},
|
||||
"west": {"uv": [0, 6, 16, 12], "texture": "#2_2"},
|
||||
"up": {"uv": [7, 0, 8, 8], "texture": "#7"},
|
||||
"down": {"uv": [8, 0, 9, 8], "rotation": 180, "texture": "#7"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Top",
|
||||
"from": [2, 4, 0],
|
||||
"to": [14, 10, 6],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 4, 2]},
|
||||
"faces": {
|
||||
"north": {"uv": [2, 0, 14, 6], "texture": "#2_2"},
|
||||
"south": {"uv": [9, 13, 15, 16], "texture": "#7"},
|
||||
"up": {"uv": [1, 0, 7, 3], "texture": "#7"},
|
||||
"down": {"uv": [9, 0, 15, 3], "rotation": 180, "texture": "#7"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Top",
|
||||
"from": [2, 4, 14],
|
||||
"to": [14, 10, 16],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 4, 18]},
|
||||
"faces": {
|
||||
"north": {"uv": [15, 13, 9, 16], "texture": "#7"},
|
||||
"south": {"uv": [14, 0, 2, 6], "texture": "#2_2"},
|
||||
"up": {"uv": [0.5, 12.5, 7.5, 11.5], "rotation": 180, "texture": "#7"},
|
||||
"down": {"uv": [9, 3, 15, 0], "rotation": 180, "texture": "#7"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Top",
|
||||
"from": [2, 8, 6],
|
||||
"to": [14, 9, 15],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 4, 2]},
|
||||
"faces": {
|
||||
"up": {"uv": [0, 9, 6, 13.5], "texture": "#3"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [1, 2, 1],
|
||||
"to": [15, 5, 15],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [7, -5, 10]},
|
||||
"faces": {
|
||||
"north": {"uv": [9, 6.5, 16, 8], "texture": "#3"},
|
||||
"east": {"uv": [9, 6.5, 16, 8], "texture": "#3"},
|
||||
"south": {"uv": [9, 6.5, 16, 8], "texture": "#3"},
|
||||
"west": {"uv": [9, 6.5, 16, 8], "texture": "#3"},
|
||||
"down": {"uv": [0, 0, 6, 6], "rotation": 270, "texture": "#3"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Back",
|
||||
"from": [2.1, -2.1, 2.05],
|
||||
"to": [13.9, 2, 14.1],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 24.1]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 0, 12, 4], "texture": "#6"},
|
||||
"east": {"uv": [0, 0, 12, 4], "texture": "#6"},
|
||||
"south": {"uv": [0, 0, 12, 4], "texture": "#6"},
|
||||
"west": {"uv": [0, 0, 12, 4], "texture": "#6"},
|
||||
"down": {"uv": [6, 8, 12, 14], "rotation": 180, "texture": "#3"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Back",
|
||||
"from": [2.1, 2, 2.05],
|
||||
"to": [13.9, 4.1, 13.1],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, -6, 24.1]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 1.5, 6, 0.5], "texture": "#6"},
|
||||
"east": {"uv": [2.5, 1.5, 8, 0.5], "texture": "#5"},
|
||||
"west": {"uv": [2.5, 0.5, 8, 1.5], "rotation": 180, "texture": "#5"}
|
||||
}
|
||||
}
|
||||
],
|
||||
"groups": [
|
||||
{
|
||||
"name": "block_retracted",
|
||||
"origin": [8, 8, 8],
|
||||
"children": [
|
||||
{
|
||||
"name": "BeltFunnel",
|
||||
"origin": [9, -4, 8],
|
||||
"children": [
|
||||
{
|
||||
"name": "FrontSection",
|
||||
"origin": [9, -4, 8],
|
||||
"children": [0, 1, 2, 3, 4, 5]
|
||||
},
|
||||
{
|
||||
"name": "Base",
|
||||
"origin": [9, -4, 8],
|
||||
"children": [6, 7]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,212 @@
|
|||
{
|
||||
"credit": "Made with Blockbench",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"3": "create:block/brass_funnel_back",
|
||||
"5": "create:block/brass_funnel_tall",
|
||||
"7": "create:block/brass_funnel_plating",
|
||||
"8": "create:block/brass_storage_block",
|
||||
"9": "create:block/brass_funnel_slope",
|
||||
"10": "create:block/funnel_closed",
|
||||
"2_2": "create:block/brass_funnel_pull"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"name": "LeftWall",
|
||||
"from": [0, 4, 0],
|
||||
"to": [2, 10, 16],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 2]},
|
||||
"faces": {
|
||||
"north": {"uv": [14, 0, 16, 6], "texture": "#2_2"},
|
||||
"south": {"uv": [0, 0, 2, 6], "texture": "#2_2"},
|
||||
"west": {"uv": [0, 0, 16, 6], "texture": "#2_2"},
|
||||
"up": {"uv": [0, 0, 2, 16], "texture": "#8"},
|
||||
"down": {"uv": [0, 0, 16, 2], "rotation": 270, "texture": "#8"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "LeftWall",
|
||||
"from": [14, 4, 0],
|
||||
"to": [16, 10, 16],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 2]},
|
||||
"faces": {
|
||||
"north": {"uv": [2, 0, 0, 6], "rotation": 180, "texture": "#2_2"},
|
||||
"east": {"uv": [0, 6, 16, 0], "rotation": 180, "texture": "#2_2"},
|
||||
"south": {"uv": [14, 0, 16, 6], "texture": "#2_2"},
|
||||
"up": {"uv": [14, 0, 16, 16], "texture": "#8"},
|
||||
"down": {"uv": [0, 14, 16, 16], "rotation": 270, "texture": "#8"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Top",
|
||||
"from": [2, 4, 0],
|
||||
"to": [14, 10, 2],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 2]},
|
||||
"faces": {
|
||||
"north": {"uv": [2, 0, 14, 6], "texture": "#2_2"},
|
||||
"up": {"uv": [2, 0, 14, 2], "texture": "#8"},
|
||||
"down": {"uv": [0, 2, 2, 14], "rotation": 270, "texture": "#8"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Top",
|
||||
"from": [2, 4, 14],
|
||||
"to": [14, 10, 16],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 18]},
|
||||
"faces": {
|
||||
"south": {"uv": [14, 0, 2, 6], "texture": "#2_2"},
|
||||
"up": {"uv": [2, 16, 14, 14], "rotation": 180, "texture": "#8"},
|
||||
"down": {"uv": [14, 14, 16, 2], "rotation": 270, "texture": "#8"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [1, 1, 1],
|
||||
"to": [15, 4, 15],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [7, -6, 10]},
|
||||
"faces": {
|
||||
"north": {"uv": [1, 0, 15, 3], "texture": "#5"},
|
||||
"east": {"uv": [1, 0, 15, 3], "texture": "#5"},
|
||||
"south": {"uv": [1, 0, 15, 3], "texture": "#5"},
|
||||
"west": {"uv": [1, 0, 15, 3], "texture": "#5"},
|
||||
"down": {"uv": [2, 2, 14, 14], "rotation": 270, "texture": "#8"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [1, 5, 2],
|
||||
"to": [2, 10, 14],
|
||||
"rotation": {"angle": 22.5, "axis": "z", "origin": [2, 10, 8]},
|
||||
"faces": {
|
||||
"east": {"uv": [2, 2, 14, 7], "texture": "#9"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [14, 5, 2],
|
||||
"to": [15, 10, 14],
|
||||
"rotation": {"angle": -22.5, "axis": "z", "origin": [14, 10, 8]},
|
||||
"faces": {
|
||||
"west": {"uv": [2, 2, 14, 7], "texture": "#9"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [2, 5, 14],
|
||||
"to": [14, 10, 15],
|
||||
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, 10, 14]},
|
||||
"faces": {
|
||||
"north": {"uv": [2, 2, 14, 7], "texture": "#9"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [2, 5, 1],
|
||||
"to": [14, 10, 2],
|
||||
"rotation": {"angle": -22.5, "axis": "x", "origin": [8, 10, 2]},
|
||||
"faces": {
|
||||
"south": {"uv": [2, 2, 14, 7], "texture": "#9"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [3, 5, 3],
|
||||
"to": [13, 6, 13],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [11, 13, 11]},
|
||||
"faces": {
|
||||
"up": {"uv": [3, 3, 13, 13], "texture": "#10"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Back",
|
||||
"from": [1.95, -1.95, 1.95],
|
||||
"to": [14.05, 2, 14.05],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 0.025, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [2, 12, 14, 16], "texture": "#9"},
|
||||
"east": {"uv": [2, 12, 14, 16], "texture": "#9"},
|
||||
"south": {"uv": [2, 12, 14, 16], "texture": "#9"},
|
||||
"west": {"uv": [2, 12, 14, 16], "texture": "#9"},
|
||||
"down": {"uv": [6, 8, 12, 14], "rotation": 180, "texture": "#3"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Back",
|
||||
"from": [2.1, 2, 2.05],
|
||||
"to": [13.9, 4.1, 13.1],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, -6, 24.1]},
|
||||
"faces": {
|
||||
"east": {"uv": [2.5, 1.5, 8, 0.5], "texture": "#5"},
|
||||
"west": {"uv": [2.5, 0.5, 8, 1.5], "rotation": 180, "texture": "#5"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [5.05, -0.95, 0.05],
|
||||
"to": [10.95, 4, 2],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [2.5, 0.5, 5.5, 3], "texture": "#7"},
|
||||
"east": {"uv": [4.5, 0.5, 5.5, 3], "texture": "#7"},
|
||||
"west": {"uv": [2.5, 0.5, 3.5, 3], "texture": "#7"},
|
||||
"down": {"uv": [2.5, 11.5, 5.5, 12.5], "texture": "#7"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [5.05, -0.95, 14],
|
||||
"to": [10.95, 4, 15.95],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]},
|
||||
"faces": {
|
||||
"east": {"uv": [2.5, 0.5, 3.5, 3], "texture": "#7"},
|
||||
"south": {"uv": [2.5, 0.5, 5.5, 3], "texture": "#7"},
|
||||
"west": {"uv": [4.5, 0.5, 5.5, 3], "texture": "#7"},
|
||||
"down": {"uv": [2.5, 11.5, 5.5, 12.5], "rotation": 180, "texture": "#7"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [14, -0.95, 5.05],
|
||||
"to": [15.95, 4, 10.95],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [2.5, 0.5, 3.5, 3], "texture": "#7"},
|
||||
"east": {"uv": [2.5, 0.5, 5.5, 3], "texture": "#7"},
|
||||
"south": {"uv": [4.5, 0.5, 5.5, 3], "texture": "#7"},
|
||||
"down": {"uv": [2.5, 11.5, 5.5, 12.5], "rotation": 270, "texture": "#7"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [0.05, -0.95, 5.05],
|
||||
"to": [2, 4, 10.95],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [4.5, 0.5, 5.5, 3], "texture": "#7"},
|
||||
"south": {"uv": [2.5, 0.5, 3.5, 3], "texture": "#7"},
|
||||
"west": {"uv": [2.5, 0.5, 5.5, 3], "texture": "#7"},
|
||||
"down": {"uv": [2.5, 11.5, 5.5, 12.5], "rotation": 90, "texture": "#7"}
|
||||
}
|
||||
}
|
||||
],
|
||||
"display": {},
|
||||
"groups": [
|
||||
{
|
||||
"name": "block_retracted",
|
||||
"origin": [8, 8, 8],
|
||||
"children": [
|
||||
{
|
||||
"name": "BeltFunnel",
|
||||
"origin": [9, -4, 8],
|
||||
"children": [
|
||||
{
|
||||
"name": "FrontSection",
|
||||
"origin": [9, -4, 8],
|
||||
"children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
||||
},
|
||||
{
|
||||
"name": "Base",
|
||||
"origin": [9, -4, 8],
|
||||
"children": [10, 11]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Item Filter",
|
||||
"origin": [8, 0, 8],
|
||||
"children": [12, 13, 14, 15]
|
||||
}
|
||||
]
|
||||
}
|
Loading…
Reference in a new issue