Merge branch 'mc1.15/dev' into mc1.15/metadoc

This commit is contained in:
simibubi 2021-02-08 16:51:52 +01:00
commit 4a5479838c
182 changed files with 17836 additions and 6850 deletions

1
.gitignore vendored
View file

@ -40,4 +40,3 @@ local.properties
# PDT-specific # PDT-specific
.buildpath .buildpath
src/generated/resources/.cache/cache

View file

@ -157,6 +157,8 @@ afff479c0e5284771afa9e7ce513595fe65860ee assets/create/blockstates/gabbro_cobble
a1f31a194129cfb65e335b3b96490f9275f9c564 assets/create/blockstates/gabbro_cobblestone_stairs.json a1f31a194129cfb65e335b3b96490f9275f9c564 assets/create/blockstates/gabbro_cobblestone_stairs.json
a64d8d0924c0b5b192f355343dd9b3a440875f6a assets/create/blockstates/gabbro_cobblestone_wall.json a64d8d0924c0b5b192f355343dd9b3a440875f6a assets/create/blockstates/gabbro_cobblestone_wall.json
a6b44e8a1c4ce0c7442b2384b41ad36dd133f19b assets/create/blockstates/gabbro_pillar.json a6b44e8a1c4ce0c7442b2384b41ad36dd133f19b assets/create/blockstates/gabbro_pillar.json
2d7ffcb339b0a38b98935a382ac2a164866255b1 assets/create/blockstates/gantry_pinion.json
9fa39a44bba30c5ae8fa245b122a837c705462b4 assets/create/blockstates/gantry_shaft.json
eca1f0e56efdadb241f42dc6ebb036f1d52213a9 assets/create/blockstates/gearbox.json eca1f0e56efdadb241f42dc6ebb036f1d52213a9 assets/create/blockstates/gearbox.json
f34814b17cde3231a1dfb271f3dabf8d6de4fbf6 assets/create/blockstates/gearshift.json f34814b17cde3231a1dfb271f3dabf8d6de4fbf6 assets/create/blockstates/gearshift.json
93f8bdc22d9a5e04268964e35e4285c8cbf2b89d assets/create/blockstates/glass_fluid_pipe.json 93f8bdc22d9a5e04268964e35e4285c8cbf2b89d assets/create/blockstates/glass_fluid_pipe.json
@ -398,17 +400,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j
6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json 6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json
7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json
b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json
df67c2c11fa22487d3a0fdc9b008056e593d14e3 assets/create/lang/en_ud.json e3f618c5b622d21880de858678d1802cbf65e615 assets/create/lang/en_ud.json
3ad443f44eb33fe8c3ac092d1532dcbd27e49c84 assets/create/lang/en_us.json acc852d80378b426d7ee6cb59c169e06b6d63b25 assets/create/lang/en_us.json
612a63d73f7f4b8e79dce3f53ddbe3345f0e74d8 assets/create/lang/unfinished/de_de.json 30ce93c56557cea2f384a47b549fb893700523a5 assets/create/lang/unfinished/de_de.json
2e37dc718a8dea2af85daba7266c877ce80ff35b assets/create/lang/unfinished/fr_fr.json 77b8310f3cbed36fa0d2ee29e65ac6aee0c2adc2 assets/create/lang/unfinished/es_mx.json
f843761728c403276b7a47282f4fdd039b5b6854 assets/create/lang/unfinished/it_it.json 8db9f9147dcef8c8182c548a524f96f578c116ec assets/create/lang/unfinished/fr_fr.json
8b90c66fd5974c993e83bfa5733ca03187211d28 assets/create/lang/unfinished/ja_jp.json 89f7029d73733938ee9f900fc36d52ab7fc97563 assets/create/lang/unfinished/it_it.json
59db0a3cff42707ecb828b975ef1fcba2a21a521 assets/create/lang/unfinished/ko_kr.json b1935e7f8d79d1112e1685adb42daedb976ac6d7 assets/create/lang/unfinished/ja_jp.json
b1900a6cce7216a4baa844affa169cfb32ff645c assets/create/lang/unfinished/nl_nl.json 23aaf879d07a24775aeba3b98c355c992b24f28b assets/create/lang/unfinished/ko_kr.json
d3f09a37b1f4ec5d53effc2b87efbccf2df2b7c7 assets/create/lang/unfinished/pt_br.json 7372533759001f094dbcad787f01f3de7422d8c0 assets/create/lang/unfinished/nl_nl.json
16c92dab525ba20e85b65ee084f7b760432dcb73 assets/create/lang/unfinished/ru_ru.json 0d1e5d79ef196a06b273962d5ac8f2013f91209c assets/create/lang/unfinished/pt_br.json
c8b5c2a3a65468950aa713a56bf1c930eef81305 assets/create/lang/unfinished/zh_cn.json 54da7badbd4fb043f73f6e9a4dfc52bd9e7f515c assets/create/lang/unfinished/ru_ru.json
45ca54406acac857752c67a45729da953d11f94a assets/create/lang/unfinished/zh_cn.json
4093ea8612465858aa57581b36f8f60aa23ac203 assets/create/lang/unfinished/zh_tw.json
846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json
1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json
1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json
@ -751,6 +755,18 @@ f278ec09c13f98ccbce1a8488d4d51c72f398ed4 assets/create/models/block/gabbro_cobbl
5e50c62a9db350f3a2c0e4b1c37a8dc0d149f287 assets/create/models/block/gabbro_cobblestone_wall_post.json 5e50c62a9db350f3a2c0e4b1c37a8dc0d149f287 assets/create/models/block/gabbro_cobblestone_wall_post.json
820235f51e7c3b4c05a327c3aa66618ea1e89c9c assets/create/models/block/gabbro_cobblestone_wall_side.json 820235f51e7c3b4c05a327c3aa66618ea1e89c9c assets/create/models/block/gabbro_cobblestone_wall_side.json
ede9c9209f9cee3d8e1ffc5008b1b8b026aee998 assets/create/models/block/gabbro_pillar.json ede9c9209f9cee3d8e1ffc5008b1b8b026aee998 assets/create/models/block/gabbro_pillar.json
f7f55d8107d9128f7be42b2a07fd99aeeba44954 assets/create/models/block/gantry_shaft_end_flipped.json
33196bb0c2f7ca356fc62854349a3ab5fdf2d119 assets/create/models/block/gantry_shaft_end_powered.json
410c0ae1995a079766cab96a3545bb61159feba3 assets/create/models/block/gantry_shaft_end_powered_flipped.json
d66f23d811a09c7e3dad5900f9851282be2f64b7 assets/create/models/block/gantry_shaft_middle_flipped.json
9551abd37c295fe2541f2aee01dd72bfb71b8ae1 assets/create/models/block/gantry_shaft_middle_powered.json
deff4f1163284c22a60d403000c0cd7553d6caff assets/create/models/block/gantry_shaft_middle_powered_flipped.json
16eb7950f81e7242d277f5b0b2710ade820f5645 assets/create/models/block/gantry_shaft_single_flipped.json
78b51bdfa1d26f909e2d3a3ddb70a5631f4fa75f assets/create/models/block/gantry_shaft_single_powered.json
c81b86c2186cbe9867ea041776c8e70059d70f7e assets/create/models/block/gantry_shaft_single_powered_flipped.json
347430ecc316d502cea2e0f90d43ff106e9cb15c assets/create/models/block/gantry_shaft_start_flipped.json
0e1a5a8f38cd6cd3e2f7d2c0d147d924414b0560 assets/create/models/block/gantry_shaft_start_powered.json
4b2f2e9eb3d426b56bb2e0f530b249469200afd0 assets/create/models/block/gantry_shaft_start_powered_flipped.json
392dd57e5b96214335867799347e21ac0d05457a assets/create/models/block/granite_bricks.json 392dd57e5b96214335867799347e21ac0d05457a assets/create/models/block/granite_bricks.json
0ee90049ce09f1f1c96063bc7239cd1fadbdb947 assets/create/models/block/granite_bricks_slab.json 0ee90049ce09f1f1c96063bc7239cd1fadbdb947 assets/create/models/block/granite_bricks_slab.json
37737d6767ba08b6bd96de1ff3b920522dc3cd51 assets/create/models/block/granite_bricks_slab_top.json 37737d6767ba08b6bd96de1ff3b920522dc3cd51 assets/create/models/block/granite_bricks_slab_top.json
@ -1316,6 +1332,8 @@ b10971277417369f421324b28f0a4b47ce4c8625 assets/create/models/item/gabbro_bricks
b3d7398dbc16c450928bd76b772c273382687447 assets/create/models/item/gabbro_cobblestone_stairs.json b3d7398dbc16c450928bd76b772c273382687447 assets/create/models/item/gabbro_cobblestone_stairs.json
5680f24b43838cb6632bfcedba282a244bd24db0 assets/create/models/item/gabbro_cobblestone_wall.json 5680f24b43838cb6632bfcedba282a244bd24db0 assets/create/models/item/gabbro_cobblestone_wall.json
20950b692eecfccd77d96678bb3d909d51f6d787 assets/create/models/item/gabbro_pillar.json 20950b692eecfccd77d96678bb3d909d51f6d787 assets/create/models/item/gabbro_pillar.json
b10f1b188f2bf380628377bd42af2b8f8ffe5611 assets/create/models/item/gantry_pinion.json
b4bfd5041b62f3a0a955fa4872d178b590614f22 assets/create/models/item/gantry_shaft.json
6ab0d17f3d02678ed992e188ff09f6b2c00b5b03 assets/create/models/item/gearbox.json 6ab0d17f3d02678ed992e188ff09f6b2c00b5b03 assets/create/models/item/gearbox.json
2fe29893d74c176ea35aed73a169c13dd4ddb2a8 assets/create/models/item/gearshift.json 2fe29893d74c176ea35aed73a169c13dd4ddb2a8 assets/create/models/item/gearshift.json
52108a61865dab38133b9f916496ca680ae364ea assets/create/models/item/golden_sheet.json 52108a61865dab38133b9f916496ca680ae364ea assets/create/models/item/golden_sheet.json
@ -1727,6 +1745,8 @@ b42213bffce4e51618e1bba481959208d247c120 data/create/advancements/recipes/create
11d89eca0ccb0f1a8cd27acc9fc0c10d7bf83285 data/create/advancements/recipes/create.base/crafting/kinetics/fluid_pipe.json 11d89eca0ccb0f1a8cd27acc9fc0c10d7bf83285 data/create/advancements/recipes/create.base/crafting/kinetics/fluid_pipe.json
a2b33e972c7130cbf105f34d88dd7a9a53d5465c data/create/advancements/recipes/create.base/crafting/kinetics/fluid_tank.json a2b33e972c7130cbf105f34d88dd7a9a53d5465c data/create/advancements/recipes/create.base/crafting/kinetics/fluid_tank.json
a91b11ae44d9b1f479c6dee1f1a4580104059287 data/create/advancements/recipes/create.base/crafting/kinetics/fluid_valve.json a91b11ae44d9b1f479c6dee1f1a4580104059287 data/create/advancements/recipes/create.base/crafting/kinetics/fluid_valve.json
e17c45fc17e1a8e1e618b6eae02fa0aba3247495 data/create/advancements/recipes/create.base/crafting/kinetics/gantry_pinion.json
d1d2fc2f5c4e89393808c65e015917eabb50dffe data/create/advancements/recipes/create.base/crafting/kinetics/gantry_shaft.json
dae9e65a089955c0367dc1453e104c3153ebad79 data/create/advancements/recipes/create.base/crafting/kinetics/gearbox.json dae9e65a089955c0367dc1453e104c3153ebad79 data/create/advancements/recipes/create.base/crafting/kinetics/gearbox.json
8f9819912605cb2499cb3e79ecb0e709b0e38c19 data/create/advancements/recipes/create.base/crafting/kinetics/gearboxfrom_conversion.json 8f9819912605cb2499cb3e79ecb0e709b0e38c19 data/create/advancements/recipes/create.base/crafting/kinetics/gearboxfrom_conversion.json
94b8a1f976b9f853cb6e24b0cef72d2e16c3282f data/create/advancements/recipes/create.base/crafting/kinetics/gearshift.json 94b8a1f976b9f853cb6e24b0cef72d2e16c3282f data/create/advancements/recipes/create.base/crafting/kinetics/gearshift.json
@ -2435,6 +2455,8 @@ e51893e1601c470da466b35b17251238e15d0361 data/create/loot_tables/blocks/gabbro_b
54879fe6ca3b7271fbb94ec26bef1c3031942d4d data/create/loot_tables/blocks/gabbro_cobblestone_stairs.json 54879fe6ca3b7271fbb94ec26bef1c3031942d4d data/create/loot_tables/blocks/gabbro_cobblestone_stairs.json
ae19749df10663efc51b8b27af310164f250ed38 data/create/loot_tables/blocks/gabbro_cobblestone_wall.json ae19749df10663efc51b8b27af310164f250ed38 data/create/loot_tables/blocks/gabbro_cobblestone_wall.json
e8d09c919e3b8125d7da0f38383c01bcfc61c7a8 data/create/loot_tables/blocks/gabbro_pillar.json e8d09c919e3b8125d7da0f38383c01bcfc61c7a8 data/create/loot_tables/blocks/gabbro_pillar.json
04e42ba63002ed8ba67780123413f6ff3fb85b02 data/create/loot_tables/blocks/gantry_pinion.json
f2883656e417a78e5e4093002eb1e36ffa1157e9 data/create/loot_tables/blocks/gantry_shaft.json
b0109b4a4f0f738cbbe6b5911e8c3c0310b76f99 data/create/loot_tables/blocks/gearbox.json b0109b4a4f0f738cbbe6b5911e8c3c0310b76f99 data/create/loot_tables/blocks/gearbox.json
5f39461c5c9d3ad8d84195b06b9468fe2b0fb269 data/create/loot_tables/blocks/gearshift.json 5f39461c5c9d3ad8d84195b06b9468fe2b0fb269 data/create/loot_tables/blocks/gearshift.json
c8aa9bbed8fd703eb1853de0b7c9e04dffb7a511 data/create/loot_tables/blocks/glass_fluid_pipe.json c8aa9bbed8fd703eb1853de0b7c9e04dffb7a511 data/create/loot_tables/blocks/glass_fluid_pipe.json
@ -2782,6 +2804,8 @@ f4ae37f736d06ccda5fbba7831a7a174ec916a05 data/create/recipes/crafting/kinetics/f
86ad4d2820e8e2b01de8d977af7796119dfb7430 data/create/recipes/crafting/kinetics/fluid_tank.json 86ad4d2820e8e2b01de8d977af7796119dfb7430 data/create/recipes/crafting/kinetics/fluid_tank.json
3dad2a849796df268cd3a06ed37376f2cc529957 data/create/recipes/crafting/kinetics/fluid_valve.json 3dad2a849796df268cd3a06ed37376f2cc529957 data/create/recipes/crafting/kinetics/fluid_valve.json
84153bd478c0e63a04c77579d6595043f604b7ab data/create/recipes/crafting/kinetics/furnace_minecart_from_contraption_cart.json 84153bd478c0e63a04c77579d6595043f604b7ab data/create/recipes/crafting/kinetics/furnace_minecart_from_contraption_cart.json
5299a12e9272089e64073c8e151b70a5bc57b53c data/create/recipes/crafting/kinetics/gantry_pinion.json
21095a156547d4a7d215964be793f1e960b81c09 data/create/recipes/crafting/kinetics/gantry_shaft.json
5eb05cdf88bccdaddfe7ebfbd8b70d1196d422a6 data/create/recipes/crafting/kinetics/gearbox.json 5eb05cdf88bccdaddfe7ebfbd8b70d1196d422a6 data/create/recipes/crafting/kinetics/gearbox.json
b5da8c58f6b8aba525ae8a12ad906db37b78a566 data/create/recipes/crafting/kinetics/gearboxfrom_conversion.json b5da8c58f6b8aba525ae8a12ad906db37b78a566 data/create/recipes/crafting/kinetics/gearboxfrom_conversion.json
4d4124b4f1df38d892cb19da19c6464522d3e37d data/create/recipes/crafting/kinetics/gearshift.json 4d4124b4f1df38d892cb19da19c6464522d3e37d data/create/recipes/crafting/kinetics/gearshift.json
@ -3515,7 +3539,7 @@ d3fdb8ece6cb072a93ddb64a0baad5ac952117a4 data/create/recipes/weathered_limestone
eedf31af7134d03656c5fa57229982f9c5bed07c data/create/tags/blocks/brittle.json eedf31af7134d03656c5fa57229982f9c5bed07c data/create/tags/blocks/brittle.json
13b55d6e905a02403d2e95e9ba2357f99c5f2241 data/create/tags/blocks/fan_heaters.json 13b55d6e905a02403d2e95e9ba2357f99c5f2241 data/create/tags/blocks/fan_heaters.json
3bc64e3a1e7980237435b1770a9ba2102d57fcd4 data/create/tags/blocks/fan_transparent.json 3bc64e3a1e7980237435b1770a9ba2102d57fcd4 data/create/tags/blocks/fan_transparent.json
745a82505a68a6482407d87374e356781406ab46 data/create/tags/blocks/safe_nbt.json c81ea194e808985847159b201140d4aa4cbcca65 data/create/tags/blocks/safe_nbt.json
c9ac7e3e5ec18554e7184168d65e9b8e44ef5610 data/create/tags/blocks/sails.json c9ac7e3e5ec18554e7184168d65e9b8e44ef5610 data/create/tags/blocks/sails.json
6cdeeac1689f7b5bfd9bc40b462143d8eaf3ad0b data/create/tags/blocks/seats.json 6cdeeac1689f7b5bfd9bc40b462143d8eaf3ad0b data/create/tags/blocks/seats.json
50936b211d94167a35ec78c89954082a336b6269 data/create/tags/blocks/valve_handles.json 50936b211d94167a35ec78c89954082a336b6269 data/create/tags/blocks/valve_handles.json

View file

@ -0,0 +1,52 @@
{
"variants": {
"axis_along_first=false,facing=down": {
"model": "create:block/gantry_pinion/horizontal",
"x": 270,
"y": 90
},
"axis_along_first=true,facing=down": {
"model": "create:block/gantry_pinion/horizontal",
"x": 270
},
"axis_along_first=false,facing=up": {
"model": "create:block/gantry_pinion/horizontal",
"x": 90,
"y": 90
},
"axis_along_first=true,facing=up": {
"model": "create:block/gantry_pinion/horizontal",
"x": 90
},
"axis_along_first=false,facing=north": {
"model": "create:block/gantry_pinion/vertical",
"y": 180
},
"axis_along_first=true,facing=north": {
"model": "create:block/gantry_pinion/horizontal",
"y": 180
},
"axis_along_first=false,facing=south": {
"model": "create:block/gantry_pinion/vertical"
},
"axis_along_first=true,facing=south": {
"model": "create:block/gantry_pinion/horizontal"
},
"axis_along_first=false,facing=west": {
"model": "create:block/gantry_pinion/horizontal",
"y": 90
},
"axis_along_first=true,facing=west": {
"model": "create:block/gantry_pinion/vertical",
"y": 90
},
"axis_along_first=false,facing=east": {
"model": "create:block/gantry_pinion/horizontal",
"y": 270
},
"axis_along_first=true,facing=east": {
"model": "create:block/gantry_pinion/vertical",
"y": 270
}
}
}

View file

@ -0,0 +1,212 @@
{
"variants": {
"facing=down,part=start,powered=false": {
"model": "create:block/gantry_shaft_start_flipped",
"x": 180
},
"facing=up,part=start,powered=false": {
"model": "create:block/gantry_shaft/block_start"
},
"facing=north,part=start,powered=false": {
"model": "create:block/gantry_shaft_start_flipped",
"x": 90
},
"facing=south,part=start,powered=false": {
"model": "create:block/gantry_shaft/block_start",
"x": 90,
"y": 180
},
"facing=west,part=start,powered=false": {
"model": "create:block/gantry_shaft_start_flipped",
"x": 90,
"y": 270
},
"facing=east,part=start,powered=false": {
"model": "create:block/gantry_shaft/block_start",
"x": 90,
"y": 90
},
"facing=down,part=middle,powered=false": {
"model": "create:block/gantry_shaft_middle_flipped",
"x": 180
},
"facing=up,part=middle,powered=false": {
"model": "create:block/gantry_shaft/block_middle"
},
"facing=north,part=middle,powered=false": {
"model": "create:block/gantry_shaft_middle_flipped",
"x": 90
},
"facing=south,part=middle,powered=false": {
"model": "create:block/gantry_shaft/block_middle",
"x": 90,
"y": 180
},
"facing=west,part=middle,powered=false": {
"model": "create:block/gantry_shaft_middle_flipped",
"x": 90,
"y": 270
},
"facing=east,part=middle,powered=false": {
"model": "create:block/gantry_shaft/block_middle",
"x": 90,
"y": 90
},
"facing=down,part=end,powered=false": {
"model": "create:block/gantry_shaft_end_flipped",
"x": 180
},
"facing=up,part=end,powered=false": {
"model": "create:block/gantry_shaft/block_end"
},
"facing=north,part=end,powered=false": {
"model": "create:block/gantry_shaft_end_flipped",
"x": 90
},
"facing=south,part=end,powered=false": {
"model": "create:block/gantry_shaft/block_end",
"x": 90,
"y": 180
},
"facing=west,part=end,powered=false": {
"model": "create:block/gantry_shaft_end_flipped",
"x": 90,
"y": 270
},
"facing=east,part=end,powered=false": {
"model": "create:block/gantry_shaft/block_end",
"x": 90,
"y": 90
},
"facing=down,part=single,powered=false": {
"model": "create:block/gantry_shaft_single_flipped",
"x": 180
},
"facing=up,part=single,powered=false": {
"model": "create:block/gantry_shaft/block_single"
},
"facing=north,part=single,powered=false": {
"model": "create:block/gantry_shaft_single_flipped",
"x": 90
},
"facing=south,part=single,powered=false": {
"model": "create:block/gantry_shaft/block_single",
"x": 90,
"y": 180
},
"facing=west,part=single,powered=false": {
"model": "create:block/gantry_shaft_single_flipped",
"x": 90,
"y": 270
},
"facing=east,part=single,powered=false": {
"model": "create:block/gantry_shaft/block_single",
"x": 90,
"y": 90
},
"facing=down,part=start,powered=true": {
"model": "create:block/gantry_shaft_start_powered_flipped",
"x": 180
},
"facing=up,part=start,powered=true": {
"model": "create:block/gantry_shaft_start_powered"
},
"facing=north,part=start,powered=true": {
"model": "create:block/gantry_shaft_start_powered_flipped",
"x": 90
},
"facing=south,part=start,powered=true": {
"model": "create:block/gantry_shaft_start_powered",
"x": 90,
"y": 180
},
"facing=west,part=start,powered=true": {
"model": "create:block/gantry_shaft_start_powered_flipped",
"x": 90,
"y": 270
},
"facing=east,part=start,powered=true": {
"model": "create:block/gantry_shaft_start_powered",
"x": 90,
"y": 90
},
"facing=down,part=middle,powered=true": {
"model": "create:block/gantry_shaft_middle_powered_flipped",
"x": 180
},
"facing=up,part=middle,powered=true": {
"model": "create:block/gantry_shaft_middle_powered"
},
"facing=north,part=middle,powered=true": {
"model": "create:block/gantry_shaft_middle_powered_flipped",
"x": 90
},
"facing=south,part=middle,powered=true": {
"model": "create:block/gantry_shaft_middle_powered",
"x": 90,
"y": 180
},
"facing=west,part=middle,powered=true": {
"model": "create:block/gantry_shaft_middle_powered_flipped",
"x": 90,
"y": 270
},
"facing=east,part=middle,powered=true": {
"model": "create:block/gantry_shaft_middle_powered",
"x": 90,
"y": 90
},
"facing=down,part=end,powered=true": {
"model": "create:block/gantry_shaft_end_powered_flipped",
"x": 180
},
"facing=up,part=end,powered=true": {
"model": "create:block/gantry_shaft_end_powered"
},
"facing=north,part=end,powered=true": {
"model": "create:block/gantry_shaft_end_powered_flipped",
"x": 90
},
"facing=south,part=end,powered=true": {
"model": "create:block/gantry_shaft_end_powered",
"x": 90,
"y": 180
},
"facing=west,part=end,powered=true": {
"model": "create:block/gantry_shaft_end_powered_flipped",
"x": 90,
"y": 270
},
"facing=east,part=end,powered=true": {
"model": "create:block/gantry_shaft_end_powered",
"x": 90,
"y": 90
},
"facing=down,part=single,powered=true": {
"model": "create:block/gantry_shaft_single_powered_flipped",
"x": 180
},
"facing=up,part=single,powered=true": {
"model": "create:block/gantry_shaft_single_powered"
},
"facing=north,part=single,powered=true": {
"model": "create:block/gantry_shaft_single_powered_flipped",
"x": 90
},
"facing=south,part=single,powered=true": {
"model": "create:block/gantry_shaft_single_powered",
"x": 90,
"y": 180
},
"facing=west,part=single,powered=true": {
"model": "create:block/gantry_shaft_single_powered_flipped",
"x": 90,
"y": 270
},
"facing=east,part=single,powered=true": {
"model": "create:block/gantry_shaft_single_powered",
"x": 90,
"y": 90
}
}
}

View file

@ -158,6 +158,8 @@
"block.create.gabbro_cobblestone_stairs": "s\u0279\u0131\u0250\u0287S \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 o\u0279qq\u0250\u2141", "block.create.gabbro_cobblestone_stairs": "s\u0279\u0131\u0250\u0287S \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 o\u0279qq\u0250\u2141",
"block.create.gabbro_cobblestone_wall": "\u05DF\u05DF\u0250M \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 o\u0279qq\u0250\u2141", "block.create.gabbro_cobblestone_wall": "\u05DF\u05DF\u0250M \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 o\u0279qq\u0250\u2141",
"block.create.gabbro_pillar": "\u0279\u0250\u05DF\u05DF\u0131\u0500 o\u0279qq\u0250\u2141", "block.create.gabbro_pillar": "\u0279\u0250\u05DF\u05DF\u0131\u0500 o\u0279qq\u0250\u2141",
"block.create.gantry_pinion": "uo\u0131u\u0131\u0500 \u028E\u0279\u0287u\u0250\u2141",
"block.create.gantry_shaft": "\u0287\u025F\u0250\u0265S \u028E\u0279\u0287u\u0250\u2141",
"block.create.gearbox": "xoq\u0279\u0250\u01DD\u2141", "block.create.gearbox": "xoq\u0279\u0250\u01DD\u2141",
"block.create.gearshift": "\u0287\u025F\u0131\u0265s\u0279\u0250\u01DD\u2141", "block.create.gearshift": "\u0287\u025F\u0131\u0265s\u0279\u0250\u01DD\u2141",
"block.create.glass_fluid_pipe": "\u01DDd\u0131\u0500 p\u0131n\u05DF\u2132 ss\u0250\u05DF\u2141", "block.create.glass_fluid_pipe": "\u01DDd\u0131\u0500 p\u0131n\u05DF\u2132 ss\u0250\u05DF\u2141",
@ -400,6 +402,7 @@
"block.create.zinc_block": "\u029E\u0254o\u05DF\u15FA \u0254u\u0131Z", "block.create.zinc_block": "\u029E\u0254o\u05DF\u15FA \u0254u\u0131Z",
"block.create.zinc_ore": "\u01DD\u0279O \u0254u\u0131Z", "block.create.zinc_ore": "\u01DD\u0279O \u0254u\u0131Z",
"entity.create.contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186", "entity.create.contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186",
"entity.create.gantry_contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186 \u028E\u0279\u0287u\u0250\u2141",
"entity.create.seat": "\u0287\u0250\u01DDS", "entity.create.seat": "\u0287\u0250\u01DDS",
"entity.create.stationary_contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186 \u028E\u0279\u0250uo\u0131\u0287\u0250\u0287S", "entity.create.stationary_contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186 \u028E\u0279\u0250uo\u0131\u0287\u0250\u0287S",
"entity.create.super_glue": "\u01DDn\u05DF\u2141 \u0279\u01DDdnS", "entity.create.super_glue": "\u01DDn\u05DF\u2141 \u0279\u01DDdnS",

View file

@ -161,6 +161,8 @@
"block.create.gabbro_cobblestone_stairs": "Gabbro Cobblestone Stairs", "block.create.gabbro_cobblestone_stairs": "Gabbro Cobblestone Stairs",
"block.create.gabbro_cobblestone_wall": "Gabbro Cobblestone Wall", "block.create.gabbro_cobblestone_wall": "Gabbro Cobblestone Wall",
"block.create.gabbro_pillar": "Gabbro Pillar", "block.create.gabbro_pillar": "Gabbro Pillar",
"block.create.gantry_pinion": "Gantry Pinion",
"block.create.gantry_shaft": "Gantry Shaft",
"block.create.gearbox": "Gearbox", "block.create.gearbox": "Gearbox",
"block.create.gearshift": "Gearshift", "block.create.gearshift": "Gearshift",
"block.create.glass_fluid_pipe": "Glass Fluid Pipe", "block.create.glass_fluid_pipe": "Glass Fluid Pipe",
@ -404,6 +406,7 @@
"block.create.zinc_ore": "Zinc Ore", "block.create.zinc_ore": "Zinc Ore",
"entity.create.contraption": "Contraption", "entity.create.contraption": "Contraption",
"entity.create.gantry_contraption": "Gantry Contraption",
"entity.create.seat": "Seat", "entity.create.seat": "Seat",
"entity.create.stationary_contraption": "Stationary Contraption", "entity.create.stationary_contraption": "Stationary Contraption",
"entity.create.super_glue": "Super Glue", "entity.create.super_glue": "Super Glue",

View file

