Controlled attachment

- Added the Sticker, a redstone-driven block attachment component
- Fixed lighting of TileEntities lowered by a pulley
This commit is contained in:
simibubi 2021-03-03 05:21:58 +01:00
parent 5949dd376b
commit c1c6e5e046
67 changed files with 902 additions and 114 deletions

View file

@ -337,7 +337,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl
d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json
92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json
61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json
6fa36883e76e9e403bb429c8f86b8c0d3bba0cff assets/create/blockstates/radial_chassis.json
4439fc83a8c7370ab44b211a3fd48abde20a4728 assets/create/blockstates/radial_chassis.json
45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json
da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json
722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json
@ -371,6 +371,7 @@ e815bfd854c2653f10828bb11950f7fb991d7efc assets/create/blockstates/speedometer.j
1cb7cdbefa0ff199263782809287854b9d85074c assets/create/blockstates/spout.json
d62b7908119fa4f51715a186d0882b388bb25cab assets/create/blockstates/spruce_window.json
8d7dfa60630a8b4bae4e8eca5c66e1cfa34dda1f assets/create/blockstates/spruce_window_pane.json
5d7385d28a23dcfc95a221d36d82337908582726 assets/create/blockstates/sticker.json
3d93eabbb327aecc526beae9c62283f1d43eb710 assets/create/blockstates/sticky_mechanical_piston.json
f385988cb6fa9c48b5d59a6942ec50ed2b60c8bf assets/create/blockstates/stockpile_switch.json
e815bfd854c2653f10828bb11950f7fb991d7efc assets/create/blockstates/stressometer.json
@ -400,20 +401,20 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j
6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json
7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json
b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json
00e2b77dcc86224cd5a33aefaac01f20c90bcb40 assets/create/lang/en_ud.json
55638abca6ffa48e1059f2578ea6d76b8327f496 assets/create/lang/en_us.json
374dd193cb26eb590a4a66bf5c8e13f9743ddbdb assets/create/lang/unfinished/de_de.json
84b205e2a8c9539ab6da68aa8f7c91f1dbec0702 assets/create/lang/unfinished/es_es.json
3397c2fed7517a4c9b3b41ee081abb120ddf9b3b assets/create/lang/unfinished/es_mx.json
e61eb3ca3d279c438275fb50333b135560574e62 assets/create/lang/unfinished/fr_fr.json
eaa202ec1821372b5f26d724e7c58d710fda7f5b assets/create/lang/unfinished/it_it.json
d1627e59cf6cf5ac2382397a7db416e75072ac31 assets/create/lang/unfinished/ja_jp.json
39f4258b8d9d56c5d7e5761065081d69ab07d4d8 assets/create/lang/unfinished/ko_kr.json
402c16cffdd530dfde3e016691720145cc66c7a1 assets/create/lang/unfinished/nl_nl.json
73f22223f6d30068ac2bc3f9be02e43f7fe4cae0 assets/create/lang/unfinished/pt_br.json
015a444814ec9982c35d08a3705df3861ce2545e assets/create/lang/unfinished/ru_ru.json
38ed221082ce3ce7b4f6c93ec28b7e89a95cab06 assets/create/lang/unfinished/zh_cn.json
e51b6bd8cd9696858a417d3d9472a263e9268dd8 assets/create/lang/unfinished/zh_tw.json
369f9c6fce0aa11d70efa2e73a4ba2ff12e57e37 assets/create/lang/en_ud.json
10f9c238cdc8b68246c5663bc9745942d1014927 assets/create/lang/en_us.json
c46eabdb4476c18f539c95c24259a3fe1ee9cbff assets/create/lang/unfinished/de_de.json
551cd06b553080815a129d6b113473efde3fb5ac assets/create/lang/unfinished/es_es.json
1bac8afa8f92030077db8d921fd9dda30c0e8a5a assets/create/lang/unfinished/es_mx.json
d62993dd6f73224cbc17f04ea96022c4ac385dc4 assets/create/lang/unfinished/fr_fr.json
749274555f9b3edc9d7799a7147d724fd7993c66 assets/create/lang/unfinished/it_it.json
7e9723798c1459780b2814145eb6a0dc681a2281 assets/create/lang/unfinished/ja_jp.json
2d1da43b76d2184df5b183641241478e1c101218 assets/create/lang/unfinished/ko_kr.json
9cea3a5a2fe4e2c6d966f3c91b24e9d6595a9cc6 assets/create/lang/unfinished/nl_nl.json
e7299620ca48f296d678c87470358816f23d7578 assets/create/lang/unfinished/pt_br.json
6fd3ef5962b10f83e5df7dd0fbdb50cadee1a06b assets/create/lang/unfinished/ru_ru.json
b0688d7e4c593c0ed4fc87ea0b4e52205dcdeec8 assets/create/lang/unfinished/zh_cn.json
ff1c97c854da7b7bfe6be829c9bf6a787f6dfacd 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
@ -1544,6 +1545,7 @@ d6fb0d38b1b5bcc199b52ac8889eaecd167f6725 assets/create/models/item/speedometer.j
b9abe1331d49871838231f3a8e5d2973634e9325 assets/create/models/item/spout.json
b305e81f1dc5272634745b6e822af40955a2ef28 assets/create/models/item/spruce_window.json
5f622bca8386b8dd077310647e39ac3abb80c6a1 assets/create/models/item/spruce_window_pane.json
bb546e5342c6d1a6b4040cf7ccdd2f10c6f79965 assets/create/models/item/sticker.json
891abc24593d53d282773eca5534065056d89b4c assets/create/models/item/sticky_mechanical_piston.json
bbb5773adc23128c70174bfc531af936e6e063e3 assets/create/models/item/stockpile_switch.json
bab8f78c319b2a79ed55c5d2a94b521ddaa44996 assets/create/models/item/stressometer.json
@ -1816,6 +1818,7 @@ cd8cefee21a1690f9158b8e8661a92d20ad0f535 data/create/advancements/recipes/create
e8a5d924ccf30b6eae4b9ec0a8040e31f0eb165b data/create/advancements/recipes/create.base/crafting/kinetics/speedometer.json
90ff137eb1533695d9d17296ed180c0a88ddd891 data/create/advancements/recipes/create.base/crafting/kinetics/speedometerfrom_conversion.json
44867af16ec6d960268747effcd578ab55e3a366 data/create/advancements/recipes/create.base/crafting/kinetics/spout.json
8c7fd72b8b4d414a61859dd08857e8538d84f88b data/create/advancements/recipes/create.base/crafting/kinetics/sticker.json
3859abc8839e92b01461d3e9ef853a4934c3256b data/create/advancements/recipes/create.base/crafting/kinetics/sticky_mechanical_piston.json
9a4dad31370d9e71308afe5c3f9349b67f749635 data/create/advancements/recipes/create.base/crafting/kinetics/stressometerfrom_conversion.json
f3fc3d4fee0712906f833aa17185f0bacb21922f data/create/advancements/recipes/create.base/crafting/kinetics/super_glue.json
@ -2665,6 +2668,7 @@ b127cb6920e6d7d9c8b2402cb186402a9a8dd3fc data/create/loot_tables/blocks/shaft.js
f6c497d625de67ea9377e840208b1be539d13b73 data/create/loot_tables/blocks/spout.json
a23a1e332c9ba84474e3c0588e8a0857afe346e0 data/create/loot_tables/blocks/spruce_window.json
3ee2350936ea82fef716bc58e4cd088a384616f0 data/create/loot_tables/blocks/spruce_window_pane.json
111a3bb893abb899652a923b10ca7dc5ea424e5f data/create/loot_tables/blocks/sticker.json
8d2970acd61b96844a4308d87e858b1612d5862e data/create/loot_tables/blocks/sticky_mechanical_piston.json
ec2889e712702644092197a4b41a682fb953817d data/create/loot_tables/blocks/stockpile_switch.json
3479775008a256bc35f98b31655975f7d5c836b2 data/create/loot_tables/blocks/stressometer.json
@ -2876,6 +2880,7 @@ a17db27e61baa45f8a6ecb46a6d2a5a464704f8b data/create/recipes/crafting/kinetics/s
b1a74f0b51fa37ca1ed814266b3d69b8b7e69fa3 data/create/recipes/crafting/kinetics/speedometer.json
8d632845deeb723e1a56083536ee5f9d60de2fcb data/create/recipes/crafting/kinetics/speedometerfrom_conversion.json
eea9d4066cd2fafef40b50b79323dcc603fa6388 data/create/recipes/crafting/kinetics/spout.json
e532a5c405e48b415e3fcd4f7c6183ea335cb915 data/create/recipes/crafting/kinetics/sticker.json
3be40664acfd150d0617bc138dc2dd9d54a21b3a data/create/recipes/crafting/kinetics/sticky_mechanical_piston.json
af5854ee2fa3be195ad9abcdeebe6ed7306b651c data/create/recipes/crafting/kinetics/stressometerfrom_conversion.json
21f885a674603367b67e1e993c175638cbda9ea3 data/create/recipes/crafting/kinetics/super_glue.json