@ -1,122 +1,122 @@
{ {
"_": "Missing Localizations: 1211", "_": "Missing Localizations: 1095",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
"block.create.acacia_window": "UNLOCALIZED: Acacia Window", "block.create.acacia_window": "Akazienfenster",
"block.create.acacia_window_pane": "UNLOCALIZED: Acacia Window Pane", "block.create.acacia_window_pane": "Akazienfensterscheibe",
"block.create.adjustable_chain_gearshift": "UNLOCALIZED: Adjustable Chain Gearshift", "block.create.adjustable_chain_gearshift": "Verstellbares Kettengetriebe",
"block.create.adjustable_crate": "adjustable_crate", "block.create.adjustable_crate": "Verstellbare Kiste",
"block.create.adjustable_pulse_repeater": "UNLOCALIZED: Adjustable Pulse Repeater", "block.create.adjustable_pulse_repeater": "Verstellbarer Pulsverstärker",
"block.create.adjustable_repeater": "Verzögernder Verstärker", "block.create.adjustable_repeater": "Verstellbarer Verstärker",
"block.create.analog_lever": "UNLOCALIZED: Analog Lever", "block.create.analog_lever": "Analoger Schalter",
"block.create.andesite_belt_funnel": "UNLOCALIZED: Andesite Belt Funnel", "block.create.andesite_belt_funnel": "Riementrichter aus Andesit",
"block.create.andesite_bricks": "Andesitziegel", "block.create.andesite_bricks": "Andesitziegel",
"block.create.andesite_bricks_slab": "UNLOCALIZED: Andesite Bricks Slab", "block.create.andesite_bricks_slab": "Andesitziegelstufe",
"block.create.andesite_bricks_stairs": "UNLOCALIZED: Andesite Bricks Stairs", "block.create.andesite_bricks_stairs": "Andesitziegeltreppe",
"block.create.andesite_bricks_wall": "UNLOCALIZED: Andesite Bricks Wall", "block.create.andesite_bricks_wall": "Andesitziegelmauer",
"block.create.andesite_casing": "UNLOCALIZED: Andesite Casing", "block.create.andesite_casing": "Andesitrahmen",
"block.create.andesite_cobblestone": "UNLOCALIZED: Andesite Cobblestone", "block.create.andesite_cobblestone": "Andesitbruchstein",
"block.create.andesite_cobblestone_slab": "UNLOCALIZED: Andesite Cobblestone Slab", "block.create.andesite_cobblestone_slab": "Andesitbruchsteinstufe",
"block.create.andesite_cobblestone_stairs": "UNLOCALIZED: Andesite Cobblestone Stairs", "block.create.andesite_cobblestone_stairs": "Andesitbruchsteintreppe",
"block.create.andesite_cobblestone_wall": "UNLOCALIZED: Andesite Cobblestone Wall", "block.create.andesite_cobblestone_wall": "Andesitbruchsteinmauer",
"block.create.andesite_encased_shaft": "UNLOCALIZED: Andesite Encased Shaft", "block.create.andesite_encased_shaft": "Andesitummantelte Welle",
"block.create.andesite_funnel": "UNLOCALIZED: Andesite Funnel", "block.create.andesite_funnel": "Andesit Trichter",
"block.create.andesite_pillar": "UNLOCALIZED: Andesite Pillar", "block.create.andesite_pillar": "Andesitsäule",
"block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel", "block.create.andesite_tunnel": "Andesittunnel",
"block.create.basin": "UNLOCALIZED: Basin", "block.create.basin": "Behälter",
"block.create.belt": "Mechanischer Riemen", "block.create.belt": "Mechanischer Riemen",
"block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window": "UNLOCALIZED: Birch Window",
"block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane",
"block.create.black_sail": "UNLOCALIZED: Black Sail", "block.create.black_sail": "Schwarzes Segel",
"block.create.black_seat": "UNLOCALIZED: Black Seat", "block.create.black_seat": "Schwarzer Sitz",
"block.create.black_valve_handle": "UNLOCALIZED: Black Valve Handle", "block.create.black_valve_handle": "Schwarzer Ventilgriff",
"block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", "block.create.blaze_burner": "Lohenbrenner",
"block.create.blue_sail": "UNLOCALIZED: Blue Sail", "block.create.blue_sail": "Blaues Segel",
"block.create.blue_seat": "UNLOCALIZED: Blue Seat", "block.create.blue_seat": "Blauer Sitz",
"block.create.blue_valve_handle": "UNLOCALIZED: Blue Valve Handle", "block.create.blue_valve_handle": "Blauer Ventilgriff",
"block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", "block.create.brass_belt_funnel": "Riementrichter aus Messing",
"block.create.brass_block": "UNLOCALIZED: Brass Block", "block.create.brass_block": "Messing Block",
"block.create.brass_casing": "UNLOCALIZED: Brass Casing", "block.create.brass_casing": "Messingrahmen",
"block.create.brass_encased_shaft": "UNLOCALIZED: Brass Encased Shaft", "block.create.brass_encased_shaft": "Messingummantelte Welle",
"block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", "block.create.brass_funnel": "Messingtrichter",
"block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", "block.create.brass_tunnel": "Messingtunnel",
"block.create.brown_sail": "UNLOCALIZED: Brown Sail", "block.create.brown_sail": "Braunes Segel",
"block.create.brown_seat": "UNLOCALIZED: Brown Seat", "block.create.brown_seat": "Brauner Sitz",
"block.create.brown_valve_handle": "UNLOCALIZED: Brown Valve Handle", "block.create.brown_valve_handle": "Brauner Ventilgriff",
"block.create.cart_assembler": "UNLOCALIZED: Cart Assembler", "block.create.cart_assembler": "Lohrenmonteur",
"block.create.chiseled_dark_scoria": "UNLOCALIZED: Chiseled Dark Scoria", "block.create.chiseled_dark_scoria": "Gemeißelte dunkle Schlacke",
"block.create.chiseled_dolomite": "UNLOCALIZED: Chiseled Dolomite", "block.create.chiseled_dolomite": "Gemeißeltes Dolomit",
"block.create.chiseled_gabbro": "UNLOCALIZED: Chiseled Gabbro", "block.create.chiseled_gabbro": "Gemeißeltes Gabbro",
"block.create.chiseled_limestone": "UNLOCALIZED: Chiseled Limestone", "block.create.chiseled_limestone": "Gemeißelter Kalkstein",
"block.create.chiseled_scoria": "UNLOCALIZED: Chiseled Scoria", "block.create.chiseled_scoria": "Gemeißelte Schlacke",
"block.create.chiseled_weathered_limestone": "UNLOCALIZED: Chiseled Weathered Limestone", "block.create.chiseled_weathered_limestone": "Gemeißelter verwitterter Kalkstein",
"block.create.chocolate": "UNLOCALIZED: Chocolate", "block.create.chocolate": "Schokolade",
"block.create.chute": "UNLOCALIZED: Chute", "block.create.chute": "Rinne",
"block.create.clockwork_bearing": "UNLOCALIZED: Clockwork Bearing", "block.create.clockwork_bearing": "Uhrwerk-Lager",
"block.create.clutch": "Kupplung", "block.create.clutch": "Kupplung",
"block.create.cogwheel": "Zahnrad", "block.create.cogwheel": "Zahnrad",
"block.create.content_observer": "UNLOCALIZED: Content Observer", "block.create.content_observer": "Inhalts Beobachter",
"block.create.controller_rail": "UNLOCALIZED: Controller Rail", "block.create.controller_rail": "Steureungsschiene",
"block.create.copper_block": "UNLOCALIZED: Copper Block", "block.create.copper_block": "Kupfer Block",
"block.create.copper_casing": "UNLOCALIZED: Copper Casing", "block.create.copper_casing": "Kupferrahmen",
"block.create.copper_ore": "UNLOCALIZED: Copper Ore", "block.create.copper_ore": "Kupfererz",
"block.create.copper_shingles": "UNLOCALIZED: Copper Shingles", "block.create.copper_shingles": "Kupferschindeln",
"block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", "block.create.copper_tiles": "Kupferfliesen",
"block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle", "block.create.copper_valve_handle": "Kupfer Ventilgriff",
"block.create.creative_crate": "Bauplankanonenmacher", "block.create.creative_crate": "Kreative anpassbare Kiste",
"block.create.creative_fluid_tank": "UNLOCALIZED: Creative Fluid Tank", "block.create.creative_fluid_tank": "Kreativer Flüssigkeitstank",
"block.create.creative_motor": "UNLOCALIZED: Creative Motor", "block.create.creative_motor": "Kreativer Motor",
"block.create.crushing_wheel": "Mahlwerkrad", "block.create.crushing_wheel": "Mahlwerkrad",
"block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", "block.create.crushing_wheel_controller": "Mahlwerkrad Steurung",
"block.create.cuckoo_clock": "UNLOCALIZED: Cuckoo Clock", "block.create.cuckoo_clock": "Kuckucksuhr",
"block.create.cyan_sail": "UNLOCALIZED: Cyan Sail", "block.create.cyan_sail": "Türkises Segel",
"block.create.cyan_seat": "UNLOCALIZED: Cyan Seat", "block.create.cyan_seat": "Türkiser Sitz",
"block.create.cyan_valve_handle": "UNLOCALIZED: Cyan Valve Handle", "block.create.cyan_valve_handle": "Türkiser Ventilgriff",
"block.create.dark_oak_window": "UNLOCALIZED: Dark Oak Window", "block.create.dark_oak_window": "Schwarzeichenholzfenster",
"block.create.dark_oak_window_pane": "UNLOCALIZED: Dark Oak Window Pane", "block.create.dark_oak_window_pane": "Schwarzeichenholzfensterscheibe",
"block.create.dark_scoria": "UNLOCALIZED: Dark Scoria", "block.create.dark_scoria": "Dunkle Schlacke",
"block.create.dark_scoria_bricks": "UNLOCALIZED: Dark Scoria Bricks", "block.create.dark_scoria_bricks": "Dunkle Schlackenziegel",
"block.create.dark_scoria_bricks_slab": "UNLOCALIZED: Dark Scoria Bricks Slab", "block.create.dark_scoria_bricks_slab": "Dunkle Schlackenziegelstufe",
"block.create.dark_scoria_bricks_stairs": "UNLOCALIZED: Dark Scoria Bricks Stairs", "block.create.dark_scoria_bricks_stairs": "Dunkle Schlackenziegeltreppe",
"block.create.dark_scoria_bricks_wall": "UNLOCALIZED: Dark Scoria Bricks Wall", "block.create.dark_scoria_bricks_wall": "Dunkle Schlackenziegelmauer",
"block.create.dark_scoria_cobblestone": "UNLOCALIZED: Dark Scoria Cobblestone", "block.create.dark_scoria_cobblestone": "Dunkler Schlackebruchstein",
"block.create.dark_scoria_cobblestone_slab": "UNLOCALIZED: Dark Scoria Cobblestone Slab", "block.create.dark_scoria_cobblestone_slab": "Dunkle Schlackebruchsteinstufe",
"block.create.dark_scoria_cobblestone_stairs": "UNLOCALIZED: Dark Scoria Cobblestone Stairs", "block.create.dark_scoria_cobblestone_stairs": "Dunkle Schlackebruchsteintreppe",
"block.create.dark_scoria_cobblestone_wall": "UNLOCALIZED: Dark Scoria Cobblestone Wall", "block.create.dark_scoria_cobblestone_wall": "Dunkle Schlackebruchsteinmauer",
"block.create.dark_scoria_pillar": "UNLOCALIZED: Dark Scoria Pillar", "block.create.dark_scoria_pillar": "Dunkle Schlackesäule",
"block.create.deployer": "UNLOCALIZED: Deployer", "block.create.deployer": "Einsatzgerät",
"block.create.depot": "UNLOCALIZED: Depot", "block.create.depot": "Depot",
"block.create.diorite_bricks": "Dioritziegel", "block.create.diorite_bricks": "Dioritziegel",
"block.create.diorite_bricks_slab": "UNLOCALIZED: Diorite Bricks Slab", "block.create.diorite_bricks_slab": "Dioritziegelstufe",
"block.create.diorite_bricks_stairs": "UNLOCALIZED: Diorite Bricks Stairs", "block.create.diorite_bricks_stairs": "Dioritziegeltreppe",
"block.create.diorite_bricks_wall": "UNLOCALIZED: Diorite Bricks Wall", "block.create.diorite_bricks_wall": "Dioritziegelmauer",
"block.create.diorite_cobblestone": "UNLOCALIZED: Diorite Cobblestone", "block.create.diorite_cobblestone": "Dioritbruchstein",
"block.create.diorite_cobblestone_slab": "UNLOCALIZED: Diorite Cobblestone Slab", "block.create.diorite_cobblestone_slab": "Dioritbruchsteinstufe",
"block.create.diorite_cobblestone_stairs": "UNLOCALIZED: Diorite Cobblestone Stairs", "block.create.diorite_cobblestone_stairs": "Dioritbruchsteintreppe",
"block.create.diorite_cobblestone_wall": "UNLOCALIZED: Diorite Cobblestone Wall", "block.create.diorite_cobblestone_wall": "Dioritbruchsteinmauer",
"block.create.diorite_pillar": "UNLOCALIZED: Diorite Pillar", "block.create.diorite_pillar": "Dioritsäule",
"block.create.dolomite": "Dolomit", "block.create.dolomite": "Dolomit",
"block.create.dolomite_bricks": "Dolomitziegel", "block.create.dolomite_bricks": "Dolomitziegel",
"block.create.dolomite_bricks_slab": "Dolomitziegelstufe", "block.create.dolomite_bricks_slab": "Dolomitziegelstufe",
"block.create.dolomite_bricks_stairs": "Dolomitziegeltreppe", "block.create.dolomite_bricks_stairs": "Dolomitziegeltreppe",
"block.create.dolomite_bricks_wall": "Dolomitziegelmauer", "block.create.dolomite_bricks_wall": "Dolomitziegelmauer",
"block.create.dolomite_cobblestone": "UNLOCALIZED: Dolomite Cobblestone", "block.create.dolomite_cobblestone": "Dolomitbruchstein",
"block.create.dolomite_cobblestone_slab": "UNLOCALIZED: Dolomite Cobblestone Slab", "block.create.dolomite_cobblestone_slab": "Dolomitbruchsteinstufe",
"block.create.dolomite_cobblestone_stairs": "UNLOCALIZED: Dolomite Cobblestone Stairs", "block.create.dolomite_cobblestone_stairs": "Dolomitbruchsteintreppe",
"block.create.dolomite_cobblestone_wall": "UNLOCALIZED: Dolomite Cobblestone Wall", "block.create.dolomite_cobblestone_wall": "Dolomitbruchsteinmauer",
"block.create.dolomite_pillar": "Dolomitsäule", "block.create.dolomite_pillar": "Dolomitsäule",
"block.create.encased_chain_drive": "UNLOCALIZED: Encased Chain Drive", "block.create.encased_chain_drive": "Ummantelter Kettenriemen",
"block.create.encased_fan": "Eingeschlossener Propeller", "block.create.encased_fan": "Ummantelter Lüfter",
"block.create.encased_fluid_pipe": "UNLOCALIZED: Encased Fluid Pipe", "block.create.encased_fluid_pipe": "Ummanteltes Rohr",
"block.create.fancy_andesite_bricks": "UNLOCALIZED: Fancy Andesite Bricks", "block.create.fancy_andesite_bricks": "Schicke Andesitziegel",
"block.create.fancy_andesite_bricks_slab": "UNLOCALIZED: Fancy Andesite Bricks Slab", "block.create.fancy_andesite_bricks_slab": "Schicke Andesitziegelstufe",
"block.create.fancy_andesite_bricks_stairs": "UNLOCALIZED: Fancy Andesite Bricks Stairs", "block.create.fancy_andesite_bricks_stairs": "Schicke Andesitziegeltreppe",
"block.create.fancy_andesite_bricks_wall": "UNLOCALIZED: Fancy Andesite Bricks Wall", "block.create.fancy_andesite_bricks_wall": "Schicke Andesitziegelmauer",
"block.create.fancy_dark_scoria_bricks": "UNLOCALIZED: Fancy Dark Scoria Bricks", "block.create.fancy_dark_scoria_bricks": "Schicke dunkle Schlackenziegel",
"block.create.fancy_dark_scoria_bricks_slab": "UNLOCALIZED: Fancy Dark Scoria Bricks Slab", "block.create.fancy_dark_scoria_bricks_slab": "Schicke dunkle Schlackenziegelstufe",
"block.create.fancy_dark_scoria_bricks_stairs": "UNLOCALIZED: Fancy Dark Scoria Bricks Stairs", "block.create.fancy_dark_scoria_bricks_stairs": "Schicke dunkle Schlackenziegeltreppe",
"block.create.fancy_dark_scoria_bricks_wall": "UNLOCALIZED: Fancy Dark Scoria Bricks Wall", "block.create.fancy_dark_scoria_bricks_wall": "Schicke dunkle Schlackenziegelmauer",
"block.create.fancy_diorite_bricks": "UNLOCALIZED: Fancy Diorite Bricks", "block.create.fancy_diorite_bricks": "UNLOCALIZED: Fancy Diorite Bricks",
"block.create.fancy_diorite_bricks_slab": "UNLOCALIZED: Fancy Diorite Bricks Slab", "block.create.fancy_diorite_bricks_slab": "UNLOCALIZED: Fancy Diorite Bricks Slab",
"block.create.fancy_diorite_bricks_stairs": "UNLOCALIZED: Fancy Diorite Bricks Stairs", "block.create.fancy_diorite_bricks_stairs": "UNLOCALIZED: Fancy Diorite Bricks Stairs",
@ -145,16 +145,16 @@
"block.create.fancy_weathered_limestone_bricks_slab": "UNLOCALIZED: Fancy Weathered Limestone Bricks Slab", "block.create.fancy_weathered_limestone_bricks_slab": "UNLOCALIZED: Fancy Weathered Limestone Bricks Slab",
"block.create.fancy_weathered_limestone_bricks_stairs": "UNLOCALIZED: Fancy Weathered Limestone Bricks Stairs", "block.create.fancy_weathered_limestone_bricks_stairs": "UNLOCALIZED: Fancy Weathered Limestone Bricks Stairs",
"block.create.fancy_weathered_limestone_bricks_wall": "UNLOCALIZED: Fancy Weathered Limestone Bricks Wall", "block.create.fancy_weathered_limestone_bricks_wall": "UNLOCALIZED: Fancy Weathered Limestone Bricks Wall",
"block.create.fluid_pipe": "UNLOCALIZED: Fluid Pipe", "block.create.fluid_pipe": "Wasserrohr",
"block.create.fluid_tank": "UNLOCALIZED: Fluid Tank", "block.create.fluid_tank": "Wassertank",
"block.create.fluid_valve": "UNLOCALIZED: Fluid Valve", "block.create.fluid_valve": "Flüssigkeitsventil",
"block.create.flywheel": "UNLOCALIZED: Flywheel", "block.create.flywheel": "Schwungrad",
"block.create.framed_glass": "UNLOCALIZED: Framed Glass", "block.create.framed_glass": "Gerahmtes Glas",
"block.create.framed_glass_pane": "UNLOCALIZED: Framed Glass Pane", "block.create.framed_glass_pane": "Gerahmte Glasscheibe",
"block.create.furnace_engine": "UNLOCALIZED: Furnace Engine", "block.create.furnace_engine": "UNLOCALIZED: Furnace Engine",
"block.create.gabbro": "Gabbro", "block.create.gabbro": "Gabbro",
"block.create.gabbro_bricks": "Gabbroziegel", "block.create.gabbro_bricks": "Gabbroziegel",
"block.create.gabbro_bricks_slab": "UNLOCALIZED: Gabbro Bricks Slab", "block.create.gabbro_bricks_slab": "Gabbroziegelstufe",
"block.create.gabbro_bricks_stairs": "Gabbroziegeltreppe", "block.create.gabbro_bricks_stairs": "Gabbroziegeltreppe",
"block.create.gabbro_bricks_wall": "Gabbroziegelmauer", "block.create.gabbro_bricks_wall": "Gabbroziegelmauer",
"block.create.gabbro_cobblestone": "UNLOCALIZED: Gabbro Cobblestone", "block.create.gabbro_cobblestone": "UNLOCALIZED: Gabbro Cobblestone",
@ -162,9 +162,11 @@
"block.create.gabbro_cobblestone_stairs": "UNLOCALIZED: Gabbro Cobblestone Stairs", "block.create.gabbro_cobblestone_stairs": "UNLOCALIZED: Gabbro Cobblestone Stairs",
"block.create.gabbro_cobblestone_wall": "UNLOCALIZED: Gabbro Cobblestone Wall", "block.create.gabbro_cobblestone_wall": "UNLOCALIZED: Gabbro Cobblestone Wall",
"block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar", "block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar",
"block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion",
"block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft",
"block.create.gearbox": "Getriebe", "block.create.gearbox": "Getriebe",
"block.create.gearshift": "Gangschaltung", "block.create.gearshift": "Gangschaltung",
"block.create.glass_fluid_pipe": "UNLOCALIZED: Glass Fluid Pipe", "block.create.glass_fluid_pipe": "Glaswasserrohr",
"block.create.granite_bricks": "Granitziegel", "block.create.granite_bricks": "Granitziegel",
"block.create.granite_bricks_slab": "UNLOCALIZED: Granite Bricks Slab", "block.create.granite_bricks_slab": "UNLOCALIZED: Granite Bricks Slab",
"block.create.granite_bricks_stairs": "UNLOCALIZED: Granite Bricks Stairs", "block.create.granite_bricks_stairs": "UNLOCALIZED: Granite Bricks Stairs",
@ -405,6 +407,7 @@
"block.create.zinc_ore": "UNLOCALIZED: Zinc Ore", "block.create.zinc_ore": "UNLOCALIZED: Zinc Ore",
"entity.create.contraption": "UNLOCALIZED: Contraption", "entity.create.contraption": "UNLOCALIZED: Contraption",
"entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption",
"entity.create.seat": "UNLOCALIZED: Seat", "entity.create.seat": "UNLOCALIZED: Seat",
"entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption",
"entity.create.super_glue": "UNLOCALIZED: Super Glue", "entity.create.super_glue": "UNLOCALIZED: Super Glue",
@ -480,25 +483,25 @@
"item.create.wand_of_symmetry": "Symmetriestab", "item.create.wand_of_symmetry": "Symmetriestab",
"item.create.wheat_flour": "UNLOCALIZED: Wheat Flour", "item.create.wheat_flour": "UNLOCALIZED: Wheat Flour",
"item.create.whisk": "UNLOCALIZED: Whisk", "item.create.whisk": "UNLOCALIZED: Whisk",
"item.create.wrench": "UNLOCALIZED: Wrench", "item.create.wrench": "Schraubenschlüssel",
"item.create.zinc_ingot": "UNLOCALIZED: Zinc Ingot", "item.create.zinc_ingot": "Zinkbarren",
"item.create.zinc_nugget": "UNLOCALIZED: Zinc Nugget", "item.create.zinc_nugget": "Zinkklumpen",
"_": "->------------------------] Advancements [------------------------<-", "_": "->------------------------] Advancements [------------------------<-",
"advancement.create.root": "UNLOCALIZED: Welcome to Create", "advancement.create.root": "Willkommen zu Create",
"advancement.create.root.desc": "UNLOCALIZED: It's time to start building some amazing Contraptions!", "advancement.create.root.desc": "Es ist Zeit mit dem Bauen von tollen Apparaten zu starten!",
"advancement.create.andesite_alloy": "UNLOCALIZED: Alliterations Aplenty", "advancement.create.andesite_alloy": "Alliterationen in Massen",
"advancement.create.andesite_alloy.desc": "UNLOCALIZED: Create's materials have weird names, Andesite Alloy is one of them.", "advancement.create.andesite_alloy.desc": "Create's Materialien haben verrückte Namen, Eisenlegierung ist im Deutschen leider keine.",
"advancement.create.its_alive": "UNLOCALIZED: It's Alive!", "advancement.create.its_alive": "Es ist am leben!",
"advancement.create.its_alive.desc": "UNLOCALIZED: Watch your first kinetic component spin.", "advancement.create.its_alive.desc": "Gucke deinem erstem beweglichen Teil beim drehen zu.",
"advancement.create.shifting_gears": "UNLOCALIZED: Shifting Gears", "advancement.create.shifting_gears": "Wechsel deine Gänge",
"advancement.create.shifting_gears.desc": "UNLOCALIZED: Connect a Large Cogwheel to a Small Cogwheel, allowing you to change the speed of your contraption.", "advancement.create.shifting_gears.desc": "Verbinde ein großes Zahnrad mit einem kleinem, um die Geschwindigkeit deiner Apparate zu verändern.",
"advancement.create.overstressed": "UNLOCALIZED: Overstressed", "advancement.create.overstressed": "Überfordert",
"advancement.create.overstressed.desc": "UNLOCALIZED: Experience the limits of stress firsthand.", "advancement.create.overstressed.desc": "Erfahre die Limits der Belastung aus erster Hand.",
"advancement.create.belt": "UNLOCALIZED: Kelp Drive", "advancement.create.belt": "Befördere es alles",
"advancement.create.belt.desc": "UNLOCALIZED: Connect two shafts with a Mechanical Belt.", "advancement.create.belt.desc": "Verbinde zwei Wllen mit einem Mechanischem Riemen",
"advancement.create.tunnel": "UNLOCALIZED: Take cover!", "advancement.create.tunnel": "UNLOCALIZED: Take cover!",
"advancement.create.tunnel.desc": "UNLOCALIZED: Embellish your mechanical belt with a Tunnel.", "advancement.create.tunnel.desc": "UNLOCALIZED: Embellish your mechanical belt with a Tunnel.",
"advancement.create.splitter_tunnel": "UNLOCALIZED: Divide and Conquer", "advancement.create.splitter_tunnel": "UNLOCALIZED: Divide and Conquer",

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 52", "_": "Missing Localizations: 55",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -162,6 +162,8 @@
"block.create.gabbro_cobblestone_stairs": "반려암 조약돌 계단", "block.create.gabbro_cobblestone_stairs": "반려암 조약돌 계단",
"block.create.gabbro_cobblestone_wall": "반려암 조약돌 담장", "block.create.gabbro_cobblestone_wall": "반려암 조약돌 담장",
"block.create.gabbro_pillar": "반려암 기둥", "block.create.gabbro_pillar": "반려암 기둥",
"block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion",
"block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft",
"block.create.gearbox": "기어박스", "block.create.gearbox": "기어박스",
"block.create.gearshift": "기어쉬프트", "block.create.gearshift": "기어쉬프트",
"block.create.glass_fluid_pipe": "액체 파이프", "block.create.glass_fluid_pipe": "액체 파이프",
@ -405,6 +407,7 @@
"block.create.zinc_ore": "아연 광석", "block.create.zinc_ore": "아연 광석",
"entity.create.contraption": "장치", "entity.create.contraption": "장치",
"entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption",
"entity.create.seat": "좌석", "entity.create.seat": "좌석",
"entity.create.stationary_contraption": "고정된 장치", "entity.create.stationary_contraption": "고정된 장치",
"entity.create.super_glue": "강력 접착제", "entity.create.super_glue": "강력 접착제",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 1152", "_": "Missing Localizations: 1155",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -162,6 +162,8 @@
"block.create.gabbro_cobblestone_stairs": "UNLOCALIZED: Gabbro Cobblestone Stairs", "block.create.gabbro_cobblestone_stairs": "UNLOCALIZED: Gabbro Cobblestone Stairs",
"block.create.gabbro_cobblestone_wall": "UNLOCALIZED: Gabbro Cobblestone Wall", "block.create.gabbro_cobblestone_wall": "UNLOCALIZED: Gabbro Cobblestone Wall",
"block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar", "block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar",
"block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion",
"block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft",
"block.create.gearbox": "Versnellingsbak", "block.create.gearbox": "Versnellingsbak",
"block.create.gearshift": "Versnellingspook", "block.create.gearshift": "Versnellingspook",
"block.create.glass_fluid_pipe": "UNLOCALIZED: Glass Fluid Pipe", "block.create.glass_fluid_pipe": "UNLOCALIZED: Glass Fluid Pipe",
@ -405,6 +407,7 @@
"block.create.zinc_ore": "UNLOCALIZED: Zinc Ore", "block.create.zinc_ore": "UNLOCALIZED: Zinc Ore",
"entity.create.contraption": "UNLOCALIZED: Contraption", "entity.create.contraption": "UNLOCALIZED: Contraption",
"entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption",
"entity.create.seat": "UNLOCALIZED: Seat", "entity.create.seat": "UNLOCALIZED: Seat",
"entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption",
"entity.create.super_glue": "UNLOCALIZED: Super Glue", "entity.create.super_glue": "UNLOCALIZED: Super Glue",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 1218", "_": "Missing Localizations: 1221",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -162,6 +162,8 @@
"block.create.gabbro_cobblestone_stairs": "UNLOCALIZED: Gabbro Cobblestone Stairs", "block.create.gabbro_cobblestone_stairs": "UNLOCALIZED: Gabbro Cobblestone Stairs",
"block.create.gabbro_cobblestone_wall": "UNLOCALIZED: Gabbro Cobblestone Wall", "block.create.gabbro_cobblestone_wall": "UNLOCALIZED: Gabbro Cobblestone Wall",
"block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar", "block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar",
"block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion",
"block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft",
"block.create.gearbox": "Caixa de Transmissão", "block.create.gearbox": "Caixa de Transmissão",
"block.create.gearshift": "Câmbio", "block.create.gearshift": "Câmbio",
"block.create.glass_fluid_pipe": "UNLOCALIZED: Glass Fluid Pipe", "block.create.glass_fluid_pipe": "UNLOCALIZED: Glass Fluid Pipe",
@ -405,6 +407,7 @@
"block.create.zinc_ore": "UNLOCALIZED: Zinc Ore", "block.create.zinc_ore": "UNLOCALIZED: Zinc Ore",
"entity.create.contraption": "UNLOCALIZED: Contraption", "entity.create.contraption": "UNLOCALIZED: Contraption",
"entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption",
"entity.create.seat": "UNLOCALIZED: Seat", "entity.create.seat": "UNLOCALIZED: Seat",
"entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption",
"entity.create.super_glue": "UNLOCALIZED: Super Glue", "entity.create.super_glue": "UNLOCALIZED: Super Glue",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 2", "_": "Missing Localizations: 5",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -20,7 +20,7 @@
"block.create.andesite_cobblestone_slab": "Андезит-булыжниковая плита", "block.create.andesite_cobblestone_slab": "Андезит-булыжниковая плита",
"block.create.andesite_cobblestone_stairs": "Андезит-булыжниковые ступени", "block.create.andesite_cobblestone_stairs": "Андезит-булыжниковые ступени",
"block.create.andesite_cobblestone_wall": "Андезит-булыжниковая стена", "block.create.andesite_cobblestone_wall": "Андезит-булыжниковая стена",
"block.create.andesite_encased_shaft": "Андезитовый вал в кожухе", "block.create.andesite_encased_shaft": "Вал в андезитовом корпусе",
"block.create.andesite_funnel": "Андезитовая воронка", "block.create.andesite_funnel": "Андезитовая воронка",
"block.create.andesite_pillar": "Андезитовая колонна", "block.create.andesite_pillar": "Андезитовая колонна",
"block.create.andesite_tunnel": "Андезитовый туннель", "block.create.andesite_tunnel": "Андезитовый туннель",
@ -30,20 +30,20 @@
"block.create.birch_window_pane": "Панель берёзового окна", "block.create.birch_window_pane": "Панель берёзового окна",
"block.create.black_sail": "Чёрный парус", "block.create.black_sail": "Чёрный парус",
"block.create.black_seat": "Чёрное сиденье", "block.create.black_seat": "Чёрное сиденье",
"block.create.black_valve_handle": "Чёрная ручка крана", "block.create.black_valve_handle": "Чёрный ручной вентиль",
"block.create.blaze_burner": "Горелка Всполоха", "block.create.blaze_burner": "Горелка Всполоха",
"block.create.blue_sail": "Синий парус", "block.create.blue_sail": "Синий парус",
"block.create.blue_seat": "Синее сиденье", "block.create.blue_seat": "Синее сиденье",
"block.create.blue_valve_handle": "Синяя ручка крана", "block.create.blue_valve_handle": "Синий ручной вентиль",
"block.create.brass_belt_funnel": "Латунная конвейерная воронка", "block.create.brass_belt_funnel": "Латунная конвейерная воронка",
"block.create.brass_block": "Латунный блок", "block.create.brass_block": "Латунный блок",
"block.create.brass_casing": "Латунный корпус", "block.create.brass_casing": "Латунный корпус",
"block.create.brass_encased_shaft": "Латунный вал в кожухе", "block.create.brass_encased_shaft": "Вал в латунном корпусе",
"block.create.brass_funnel": "Латунная воронка", "block.create.brass_funnel": "Латунная воронка",
"block.create.brass_tunnel": "Латунный туннель", "block.create.brass_tunnel": "Латунный туннель",
"block.create.brown_sail": "Коричневый парус", "block.create.brown_sail": "Коричневый парус",
"block.create.brown_seat": "Коричневое сиденье", "block.create.brown_seat": "Коричневое сиденье",
"block.create.brown_valve_handle": "Коричневая ручка крана", "block.create.brown_valve_handle": "Коричневый ручной вентиль",
"block.create.cart_assembler": "Сборщик вагонеток", "block.create.cart_assembler": "Сборщик вагонеток",
"block.create.chiseled_dark_scoria": "Резной тёмный пепел", "block.create.chiseled_dark_scoria": "Резной тёмный пепел",
"block.create.chiseled_dolomite": "Резной доломит", "block.create.chiseled_dolomite": "Резной доломит",
@ -63,20 +63,20 @@
"block.create.copper_ore": "Медная руда", "block.create.copper_ore": "Медная руда",
"block.create.copper_shingles": "Медная черепица", "block.create.copper_shingles": "Медная черепица",
"block.create.copper_tiles": "Медная плитка", "block.create.copper_tiles": "Медная плитка",
"block.create.copper_valve_handle": "Медная ручка крана", "block.create.copper_valve_handle": "Медный ручной вентиль",
"block.create.creative_crate": "Творческий ящик", "block.create.creative_crate": "Творческий ящик",
"block.create.creative_fluid_tank": "Творческиф жидкостный бак", "block.create.creative_fluid_tank": "Творческий жидкостный бак",
"block.create.creative_motor": "Творческий мотор", "block.create.creative_motor": "Творческий мотор",
"block.create.crushing_wheel": "Колесо дробления", "block.create.crushing_wheel": "Колесо дробления",
"block.create.crushing_wheel_controller": "Контроллер колеса дробления", "block.create.crushing_wheel_controller": "Контроллер колеса дробления",
"block.create.cuckoo_clock": "Часы с кукушкой", "block.create.cuckoo_clock": "Часы с кукушкой",
"block.create.cyan_sail": "Бирюзовый парус", "block.create.cyan_sail": "Бирюзовый парус",
"block.create.cyan_seat": "Бирюзовое сииденье", "block.create.cyan_seat": "Бирюзовое сииденье",
"block.create.cyan_valve_handle": "Бирюзовая ручка крана", "block.create.cyan_valve_handle": "Бирюзовый ручной вентиль",
"block.create.dark_oak_window": "Окно из тёмного дуба", "block.create.dark_oak_window": "Окно из тёмного дуба",
"block.create.dark_oak_window_pane": "Панель из окна из тёмного дуб", "block.create.dark_oak_window_pane": "Панель из окна из тёмного дуб",
"block.create.dark_scoria": "Тёмный пепел", "block.create.dark_scoria": "Тёмный пепел",
"block.create.dark_scoria_bricks": "Тёмные пепельный кирпич", "block.create.dark_scoria_bricks": "Тёмный пепельный кирпич",
"block.create.dark_scoria_bricks_slab": "Плита из тёмного пепельного кирпича", "block.create.dark_scoria_bricks_slab": "Плита из тёмного пепельного кирпича",
"block.create.dark_scoria_bricks_stairs": "Ступени из тёмного пепельного кирпича", "block.create.dark_scoria_bricks_stairs": "Ступени из тёмного пепельного кирпича",
"block.create.dark_scoria_bricks_wall": "Стена из тёмного пепельного кирпича", "block.create.dark_scoria_bricks_wall": "Стена из тёмного пепельного кирпича",
@ -106,9 +106,9 @@
"block.create.dolomite_cobblestone_stairs": "Ступени доломит-булыжника", "block.create.dolomite_cobblestone_stairs": "Ступени доломит-булыжника",
"block.create.dolomite_cobblestone_wall": "Стена доломит-булыжника", "block.create.dolomite_cobblestone_wall": "Стена доломит-булыжника",
"block.create.dolomite_pillar": "Доломитовая колонна", "block.create.dolomite_pillar": "Доломитовая колонна",
"block.create.encased_chain_drive": "Цепной привод в кожухе", "block.create.encased_chain_drive": "Цепной привод в корпусе",
"block.create.encased_fan": "Вентилятор в кожухе", "block.create.encased_fan": "Вентилятор в корпусе",
"block.create.encased_fluid_pipe": "Жидкостная труба в кожухе", "block.create.encased_fluid_pipe": "Жидкостная труба в корпусе",
"block.create.fancy_andesite_bricks": "Красивый андезитовый кирпич", "block.create.fancy_andesite_bricks": "Красивый андезитовый кирпич",
"block.create.fancy_andesite_bricks_slab": "Плита из красивого андезитового кирпича", "block.create.fancy_andesite_bricks_slab": "Плита из красивого андезитового кирпича",
"block.create.fancy_andesite_bricks_stairs": "Ступени из красивого андезитового кирпича", "block.create.fancy_andesite_bricks_stairs": "Ступени из красивого андезитового кирпича",
@ -147,7 +147,7 @@
"block.create.fancy_weathered_limestone_bricks_wall": "Стена из красивого выветренного известнякового кирпича", "block.create.fancy_weathered_limestone_bricks_wall": "Стена из красивого выветренного известнякового кирпича",
"block.create.fluid_pipe": "Жидкостная труба", "block.create.fluid_pipe": "Жидкостная труба",
"block.create.fluid_tank": "Жидкостный бак", "block.create.fluid_tank": "Жидкостный бак",
"block.create.fluid_valve": "Жидкостный вентиль", "block.create.fluid_valve": "Жидкостный клапан",
"block.create.flywheel": "Маховик", "block.create.flywheel": "Маховик",
"block.create.framed_glass": "Обрамлённое стекло", "block.create.framed_glass": "Обрамлённое стекло",
"block.create.framed_glass_pane": "Обрамлённая стеклянная панель", "block.create.framed_glass_pane": "Обрамлённая стеклянная панель",
@ -162,6 +162,8 @@
"block.create.gabbro_cobblestone_stairs": "Ступени из габбро-булыжника", "block.create.gabbro_cobblestone_stairs": "Ступени из габбро-булыжника",
"block.create.gabbro_cobblestone_wall": "Стена из габбро-булыжника", "block.create.gabbro_cobblestone_wall": "Стена из габбро-булыжника",
"block.create.gabbro_pillar": "Габбро колонна", "block.create.gabbro_pillar": "Габбро колонна",
"block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion",
"block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft",
"block.create.gearbox": "Коробка передач", "block.create.gearbox": "Коробка передач",
"block.create.gearshift": "Реверсивный механизм", "block.create.gearshift": "Реверсивный механизм",
"block.create.glass_fluid_pipe": "Стеклянная жидкостная труба", "block.create.glass_fluid_pipe": "Стеклянная жидкостная труба",
@ -176,15 +178,15 @@
"block.create.granite_pillar": "Гранитная колонна", "block.create.granite_pillar": "Гранитная колонна",
"block.create.gray_sail": "Серый парус", "block.create.gray_sail": "Серый парус",
"block.create.gray_seat": "Серое сиденье", "block.create.gray_seat": "Серое сиденье",
"block.create.gray_valve_handle": "Серная ручка крана", "block.create.gray_valve_handle": "Серый ручной вентиль",
"block.create.green_sail": "Зелёный парус", "block.create.green_sail": "Зелёный парус",
"block.create.green_seat": "Зелёное сиденье", "block.create.green_seat": "Зелёное сиденье",
"block.create.green_valve_handle": "Зелёная ручка крана", "block.create.green_valve_handle": "Зелёный ручной вентиль",
"block.create.hand_crank": "Рукоятка", "block.create.hand_crank": "Рукоятка",
"block.create.honey": "Мёд", "block.create.honey": "Мёд",
"block.create.horizontal_framed_glass": "Горизонтальное обрамлённое стекло", "block.create.horizontal_framed_glass": "Горизонтальное обрамлённое стекло",
"block.create.horizontal_framed_glass_pane": "Горизонтальная обрамлённая стеклянная панель", "block.create.horizontal_framed_glass_pane": "Горизонтальная обрамлённая стеклянная панель",
"block.create.hose_pulley": "Шкив для шланга", "block.create.hose_pulley": "Шкив с шлангом",
"block.create.item_drain": "Предметный осушитель", "block.create.item_drain": "Предметный осушитель",
"block.create.jungle_window": "Окно из тропического дерева", "block.create.jungle_window": "Окно из тропического дерева",
"block.create.jungle_window_pane": "Панель окна из тропического дерева", "block.create.jungle_window_pane": "Панель окна из тропического дерева",
@ -200,13 +202,13 @@
"block.create.layered_weathered_limestone": "Слоистый выветренный известняк", "block.create.layered_weathered_limestone": "Слоистый выветренный известняк",
"block.create.light_blue_sail": "Голубой парус", "block.create.light_blue_sail": "Голубой парус",
"block.create.light_blue_seat": "Голубое сиденье", "block.create.light_blue_seat": "Голубое сиденье",
"block.create.light_blue_valve_handle": "Голубая ручка крана", "block.create.light_blue_valve_handle": "Голубой ручной вентиль",
"block.create.light_gray_sail": "Светло-серый парус", "block.create.light_gray_sail": "Светло-серый парус",
"block.create.light_gray_seat": "Светло-серое сиденье", "block.create.light_gray_seat": "Светло-серое сиденье",
"block.create.light_gray_valve_handle": "Светло-серая ручка крана", "block.create.light_gray_valve_handle": "Светло-серый ручной вентиль",
"block.create.lime_sail": "Лаймовый парус", "block.create.lime_sail": "Лаймовый парус",
"block.create.lime_seat": "Лаймовое сиденье", "block.create.lime_seat": "Лаймовое сиденье",
"block.create.lime_valve_handle": "Лаймовая ручка крана", "block.create.lime_valve_handle": "Лаймовый ручной вентиль",
"block.create.limesand": "Известковый песок", "block.create.limesand": "Известковый песок",
"block.create.limestone": "Известняк", "block.create.limestone": "Известняк",
"block.create.limestone_bricks": "Известняковый кирпич", "block.create.limestone_bricks": "Известняковый кирпич",
@ -222,7 +224,7 @@
"block.create.lit_blaze_burner": "Зажжёная горелка Всполоха", "block.create.lit_blaze_burner": "Зажжёная горелка Всполоха",
"block.create.magenta_sail": "Пурпурный парус", "block.create.magenta_sail": "Пурпурный парус",
"block.create.magenta_seat": "Пурпурное сиденье", "block.create.magenta_seat": "Пурпурное сиденье",
"block.create.magenta_valve_handle": "Пурпурная ручка крана", "block.create.magenta_valve_handle": "Пурпурный ручной вентиль",
"block.create.mechanical_arm": "Механическая рука", "block.create.mechanical_arm": "Механическая рука",
"block.create.mechanical_bearing": "Механический вращатель", "block.create.mechanical_bearing": "Механический вращатель",
"block.create.mechanical_crafter": "Механический крафтер", "block.create.mechanical_crafter": "Механический крафтер",
@ -235,7 +237,7 @@
"block.create.mechanical_press": "Механический пресс", "block.create.mechanical_press": "Механический пресс",
"block.create.mechanical_pump": "Механическая помпа", "block.create.mechanical_pump": "Механическая помпа",
"block.create.mechanical_saw": "Механическая пила", "block.create.mechanical_saw": "Механическая пила",
"block.create.metal_bracket": "Металлический кронштейн", "block.create.metal_bracket": "Металлическая скоба",
"block.create.millstone": "Жернов", "block.create.millstone": "Жернов",
"block.create.minecart_anchor": "Вагонеточный якорь", "block.create.minecart_anchor": "Вагонеточный якорь",
"block.create.mossy_andesite": "Замшелый андезит", "block.create.mossy_andesite": "Замшелый андезит",
@ -255,7 +257,7 @@
"block.create.oak_window_pane": "Панель из дубового окна", "block.create.oak_window_pane": "Панель из дубового окна",
"block.create.orange_sail": "Оранжевый парус", "block.create.orange_sail": "Оранжевый парус",
"block.create.orange_seat": "Оранжевое сиденье", "block.create.orange_seat": "Оранжевое сиденье",
"block.create.orange_valve_handle": "Оранжевая ручка крана", "block.create.orange_valve_handle": "Оранжевый ручной вентиль",
"block.create.ornate_iron_window": "Украшенное железное окно", "block.create.ornate_iron_window": "Украшенное железное окно",
"block.create.ornate_iron_window_pane": "Панель из украшенного железного окна", "block.create.ornate_iron_window_pane": "Панель из украшенного железного окна",
"block.create.overgrown_andesite": "Заросший андезит", "block.create.overgrown_andesite": "Заросший андезит",
@ -305,7 +307,7 @@
"block.create.paved_weathered_limestone_wall": "Стена из мощёного выветренного известняка", "block.create.paved_weathered_limestone_wall": "Стена из мощёного выветренного известняка",
"block.create.pink_sail": "Розовый парус", "block.create.pink_sail": "Розовый парус",
"block.create.pink_seat": "Розовое сиденье", "block.create.pink_seat": "Розовое сиденье",
"block.create.pink_valve_handle": "Розовая ручка крана", "block.create.pink_valve_handle": "Розовый ручной вентиль",
"block.create.piston_extension_pole": "Удлинитель поршня", "block.create.piston_extension_pole": "Удлинитель поршня",
"block.create.polished_dark_scoria": "Полированный тёмный пепел", "block.create.polished_dark_scoria": "Полированный тёмный пепел",
"block.create.polished_dark_scoria_slab": "Плита из полированного тёмного пепла", "block.create.polished_dark_scoria_slab": "Плита из полированного тёмного пепла",
@ -335,15 +337,15 @@
"block.create.portable_storage_interface": "Портативный интерфейс хранения", "block.create.portable_storage_interface": "Портативный интерфейс хранения",
"block.create.powered_latch": "Механизированная защёлка", "block.create.powered_latch": "Механизированная защёлка",
"block.create.powered_toggle_latch": "Механизированная рычаг-защёлка", "block.create.powered_toggle_latch": "Механизированная рычаг-защёлка",
"block.create.pulley_magnet": "Шкивный магнит", "block.create.pulley_magnet": "Магнитный шкив",
"block.create.pulse_repeater": "Импульсный повторитель", "block.create.pulse_repeater": "Импульсный повторитель",
"block.create.purple_sail": "Фиолетовый парус", "block.create.purple_sail": "Фиолетовый парус",
"block.create.purple_seat": "Фиолетовое сиденье", "block.create.purple_seat": "Фиолетовое сиденье",
"block.create.purple_valve_handle": "Фиолетовая ручка крана", "block.create.purple_valve_handle": "Фиолетовый ручной вентиль",
"block.create.radial_chassis": "Радиальное шасси", "block.create.radial_chassis": "Радиальное шасси",
"block.create.red_sail": "Красный парус", "block.create.red_sail": "Красный парус",
"block.create.red_seat": "Красное сиденье", "block.create.red_seat": "Красное сиденье",
"block.create.red_valve_handle": "Красная ручка крана", "block.create.red_valve_handle": "Красный ручной вентиль",
"block.create.redstone_contact": "Контакт сигнала красного камня", "block.create.redstone_contact": "Контакт сигнала красного камня",
"block.create.redstone_link": "Беспроводной передатчик сигнала красного камня", "block.create.redstone_link": "Беспроводной передатчик сигнала красного камня",
"block.create.refined_radiance_casing": "Сияющий корпус", "block.create.refined_radiance_casing": "Сияющий корпус",
@ -366,12 +368,12 @@
"block.create.scoria_pillar": "Колонна из пепла", "block.create.scoria_pillar": "Колонна из пепла",
"block.create.secondary_linear_chassis": "Вторичное линейное шасси", "block.create.secondary_linear_chassis": "Вторичное линейное шасси",
"block.create.sequenced_gearshift": "Последовательный переключатель передач", "block.create.sequenced_gearshift": "Последовательный переключатель передач",
"block.create.shadow_steel_casing": "Теневой кожух", "block.create.shadow_steel_casing": "Теневой корпус",
"block.create.shaft": "Вал", "block.create.shaft": "Вал",
"block.create.smart_chute": "UNLOCALIZED: Smart Chute", "block.create.smart_chute": "UNLOCALIZED: Smart Chute",
"block.create.smart_fluid_pipe": "Умная жидкостная труба", "block.create.smart_fluid_pipe": "Умная жидкостная труба",
"block.create.speedometer": "Спидометр", "block.create.speedometer": "Спидометр",
"block.create.spout": "Слив", "block.create.spout": "Дозатор",
"block.create.spruce_window": "Еловое окно", "block.create.spruce_window": "Еловое окно",
"block.create.spruce_window_pane": "Панель из елового окна", "block.create.spruce_window_pane": "Панель из елового окна",
"block.create.sticky_mechanical_piston": "Липкий механический поршень", "block.create.sticky_mechanical_piston": "Липкий механический поршень",
@ -395,17 +397,18 @@
"block.create.weathered_limestone_pillar": "Колонна из выветренного известняка", "block.create.weathered_limestone_pillar": "Колонна из выветренного известняка",
"block.create.white_sail": "Белый парус", "block.create.white_sail": "Белый парус",
"block.create.white_seat": "Белое сиденье", "block.create.white_seat": "Белое сиденье",
"block.create.white_valve_handle": "Белая ручка крана", "block.create.white_valve_handle": "Белый ручной вентиль",
"block.create.windmill_bearing": "Подшипник ветряной мельницы", "block.create.windmill_bearing": "Подшипник ветряной мельницы",
"block.create.wooden_bracket": "Деревянный кронштейн", "block.create.wooden_bracket": "Деревянная скоба",
"block.create.yellow_sail": "Жёлтый парус", "block.create.yellow_sail": "Жёлтый парус",
"block.create.yellow_seat": "Жёлтое сиденье", "block.create.yellow_seat": "Жёлтое сиденье",
"block.create.yellow_valve_handle": "Жёлтая ручка крана", "block.create.yellow_valve_handle": "Жёлтый ручной вентиль",
"block.create.zinc_block": "Цинковый блок", "block.create.zinc_block": "Цинковый блок",
"block.create.zinc_ore": "Цинковая руда", "block.create.zinc_ore": "Цинковая руда",
"entity.create.contraption": "Штуковина", "entity.create.contraption": "Штуковина",
"entity.create.seat": "сиденье", "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption",
"entity.create.seat": "Сиденье",
"entity.create.stationary_contraption": "Стационарная штуковина", "entity.create.stationary_contraption": "Стационарная штуковина",
"entity.create.super_glue": "Супер-клей", "entity.create.super_glue": "Супер-клей",
@ -427,25 +430,25 @@
"item.create.chest_minecart_contraption": "Сундуко-вагонеточная штуковина", "item.create.chest_minecart_contraption": "Сундуко-вагонеточная штуковина",
"item.create.chocolate_bucket": "Ведро шоколада", "item.create.chocolate_bucket": "Ведро шоколада",
"item.create.chromatic_compound": "Хроматический компаунд", "item.create.chromatic_compound": "Хроматический компаунд",
"item.create.cinder_flour": "Пепельная мука", "item.create.cinder_flour": "Незераковая пыль",
"item.create.copper_ingot": "Медный слиток", "item.create.copper_ingot": "Медный слиток",
"item.create.copper_nugget": "Кусочек меди", "item.create.copper_nugget": "Кусочек меди",
"item.create.copper_sheet": "Медный лист", "item.create.copper_sheet": "Медный лист",
"item.create.crafter_slot_cover": "Крышка на слот крафтера", "item.create.crafter_slot_cover": "Крышка на слот крафтера",
"item.create.crushed_aluminum_ore": "Измельчённая алюминиевая руда", "item.create.crushed_aluminum_ore": "Измельчённая алюминиевая руда",
"item.create.crushed_brass": "Дробленая латунь", "item.create.crushed_brass": "Дроблёная латунь",
"item.create.crushed_copper_ore": "Измельчённая медная руда", "item.create.crushed_copper_ore": "Дроблёная медная руда",
"item.create.crushed_gold_ore": "Измельчённая золотая руда", "item.create.crushed_gold_ore": "Дроблёная золотая руда",
"item.create.crushed_iron_ore": "Измельчённая железная руда", "item.create.crushed_iron_ore": "Дроблёная железная руда",
"item.create.crushed_lead_ore": "Измельчённая свинцовая руда", "item.create.crushed_lead_ore": "Дроблёная свинцовая руда",
"item.create.crushed_nickel_ore": "Измельчённая никелевая руда", "item.create.crushed_nickel_ore": "Дроблёная никелевая руда",
"item.create.crushed_osmium_ore": "Измельчённая осмиевая руда", "item.create.crushed_osmium_ore": "Дроблёная осмиевая руда",
"item.create.crushed_platinum_ore": "Измельчённая платиновая руда", "item.create.crushed_platinum_ore": "Дроблёная платиновая руда",
"item.create.crushed_quicksilver_ore": "Измельчённая ртутная руда", "item.create.crushed_quicksilver_ore": "Дроблёная ртутная руда",
"item.create.crushed_silver_ore": "Измельчённая серебрянная руда", "item.create.crushed_silver_ore": "Дроблёная серебрянная руда",
"item.create.crushed_tin_ore": "Измельчённая оловянная руда", "item.create.crushed_tin_ore": "Дроблёная оловянная руда",
"item.create.crushed_uranium_ore": "Измельчённая урановая руда", "item.create.crushed_uranium_ore": "Дроблёная урановая руда",
"item.create.crushed_zinc_ore": "Измельчённая цинковая руда", "item.create.crushed_zinc_ore": "Дроблёная цинковая руда",
"item.create.deforester": "Уничтожитель леса", "item.create.deforester": "Уничтожитель леса",
"item.create.dough": "Тесто", "item.create.dough": "Тесто",
"item.create.electron_tube": "Электронная лампа", "item.create.electron_tube": "Электронная лампа",
@ -500,15 +503,15 @@
"advancement.create.belt": "Передайте за проезд!", "advancement.create.belt": "Передайте за проезд!",
"advancement.create.belt.desc": "Соедините два вала с помощью механического ремня.", "advancement.create.belt.desc": "Соедините два вала с помощью механического ремня.",
"advancement.create.tunnel": "В укрытие!", "advancement.create.tunnel": "В укрытие!",
"advancement.create.tunnel.desc": "Украсьте свой механический ремень Туннелем.", "advancement.create.tunnel.desc": "Украсьте свой конвейер туннелем.",
"advancement.create.splitter_tunnel": "Разделяй и властвуй", "advancement.create.splitter_tunnel": "Разделяй и властвуй",
"advancement.create.splitter_tunnel.desc": "Создайте разделитель из группы латунных туннелей..", "advancement.create.splitter_tunnel.desc": "Создайте разделитель из группы латунных туннелей.",
"advancement.create.chute": "Упало", "advancement.create.chute": "Упало",
"advancement.create.chute.desc": "Разместите желоб, вертикальный аналог ремня.", "advancement.create.chute.desc": "Разместите желоб, вертикальный аналог конвейера.",
"advancement.create.upward_chute": "Воздушное похищение", "advancement.create.upward_chute": "Воздушное похищение",
"advancement.create.upward_chute.desc": "Посмотрите как предмет засасывается в желоб с вентилятором.", "advancement.create.upward_chute.desc": "Посмотрите как предмет засасывается в желоб с вентилятором.",
"advancement.create.belt_funnel": "Болтающиеся воронки", "advancement.create.belt_funnel": "Болтающиеся воронки",
"advancement.create.belt_funnel.desc": "Поместите воронку боком, сверху ремня или депо, чтобы создать её специальный тип.", "advancement.create.belt_funnel.desc": "Поместите воронку боком, сверху конвейера или депо, чтобы создать её специальный тип.",
"advancement.create.belt_funnel_kiss": "Механический ужин", "advancement.create.belt_funnel_kiss": "Механический ужин",
"advancement.create.belt_funnel_kiss.desc": "Заставте две смонтированные на ремнях воронки поцеловаться.", "advancement.create.belt_funnel_kiss.desc": "Заставте две смонтированные на ремнях воронки поцеловаться.",
"advancement.create.fan": "Механический маг воздуха", "advancement.create.fan": "Механический маг воздуха",
@ -528,9 +531,9 @@
"advancement.create.stressometer": "Так сильно?", "advancement.create.stressometer": "Так сильно?",
"advancement.create.stressometer.desc": "Поставьте и подключите динамометр. Посмотрите на динамометр через очки, чтобы прочитать точное значение.", "advancement.create.stressometer.desc": "Поставьте и подключите динамометр. Посмотрите на динамометр через очки, чтобы прочитать точное значение.",
"advancement.create.aesthetics": "Бах! Эстетично!", "advancement.create.aesthetics": "Бах! Эстетично!",
"advancement.create.aesthetics.desc": "Разместите кронштейн на валу, трубе или шестерне.", "advancement.create.aesthetics.desc": "Разместите скобы на валу, трубе или шестерне.",
"advancement.create.reinforced": "Бах! Усилено!", "advancement.create.reinforced": "Бах! Усилено!",
"advancement.create.reinforced.desc": "Разместите подходящий блок корпуса на вал, трубу и механический ремень.", "advancement.create.reinforced.desc": "Разместите подходящий блок корпуса на вал, трубу и конвейер.",
"advancement.create.water_wheel": "Гидравлика", "advancement.create.water_wheel": "Гидравлика",
"advancement.create.water_wheel.desc": "Поставьте водяное колесо и попытайтесь заставить его вращаться!", "advancement.create.water_wheel.desc": "Поставьте водяное колесо и попытайтесь заставить его вращаться!",
"advancement.create.chocolate_wheel": "Вкусная сила", "advancement.create.chocolate_wheel": "Вкусная сила",
@ -566,15 +569,15 @@
"advancement.create.compact": "Автоматическое уплотнение", "advancement.create.compact": "Автоматическое уплотнение",
"advancement.create.compact.desc": "Используйте пресс и чашу для уплотнения некоторых предметов.", "advancement.create.compact.desc": "Используйте пресс и чашу для уплотнения некоторых предметов.",
"advancement.create.brass": "Действительный сплав", "advancement.create.brass": "Действительный сплав",
"advancement.create.brass.desc": "Используйте измельчённую медь и измельчённый цинк, чтобы создать немного латуни.", "advancement.create.brass.desc": "Используйте дроблёную медь и дроблёный цинк, чтобы создать немного латуни.",
"advancement.create.brass_casing": "Бронзовый век", "advancement.create.brass_casing": "Бронзовый век",
"advancement.create.brass_casing.desc": "Используйте только что полученную латунь и немного дерева, чтобы создать более продвинутый корпус.", "advancement.create.brass_casing.desc": "Используйте только что полученную латунь и немного дерева, чтобы создать более продвинутый корпус.",
"advancement.create.copper_casing": "Медный век", "advancement.create.copper_casing": "Медный век",
"advancement.create.copper_casing.desc": "Используйте несколько медных листов для создания медного корпуса.", "advancement.create.copper_casing.desc": "Используйте несколько медных листов для создания медного корпуса.",
"advancement.create.spout": "Буль", "advancement.create.spout": "Буль",
"advancement.create.spout.desc": "Посмотрите как предмет наполняется с помощью Слива.", "advancement.create.spout.desc": "Посмотрите как предмет наполняется с помощью Дозатора.",
"advancement.create.spout_potion": "Основательная пивоварня", "advancement.create.spout_potion": "Основательная пивоварня",
"advancement.create.spout_potion.desc": "Посмотрите как Слив наполняет бутылку зельем.", "advancement.create.spout_potion.desc": "Посмотрите как Дозатор наполняет бутылку зельем.",
"advancement.create.chocolate": "Сказочный мир", "advancement.create.chocolate": "Сказочный мир",
"advancement.create.chocolate.desc": "Получите ведро расплавленного шоколада.", "advancement.create.chocolate.desc": "Получите ведро расплавленного шоколада.",
"advancement.create.item_drain": "Осушение", "advancement.create.item_drain": "Осушение",
@ -666,16 +669,16 @@
"create.recipe.crushing": "Измельчение", "create.recipe.crushing": "Измельчение",
"create.recipe.milling": "Помол", "create.recipe.milling": "Помол",
"create.recipe.fan_washing": "Объёмная промывка", "create.recipe.fan_washing": "Массовая промывка",
"create.recipe.fan_washing.fan": "Вентилятор за текущей водой", "create.recipe.fan_washing.fan": "Вентилятор за текущей водой",
"create.recipe.fan_smoking": "Объёмное копчение", "create.recipe.fan_smoking": "Массовое копчение",
"create.recipe.fan_smoking.fan": "Вентилятор за горящим огнём", "create.recipe.fan_smoking.fan": "Вентилятор за горящим огнём",
"create.recipe.fan_blasting": "Объёмное плавление", "create.recipe.fan_blasting": "Массовое плавление",
"create.recipe.fan_blasting.fan": "Вентилятор за текущей лавой", "create.recipe.fan_blasting.fan": "Вентилятор за текущей лавой",
"create.recipe.pressing": "Прессование", "create.recipe.pressing": "Прессование",
"create.recipe.mixing": "Смешивание", "create.recipe.mixing": "Смешивание",
"create.recipe.automatic_shapeless": "Автоматическая бесформенная сборка", "create.recipe.automatic_shapeless": "Автоматическая бесформенная сборка",
"create.recipe.automatic_brewing": "Автоматической смешивание", "create.recipe.automatic_brewing": "Автоматическое смешивание",
"create.recipe.packing": "Прессование", "create.recipe.packing": "Прессование",
"create.recipe.automatic_packing": "Автоматическая упаковка", "create.recipe.automatic_packing": "Автоматическая упаковка",
"create.recipe.sawing": "Распиливание", "create.recipe.sawing": "Распиливание",
@ -685,7 +688,7 @@
"create.recipe.blockzapper_upgrade": "Ручная блоковая пушка", "create.recipe.blockzapper_upgrade": "Ручная блоковая пушка",
"create.recipe.sandpaper_polishing": "Полировка наждачной бумагой", "create.recipe.sandpaper_polishing": "Полировка наждачной бумагой",
"create.recipe.mystery_conversion": "Хроматический метаморфоз", "create.recipe.mystery_conversion": "Хроматический метаморфоз",
"create.recipe.spout_filling": "Заполнение сливом", "create.recipe.spout_filling": "Заполнение дозатором",
"create.recipe.draining": "Осушение предметов", "create.recipe.draining": "Осушение предметов",
"create.recipe.processing.chance": "%1$s%% шанса", "create.recipe.processing.chance": "%1$s%% шанса",
"create.recipe.heat_requirement.none": "Не требует нагрева", "create.recipe.heat_requirement.none": "Не требует нагрева",
@ -834,7 +837,7 @@
"create.gui.stockpile_switch.invert_signal": "Инвертировать сигнал", "create.gui.stockpile_switch.invert_signal": "Инвертировать сигнал",
"create.gui.stockpile_switch.move_to_lower_at": "Двигаться к нижней линии при %1$s%%", "create.gui.stockpile_switch.move_to_lower_at": "Двигаться к нижней линии при %1$s%%",
"create.gui.stockpile_switch.move_to_upper_at": "Двигаться к верхней линии при %1$s%%", "create.gui.stockpile_switch.move_to_upper_at": "Двигаться к верхней линии при %1$s%%",
"create.gui.sequenced_gearshift.title": "Посл. переключ. передач", "create.gui.sequenced_gearshift.title": "Последовательное переключение передач",
"create.gui.sequenced_gearshift.instruction": "Инструкция", "create.gui.sequenced_gearshift.instruction": "Инструкция",
"create.gui.sequenced_gearshift.instruction.turn_angle": "Повернуть", "create.gui.sequenced_gearshift.instruction.turn_angle": "Повернуть",
"create.gui.sequenced_gearshift.instruction.turn_angle.angle": "Угол", "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "Угол",
@ -989,7 +992,7 @@
"create.item_attributes.not_stackable": "не может складываться", "create.item_attributes.not_stackable": "не может складываться",
"create.item_attributes.not_stackable.inverted": "складывается", "create.item_attributes.not_stackable.inverted": "складывается",
"create.item_attributes.equipable": "может быть надет", "create.item_attributes.equipable": "может быть надет",
"create.item_attributes.equipable.inverted": "не ожет быть надет", "create.item_attributes.equipable.inverted": "не может быть надет",
"create.item_attributes.furnace_fuel": "является топливом", "create.item_attributes.furnace_fuel": "является топливом",
"create.item_attributes.furnace_fuel.inverted": "не является топливом", "create.item_attributes.furnace_fuel.inverted": "не является топливом",
"create.item_attributes.in_tag": "помечен %1$s", "create.item_attributes.in_tag": "помечен %1$s",
@ -1078,7 +1081,7 @@
"create.tooltip.chute.header": "Инвормация о желобе", "create.tooltip.chute.header": "Инвормация о желобе",
"create.tooltip.chute.items_move_down": "Предметы двигаются вниз", "create.tooltip.chute.items_move_down": "Предметы двигаются вниз",
"create.tooltip.chute.items_move_up": "Предметы двигаются вверх", "create.tooltip.chute.items_move_up": "Предметы двигаются вверх",
"create.tooltip.chute.no_fans_attached": "Нед подключеных вентиляторов", "create.tooltip.chute.no_fans_attached": "Нет подключеных вентиляторов",
"create.tooltip.chute.fans_push_up": "Вентилятор толкает снизу", "create.tooltip.chute.fans_push_up": "Вентилятор толкает снизу",
"create.tooltip.chute.fans_push_down": "Вентилятор толкает сверху", "create.tooltip.chute.fans_push_down": "Вентилятор толкает сверху",
"create.tooltip.chute.fans_pull_up": "Вентилятор тянет сверху", "create.tooltip.chute.fans_pull_up": "Вентилятор тянет сверху",
@ -1100,11 +1103,11 @@
"create.gui.config.overlay1": "Привет :)", "create.gui.config.overlay1": "Привет :)",
"create.gui.config.overlay2": "Это образец оверлея", "create.gui.config.overlay2": "Это образец оверлея",
"create.gui.config.overlay3": "кликни и тащи с помощью мыши", "create.gui.config.overlay3": "Кликни и тащи с помощью мыши",
"create.gui.config.overlay4": "чтобы переместить его", "create.gui.config.overlay4": "чтобы переместить его",
"create.gui.config.overlay5": "Нажми ESC чтобы выйти", "create.gui.config.overlay5": "Нажми ESC чтобы выйти",
"create.gui.config.overlay6": "и сохранить новую позицию", "create.gui.config.overlay6": "и сохранить новую позицию",
"create.gui.config.overlay7": "Запусти /create overlay reset", "create.gui.config.overlay7": "Введи /create overlay reset",
"create.gui.config.overlay8": "чтобы сбросить позицию до стандартной", "create.gui.config.overlay8": "чтобы сбросить позицию до стандартной",
"create.command.killTPSCommand": "killtps", "create.command.killTPSCommand": "killtps",
@ -1139,10 +1142,10 @@
"item.create.example_item.tooltip.action1": "These controls are displayed.", "item.create.example_item.tooltip.action1": "These controls are displayed.",
"block.create.andesite_encased_shaft.tooltip": "ANDESITE ENCASED SHAFT", "block.create.andesite_encased_shaft.tooltip": "ANDESITE ENCASED SHAFT",
"block.create.andesite_encased_shaft.tooltip.summary": "_Креативный предмет_. Установите кожух на вал, находящийся _в мире_ импользуя _Андезитовый корпус_. Блоки корпуса не будут использованы.", "block.create.andesite_encased_shaft.tooltip.summary": "_Креативный предмет_. Установите корпус на вал, находящийся _в мире_ импользуя _Андезитовый корпус_. Блоки корпуса не будут использованы.",
"block.create.brass_encased_shaft.tooltip": "BRASS ENCASED SHAFT", "block.create.brass_encased_shaft.tooltip": "BRASS ENCASED SHAFT",
"block.create.brass_encased_shaft.tooltip.summary": "_Креативный предмет_. Установите кожух на вал, находящийся _в мире_ импользуя _Латунный корпус_. Блоки корпуса не будут использованы.", "block.create.brass_encased_shaft.tooltip.summary": "_Креативный предмет_. Установите корпус на вал, находящийся _в мире_ импользуя _Латунный корпус_. Блоки корпуса не будут использованы.",
"block.create.wooden_bracket.tooltip": "WOODEN BRACKET", "block.create.wooden_bracket.tooltip": "WOODEN BRACKET",
"block.create.wooden_bracket.tooltip.summary": "_Украсьте_ ваши _валы, шестерни_ и _трубы_, используя уютное деревянное укрепление.", "block.create.wooden_bracket.tooltip.summary": "_Украсьте_ ваши _валы, шестерни_ и _трубы_, используя уютное деревянное укрепление.",
@ -1163,7 +1166,7 @@
"block.create.andesite_funnel.tooltip.behaviour3": "Будет _транспортировать_ предметы _вниз_, как воронка без буфера.", "block.create.andesite_funnel.tooltip.behaviour3": "Будет _транспортировать_ предметы _вниз_, как воронка без буфера.",
"block.create.andesite_tunnel.tooltip": "ANDESITE TUNNEL", "block.create.andesite_tunnel.tooltip": "ANDESITE TUNNEL",
"block.create.andesite_tunnel.tooltip.summary": "Защитное покрытие для ваших _Механических ремней_! _Андезитовые туннели_ могут отделять один предмет от стака, когда еще один механический ремень или депо расположены рядом с соновным ремнём.", "block.create.andesite_tunnel.tooltip.summary": "Защитное покрытие для вашего _Конвейера_! _Андезитовые туннели_ могут отделять один предмет от стака, когда еще один механический ремень или депо расположены рядом с соновным ремнём.",
"block.create.andesite_tunnel.tooltip.control1": "Правый клик Гаечным ключом по стороне", "block.create.andesite_tunnel.tooltip.control1": "Правый клик Гаечным ключом по стороне",
"block.create.andesite_tunnel.tooltip.action1": "_Регулирует оконные ставни_, если на этой стороне туннеля есть окно.", "block.create.andesite_tunnel.tooltip.action1": "_Регулирует оконные ставни_, если на этой стороне туннеля есть окно.",
@ -1179,7 +1182,7 @@
"block.create.brass_tunnel.tooltip": "BRASS TUNNEL", "block.create.brass_tunnel.tooltip": "BRASS TUNNEL",
"block.create.brass_tunnel.tooltip.summary": "Красивое покрытие для ваших _Механических ремней_! _Латунные туннели_ так же поставляются с фильтрами и возможностью разделения стаков ваших предметов.", "block.create.brass_tunnel.tooltip.summary": "Красивое покрытие для ваших _Механических ремней_! _Латунные туннели_ так же поставляются с фильтрами и возможностью разделения стаков ваших предметов.",
"block.create.brass_tunnel.tooltip.condition1": "При размещении бок о бок", "block.create.brass_tunnel.tooltip.condition1": "При размещении бок о бок",
"block.create.brass_tunnel.tooltip.behaviour1": "_Латунные туннели_ соединяются с другими, позволяя перенаправить поток предметов с одного _ремня_ на другой.", "block.create.brass_tunnel.tooltip.behaviour1": "_Латунные туннели_ соединяются с другими, позволяя перенаправить поток предметов с одного _конвейера_ на другой.",
"block.create.brass_tunnel.tooltip.condition2": "Фильтрация", "block.create.brass_tunnel.tooltip.condition2": "Фильтрация",
"block.create.brass_tunnel.tooltip.behaviour2": "_Латунные тунелли_ поставляюстя с фильтрами, для _входа_ и _выхода_. Если _предмет_ не соответствует _фильтру_, он будет перенаправлен на выход соседнего _туннеля_.", "block.create.brass_tunnel.tooltip.behaviour2": "_Латунные тунелли_ поставляюстя с фильтрами, для _входа_ и _выхода_. Если _предмет_ не соответствует _фильтру_, он будет перенаправлен на выход соседнего _туннеля_.",
"block.create.brass_tunnel.tooltip.condition3": "Разделение", "block.create.brass_tunnel.tooltip.condition3": "Разделение",
@ -1192,7 +1195,7 @@
"block.create.copper_casing.tooltip": "COPPER CASING", "block.create.copper_casing.tooltip": "COPPER CASING",
"block.create.copper_casing.tooltip.summary": "Прочный машинный корпус для разнообразного использования. Безопасно для украшения.", "block.create.copper_casing.tooltip.summary": "Прочный машинный корпус для разнообразного использования. Безопасно для украшения.",
"block.create.copper_casing.tooltip.condition1": "При использовании на жидкостной трубе", "block.create.copper_casing.tooltip.condition1": "При использовании на жидкостной трубе",
"block.create.copper_casing.tooltip.behaviour1": "Покрывает _жидкостную трубу_ _кожухом_. Трубы в кожухеакрепят свои соединения_ и не будут соединятся с другими трубами, расположенными по соседству.", "block.create.copper_casing.tooltip.behaviour1": "Покрывает _жидкостную трубу_ _корпусом_. Трубы в корпусеакрепят свои соединения_ и не будут соединятся с другими трубами, расположенными по соседству.",
"block.create.encased_fluid_pipe.tooltip": "ENCASED FLUID PIPE", "block.create.encased_fluid_pipe.tooltip": "ENCASED FLUID PIPE",
"block.create.encased_fluid_pipe.tooltip.summary": "_Труба_ в _Медном корпусе_.", "block.create.encased_fluid_pipe.tooltip.summary": "_Труба_ в _Медном корпусе_.",
@ -1210,12 +1213,12 @@
"block.create.chute.tooltip": "CHUTE", "block.create.chute.tooltip": "CHUTE",
"block.create.chute.tooltip.summary": "_Собирает_ и транспортирует предметы по вертикали и диагонали. Может как брать так класть предметы в _контейнеры_. Вы так же можете взаиодействовать с желобом, разместив сбоку воронку.", "block.create.chute.tooltip.summary": "_Собирает_ и транспортирует предметы по вертикали и диагонали. Может как брать так класть предметы в _контейнеры_. Вы так же можете взаиодействовать с желобом, разместив сбоку воронку.",
"block.create.chute.tooltip.condition1": "Если соединено с вентилятором", "block.create.chute.tooltip.condition1": "Если соединено с вентилятором",
"block.create.chute.tooltip.behaviour1": "Соеденённые сентилятором_ желоба могут двигать _предметы_ вверх, и засасывать их с _ремней_ и _депо_.", "block.create.chute.tooltip.behaviour1": "Соеденённые сентилятором_ желоба могут двигать _предметы_ вверх, и засасывать их с _конвейера_ и _депо_.",
"block.create.depot.tooltip": "DEPOT", "block.create.depot.tooltip": "DEPOT",
"block.create.depot.tooltip.summary": "Полезное место куда вы можете класть свои _предметы_. Обеспечивает точку взаимодействия для некоторых машин", "block.create.depot.tooltip.summary": "Полезное место куда вы можете класть свои _предметы_. Обеспечивает точку взаимодействия для некоторых машин",
"block.create.depot.tooltip.condition1": "При правом клике", "block.create.depot.tooltip.condition1": "При правом клике",
"block.create.depot.tooltip.behaviour1": "Размещает или забирает _предмет_ сепо_. _Блоки_ и _Устройства_, которые могут взаимодействовать с _ремнём_, так же работают сепо_.", "block.create.depot.tooltip.behaviour1": "Размещает или забирает _предмет_ сепо_. _Блоки_ и _Устройства_, которые могут взаимодействовать с _конвейером_, так же работают сепо_.",
"item.create.blaze_cake.tooltip": "BLAZE CAKE", "item.create.blaze_cake.tooltip": "BLAZE CAKE",
"item.create.blaze_cake.tooltip.summary": "Вкусное угощения для вашей трудяги _Горелки Всполоха_. Зажигает их всех!", "item.create.blaze_cake.tooltip.summary": "Вкусное угощения для вашей трудяги _Горелки Всполоха_. Зажигает их всех!",
@ -1247,7 +1250,7 @@
"block.create.fluid_tank.tooltip.behaviour1": "Переключает опциональное отображение окна", "block.create.fluid_tank.tooltip.behaviour1": "Переключает опциональное отображение окна",
"block.create.creative_fluid_tank.tooltip": "CREATIVE FLUID TANK", "block.create.creative_fluid_tank.tooltip": "CREATIVE FLUID TANK",
"block.create.creative_fluid_tank.tooltip.summary": "Этот _Жидкостный бак_ позволяет бесконечную репликацию любой жидкости. Скалируется в высоту и ширину.", "block.create.creative_fluid_tank.tooltip.summary": "Этот _Жидкостный бак_ позволяет иметь бесконечную репликацию любой жидкости. Скалируется в высоту и ширину.",
"block.create.creative_fluid_tank.tooltip.condition1": "Когда жидкость в баке", "block.create.creative_fluid_tank.tooltip.condition1": "Когда жидкость в баке",
"block.create.creative_fluid_tank.tooltip.behaviour1": "Всё что _извлекает_ из бака, будет снабжаться _бесконечным запасом_ жидкости. Жидкости _закачивающиеся_ в бак будут _удаляться_.", "block.create.creative_fluid_tank.tooltip.behaviour1": "Всё что _извлекает_ из бака, будет снабжаться _бесконечным запасом_ жидкости. Жидкости _закачивающиеся_ в бак будут _удаляться_.",
"block.create.creative_fluid_tank.tooltip.condition2": "Правый клик с гаечным ключом", "block.create.creative_fluid_tank.tooltip.condition2": "Правый клик с гаечным ключом",
@ -1275,9 +1278,9 @@
"block.create.spout.tooltip": "SPOUT", "block.create.spout.tooltip": "SPOUT",
"block.create.spout.tooltip.summary": "Форсунка для пополнения предметов, имеющих возможность хранить жидкость.", "block.create.spout.tooltip.summary": "Форсунка для пополнения предметов, имеющих возможность хранить жидкость.",
"block.create.spout.tooltip.condition1": "Транспортировка жидкости", "block.create.spout.tooltip.condition1": "Транспортировка жидкости",
"block.create.spout.tooltip.behaviour1": "Когда предмет, _с возможностью содержать жидкость_, такой как _ведро_ или _бутылочка_, размещён под сливом, слив будет пытаться заполнить предмет содержащейся в нём _жидкостью_.", "block.create.spout.tooltip.behaviour1": "Когда предмет, _с возможностью содержать жидкость_, такой как _ведро_ или _бутылочка_, размещён под дозатором, дозатор будет пытаться заполнить предмет содержащейся в нём _жидкостью_.",
"block.create.spout.tooltip.condition2": "Автоматизация жидкости", "block.create.spout.tooltip.condition2": "Автоматизация жидкости",
"block.create.spout.tooltip.behaviour2": "Слив расположеный над _ремнём_ или _депо_ будет автоматически взаимодействовать с _предметами, которые могут содержать жидкость_, которые проходят под ним.", "block.create.spout.tooltip.behaviour2": "Дозатор расположеный над _конвейером_ или _депо_ будет автоматически взаимодействовать с _предметами, которые могут содержать жидкость_, которые проходят под ним.",
"block.create.item_drain.tooltip": "ITEM DRAIN", "block.create.item_drain.tooltip": "ITEM DRAIN",
"block.create.item_drain.tooltip.summary": "Депо с решёткой, которое может выкачивать _жидкость_ из ваших _предметов_", "block.create.item_drain.tooltip.summary": "Депо с решёткой, которое может выкачивать _жидкость_ из ваших _предметов_",
@ -1287,7 +1290,7 @@
"block.create.mechanical_arm.tooltip": "MECHANICAL ARM", "block.create.mechanical_arm.tooltip": "MECHANICAL ARM",
"block.create.mechanical_arm.tooltip.summary": "Продвинутуе устройство для перемещения _предметов_.", "block.create.mechanical_arm.tooltip.summary": "Продвинутуе устройство для перемещения _предметов_.",
"block.create.mechanical_arm.tooltip.condition1": "Транспортировка предметов", "block.create.mechanical_arm.tooltip.condition1": "Транспортировка предметов",
"block.create.mechanical_arm.tooltip.behaviour1": "Может брать или размещать предметы в любой открытый инвентарь, такой как _ремень_, _депо_, _воронка_ и _механический крафтер_.", "block.create.mechanical_arm.tooltip.behaviour1": "Может брать или размещать предметы в любой открытый инвентарь, такой как _конвейер_, _депо_, _воронка_ и _механический крафтер_.",
"block.create.mechanical_arm.tooltip.control1": "Когда в руке", "block.create.mechanical_arm.tooltip.control1": "Когда в руке",
"block.create.mechanical_arm.tooltip.action1": "Правый клик на _открытом инвентаре_ установит _точку для сбора_, для _механической руки_. Кликните еще раз чтобы установить _точку для размещения_.", "block.create.mechanical_arm.tooltip.action1": "Правый клик на _открытом инвентаре_ установит _точку для сбора_, для _механической руки_. Кликните еще раз чтобы установить _точку для размещения_.",
"block.create.mechanical_arm.tooltip.control2": "Прокрутка с ключом", "block.create.mechanical_arm.tooltip.control2": "Прокрутка с ключом",
@ -1408,14 +1411,14 @@
"block.create.clutch.tooltip.behaviour1": "_Прекращает_ передачу вращения на другую сторону.", "block.create.clutch.tooltip.behaviour1": "_Прекращает_ передачу вращения на другую сторону.",
"block.create.encased_chain_drive.tooltip": "ENCASED_CHAIN_DRIVE", "block.create.encased_chain_drive.tooltip": "ENCASED_CHAIN_DRIVE",
"block.create.encased_chain_drive.tooltip.summary": "_Передаёт вращение_ по прямой линии и к смежным _цепным приводам в кожухе_. Цепные приводы соединяются, когда расположены рядом друг с другом, без необходимости использовать вал. Их направление не обязательно должно совпадать.", "block.create.encased_chain_drive.tooltip.summary": "_Передаёт вращение_ по прямой линии и к смежным _цепным приводам в корпусе_. Цепные приводы соединяются, когда расположены рядом друг с другом, без необходимости использовать вал. Их направление не обязательно должно совпадать.",
"block.create.encased_chain_drive.tooltip.condition1": "Когда соединено", "block.create.encased_chain_drive.tooltip.condition1": "Когда соединено",
"block.create.encased_chain_drive.tooltip.behaviour1": "Соединённые блоки будут получать _скорость вращения_ и егоаправление_ от этого компонента.", "block.create.encased_chain_drive.tooltip.behaviour1": "Соединённые блоки будут получать _скорость вращения_ и егоаправление_ от этого компонента.",
"block.create.adjustable_chain_gearshift.tooltip": "ADJUSTABLE CHAIN GEARSHIFT", "block.create.adjustable_chain_gearshift.tooltip": "ADJUSTABLE CHAIN GEARSHIFT",
"block.create.adjustable_chain_gearshift.tooltip.summary": "_Передаёт вращение_ по прямой линии и к смежным _цепным приводам в кожухе_. Полученный _сигнал редстоуна_ будет контролировать, какой размер шестерни взаимодействует с присоединенными цепными приводами.", "block.create.adjustable_chain_gearshift.tooltip.summary": "_Передаёт вращение_ по прямой линии и к смежным _цепным приводам в корпусе_. Полученный _сигнал редстоуна_ будет контролировать, какой размер шестерни взаимодействует с присоединенными цепными приводами.",
"block.create.adjustable_chain_gearshift.tooltip.condition1": "Кнонтроль редстоуном", "block.create.adjustable_chain_gearshift.tooltip.condition1": "Кнонтроль редстоуном",
"block.create.adjustable_chain_gearshift.tooltip.behaviour1": "_Без_ сигнала редстоуна присоединённые приводы будут иметь _такую же_ скорость. При получении _сигнала редстоуна_ максимального уровня, соединённые приводы будут вращаться с ровно в два раза меньшей скоростью. Всё, что между этими значениями, будет выдавать скорость от 1 до 2 кратной скорости цепного механизма.", "block.create.adjustable_chain_gearshift.tooltip.behaviour1": "_Без_ сигнала редстоуна присоединённые приводы будут иметь _такую же_ скорость. При получении _сигнала редстоуна_ максимального уровня, соединённые приводы будут вращаться с удвоенной скоростью. Всё, что между минимальным и максимальным значениями, будет выдавать скорость от 1 до 2 кратной скорости цепного механизма.",
"item.create.belt_connector.tooltip": "BELT CONNECTOR", "item.create.belt_connector.tooltip": "BELT CONNECTOR",
"item.create.belt_connector.tooltip.summary": "Соединяет _2_ _Вала_ с помощью _механического_ _ремня_._ Соединённые валы будут иметь одинаковые _скорость_ и _направление_ _вращения._ Лента может служить как _конвейер_ для _транспортировки._", "item.create.belt_connector.tooltip.summary": "Соединяет _2_ _Вала_ с помощью _механического_ _ремня_._ Соединённые валы будут иметь одинаковые _скорость_ и _направление_ _вращения._ Лента может служить как _конвейер_ для _транспортировки._",
@ -1493,7 +1496,7 @@
"block.create.basin.tooltip": "BASIN", "block.create.basin.tooltip": "BASIN",
"block.create.basin.tooltip.summary": "Удобный _контейнер_ _для_ _предметов_, используемый при обработке _механическим_ _смешивателем_ и _механическим прессом_. Поддерживает компараторы.", "block.create.basin.tooltip.summary": "Удобный _контейнер_ _для_ _предметов_, используемый при обработке _механическим_ _смешивателем_ и _механическим прессом_. Поддерживает компараторы.",
"block.create.basin.tooltip.condition1": "Авто-выход", "block.create.basin.tooltip.condition1": "Авто-выход",
"block.create.basin.tooltip.behaviour1": "Когда _открытые инвентари_, такие как ремни, другие чаши, депо и т.д. находятся _под_ чашей, они будут автоматически принимать любые _жидкости_ и _предметы_, созданные в чаше. Это полезно для автоматизации.", "block.create.basin.tooltip.behaviour1": "Когда _открытые инвентари_, такие как конвейер, другие чаши, депо и т.д. находятся _под_ чашей, они будут автоматически принимать любые _жидкости_ и _предметы_, созданные в чаше. Это полезно для автоматизации.",
"block.create.blaze_burner.tooltip": "BLAZE BURNER", "block.create.blaze_burner.tooltip": "BLAZE BURNER",
"block.create.blaze_burner.tooltip.summary": "Блок для нагревания чаши, работающий когда в нём находится прирученый Всполох.", "block.create.blaze_burner.tooltip.summary": "Блок для нагревания чаши, работающий когда в нём находится прирученый Всполох.",
@ -1508,7 +1511,7 @@
"block.create.mechanical_mixer.tooltip": "MECHANICAL MIXER", "block.create.mechanical_mixer.tooltip": "MECHANICAL MIXER",
"block.create.mechanical_mixer.tooltip.summary": "Кинетический венчик, используемый для смешивания предметов, находящихся под ним. Требуется _постоянная_ _вращательная_ _сила_ и _чаша_, расположенная внизу (с промежутком между ними).", "block.create.mechanical_mixer.tooltip.summary": "Кинетический венчик, используемый для смешивания предметов, находящихся под ним. Требуется _постоянная_ _вращательная_ _сила_ и _чаша_, расположенная внизу (с промежутком между ними).",
"block.create.mechanical_mixer.tooltip.condition1": "Когда над чашей", "block.create.mechanical_mixer.tooltip.condition1": "Когда над чашей",
"block.create.mechanical_mixer.tooltip.behaviour1": "Начинает смешивать предметы в бассейне, когда присутствуют все необходимые ингредиенты.", "block.create.mechanical_mixer.tooltip.behaviour1": "Начинает смешивать предметы в чаше, когда присутствуют все необходимые ингредиенты.",
"block.create.mechanical_crafter.tooltip": "MECHANICAL CRAFTER", "block.create.mechanical_crafter.tooltip": "MECHANICAL CRAFTER",
"block.create.mechanical_crafter.tooltip.summary": "_Кинетический_ _сборщик_ для автоматизации любого рецепта крафта. _Поместите_ _ингредиенты_ в сетку, _соответственно_ _нужному_ _рецепту_, и расположите их так, чтобы _создать_ _поток_, который _кончается_ на одном из крафтеров.", "block.create.mechanical_crafter.tooltip.summary": "_Кинетический_ _сборщик_ для автоматизации любого рецепта крафта. _Поместите_ _ингредиенты_ в сетку, _соответственно_ _нужному_ _рецепту_, и расположите их так, чтобы _создать_ _поток_, который _кончается_ на одном из крафтеров.",
@ -1524,7 +1527,7 @@
"block.create.furnace_engine.tooltip": "FURNACE ENGINE", "block.create.furnace_engine.tooltip": "FURNACE ENGINE",
"block.create.furnace_engine.tooltip.summary": "_Мощный_ источник _энергии_ _вращения_, для работы которого требуется _работающая_ _печь.", "block.create.furnace_engine.tooltip.summary": "_Мощный_ источник _энергии_ _вращения_, для работы которого требуется _работающая_ _печь.",
"block.create.furnace_engine.tooltip.condition1": "Когда прикреплен к работающей печи", "block.create.furnace_engine.tooltip.condition1": "Когда прикреплен к работающей печи",
"block.create.furnace_engine.tooltip.behaviour1": "_Начинает_ _приводить_ _в_ _действие_ _маховик_, расположенный _перед_ ним (на расстоянии 1 м). Используйте доменную печь для более высоких скоростей.", "block.create.furnace_engine.tooltip.behaviour1": "_Начинает_ _приводить_ _в_ _действие_ _маховик_, расположенный _перед_ ним (на расстоянии 1 м). Используйте плавильную печь для более высоких скоростей.",
"block.create.flywheel.tooltip": "FLYWHEEL", "block.create.flywheel.tooltip": "FLYWHEEL",
"block.create.flywheel.tooltip.summary": "Большое металлическое колесо для _удержания_ и _стабилизации_ создаваемой силы с помощью _прикреплённого_ _двигателя_. Маховики _соединяются_ с _двигателями_, если они находятся на расстоянии _1_ _м_ друг от друга и под углом _90°_ друг к другу.", "block.create.flywheel.tooltip.summary": "Большое металлическое колесо для _удержания_ и _стабилизации_ создаваемой силы с помощью _прикреплённого_ _двигателя_. Маховики _соединяются_ с _двигателями_, если они находятся на расстоянии _1_ _м_ друг от друга и под углом _90°_ друг к другу.",
@ -1532,7 +1535,7 @@
"block.create.flywheel.tooltip.behaviour1": "Обеспечивает вращательную силу для подключенного устройства в зависимости от силы и скорости генератора.", "block.create.flywheel.tooltip.behaviour1": "Обеспечивает вращательную силу для подключенного устройства в зависимости от силы и скорости генератора.",
"block.create.portable_storage_interface.tooltip": "PORTABLE STORAGE INTERFACE", "block.create.portable_storage_interface.tooltip": "PORTABLE STORAGE INTERFACE",
"block.create.portable_storage_interface.tooltip.summary": "Переносная точка обмена для _перемещения_ предметов внутрь или из _конструкции_, перемещаемой _поршнем_, _шасси_, _вагонеткой_ или _ремнём_.", "block.create.portable_storage_interface.tooltip.summary": "Переносная точка обмена для _перемещения_ предметов внутрь или из _конструкции_, перемещаемой _поршнем_, _шасси_, _вагонеткой_ или _конвейером_.",
"block.create.portable_storage_interface.tooltip.condition1": "Во время движения", "block.create.portable_storage_interface.tooltip.condition1": "Во время движения",
"block.create.portable_storage_interface.tooltip.behaviour1": "Взаимодействует со стационарными переместителями так, что переместители, обращенные в сторону от интерфейса, вытягивают предметы, а транспортеры, нацеленные на интерфейс, вставляют предметы из прикреплённого инвентаря. Конструкция ненадолго остановится при обмене предметов.", "block.create.portable_storage_interface.tooltip.behaviour1": "Взаимодействует со стационарными переместителями так, что переместители, обращенные в сторону от интерфейса, вытягивают предметы, а транспортеры, нацеленные на интерфейс, вставляют предметы из прикреплённого инвентаря. Конструкция ненадолго остановится при обмене предметов.",
"block.create.portable_storage_interface.tooltip.condition2": "Когда запитан редстоуном", "block.create.portable_storage_interface.tooltip.condition2": "Когда запитан редстоуном",
@ -1708,7 +1711,7 @@
"block.create.deployer.tooltip.behaviour3": "Автоматический активатор будет активирован, если только удерживаемый предмет _совпадает_ с предметом в _фильтре_. Не совпадающие предметы не могут быть помещены; Удерживаемые предметы, соответствующие фильтру, не могут быть извлечены.", "block.create.deployer.tooltip.behaviour3": "Автоматический активатор будет активирован, если только удерживаемый предмет _совпадает_ с предметом в _фильтре_. Не совпадающие предметы не могут быть помещены; Удерживаемые предметы, соответствующие фильтру, не могут быть извлечены.",
"block.create.brass_casing.tooltip": "BRASS CASING", "block.create.brass_casing.tooltip": "BRASS CASING",
"block.create.brass_casing.tooltip.summary": "Прочный корпус машины с различными вариантами применения. Безопасно для украшения.", "block.create.brass_casing.tooltip.summary": "Прочный корпус машины с различными вариантами применения. Безопасно для декорирования.",
"block.create.pulse_repeater.tooltip": "PULSE REPEATER", "block.create.pulse_repeater.tooltip": "PULSE REPEATER",
"block.create.pulse_repeater.tooltip.summary": "Простая схема обрезки длинны проходящего сигнала до _1_ _тика_.", "block.create.pulse_repeater.tooltip.summary": "Простая схема обрезки длинны проходящего сигнала до _1_ _тика_.",
@ -1765,7 +1768,7 @@
"item.create.shadow_steel.tooltip.summary": "Хроматический материал, _добытый_ _в_ _пустоте_.", "item.create.shadow_steel.tooltip.summary": "Хроматический материал, _добытый_ _в_ _пустоте_.",
"item.create.minecart_coupling.tooltip": "MINECART COUPLING", "item.create.minecart_coupling.tooltip": "MINECART COUPLING",
"item.create.minecart_coupling.tooltip.summary": "_Соединяет_ ваши _вагонетки_ или orеревозочные устройства_ вместе, чтобы создать великолепный поезд.", "item.create.minecart_coupling.tooltip.summary": "_Соединяет_ ваши _вагонетки_ илиеревозочные устройства_ вместе, чтобы создать великолепный поезд.",
"item.create.minecart_coupling.tooltip.condition1": "При использовании на вагонетке", "item.create.minecart_coupling.tooltip.condition1": "При использовании на вагонетке",
"item.create.minecart_coupling.tooltip.behaviour1": "_Соединяет_ две вагонетки вместе, пытаясь держать их на _определенной дистанции_ при движении.", "item.create.minecart_coupling.tooltip.behaviour1": "_Соединяет_ две вагонетки вместе, пытаясь держать их на _определенной дистанции_ при движении.",

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/gantry_shaft/block_end",
"textures": {
"2": "create:block/gantry_shaft_flipped"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/gantry_shaft/block_end",
"textures": {
"2": "create:block/gantry_shaft_powered"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/gantry_shaft/block_end",
"textures": {
"2": "create:block/gantry_shaft_powered_flipped"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/gantry_shaft/block_middle",
"textures": {
"2": "create:block/gantry_shaft_flipped"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/gantry_shaft/block_middle",
"textures": {
"2": "create:block/gantry_shaft_powered"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/gantry_shaft/block_middle",
"textures": {
"2": "create:block/gantry_shaft_powered_flipped"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/gantry_shaft/block_single",
"textures": {
"2": "create:block/gantry_shaft_flipped"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/gantry_shaft/block_single",
"textures": {
"2": "create:block/gantry_shaft_powered"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/gantry_shaft/block_single",
"textures": {
"2": "create:block/gantry_shaft_powered_flipped"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/gantry_shaft/block_start",
"textures": {
"2": "create:block/gantry_shaft_flipped"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/gantry_shaft/block_start",
"textures": {
"2": "create:block/gantry_shaft_powered"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/gantry_shaft/block_start",
"textures": {
"2": "create:block/gantry_shaft_powered_flipped"
}
}

View file

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

View file

@ -0,0 +1,3 @@
{
"parent": "create:block/gantry_shaft/block_single"
}

View file

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

View file

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"create:crafting/kinetics/gantry_shaft"
]
},
"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/gantry_shaft"
}
}
},
"requirements": [
[
"has_item",
"has_the_recipe"
]
]
}

View file

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

View file

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

View file

@ -0,0 +1,25 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
" B ",
"ICI",
" S "
],
"key": {
"B": {
"tag": "minecraft:planks"
},
"S": {
"item": "create:cogwheel"
},
"C": {
"item": "create:andesite_casing"
},
"I": {
"item": "create:shaft"
}
},
"result": {
"item": "create:gantry_pinion"
}
}

View file

@ -0,0 +1,20 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"A",
"R",
"A"
],
"key": {
"A": {
"item": "create:andesite_alloy"
},
"R": {
"tag": "forge:dusts/redstone"
}
},
"result": {
"item": "create:gantry_shaft",
"count": 8
}
}

View file

@ -23,6 +23,7 @@
"create:redstone_link", "create:redstone_link",
"create:analog_lever", "create:analog_lever",
"create:adjustable_repeater", "create:adjustable_repeater",
"create:adjustable_pulse_repeater" "create:adjustable_pulse_repeater",
"#minecraft:signs"
] ]
} }

View file

@ -71,6 +71,8 @@ public class AllBlockPartials {
CUCKOO_RIGHT_DOOR = get("cuckoo_clock/right_door"), CUCKOO_PIG = get("cuckoo_clock/pig"), CUCKOO_RIGHT_DOOR = get("cuckoo_clock/right_door"), CUCKOO_PIG = get("cuckoo_clock/pig"),
CUCKOO_CREEPER = get("cuckoo_clock/creeper"), CUCKOO_CREEPER = get("cuckoo_clock/creeper"),
GANTRY_COGS = get("gantry_pinion/wheels"),
ROPE_COIL = get("rope_pulley/rope_coil"), ROPE_COIL = get("rope_pulley/rope_coil"),
ROPE_HALF = get("rope_pulley/rope_half"), ROPE_HALF = get("rope_pulley/rope_half"),
ROPE_HALF_MAGNET = get("rope_pulley/rope_half_magnet"), ROPE_HALF_MAGNET = get("rope_pulley/rope_half_magnet"),
@ -107,6 +109,8 @@ public class AllBlockPartials {
SPOUT_TOP = get("spout/top"), SPOUT_MIDDLE = get("spout/middle"), SPOUT_BOTTOM = get("spout/bottom"), SPOUT_TOP = get("spout/top"), SPOUT_MIDDLE = get("spout/middle"), SPOUT_BOTTOM = get("spout/bottom"),
SPEED_CONTROLLER_BRACKET = get("rotation_speed_controller/bracket"),
COUPLING_ATTACHMENT = getEntity("minecart_coupling/attachment"), COUPLING_ATTACHMENT = getEntity("minecart_coupling/attachment"),
COUPLING_RING = getEntity("minecart_coupling/ring"), COUPLING_RING = getEntity("minecart_coupling/ring"),
COUPLING_CONNECTOR = getEntity("minecart_coupling/connector") COUPLING_CONNECTOR = getEntity("minecart_coupling/connector")

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;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.LinearChassisBlock.ChassisCTBehaviour; 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.RadialChassisBlock;
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;
import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock.MinecartAnchorBlock; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock.MinecartAnchorBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlockItem; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlockItem;
@ -90,6 +91,7 @@ import com.simibubi.create.content.contraptions.processing.BasinMovementBehaviou
import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock;
import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlockItem; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlockItem;
import com.simibubi.create.content.contraptions.processing.burner.LitBlazeBurnerBlock; import com.simibubi.create.content.contraptions.processing.burner.LitBlazeBurnerBlock;
import com.simibubi.create.content.contraptions.relays.advanced.GantryShaftBlock;
import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerBlock; import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerBlock;
import com.simibubi.create.content.contraptions.relays.advanced.sequencer.SequencedGearshiftBlock; import com.simibubi.create.content.contraptions.relays.advanced.sequencer.SequencedGearshiftBlock;
import com.simibubi.create.content.contraptions.relays.advanced.sequencer.SequencedGearshiftGenerator; import com.simibubi.create.content.contraptions.relays.advanced.sequencer.SequencedGearshiftGenerator;
@ -171,8 +173,10 @@ import net.minecraft.item.Item;
import net.minecraft.state.properties.PistonType; import net.minecraft.state.properties.PistonType;
import net.minecraft.tags.BlockTags; import net.minecraft.tags.BlockTags;
import net.minecraft.tags.ItemTags; import net.minecraft.tags.ItemTags;
import net.minecraft.util.Direction.AxisDirection;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.model.generators.ConfiguredModel; import net.minecraftforge.client.model.generators.ConfiguredModel;
import net.minecraftforge.client.model.generators.ModelFile;
import net.minecraftforge.common.Tags; import net.minecraftforge.common.Tags;
import net.minecraftforge.common.ToolType; import net.minecraftforge.common.ToolType;
@ -686,6 +690,38 @@ public class AllBlocks {
.getName() + "/head")))) .getName() + "/head"))))
.register(); .register();
public static final BlockEntry<GantryPinionBlock> GANTRY_PINION =
REGISTRATE.block("gantry_pinion", GantryPinionBlock::new)
.initialProperties(SharedProperties::stone)
.properties(Block.Properties::nonOpaque)
.blockstate(BlockStateGen.directionalAxisBlockProvider())
.item()
.transform(customItemModel())
.register();
public static final BlockEntry<GantryShaftBlock> GANTRY_SHAFT =
REGISTRATE.block("gantry_shaft", GantryShaftBlock::new)
.initialProperties(SharedProperties::stone)
.blockstate((c, p) -> p.directionalBlock(c.get(), s -> {
boolean isPowered = s.get(GantryShaftBlock.POWERED);
boolean isFlipped = s.get(GantryShaftBlock.FACING)
.getAxisDirection() == AxisDirection.NEGATIVE;
String partName = s.get(GantryShaftBlock.PART)
.getName();
String flipped = isFlipped ? "_flipped" : "";
String powered = isPowered ? "_powered" : "";
ModelFile existing = AssetLookup.partialBaseModel(c, p, partName);
if (!isPowered && !isFlipped)
return existing;
return p.models()
.withExistingParent("block/" + c.getName() + "_" + partName + powered + flipped,
existing.getLocation())
.texture("2", p.modLoc("block/" + c.getName() + powered + flipped));
}))
.item()
.transform(customItemModel("_", "block_single"))
.register();
public static final BlockEntry<WindmillBearingBlock> WINDMILL_BEARING = public static final BlockEntry<WindmillBearingBlock> WINDMILL_BEARING =
REGISTRATE.block("windmill_bearing", WindmillBearingBlock::new) REGISTRATE.block("windmill_bearing", WindmillBearingBlock::new)
.transform(BuilderTransformers.bearing("windmill", "gearbox", true)) .transform(BuilderTransformers.bearing("windmill", "gearbox", true))

View file

@ -6,6 +6,8 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Con
import com.simibubi.create.content.contraptions.components.structureMovement.ControlledContraptionEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.ControlledContraptionEntityRenderer;
import com.simibubi.create.content.contraptions.components.structureMovement.OrientedContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.OrientedContraptionEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.OrientedContraptionEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.OrientedContraptionEntityRenderer;
import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryContraptionEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryContraptionEntityRenderer;
import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueRenderer;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
@ -23,16 +25,27 @@ import net.minecraftforge.fml.client.registry.RenderingRegistry;
public class AllEntityTypes { public class AllEntityTypes {
public static final RegistryEntry<EntityType<OrientedContraptionEntity>> ORIENTED_CONTRAPTION = public static final RegistryEntry<EntityType<OrientedContraptionEntity>> ORIENTED_CONTRAPTION =
register("contraption", OrientedContraptionEntity::new, EntityClassification.MISC, 5, 3, true, contraption("contraption", OrientedContraptionEntity::new, 5, 3, true);
AbstractContraptionEntity::build);
public static final RegistryEntry<EntityType<ControlledContraptionEntity>> CONTROLLED_CONTRAPTION = public static final RegistryEntry<EntityType<ControlledContraptionEntity>> CONTROLLED_CONTRAPTION =
register("stationary_contraption", ControlledContraptionEntity::new, EntityClassification.MISC, 20, 40, false, contraption("stationary_contraption", ControlledContraptionEntity::new, 20, 40, false);
AbstractContraptionEntity::build); public static final RegistryEntry<EntityType<GantryContraptionEntity>> GANTRY_CONTRAPTION =
contraption("gantry_contraption", GantryContraptionEntity::new, 10, 40, false);
public static final RegistryEntry<EntityType<SuperGlueEntity>> SUPER_GLUE = register("super_glue", public static final RegistryEntry<EntityType<SuperGlueEntity>> SUPER_GLUE = register("super_glue",
SuperGlueEntity::new, EntityClassification.MISC, 10, Integer.MAX_VALUE, false, SuperGlueEntity::build); SuperGlueEntity::new, EntityClassification.MISC, 10, Integer.MAX_VALUE, false, SuperGlueEntity::build);
public static final RegistryEntry<EntityType<SeatEntity>> SEAT = public static final RegistryEntry<EntityType<SeatEntity>> SEAT =
register("seat", SeatEntity::new, EntityClassification.MISC, 0, Integer.MAX_VALUE, false, SeatEntity::build); register("seat", SeatEntity::new, EntityClassification.MISC, 0, Integer.MAX_VALUE, false, SeatEntity::build);
//
public static void register() {}
private static <T extends Entity> RegistryEntry<EntityType<T>> contraption(String name, IFactory<T> factory,
int range, int updateFrequency, boolean sendVelocity) {
return register(name, factory, EntityClassification.MISC, range, updateFrequency, sendVelocity,
AbstractContraptionEntity::build);
}
private static <T extends Entity> RegistryEntry<EntityType<T>> register(String name, IFactory<T> factory, private static <T extends Entity> RegistryEntry<EntityType<T>> register(String name, IFactory<T> factory,
EntityClassification group, int range, int updateFrequency, boolean sendVelocity, EntityClassification group, int range, int updateFrequency, boolean sendVelocity,
NonNullConsumer<EntityType.Builder<T>> propertyBuilder) { NonNullConsumer<EntityType.Builder<T>> propertyBuilder) {
@ -46,14 +59,14 @@ public class AllEntityTypes {
.register(); .register();
} }
public static void register() {}
@OnlyIn(value = Dist.CLIENT) @OnlyIn(value = Dist.CLIENT)
public static void registerRenderers() { public static void registerRenderers() {
RenderingRegistry.registerEntityRenderingHandler(CONTROLLED_CONTRAPTION.get(), RenderingRegistry.registerEntityRenderingHandler(CONTROLLED_CONTRAPTION.get(),
ControlledContraptionEntityRenderer::new); ControlledContraptionEntityRenderer::new);
RenderingRegistry.registerEntityRenderingHandler(ORIENTED_CONTRAPTION.get(), RenderingRegistry.registerEntityRenderingHandler(ORIENTED_CONTRAPTION.get(),
OrientedContraptionEntityRenderer::new); OrientedContraptionEntityRenderer::new);
RenderingRegistry.registerEntityRenderingHandler(GANTRY_CONTRAPTION.get(),
GantryContraptionEntityRenderer::new);
RenderingRegistry.registerEntityRenderingHandler(SUPER_GLUE.get(), SuperGlueRenderer::new); RenderingRegistry.registerEntityRenderingHandler(SUPER_GLUE.get(), SuperGlueRenderer::new);
RenderingRegistry.registerEntityRenderingHandler(SEAT.get(), SeatEntity.Render::new); RenderingRegistry.registerEntityRenderingHandler(SEAT.get(), SeatEntity.Render::new);
} }

View file

@ -41,10 +41,6 @@ public class AllShapes {
SAIL_FRAME_COLLISION = shape(0, 5, 0, 16, 9, 16).erase(2, 0, 2, 14, 16, 14) SAIL_FRAME_COLLISION = shape(0, 5, 0, 16, 9, 16).erase(2, 0, 2, 14, 16, 14)
.forDirectional(), .forDirectional(),
SAIL_FRAME = shape(0, 5, 0, 16, 9, 16).forDirectional(), SAIL = shape(0, 5, 0, 16, 10, 16).forDirectional(), SAIL_FRAME = shape(0, 5, 0, 16, 9, 16).forDirectional(), SAIL = shape(0, 5, 0, 16, 10, 16).forDirectional(),
SPEED_CONTROLLER = shape(0, 0, 0, 16, 2, 16).add(1, 1, 1, 15, 15, 15)
.erase(0, 8, 5, 16, 16, 11)
.add(2, 9, 2, 14, 14, 14)
.forHorizontalAxis(),
HARVESTER_BASE = shape(0, 2, 0, 16, 14, 3).forDirectional(SOUTH), HARVESTER_BASE = shape(0, 2, 0, 16, 14, 3).forDirectional(SOUTH),
NOZZLE = shape(2, 0, 2, 14, 14, 14).add(1, 13, 1, 15, 15, 15) NOZZLE = shape(2, 0, 2, 14, 14, 14).add(1, 13, 1, 15, 15, 15)
.erase(3, 13, 3, 13, 15, 13) .erase(3, 13, 3, 13, 15, 13)
@ -144,6 +140,8 @@ public class AllShapes {
BASIN_COLLISION_SHAPE = shape(0, 2, 0, 16, 13, 16).erase(2, 5, 2, 14, 16, 14) BASIN_COLLISION_SHAPE = shape(0, 2, 0, 16, 13, 16).erase(2, 5, 2, 14, 16, 14)
.add(2, 0, 2, 14, 2, 14) .add(2, 0, 2, 14, 2, 14)
.build(), .build(),
SPEED_CONTROLLER = shape(0, 0, 0, 16, 4, 16).add(1, 1, 1, 15, 13, 15)
.add(0, 8, 0, 16, 14, 16).build(),
HEATER_BLOCK_SHAPE = shape(2, 0, 2, 14, 14, 14).add(0, 0, 0, 16, 4, 16) HEATER_BLOCK_SHAPE = shape(2, 0, 2, 14, 14, 14).add(0, 0, 0, 16, 4, 16)
.build(), .build(),
HEATER_BLOCK_SPECIAL_COLLISION_SHAPE = shape(0, 0, 0, 16, 4, 16).build(), HEATER_BLOCK_SPECIAL_COLLISION_SHAPE = shape(0, 0, 0, 16, 4, 16).build(),

View file

@ -187,5 +187,7 @@ public class AllTags {
AllBlockTags.FAN_TRANSPARENT.add(Blocks.IRON_BARS); AllBlockTags.FAN_TRANSPARENT.add(Blocks.IRON_BARS);
AllBlockTags.FAN_HEATERS.add(Blocks.MAGMA_BLOCK, Blocks.CAMPFIRE, Blocks.LAVA, Blocks.FIRE); AllBlockTags.FAN_HEATERS.add(Blocks.MAGMA_BLOCK, Blocks.CAMPFIRE, Blocks.LAVA, Blocks.FIRE);
AllBlockTags.SAFE_NBT.includeAll(BlockTags.SIGNS);
} }
} }

View file

@ -40,6 +40,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.MechanicalBearingTileEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.WindmillBearingTileEntity; 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.ChassisTileEntity;
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; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerTileEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonRenderer;
import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonTileEntity;
@ -68,6 +70,7 @@ import com.simibubi.create.content.contraptions.processing.BasinRenderer;
import com.simibubi.create.content.contraptions.processing.BasinTileEntity; import com.simibubi.create.content.contraptions.processing.BasinTileEntity;
import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerRenderer; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerRenderer;
import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerTileEntity; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerTileEntity;
import com.simibubi.create.content.contraptions.relays.advanced.GantryShaftTileEntity;
import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerRenderer; import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerRenderer;
import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerTileEntity; import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerTileEntity;
import com.simibubi.create.content.contraptions.relays.advanced.sequencer.SequencedGearshiftTileEntity; import com.simibubi.create.content.contraptions.relays.advanced.sequencer.SequencedGearshiftTileEntity;
@ -204,6 +207,18 @@ public class AllTileEntities {
.renderer(() -> CuckooClockRenderer::new) .renderer(() -> CuckooClockRenderer::new)
.register(); .register();
public static final TileEntityEntry<GantryShaftTileEntity> GANTRY_SHAFT = Create.registrate()
.tileEntity("gantry_shaft", GantryShaftTileEntity::new)
.validBlocks(AllBlocks.GANTRY_SHAFT)
.renderer(() -> KineticTileEntityRenderer::new)
.register();
public static final TileEntityEntry<GantryPinionTileEntity> GANTRY_PINION = Create.registrate()
.tileEntity("gantry_pinion", GantryPinionTileEntity::new)
.validBlocks(AllBlocks.GANTRY_PINION)
.renderer(() -> GantryPinionRenderer::new)
.register();
public static final TileEntityEntry<PumpTileEntity> MECHANICAL_PUMP = Create.registrate() public static final TileEntityEntry<PumpTileEntity> MECHANICAL_PUMP = Create.registrate()
.tileEntity("mechanical_pump", PumpTileEntity::new) .tileEntity("mechanical_pump", PumpTileEntity::new)
.validBlocks(AllBlocks.MECHANICAL_PUMP) .validBlocks(AllBlocks.MECHANICAL_PUMP)

View file

@ -14,6 +14,7 @@ import com.simibubi.create.content.logistics.RedstoneLinkNetworkHandler;
import com.simibubi.create.content.palettes.AllPaletteBlocks; import com.simibubi.create.content.palettes.AllPaletteBlocks;
import com.simibubi.create.content.palettes.PalettesItemGroup; import com.simibubi.create.content.palettes.PalettesItemGroup;
import com.simibubi.create.content.schematics.ServerSchematicLoader; import com.simibubi.create.content.schematics.ServerSchematicLoader;
import com.simibubi.create.content.schematics.filtering.SchematicInstances;
import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.advancement.AllAdvancements;
import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.advancement.AllTriggers;
import com.simibubi.create.foundation.command.ChunkUtil; import com.simibubi.create.foundation.command.ChunkUtil;
@ -99,6 +100,7 @@ public class Create {
public static void init(final FMLCommonSetupEvent event) { public static void init(final FMLCommonSetupEvent event) {
CapabilityMinecartController.register(); CapabilityMinecartController.register();
SchematicInstances.register();
schematicReceiver = new ServerSchematicLoader(); schematicReceiver = new ServerSchematicLoader();
redstoneLinkNetworkHandler = new RedstoneLinkNetworkHandler(); redstoneLinkNetworkHandler = new RedstoneLinkNetworkHandler();
torquePropagator = new TorquePropagator(); torquePropagator = new TorquePropagator();

View file

@ -8,7 +8,6 @@ import java.util.stream.Collectors;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.compat.jei.category.animations.AnimatedCrafter; import com.simibubi.create.compat.jei.category.animations.AnimatedCrafter;
import com.simibubi.create.compat.jei.category.animations.AnimatedKinetics;
import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllGuiTextures;
import mezz.jei.api.constants.VanillaTypes; import mezz.jei.api.constants.VanillaTypes;

View file

@ -11,7 +11,6 @@ import com.simibubi.create.content.contraptions.base.IRotate;
import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerBlock; import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerBlock;
import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerTileEntity; import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerTileEntity;
import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity;
import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock;
import com.simibubi.create.content.contraptions.relays.encased.DirectionalShaftHalvesTileEntity; import com.simibubi.create.content.contraptions.relays.encased.DirectionalShaftHalvesTileEntity;
import com.simibubi.create.content.contraptions.relays.encased.EncasedBeltBlock; import com.simibubi.create.content.contraptions.relays.encased.EncasedBeltBlock;
@ -70,11 +69,9 @@ public class RotationPropagator {
boolean connectedByGears = definitionFrom.hasIntegratedCogwheel(world, from.getPos(), stateFrom) boolean connectedByGears = definitionFrom.hasIntegratedCogwheel(world, from.getPos(), stateFrom)
&& definitionTo.hasIntegratedCogwheel(world, to.getPos(), stateTo); && definitionTo.hasIntegratedCogwheel(world, to.getPos(), stateTo);
// Belt <-> Belt float custom = from.propagateRotationTo(to, stateFrom, stateTo, diff, connectedByAxis, connectedByGears);
if (from instanceof BeltTileEntity && to instanceof BeltTileEntity && !connectedByAxis) { if (custom != 0)
return ((BeltTileEntity) from).getController() return custom;
.equals(((BeltTileEntity) to).getController()) ? 1 : 0;
}
// Axis <-> Axis // Axis <-> Axis
if (connectedByAxis) { if (connectedByAxis) {
@ -230,6 +227,9 @@ public class RotationPropagator {
float newSpeed = getConveyedSpeed(currentTE, neighbourTE); float newSpeed = getConveyedSpeed(currentTE, neighbourTE);
float oppositeSpeed = getConveyedSpeed(neighbourTE, currentTE); float oppositeSpeed = getConveyedSpeed(neighbourTE, currentTE);
if (newSpeed == 0 && oppositeSpeed == 0)
continue;
boolean incompatible = boolean incompatible =
Math.signum(newSpeed) != Math.signum(speedOfNeighbour) && (newSpeed != 0 && speedOfNeighbour != 0); Math.signum(newSpeed) != Math.signum(speedOfNeighbour) && (newSpeed != 0 && speedOfNeighbour != 0);
@ -395,7 +395,7 @@ public class RotationPropagator {
if (!(neighbourKTE.getBlockState() if (!(neighbourKTE.getBlockState()
.getBlock() instanceof IRotate)) .getBlock() instanceof IRotate))
return null; return null;
if (!isConnected(currentTE, neighbourKTE)) if (!isConnected(currentTE, neighbourKTE) && !isConnected(neighbourKTE, currentTE))
return null; return null;
return neighbourKTE; return neighbourKTE;
} }
@ -403,14 +403,9 @@ public class RotationPropagator {
public static boolean isConnected(KineticTileEntity from, KineticTileEntity to) { public static boolean isConnected(KineticTileEntity from, KineticTileEntity to) {
final BlockState stateFrom = from.getBlockState(); final BlockState stateFrom = from.getBlockState();
final BlockState stateTo = to.getBlockState(); final BlockState stateTo = to.getBlockState();
return isLargeCogToSpeedController(stateFrom, stateTo, to.getPos()
if (isLargeCogToSpeedController(stateFrom, stateTo, to.getPos() .subtract(from.getPos())) || getRotationSpeedModifier(from, to) != 0
.subtract(from.getPos()))) || from.isCustomConnection(to, stateFrom, stateTo);
return true;
if (isLargeCogToSpeedController(stateTo, stateFrom, from.getPos()
.subtract(to.getPos())))
return true;
return getRotationSpeedModifier(from, to) != 0;
} }
private static List<KineticTileEntity> getConnectedNeighbours(KineticTileEntity te) { private static List<KineticTileEntity> getConnectedNeighbours(KineticTileEntity te) {
@ -436,30 +431,11 @@ public class RotationPropagator {
neighbours.add(te.getPos() neighbours.add(te.getPos()
.offset(facing)); .offset(facing));
// Some Blocks can interface diagonally
BlockState blockState = te.getBlockState(); BlockState blockState = te.getBlockState();
boolean isLargeWheel = isLargeCog(blockState);
if (!(blockState.getBlock() instanceof IRotate)) if (!(blockState.getBlock() instanceof IRotate))
return neighbours; return neighbours;
IRotate block = (IRotate) blockState.getBlock(); IRotate block = (IRotate) blockState.getBlock();
return te.addPropagationLocations(block, blockState, neighbours);
if (block.hasIntegratedCogwheel(te.getWorld(), te.getPos(), blockState) || isLargeWheel
|| AllBlocks.BELT.has(blockState)) {
Axis axis = block.getRotationAxis(blockState);
BlockPos.getAllInBox(new BlockPos(-1, -1, -1), new BlockPos(1, 1, 1))
.forEach(offset -> {
if (!isLargeWheel && axis.getCoordinate(offset.getX(), offset.getY(), offset.getZ()) != 0)
return;
if (offset.distanceSq(0, 0, 0, false) != BlockPos.ZERO.distanceSq(1, 1, 0, false))
return;
neighbours.add(te.getPos()
.add(offset));
});
}
return neighbours;
} }
} }

View file

@ -31,7 +31,8 @@ public abstract class KineticBlock extends Block implements IRotate {
@Override @Override
public boolean canHarvestBlock(BlockState state, IBlockReader world, BlockPos pos, PlayerEntity player) { public boolean canHarvestBlock(BlockState state, IBlockReader world, BlockPos pos, PlayerEntity player) {
for (ToolType toolType : player.getHeldItemMainhand().getToolTypes()) { for (ToolType toolType : player.getHeldItemMainhand()
.getToolTypes()) {
if (isToolEffective(state, toolType)) if (isToolEffective(state, toolType))
return true; return true;
} }
@ -46,6 +47,24 @@ public abstract class KineticBlock extends Block implements IRotate {
@Override @Override
public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) {
// onBlockAdded is useless for init, as sometimes the TE gets re-instantiated // onBlockAdded is useless for init, as sometimes the TE gets re-instantiated
// however, if a block change occurs that does not change kinetic connections,
// we can prevent a major re-propagation here
TileEntity tileEntity = worldIn.getTileEntity(pos);
if (tileEntity instanceof KineticTileEntity) {
KineticTileEntity kineticTileEntity = (KineticTileEntity) tileEntity;
kineticTileEntity.preventSpeedUpdate = false;
if (oldState.getBlock() != state.getBlock())
return;
if (state.hasTileEntity() != oldState.hasTileEntity())
return;
if (!areStatesKineticallyEquivalent(oldState, state))
return;
kineticTileEntity.preventSpeedUpdate = true;
}
} }
@Override @Override
@ -63,6 +82,10 @@ public abstract class KineticBlock extends Block implements IRotate {
return true; return true;
} }
protected boolean areStatesKineticallyEquivalent(BlockState oldState, BlockState newState) {
return getRotationAxis(newState) == getRotationAxis(oldState);
}
@Override @Override
public abstract TileEntity createTileEntity(BlockState state, IBlockReader world); public abstract TileEntity createTileEntity(BlockState state, IBlockReader world);
@ -76,9 +99,14 @@ public abstract class KineticBlock extends Block implements IRotate {
TileEntity tileEntity = worldIn.getTileEntity(pos); TileEntity tileEntity = worldIn.getTileEntity(pos);
if (!(tileEntity instanceof KineticTileEntity)) if (!(tileEntity instanceof KineticTileEntity))
return; return;
KineticTileEntity kte = (KineticTileEntity) tileEntity;
if (kte.preventSpeedUpdate) {
kte.preventSpeedUpdate = false;
return;
}
// Remove previous information when block is added // Remove previous information when block is added
KineticTileEntity kte = (KineticTileEntity) tileEntity;
kte.warnOfMovement(); kte.warnOfMovement();
kte.clearKineticInformation(); kte.clearKineticInformation();
kte.updateSpeed = true; kte.updateSpeed = true;

View file

@ -30,6 +30,7 @@ import net.minecraft.tileentity.ITickableTileEntity;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityType; import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.Direction.AxisDirection; import net.minecraft.util.Direction.AxisDirection;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextFormatting; import net.minecraft.util.text.TextFormatting;
@ -42,6 +43,7 @@ public abstract class KineticTileEntity extends SmartTileEntity
public @Nullable BlockPos source; public @Nullable BlockPos source;
public boolean networkDirty; public boolean networkDirty;
public boolean updateSpeed; public boolean updateSpeed;
public boolean preventSpeedUpdate;
protected KineticEffectHandler effects; protected KineticEffectHandler effects;
protected float speed; protected float speed;
@ -361,11 +363,15 @@ public abstract class KineticTileEntity extends SmartTileEntity
} }
KineticTileEntity tileEntity = (KineticTileEntity) tileEntityIn; KineticTileEntity tileEntity = (KineticTileEntity) tileEntityIn;
if (state.getBlock() instanceof KineticBlock
&& !((KineticBlock) state.getBlock()).areStatesKineticallyEquivalent(currentState, state)) {
if (tileEntity.hasNetwork()) if (tileEntity.hasNetwork())
tileEntity.getOrCreateNetwork() tileEntity.getOrCreateNetwork()
.remove(tileEntity); .remove(tileEntity);
tileEntity.detachKinetics(); tileEntity.detachKinetics();
tileEntity.removeSource(); tileEntity.removeSource();
}
world.setBlockState(pos, state, 3); world.setBlockState(pos, state, 3);
} }
@ -417,8 +423,8 @@ public abstract class KineticTileEntity extends SmartTileEntity
String stressString = String stressString =
spacing + "%s%s" + Lang.translate("generic.unit.stress") + " " + TextFormatting.DARK_GRAY + "%s"; spacing + "%s%s" + Lang.translate("generic.unit.stress") + " " + TextFormatting.DARK_GRAY + "%s";
tooltip.add(" " + String.format(stressString, TextFormatting.AQUA, IHaveGoggleInformation.format(stressTotal), tooltip.add(" " + String.format(stressString, TextFormatting.AQUA,
Lang.translate("gui.goggles.at_current_speed"))); IHaveGoggleInformation.format(stressTotal), Lang.translate("gui.goggles.at_current_speed")));
added = true; added = true;
} }
@ -454,4 +460,72 @@ public abstract class KineticTileEntity extends SmartTileEntity
return overStressed; return overStressed;
} }
// Custom Propagation
/**
* Specify ratio of transferred rotation from this kinetic component to a
* specific other.
*
* @param target other Kinetic TE to transfer to
* @param stateFrom this TE's blockstate
* @param stateTo other TE's blockstate
* @param diff difference in position (to.pos - from.pos)
* @param connectedViaAxes whether these kinetic blocks are connected via mutual
* IRotate.hasShaftTowards()
* @param connectedViaCogs whether these kinetic blocks are connected via mutual
* IRotate.hasIntegratedCogwheel()
* @return factor of rotation speed from this TE to other. 0 if no rotation is
* transferred, or the standard rules apply (integrated shafts/cogs)
*/
public float propagateRotationTo(KineticTileEntity target, BlockState stateFrom, BlockState stateTo, BlockPos diff,
boolean connectedViaAxes, boolean connectedViaCogs) {
return 0;
}
/**
* Specify additional locations the rotation propagator should look for
* potentially connected components. Neighbour list contains offset positions in
* all 6 directions by default.
*
* @param block
* @param state
* @param neighbours
* @return
*/
public List<BlockPos> addPropagationLocations(IRotate block, BlockState state, List<BlockPos> neighbours) {
if (!canPropagateDiagonally(block, state))
return neighbours;
Axis axis = block.getRotationAxis(state);
BlockPos.getAllInBox(new BlockPos(-1, -1, -1), new BlockPos(1, 1, 1))
.forEach(offset -> {
if (axis.getCoordinate(offset.getX(), offset.getY(), offset.getZ()) != 0)
return;
if (offset.distanceSq(0, 0, 0, false) != BlockPos.ZERO.distanceSq(1, 1, 0, false))
return;
neighbours.add(pos.add(offset));
});
return neighbours;
}
/**
* Specify whether this component can propagate speed to the other in any
* circumstance. Shaft and cogwheel connections are already handled by internal
* logic. Does not have to be specified on both ends, it is assumed that this
* relation is symmetrical.
*
* @param other
* @param state
* @param otherState
* @return true if this and the other component should check their propagation
* factor and are not already connected via integrated cogs or shafts
*/
public boolean isCustomConnection(KineticTileEntity other, BlockState state, BlockState otherState) {
return false;
}
protected boolean canPropagateDiagonally(IRotate block, BlockState state) {
return block.hasIntegratedCogwheel(world, pos, state);
}
} }

View file

@ -183,7 +183,6 @@ public class DeployerTileEntity extends KineticTileEntity {
if (state == State.EXPANDING) { if (state == State.EXPANDING) {
if (boop) if (boop)
triggerBoop(); triggerBoop();
else
activate(); activate();
state = State.RETRACTING; state = State.RETRACTING;

View file

@ -82,7 +82,7 @@ public class AirCurrent {
protected void tickAffectedEntities(World world, Direction facing) { protected void tickAffectedEntities(World world, Direction facing) {
for (Iterator<Entity> iterator = caughtEntities.iterator(); iterator.hasNext();) { for (Iterator<Entity> iterator = caughtEntities.iterator(); iterator.hasNext();) {
Entity entity = iterator.next(); Entity entity = iterator.next();
if (!entity.getBoundingBox() if (!entity.isAlive() || !entity.getBoundingBox()
.intersects(bounds)) { .intersects(bounds)) {
iterator.remove(); iterator.remove();
continue; continue;

View file

@ -1,6 +1,5 @@
package com.simibubi.create.content.contraptions.components.fan; package com.simibubi.create.content.contraptions.components.fan;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllTileEntities; import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock; import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock;
import com.simibubi.create.content.logistics.block.chute.AbstractChuteBlock; import com.simibubi.create.content.logistics.block.chute.AbstractChuteBlock;
@ -33,9 +32,16 @@ public class EncasedFanBlock extends DirectionalKineticBlock implements ITE<Enca
@Override @Override
public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) {
super.onBlockAdded(state, worldIn, pos, oldState, isMoving);
blockUpdate(state, worldIn, pos); blockUpdate(state, worldIn, pos);
} }
@Override
public void updateNeighbors(BlockState stateIn, IWorld worldIn, BlockPos pos, int flags) {
super.updateNeighbors(stateIn, worldIn, pos, flags);
blockUpdate(stateIn, worldIn, pos);
}
@Override @Override
public void onReplaced(BlockState state, World world, BlockPos pos, BlockState p_196243_4_, boolean p_196243_5_) { public void onReplaced(BlockState state, World world, BlockPos pos, BlockState p_196243_4_, boolean p_196243_5_) {
if (state.hasTileEntity() && (state.getBlock() != p_196243_4_.getBlock() || !p_196243_4_.hasTileEntity())) { if (state.hasTileEntity() && (state.getBlock() != p_196243_4_.getBlock() || !p_196243_4_.hasTileEntity())) {
@ -70,13 +76,13 @@ public class EncasedFanBlock extends DirectionalKineticBlock implements ITE<Enca
.isSneaking() ? preferredFacing : preferredFacing.getOpposite()); .isSneaking() ? preferredFacing : preferredFacing.getOpposite());
} }
protected void blockUpdate(BlockState state, World worldIn, BlockPos pos) { protected void blockUpdate(BlockState state, IWorld worldIn, BlockPos pos) {
if (worldIn instanceof WrappedWorld) if (worldIn instanceof WrappedWorld)
return; return;
notifyFanTile(worldIn, pos); notifyFanTile(worldIn, pos);
if (worldIn.isRemote) if (worldIn.isRemote())
return; return;
withTileEntityDo(worldIn, pos, te -> te.updateGenerator(state.get(FACING))); withTileEntityDo(worldIn, pos, te -> te.queueGeneratorUpdate());
} }
protected void notifyFanTile(IWorld world, BlockPos pos) { protected void notifyFanTile(IWorld world, BlockPos pos) {

View file

@ -2,6 +2,7 @@ package com.simibubi.create.content.contraptions.components.fan;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllTags.AllBlockTags; import com.simibubi.create.AllTags.AllBlockTags;
import com.simibubi.create.content.contraptions.base.GeneratingKineticTileEntity; import com.simibubi.create.content.contraptions.base.GeneratingKineticTileEntity;
import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock;
@ -18,7 +19,6 @@ import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
@MethodsReturnNonnullByDefault @MethodsReturnNonnullByDefault
public class EncasedFanTileEntity extends GeneratingKineticTileEntity implements IAirCurrentSource { public class EncasedFanTileEntity extends GeneratingKineticTileEntity implements IAirCurrentSource {
@ -27,17 +27,20 @@ public class EncasedFanTileEntity extends GeneratingKineticTileEntity implements
protected int entitySearchCooldown; protected int entitySearchCooldown;
protected boolean isGenerator; protected boolean isGenerator;
protected boolean updateAirFlow; protected boolean updateAirFlow;
protected boolean updateGenerator;
public EncasedFanTileEntity(TileEntityType<? extends EncasedFanTileEntity> type) { public EncasedFanTileEntity(TileEntityType<? extends EncasedFanTileEntity> type) {
super(type); super(type);
isGenerator = false; isGenerator = false;
airCurrent = new AirCurrent(this); airCurrent = new AirCurrent(this);
updateAirFlow = true; updateAirFlow = true;
updateGenerator = false;
} }
@Override @Override
protected void read(CompoundNBT compound, boolean clientPacket) { protected void read(CompoundNBT compound, boolean clientPacket) {
super.read(compound, clientPacket); super.read(compound, clientPacket);
if (!wasMoved)
isGenerator = compound.getBoolean("Generating"); isGenerator = compound.getBoolean("Generating");
if (clientPacket) if (clientPacket)
airCurrent.rebuild(); airCurrent.rebuild();
@ -64,12 +67,20 @@ public class EncasedFanTileEntity extends GeneratingKineticTileEntity implements
return isGenerator ? AllConfigs.SERVER.kinetics.generatingFanSpeed.get() : 0; return isGenerator ? AllConfigs.SERVER.kinetics.generatingFanSpeed.get() : 0;
} }
public void updateGenerator(Direction facing) { public void queueGeneratorUpdate() {
boolean shouldGenerate = world.isBlockPowered(pos) && facing == Direction.DOWN updateGenerator = true;
&& world.isBlockPresent(pos.down()) && blockBelowIsHot(); }
if (shouldGenerate == isGenerator)
public void updateGenerator() {
BlockState blockState = getBlockState();
if (!AllBlocks.ENCASED_FAN.has(blockState))
return;
if (blockState.get(EncasedFanBlock.FACING) != Direction.DOWN)
return; return;
boolean shouldGenerate = world.isBlockPowered(pos) && world.isBlockPresent(pos.down()) && blockBelowIsHot();
if (shouldGenerate == isGenerator)
return;
isGenerator = shouldGenerate; isGenerator = shouldGenerate;
updateGeneratedRotation(); updateGeneratedRotation();
} }
@ -171,6 +182,11 @@ public class EncasedFanTileEntity extends GeneratingKineticTileEntity implements
sendData(); sendData();
} }
if (updateGenerator) {
updateGenerator = false;
updateGenerator();
}
if (getSpeed() == 0 || isGenerator) if (getSpeed() == 0 || isGenerator)
return; return;

View file

@ -27,8 +27,8 @@ public class CreativeMotorTileEntity extends GeneratingKineticTileEntity {
super.addBehaviours(behaviours); super.addBehaviours(behaviours);
Integer max = AllConfigs.SERVER.kinetics.maxMotorSpeed.get(); Integer max = AllConfigs.SERVER.kinetics.maxMotorSpeed.get();
CenteredSideValueBoxTransform slot = CenteredSideValueBoxTransform slot = new CenteredSideValueBoxTransform(
new CenteredSideValueBoxTransform((motor, side) -> motor.get(CreativeMotorBlock.FACING) == side.getOpposite()); (motor, side) -> motor.get(CreativeMotorBlock.FACING) == side.getOpposite());
generatedSpeed = new ScrollValueBehaviour(Lang.translate("generic.speed"), this, slot); generatedSpeed = new ScrollValueBehaviour(Lang.translate("generic.speed"), this, slot);
generatedSpeed.between(-max, max); generatedSpeed.between(-max, max);
@ -55,20 +55,21 @@ public class CreativeMotorTileEntity extends GeneratingKineticTileEntity {
} }
public static int step(StepContext context) { public static int step(StepContext context) {
if (context.shift)
return 1;
int current = context.currentValue; int current = context.currentValue;
int magnitude = Math.abs(current) - (context.forward == current > 0 ? 0 : 1);
int step = 1; int step = 1;
if (!context.shift) {
int magnitude = Math.abs(current) - (context.forward == current > 0 ? 0 : 1);
if (magnitude >= 4) if (magnitude >= 4)
step *= 4; step *= 4;
if (magnitude >= 32) if (magnitude >= 32)
step *= 4; step *= 4;
if (magnitude >= 128) if (magnitude >= 128)
step *= 4; step *= 4;
return step; }
return (int) (current + (context.forward ? step : -step) == 0 ? step + 1 : step);
} }
} }

View file

@ -153,6 +153,8 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity {
for (ItemEntity itemEntity : world.getEntitiesWithinAABB(ItemEntity.class, for (ItemEntity itemEntity : world.getEntitiesWithinAABB(ItemEntity.class,
new AxisAlignedBB(pos.down()).shrink(.125f))) { new AxisAlignedBB(pos.down()).shrink(.125f))) {
if (!itemEntity.isAlive() || !itemEntity.onGround)
continue;
ItemStack stack = itemEntity.getItem(); ItemStack stack = itemEntity.getItem();
Optional<PressingRecipe> recipe = getRecipe(stack); Optional<PressingRecipe> recipe = getRecipe(stack);
if (!recipe.isPresent()) if (!recipe.isPresent())
@ -233,7 +235,7 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity {
for (Entity entity : world.getEntitiesWithinAABBExcludingEntity(null, bb)) { for (Entity entity : world.getEntitiesWithinAABBExcludingEntity(null, bb)) {
if (!(entity instanceof ItemEntity)) if (!(entity instanceof ItemEntity))
continue; continue;
if (!entity.isAlive()) if (!entity.isAlive() || !entity.onGround)
continue; continue;
ItemEntity itemEntity = (ItemEntity) entity; ItemEntity itemEntity = (ItemEntity) entity;
pressedItems.add(itemEntity.getItem()); pressedItems.add(itemEntity.getItem());

View file

@ -74,6 +74,10 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit
contraption.onEntityCreated(this); contraption.onEntityCreated(this);
} }
public boolean supportsTerrainCollision() {
return contraption instanceof TranslatingContraption;
}
protected void contraptionInitialize() { protected void contraptionInitialize() {
contraption.onEntityInitialize(world, this); contraption.onEntityInitialize(world, this);
initialized = true; initialized = true;
@ -594,7 +598,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit
} }
public static class ContraptionRotationState { public static class ContraptionRotationState {
static final ContraptionRotationState NONE = new ContraptionRotationState(); public static final ContraptionRotationState NONE = new ContraptionRotationState();
float xRotation = 0; float xRotation = 0;
float yRotation = 0; float yRotation = 0;

View file

@ -1,39 +0,0 @@
package com.simibubi.create.content.contraptions.components.structureMovement;
import java.util.function.Supplier;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.BearingContraption;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.ClockworkContraption;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.StabilizedContraption;
import com.simibubi.create.content.contraptions.components.structureMovement.mounted.MountedContraption;
import com.simibubi.create.content.contraptions.components.structureMovement.piston.PistonContraption;
import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyContraption;
import com.simibubi.create.foundation.utility.Lang;
public enum AllContraptionTypes {
PISTON(PistonContraption::new),
BEARING(BearingContraption::new),
PULLEY(PulleyContraption::new),
CLOCKWORK(ClockworkContraption::new),
MOUNTED(MountedContraption::new),
STABILIZED(StabilizedContraption::new),
;
Supplier<? extends Contraption> factory;
String id;
private AllContraptionTypes(Supplier<? extends Contraption> factory) {
this.factory = factory;
id = Lang.asId(name());
}
public static Contraption fromType(String type) {
for (AllContraptionTypes allContraptionTypes : values())
if (type.equals(allContraptionTypes.id))
return allContraptionTypes.factory.get();
return null;
}
}

View file

@ -227,6 +227,12 @@ public class BlockMovementTraits {
if (state.getBlock() instanceof SailBlock) if (state.getBlock() instanceof SailBlock)
return facing.getAxis() == state.get(SailBlock.FACING) return facing.getAxis() == state.get(SailBlock.FACING)
.getAxis(); .getAxis();
if (AllBlocks.PISTON_EXTENSION_POLE.has(state))
return facing.getAxis() != state.get(BlockStateProperties.FACING)
.getAxis();
if (AllBlocks.MECHANICAL_PISTON_HEAD.has(state))
return facing.getAxis() != state.get(BlockStateProperties.FACING)
.getAxis();
return isBrittle(state); return isBrittle(state);
} }

View file

@ -23,6 +23,7 @@ import org.apache.commons.lang3.tuple.Pair;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllMovementBehaviours; import com.simibubi.create.AllMovementBehaviours;
import com.simibubi.create.content.contraptions.base.IRotate;
import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.components.actors.SeatBlock; import com.simibubi.create.content.contraptions.components.actors.SeatBlock;
import com.simibubi.create.content.contraptions.components.actors.SeatEntity; import com.simibubi.create.content.contraptions.components.actors.SeatEntity;
@ -30,16 +31,19 @@ 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.bearing.StabilizedContraption;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.AbstractChassisBlock; 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.ChassisTileEntity;
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.SuperGlueEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueHandler; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueHandler;
import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.PistonState; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.PistonState;
import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonHeadBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.piston.PistonExtensionPoleBlock; import com.simibubi.create.content.contraptions.components.structureMovement.piston.PistonExtensionPoleBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyBlock; import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyBlock.MagnetBlock; import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyBlock.MagnetBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyBlock.RopeBlock; import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyBlock.RopeBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyTileEntity;
import com.simibubi.create.content.contraptions.fluids.tank.FluidTankTileEntity; import com.simibubi.create.content.contraptions.fluids.tank.FluidTankTileEntity;
import com.simibubi.create.content.contraptions.relays.advanced.GantryShaftBlock;
import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; import com.simibubi.create.content.contraptions.relays.belt.BeltBlock;
import com.simibubi.create.content.logistics.block.inventories.AdjustableCrateBlock; import com.simibubi.create.content.logistics.block.inventories.AdjustableCrateBlock;
import com.simibubi.create.content.logistics.block.redstone.RedstoneContactBlock; import com.simibubi.create.content.logistics.block.redstone.RedstoneContactBlock;
@ -48,6 +52,7 @@ import com.simibubi.create.foundation.fluid.CombinedTankWrapper;
import com.simibubi.create.foundation.utility.BlockFace; import com.simibubi.create.foundation.utility.BlockFace;
import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.NBTHelper;
import com.simibubi.create.foundation.utility.NBTProcessors;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld;
@ -59,6 +64,7 @@ import net.minecraft.block.ChestBlock;
import net.minecraft.block.DoorBlock; import net.minecraft.block.DoorBlock;
import net.minecraft.block.IWaterLoggable; import net.minecraft.block.IWaterLoggable;
import net.minecraft.block.PressurePlateBlock; import net.minecraft.block.PressurePlateBlock;
import net.minecraft.block.material.PushReaction;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.fluid.Fluids; import net.minecraft.fluid.Fluids;
import net.minecraft.fluid.IFluidState; import net.minecraft.fluid.IFluidState;
@ -69,6 +75,7 @@ import net.minecraft.nbt.NBTUtil;
import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.state.properties.ChestType; import net.minecraft.state.properties.ChestType;
import net.minecraft.state.properties.DoubleBlockHalf; import net.minecraft.state.properties.DoubleBlockHalf;
import net.minecraft.state.properties.PistonType;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis; import net.minecraft.util.Direction.Axis;
@ -134,9 +141,9 @@ public abstract class Contraption {
public abstract boolean assemble(World world, BlockPos pos); public abstract boolean assemble(World world, BlockPos pos);
protected abstract boolean canAxisBeStabilized(Axis axis); public abstract boolean canBeStabilized(Direction facing, BlockPos localPos);
protected abstract AllContraptionTypes getType(); protected abstract ContraptionType getType();
protected boolean customBlockPlacement(IWorld world, BlockPos pos, BlockState state) { protected boolean customBlockPlacement(IWorld world, BlockPos pos, BlockState state) {
return false; return false;
@ -153,7 +160,7 @@ public abstract class Contraption {
public static Contraption fromNBT(World world, CompoundNBT nbt, boolean spawnData) { public static Contraption fromNBT(World world, CompoundNBT nbt, boolean spawnData) {
String type = nbt.getString("Type"); String type = nbt.getString("Type");
Contraption contraption = AllContraptionTypes.fromType(type); Contraption contraption = ContraptionType.fromType(type);
contraption.readNBT(world, nbt, spawnData); contraption.readNBT(world, nbt, spawnData);
return contraption; return contraption;
} }
@ -240,7 +247,7 @@ public abstract class Contraption {
fluidStorage.forEach((pos, mfs) -> mfs.tick(entity, pos, world.isRemote)); fluidStorage.forEach((pos, mfs) -> mfs.tick(entity, pos, world.isRemote));
} }
protected boolean moveBlock(World world, BlockPos pos, Direction forcedDirection, List<BlockPos> frontier, protected boolean moveBlock(World world, BlockPos pos, @Nullable Direction forcedDirection, List<BlockPos> frontier,
Set<BlockPos> visited) { Set<BlockPos> visited) {
visited.add(pos); visited.add(pos);
frontier.remove(pos); frontier.remove(pos);
@ -264,6 +271,12 @@ public abstract class Contraption {
if (AllBlocks.BELT.has(state)) if (AllBlocks.BELT.has(state))
moveBelt(pos, frontier, visited, state); moveBelt(pos, frontier, visited, state);
if (AllBlocks.GANTRY_PINION.has(state))
moveGantryPinion(world, pos, frontier, visited, state);
if (AllBlocks.GANTRY_SHAFT.has(state))
moveGantryShaft(world, pos, frontier, visited, state);
// Bearings potentially create stabilized sub-contraptions // Bearings potentially create stabilized sub-contraptions
if (AllBlocks.MECHANICAL_BEARING.has(state)) if (AllBlocks.MECHANICAL_BEARING.has(state))
moveBearing(pos, frontier, visited, state); moveBearing(pos, frontier, visited, state);
@ -280,6 +293,10 @@ public abstract class Contraption {
if (state.getBlock() instanceof MechanicalPistonBlock) if (state.getBlock() instanceof MechanicalPistonBlock)
if (!moveMechanicalPiston(world, pos, frontier, visited, state)) if (!moveMechanicalPiston(world, pos, frontier, visited, state))
return false; return false;
if (isExtensionPole(state))
movePistonPole(world, pos, frontier, visited, state);
if (isPistonHead(state))
movePistonHead(world, pos, frontier, visited, state);
// Doors try to stay whole // Doors try to stay whole
if (state.getBlock() instanceof DoorBlock) { if (state.getBlock() instanceof DoorBlock) {
@ -296,14 +313,13 @@ public abstract class Contraption {
Map<Direction, SuperGlueEntity> superglue = SuperGlueHandler.gatherGlue(world, pos); Map<Direction, SuperGlueEntity> superglue = SuperGlueHandler.gatherGlue(world, pos);
// Slime blocks and super glue drag adjacent blocks if possible // Slime blocks and super glue drag adjacent blocks if possible
boolean isStickyBlock = state.isStickyBlock();
for (Direction offset : Iterate.directions) { for (Direction offset : Iterate.directions) {
BlockPos offsetPos = pos.offset(offset); BlockPos offsetPos = pos.offset(offset);
BlockState blockState = world.getBlockState(offsetPos); BlockState blockState = world.getBlockState(offsetPos);
if (isAnchoringBlockAt(offsetPos)) if (isAnchoringBlockAt(offsetPos))
continue; continue;
if (!movementAllowed(world, offsetPos)) { if (!movementAllowed(world, offsetPos)) {
if (offset == forcedDirection && isStickyBlock) if (offset == forcedDirection)
return false; return false;
continue; continue;
} }
@ -313,8 +329,20 @@ public abstract class Contraption {
boolean blockAttachedTowardsFace = boolean blockAttachedTowardsFace =
BlockMovementTraits.isBlockAttachedTowards(world, offsetPos, blockState, offset.getOpposite()); BlockMovementTraits.isBlockAttachedTowards(world, offsetPos, blockState, offset.getOpposite());
boolean brittle = BlockMovementTraits.isBrittle(blockState); 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) {
canStick = false;
}
if (BlockMovementTraits.notSupportive(state, offset)) {
canStick = false;
}
if (BlockMovementTraits.notSupportive(blockState, offset.getOpposite())) {
canStick = false;
}
}
if (!wasVisited && ((isStickyBlock && !brittle) || blockAttachedTowardsFace || faceHasGlue)) if (!wasVisited && (canStick || blockAttachedTowardsFace || faceHasGlue || (offset == forcedDirection && !BlockMovementTraits.notSupportive(state, forcedDirection))))
frontier.add(offsetPos); frontier.add(offsetPos);
if (faceHasGlue) if (faceHasGlue)
addGlue(superglue.get(offset)); addGlue(superglue.get(offset));
@ -324,9 +352,86 @@ public abstract class Contraption {
return blocks.size() <= AllConfigs.SERVER.kinetics.maxBlocksMoved.get(); return blocks.size() <= AllConfigs.SERVER.kinetics.maxBlocksMoved.get();
} }
protected void movePistonHead(World world, BlockPos pos, List<BlockPos> frontier, Set<BlockPos> visited,
BlockState state) {
Direction direction = state.get(MechanicalPistonHeadBlock.FACING);
BlockPos offset = pos.offset(direction.getOpposite());
if (!visited.contains(offset)) {
BlockState blockState = world.getBlockState(offset);
if (isExtensionPole(blockState) && blockState.get(PistonExtensionPoleBlock.FACING)
.getAxis() == direction.getAxis())
frontier.add(offset);
if (blockState.getBlock() instanceof MechanicalPistonBlock) {
Direction pistonFacing = blockState.get(MechanicalPistonBlock.FACING);
if (pistonFacing == direction && blockState.get(MechanicalPistonBlock.STATE) == PistonState.EXTENDED)
frontier.add(offset);
}
}
if (state.get(MechanicalPistonHeadBlock.TYPE) == PistonType.STICKY) {
BlockPos attached = pos.offset(direction);
if (!visited.contains(attached))
frontier.add(attached);
}
}
protected void movePistonPole(World world, BlockPos pos, List<BlockPos> frontier, Set<BlockPos> visited,
BlockState state) {
for (Direction d : Iterate.directionsInAxis(state.get(PistonExtensionPoleBlock.FACING)
.getAxis())) {
BlockPos offset = pos.offset(d);
if (!visited.contains(offset)) {
BlockState blockState = world.getBlockState(offset);
if (isExtensionPole(blockState) && blockState.get(PistonExtensionPoleBlock.FACING)
.getAxis() == d.getAxis())
frontier.add(offset);
if (isPistonHead(blockState) && blockState.get(MechanicalPistonHeadBlock.FACING)
.getAxis() == d.getAxis())
frontier.add(offset);
if (blockState.getBlock() instanceof MechanicalPistonBlock) {
Direction pistonFacing = blockState.get(MechanicalPistonBlock.FACING);
if (pistonFacing == d || pistonFacing == d.getOpposite()
&& blockState.get(MechanicalPistonBlock.STATE) == PistonState.EXTENDED)
frontier.add(offset);
}
}
}
}
protected void moveGantryPinion(World world, BlockPos pos, List<BlockPos> frontier, Set<BlockPos> visited,
BlockState state) {
BlockPos offset = pos.offset(state.get(GantryPinionBlock.FACING));
if (!visited.contains(offset))
frontier.add(offset);
Axis rotationAxis = ((IRotate) state.getBlock()).getRotationAxis(state);
for (Direction d : Iterate.directionsInAxis(rotationAxis)) {
offset = pos.offset(d);
BlockState offsetState = world.getBlockState(offset);
if (AllBlocks.GANTRY_SHAFT.has(offsetState) && offsetState.get(GantryShaftBlock.FACING)
.getAxis() == d.getAxis())
if (!visited.contains(offset))
frontier.add(offset);
}
}
protected void moveGantryShaft(World world, BlockPos pos, List<BlockPos> frontier, Set<BlockPos> visited,
BlockState state) {
for (Direction d : Iterate.directions) {
BlockPos offset = pos.offset(d);
if (!visited.contains(offset)) {
BlockState offsetState = world.getBlockState(offset);
Direction facing = state.get(GantryShaftBlock.FACING);
if (d.getAxis() == facing.getAxis() && AllBlocks.GANTRY_SHAFT.has(offsetState)
&& offsetState.get(GantryShaftBlock.FACING) == facing)
frontier.add(offset);
else if (AllBlocks.GANTRY_PINION.has(offsetState) && offsetState.get(GantryPinionBlock.FACING) == d)
frontier.add(offset);
}
}
}
private void moveBearing(BlockPos pos, List<BlockPos> frontier, Set<BlockPos> visited, BlockState state) { private void moveBearing(BlockPos pos, List<BlockPos> frontier, Set<BlockPos> visited, BlockState state) {
Direction facing = state.get(MechanicalBearingBlock.FACING); Direction facing = state.get(MechanicalBearingBlock.FACING);
if (!canAxisBeStabilized(facing.getAxis())) { if (!canBeStabilized(facing, pos.subtract(anchor))) {
BlockPos offset = pos.offset(facing); BlockPos offset = pos.offset(facing);
if (!visited.contains(offset)) if (!visited.contains(offset))
frontier.add(offset); frontier.add(offset);
@ -376,47 +481,25 @@ public abstract class Contraption {
private boolean moveMechanicalPiston(World world, BlockPos pos, List<BlockPos> frontier, Set<BlockPos> visited, private boolean moveMechanicalPiston(World world, BlockPos pos, List<BlockPos> frontier, Set<BlockPos> visited,
BlockState state) { BlockState state) {
int limit = AllConfigs.SERVER.kinetics.maxPistonPoles.get();
Direction direction = state.get(MechanicalPistonBlock.FACING); Direction direction = state.get(MechanicalPistonBlock.FACING);
if (state.get(MechanicalPistonBlock.STATE) == PistonState.EXTENDED) { PistonState pistonState = state.get(MechanicalPistonBlock.STATE);
BlockPos searchPos = pos; if (pistonState == PistonState.MOVING)
while (limit-- >= 0) {
searchPos = searchPos.offset(direction);
BlockState blockState = world.getBlockState(searchPos);
if (isExtensionPole(blockState)) {
if (blockState.get(PistonExtensionPoleBlock.FACING)
.getAxis() != direction.getAxis())
break;
if (!visited.contains(searchPos))
frontier.add(searchPos);
continue;
}
if (isPistonHead(blockState))
if (!visited.contains(searchPos))
frontier.add(searchPos);
break;
}
if (limit <= -1)
return false; return false;
BlockPos offset = pos.offset(direction.getOpposite());
if (!visited.contains(offset)) {
BlockState poleState = world.getBlockState(offset);
if (AllBlocks.PISTON_EXTENSION_POLE.has(poleState) && poleState.get(PistonExtensionPoleBlock.FACING)
.getAxis() == direction.getAxis())
frontier.add(offset);
} }
BlockPos searchPos = pos; if (pistonState == PistonState.EXTENDED || MechanicalPistonBlock.isStickyPiston(state)) {
while (limit-- >= 0) { offset = pos.offset(direction);
searchPos = searchPos.offset(direction.getOpposite()); if (!visited.contains(offset))
BlockState blockState = world.getBlockState(searchPos); frontier.add(offset);
if (isExtensionPole(blockState)) {
if (blockState.get(PistonExtensionPoleBlock.FACING)
.getAxis() != direction.getAxis())
break;
if (!visited.contains(searchPos))
frontier.add(searchPos);
continue;
}
break;
} }
if (limit <= -1)
return false;
return true; return true;
} }
@ -726,7 +809,8 @@ public abstract class Contraption {
if (brittles != BlockMovementTraits.isBrittle(block.state)) if (brittles != BlockMovementTraits.isBrittle(block.state))
continue; continue;
BlockPos add = block.pos.add(anchor).add(offset); BlockPos add = block.pos.add(anchor)
.add(offset);
if (customBlockRemoval(world, add, block.state)) if (customBlockRemoval(world, add, block.state))
continue; continue;
BlockState oldState = world.getBlockState(add); BlockState oldState = world.getBlockState(add);
@ -735,7 +819,8 @@ public abstract class Contraption {
iterator.remove(); iterator.remove();
world.getWorld() world.getWorld()
.removeTileEntity(add); .removeTileEntity(add);
int flags = BlockFlags.IS_MOVING | BlockFlags.NO_NEIGHBOR_DROPS | BlockFlags.UPDATE_NEIGHBORS; int flags = BlockFlags.IS_MOVING | BlockFlags.NO_NEIGHBOR_DROPS | BlockFlags.UPDATE_NEIGHBORS
| BlockFlags.BLOCK_UPDATE;
if (blockIn instanceof IWaterLoggable && oldState.has(BlockStateProperties.WATERLOGGED) if (blockIn instanceof IWaterLoggable && oldState.has(BlockStateProperties.WATERLOGGED)
&& oldState.get(BlockStateProperties.WATERLOGGED) && oldState.get(BlockStateProperties.WATERLOGGED)
.booleanValue()) { .booleanValue()) {
@ -746,8 +831,12 @@ public abstract class Contraption {
} }
} }
for (BlockInfo block : blocks.values()) { for (BlockInfo block : blocks.values()) {
BlockPos add = block.pos.add(anchor).add(offset); BlockPos add = block.pos.add(anchor)
world.markAndNotifyBlock(add, null, block.state, Blocks.AIR.getDefaultState(), BlockFlags.IS_MOVING | BlockFlags.DEFAULT); .add(offset);
if (!shouldUpdateAfterMovement(block))
continue;
world.markAndNotifyBlock(add, null, block.state, Blocks.AIR.getDefaultState(),
BlockFlags.IS_MOVING | BlockFlags.DEFAULT);
} }
} }
@ -797,6 +886,8 @@ public abstract class Contraption {
TileEntity tileEntity = world.getTileEntity(targetPos); TileEntity tileEntity = world.getTileEntity(targetPos);
CompoundNBT tag = block.nbt; CompoundNBT tag = block.nbt;
if (tileEntity != null)
tag = NBTProcessors.process(tileEntity, tag, false);
if (tileEntity != null && tag != null) { if (tileEntity != null && tag != null) {
tag.putInt("x", targetPos.getX()); tag.putInt("x", targetPos.getX());
tag.putInt("y", targetPos.getY()); tag.putInt("y", targetPos.getY());
@ -827,8 +918,12 @@ public abstract class Contraption {
} }
} }
for (BlockInfo block : blocks.values()) { for (BlockInfo block : blocks.values()) {
if (!shouldUpdateAfterMovement(block))
continue;
BlockPos targetPos = transform.apply(block.pos); BlockPos targetPos = transform.apply(block.pos);
world.markAndNotifyBlock(targetPos, null, block.state, block.state, BlockFlags.IS_MOVING | BlockFlags.DEFAULT); BlockState state = world.getBlockState(targetPos);
world.markAndNotifyBlock(targetPos, null, block.state, block.state,
BlockFlags.IS_MOVING | BlockFlags.DEFAULT);
} }
for (int i = 0; i < inventory.getSlots(); i++) for (int i = 0; i < inventory.getSlots(); i++)
@ -888,6 +983,10 @@ public abstract class Contraption {
callBack.accept(AllMovementBehaviours.of(pair.getLeft().state), pair.getRight()); callBack.accept(AllMovementBehaviours.of(pair.getLeft().state), pair.getRight());
} }
protected boolean shouldUpdateAfterMovement(BlockInfo info) {
return true;
}
public void expandBoundsAroundAxis(Axis axis) { public void expandBoundsAroundAxis(Axis axis) {
AxisAlignedBB bb = bounds; AxisAlignedBB bb = bounds;
double maxXDiff = Math.max(bb.maxX - 1, -bb.minX); double maxXDiff = Math.max(bb.maxX - 1, -bb.minX);

View file

@ -348,7 +348,7 @@ public class ContraptionCollider {
return potentialHits; return potentialHits;
} }
public static boolean collideBlocks(ControlledContraptionEntity contraptionEntity) { public static boolean collideBlocks(AbstractContraptionEntity contraptionEntity) {
if (!contraptionEntity.supportsTerrainCollision()) if (!contraptionEntity.supportsTerrainCollision())
return false; return false;

View file

@ -0,0 +1,49 @@
package com.simibubi.create.content.contraptions.components.structureMovement;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.function.Supplier;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.BearingContraption;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.ClockworkContraption;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.StabilizedContraption;
import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryContraption;
import com.simibubi.create.content.contraptions.components.structureMovement.mounted.MountedContraption;
import com.simibubi.create.content.contraptions.components.structureMovement.piston.PistonContraption;
import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyContraption;
public class ContraptionType {
public static Map<String, ContraptionType> entries = new HashMap<>();
public static ContraptionType
PISTON = register("piston", PistonContraption::new),
BEARING = register("bearing", BearingContraption::new),
PULLEY = register("pulley", PulleyContraption::new),
CLOCKWORK = register("clockwork", ClockworkContraption::new),
MOUNTED = register("mounted", MountedContraption::new),
STABILIZED = register("stabilized", StabilizedContraption::new),
GANTRY = register("gantry", GantryContraption::new);
Supplier<? extends Contraption> factory;
String id;
public static ContraptionType register(String id, Supplier<? extends Contraption> factory) {
ContraptionType value = new ContraptionType(id, factory);
entries.put(id, value);
return value;
}
private ContraptionType(String id, Supplier<? extends Contraption> factory) {
this.factory = factory;
this.id = id;
}
public static Contraption fromType(String type) {
for (Entry<String, ContraptionType> allContraptionTypes : entries.entrySet())
if (type.equals(allContraptionTypes.getKey()))
return allContraptionTypes.getValue().factory.get();
return null;
}
}

View file

@ -46,10 +46,6 @@ public class ControlledContraptionEntity extends AbstractContraptionEntity {
return entity; return entity;
} }
public boolean supportsTerrainCollision() {
return contraption instanceof TranslatingContraption;
}
@Override @Override
public Vec3d getContactPointMotion(Vec3d globalContactPoint) { public Vec3d getContactPointMotion(Vec3d globalContactPoint) {
if (contraption instanceof TranslatingContraption) if (contraption instanceof TranslatingContraption)
@ -151,8 +147,6 @@ public class ControlledContraptionEntity extends AbstractContraptionEntity {
} }
Vec3d motion = getMotion(); Vec3d motion = getMotion();
if (motion.length() < 1 / 4098f)
setMotion(Vec3d.ZERO);
move(motion.x, motion.y, motion.z); move(motion.x, motion.y, motion.z);
if (ContraptionCollider.collideBlocks(this)) if (ContraptionCollider.collideBlocks(this))
getController().collided(); getController().collided();

View file

@ -22,7 +22,7 @@ public class OrientedContraptionEntityRenderer extends AbstractContraptionEntity
if (!super.shouldRender(entity, p_225626_2_, p_225626_3_, p_225626_5_, p_225626_7_)) if (!super.shouldRender(entity, p_225626_2_, p_225626_3_, p_225626_5_, p_225626_7_))
return false; return false;
if (entity.getContraption() if (entity.getContraption()
.getType() == AllContraptionTypes.MOUNTED && entity.getRidingEntity() == null) .getType() == ContraptionType.MOUNTED && entity.getRidingEntity() == null)
return false; return false;
return true; return true;
} }

View file

@ -5,7 +5,6 @@ import java.util.HashSet;
import java.util.Set; import java.util.Set;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.gen.feature.template.Template.BlockInfo; import net.minecraft.world.gen.feature.template.Template.BlockInfo;
@ -17,7 +16,7 @@ public abstract class TranslatingContraption extends Contraption {
public Set<BlockPos> getColliders(World world, Direction movementDirection) { public Set<BlockPos> getColliders(World world, Direction movementDirection) {
if (getBlocks() == null) if (getBlocks() == null)
return Collections.EMPTY_SET; return Collections.emptySet();
if (cachedColliders == null || cachedColliderDirection != movementDirection) { if (cachedColliders == null || cachedColliderDirection != movementDirection) {
cachedColliders = new HashSet<>(); cachedColliders = new HashSet<>();
cachedColliderDirection = movementDirection; cachedColliderDirection = movementDirection;
@ -48,7 +47,7 @@ public abstract class TranslatingContraption extends Contraption {
} }
@Override @Override
protected boolean canAxisBeStabilized(Axis axis) { public boolean canBeStabilized(Direction facing, BlockPos localPos) {
return false; return false;
} }

View file

@ -3,13 +3,12 @@ package com.simibubi.create.content.contraptions.components.structureMovement.be
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import com.simibubi.create.AllTags.AllBlockTags; import com.simibubi.create.AllTags.AllBlockTags;
import com.simibubi.create.content.contraptions.components.structureMovement.AllContraptionTypes; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType;
import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.gen.feature.template.Template.BlockInfo; import net.minecraft.world.gen.feature.template.Template.BlockInfo;
@ -43,8 +42,8 @@ public class BearingContraption extends Contraption {
} }
@Override @Override
protected AllContraptionTypes getType() { protected ContraptionType getType() {
return AllContraptionTypes.BEARING; return ContraptionType.BEARING;
} }
@Override @Override
@ -84,8 +83,10 @@ public class BearingContraption extends Contraption {
} }
@Override @Override
protected boolean canAxisBeStabilized(Axis axis) { public boolean canBeStabilized(Direction facing, BlockPos localPos) {
return axis == facing.getAxis(); if (facing.getOpposite() == this.facing && BlockPos.ZERO.equals(localPos))
return false;
return facing.getAxis() == this.facing.getAxis();
} }
} }

View file

@ -6,13 +6,12 @@ import java.util.Set;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import com.simibubi.create.content.contraptions.components.structureMovement.AllContraptionTypes; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType;
import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption;
import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.NBTHelper;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
@ -24,8 +23,8 @@ public class ClockworkContraption extends Contraption {
private Set<BlockPos> ignoreBlocks = new HashSet<>(); private Set<BlockPos> ignoreBlocks = new HashSet<>();
@Override @Override
protected AllContraptionTypes getType() { protected ContraptionType getType() {
return AllContraptionTypes.CLOCKWORK; return ContraptionType.CLOCKWORK;
} }
private void ignoreBlocks(Set<BlockPos> blocks, BlockPos anchor) { private void ignoreBlocks(Set<BlockPos> blocks, BlockPos anchor) {
@ -110,15 +109,17 @@ public class ClockworkContraption extends Contraption {
@Override @Override
public void readNBT(World world, CompoundNBT tag, boolean spawnData) { public void readNBT(World world, CompoundNBT tag, boolean spawnData) {
facing = Direction.byIndex(tag.getInt("Facing")); facing = Direction.byIndex(tag.getInt("facing"));
handType = NBTHelper.readEnum(tag, "HandType", HandType.class); handType = NBTHelper.readEnum(tag, "HandType", HandType.class);
offset = tag.getInt("offset"); offset = tag.getInt("offset");
super.readNBT(world, tag, spawnData); super.readNBT(world, tag, spawnData);
} }
@Override @Override
protected boolean canAxisBeStabilized(Axis axis) { public boolean canBeStabilized(Direction facing, BlockPos localPos) {
return axis == facing.getAxis(); if (BlockPos.ZERO.equals(localPos) || BlockPos.ZERO.equals(localPos.offset(facing)))
return false;
return facing.getAxis() == this.facing.getAxis();
} }
public static enum HandType { public static enum HandType {

View file

@ -72,17 +72,6 @@ public class SailBlock extends ProperDirectionalBlock {
return ActionResultType.PASS; return ActionResultType.PASS;
offset.placeInWorld(world, ((BlockItem) heldItem.getItem()).getBlock().getDefaultState(), player, heldItem); offset.placeInWorld(world, ((BlockItem) heldItem.getItem()).getBlock().getDefaultState(), player, heldItem);
/*BlockState blockState = ((BlockItem) heldItem.getItem()).getBlock()
.getDefaultState()
.with(FACING, state.get(FACING));
BlockPos offsetPos = new BlockPos(offset.getPos());
if (!world.isRemote && world.getBlockState(offsetPos).getMaterial().isReplaceable()) {
world.setBlockState(offsetPos, blockState);
if (!player.isCreative())
heldItem.shrink(1);
}*/
return ActionResultType.SUCCESS; return ActionResultType.SUCCESS;
} }

View file

@ -45,7 +45,7 @@ public class StabilizedBearingMovementBehaviour extends MovementBehaviour {
AbstractContraptionEntity entity = context.contraption.entity; AbstractContraptionEntity entity = context.contraption.entity;
if (entity instanceof ControlledContraptionEntity) { if (entity instanceof ControlledContraptionEntity) {
ControlledContraptionEntity controlledCE = (ControlledContraptionEntity) entity; ControlledContraptionEntity controlledCE = (ControlledContraptionEntity) entity;
if (controlledCE.getRotationAxis() == axis) if (context.contraption.canBeStabilized(facing, context.localPos))
offset = -controlledCE.getAngle(renderPartialTicks); offset = -controlledCE.getAngle(renderPartialTicks);
} else if (entity instanceof OrientedContraptionEntity) { } else if (entity instanceof OrientedContraptionEntity) {

View file

@ -1,6 +1,6 @@
package com.simibubi.create.content.contraptions.components.structureMovement.bearing; package com.simibubi.create.content.contraptions.components.structureMovement.bearing;
import com.simibubi.create.content.contraptions.components.structureMovement.AllContraptionTypes; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType;
import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
@ -37,8 +37,8 @@ public class StabilizedContraption extends Contraption {
} }
@Override @Override
protected AllContraptionTypes getType() { protected ContraptionType getType() {
return AllContraptionTypes.STABILIZED; return ContraptionType.STABILIZED;
} }
@Override @Override
@ -55,7 +55,7 @@ public class StabilizedContraption extends Contraption {
} }
@Override @Override
protected boolean canAxisBeStabilized(Axis axis) { public boolean canBeStabilized(Direction facing, BlockPos localPos) {
return false; return false;
} }

View file

@ -0,0 +1,63 @@
package com.simibubi.create.content.contraptions.components.structureMovement.gantry;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType;
import com.simibubi.create.content.contraptions.components.structureMovement.TranslatingContraption;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.gen.feature.template.Template.BlockInfo;
public class GantryContraption extends TranslatingContraption {
protected Direction facing;
public GantryContraption() {}
public GantryContraption(Direction facing) {
this.facing = facing;
}
@Override
public boolean assemble(World world, BlockPos pos) {
if (!searchMovedStructure(world, pos, null))
return false;
startMoving(world);
return true;
}
@Override
public CompoundNBT writeNBT(boolean spawnPacket) {
CompoundNBT tag = super.writeNBT(spawnPacket);
tag.putInt("Facing", facing.getIndex());
return tag;
}
@Override
public void readNBT(World world, CompoundNBT tag, boolean spawnData) {
facing = Direction.byIndex(tag.getInt("Facing"));
super.readNBT(world, tag, spawnData);
}
@Override
protected boolean isAnchoringBlockAt(BlockPos pos) {
return super.isAnchoringBlockAt(pos.offset(facing));
}
@Override
protected ContraptionType getType() {
return ContraptionType.GANTRY;
}
public Direction getFacing() {
return facing;
}
@Override
protected boolean shouldUpdateAfterMovement(BlockInfo info) {
return super.shouldUpdateAfterMovement(info) && !AllBlocks.GANTRY_PINION.has(info.state);
}
}

View file

@ -0,0 +1,203 @@
package com.simibubi.create.content.contraptions.components.structureMovement.gantry;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllEntityTypes;
import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.Contraption;
import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionCollider;
import com.simibubi.create.content.contraptions.components.structureMovement.StructureTransform;
import com.simibubi.create.content.contraptions.relays.advanced.GantryShaftBlock;
import com.simibubi.create.content.contraptions.relays.advanced.GantryShaftTileEntity;
import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.utility.NBTHelper;
import com.simibubi.create.foundation.utility.ServerSpeedProvider;
import net.minecraft.block.BlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fml.network.PacketDistributor;
public class GantryContraptionEntity extends AbstractContraptionEntity {
Direction movementAxis;
double clientOffsetDiff;
double axisMotion;
public GantryContraptionEntity(EntityType<?> entityTypeIn, World worldIn) {
super(entityTypeIn, worldIn);
}
public static GantryContraptionEntity create(World world, Contraption contraption, Direction movementAxis) {
GantryContraptionEntity entity = new GantryContraptionEntity(AllEntityTypes.GANTRY_CONTRAPTION.get(), world);
entity.setContraption(contraption);
entity.movementAxis = movementAxis;
return entity;
}
@Override
protected void tickContraption() {
if (!(contraption instanceof GantryContraption))
return;
double prevAxisMotion = axisMotion;
if (world.isRemote) {
clientOffsetDiff *= .75f;
updateClientMotion();
}
checkPinionShaft();
tickActors();
Vec3d movementVec = getMotion();
if (ContraptionCollider.collideBlocks(this)) {
if (!world.isRemote)
disassemble();
return;
}
if (!isStalled() && ticksExisted > 2)
move(movementVec.x, movementVec.y, movementVec.z);
if (!world.isRemote && (prevAxisMotion != axisMotion || ticksExisted % 3 == 0))
sendPacket();
}
protected void checkPinionShaft() {
Vec3d movementVec;
Direction facing = ((GantryContraption) contraption).getFacing();
Vec3d currentPosition = getAnchorVec().add(.5, .5, .5);
BlockPos gantryShaftPos = new BlockPos(currentPosition).offset(facing.getOpposite());
TileEntity te = world.getTileEntity(gantryShaftPos);
if (!(te instanceof GantryShaftTileEntity) || !AllBlocks.GANTRY_SHAFT.has(te.getBlockState())) {
if (!world.isRemote) {
setContraptionMotion(Vec3d.ZERO);
disassemble();
}
return;
}
BlockState blockState = te.getBlockState();
Direction direction = blockState.get(GantryShaftBlock.FACING);
GantryShaftTileEntity gantryShaftTileEntity = (GantryShaftTileEntity) te;
float pinionMovementSpeed = gantryShaftTileEntity.getPinionMovementSpeed();
movementVec = new Vec3d(direction.getDirectionVec()).scale(pinionMovementSpeed);
if (blockState.get(GantryShaftBlock.POWERED) || pinionMovementSpeed == 0) {
setContraptionMotion(Vec3d.ZERO);
if (!world.isRemote)
disassemble();
return;
}
Vec3d nextPosition = currentPosition.add(movementVec);
double currentCoord = direction.getAxis()
.getCoordinate(currentPosition.x, currentPosition.y, currentPosition.z);
double nextCoord = direction.getAxis()
.getCoordinate(nextPosition.x, nextPosition.y, nextPosition.z);
if ((MathHelper.floor(currentCoord) + .5f < nextCoord != (pinionMovementSpeed * direction.getAxisDirection()
.getOffset() < 0)))
if (!gantryShaftTileEntity.canAssembleOn()) {
setContraptionMotion(Vec3d.ZERO);
if (!world.isRemote)
disassemble();
return;
}
if (world.isRemote)
return;
axisMotion = pinionMovementSpeed;
setContraptionMotion(movementVec);
}
@Override
protected void writeAdditional(CompoundNBT compound, boolean spawnPacket) {
NBTHelper.writeEnum(compound, "GantryAxis", movementAxis);
super.writeAdditional(compound, spawnPacket);
}
protected void readAdditional(CompoundNBT compound, boolean spawnData) {
movementAxis = NBTHelper.readEnum(compound, "GantryAxis", Direction.class);
super.readAdditional(compound, spawnData);
}
@Override
public Vec3d applyRotation(Vec3d localPos, float partialTicks) {
return localPos;
}
@Override
public Vec3d reverseRotation(Vec3d localPos, float partialTicks) {
return localPos;
}
@Override
protected StructureTransform makeStructureTransform() {
return new StructureTransform(new BlockPos(getAnchorVec().add(.5, .5, .5)), 0, 0, 0);
}
@Override
protected float getStalledAngle() {
return 0;
}
@Override
public void setPositionAndUpdate(double p_70634_1_, double p_70634_3_, double p_70634_5_) {}
@Override
@OnlyIn(Dist.CLIENT)
public void setPositionAndRotationDirect(double x, double y, double z, float yw, float pt, int inc, boolean t) {}
@Override
protected void handleStallInformation(float x, float y, float z, float angle) {
setPos(x, y, z);
clientOffsetDiff = 0;
}
@Override
public ContraptionRotationState getRotationState() {
return ContraptionRotationState.NONE;
}
public void updateClientMotion() {
float modifier = movementAxis.getAxisDirection()
.getOffset();
setContraptionMotion(new Vec3d(movementAxis.getDirectionVec())
.scale((axisMotion + clientOffsetDiff * modifier / 2f) * ServerSpeedProvider.get()));
}
public double getAxisCoord() {
Vec3d anchorVec = getAnchorVec();
return movementAxis.getAxis()
.getCoordinate(anchorVec.x, anchorVec.y, anchorVec.z);
}
public void sendPacket() {
AllPackets.channel.send(PacketDistributor.TRACKING_ENTITY.with(() -> this),
new GantryContraptionUpdatePacket(getEntityId(), getAxisCoord(), axisMotion));
}
@OnlyIn(Dist.CLIENT)
public static void handlePacket(GantryContraptionUpdatePacket packet) {
Entity entity = Minecraft.getInstance().world.getEntityByID(packet.entityID);
if (!(entity instanceof GantryContraptionEntity))
return;
GantryContraptionEntity ce = (GantryContraptionEntity) entity;
ce.axisMotion = packet.motion;
ce.clientOffsetDiff = packet.coord - ce.getAxisCoord();
}
}

View file

@ -0,0 +1,18 @@
package com.simibubi.create.content.contraptions.components.structureMovement.gantry;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntityRenderer;
import net.minecraft.client.renderer.entity.EntityRendererManager;
public class GantryContraptionEntityRenderer extends AbstractContraptionEntityRenderer<GantryContraptionEntity> {
public GantryContraptionEntityRenderer(EntityRendererManager p_i46179_1_) {
super(p_i46179_1_);
}
@Override
protected void transform(GantryContraptionEntity contraptionEntity, float partialTicks,
MatrixStack[] matrixStacks) {}
}

View file

@ -0,0 +1,46 @@
package com.simibubi.create.content.contraptions.components.structureMovement.gantry;
import java.util.function.Supplier;
import com.simibubi.create.foundation.networking.SimplePacketBase;
import net.minecraft.network.PacketBuffer;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.fml.network.NetworkEvent.Context;
public class GantryContraptionUpdatePacket extends SimplePacketBase {
int entityID;
double coord;
double motion;
public GantryContraptionUpdatePacket(int entityID, double coord, double motion) {
this.entityID = entityID;
this.coord = coord;
this.motion = motion;
}
public GantryContraptionUpdatePacket(PacketBuffer buffer) {
entityID = buffer.readInt();
coord = buffer.readFloat();
motion = buffer.readFloat();
}
@Override
public void write(PacketBuffer buffer) {
buffer.writeInt(entityID);
buffer.writeFloat((float) coord);
buffer.writeFloat((float) motion);
}
@Override
public void handle(Supplier<Context> context) {
context.get()
.enqueueWork(
() -> DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> GantryContraptionEntity.handlePacket(this)));
context.get()
.setPacketHandled(true);
}
}

View file

@ -0,0 +1,142 @@
package com.simibubi.create.content.contraptions.components.structureMovement.gantry;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock;
import com.simibubi.create.content.contraptions.base.IRotate;
import com.simibubi.create.content.contraptions.relays.advanced.GantryShaftBlock;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.utility.Iterate;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.BlockItemUseContext;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ActionResultType;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorld;
import net.minecraft.world.IWorldReader;
import net.minecraft.world.World;
public class GantryPinionBlock extends DirectionalAxisKineticBlock implements ITE<GantryPinionTileEntity> {
public GantryPinionBlock(Properties properties) {
super(properties);
}
@Override
public boolean isValidPosition(BlockState state, IWorldReader world, BlockPos pos) {
Direction direction = state.get(FACING);
BlockState shaft = world.getBlockState(pos.offset(direction.getOpposite()));
return AllBlocks.GANTRY_SHAFT.has(shaft) && shaft.get(GantryShaftBlock.FACING)
.getAxis() != direction.getAxis();
}
@Override
public void updateNeighbors(BlockState stateIn, IWorld worldIn, BlockPos pos, int flags) {
super.updateNeighbors(stateIn, worldIn, pos, flags);
withTileEntityDo(worldIn, pos, GantryPinionTileEntity::checkValidGantryShaft);
}
@Override
public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) {
super.onBlockAdded(state, worldIn, pos, oldState, isMoving);
}
@Override
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
return AllTileEntities.GANTRY_PINION.create();
}
@Override
protected Direction getFacingForPlacement(BlockItemUseContext context) {
return context.getFace();
}
public ActionResultType onUse(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn,
BlockRayTraceResult hit) {
if (!player.isAllowEdit() || player.isSneaking())
return ActionResultType.PASS;
if (player.getHeldItem(handIn)
.isEmpty()) {
withTileEntityDo(worldIn, pos, te -> te.checkValidGantryShaft());
return ActionResultType.SUCCESS;
}
return ActionResultType.PASS;
}
@Override
public BlockState getStateForPlacement(BlockItemUseContext context) {
BlockState stateForPlacement = super.getStateForPlacement(context);
Direction opposite = stateForPlacement.get(FACING)
.getOpposite();
return cycleAxisIfNecessary(stateForPlacement, opposite, context.getWorld()
.getBlockState(context.getPos()
.offset(opposite)));
}
@Override
public void neighborChanged(BlockState state, World world, BlockPos pos, Block p_220069_4_, BlockPos p_220069_5_,
boolean p_220069_6_) {
if (!isValidPosition(state, world, pos))
world.destroyBlock(pos, true);
}
@Override
public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState otherState, IWorld world,
BlockPos pos, BlockPos p_196271_6_) {
if (state.get(FACING) != direction.getOpposite())
return state;
return cycleAxisIfNecessary(state, direction, otherState);
}
protected BlockState cycleAxisIfNecessary(BlockState state, Direction direction, BlockState otherState) {
if (!AllBlocks.GANTRY_SHAFT.has(otherState))
return state;
if (otherState.get(GantryShaftBlock.FACING)
.getAxis() == direction.getAxis())
return state;
if (isValidGantryShaftAxis(state, otherState))
return state;
return state.cycle(AXIS_ALONG_FIRST_COORDINATE);
}
public static boolean isValidGantryShaftAxis(BlockState pinionState, BlockState gantryState) {
return getValidGantryShaftAxis(pinionState) == gantryState.get(GantryShaftBlock.FACING)
.getAxis();
}
public static Axis getValidGantryShaftAxis(BlockState state) {
if (!(state.getBlock() instanceof GantryPinionBlock))
return Axis.Y;
IRotate block = (IRotate) state.getBlock();
Axis rotationAxis = block.getRotationAxis(state);
Axis facingAxis = state.get(FACING)
.getAxis();
for (Axis axis : Iterate.axes)
if (axis != rotationAxis && axis != facingAxis)
return axis;
return Axis.Y;
}
public static Axis getValidGantryPinionAxis(BlockState state, Axis shaftAxis) {
Axis facingAxis = state.get(FACING)
.getAxis();
for (Axis axis : Iterate.axes)
if (axis != shaftAxis && axis != facingAxis)
return axis;
return Axis.Y;
}
@Override
public Class<GantryPinionTileEntity> getTileEntityClass() {
return GantryPinionTileEntity.class;
}
}

View file

@ -0,0 +1,78 @@
package com.simibubi.create.content.contraptions.components.structureMovement.gantry;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.MatrixStacker;
import net.minecraft.block.BlockState;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.Vector3f;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.Direction.AxisDirection;
import net.minecraft.util.math.BlockPos;
public class GantryPinionRenderer extends KineticTileEntityRenderer {
public GantryPinionRenderer(TileEntityRendererDispatcher dispatcher) {
super(dispatcher);
}
@Override
protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
int light, int overlay) {
super.renderSafe(te, partialTicks, ms, buffer, light, overlay);
BlockState state = te.getBlockState();
Direction facing = state.get(GantryPinionBlock.FACING);
Boolean alongFirst = state.get(GantryPinionBlock.AXIS_ALONG_FIRST_COORDINATE);
Axis rotationAxis = getRotationAxisOf(te);
BlockPos visualPos = facing.getAxisDirection() == AxisDirection.POSITIVE ? te.getPos()
: te.getPos()
.offset(facing.getOpposite());
float angleForTe = getAngleForTe(te, visualPos, rotationAxis);
Axis gantryAxis = Axis.X;
for (Axis axis : Iterate.axes)
if (axis != rotationAxis && axis != facing.getAxis())
gantryAxis = axis;
if (gantryAxis == Axis.Z)
if (facing == Direction.DOWN)
angleForTe *= -1;
if (gantryAxis == Axis.Y)
if (facing == Direction.NORTH || facing == Direction.EAST)
angleForTe *= -1;
ms.push();
MatrixStacker msr = MatrixStacker.of(ms);
msr.centre()
.rotateY(AngleHelper.horizontalAngle(facing))
.rotateX(facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90)
.rotateY(alongFirst ^ facing.getAxis() == Axis.Z ? 90 : 0);
ms.translate(0, -9 / 16f, 0);
ms.multiply(Vector3f.POSITIVE_X.getRadialQuaternion(-angleForTe / 2f));
ms.translate(0, 9 / 16f, 0);
msr.unCentre();
AllBlockPartials.GANTRY_COGS.renderOn(state)
.light(light)
.renderInto(ms, buffer.getBuffer(RenderType.getSolid()));
ms.pop();
}
@Override
protected BlockState getRenderedBlockState(KineticTileEntity te) {
return shaft(getRotationAxisOf(te));
}
}

View file

@ -0,0 +1,138 @@
package com.simibubi.create.content.contraptions.components.structureMovement.gantry;
import static net.minecraft.state.properties.BlockStateProperties.FACING;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionCollider;
import com.simibubi.create.content.contraptions.relays.advanced.GantryShaftBlock;
import com.simibubi.create.content.contraptions.relays.advanced.GantryShaftTileEntity;
import net.minecraft.block.BlockState;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos;
public class GantryPinionTileEntity extends KineticTileEntity {
boolean assembleNextTick;
public GantryPinionTileEntity(TileEntityType<?> typeIn) {
super(typeIn);
}
@Override
public void onSpeedChanged(float previousSpeed) {
super.onSpeedChanged(previousSpeed);
}
public void checkValidGantryShaft() {
if (shouldAssemble())
queueAssembly();
}
public void queueAssembly() {
assembleNextTick = true;
}
@Override
public void tick() {
super.tick();
if (world.isRemote)
return;
if (assembleNextTick) {
tryAssemble();
assembleNextTick = false;
}
}
private void tryAssemble() {
BlockState blockState = getBlockState();
if (!(blockState.getBlock() instanceof GantryPinionBlock))
return;
Direction direction = blockState.get(FACING);
GantryContraption contraption = new GantryContraption(direction);
TileEntity shaftTe = world.getTileEntity(pos.offset(direction.getOpposite()));
if (!(shaftTe instanceof GantryShaftTileEntity))
return;
BlockState shaftState = shaftTe.getBlockState();
if (!AllBlocks.GANTRY_SHAFT.has(shaftState))
return;
float pinionMovementSpeed = ((GantryShaftTileEntity) shaftTe).getPinionMovementSpeed();
Direction shaftOrientation = shaftState.get(GantryShaftBlock.FACING);
Direction movementDirection = shaftOrientation;
if (pinionMovementSpeed < 0)
movementDirection = movementDirection.getOpposite();
if (!contraption.assemble(world, pos))
return;
if (ContraptionCollider.isCollidingWithWorld(world, contraption, pos.offset(movementDirection),
movementDirection))
return;
contraption.removeBlocksFromWorld(world, BlockPos.ZERO);
GantryContraptionEntity movedContraption =
GantryContraptionEntity.create(world, contraption, shaftOrientation);
BlockPos anchor = pos;
movedContraption.setPosition(anchor.getX(), anchor.getY(), anchor.getZ());
world.addEntity(movedContraption);
}
@Override
public float propagateRotationTo(KineticTileEntity target, BlockState stateFrom, BlockState stateTo, BlockPos diff,
boolean connectedViaAxes, boolean connectedViaCogs) {
float defaultModifier =
super.propagateRotationTo(target, stateFrom, stateTo, diff, connectedViaAxes, connectedViaCogs);
if (connectedViaAxes)
return defaultModifier;
if (!AllBlocks.GANTRY_SHAFT.has(stateTo))
return defaultModifier;
if (!stateTo.get(GantryShaftBlock.POWERED))
return defaultModifier;
Direction direction = Direction.getFacingFromVector(diff.getX(), diff.getY(), diff.getZ());
if (stateFrom.get(GantryPinionBlock.FACING) != direction.getOpposite())
return defaultModifier;
return getGantryPinionModifier(stateTo.get(GantryShaftBlock.FACING), stateFrom.get(GantryPinionBlock.FACING));
}
public static float getGantryPinionModifier(Direction shaft, Direction pinionDirection) {
Axis shaftAxis = shaft.getAxis();
float directionModifier = shaft.getAxisDirection()
.getOffset();
if (shaftAxis == Axis.Y)
if (pinionDirection == Direction.NORTH || pinionDirection == Direction.EAST)
return -directionModifier;
if (shaftAxis == Axis.X)
if (pinionDirection == Direction.DOWN || pinionDirection == Direction.SOUTH)
return -directionModifier;
if (shaftAxis == Axis.Z)
if (pinionDirection == Direction.UP || pinionDirection == Direction.WEST)
return -directionModifier;
return directionModifier;
}
private boolean shouldAssemble() {
BlockState blockState = getBlockState();
if (!(blockState.getBlock() instanceof GantryPinionBlock))
return false;
Direction facing = blockState.get(GantryPinionBlock.FACING)
.getOpposite();
BlockState shaftState = world.getBlockState(pos.offset(facing));
if (!(shaftState.getBlock() instanceof GantryShaftBlock))
return false;
if (shaftState.get(GantryShaftBlock.POWERED))
return false;
TileEntity te = world.getTileEntity(pos.offset(facing));
return te instanceof GantryShaftTileEntity && ((GantryShaftTileEntity) te).canAssembleOn();
}
}

View file

@ -7,7 +7,7 @@ import java.util.List;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.components.structureMovement.AllContraptionTypes; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType;
import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption;
import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerTileEntity.CartMovementMode; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerTileEntity.CartMovementMode;
import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Iterate;
@ -47,8 +47,8 @@ public class MountedContraption extends Contraption {
} }
@Override @Override
protected AllContraptionTypes getType() { protected ContraptionType getType() {
return AllContraptionTypes.MOUNTED; return ContraptionType.MOUNTED;
} }
@Override @Override
@ -149,7 +149,7 @@ public class MountedContraption extends Contraption {
} }
@Override @Override
protected boolean canAxisBeStabilized(Axis axis) { public boolean canBeStabilized(Direction facing, BlockPos localPos) {
return true; return true;
} }

View file

@ -247,7 +247,7 @@ public abstract class LinearActuatorTileEntity extends KineticTileEntity impleme
} }
public float getMovementSpeed() { public float getMovementSpeed() {
float movementSpeed = getSpeed() / 512f + clientOffsetDiff / 2f; float movementSpeed = MathHelper.clamp(getSpeed() / 512f, -.49f, .49f) + clientOffsetDiff / 2f;
if (world.isRemote) if (world.isRemote)
movementSpeed *= ServerSpeedProvider.get(); movementSpeed *= ServerSpeedProvider.get();
return movementSpeed; return movementSpeed;

View file

@ -112,7 +112,7 @@ public class MechanicalPistonTileEntity extends LinearActuatorTileEntity {
@Override @Override
public float getMovementSpeed() { public float getMovementSpeed() {
float movementSpeed = getSpeed() / 512f; float movementSpeed = MathHelper.clamp(getSpeed() / 512f, -.49f, .49f);
if (world.isRemote) if (world.isRemote)
movementSpeed *= ServerSpeedProvider.get(); movementSpeed *= ServerSpeedProvider.get();
Direction pistonDirection = getBlockState().get(BlockStateProperties.FACING); Direction pistonDirection = getBlockState().get(BlockStateProperties.FACING);

View file

@ -1,6 +1,6 @@
package com.simibubi.create.content.contraptions.components.structureMovement.piston; package com.simibubi.create.content.contraptions.components.structureMovement.piston;
import com.simibubi.create.content.contraptions.components.structureMovement.AllContraptionTypes; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType;
import com.simibubi.create.content.contraptions.components.structureMovement.BlockMovementTraits; import com.simibubi.create.content.contraptions.components.structureMovement.BlockMovementTraits;
import com.simibubi.create.content.contraptions.components.structureMovement.TranslatingContraption; import com.simibubi.create.content.contraptions.components.structureMovement.TranslatingContraption;
import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.*; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.*;
@ -8,6 +8,7 @@ import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.CarpetBlock; import net.minecraft.block.CarpetBlock;
import net.minecraft.block.material.PushReaction;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.state.properties.PistonType; import net.minecraft.state.properties.PistonType;
@ -38,8 +39,8 @@ public class PistonContraption extends TranslatingContraption {
private boolean retract; private boolean retract;
@Override @Override
protected AllContraptionTypes getType() { protected ContraptionType getType() {
return AllContraptionTypes.PISTON; return ContraptionType.PISTON;
} }
public PistonContraption() {} public PistonContraption() {}
@ -164,6 +165,8 @@ public class PistonContraption extends TranslatingContraption {
return true; return true;
if (!BlockMovementTraits.movementAllowed(world, currentPos)) if (!BlockMovementTraits.movementAllowed(world, currentPos))
return retracting; return retracting;
if (retracting && state.getPushReaction() == PushReaction.PUSH_ONLY)
return true;
frontier.add(currentPos); frontier.add(currentPos);
if (BlockMovementTraits.notSupportive(state, orientation)) if (BlockMovementTraits.notSupportive(state, orientation))
return true; return true;

View file

@ -1,6 +1,6 @@
package com.simibubi.create.content.contraptions.components.structureMovement.pulley; package com.simibubi.create.content.contraptions.components.structureMovement.pulley;
import com.simibubi.create.content.contraptions.components.structureMovement.AllContraptionTypes; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType;
import com.simibubi.create.content.contraptions.components.structureMovement.TranslatingContraption; import com.simibubi.create.content.contraptions.components.structureMovement.TranslatingContraption;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
@ -12,8 +12,8 @@ public class PulleyContraption extends TranslatingContraption {
int initialOffset; int initialOffset;
@Override @Override
protected AllContraptionTypes getType() { protected ContraptionType getType() {
return AllContraptionTypes.PULLEY; return ContraptionType.PULLEY;
} }
public PulleyContraption() {} public PulleyContraption() {}

View file

@ -48,6 +48,17 @@ public class PulleyTileEntity extends LinearActuatorTileEntity {
return; return;
if (speed == 0) if (speed == 0)
return; return;
int maxLength = AllConfigs.SERVER.kinetics.maxRopeLength.get();
int i = 1;
while (i <= maxLength) {
BlockPos ropePos = pos.down(i);
BlockState ropeState = world.getBlockState(ropePos);
if (!AllBlocks.ROPE.has(ropeState) && !AllBlocks.PULLEY_MAGNET.has(ropeState)) {
break;
}
++i;
}
offset = i - 1;
if (offset >= getExtensionRange() && getSpeed() > 0) if (offset >= getExtensionRange() && getSpeed() > 0)
return; return;
if (offset <= 0 && getSpeed() < 0) if (offset <= 0 && getSpeed() < 0)
@ -70,7 +81,7 @@ public class PulleyTileEntity extends LinearActuatorTileEntity {
if (!canAssembleStructure && getSpeed() > 0) if (!canAssembleStructure && getSpeed() > 0)
return; return;
for (int i = ((int) offset); i > 0; i--) { for (i = ((int) offset); i > 0; i--) {
BlockPos offset = pos.down(i); BlockPos offset = pos.down(i);
BlockState oldState = world.getBlockState(offset); BlockState oldState = world.getBlockState(offset);
if (oldState.getBlock() instanceof IWaterLoggable && oldState.has(BlockStateProperties.WATERLOGGED) if (oldState.getBlock() instanceof IWaterLoggable && oldState.has(BlockStateProperties.WATERLOGGED)

View file

@ -6,6 +6,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Abs
import com.simibubi.create.foundation.networking.SimplePacketBase; import com.simibubi.create.foundation.networking.SimplePacketBase;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.network.PacketBuffer; import net.minecraft.network.PacketBuffer;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
@ -45,22 +46,26 @@ public class ContraptionInteractionPacket extends SimplePacketBase {
@Override @Override
public void handle(Supplier<Context> context) { public void handle(Supplier<Context> context) {
context.get() context.get().enqueueWork(() -> {
.enqueueWork(() -> { ServerPlayerEntity sender = context.get().getSender();
ServerPlayerEntity sender = context.get()
.getSender();
if (sender == null) if (sender == null)
return; return;
Entity entityByID = sender.getServerWorld() Entity entityByID = sender.getServerWorld().getEntityByID(target);
.getEntityByID(target);
if (!(entityByID instanceof AbstractContraptionEntity)) if (!(entityByID instanceof AbstractContraptionEntity))
return; return;
AbstractContraptionEntity contraptionEntity = (AbstractContraptionEntity) entityByID; AbstractContraptionEntity contraptionEntity = (AbstractContraptionEntity) entityByID;
double d = sender.getAttribute(PlayerEntity.REACH_DISTANCE).getValue();
if (!sender.canEntityBeSeen(entityByID))
d -= 3;
d *= d;
if (sender.getDistanceSq(entityByID) > d) {
// TODO log?
return;
}
if (contraptionEntity.handlePlayerInteraction(sender, localPos, face, interactionHand)) if (contraptionEntity.handlePlayerInteraction(sender, localPos, face, interactionHand))
sender.swingHand(interactionHand, true); sender.swingHand(interactionHand, true);
}); });
context.get() context.get().setPacketHandled(true);
.setPacketHandled(true);
} }
} }

View file

@ -21,9 +21,7 @@ import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.item.PotionItem; import net.minecraft.item.PotionItem;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.particles.BlockParticleData;
import net.minecraft.particles.IParticleData; import net.minecraft.particles.IParticleData;
import net.minecraft.particles.ParticleTypes;
import net.minecraft.potion.PotionUtils; import net.minecraft.potion.PotionUtils;
import net.minecraft.tileentity.TileEntityType; import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;

View file

@ -0,0 +1,294 @@
package com.simibubi.create.content.contraptions.relays.advanced;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllShapes;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.placement.IPlacementHelper;
import com.simibubi.create.foundation.utility.placement.PlacementHelpers;
import com.simibubi.create.foundation.utility.placement.PlacementOffset;
import com.simibubi.create.foundation.utility.placement.util.PoleHelper;
import net.minecraft.block.Block;
import net.minecraft.block.BlockRenderType;
import net.minecraft.block.BlockState;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.BlockItem;
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.IProperty;
import net.minecraft.state.StateContainer.Builder;
import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ActionResultType;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.Hand;
import net.minecraft.util.IStringSerializable;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorld;
import net.minecraft.world.IWorldReader;
import net.minecraft.world.World;
public class GantryShaftBlock extends DirectionalKineticBlock {
public static final IProperty<Part> PART = EnumProperty.create("part", Part.class);
public static final BooleanProperty POWERED = BlockStateProperties.POWERED;
private static final int placementHelperId = PlacementHelpers.register(new PlacementHelper());
public enum Part implements IStringSerializable {
START, MIDDLE, END, SINGLE;
@Override
public String getName() {
return Lang.asId(name());
}
}
@Override
protected void fillStateContainer(Builder<Block, BlockState> builder) {
super.fillStateContainer(builder.add(PART, POWERED));
}
@Override
public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand,
BlockRayTraceResult ray) {
ItemStack heldItem = player.getHeldItem(hand);
IPlacementHelper placementHelper = PlacementHelpers.get(placementHelperId);
if (!placementHelper.matchesItem(heldItem))
return ActionResultType.PASS;
PlacementOffset offset = placementHelper.getOffset(world, state, pos, ray);
if (!offset.isReplaceable(world))
return ActionResultType.PASS;
offset.placeInWorld(world, ((BlockItem) heldItem.getItem()).getBlock()
.getDefaultState(), player, heldItem);
return ActionResultType.SUCCESS;
}
@Override
public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_,
ISelectionContext p_220053_4_) {
return AllShapes.EIGHT_VOXEL_POLE.get(state.get(FACING)
.getAxis());
}
@Override
public BlockRenderType getRenderType(BlockState state) {
return BlockRenderType.ENTITYBLOCK_ANIMATED;
}
@Override
public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbour, IWorld world,
BlockPos pos, BlockPos neighbourPos) {
Direction facing = state.get(FACING);
Axis axis = facing.getAxis();
if (direction.getAxis() != axis)
return state;
boolean connect = AllBlocks.GANTRY_SHAFT.has(neighbour) && neighbour.get(FACING) == facing;
Part part = state.get(PART);
if (direction.getAxisDirection() == facing.getAxisDirection()) {
if (connect) {
if (part == Part.END)
part = Part.MIDDLE;
if (part == Part.SINGLE)
part = Part.START;
} else {
if (part == Part.MIDDLE)
part = Part.END;
if (part == Part.START)
part = Part.SINGLE;
}
} else {
if (connect) {
if (part == Part.START)
part = Part.MIDDLE;
if (part == Part.SINGLE)
part = Part.END;
} else {
if (part == Part.MIDDLE)
part = Part.START;
if (part == Part.END)
part = Part.SINGLE;
}
}
return state.with(PART, part);
}
public GantryShaftBlock(Properties properties) {
super(properties);
setDefaultState(getDefaultState().with(POWERED, false)
.with(PART, Part.SINGLE));
}
@Override
public BlockState getStateForPlacement(BlockItemUseContext context) {
BlockState state = super.getStateForPlacement(context);
BlockPos pos = context.getPos();
World world = context.getWorld();
Direction face = context.getFace();
BlockState neighbour = world.getBlockState(pos.offset(state.get(FACING)
.getOpposite()));
BlockState clickedState =
AllBlocks.GANTRY_SHAFT.has(neighbour) ? neighbour : world.getBlockState(pos.offset(face.getOpposite()));
if (AllBlocks.GANTRY_SHAFT.has(clickedState) && clickedState.get(FACING)
.getAxis() == state.get(FACING)
.getAxis()) {
Direction facing = clickedState.get(FACING);
state = state.with(FACING, context.getPlayer() == null || !context.getPlayer()
.isSneaking() ? facing : facing.getOpposite());
}
return state.with(POWERED, shouldBePowered(state, world, pos));
}
@Override
public ActionResultType onWrenched(BlockState state, ItemUseContext context) {
ActionResultType onWrenched = super.onWrenched(state, context);
if (onWrenched.isAccepted()) {
BlockPos pos = context.getPos();
World world = context.getWorld();
neighborChanged(world.getBlockState(pos), world, pos, state.getBlock(), pos, false);
}
return onWrenched;
}
@Override
public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block p_220069_4_, BlockPos p_220069_5_,
boolean p_220069_6_) {
if (worldIn.isRemote)
return;
boolean previouslyPowered = state.get(POWERED);
boolean shouldPower = worldIn.isBlockPowered(pos); // shouldBePowered(state, worldIn, pos);
if (!previouslyPowered && !shouldPower && shouldBePowered(state, worldIn, pos)) {
worldIn.setBlockState(pos, state.with(POWERED, true), 3);
return;
}
if (previouslyPowered == shouldPower)
return;
// Collect affected gantry shafts
List<BlockPos> toUpdate = new ArrayList<>();
Direction facing = state.get(FACING);
Axis axis = facing.getAxis();
for (Direction d : Iterate.directionsInAxis(axis)) {
BlockPos currentPos = pos.offset(d);
while (true) {
if (!worldIn.isBlockPresent(currentPos))
break;
BlockState currentState = worldIn.getBlockState(currentPos);
if (!(currentState.getBlock() instanceof GantryShaftBlock))
break;
if (currentState.get(FACING) != facing)
break;
if (!shouldPower && currentState.get(POWERED) && worldIn.isBlockPowered(currentPos))
return;
if (currentState.get(POWERED) == shouldPower)
break;
toUpdate.add(currentPos);
currentPos = currentPos.offset(d);
}
}
toUpdate.add(pos);
for (BlockPos blockPos : toUpdate) {
BlockState blockState = worldIn.getBlockState(blockPos);
TileEntity te = worldIn.getTileEntity(blockPos);
if (te instanceof KineticTileEntity)
((KineticTileEntity) te).detachKinetics();
if (blockState.getBlock() instanceof GantryShaftBlock)
worldIn.setBlockState(blockPos, blockState.with(POWERED, shouldPower), 2);
}
}
protected boolean shouldBePowered(BlockState state, World worldIn, BlockPos pos) {
boolean shouldPower = worldIn.isBlockPowered(pos);
Direction facing = state.get(FACING);
for (Direction d : Iterate.directionsInAxis(facing.getAxis())) {
BlockPos neighbourPos = pos.offset(d);
if (!worldIn.isBlockPresent(neighbourPos))
continue;
BlockState neighbourState = worldIn.getBlockState(neighbourPos);
if (!(neighbourState.getBlock() instanceof GantryShaftBlock))
continue;
if (neighbourState.get(FACING) != facing)
continue;
shouldPower |= neighbourState.get(POWERED);
}
return shouldPower;
}
@Override
public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) {
return face.getAxis() == state.get(FACING)
.getAxis();
}
@Override
public Axis getRotationAxis(BlockState state) {
return state.get(FACING)
.getAxis();
}
@Override
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
return AllTileEntities.GANTRY_SHAFT.create();
}
@Override
protected boolean areStatesKineticallyEquivalent(BlockState oldState, BlockState newState) {
return super.areStatesKineticallyEquivalent(oldState, newState)
&& oldState.get(POWERED) == newState.get(POWERED);
}
public static class PlacementHelper extends PoleHelper<Direction> {
public PlacementHelper() {
super(AllBlocks.GANTRY_SHAFT::has, s -> s.get(FACING)
.getAxis(), FACING);
}
@Override
public Predicate<ItemStack> getItemPredicate() {
return AllBlocks.GANTRY_SHAFT::isIn;
}
@Override
public PlacementOffset getOffset(World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) {
PlacementOffset offset = super.getOffset(world, state, pos, ray);
if (!offset.isSuccessful())
return offset;
return PlacementOffset.success(offset.getPos(), offset.getTransform()
.andThen(s -> s.with(POWERED, state.get(POWERED))));
}
}
}

View file

@ -0,0 +1,103 @@
package com.simibubi.create.content.contraptions.relays.advanced;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionTileEntity;
import com.simibubi.create.foundation.utility.Iterate;
import net.minecraft.block.BlockState;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
public class GantryShaftTileEntity extends KineticTileEntity {
public GantryShaftTileEntity(TileEntityType<?> typeIn) {
super(typeIn);
}
@Override
public void onSpeedChanged(float previousSpeed) {
super.onSpeedChanged(previousSpeed);
if (!canAssembleOn())
return;
for (Direction d : Iterate.directions) {
if (d.getAxis() == getBlockState().get(GantryShaftBlock.FACING)
.getAxis())
continue;
BlockPos offset = pos.offset(d);
BlockState pinionState = world.getBlockState(offset);
if (!AllBlocks.GANTRY_PINION.has(pinionState))
continue;
if (pinionState.get(GantryPinionBlock.FACING) != d)
continue;
TileEntity tileEntity = world.getTileEntity(offset);
if (tileEntity instanceof GantryPinionTileEntity)
((GantryPinionTileEntity) tileEntity).queueAssembly();
}
}
@Override
public float propagateRotationTo(KineticTileEntity target, BlockState stateFrom, BlockState stateTo, BlockPos diff,
boolean connectedViaAxes, boolean connectedViaCogs) {
float defaultModifier =
super.propagateRotationTo(target, stateFrom, stateTo, diff, connectedViaAxes, connectedViaCogs);
if (connectedViaAxes)
return defaultModifier;
if (!stateFrom.get(GantryShaftBlock.POWERED))
return defaultModifier;
if (!AllBlocks.GANTRY_PINION.has(stateTo))
return defaultModifier;
Direction direction = Direction.getFacingFromVector(diff.getX(), diff.getY(), diff.getZ());
if (stateTo.get(GantryPinionBlock.FACING) != direction)
return defaultModifier;
return GantryPinionTileEntity.getGantryPinionModifier(stateFrom.get(GantryShaftBlock.FACING),
stateTo.get(GantryPinionBlock.FACING));
}
@Override
public boolean isCustomConnection(KineticTileEntity other, BlockState state, BlockState otherState) {
if (!AllBlocks.GANTRY_PINION.has(otherState))
return false;
final BlockPos diff = other.getPos()
.subtract(pos);
Direction direction = Direction.getFacingFromVector(diff.getX(), diff.getY(), diff.getZ());
return otherState.get(GantryPinionBlock.FACING) == direction;
}
public boolean canAssembleOn() {
BlockState blockState = getBlockState();
if (!AllBlocks.GANTRY_SHAFT.has(blockState))
return false;
if (blockState.get(GantryShaftBlock.POWERED))
return false;
float speed = getPinionMovementSpeed();
switch (blockState.get(GantryShaftBlock.PART)) {
case END:
return speed < 0;
case MIDDLE:
return speed != 0;
case START:
return speed > 0;
case SINGLE:
default:
return false;
}
}
public float getPinionMovementSpeed() {
BlockState blockState = getBlockState();
if (!AllBlocks.GANTRY_SHAFT.has(blockState))
return 0;
return MathHelper.clamp(-getSpeed() / 512f, -.49f, .49f);
}
}

View file

@ -1,16 +1,21 @@
package com.simibubi.create.content.contraptions.relays.advanced; package com.simibubi.create.content.contraptions.relays.advanced;
import java.util.function.Predicate;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllShapes; import com.simibubi.create.AllShapes;
import com.simibubi.create.AllTileEntities; import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.base.HorizontalAxisKineticBlock; import com.simibubi.create.content.contraptions.base.HorizontalAxisKineticBlock;
import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock;
import com.simibubi.create.content.contraptions.relays.elementary.CogwheelBlockItem; import com.simibubi.create.content.contraptions.relays.elementary.CogwheelBlockItem;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.foundation.utility.placement.IPlacementHelper; import com.simibubi.create.foundation.utility.placement.IPlacementHelper;
import com.simibubi.create.foundation.utility.placement.PlacementHelpers; import com.simibubi.create.foundation.utility.placement.PlacementHelpers;
import com.simibubi.create.foundation.utility.placement.PlacementOffset; import com.simibubi.create.foundation.utility.placement.PlacementOffset;
import mcp.MethodsReturnNonnullByDefault; import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.BlockItemUseContext;
@ -27,9 +32,7 @@ import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.World; import net.minecraft.world.World;
import java.util.function.Predicate; public class SpeedControllerBlock extends HorizontalAxisKineticBlock implements ITE<SpeedControllerTileEntity> {
public class SpeedControllerBlock extends HorizontalAxisKineticBlock {
private static final int placementHelperId = PlacementHelpers.register(new PlacementHelper()); private static final int placementHelperId = PlacementHelpers.register(new PlacementHelper());
@ -44,14 +47,25 @@ public class SpeedControllerBlock extends HorizontalAxisKineticBlock {
@Override @Override
public BlockState getStateForPlacement(BlockItemUseContext context) { public BlockState getStateForPlacement(BlockItemUseContext context) {
BlockState above = context.getWorld().getBlockState(context.getPos().up()); BlockState above = context.getWorld()
if (CogWheelBlock.isLargeCog(above) && above.get(CogWheelBlock.AXIS).isHorizontal()) .getBlockState(context.getPos()
.up());
if (CogWheelBlock.isLargeCog(above) && above.get(CogWheelBlock.AXIS)
.isHorizontal())
return getDefaultState().with(HORIZONTAL_AXIS, above.get(CogWheelBlock.AXIS) == Axis.X ? Axis.Z : Axis.X); return getDefaultState().with(HORIZONTAL_AXIS, above.get(CogWheelBlock.AXIS) == Axis.X ? Axis.Z : Axis.X);
return super.getStateForPlacement(context); return super.getStateForPlacement(context);
} }
@Override @Override
public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult ray) { public void neighborChanged(BlockState state, World world, BlockPos pos, Block p_220069_4_, BlockPos neighbourPos,
boolean p_220069_6_) {
if (neighbourPos.equals(pos.up()))
withTileEntityDo(world, pos, SpeedControllerTileEntity::updateBracket);
}
@Override
public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand,
BlockRayTraceResult ray) {
IPlacementHelper helper = PlacementHelpers.get(placementHelperId); IPlacementHelper helper = PlacementHelpers.get(placementHelperId);
ItemStack heldItem = player.getHeldItem(hand); ItemStack heldItem = player.getHeldItem(hand);
@ -72,7 +86,7 @@ public class SpeedControllerBlock extends HorizontalAxisKineticBlock {
@Override @Override
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
return AllShapes.SPEED_CONTROLLER.get(state.get(HORIZONTAL_AXIS)); return AllShapes.SPEED_CONTROLLER;
} }
@MethodsReturnNonnullByDefault @MethodsReturnNonnullByDefault
@ -90,12 +104,15 @@ public class SpeedControllerBlock extends HorizontalAxisKineticBlock {
@Override @Override
public PlacementOffset getOffset(World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) { public PlacementOffset getOffset(World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) {
BlockPos newPos = pos.up(); BlockPos newPos = pos.up();
if (!world.getBlockState(newPos).getMaterial().isReplaceable()) if (!world.getBlockState(newPos)
.getMaterial()
.isReplaceable())
return PlacementOffset.fail(); return PlacementOffset.fail();
Axis newAxis = state.get(HORIZONTAL_AXIS) == Axis.X ? Axis.Z : Axis.X; Axis newAxis = state.get(HORIZONTAL_AXIS) == Axis.X ? Axis.Z : Axis.X;
if (CogwheelBlockItem.DiagonalCogHelper.hasLargeCogwheelNeighbor(world, newPos, newAxis) || CogwheelBlockItem.DiagonalCogHelper.hasSmallCogwheelNeighbor(world, newPos, newAxis)) if (CogwheelBlockItem.DiagonalCogHelper.hasLargeCogwheelNeighbor(world, newPos, newAxis)
|| CogwheelBlockItem.DiagonalCogHelper.hasSmallCogwheelNeighbor(world, newPos, newAxis))
return PlacementOffset.fail(); return PlacementOffset.fail();
return PlacementOffset.success(newPos, s -> s.with(CogWheelBlock.AXIS, newAxis)); return PlacementOffset.success(newPos, s -> s.with(CogWheelBlock.AXIS, newAxis));
@ -103,7 +120,14 @@ public class SpeedControllerBlock extends HorizontalAxisKineticBlock {
@Override @Override
public void renderAt(BlockPos pos, BlockState state, BlockRayTraceResult ray, PlacementOffset offset) { public void renderAt(BlockPos pos, BlockState state, BlockRayTraceResult ray, PlacementOffset offset) {
IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos), VecHelper.getCenterOf(offset.getPos()), Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, state.get(HORIZONTAL_AXIS) == Axis.X ? Axis.Z : Axis.X)); IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos), VecHelper.getCenterOf(offset.getPos()),
Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE,
state.get(HORIZONTAL_AXIS) == Axis.X ? Axis.Z : Axis.X));
} }
} }
@Override
public Class<SpeedControllerTileEntity> getTileEntityClass() {
return SpeedControllerTileEntity.class;
}
} }

View file

@ -1,14 +1,22 @@
package com.simibubi.create.content.contraptions.relays.advanced; package com.simibubi.create.content.contraptions.relays.advanced;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.vertex.IVertexBuilder;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.CreateClient; import com.simibubi.create.CreateClient;
import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer;
import com.simibubi.create.foundation.utility.SuperByteBuffer; import com.simibubi.create.foundation.utility.SuperByteBuffer;
import net.minecraft.block.BlockState;
import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
public class SpeedControllerRenderer extends SmartTileEntityRenderer<SpeedControllerTileEntity> { public class SpeedControllerRenderer extends SmartTileEntityRenderer<SpeedControllerTileEntity> {
@ -21,8 +29,22 @@ public class SpeedControllerRenderer extends SmartTileEntityRenderer<SpeedContro
IRenderTypeBuffer buffer, int light, int overlay) { IRenderTypeBuffer buffer, int light, int overlay) {
super.renderSafe(tileEntityIn, partialTicks, ms, buffer, light, overlay); super.renderSafe(tileEntityIn, partialTicks, ms, buffer, light, overlay);
KineticTileEntityRenderer.renderRotatingBuffer(tileEntityIn, getRotatedModel(tileEntityIn), ms, IVertexBuilder builder = buffer.getBuffer(RenderType.getSolid());
buffer.getBuffer(RenderType.getSolid()), light); KineticTileEntityRenderer.renderRotatingBuffer(tileEntityIn, getRotatedModel(tileEntityIn), ms, builder, light);
if (!tileEntityIn.hasBracket)
return;
BlockPos pos = tileEntityIn.getPos();
World world = tileEntityIn.getWorld();
BlockState blockState = tileEntityIn.getBlockState();
SuperByteBuffer bracket = AllBlockPartials.SPEED_CONTROLLER_BRACKET.renderOn(blockState);
bracket.translate(0, 1, 0);
bracket.rotateCentered(Direction.UP,
(float) (blockState.get(SpeedControllerBlock.HORIZONTAL_AXIS) == Axis.X ? Math.PI : 0));
bracket.light(WorldRenderer.getLightmapCoordinates(world, pos.up()));
bracket.renderInto(ms, builder);
} }
private SuperByteBuffer getRotatedModel(SpeedControllerTileEntity te) { private SuperByteBuffer getRotatedModel(SpeedControllerTileEntity te) {

View file

@ -2,9 +2,11 @@ package com.simibubi.create.content.contraptions.relays.advanced;
import java.util.List; import java.util.List;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.RotationPropagator; import com.simibubi.create.content.contraptions.RotationPropagator;
import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.components.motor.CreativeMotorTileEntity; import com.simibubi.create.content.contraptions.components.motor.CreativeMotorTileEntity;
import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock;
import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform;
@ -22,8 +24,17 @@ public class SpeedControllerTileEntity extends KineticTileEntity {
public static final int DEFAULT_SPEED = 16; public static final int DEFAULT_SPEED = 16;
protected ScrollValueBehaviour targetSpeed; protected ScrollValueBehaviour targetSpeed;
boolean hasBracket;
public SpeedControllerTileEntity(TileEntityType<? extends SpeedControllerTileEntity> type) { public SpeedControllerTileEntity(TileEntityType<? extends SpeedControllerTileEntity> type) {
super(type); super(type);
hasBracket = false;
}
@Override
public void lazyTick() {
super.lazyTick();
updateBracket();
} }
@Override @Override
@ -103,16 +114,25 @@ public class SpeedControllerTileEntity extends KineticTileEntity {
return targetSpeed; return targetSpeed;
} }
public void updateBracket() {
if (world == null || !world.isRemote)
return;
BlockState stateAbove = world.getBlockState(pos.up());
hasBracket = AllBlocks.LARGE_COGWHEEL.has(stateAbove) && stateAbove.get(CogWheelBlock.AXIS)
.isHorizontal();
}
private class ControllerValueBoxTransform extends ValueBoxTransform.Sided { private class ControllerValueBoxTransform extends ValueBoxTransform.Sided {
@Override @Override
protected Vec3d getSouthLocation() { protected Vec3d getSouthLocation() {
return VecHelper.voxelSpace(8, 11.5f, 14); return VecHelper.voxelSpace(8, 11f, 16);
} }
@Override @Override
protected boolean isSideActive(BlockState state, Direction direction) { protected boolean isSideActive(BlockState state, Direction direction) {
if (direction.getAxis().isVertical()) if (direction.getAxis()
.isVertical())
return false; return false;
return state.get(SpeedControllerBlock.HORIZONTAL_AXIS) != direction.getAxis(); return state.get(SpeedControllerBlock.HORIZONTAL_AXIS) != direction.getAxis();
} }

View file

@ -68,6 +68,11 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock implemen
withTileEntityDo(worldIn, pos, SequencedGearshiftTileEntity::onRedstoneUpdate); withTileEntityDo(worldIn, pos, SequencedGearshiftTileEntity::onRedstoneUpdate);
} }
@Override
protected boolean areStatesKineticallyEquivalent(BlockState oldState, BlockState newState) {
return false;
}
@Override @Override
public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) {
if (state.get(VERTICAL)) if (state.get(VERTICAL))

View file

@ -87,6 +87,12 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE<BeltTileEnt
p_149666_2_.add(AllItems.BELT_CONNECTOR.asStack()); p_149666_2_.add(AllItems.BELT_CONNECTOR.asStack());
} }
@Override
protected boolean areStatesKineticallyEquivalent(BlockState oldState, BlockState newState) {
return super.areStatesKineticallyEquivalent(oldState.with(CASING, false), newState.with(CASING, false))
&& oldState.get(PART) == newState.get(PART);
}
@Override @Override
public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) {
if (face.getAxis() != getRotationAxis(state)) if (face.getAxis() != getRotationAxis(state))

View file

@ -13,6 +13,7 @@ import java.util.Optional;
import java.util.function.Function; import java.util.function.Function;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.base.IRotate;
import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.relays.belt.transport.BeltInventory; import com.simibubi.create.content.contraptions.relays.belt.transport.BeltInventory;
import com.simibubi.create.content.contraptions.relays.belt.transport.BeltMovementHandler; import com.simibubi.create.content.contraptions.relays.belt.transport.BeltMovementHandler;
@ -480,4 +481,18 @@ public class BeltTileEntity extends KineticTileEntity {
.build(); .build();
} }
@Override
protected boolean canPropagateDiagonally(IRotate block, BlockState state) {
return state.has(BeltBlock.SLOPE)
&& (state.get(BeltBlock.SLOPE) == BeltSlope.UPWARD || state.get(BeltBlock.SLOPE) == BeltSlope.DOWNWARD);
}
@Override
public float propagateRotationTo(KineticTileEntity target, BlockState stateFrom, BlockState stateTo, BlockPos diff,
boolean connectedViaAxes, boolean connectedViaCogs) {
if (target instanceof BeltTileEntity && !connectedViaAxes)
return getController().equals(((BeltTileEntity) target).getController()) ? 1 : 0;
return 0;
}
} }

View file

@ -2,12 +2,16 @@ package com.simibubi.create.content.contraptions.relays.elementary;
import java.util.List; import java.util.List;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.base.IRotate;
import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.advancement.AllTriggers;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import net.minecraft.block.BlockState;
import net.minecraft.tileentity.TileEntityType; import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
public class SimpleKineticTileEntity extends KineticTileEntity { public class SimpleKineticTileEntity extends KineticTileEntity {
@ -28,4 +32,17 @@ public class SimpleKineticTileEntity extends KineticTileEntity {
return new AxisAlignedBB(pos).grow(1); return new AxisAlignedBB(pos).grow(1);
} }
@Override
public List<BlockPos> addPropagationLocations(IRotate block, BlockState state, List<BlockPos> neighbours) {
if (!AllBlocks.LARGE_COGWHEEL.has(state))
return super.addPropagationLocations(block, state, neighbours);
BlockPos.getAllInBox(new BlockPos(-1, -1, -1), new BlockPos(1, 1, 1))
.forEach(offset -> {
if (offset.distanceSq(0, 0, 0, false) == BlockPos.ZERO.distanceSq(1, 1, 0, false))
neighbours.add(pos.add(offset));
});
return neighbours;
}
} }

View file

@ -36,6 +36,7 @@ public class AdjustablePulleyBlock extends EncasedBeltBlock implements ITE<Adjus
@Override @Override
public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) {
super.onBlockAdded(state, worldIn, pos, oldState, isMoving);
if (oldState.getBlock() == state.getBlock()) if (oldState.getBlock() == state.getBlock())
return; return;
withTileEntityDo(worldIn, pos, AdjustablePulleyTileEntity::neighborChanged); withTileEntityDo(worldIn, pos, AdjustablePulleyTileEntity::neighborChanged);
@ -48,7 +49,14 @@ public class AdjustablePulleyBlock extends EncasedBeltBlock implements ITE<Adjus
@Override @Override
public BlockState getStateForPlacement(BlockItemUseContext context) { public BlockState getStateForPlacement(BlockItemUseContext context) {
return super.getStateForPlacement(context).with(POWERED, context.getWorld().isBlockPowered(context.getPos())); return super.getStateForPlacement(context).with(POWERED, context.getWorld()
.isBlockPowered(context.getPos()));
}
@Override
protected boolean areStatesKineticallyEquivalent(BlockState oldState, BlockState newState) {
return super.areStatesKineticallyEquivalent(oldState, newState)
&& oldState.get(POWERED) == newState.get(POWERED);
} }
@Override @Override

View file

@ -9,7 +9,6 @@ import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.material.PushReaction; import net.minecraft.block.material.PushReaction;
import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.BlockItemUseContext;
import net.minecraft.item.ItemUseContext; import net.minecraft.item.ItemUseContext;
@ -17,6 +16,7 @@ import net.minecraft.state.BooleanProperty;
import net.minecraft.state.EnumProperty; import net.minecraft.state.EnumProperty;
import net.minecraft.state.IProperty; import net.minecraft.state.IProperty;
import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.StateContainer.Builder;
import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis; import net.minecraft.util.Direction.Axis;
@ -125,12 +125,23 @@ public class EncasedBeltBlock extends RotatedPillarKineticBlock {
.with(CONNECTED_ALONG_FIRST_COORDINATE, connectionAlongFirst); .with(CONNECTED_ALONG_FIRST_COORDINATE, connectionAlongFirst);
} }
@Override
public BlockState getRotatedBlockState(BlockState originalState, Direction targetedFace) {
if (originalState.get(PART) == Part.NONE)
return super.getRotatedBlockState(originalState, targetedFace);
return super.getRotatedBlockState(originalState,
Direction.getFacingFromAxis(AxisDirection.POSITIVE, getConnectionAxis(originalState)));
}
@Override @Override
public BlockState updateAfterWrenched(BlockState newState, ItemUseContext context) { public BlockState updateAfterWrenched(BlockState newState, ItemUseContext context) {
Blocks.AIR.getDefaultState() // Blocks.AIR.getDefaultState()
.updateNeighbors(context.getWorld(), context.getPos(), 1); // .updateNeighbors(context.getWorld(), context.getPos(), 1);
Axis axis = newState.get(AXIS); Axis axis = newState.get(AXIS);
newState = getDefaultState().with(AXIS, axis); newState = getDefaultState().with(AXIS, axis);
if (newState.has(BlockStateProperties.POWERED))
newState = newState.with(BlockStateProperties.POWERED, context.getWorld()
.isBlockPowered(context.getPos()));
for (Direction facing : Iterate.directions) { for (Direction facing : Iterate.directions) {
if (facing.getAxis() == axis) if (facing.getAxis() == axis)
continue; continue;
@ -139,7 +150,7 @@ public class EncasedBeltBlock extends RotatedPillarKineticBlock {
newState = updatePostPlacement(newState, facing, context.getWorld() newState = updatePostPlacement(newState, facing, context.getWorld()
.getBlockState(offset), context.getWorld(), pos, offset); .getBlockState(offset), context.getWorld(), pos, offset);
} }
newState.updateNeighbors(context.getWorld(), context.getPos(), 1 | 2); // newState.updateNeighbors(context.getWorld(), context.getPos(), 1 | 2);
return newState; return newState;
} }
@ -155,15 +166,8 @@ public class EncasedBeltBlock extends RotatedPillarKineticBlock {
public static boolean areBlocksConnected(BlockState state, BlockState other, Direction facing) { public static boolean areBlocksConnected(BlockState state, BlockState other, Direction facing) {
Part part = state.get(PART); Part part = state.get(PART);
Axis axis = state.get(AXIS); Axis connectionAxis = getConnectionAxis(state);
boolean connectionAlongFirst = state.get(CONNECTED_ALONG_FIRST_COORDINATE); Axis otherConnectionAxis = getConnectionAxis(other);
Axis connectionAxis =
connectionAlongFirst ? (axis == Axis.X ? Axis.Y : Axis.X) : (axis == Axis.Z ? Axis.Y : Axis.Z);
Axis otherAxis = other.get(AXIS);
boolean otherConnection = other.get(CONNECTED_ALONG_FIRST_COORDINATE);
Axis otherConnectionAxis =
otherConnection ? (otherAxis == Axis.X ? Axis.Y : Axis.X) : (otherAxis == Axis.Z ? Axis.Y : Axis.Z);
if (otherConnectionAxis != connectionAxis) if (otherConnectionAxis != connectionAxis)
return false; return false;
@ -177,6 +181,14 @@ public class EncasedBeltBlock extends RotatedPillarKineticBlock {
return false; return false;
} }
protected static Axis getConnectionAxis(BlockState state) {
Axis axis = state.get(AXIS);
boolean connectionAlongFirst = state.get(CONNECTED_ALONG_FIRST_COORDINATE);
Axis connectionAxis =
connectionAlongFirst ? (axis == Axis.X ? Axis.Y : Axis.X) : (axis == Axis.Z ? Axis.Y : Axis.Z);
return connectionAxis;
}
public static float getRotationSpeedModifier(KineticTileEntity from, KineticTileEntity to) { public static float getRotationSpeedModifier(KineticTileEntity from, KineticTileEntity to) {
float fromMod = 1; float fromMod = 1;
float toMod = 1; float toMod = 1;

View file

@ -14,7 +14,6 @@ import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.block.material.Material;
import net.minecraft.block.material.MaterialColor; import net.minecraft.block.material.MaterialColor;
import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.BlockItemUseContext;
import net.minecraft.particles.RedstoneParticleData; import net.minecraft.particles.RedstoneParticleData;
@ -114,6 +113,7 @@ public class GaugeBlock extends DirectionalAxisKineticBlock {
return context.getFace(); return context.getFace();
} }
@Override
protected boolean getAxisAlignmentForPlacement(BlockItemUseContext context) { protected boolean getAxisAlignmentForPlacement(BlockItemUseContext context) {
return context.getPlacementHorizontalFacing().getAxis() != Axis.X; return context.getPlacementHorizontalFacing().getAxis() != Axis.X;
} }
@ -127,8 +127,7 @@ public class GaugeBlock extends DirectionalAxisKineticBlock {
return false; return false;
if (getRotationAxis(state) == Axis.Y && face != state.get(FACING)) if (getRotationAxis(state) == Axis.Y && face != state.get(FACING))
return false; return false;
BlockState blockState = world.getBlockState(pos.offset(face)); if (!Block.shouldSideBeRendered(state, world, pos, face)
if (Block.hasSolidSide(blockState, world, pos, face.getOpposite()) && blockState.getMaterial() != Material.GLASS
&& !(world instanceof WrappedWorld)) && !(world instanceof WrappedWorld))
return false; return false;
return true; return true;

View file

@ -44,7 +44,8 @@ public interface IWrenchable {
} }
default BlockState updateAfterWrenched(BlockState newState, ItemUseContext context) { default BlockState updateAfterWrenched(BlockState newState, ItemUseContext context) {
return newState; // return newState;
return Block.getValidBlockForPosition(newState, context.getWorld(), context.getPos());
} }
default ActionResultType onSneakWrenched(BlockState state, ItemUseContext context) { default ActionResultType onSneakWrenched(BlockState state, ItemUseContext context) {

View file

@ -5,6 +5,7 @@ import java.util.function.Supplier;
import com.simibubi.create.foundation.networking.SimplePacketBase; import com.simibubi.create.foundation.networking.SimplePacketBase;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.network.PacketBuffer; import net.minecraft.network.PacketBuffer;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
@ -53,15 +54,20 @@ public class ExtendoGripInteractionPacket extends SimplePacketBase {
@Override @Override
public void handle(Supplier<Context> context) { public void handle(Supplier<Context> context) {
context.get() context.get().enqueueWork(() -> {
.enqueueWork(() -> { ServerPlayerEntity sender = context.get().getSender();
ServerPlayerEntity sender = context.get()
.getSender();
if (sender == null) if (sender == null)
return; return;
Entity entityByID = sender.getServerWorld() Entity entityByID = sender.getServerWorld().getEntityByID(target);
.getEntityByID(target);
if (entityByID != null && ExtendoGripItem.isHoldingExtendoGrip(sender)) { if (entityByID != null && ExtendoGripItem.isHoldingExtendoGrip(sender)) {
double d = sender.getAttribute(PlayerEntity.REACH_DISTANCE).getValue();
if (!sender.canEntityBeSeen(entityByID))
d -= 3;
d *= d;
if (sender.getDistanceSq(entityByID) > d) {
// TODO log?
return;
}
if (interactionHand == null) if (interactionHand == null)
sender.attackTargetEntityWithCurrentItem(entityByID); sender.attackTargetEntityWithCurrentItem(entityByID);
else if (specificPoint == null) else if (specificPoint == null)
@ -70,8 +76,7 @@ public class ExtendoGripInteractionPacket extends SimplePacketBase {
entityByID.applyPlayerInteraction(sender, specificPoint, interactionHand); entityByID.applyPlayerInteraction(sender, specificPoint, interactionHand);
} }
}); });
context.get() context.get().setPacketHandled(true);
.setPacketHandled(true);
} }
} }

View file

@ -10,6 +10,7 @@ import com.simibubi.create.foundation.item.ItemDescription;
import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.utility.BlockHelper; import com.simibubi.create.foundation.utility.BlockHelper;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.NBTProcessors;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
@ -115,7 +116,7 @@ public abstract class ZapperItem extends Item {
}); });
applyCooldown(player, item, false); applyCooldown(player, item, false);
} }
return new ActionResult<ItemStack>(ActionResultType.SUCCESS, item); return new ActionResult<>(ActionResultType.SUCCESS, item);
} }
boolean mainHand = hand == Hand.MAIN_HAND; boolean mainHand = hand == Hand.MAIN_HAND;
@ -125,7 +126,7 @@ public abstract class ZapperItem extends Item {
// Pass To Offhand // Pass To Offhand
if (mainHand && isSwap && gunInOtherHand) if (mainHand && isSwap && gunInOtherHand)
return new ActionResult<ItemStack>(ActionResultType.FAIL, item); return new ActionResult<>(ActionResultType.FAIL, item);
if (mainHand && !isSwap && gunInOtherHand) if (mainHand && !isSwap && gunInOtherHand)
item.getTag() item.getTag()
.putBoolean("_Swap", true); .putBoolean("_Swap", true);
@ -144,7 +145,7 @@ public abstract class ZapperItem extends Item {
world.playSound(player, player.getPosition(), AllSoundEvents.BLOCKZAPPER_DENY.get(), SoundCategory.BLOCKS, world.playSound(player, player.getPosition(), AllSoundEvents.BLOCKZAPPER_DENY.get(), SoundCategory.BLOCKS,
1f, 0.5f); 1f, 0.5f);
player.sendStatusMessage(msg.applyTextStyle(TextFormatting.RED), true); player.sendStatusMessage(msg.applyTextStyle(TextFormatting.RED), true);
return new ActionResult<ItemStack>(ActionResultType.FAIL, item); return new ActionResult<>(ActionResultType.FAIL, item);
} }
BlockState stateToUse = Blocks.AIR.getDefaultState(); BlockState stateToUse = Blocks.AIR.getDefaultState();
@ -169,7 +170,7 @@ public abstract class ZapperItem extends Item {
// No target // No target
if (pos == null || stateReplaced.getBlock() == Blocks.AIR) { if (pos == null || stateReplaced.getBlock() == Blocks.AIR) {
applyCooldown(player, item, gunInOtherHand); applyCooldown(player, item, gunInOtherHand);
return new ActionResult<ItemStack>(ActionResultType.SUCCESS, item); return new ActionResult<>(ActionResultType.SUCCESS, item);
} }
// Find exact position of gun barrel for VFX // Find exact position of gun barrel for VFX
@ -183,7 +184,7 @@ public abstract class ZapperItem extends Item {
// Client side // Client side
if (world.isRemote) { if (world.isRemote) {
ZapperRenderHandler.dontAnimateItem(hand); ZapperRenderHandler.dontAnimateItem(hand);
return new ActionResult<ItemStack>(ActionResultType.SUCCESS, item); return new ActionResult<>(ActionResultType.SUCCESS, item);
} }
// Server side // Server side
@ -195,7 +196,7 @@ public abstract class ZapperItem extends Item {
new ZapperBeamPacket(barrelPos, raytrace.getHitVec(), hand, true)); new ZapperBeamPacket(barrelPos, raytrace.getHitVec(), hand, true));
} }
return new ActionResult<ItemStack>(ActionResultType.SUCCESS, item); return new ActionResult<>(ActionResultType.SUCCESS, item);
} }
public ITextComponent validateUsage(ItemStack item) { public ITextComponent validateUsage(ItemStack item) {
@ -240,10 +241,13 @@ public abstract class ZapperItem extends Item {
return UseAction.NONE; return UseAction.NONE;
} }
public static void setTileData(World world, BlockPos pos, CompoundNBT data) { public static void setTileData(World world, BlockPos pos, BlockState state, CompoundNBT data, PlayerEntity player) {
if (data != null) { if (data != null && AllBlockTags.SAFE_NBT.matches(state)) {
TileEntity tile = world.getTileEntity(pos); TileEntity tile = world.getTileEntity(pos);
if (tile != null && !tile.onlyOpsCanSetNbt()) { if (tile != null) {
data = NBTProcessors.process(tile, data, !player.isCreative());
if (data == null)
return;
data.putInt("x", pos.getX()); data.putInt("x", pos.getX());
data.putInt("y", pos.getY()); data.putInt("y", pos.getY());
data.putInt("z", pos.getZ()); data.putInt("z", pos.getZ());

View file

@ -135,7 +135,7 @@ public class BlockzapperItem extends ZapperItem {
blocksnapshot.restore(true, false); blocksnapshot.restore(true, false);
return false; return false;
} }
setTileData(world, placed, data); setTileData(world, placed, state, data, player);
if (player instanceof ServerPlayerEntity && world instanceof ServerWorld) { if (player instanceof ServerPlayerEntity && world instanceof ServerWorld) {
ServerPlayerEntity serverPlayer = (ServerPlayerEntity) player; ServerPlayerEntity serverPlayer = (ServerPlayerEntity) player;

Some files were not shown because too many files have changed in this diff Show more