View file

@ -89,8 +89,8 @@
},
{
"when": {
"sticky_west": "true",
"axis": "x"
"axis": "x",
"sticky_west": "true"
},
"apply": {
"model": "create:block/radial_chassis_side_x_sticky",
@ -99,8 +99,8 @@
},
{
"when": {
"sticky_west": "true",
"axis": "y"
"axis": "y",
"sticky_west": "true"
},
"apply": {
"model": "create:block/radial_chassis_side_y_sticky",
@ -109,8 +109,8 @@
},
{
"when": {
"sticky_west": "true",
"axis": "z"
"axis": "z",
"sticky_west": "true"
},
"apply": {
"model": "create:block/radial_chassis_side_z_sticky",
@ -119,8 +119,8 @@
},
{
"when": {
"sticky_west": "false",
"axis": "x"
"axis": "x",
"sticky_west": "false"
},
"apply": {
"model": "create:block/radial_chassis_side_x",
@ -129,8 +129,8 @@
},
{
"when": {
"sticky_west": "false",
"axis": "y"
"axis": "y",
"sticky_west": "false"
},
"apply": {
"model": "create:block/radial_chassis_side_y",
@ -139,8 +139,8 @@
},
{
"when": {
"sticky_west": "false",
"axis": "z"
"axis": "z",
"sticky_west": "false"
},
"apply": {
"model": "create:block/radial_chassis_side_z",
@ -149,8 +149,8 @@
},
{
"when": {
"sticky_north": "true",
"axis": "x"
"axis": "x",
"sticky_north": "true"
},
"apply": {
"model": "create:block/radial_chassis_side_x_sticky"
@ -158,8 +158,8 @@
},
{
"when": {
"sticky_north": "true",
"axis": "y"
"axis": "y",
"sticky_north": "true"
},
"apply": {
"model": "create:block/radial_chassis_side_y_sticky",
@ -168,8 +168,8 @@
},
{
"when": {
"sticky_north": "true",
"axis": "z"
"axis": "z",
"sticky_north": "true"
},
"apply": {
"model": "create:block/radial_chassis_side_x_sticky",
@ -178,8 +178,8 @@
},
{
"when": {
"sticky_north": "false",
"axis": "x"
"axis": "x",
"sticky_north": "false"
},
"apply": {
"model": "create:block/radial_chassis_side_x"
@ -187,8 +187,8 @@
},
{
"when": {
"sticky_north": "false",
"axis": "y"
"axis": "y",
"sticky_north": "false"
},
"apply": {
"model": "create:block/radial_chassis_side_y",
@ -197,8 +197,8 @@
},
{
"when": {
"sticky_north": "false",
"axis": "z"
"axis": "z",
"sticky_north": "false"
},
"apply": {
"model": "create:block/radial_chassis_side_x",
@ -207,8 +207,8 @@
},
{
"when": {
"sticky_east": "true",
"axis": "x"
"axis": "x",
"sticky_east": "true"
},
"apply": {
"model": "create:block/radial_chassis_side_x_sticky",
@ -217,8 +217,8 @@
},
{
"when": {
"sticky_east": "true",
"axis": "y"
"axis": "y",
"sticky_east": "true"
},
"apply": {
"model": "create:block/radial_chassis_side_y_sticky",
@ -227,8 +227,8 @@
},
{
"when": {
"sticky_east": "true",
"axis": "z"
"axis": "z",
"sticky_east": "true"
},
"apply": {
"model": "create:block/radial_chassis_side_z_sticky"
@ -236,8 +236,8 @@
},
{
"when": {
"sticky_east": "false",
"axis": "x"
"axis": "x",
"sticky_east": "false"
},
"apply": {
"model": "create:block/radial_chassis_side_x",
@ -246,8 +246,8 @@
},
{
"when": {
"sticky_east": "false",
"axis": "y"
"axis": "y",
"sticky_east": "false"
},
"apply": {
"model": "create:block/radial_chassis_side_y",
@ -256,8 +256,8 @@
},
{
"when": {
"sticky_east": "false",
"axis": "z"
"axis": "z",
"sticky_east": "false"
},
"apply": {
"model": "create:block/radial_chassis_side_z"

View file

@ -0,0 +1,108 @@
{
"variants": {
"extended=false,facing=down,powered=false": {
"model": "create:block/sticker/block",
"x": 180
},
"extended=true,facing=down,powered=false": {
"model": "create:block/sticker/block",
"x": 180
},
"extended=false,facing=up,powered=false": {
"model": "create:block/sticker/block"
},
"extended=true,facing=up,powered=false": {
"model": "create:block/sticker/block"
},
"extended=false,facing=north,powered=false": {
"model": "create:block/sticker/block",
"x": 90
},
"extended=true,facing=north,powered=false": {
"model": "create:block/sticker/block",
"x": 90
},
"extended=false,facing=south,powered=false": {
"model": "create:block/sticker/block",
"x": 90,
"y": 180
},
"extended=true,facing=south,powered=false": {
"model": "create:block/sticker/block",
"x": 90,
"y": 180
},
"extended=false,facing=west,powered=false": {
"model": "create:block/sticker/block",
"x": 90,
"y": 270
},
"extended=true,facing=west,powered=false": {
"model": "create:block/sticker/block",
"x": 90,
"y": 270
},
"extended=false,facing=east,powered=false": {
"model": "create:block/sticker/block",
"x": 90,
"y": 90
},
"extended=true,facing=east,powered=false": {
"model": "create:block/sticker/block",
"x": 90,
"y": 90
},
"extended=false,facing=down,powered=true": {
"model": "create:block/sticker/block_powered",
"x": 180
},
"extended=true,facing=down,powered=true": {
"model": "create:block/sticker/block_powered",
"x": 180
},
"extended=false,facing=up,powered=true": {
"model": "create:block/sticker/block_powered"
},
"extended=true,facing=up,powered=true": {
"model": "create:block/sticker/block_powered"
},
"extended=false,facing=north,powered=true": {
"model": "create:block/sticker/block_powered",
"x": 90
},
"extended=true,facing=north,powered=true": {
"model": "create:block/sticker/block_powered",
"x": 90
},
"extended=false,facing=south,powered=true": {
"model": "create:block/sticker/block_powered",
"x": 90,
"y": 180
},
"extended=true,facing=south,powered=true": {
"model": "create:block/sticker/block_powered",
"x": 90,
"y": 180
},
"extended=false,facing=west,powered=true": {
"model": "create:block/sticker/block_powered",
"x": 90,
"y": 270
},
"extended=true,facing=west,powered=true": {
"model": "create:block/sticker/block_powered",
"x": 90,
"y": 270
},
"extended=false,facing=east,powered=true": {
"model": "create:block/sticker/block_powered",
"x": 90,
"y": 90
},
"extended=true,facing=east,powered=true": {
"model": "create:block/sticker/block_powered",
"x": 90,
"y": 90
}
}
}

View file

@ -372,6 +372,7 @@
"block.create.spout": "\u0287nodS",
"block.create.spruce_window": "\u028Dopu\u0131M \u01DD\u0254n\u0279dS",
"block.create.spruce_window_pane": "\u01DDu\u0250\u0500 \u028Dopu\u0131M \u01DD\u0254n\u0279dS",
"block.create.sticker": "\u0279\u01DD\u029E\u0254\u0131\u0287S",
"block.create.sticky_mechanical_piston": "uo\u0287s\u0131\u0500 \u05DF\u0250\u0254\u0131u\u0250\u0265\u0254\u01DDW \u028E\u029E\u0254\u0131\u0287S",
"block.create.stockpile_switch": "\u0265\u0254\u0287\u0131\u028DS \u01DD\u05DF\u0131d\u029E\u0254o\u0287S",
"block.create.stressometer": "\u0279\u01DD\u0287\u01DD\u026Foss\u01DD\u0279\u0287S",

View file

@ -375,6 +375,7 @@
"block.create.spout": "Spout",
"block.create.spruce_window": "Spruce Window",
"block.create.spruce_window_pane": "Spruce Window Pane",
"block.create.sticker": "Sticker",
"block.create.sticky_mechanical_piston": "Sticky Mechanical Piston",
"block.create.stockpile_switch": "Stockpile Switch",
"block.create.stressometer": "Stressometer",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 973",
"_": "Missing Localizations: 974",
"_": "->------------------------] Game Elements [------------------------<-",
@ -376,6 +376,7 @@
"block.create.spout": "UNLOCALIZED: Spout",
"block.create.spruce_window": "UNLOCALIZED: Spruce Window",
"block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane",
"block.create.sticker": "UNLOCALIZED: Sticker",
"block.create.sticky_mechanical_piston": "Klebriger Mechanischer Kolben",
"block.create.stockpile_switch": "Vorratssensor",
"block.create.stressometer": "UNLOCALIZED: Stressometer",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 15",
"_": "Missing Localizations: 16",
"_": "->------------------------] Game Elements [------------------------<-",
@ -376,6 +376,7 @@
"block.create.spout": "Surtidor",
"block.create.spruce_window": "Ventana de abeto",
"block.create.spruce_window_pane": "Panel de ventana de abeto",
"block.create.sticker": "UNLOCALIZED: Sticker",
"block.create.sticky_mechanical_piston": "Pistón mecánico pegajoso",
"block.create.stockpile_switch": "Interruptor de acopio",
"block.create.stressometer": "Estresómetro",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 903",
"_": "Missing Localizations: 904",
"_": "->------------------------] Game Elements [------------------------<-",
@ -376,6 +376,7 @@
"block.create.spout": "Canaleta",
"block.create.spruce_window": "Ventana de Abeto",
"block.create.spruce_window_pane": "Panel de Ventana de Abeto",
"block.create.sticker": "UNLOCALIZED: Sticker",
"block.create.sticky_mechanical_piston": "Pistón Mecánico Pegajoso",
"block.create.stockpile_switch": "Interruptor de Pila",
"block.create.stressometer": "Estresómetro",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 685",
"_": "Missing Localizations: 686",
"_": "->------------------------] Game Elements [------------------------<-",
@ -376,6 +376,7 @@
"block.create.spout": "UNLOCALIZED: Spout",
"block.create.spruce_window": "UNLOCALIZED: Spruce Window",
"block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane",
"block.create.sticker": "UNLOCALIZED: Sticker",
"block.create.sticky_mechanical_piston": "Piston mécanique collant",
"block.create.stockpile_switch": "Détecteur de stockage",
"block.create.stressometer": "Stressomètre",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 20",
"_": "Missing Localizations: 21",
"_": "->------------------------] Game Elements [------------------------<-",
@ -376,6 +376,7 @@
"block.create.spout": "Spruzzo",
"block.create.spruce_window": "Finestra di abete",
"block.create.spruce_window_pane": "Pannello di finestra di abete",
"block.create.sticker": "UNLOCALIZED: Sticker",
"block.create.sticky_mechanical_piston": "Pistone meccanico appiccicoso",
"block.create.stockpile_switch": "Interruttore accumulatore",
"block.create.stressometer": "Stressometro",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 27",
"_": "Missing Localizations: 28",
"_": "->------------------------] Game Elements [------------------------<-",
@ -376,6 +376,7 @@
"block.create.spout": "アイテム注液口",
"block.create.spruce_window": "マツの窓",
"block.create.spruce_window_pane": "マツの窓パネル",
"block.create.sticker": "UNLOCALIZED: Sticker",
"block.create.sticky_mechanical_piston": "粘着メカニカルピストン",
"block.create.stockpile_switch": "在庫スイッチ",
"block.create.stressometer": "応力メーター",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 74",
"_": "Missing Localizations: 75",
"_": "->------------------------] Game Elements [------------------------<-",
@ -376,6 +376,7 @@
"block.create.spout": "수도꼭지",
"block.create.spruce_window": "가문비나무 유리창",
"block.create.spruce_window_pane": "가문비나무 유리판",
"block.create.sticker": "UNLOCALIZED: Sticker",
"block.create.sticky_mechanical_piston": "끈끈이 기계식 피스톤",
"block.create.stockpile_switch": "수량 스위치",
"block.create.stressometer": "피로도 계측기",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1172",
"_": "Missing Localizations: 1173",
"_": "->------------------------] Game Elements [------------------------<-",
@ -376,6 +376,7 @@
"block.create.spout": "UNLOCALIZED: Spout",
"block.create.spruce_window": "UNLOCALIZED: Spruce Window",
"block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane",
"block.create.sticker": "UNLOCALIZED: Sticker",
"block.create.sticky_mechanical_piston": "Mechanische Zuiger",
"block.create.stockpile_switch": "Voorraad Schakelaar",
"block.create.stressometer": "Stressmeter",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1238",
"_": "Missing Localizations: 1239",
"_": "->------------------------] Game Elements [------------------------<-",
@ -376,6 +376,7 @@
"block.create.spout": "UNLOCALIZED: Spout",
"block.create.spruce_window": "UNLOCALIZED: Spruce Window",
"block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane",
"block.create.sticker": "UNLOCALIZED: Sticker",
"block.create.sticky_mechanical_piston": "Pistão Mecânico Grudento",
"block.create.stockpile_switch": "Disjuntor de Armazenamento",
"block.create.stressometer": "UNLOCALIZED: Stressometer",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 24",
"_": "Missing Localizations: 25",
"_": "->------------------------] Game Elements [------------------------<-",
@ -376,6 +376,7 @@
"block.create.spout": "Дозатор",
"block.create.spruce_window": "Еловое окно",
"block.create.spruce_window_pane": "Панель из елового окна",
"block.create.sticker": "UNLOCALIZED: Sticker",
"block.create.sticky_mechanical_piston": "Липкий механический поршень",
"block.create.stockpile_switch": "Настраиваемый компаратор",
"block.create.stressometer": "Динамометр",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 22",
"_": "Missing Localizations: 23",
"_": "->------------------------] Game Elements [------------------------<-",
@ -376,6 +376,7 @@
"block.create.spout": "注液器",
"block.create.spruce_window": "云杉窗户",
"block.create.spruce_window_pane": "云杉窗户板",
"block.create.sticker": "UNLOCALIZED: Sticker",
"block.create.sticky_mechanical_piston": "黏性动力活塞",
"block.create.stockpile_switch": "存量转换器",
"block.create.stressometer": "应力表",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 27",
"_": "Missing Localizations: 28",
"_": "->------------------------] Game Elements [------------------------<-",
@ -376,6 +376,7 @@
"block.create.spout": "液體灌注器",
"block.create.spruce_window": "雲杉木窗戶",
"block.create.spruce_window_pane": "雲杉木窗戶片",
"block.create.sticker": "UNLOCALIZED: Sticker",
"block.create.sticky_mechanical_piston": "黏性機械活塞",
"block.create.stockpile_switch": "存量檢測器",
"block.create.stressometer": "動能錶",

View file

@ -0,0 +1,3 @@
{
"parent": "create:block/sticker/item"
}

View file

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"create:crafting/kinetics/sticker"
]
},
"criteria": {
"has_item": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"item": "create:andesite_alloy"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "create:crafting/kinetics/sticker"
}
}
},
"requirements": [
[
"has_item",
"has_the_recipe"
]
]
}

View file

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

View file

@ -0,0 +1,24 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"ISI",
"CRC"
],
"key": {
"I": {
"item": "create:andesite_alloy"
},
"C": {
"tag": "forge:cobblestone"
},
"R": {
"tag": "forge:dusts/redstone"
},
"S": {
"tag": "forge:slimeballs"
}
},
"result": {
"item": "create:sticker"
}
}

View file

@ -93,6 +93,8 @@ public class AllBlockPartials {
SYMMETRY_PLANE = get("symmetry_effect/plane"), SYMMETRY_CROSSPLANE = get("symmetry_effect/crossplane"),
SYMMETRY_TRIPLEPLANE = get("symmetry_effect/tripleplane"),
STICKER_HEAD = get("sticker/head"),
PORTABLE_STORAGE_INTERFACE_MIDDLE = get("portable_storage_interface/block_middle"),
PORTABLE_STORAGE_INTERFACE_MIDDLE_POWERED = get("portable_storage_interface/block_middle_powered"),

View file

@ -54,6 +54,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.bea
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.LinearChassisBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.LinearChassisBlock.ChassisCTBehaviour;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.RadialChassisBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock.MinecartAnchorBlock;
@ -846,6 +847,15 @@ public class AllBlocks {
.build()
.register();
public static final BlockEntry<StickerBlock> STICKER = REGISTRATE.block("sticker", StickerBlock::new)
.initialProperties(SharedProperties::stone)
.properties(Block.Properties::nonOpaque)
.addLayer(() -> RenderType::getCutoutMipped)
.blockstate((c, p) -> p.directionalBlock(c.get(), AssetLookup.forPowered(c, p)))
.item()
.transform(customItemModel())
.register();
public static final BlockEntry<DrillBlock> MECHANICAL_DRILL = REGISTRATE.block("mechanical_drill", DrillBlock::new)
.initialProperties(SharedProperties::stone)
.blockstate(BlockStateGen.directionalBlockProvider(true))

View file

@ -51,6 +51,8 @@ import com.simibubi.create.content.contraptions.components.structureMovement.bea
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.MechanicalBearingTileEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.WindmillBearingTileEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.ChassisTileEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerRenderer;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerTileEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionRenderer;
import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionTileEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerTileEntity;
@ -398,6 +400,12 @@ public class AllTileEntities {
.validBlocks(AllBlocks.RADIAL_CHASSIS, AllBlocks.LINEAR_CHASSIS, AllBlocks.SECONDARY_LINEAR_CHASSIS)
// .renderer(() -> renderer)
.register();
public static final TileEntityEntry<StickerTileEntity> STICKER = Create.registrate()
.tileEntity("sticker", StickerTileEntity::new)
.validBlocks(AllBlocks.STICKER)
.renderer(() -> StickerRenderer::new)
.register();
public static final TileEntityEntry<DrillTileEntity> DRILL = Create.registrate()
.tileEntity("drill", DrillTileEntity::new)

View file

@ -12,7 +12,7 @@ import net.minecraft.util.Direction.Axis;
public abstract class AnimatedKinetics implements IDrawable {
public static float getCurrentAngle() {
return ((AnimationTickHolder.getRenderTick()) * 4f) % 360;
return ((AnimationTickHolder.getRenderTime()) * 4f) % 360;
}
protected BlockState shaft(Axis axis) {

View file

@ -29,7 +29,7 @@ public class AnimatedMixer extends AnimatedKinetics {
.scale(scale)
.render();
float animation = ((MathHelper.sin(AnimationTickHolder.getRenderTick() / 32f) + 1) / 5) + .5f;
float animation = ((MathHelper.sin(AnimationTickHolder.getRenderTime() / 32f) + 1) / 5) + .5f;
GuiGameElement.of(AllBlockPartials.MECHANICAL_MIXER_POLE)
.atLocal(0, animation, 0)

View file

@ -48,7 +48,7 @@ public class AnimatedPress extends AnimatedKinetics {
}
private float getAnimatedHeadOffset() {
float cycle = (AnimationTickHolder.getRenderTick()) % 30;
float cycle = (AnimationTickHolder.getRenderTime()) % 30;
if (cycle < 10) {
float progress = cycle / 10;
return -(progress * progress * progress);

View file

@ -37,7 +37,7 @@ public class AnimatedSpout extends AnimatedKinetics {
.scale(scale)
.render();
float cycle = AnimationTickHolder.getRenderTick() % 30;
float cycle = AnimationTickHolder.getRenderTime() % 30;
float squeeze = cycle < 20 ? MathHelper.sin((float) (cycle / 20f * Math.PI)) : 0;
squeeze *= 20;

View file

@ -58,7 +58,7 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer<KineticTil
}
public static float getAngleForTe(KineticTileEntity te, final BlockPos pos, Axis axis) {
float time = AnimationTickHolder.getRenderTick();
float time = AnimationTickHolder.getRenderTime();
float offset = getRotationOffsetForPosition(te, pos, axis);
float angle = ((time * te.getSpeed() * 3f / 10 + offset) % 360) / 180 * (float) Math.PI;
return angle;

View file

@ -44,7 +44,7 @@ public class DrillRenderer extends KineticTileEntityRenderer {
float speed = (float) (context.contraption.stalled
|| !VecHelper.isVecPointingTowards(context.relativeMotion, state.get(FACING)
.getOpposite()) ? context.getAnimationSpeed() : 0);
float time = AnimationTickHolder.getRenderTick() / 20;
float time = AnimationTickHolder.getRenderTime() / 20;
float angle = (float) (((time * speed) % 360));
for (MatrixStack m : matrixStacks)

View file

@ -70,7 +70,7 @@ public class HarvesterRenderer extends SafeTileEntityRenderer<HarvesterTileEntit
if (context.contraption.stalled)
speed = 0;
float time = AnimationTickHolder.getRenderTick() / 20;
float time = AnimationTickHolder.getRenderTime() / 20;
float angle = (time * speed) % 360;
float originOffset = 1 / 16f;
Vec3d rotOffset = new Vec3d(0, -2 * originOffset, originOffset).add(VecHelper.getCenterOf(BlockPos.ZERO));

View file

@ -89,7 +89,7 @@ public class DeployerRenderer extends SafeTileEntityRenderer<DeployerTileEntity>
ms.translate(0, isBlockItem ? 9 / 16f : 11 / 16f, 0);
ms.scale(scale, scale, scale);
transform = TransformType.GROUND;
ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(AnimationTickHolder.getRenderTick()));
ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(AnimationTickHolder.getRenderTime()));
} else {
float scale = punching ? .75f : isBlockItem ? .75f - 1 / 64f : .5f;
@ -176,7 +176,7 @@ public class DeployerRenderer extends SafeTileEntityRenderer<DeployerTileEntity>
double factor;
if (context.contraption.stalled || context.position == null || context.data.contains("StationaryTimer")) {
factor = MathHelper.sin(AnimationTickHolder.getRenderTick() * .5f) * .25f + .25f;
factor = MathHelper.sin(AnimationTickHolder.getRenderTime() * .5f) * .25f + .25f;
} else {
Vec3d center = VecHelper.getCenterOf(new BlockPos(context.position));
double distance = context.position.distanceTo(center);

View file

@ -41,7 +41,7 @@ public class EncasedFanRenderer extends KineticTileEntityRenderer {
SuperByteBuffer fanInner =
AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouth(te.getBlockState(), direction.getOpposite());
float time = AnimationTickHolder.getRenderTick();
float time = AnimationTickHolder.getRenderTime();
float speed = te.getSpeed() * 5;
if (speed > 0)
speed = MathHelper.clamp(speed, 80, 64 * 20);

View file

@ -45,7 +45,7 @@ public class MechanicalMixerRenderer extends KineticTileEntityRenderer {
int packedLightmapCoords = WorldRenderer.getLightmapCoordinates(te.getWorld(), blockState, pos);
float renderedHeadOffset = mixer.getRenderedHeadOffset(partialTicks);
float speed = mixer.getRenderedHeadRotationSpeed(partialTicks);
float time = AnimationTickHolder.getRenderTick();
float time = AnimationTickHolder.getRenderTime();
float angle = (float) (((time * speed * 6 / 10f) % 360) / 180 * (float) Math.PI);
SuperByteBuffer poleRender = AllBlockPartials.MECHANICAL_MIXER_POLE.renderOn(blockState);

View file

@ -14,6 +14,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.bea
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.MechanicalBearingTileEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.SailBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.AbstractChassisBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.PistonState;
@ -198,6 +199,10 @@ public class BlockMovementTraits {
.getAxis();
if (state.getBlock() instanceof FluidTankBlock)
return FluidTankConnectivityHandler.isConnected(world, pos, pos.offset(direction));
if (AllBlocks.STICKER.has(state) && state.get(StickerBlock.EXTENDED)) {
return direction == state.get(StickerBlock.FACING)
&& !notSupportive(world.getBlockState(pos.offset(direction)), direction.getOpposite());
}
return false;
}
@ -231,6 +236,8 @@ public class BlockMovementTraits {
if (AllBlocks.MECHANICAL_PISTON_HEAD.has(state))
return facing.getAxis() != state.get(BlockStateProperties.FACING)
.getAxis();
if (AllBlocks.STICKER.has(state) && !state.get(StickerBlock.EXTENDED))
return facing == state.get(StickerBlock.FACING);
return isBrittle(state);
}

View file

@ -8,7 +8,6 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@ -21,7 +20,6 @@ import java.util.stream.Collectors;
import javax.annotation.Nullable;
import com.simibubi.create.foundation.utility.*;
import org.apache.commons.lang3.tuple.MutablePair;
import org.apache.commons.lang3.tuple.Pair;
@ -35,6 +33,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.bea
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.StabilizedContraption;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.AbstractChassisBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.ChassisTileEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueHandler;
@ -54,6 +53,12 @@ import com.simibubi.create.content.logistics.block.redstone.RedstoneContactBlock
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.fluid.CombinedTankWrapper;
import com.simibubi.create.foundation.render.backend.light.EmptyLighter;
import com.simibubi.create.foundation.utility.BlockFace;
import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.NBTHelper;
import com.simibubi.create.foundation.utility.NBTProcessors;
import com.simibubi.create.foundation.utility.UniqueLinkedList;
import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld;
import net.minecraft.block.AbstractButtonBlock;
@ -172,7 +177,8 @@ public abstract class Contraption {
return contraption;
}
public boolean searchMovedStructure(World world, BlockPos pos, @Nullable Direction forcedDirection) throws AssemblyException {
public boolean searchMovedStructure(World world, BlockPos pos, @Nullable Direction forcedDirection)
throws AssemblyException {
initialPassengers.clear();
Queue<BlockPos> frontier = new UniqueLinkedList<>();
Set<BlockPos> visited = new HashSet<>();
@ -293,6 +299,14 @@ public abstract class Contraption {
if (AllBlocks.GANTRY_SHAFT.has(state))
moveGantryShaft(world, pos, frontier, visited, state);
if (AllBlocks.STICKER.has(state) && state.get(StickerBlock.EXTENDED)) {
Direction offset = state.get(StickerBlock.FACING);
BlockPos attached = pos.offset(offset);
if (!visited.contains(attached)
&& !BlockMovementTraits.notSupportive(world.getBlockState(attached), offset.getOpposite()))
frontier.add(attached);
}
// Bearings potentially create stabilized sub-contraptions
if (AllBlocks.MECHANICAL_BEARING.has(state))
moveBearing(pos, frontier, visited, state);
@ -348,7 +362,8 @@ public abstract class Contraption {
boolean brittle = BlockMovementTraits.isBrittle(blockState);
boolean canStick = !brittle && state.canStickTo(blockState) && blockState.canStickTo(state);
if (canStick) {
if (state.getPushReaction() == PushReaction.PUSH_ONLY || blockState.getPushReaction() == PushReaction.PUSH_ONLY) {
if (state.getPushReaction() == PushReaction.PUSH_ONLY
|| blockState.getPushReaction() == PushReaction.PUSH_ONLY) {
canStick = false;
}
if (BlockMovementTraits.notSupportive(state, offset)) {
@ -359,7 +374,8 @@ public abstract class Contraption {
}
}
if (!wasVisited && (canStick || blockAttachedTowardsFace || faceHasGlue || (offset == forcedDirection && !BlockMovementTraits.notSupportive(state, forcedDirection))))
if (!wasVisited && (canStick || blockAttachedTowardsFace || faceHasGlue
|| (offset == forcedDirection && !BlockMovementTraits.notSupportive(state, forcedDirection))))
frontier.add(offsetPos);
if (faceHasGlue)
addGlue(superglue.get(offset));
@ -499,7 +515,8 @@ public abstract class Contraption {
}
}
private boolean moveMechanicalPiston(World world, BlockPos pos, Queue<BlockPos> frontier, Set<BlockPos> visited, BlockState state) throws AssemblyException {
private boolean moveMechanicalPiston(World world, BlockPos pos, Queue<BlockPos> frontier, Set<BlockPos> visited,
BlockState state) throws AssemblyException {
Direction direction = state.get(MechanicalPistonBlock.FACING);
PistonState pistonState = state.get(MechanicalPistonBlock.STATE);
if (pistonState == PistonState.MOVING)
@ -621,8 +638,9 @@ public abstract class Contraption {
specialRenderedTileEntities.clear();
INBT blocks = nbt.get("Blocks");
//used to differentiate between the 'old' and the paletted serialization
boolean usePalettedDeserialization = blocks != null && blocks.getId() == 10 && ((CompoundNBT) blocks).contains("Palette");
// used to differentiate between the 'old' and the paletted serialization
boolean usePalettedDeserialization =
blocks != null && blocks.getId() == 10 && ((CompoundNBT) blocks).contains("Palette");
readBlocksCompound(blocks, world, usePalettedDeserialization);
actors.clear();
@ -713,7 +731,8 @@ public abstract class Contraption {
for (Pair<BlockPos, Direction> glueEntry : superglue) {
CompoundNBT c = new CompoundNBT();
c.put("Pos", NBTUtil.writeBlockPos(glueEntry.getKey()));
c.putByte("Direction", (byte) glueEntry.getValue().getIndex());
c.putByte("Direction", (byte) glueEntry.getValue()
.getIndex());
superglueNBT.add(c);
}
@ -773,7 +792,9 @@ public abstract class Contraption {
private CompoundNBT writeBlocksCompound() {
CompoundNBT compound = new CompoundNBT();
PaletteHashMap<BlockState> palette = new PaletteHashMap<>(GameData.getBlockStateIDMap(), 16, (i, s) -> {throw new IllegalStateException("Palette Map index exceeded maximum");}, NBTUtil::readBlockState, NBTUtil::writeBlockState);
PaletteHashMap<BlockState> palette = new PaletteHashMap<>(GameData.getBlockStateIDMap(), 16, (i, s) -> {
throw new IllegalStateException("Palette Map index exceeded maximum");
}, NBTUtil::readBlockState, NBTUtil::writeBlockState);
ListNBT blockList = new ListNBT();
for (BlockInfo block : this.blocks.values()) {
@ -799,7 +820,9 @@ public abstract class Contraption {
ListNBT blockList;
if (usePalettedDeserialization) {
CompoundNBT c = ((CompoundNBT) compound);
palette = new PaletteHashMap<>(GameData.getBlockStateIDMap(), 16, (i, s) -> {throw new IllegalStateException("Palette Map index exceeded maximum");}, NBTUtil::readBlockState, NBTUtil::writeBlockState);
palette = new PaletteHashMap<>(GameData.getBlockStateIDMap(), 16, (i, s) -> {
throw new IllegalStateException("Palette Map index exceeded maximum");
}, NBTUtil::readBlockState, NBTUtil::writeBlockState);
palette.read(c.getList("Palette", 10));
blockList = c.getList("BlockList", 10);
@ -857,19 +880,15 @@ public abstract class Contraption {
}
private static BlockInfo readBlockInfo(CompoundNBT blockListEntry, PaletteHashMap<BlockState> palette) {
return new BlockInfo(
BlockPos.fromLong(blockListEntry.getLong("Pos")),
Objects.requireNonNull(palette.get(blockListEntry.getInt("State"))),
blockListEntry.contains("Data") ? blockListEntry.getCompound("Data") : null
);
return new BlockInfo(BlockPos.fromLong(blockListEntry.getLong("Pos")),
Objects.requireNonNull(palette.get(blockListEntry.getInt("State"))),
blockListEntry.contains("Data") ? blockListEntry.getCompound("Data") : null);
}
private static BlockInfo legacyReadBlockInfo(CompoundNBT blockListEntry) {
return new BlockInfo(
NBTUtil.readBlockPos(blockListEntry.getCompound("Pos")),
NBTUtil.readBlockState(blockListEntry.getCompound("Block")),
blockListEntry.contains("Data") ? blockListEntry.getCompound("Data") : null
);
return new BlockInfo(NBTUtil.readBlockPos(blockListEntry.getCompound("Pos")),
NBTUtil.readBlockState(blockListEntry.getCompound("Block")),
blockListEntry.contains("Data") ? blockListEntry.getCompound("Data") : null);
}
public void removeBlocksFromWorld(World world, BlockPos offset) {

View file

@ -39,7 +39,7 @@ public class ContraptionEntityRenderer<C extends AbstractContraptionEntity> exte
super.render(entity, yaw, partialTicks, ms, buffers, overlay);
// Keep a copy of the transforms in order to determine correct lighting
MatrixStack msLocal = translateTo(entity, AnimationTickHolder.getRenderTick());
MatrixStack msLocal = translateTo(entity, AnimationTickHolder.getPartialTicks());
MatrixStack[] matrixStacks = new MatrixStack[] { ms, msLocal };
ms.push();

View file

@ -0,0 +1,162 @@
package com.simibubi.create.content.contraptions.components.structureMovement.chassis;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.block.ProperDirectionalBlock;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.item.BlockItemUseContext;
import net.minecraft.particles.BlockParticleData;
import net.minecraft.particles.ParticleTypes;
import net.minecraft.state.BooleanProperty;
import net.minecraft.state.StateContainer.Builder;
import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorldReader;
import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;
public class StickerBlock extends ProperDirectionalBlock implements ITE<StickerTileEntity> {
public static final BooleanProperty POWERED = BlockStateProperties.POWERED;
public static final BooleanProperty EXTENDED = BlockStateProperties.EXTENDED;
public StickerBlock(Properties p_i48415_1_) {
super(p_i48415_1_);
setDefaultState(getDefaultState().with(POWERED, false)
.with(EXTENDED, false));
}
@Override
public BlockState getStateForPlacement(BlockItemUseContext context) {
Direction nearestLookingDirection = context.getNearestLookingDirection();
boolean shouldPower = context.getWorld()
.isBlockPowered(context.getPos());
Direction facing = context.getPlayer() != null && context.getPlayer()
.isSneaking() ? nearestLookingDirection : nearestLookingDirection.getOpposite();
return getDefaultState().with(FACING, facing)
.with(POWERED, shouldPower);
}
@Override
protected void fillStateContainer(Builder<Block, BlockState> builder) {
super.fillStateContainer(builder.add(POWERED, EXTENDED));
}
@Override
public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos,
boolean isMoving) {
if (worldIn.isRemote)
return;
boolean previouslyPowered = state.get(POWERED);
if (previouslyPowered != worldIn.isBlockPowered(pos)) {
state = state.cycle(POWERED);
if (state.get(POWERED))
state = state.cycle(EXTENDED);
worldIn.setBlockState(pos, state, 2);
}
}
@Override
public boolean hasTileEntity(BlockState state) {
return true;
}
@Override
public boolean shouldCheckWeakPower(BlockState state, IWorldReader world, BlockPos pos, Direction side) {
return false;
}
@Override
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
return AllTileEntities.STICKER.create();
}
@Override
public Class<StickerTileEntity> getTileEntityClass() {
return StickerTileEntity.class;
}
// Slime block stuff
private boolean isUprightSticker(IBlockReader world, BlockPos pos) {
BlockState blockState = world.getBlockState(pos);
return AllBlocks.STICKER.has(blockState) && blockState.get(FACING) == Direction.UP;
}
@Override
public void onFallenUpon(World p_180658_1_, BlockPos p_180658_2_, Entity p_180658_3_, float p_180658_4_) {
if (!isUprightSticker(p_180658_1_, p_180658_2_) || p_180658_3_.bypassesLandingEffects()) {
super.onFallenUpon(p_180658_1_, p_180658_2_, p_180658_3_, p_180658_4_);
} else {
p_180658_3_.handleFallDamage(p_180658_4_, 0.0F);
}
}
@Override
public void onLanded(IBlockReader p_176216_1_, Entity p_176216_2_) {
if (!isUprightSticker(p_176216_1_, p_176216_2_.getPosition()
.down()) || p_176216_2_.bypassesLandingEffects()) {
super.onLanded(p_176216_1_, p_176216_2_);
} else {
this.func_226946_a_(p_176216_2_);
}
}
private void func_226946_a_(Entity p_226946_1_) {
Vec3d vec3d = p_226946_1_.getMotion();
if (vec3d.y < 0.0D) {
double d0 = p_226946_1_ instanceof LivingEntity ? 1.0D : 0.8D;
p_226946_1_.setMotion(vec3d.x, -vec3d.y * d0, vec3d.z);
}
}
@Override
public void onEntityWalk(World p_176199_1_, BlockPos p_176199_2_, Entity p_176199_3_) {
double d0 = Math.abs(p_176199_3_.getMotion().y);
if (d0 < 0.1D && !p_176199_3_.bypassesSteppingEffects() && isUprightSticker(p_176199_1_, p_176199_2_)) {
double d1 = 0.4D + d0 * 0.2D;
p_176199_3_.setMotion(p_176199_3_.getMotion()
.mul(d1, 1.0D, d1));
}
super.onEntityWalk(p_176199_1_, p_176199_2_, p_176199_3_);
}
@Override
public boolean addLandingEffects(BlockState state1, ServerWorld worldserver, BlockPos pos, BlockState state2,
LivingEntity entity, int numberOfParticles) {
if (isUprightSticker(worldserver, pos)) {
worldserver.spawnParticle(new BlockParticleData(ParticleTypes.BLOCK, Blocks.SLIME_BLOCK.getDefaultState()),
entity.getX(), entity.getY(), entity.getZ(), numberOfParticles, 0.0D, 0.0D, 0.0D, (double) 0.15F);
return true;
}
return super.addLandingEffects(state1, worldserver, pos, state2, entity, numberOfParticles);
}
@Override
public boolean addRunningEffects(BlockState state, World world, BlockPos pos, Entity entity) {
if (state.get(FACING) == Direction.UP) {
Vec3d vec3d = entity.getMotion();
world.addParticle(
new BlockParticleData(ParticleTypes.BLOCK, Blocks.SLIME_BLOCK.getDefaultState()).setPos(pos),
entity.getX() + ((double) world.rand.nextFloat() - 0.5D) * (double) entity.getWidth(),
entity.getY() + 0.1D,
entity.getZ() + ((double) world.rand.nextFloat() - 0.5D) * (double) entity.getWidth(), vec3d.x * -4.0D,
1.5D, vec3d.z * -4.0D);
return true;
}
return super.addRunningEffects(state, world, pos, entity);
}
}

View file

@ -0,0 +1,48 @@
package com.simibubi.create.content.contraptions.components.structureMovement.chassis;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.foundation.render.SuperByteBuffer;
import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.MatrixStacker;
import net.minecraft.block.BlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
import net.minecraft.util.Direction;
public class StickerRenderer extends SafeTileEntityRenderer<StickerTileEntity> {
public StickerRenderer(TileEntityRendererDispatcher dispatcher) {
super(dispatcher);
}
@Override
protected void renderSafe(StickerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
int light, int overlay) {
BlockState state = te.getBlockState();
SuperByteBuffer head = AllBlockPartials.STICKER_HEAD.renderOn(state);
float offset = te.piston.getValue(AnimationTickHolder.getPartialTicks());
if (te.getWorld() != Minecraft.getInstance().world)
offset = state.get(StickerBlock.EXTENDED) ? 1 : 0;
Direction facing = state.get(StickerBlock.FACING);
ms.push();
MatrixStacker.of(ms)
.nudge(te.hashCode())
.centre()
.rotateY(AngleHelper.horizontalAngle(facing))
.rotateX(AngleHelper.verticalAngle(facing) + 90)
.unCentre();
ms.translate(0, (offset * offset) * 4 / 16f, 0);
head.light(light)
.renderInto(ms, buffer.getBuffer(RenderType.getSolid()));
ms.pop();
}
}

View file

@ -0,0 +1,94 @@
package com.simibubi.create.content.contraptions.components.structureMovement.chassis;
import java.util.List;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllSoundEvents;
import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueItem;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.utility.LerpedFloat;
import com.simibubi.create.foundation.utility.LerpedFloat.Chaser;
import net.minecraft.block.BlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction;
import net.minecraft.util.SoundCategory;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fml.DistExecutor;
public class StickerTileEntity extends SmartTileEntity {
LerpedFloat piston;
boolean update;
public StickerTileEntity(TileEntityType<?> tileEntityTypeIn) {
super(tileEntityTypeIn);
piston = LerpedFloat.linear();
update = false;
}
@Override
public void addBehaviours(List<TileEntityBehaviour> behaviours) {}
@Override
public void initialize() {
super.initialize();
if (!world.isRemote)
return;
piston.startWithValue(isBlockStateExtended() ? 1 : 0);
}
public boolean isBlockStateExtended() {
BlockState blockState = getBlockState();
boolean extended = AllBlocks.STICKER.has(blockState) && blockState.get(StickerBlock.EXTENDED);
return extended;
}
@Override
public void tick() {
super.tick();
if (!world.isRemote)
return;
piston.tickChaser();
if (isAttachedToBlock() && piston.getValue(0) != piston.getValue() && piston.getValue() == 1) {
SuperGlueItem.spawnParticles(world, pos, getBlockState().get(StickerBlock.FACING), true);
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> playSound(true));
}
if (!update)
return;
update = false;
int target = isBlockStateExtended() ? 1 : 0;
if (isAttachedToBlock() && target == 0 && piston.getChaseTarget() == 1)
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> playSound(false));
piston.chase(target, .4f, Chaser.LINEAR);
}
public boolean isAttachedToBlock() {
BlockState blockState = getBlockState();
if (!AllBlocks.STICKER.has(blockState))
return false;
Direction direction = blockState.get(StickerBlock.FACING);
return SuperGlueEntity.isValidFace(world, pos.offset(direction), direction.getOpposite());
}
@Override
protected void read(CompoundNBT compound, boolean clientPacket) {
super.read(compound, clientPacket);
if (clientPacket)
update = true;
}
@OnlyIn(Dist.CLIENT)
public void playSound(boolean attach) {
world.playSound(Minecraft.getInstance().player, pos, AllSoundEvents.SLIME_ADDED.get(), SoundCategory.BLOCKS,
0.35F, attach ? 0.75F : 0.2f);
}
}

View file

@ -72,7 +72,7 @@ public class GantryPinionRenderer extends KineticTileEntityRenderer {
}
public static float getAngleForTe(KineticTileEntity te, final BlockPos pos, Axis axis) {
float time = AnimationTickHolder.getRenderTick();
float time = AnimationTickHolder.getRenderTime();
float offset = getRotationOffsetForPosition(te, pos, axis);
return ((time * te.getSpeed() * 3f / 20 + offset) % 360) / 180 * (float) Math.PI;
}

View file

@ -72,7 +72,7 @@ public class BasinRenderer extends SmartTileEntityRenderer<BasinTileEntity> {
if (fluidLevel > 0) {
ms.translate(0,
(MathHelper.sin(AnimationTickHolder.getRenderTick() / 12f + anglePartition * itemCount) + 1.5f) * 1
(MathHelper.sin(AnimationTickHolder.getRenderTime() / 12f + anglePartition * itemCount) + 1.5f) * 1
/ 32f,
0);
}

View file

@ -27,7 +27,7 @@ public class BlazeBurnerRenderer extends SafeTileEntityRenderer<BlazeBurnerTileE
if (heatLevel == HeatLevel.NONE)
return;
float renderTick = AnimationTickHolder.getRenderTick() + (te.hashCode() % 13) * 16f;
float renderTick = AnimationTickHolder.getRenderTime() + (te.hashCode() % 13) * 16f;
float offset = (MathHelper.sin((float) ((renderTick / 16f) % (2 * Math.PI))) + .5f) / 16f;
AllBlockPartials blazeModel = AllBlockPartials.BLAZES.get(heatLevel);

View file

@ -72,7 +72,7 @@ public class BeltRenderer extends SafeTileEntityRenderer<BeltTileEntity> {
MatrixStacker msr = MatrixStacker.of(ms);
IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid());
float renderTick = AnimationTickHolder.getRenderTick();
float renderTick = AnimationTickHolder.getRenderTime();
ms.push();
msr.centre();

View file

@ -32,7 +32,7 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer {
Block block = te.getBlockState().getBlock();
final Axis boxAxis = ((IRotate) block).getRotationAxis(te.getBlockState());
final BlockPos pos = te.getPos();
float time = AnimationTickHolder.getRenderTick();
float time = AnimationTickHolder.getRenderTime();
for (Direction direction : Iterate.directions) {
Axis axis = direction.getAxis();

View file

@ -30,7 +30,7 @@ public class GearboxRenderer extends KineticTileEntityRenderer {
final Axis boxAxis = te.getBlockState().get(BlockStateProperties.AXIS);
final BlockPos pos = te.getPos();
float time = AnimationTickHolder.getRenderTick();
float time = AnimationTickHolder.getRenderTime();
for (Direction direction : Iterate.directions) {
final Axis axis = direction.getAxis();

View file

@ -16,7 +16,7 @@ public class WrenchItemRenderer extends CustomRenderedItemModelRenderer<WrenchMo
IRenderTypeBuffer buffer, int light, int overlay) {
renderer.render(model.getBakedModel(), light);
float worldTime = AnimationTickHolder.getRenderTick();
float worldTime = AnimationTickHolder.getRenderTime();
float angle = worldTime * -.5f % 360;
float xOffset = -1/16f;
ms.translate(-xOffset, 0, 0);

View file

@ -14,7 +14,7 @@ public class ChromaticCompoundColor implements IItemColor {
public int getColor(ItemStack stack, int layer) {
Minecraft mc = Minecraft.getInstance();
float pt = AnimationTickHolder.getPartialTicks();
float progress = (float) ((mc.player.getYaw(pt)) / 180 * Math.PI) + (AnimationTickHolder.getRenderTick() / 10f);
float progress = (float) ((mc.player.getYaw(pt)) / 180 * Math.PI) + (AnimationTickHolder.getRenderTime() / 10f);
if (layer == 0)
return ColorHelper.mixColors(0x6e5773, 0x6B3074, ((float) MathHelper.sin(progress) + 1) / 2);
if (layer == 1)

View file

@ -100,7 +100,7 @@ public class SymmetryHandler {
float yShift = 0;
double speed = 1 / 16d;
yShift = MathHelper.sin((float) (AnimationTickHolder.getRenderTick() * speed)) / 5f;
yShift = MathHelper.sin((float) (AnimationTickHolder.getRenderTime() * speed)) / 5f;
IRenderTypeBuffer.Impl buffer = Minecraft.getInstance()
.getBufferBuilders()

View file

@ -15,7 +15,7 @@ public class SymmetryWandItemRenderer extends CustomRenderedItemModelRenderer<Sy
@Override
protected void render(ItemStack stack, SymmetryWandModel model, PartialItemModelRenderer renderer, MatrixStack ms,
IRenderTypeBuffer buffer, int light, int overlay) {
float worldTime = AnimationTickHolder.getRenderTick() / 20;
float worldTime = AnimationTickHolder.getRenderTime() / 20;
int maxLight = 0xF000F0;
renderer.render(model.getBakedModel(), light);

View file

@ -15,7 +15,7 @@ public class DeforesterItemRenderer extends CustomRenderedItemModelRenderer<Defo
protected void render(ItemStack stack, DeforesterModel model, PartialItemModelRenderer renderer,
MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) {
int maxLight = 0xF000F0;
float worldTime = AnimationTickHolder.getRenderTick();
float worldTime = AnimationTickHolder.getRenderTime();
renderer.renderSolid(model.getBakedModel(), light);
renderer.renderSolidGlowing(model.getPartial("core"), maxLight);

View file

@ -97,7 +97,7 @@ public class ExtendoGripItemRenderer extends CustomRenderedItemModelRenderer<Ext
// cog
ms.push();
float angle = AnimationTickHolder.getRenderTick() * -2;
float angle = AnimationTickHolder.getRenderTime() * -2;
if (leftHand || rightHand)
angle += 360 * animation;
angle %= 360;

View file

@ -33,7 +33,7 @@ public class BlockzapperItemRenderer extends ZapperItemRenderer<BlockzapperModel
super.render(stack, model, renderer, ms, buffer, light, overlay);
float pt = AnimationTickHolder.getPartialTicks();
float worldTime = AnimationTickHolder.getRenderTick() / 20;
float worldTime = AnimationTickHolder.getRenderTime() / 20;
renderer.render(model.getBakedModel(), light);
renderComponent(stack, model, Body, renderer, light);

View file

@ -25,7 +25,7 @@ public class WorldshaperItemRenderer extends ZapperItemRenderer<WorldshaperModel
super.render(stack, model, renderer, ms, buffer, light, overlay);
float pt = AnimationTickHolder.getPartialTicks();
float worldTime = AnimationTickHolder.getRenderTick() / 20;
float worldTime = AnimationTickHolder.getRenderTime() / 20;
renderer.renderSolid(model.getBakedModel(), light);

View file

@ -50,7 +50,7 @@ public class ArmRenderer extends KineticTileEntityRenderer {
float headAngle = arm.headAngle.get(pt);
boolean rave = arm.phase == Phase.DANCING;
float renderTick = AnimationTickHolder.getRenderTick() + (te.hashCode() % 64);
float renderTick = AnimationTickHolder.getRenderTime() + (te.hashCode() % 64);
if (rave) {
baseAngle = (renderTick * 10) % 360;
lowerArmAngle = MathHelper.lerp((MathHelper.sin(renderTick / 4) + 1) / 2, -45, 15);

View file

@ -317,7 +317,7 @@ public class StandardRecipeGen extends CreateRecipeProvider {
.patternLine("P")
.patternLine("A")
.patternLine("P")),
GANTRY_PINION = create(AllBlocks.GANTRY_PINION).unlockedBy(I::andesiteCasing)
.viaShaped(b -> b.key('B', ItemTags.PLANKS)
.key('S', I.cog())
@ -669,6 +669,15 @@ public class StandardRecipeGen extends CreateRecipeProvider {
LINEAR_CHASSIS_CYCLE =
conversionCycle(ImmutableList.of(AllBlocks.LINEAR_CHASSIS, AllBlocks.SECONDARY_LINEAR_CHASSIS)),
STICKER = create(AllBlocks.STICKER).returns(1)
.unlockedBy(I::andesite)
.viaShaped(b -> b.key('I', I.andesite())
.key('C', Tags.Items.COBBLESTONE)
.key('R', I.redstone())
.key('S', Tags.Items.SLIMEBALLS)
.patternLine("ISI")
.patternLine("CRC")),
MINECART = create(() -> Items.MINECART).withSuffix("_from_contraption_cart")
.unlockedBy(AllBlocks.CART_ASSEMBLER::get)
.viaShapeless(b -> b.addIngredient(AllItems.MINECART_CONTRAPTION.get())),

View file

@ -7,6 +7,7 @@ import com.simibubi.create.Create;
import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.Debug;
import com.simibubi.create.foundation.utility.MatrixStacker;
import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld;

View file

@ -43,7 +43,7 @@ public class BasicProgram extends GlProgram {
super.bind();
GL20.glUniform1i(uDebug, debugMode);
GL20.glUniform1f(uTime, AnimationTickHolder.getRenderTick());
GL20.glUniform1f(uTime, AnimationTickHolder.getRenderTime());
uploadMatrixUniform(uViewProjection, viewProjection);
GL20.glUniform3f(uCameraPos, (float) camX, (float) camY, (float) camZ);

View file

@ -16,7 +16,7 @@ public class AnimationTickHolder {
}
}
public static float getRenderTick() {
public static float getRenderTime() {
return getTicks() + getPartialTicks();
}

View file

@ -0,0 +1,71 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "block/piston_bottom",
"1": "block/piston_inner",
"3": "create:block/sticker",
"4": "create:block/sticker_side",
"particle": "block/piston_bottom"
},
"elements": [
{
"from": [0, 0, 0],
"to": [16, 8, 16],
"faces": {
"north": {"uv": [0, 8, 16, 16], "texture": "#4"},
"east": {"uv": [0, 8, 16, 16], "texture": "#4"},
"south": {"uv": [0, 8, 16, 16], "texture": "#4"},
"west": {"uv": [0, 8, 16, 16], "texture": "#4"},
"up": {"uv": [0, 0, 16, 16], "texture": "#1"},
"down": {"uv": [0, 0, 16, 16], "texture": "#0"}
}
},
{
"from": [0, 8, 0],
"to": [16, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 16, 8]},
"faces": {
"north": {"uv": [0, 0, 16, 8], "texture": "#4"},
"east": {"uv": [0, 0, 16, 8], "texture": "#4"},
"south": {"uv": [0, 0, 16, 8], "texture": "#4"},
"west": {"uv": [0, 0, 16, 8], "texture": "#4"},
"up": {"uv": [0, 0, 8, 8], "texture": "#3"}
}
},
{
"from": [0, 8, -0.95],
"to": [16, 16, 0.05],
"faces": {
"south": {"uv": [0, 0, 16, 8], "texture": "#4"}
}
},
{
"from": [0, 8, 15.95],
"to": [16, 16, 16.95],
"faces": {
"north": {"uv": [0, 0, 16, 8], "texture": "#4"}
}
},
{
"from": [15.95, 8, 0],
"to": [16.95, 16, 16],
"faces": {
"west": {"uv": [0, 0, 16, 8], "texture": "#4"}
}
},
{
"from": [-0.95, 8, 0],
"to": [0.05, 16, 16],
"faces": {
"east": {"uv": [16, 0, 0, 8], "texture": "#4"}
}
}
],
"groups": [
{
"name": "Piston Block",
"origin": [8, 8, 8],
"children": [0, 1, 2, 3, 4, 5]
}
]
}

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/sticker/block",
"textures": {
"4": "create:block/sticker_side_powered"
}
}

View file

@ -0,0 +1,41 @@
{
"credit": "Made with Blockbench",
"textures": {
"2": "block/piston_side",
"3": "create:block/sticker",
"particle": "block/piston_bottom"
},
"elements": [
{
"from": [1, 8, 1],
"to": [15, 13, 15],
"rotation": {"angle": 0, "axis": "y", "origin": [9, 16, 9]},
"faces": {
"north": {"uv": [8.5, 0, 15.5, 2.5], "texture": "#3"},
"east": {"uv": [8.5, 0, 15.5, 2.5], "texture": "#3"},
"south": {"uv": [8.5, 0, 15.5, 2.5], "texture": "#3"},
"west": {"uv": [8.5, 0, 15.5, 2.5], "texture": "#3"},
"up": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#3"},
"down": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#3"}
}
},
{
"from": [6, 3, 6],
"to": [10, 8, 10],
"rotation": {"angle": 0, "axis": "y", "origin": [14, 11, 14]},
"faces": {
"north": {"uv": [0, 0, 5, 4], "rotation": 90, "texture": "#2"},
"east": {"uv": [0, 0, 5, 4], "rotation": 90, "texture": "#2"},
"south": {"uv": [0, 0, 5, 4], "rotation": 90, "texture": "#2"},
"west": {"uv": [0, 0, 5, 4], "rotation": 90, "texture": "#2"}
}
}
],
"groups": [
{
"name": "Piston Head",
"origin": [14, 28, 14],
"children": [0, 1]
}
]
}

View file

@ -0,0 +1,104 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "block/piston_bottom",
"1": "block/piston_inner",
"2": "block/piston_side",
"3": "create:block/sticker",
"4": "create:block/sticker_side",
"particle": "block/piston_bottom"
},
"elements": [
{
"from": [0, 0, 0],
"to": [16, 8, 16],
"faces": {
"north": {"uv": [0, 8, 16, 16], "texture": "#4"},
"east": {"uv": [0, 8, 16, 16], "texture": "#4"},
"south": {"uv": [0, 8, 16, 16], "texture": "#4"},
"west": {"uv": [0, 8, 16, 16], "texture": "#4"},
"up": {"uv": [0, 0, 16, 16], "texture": "#1"},
"down": {"uv": [0, 0, 16, 16], "texture": "#0"}
}
},
{
"from": [0, 8, 0],
"to": [16, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 16, 8]},
"faces": {
"north": {"uv": [0, 0, 16, 8], "texture": "#4"},
"east": {"uv": [0, 0, 16, 8], "texture": "#4"},
"south": {"uv": [0, 0, 16, 8], "texture": "#4"},
"west": {"uv": [0, 0, 16, 8], "texture": "#4"},
"up": {"uv": [0, 0, 8, 8], "texture": "#3"}
}
},
{
"from": [0, 8, -0.95],
"to": [16, 16, 0.05],
"faces": {
"south": {"uv": [0, 0, 16, 8], "texture": "#4"}
}
},
{
"from": [0, 8, 15.95],
"to": [16, 16, 16.95],
"faces": {
"north": {"uv": [0, 0, 16, 8], "texture": "#4"}
}
},
{
"from": [16, 8, 0.05],
"to": [17, 16, 16.05],
"rotation": {"angle": 0, "axis": "y", "origin": [9, 8, 8]},
"faces": {
"west": {"uv": [0, 0, 16, 8], "texture": "#4"}
}
},
{
"from": [-1, 8, -0.05],
"to": [0, 16, 15.95],
"rotation": {"angle": 0, "axis": "y", "origin": [7, 8, 8]},
"faces": {
"east": {"uv": [0, 0, 16, 8], "texture": "#4"}
}
},
{
"from": [1, 9, 1],
"to": [15, 14, 15],
"rotation": {"angle": 0, "axis": "y", "origin": [9, 17, 9]},
"faces": {
"north": {"uv": [8.5, 0, 15.5, 2.5], "texture": "#3"},
"east": {"uv": [8.5, 0, 15.5, 2.5], "texture": "#3"},
"south": {"uv": [8.5, 0, 15.5, 2.5], "texture": "#3"},
"west": {"uv": [8.5, 0, 15.5, 2.5], "texture": "#3"},
"up": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#3"},
"down": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#3"}
}
},
{
"from": [6, 4, 6],
"to": [10, 9, 10],
"rotation": {"angle": 0, "axis": "y", "origin": [14, 12, 14]},
"faces": {
"north": {"uv": [0, 0, 5, 4], "rotation": 90, "texture": "#2"},
"east": {"uv": [0, 0, 5, 4], "rotation": 90, "texture": "#2"},
"south": {"uv": [0, 0, 5, 4], "rotation": 90, "texture": "#2"},
"west": {"uv": [0, 0, 5, 4], "rotation": 90, "texture": "#2"}
}
}
],
"groups": [
{
"name": "Piston Block",
"origin": [8, 8, 8],
"children": [0, 1, 2, 3, 4, 5]
},
{
"name": "Piston Head",
"origin": [14, 28, 14],
"children": [6, 7]
}
]
}

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB