mirror of
https://github.com/Creators-of-Create/Create.git
synced 2024-12-16 11:13:42 +01:00
commit
932ff3bd01
181 changed files with 17782 additions and 6839 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -40,4 +40,3 @@ local.properties
|
|||
|
||||
# PDT-specific
|
||||
.buildpath
|
||||
src/generated/resources/.cache/cache
|
||||
|
|
|
@ -157,6 +157,8 @@ afff479c0e5284771afa9e7ce513595fe65860ee assets/create/blockstates/gabbro_cobble
|
|||
a1f31a194129cfb65e335b3b96490f9275f9c564 assets/create/blockstates/gabbro_cobblestone_stairs.json
|
||||
a64d8d0924c0b5b192f355343dd9b3a440875f6a assets/create/blockstates/gabbro_cobblestone_wall.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
|
||||
f34814b17cde3231a1dfb271f3dabf8d6de4fbf6 assets/create/blockstates/gearshift.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
|
||||
7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json
|
||||
b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json
|
||||
df67c2c11fa22487d3a0fdc9b008056e593d14e3 assets/create/lang/en_ud.json
|
||||
3ad443f44eb33fe8c3ac092d1532dcbd27e49c84 assets/create/lang/en_us.json
|
||||
612a63d73f7f4b8e79dce3f53ddbe3345f0e74d8 assets/create/lang/unfinished/de_de.json
|
||||
2e37dc718a8dea2af85daba7266c877ce80ff35b assets/create/lang/unfinished/fr_fr.json
|
||||
f843761728c403276b7a47282f4fdd039b5b6854 assets/create/lang/unfinished/it_it.json
|
||||
8b90c66fd5974c993e83bfa5733ca03187211d28 assets/create/lang/unfinished/ja_jp.json
|
||||
59db0a3cff42707ecb828b975ef1fcba2a21a521 assets/create/lang/unfinished/ko_kr.json
|
||||
b1900a6cce7216a4baa844affa169cfb32ff645c assets/create/lang/unfinished/nl_nl.json
|
||||
d3f09a37b1f4ec5d53effc2b87efbccf2df2b7c7 assets/create/lang/unfinished/pt_br.json
|
||||
16c92dab525ba20e85b65ee084f7b760432dcb73 assets/create/lang/unfinished/ru_ru.json
|
||||
c8b5c2a3a65468950aa713a56bf1c930eef81305 assets/create/lang/unfinished/zh_cn.json
|
||||
e3f618c5b622d21880de858678d1802cbf65e615 assets/create/lang/en_ud.json
|
||||
acc852d80378b426d7ee6cb59c169e06b6d63b25 assets/create/lang/en_us.json
|
||||
30ce93c56557cea2f384a47b549fb893700523a5 assets/create/lang/unfinished/de_de.json
|
||||
77b8310f3cbed36fa0d2ee29e65ac6aee0c2adc2 assets/create/lang/unfinished/es_mx.json
|
||||
8db9f9147dcef8c8182c548a524f96f578c116ec assets/create/lang/unfinished/fr_fr.json
|
||||
89f7029d73733938ee9f900fc36d52ab7fc97563 assets/create/lang/unfinished/it_it.json
|
||||
b1935e7f8d79d1112e1685adb42daedb976ac6d7 assets/create/lang/unfinished/ja_jp.json
|
||||
23aaf879d07a24775aeba3b98c355c992b24f28b assets/create/lang/unfinished/ko_kr.json
|
||||
7372533759001f094dbcad787f01f3de7422d8c0 assets/create/lang/unfinished/nl_nl.json
|
||||
0d1e5d79ef196a06b273962d5ac8f2013f91209c assets/create/lang/unfinished/pt_br.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
|
||||
1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.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
|
||||
820235f51e7c3b4c05a327c3aa66618ea1e89c9c assets/create/models/block/gabbro_cobblestone_wall_side.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
|
||||
0ee90049ce09f1f1c96063bc7239cd1fadbdb947 assets/create/models/block/granite_bricks_slab.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
|
||||
5680f24b43838cb6632bfcedba282a244bd24db0 assets/create/models/item/gabbro_cobblestone_wall.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
|
||||
2fe29893d74c176ea35aed73a169c13dd4ddb2a8 assets/create/models/item/gearshift.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
|
||||
a2b33e972c7130cbf105f34d88dd7a9a53d5465c data/create/advancements/recipes/create.base/crafting/kinetics/fluid_tank.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
|
||||
8f9819912605cb2499cb3e79ecb0e709b0e38c19 data/create/advancements/recipes/create.base/crafting/kinetics/gearboxfrom_conversion.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
|
||||
ae19749df10663efc51b8b27af310164f250ed38 data/create/loot_tables/blocks/gabbro_cobblestone_wall.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
|
||||
5f39461c5c9d3ad8d84195b06b9468fe2b0fb269 data/create/loot_tables/blocks/gearshift.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
|
||||
3dad2a849796df268cd3a06ed37376f2cc529957 data/create/recipes/crafting/kinetics/fluid_valve.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
|
||||
b5da8c58f6b8aba525ae8a12ad906db37b78a566 data/create/recipes/crafting/kinetics/gearboxfrom_conversion.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
|
||||
13b55d6e905a02403d2e95e9ba2357f99c5f2241 data/create/tags/blocks/fan_heaters.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
|
||||
6cdeeac1689f7b5bfd9bc40b462143d8eaf3ad0b data/create/tags/blocks/seats.json
|
||||
50936b211d94167a35ec78c89954082a336b6269 data/create/tags/blocks/valve_handles.json
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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_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.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.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",
|
||||
|
@ -400,6 +402,7 @@
|
|||
"block.create.zinc_block": "\u029E\u0254o\u05DF\u15FA \u0254u\u0131Z",
|
||||
"block.create.zinc_ore": "\u01DD\u0279O \u0254u\u0131Z",
|
||||
"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.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",
|
||||
|
|
|
@ -161,6 +161,8 @@
|
|||
"block.create.gabbro_cobblestone_stairs": "Gabbro Cobblestone Stairs",
|
||||
"block.create.gabbro_cobblestone_wall": "Gabbro Cobblestone Wall",
|
||||
"block.create.gabbro_pillar": "Gabbro Pillar",
|
||||
"block.create.gantry_pinion": "Gantry Pinion",
|
||||
"block.create.gantry_shaft": "Gantry Shaft",
|
||||
"block.create.gearbox": "Gearbox",
|
||||
"block.create.gearshift": "Gearshift",
|
||||
"block.create.glass_fluid_pipe": "Glass Fluid Pipe",
|
||||
|
@ -404,6 +406,7 @@
|
|||
"block.create.zinc_ore": "Zinc Ore",
|
||||
|
||||
"entity.create.contraption": "Contraption",
|
||||
"entity.create.gantry_contraption": "Gantry Contraption",
|
||||
"entity.create.seat": "Seat",
|
||||
"entity.create.stationary_contraption": "Stationary Contraption",
|
||||
"entity.create.super_glue": "Super Glue",
|
||||
|
|
|
@ -1,122 +1,122 @@
|
|||
{
|
||||
"_": "Missing Localizations: 1211",
|
||||
"_": "Missing Localizations: 1095",
|
||||
|
||||
"_": "->------------------------] Game Elements [------------------------<-",
|
||||
|
||||
"block.create.acacia_window": "UNLOCALIZED: Acacia Window",
|
||||
"block.create.acacia_window_pane": "UNLOCALIZED: Acacia Window Pane",
|
||||
"block.create.adjustable_chain_gearshift": "UNLOCALIZED: Adjustable Chain Gearshift",
|
||||
"block.create.adjustable_crate": "adjustable_crate",
|
||||
"block.create.adjustable_pulse_repeater": "UNLOCALIZED: Adjustable Pulse Repeater",
|
||||
"block.create.adjustable_repeater": "Verzögernder Verstärker",
|
||||
"block.create.analog_lever": "UNLOCALIZED: Analog Lever",
|
||||
"block.create.andesite_belt_funnel": "UNLOCALIZED: Andesite Belt Funnel",
|
||||
"block.create.acacia_window": "Akazienfenster",
|
||||
"block.create.acacia_window_pane": "Akazienfensterscheibe",
|
||||
"block.create.adjustable_chain_gearshift": "Verstellbares Kettengetriebe",
|
||||
"block.create.adjustable_crate": "Verstellbare Kiste",
|
||||
"block.create.adjustable_pulse_repeater": "Verstellbarer Pulsverstärker",
|
||||
"block.create.adjustable_repeater": "Verstellbarer Verstärker",
|
||||
"block.create.analog_lever": "Analoger Schalter",
|
||||
"block.create.andesite_belt_funnel": "Riementrichter aus Andesit",
|
||||
"block.create.andesite_bricks": "Andesitziegel",
|
||||
"block.create.andesite_bricks_slab": "UNLOCALIZED: Andesite Bricks Slab",
|
||||
"block.create.andesite_bricks_stairs": "UNLOCALIZED: Andesite Bricks Stairs",
|
||||
"block.create.andesite_bricks_wall": "UNLOCALIZED: Andesite Bricks Wall",
|
||||
"block.create.andesite_casing": "UNLOCALIZED: Andesite Casing",
|
||||
"block.create.andesite_cobblestone": "UNLOCALIZED: Andesite Cobblestone",
|
||||
"block.create.andesite_cobblestone_slab": "UNLOCALIZED: Andesite Cobblestone Slab",
|
||||
"block.create.andesite_cobblestone_stairs": "UNLOCALIZED: Andesite Cobblestone Stairs",
|
||||
"block.create.andesite_cobblestone_wall": "UNLOCALIZED: Andesite Cobblestone Wall",
|
||||
"block.create.andesite_encased_shaft": "UNLOCALIZED: Andesite Encased Shaft",
|
||||
"block.create.andesite_funnel": "UNLOCALIZED: Andesite Funnel",
|
||||
"block.create.andesite_pillar": "UNLOCALIZED: Andesite Pillar",
|
||||
"block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel",
|
||||
"block.create.basin": "UNLOCALIZED: Basin",
|
||||
"block.create.andesite_bricks_slab": "Andesitziegelstufe",
|
||||
"block.create.andesite_bricks_stairs": "Andesitziegeltreppe",
|
||||
"block.create.andesite_bricks_wall": "Andesitziegelmauer",
|
||||
"block.create.andesite_casing": "Andesitrahmen",
|
||||
"block.create.andesite_cobblestone": "Andesitbruchstein",
|
||||
"block.create.andesite_cobblestone_slab": "Andesitbruchsteinstufe",
|
||||
"block.create.andesite_cobblestone_stairs": "Andesitbruchsteintreppe",
|
||||
"block.create.andesite_cobblestone_wall": "Andesitbruchsteinmauer",
|
||||
"block.create.andesite_encased_shaft": "Andesitummantelte Welle",
|
||||
"block.create.andesite_funnel": "Andesit Trichter",
|
||||
"block.create.andesite_pillar": "Andesitsäule",
|
||||
"block.create.andesite_tunnel": "Andesittunnel",
|
||||
"block.create.basin": "Behälter",
|
||||
"block.create.belt": "Mechanischer Riemen",
|
||||
"block.create.birch_window": "UNLOCALIZED: Birch Window",
|
||||
"block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane",
|
||||
"block.create.black_sail": "UNLOCALIZED: Black Sail",
|
||||
"block.create.black_seat": "UNLOCALIZED: Black Seat",
|
||||
"block.create.black_valve_handle": "UNLOCALIZED: Black Valve Handle",
|
||||
"block.create.blaze_burner": "UNLOCALIZED: Blaze Burner",
|
||||
"block.create.blue_sail": "UNLOCALIZED: Blue Sail",
|
||||
"block.create.blue_seat": "UNLOCALIZED: Blue Seat",
|
||||
"block.create.blue_valve_handle": "UNLOCALIZED: Blue Valve Handle",
|
||||
"block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel",
|
||||
"block.create.brass_block": "UNLOCALIZED: Brass Block",
|
||||
"block.create.brass_casing": "UNLOCALIZED: Brass Casing",
|
||||
"block.create.brass_encased_shaft": "UNLOCALIZED: Brass Encased Shaft",
|
||||
"block.create.brass_funnel": "UNLOCALIZED: Brass Funnel",
|
||||
"block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel",
|
||||
"block.create.brown_sail": "UNLOCALIZED: Brown Sail",
|
||||
"block.create.brown_seat": "UNLOCALIZED: Brown Seat",
|
||||
"block.create.brown_valve_handle": "UNLOCALIZED: Brown Valve Handle",
|
||||
"block.create.cart_assembler": "UNLOCALIZED: Cart Assembler",
|
||||
"block.create.chiseled_dark_scoria": "UNLOCALIZED: Chiseled Dark Scoria",
|
||||
"block.create.chiseled_dolomite": "UNLOCALIZED: Chiseled Dolomite",
|
||||
"block.create.chiseled_gabbro": "UNLOCALIZED: Chiseled Gabbro",
|
||||
"block.create.chiseled_limestone": "UNLOCALIZED: Chiseled Limestone",
|
||||
"block.create.chiseled_scoria": "UNLOCALIZED: Chiseled Scoria",
|
||||
"block.create.chiseled_weathered_limestone": "UNLOCALIZED: Chiseled Weathered Limestone",
|
||||
"block.create.chocolate": "UNLOCALIZED: Chocolate",
|
||||
"block.create.chute": "UNLOCALIZED: Chute",
|
||||
"block.create.clockwork_bearing": "UNLOCALIZED: Clockwork Bearing",
|
||||
"block.create.black_sail": "Schwarzes Segel",
|
||||
"block.create.black_seat": "Schwarzer Sitz",
|
||||
"block.create.black_valve_handle": "Schwarzer Ventilgriff",
|
||||
"block.create.blaze_burner": "Lohenbrenner",
|
||||
"block.create.blue_sail": "Blaues Segel",
|
||||
"block.create.blue_seat": "Blauer Sitz",
|
||||
"block.create.blue_valve_handle": "Blauer Ventilgriff",
|
||||
"block.create.brass_belt_funnel": "Riementrichter aus Messing",
|
||||
"block.create.brass_block": "Messing Block",
|
||||
"block.create.brass_casing": "Messingrahmen",
|
||||
"block.create.brass_encased_shaft": "Messingummantelte Welle",
|
||||
"block.create.brass_funnel": "Messingtrichter",
|
||||
"block.create.brass_tunnel": "Messingtunnel",
|
||||
"block.create.brown_sail": "Braunes Segel",
|
||||
"block.create.brown_seat": "Brauner Sitz",
|
||||
"block.create.brown_valve_handle": "Brauner Ventilgriff",
|
||||
"block.create.cart_assembler": "Lohrenmonteur",
|
||||
"block.create.chiseled_dark_scoria": "Gemeißelte dunkle Schlacke",
|
||||
"block.create.chiseled_dolomite": "Gemeißeltes Dolomit",
|
||||
"block.create.chiseled_gabbro": "Gemeißeltes Gabbro",
|
||||
"block.create.chiseled_limestone": "Gemeißelter Kalkstein",
|
||||
"block.create.chiseled_scoria": "Gemeißelte Schlacke",
|
||||
"block.create.chiseled_weathered_limestone": "Gemeißelter verwitterter Kalkstein",
|
||||
"block.create.chocolate": "Schokolade",
|
||||
"block.create.chute": "Rinne",
|
||||
"block.create.clockwork_bearing": "Uhrwerk-Lager",
|
||||
"block.create.clutch": "Kupplung",
|
||||
"block.create.cogwheel": "Zahnrad",
|
||||
"block.create.content_observer": "UNLOCALIZED: Content Observer",
|
||||
"block.create.controller_rail": "UNLOCALIZED: Controller Rail",
|
||||
"block.create.copper_block": "UNLOCALIZED: Copper Block",
|
||||
"block.create.copper_casing": "UNLOCALIZED: Copper Casing",
|
||||
"block.create.copper_ore": "UNLOCALIZED: Copper Ore",
|
||||
"block.create.copper_shingles": "UNLOCALIZED: Copper Shingles",
|
||||
"block.create.copper_tiles": "UNLOCALIZED: Copper Tiles",
|
||||
"block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle",
|
||||
"block.create.creative_crate": "Bauplankanonenmacher",
|
||||
"block.create.creative_fluid_tank": "UNLOCALIZED: Creative Fluid Tank",
|
||||
"block.create.creative_motor": "UNLOCALIZED: Creative Motor",
|
||||
"block.create.content_observer": "Inhalts Beobachter",
|
||||
"block.create.controller_rail": "Steureungsschiene",
|
||||
"block.create.copper_block": "Kupfer Block",
|
||||
"block.create.copper_casing": "Kupferrahmen",
|
||||
"block.create.copper_ore": "Kupfererz",
|
||||
"block.create.copper_shingles": "Kupferschindeln",
|
||||
"block.create.copper_tiles": "Kupferfliesen",
|
||||
"block.create.copper_valve_handle": "Kupfer Ventilgriff",
|
||||
"block.create.creative_crate": "Kreative anpassbare Kiste",
|
||||
"block.create.creative_fluid_tank": "Kreativer Flüssigkeitstank",
|
||||
"block.create.creative_motor": "Kreativer Motor",
|
||||
"block.create.crushing_wheel": "Mahlwerkrad",
|
||||
"block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller",
|
||||
"block.create.cuckoo_clock": "UNLOCALIZED: Cuckoo Clock",
|
||||
"block.create.cyan_sail": "UNLOCALIZED: Cyan Sail",
|
||||
"block.create.cyan_seat": "UNLOCALIZED: Cyan Seat",
|
||||
"block.create.cyan_valve_handle": "UNLOCALIZED: Cyan Valve Handle",
|
||||
"block.create.dark_oak_window": "UNLOCALIZED: Dark Oak Window",
|
||||
"block.create.dark_oak_window_pane": "UNLOCALIZED: Dark Oak Window Pane",
|
||||
"block.create.dark_scoria": "UNLOCALIZED: Dark Scoria",
|
||||
"block.create.dark_scoria_bricks": "UNLOCALIZED: Dark Scoria Bricks",
|
||||
"block.create.dark_scoria_bricks_slab": "UNLOCALIZED: Dark Scoria Bricks Slab",
|
||||
"block.create.dark_scoria_bricks_stairs": "UNLOCALIZED: Dark Scoria Bricks Stairs",
|
||||
"block.create.dark_scoria_bricks_wall": "UNLOCALIZED: Dark Scoria Bricks Wall",
|
||||
"block.create.dark_scoria_cobblestone": "UNLOCALIZED: Dark Scoria Cobblestone",
|
||||
"block.create.dark_scoria_cobblestone_slab": "UNLOCALIZED: Dark Scoria Cobblestone Slab",
|
||||
"block.create.dark_scoria_cobblestone_stairs": "UNLOCALIZED: Dark Scoria Cobblestone Stairs",
|
||||
"block.create.dark_scoria_cobblestone_wall": "UNLOCALIZED: Dark Scoria Cobblestone Wall",
|
||||
"block.create.dark_scoria_pillar": "UNLOCALIZED: Dark Scoria Pillar",
|
||||
"block.create.deployer": "UNLOCALIZED: Deployer",
|
||||
"block.create.depot": "UNLOCALIZED: Depot",
|
||||
"block.create.crushing_wheel_controller": "Mahlwerkrad Steurung",
|
||||
"block.create.cuckoo_clock": "Kuckucksuhr",
|
||||
"block.create.cyan_sail": "Türkises Segel",
|
||||
"block.create.cyan_seat": "Türkiser Sitz",
|
||||
"block.create.cyan_valve_handle": "Türkiser Ventilgriff",
|
||||
"block.create.dark_oak_window": "Schwarzeichenholzfenster",
|
||||
"block.create.dark_oak_window_pane": "Schwarzeichenholzfensterscheibe",
|
||||
"block.create.dark_scoria": "Dunkle Schlacke",
|
||||
"block.create.dark_scoria_bricks": "Dunkle Schlackenziegel",
|
||||
"block.create.dark_scoria_bricks_slab": "Dunkle Schlackenziegelstufe",
|
||||
"block.create.dark_scoria_bricks_stairs": "Dunkle Schlackenziegeltreppe",
|
||||
"block.create.dark_scoria_bricks_wall": "Dunkle Schlackenziegelmauer",
|
||||
"block.create.dark_scoria_cobblestone": "Dunkler Schlackebruchstein",
|
||||
"block.create.dark_scoria_cobblestone_slab": "Dunkle Schlackebruchsteinstufe",
|
||||
"block.create.dark_scoria_cobblestone_stairs": "Dunkle Schlackebruchsteintreppe",
|
||||
"block.create.dark_scoria_cobblestone_wall": "Dunkle Schlackebruchsteinmauer",
|
||||
"block.create.dark_scoria_pillar": "Dunkle Schlackesäule",
|
||||
"block.create.deployer": "Einsatzgerät",
|
||||
"block.create.depot": "Depot",
|
||||
"block.create.diorite_bricks": "Dioritziegel",
|
||||
"block.create.diorite_bricks_slab": "UNLOCALIZED: Diorite Bricks Slab",
|
||||
"block.create.diorite_bricks_stairs": "UNLOCALIZED: Diorite Bricks Stairs",
|
||||
"block.create.diorite_bricks_wall": "UNLOCALIZED: Diorite Bricks Wall",
|
||||
"block.create.diorite_cobblestone": "UNLOCALIZED: Diorite Cobblestone",
|
||||
"block.create.diorite_cobblestone_slab": "UNLOCALIZED: Diorite Cobblestone Slab",
|
||||
"block.create.diorite_cobblestone_stairs": "UNLOCALIZED: Diorite Cobblestone Stairs",
|
||||
"block.create.diorite_cobblestone_wall": "UNLOCALIZED: Diorite Cobblestone Wall",
|
||||
"block.create.diorite_pillar": "UNLOCALIZED: Diorite Pillar",
|
||||
"block.create.diorite_bricks_slab": "Dioritziegelstufe",
|
||||
"block.create.diorite_bricks_stairs": "Dioritziegeltreppe",
|
||||
"block.create.diorite_bricks_wall": "Dioritziegelmauer",
|
||||
"block.create.diorite_cobblestone": "Dioritbruchstein",
|
||||
"block.create.diorite_cobblestone_slab": "Dioritbruchsteinstufe",
|
||||
"block.create.diorite_cobblestone_stairs": "Dioritbruchsteintreppe",
|
||||
"block.create.diorite_cobblestone_wall": "Dioritbruchsteinmauer",
|
||||
"block.create.diorite_pillar": "Dioritsäule",
|
||||
"block.create.dolomite": "Dolomit",
|
||||
"block.create.dolomite_bricks": "Dolomitziegel",
|
||||
"block.create.dolomite_bricks_slab": "Dolomitziegelstufe",
|
||||
"block.create.dolomite_bricks_stairs": "Dolomitziegeltreppe",
|
||||
"block.create.dolomite_bricks_wall": "Dolomitziegelmauer",
|
||||
"block.create.dolomite_cobblestone": "UNLOCALIZED: Dolomite Cobblestone",
|
||||
"block.create.dolomite_cobblestone_slab": "UNLOCALIZED: Dolomite Cobblestone Slab",
|
||||
"block.create.dolomite_cobblestone_stairs": "UNLOCALIZED: Dolomite Cobblestone Stairs",
|
||||
"block.create.dolomite_cobblestone_wall": "UNLOCALIZED: Dolomite Cobblestone Wall",
|
||||
"block.create.dolomite_cobblestone": "Dolomitbruchstein",
|
||||
"block.create.dolomite_cobblestone_slab": "Dolomitbruchsteinstufe",
|
||||
"block.create.dolomite_cobblestone_stairs": "Dolomitbruchsteintreppe",
|
||||
"block.create.dolomite_cobblestone_wall": "Dolomitbruchsteinmauer",
|
||||
"block.create.dolomite_pillar": "Dolomitsäule",
|
||||
"block.create.encased_chain_drive": "UNLOCALIZED: Encased Chain Drive",
|
||||
"block.create.encased_fan": "Eingeschlossener Propeller",
|
||||
"block.create.encased_fluid_pipe": "UNLOCALIZED: Encased Fluid Pipe",
|
||||
"block.create.fancy_andesite_bricks": "UNLOCALIZED: Fancy Andesite Bricks",
|
||||
"block.create.fancy_andesite_bricks_slab": "UNLOCALIZED: Fancy Andesite Bricks Slab",
|
||||
"block.create.fancy_andesite_bricks_stairs": "UNLOCALIZED: Fancy Andesite Bricks Stairs",
|
||||
"block.create.fancy_andesite_bricks_wall": "UNLOCALIZED: Fancy Andesite Bricks Wall",
|
||||
"block.create.fancy_dark_scoria_bricks": "UNLOCALIZED: Fancy Dark Scoria Bricks",
|
||||
"block.create.fancy_dark_scoria_bricks_slab": "UNLOCALIZED: Fancy Dark Scoria Bricks Slab",
|
||||
"block.create.fancy_dark_scoria_bricks_stairs": "UNLOCALIZED: Fancy Dark Scoria Bricks Stairs",
|
||||
"block.create.fancy_dark_scoria_bricks_wall": "UNLOCALIZED: Fancy Dark Scoria Bricks Wall",
|
||||
"block.create.encased_chain_drive": "Ummantelter Kettenriemen",
|
||||
"block.create.encased_fan": "Ummantelter Lüfter",
|
||||
"block.create.encased_fluid_pipe": "Ummanteltes Rohr",
|
||||
"block.create.fancy_andesite_bricks": "Schicke Andesitziegel",
|
||||
"block.create.fancy_andesite_bricks_slab": "Schicke Andesitziegelstufe",
|
||||
"block.create.fancy_andesite_bricks_stairs": "Schicke Andesitziegeltreppe",
|
||||
"block.create.fancy_andesite_bricks_wall": "Schicke Andesitziegelmauer",
|
||||
"block.create.fancy_dark_scoria_bricks": "Schicke dunkle Schlackenziegel",
|
||||
"block.create.fancy_dark_scoria_bricks_slab": "Schicke dunkle Schlackenziegelstufe",
|
||||
"block.create.fancy_dark_scoria_bricks_stairs": "Schicke dunkle Schlackenziegeltreppe",
|
||||
"block.create.fancy_dark_scoria_bricks_wall": "Schicke dunkle Schlackenziegelmauer",
|
||||
"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_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_stairs": "UNLOCALIZED: Fancy Weathered Limestone Bricks Stairs",
|
||||
"block.create.fancy_weathered_limestone_bricks_wall": "UNLOCALIZED: Fancy Weathered Limestone Bricks Wall",
|
||||
"block.create.fluid_pipe": "UNLOCALIZED: Fluid Pipe",
|
||||
"block.create.fluid_tank": "UNLOCALIZED: Fluid Tank",
|
||||
"block.create.fluid_valve": "UNLOCALIZED: Fluid Valve",
|
||||
"block.create.flywheel": "UNLOCALIZED: Flywheel",
|
||||
"block.create.framed_glass": "UNLOCALIZED: Framed Glass",
|
||||
"block.create.framed_glass_pane": "UNLOCALIZED: Framed Glass Pane",
|
||||
"block.create.fluid_pipe": "Wasserrohr",
|
||||
"block.create.fluid_tank": "Wassertank",
|
||||
"block.create.fluid_valve": "Flüssigkeitsventil",
|
||||
"block.create.flywheel": "Schwungrad",
|
||||
"block.create.framed_glass": "Gerahmtes Glas",
|
||||
"block.create.framed_glass_pane": "Gerahmte Glasscheibe",
|
||||
"block.create.furnace_engine": "UNLOCALIZED: Furnace Engine",
|
||||
"block.create.gabbro": "Gabbro",
|
||||
"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_wall": "Gabbroziegelmauer",
|
||||
"block.create.gabbro_cobblestone": "UNLOCALIZED: Gabbro Cobblestone",
|
||||
|
@ -162,9 +162,11 @@
|
|||
"block.create.gabbro_cobblestone_stairs": "UNLOCALIZED: Gabbro Cobblestone Stairs",
|
||||
"block.create.gabbro_cobblestone_wall": "UNLOCALIZED: Gabbro Cobblestone Wall",
|
||||
"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.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_slab": "UNLOCALIZED: Granite Bricks Slab",
|
||||
"block.create.granite_bricks_stairs": "UNLOCALIZED: Granite Bricks Stairs",
|
||||
|
@ -405,6 +407,7 @@
|
|||
"block.create.zinc_ore": "UNLOCALIZED: Zinc Ore",
|
||||
|
||||
"entity.create.contraption": "UNLOCALIZED: Contraption",
|
||||
"entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption",
|
||||
"entity.create.seat": "UNLOCALIZED: Seat",
|
||||
"entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption",
|
||||
"entity.create.super_glue": "UNLOCALIZED: Super Glue",
|
||||
|
@ -480,25 +483,25 @@
|
|||
"item.create.wand_of_symmetry": "Symmetriestab",
|
||||
"item.create.wheat_flour": "UNLOCALIZED: Wheat Flour",
|
||||
"item.create.whisk": "UNLOCALIZED: Whisk",
|
||||
"item.create.wrench": "UNLOCALIZED: Wrench",
|
||||
"item.create.zinc_ingot": "UNLOCALIZED: Zinc Ingot",
|
||||
"item.create.zinc_nugget": "UNLOCALIZED: Zinc Nugget",
|
||||
"item.create.wrench": "Schraubenschlüssel",
|
||||
"item.create.zinc_ingot": "Zinkbarren",
|
||||
"item.create.zinc_nugget": "Zinkklumpen",
|
||||
|
||||
|
||||
"_": "->------------------------] Advancements [------------------------<-",
|
||||
|
||||
"advancement.create.root": "UNLOCALIZED: Welcome to Create",
|
||||
"advancement.create.root.desc": "UNLOCALIZED: It's time to start building some amazing Contraptions!",
|
||||
"advancement.create.andesite_alloy": "UNLOCALIZED: Alliterations Aplenty",
|
||||
"advancement.create.andesite_alloy.desc": "UNLOCALIZED: Create's materials have weird names, Andesite Alloy is one of them.",
|
||||
"advancement.create.its_alive": "UNLOCALIZED: It's Alive!",
|
||||
"advancement.create.its_alive.desc": "UNLOCALIZED: Watch your first kinetic component spin.",
|
||||
"advancement.create.shifting_gears": "UNLOCALIZED: Shifting Gears",
|
||||
"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.overstressed": "UNLOCALIZED: Overstressed",
|
||||
"advancement.create.overstressed.desc": "UNLOCALIZED: Experience the limits of stress firsthand.",
|
||||
"advancement.create.belt": "UNLOCALIZED: Kelp Drive",
|
||||
"advancement.create.belt.desc": "UNLOCALIZED: Connect two shafts with a Mechanical Belt.",
|
||||
"advancement.create.root": "Willkommen zu Create",
|
||||
"advancement.create.root.desc": "Es ist Zeit mit dem Bauen von tollen Apparaten zu starten!",
|
||||
"advancement.create.andesite_alloy": "Alliterationen in Massen",
|
||||
"advancement.create.andesite_alloy.desc": "Create's Materialien haben verrückte Namen, Eisenlegierung ist im Deutschen leider keine.",
|
||||
"advancement.create.its_alive": "Es ist am leben!",
|
||||
"advancement.create.its_alive.desc": "Gucke deinem erstem beweglichen Teil beim drehen zu.",
|
||||
"advancement.create.shifting_gears": "Wechsel deine Gänge",
|
||||
"advancement.create.shifting_gears.desc": "Verbinde ein großes Zahnrad mit einem kleinem, um die Geschwindigkeit deiner Apparate zu verändern.",
|
||||
"advancement.create.overstressed": "Überfordert",
|
||||
"advancement.create.overstressed.desc": "Erfahre die Limits der Belastung aus erster Hand.",
|
||||
"advancement.create.belt": "Befördere es alles",
|
||||
"advancement.create.belt.desc": "Verbinde zwei Wllen mit einem Mechanischem Riemen",
|
||||
"advancement.create.tunnel": "UNLOCALIZED: Take cover!",
|
||||
"advancement.create.tunnel.desc": "UNLOCALIZED: Embellish your mechanical belt with a Tunnel.",
|
||||
"advancement.create.splitter_tunnel": "UNLOCALIZED: Divide and Conquer",
|
||||
|
|
1792
src/generated/resources/assets/create/lang/unfinished/es_mx.json
Normal file
1792
src/generated/resources/assets/create/lang/unfinished/es_mx.json
Normal file
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 52",
|
||||
"_": "Missing Localizations: 55",
|
||||
|
||||
"_": "->------------------------] Game Elements [------------------------<-",
|
||||
|
||||
|
@ -162,6 +162,8 @@
|
|||
"block.create.gabbro_cobblestone_stairs": "반려암 조약돌 계단",
|
||||
"block.create.gabbro_cobblestone_wall": "반려암 조약돌 담장",
|
||||
"block.create.gabbro_pillar": "반려암 기둥",
|
||||
"block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion",
|
||||
"block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft",
|
||||
"block.create.gearbox": "기어박스",
|
||||
"block.create.gearshift": "기어쉬프트",
|
||||
"block.create.glass_fluid_pipe": "액체 파이프",
|
||||
|
@ -405,6 +407,7 @@
|
|||
"block.create.zinc_ore": "아연 광석",
|
||||
|
||||
"entity.create.contraption": "장치",
|
||||
"entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption",
|
||||
"entity.create.seat": "좌석",
|
||||
"entity.create.stationary_contraption": "고정된 장치",
|
||||
"entity.create.super_glue": "강력 접착제",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 1152",
|
||||
"_": "Missing Localizations: 1155",
|
||||
|
||||
"_": "->------------------------] Game Elements [------------------------<-",
|
||||
|
||||
|
@ -162,6 +162,8 @@
|
|||
"block.create.gabbro_cobblestone_stairs": "UNLOCALIZED: Gabbro Cobblestone Stairs",
|
||||
"block.create.gabbro_cobblestone_wall": "UNLOCALIZED: Gabbro Cobblestone Wall",
|
||||
"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.gearshift": "Versnellingspook",
|
||||
"block.create.glass_fluid_pipe": "UNLOCALIZED: Glass Fluid Pipe",
|
||||
|
@ -405,6 +407,7 @@
|
|||
"block.create.zinc_ore": "UNLOCALIZED: Zinc Ore",
|
||||
|
||||
"entity.create.contraption": "UNLOCALIZED: Contraption",
|
||||
"entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption",
|
||||
"entity.create.seat": "UNLOCALIZED: Seat",
|
||||
"entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption",
|
||||
"entity.create.super_glue": "UNLOCALIZED: Super Glue",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 1218",
|
||||
"_": "Missing Localizations: 1221",
|
||||
|
||||
"_": "->------------------------] Game Elements [------------------------<-",
|
||||
|
||||
|
@ -162,6 +162,8 @@
|
|||
"block.create.gabbro_cobblestone_stairs": "UNLOCALIZED: Gabbro Cobblestone Stairs",
|
||||
"block.create.gabbro_cobblestone_wall": "UNLOCALIZED: Gabbro Cobblestone Wall",
|
||||
"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.gearshift": "Câmbio",
|
||||
"block.create.glass_fluid_pipe": "UNLOCALIZED: Glass Fluid Pipe",
|
||||
|
@ -405,6 +407,7 @@
|
|||
"block.create.zinc_ore": "UNLOCALIZED: Zinc Ore",
|
||||
|
||||
"entity.create.contraption": "UNLOCALIZED: Contraption",
|
||||
"entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption",
|
||||
"entity.create.seat": "UNLOCALIZED: Seat",
|
||||
"entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption",
|
||||
"entity.create.super_glue": "UNLOCALIZED: Super Glue",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"_": "Missing Localizations: 2",
|
||||
"_": "Missing Localizations: 5",
|
||||
|
||||
"_": "->------------------------] Game Elements [------------------------<-",
|
||||
|
||||
|
@ -20,7 +20,7 @@
|
|||
"block.create.andesite_cobblestone_slab": "Андезит-булыжниковая плита",
|
||||
"block.create.andesite_cobblestone_stairs": "Андезит-булыжниковые ступени",
|
||||
"block.create.andesite_cobblestone_wall": "Андезит-булыжниковая стена",
|
||||
"block.create.andesite_encased_shaft": "Андезитовый вал в кожухе",
|
||||
"block.create.andesite_encased_shaft": "Вал в андезитовом корпусе",
|
||||
"block.create.andesite_funnel": "Андезитовая воронка",
|
||||
"block.create.andesite_pillar": "Андезитовая колонна",
|
||||
"block.create.andesite_tunnel": "Андезитовый туннель",
|
||||
|
@ -30,20 +30,20 @@
|
|||
"block.create.birch_window_pane": "Панель берёзового окна",
|
||||
"block.create.black_sail": "Чёрный парус",
|
||||
"block.create.black_seat": "Чёрное сиденье",
|
||||
"block.create.black_valve_handle": "Чёрная ручка крана",
|
||||
"block.create.black_valve_handle": "Чёрный ручной вентиль",
|
||||
"block.create.blaze_burner": "Горелка Всполоха",
|
||||
"block.create.blue_sail": "Синий парус",
|
||||
"block.create.blue_seat": "Синее сиденье",
|
||||
"block.create.blue_valve_handle": "Синяя ручка крана",
|
||||
"block.create.blue_valve_handle": "Синий ручной вентиль",
|
||||
"block.create.brass_belt_funnel": "Латунная конвейерная воронка",
|
||||
"block.create.brass_block": "Латунный блок",
|
||||
"block.create.brass_casing": "Латунный корпус",
|
||||
"block.create.brass_encased_shaft": "Латунный вал в кожухе",
|
||||
"block.create.brass_encased_shaft": "Вал в латунном корпусе",
|
||||
"block.create.brass_funnel": "Латунная воронка",
|
||||
"block.create.brass_tunnel": "Латунный туннель",
|
||||
"block.create.brown_sail": "Коричневый парус",
|
||||
"block.create.brown_seat": "Коричневое сиденье",
|
||||
"block.create.brown_valve_handle": "Коричневая ручка крана",
|
||||
"block.create.brown_valve_handle": "Коричневый ручной вентиль",
|
||||
"block.create.cart_assembler": "Сборщик вагонеток",
|
||||
"block.create.chiseled_dark_scoria": "Резной тёмный пепел",
|
||||
"block.create.chiseled_dolomite": "Резной доломит",
|
||||
|
@ -63,20 +63,20 @@
|
|||
"block.create.copper_ore": "Медная руда",
|
||||
"block.create.copper_shingles": "Медная черепица",
|
||||
"block.create.copper_tiles": "Медная плитка",
|
||||
"block.create.copper_valve_handle": "Медная ручка крана",
|
||||
"block.create.copper_valve_handle": "Медный ручной вентиль",
|
||||
"block.create.creative_crate": "Творческий ящик",
|
||||
"block.create.creative_fluid_tank": "Творческиф жидкостный бак",
|
||||
"block.create.creative_fluid_tank": "Творческий жидкостный бак",
|
||||
"block.create.creative_motor": "Творческий мотор",
|
||||
"block.create.crushing_wheel": "Колесо дробления",
|
||||
"block.create.crushing_wheel_controller": "Контроллер колеса дробления",
|
||||
"block.create.cuckoo_clock": "Часы с кукушкой",
|
||||
"block.create.cyan_sail": "Бирюзовый парус",
|
||||
"block.create.cyan_seat": "Бирюзовое сииденье",
|
||||
"block.create.cyan_valve_handle": "Бирюзовая ручка крана",
|
||||
"block.create.cyan_valve_handle": "Бирюзовый ручной вентиль",
|
||||
"block.create.dark_oak_window": "Окно из тёмного дуба",
|
||||
"block.create.dark_oak_window_pane": "Панель из окна из тёмного дуб",
|
||||
"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_stairs": "Ступени из тёмного пепельного кирпича",
|
||||
"block.create.dark_scoria_bricks_wall": "Стена из тёмного пепельного кирпича",
|
||||
|
@ -106,9 +106,9 @@
|
|||
"block.create.dolomite_cobblestone_stairs": "Ступени доломит-булыжника",
|
||||
"block.create.dolomite_cobblestone_wall": "Стена доломит-булыжника",
|
||||
"block.create.dolomite_pillar": "Доломитовая колонна",
|
||||
"block.create.encased_chain_drive": "Цепной привод в кожухе",
|
||||
"block.create.encased_fan": "Вентилятор в кожухе",
|
||||
"block.create.encased_fluid_pipe": "Жидкостная труба в кожухе",
|
||||
"block.create.encased_chain_drive": "Цепной привод в корпусе",
|
||||
"block.create.encased_fan": "Вентилятор в корпусе",
|
||||
"block.create.encased_fluid_pipe": "Жидкостная труба в корпусе",
|
||||
"block.create.fancy_andesite_bricks": "Красивый андезитовый кирпич",
|
||||
"block.create.fancy_andesite_bricks_slab": "Плита из красивого андезитового кирпича",
|
||||
"block.create.fancy_andesite_bricks_stairs": "Ступени из красивого андезитового кирпича",
|
||||
|
@ -147,7 +147,7 @@
|
|||
"block.create.fancy_weathered_limestone_bricks_wall": "Стена из красивого выветренного известнякового кирпича",
|
||||
"block.create.fluid_pipe": "Жидкостная труба",
|
||||
"block.create.fluid_tank": "Жидкостный бак",
|
||||
"block.create.fluid_valve": "Жидкостный вентиль",
|
||||
"block.create.fluid_valve": "Жидкостный клапан",
|
||||
"block.create.flywheel": "Маховик",
|
||||
"block.create.framed_glass": "Обрамлённое стекло",
|
||||
"block.create.framed_glass_pane": "Обрамлённая стеклянная панель",
|
||||
|
@ -162,6 +162,8 @@
|
|||
"block.create.gabbro_cobblestone_stairs": "Ступени из габбро-булыжника",
|
||||
"block.create.gabbro_cobblestone_wall": "Стена из габбро-булыжника",
|
||||
"block.create.gabbro_pillar": "Габбро колонна",
|
||||
"block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion",
|
||||
"block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft",
|
||||
"block.create.gearbox": "Коробка передач",
|
||||
"block.create.gearshift": "Реверсивный механизм",
|
||||
"block.create.glass_fluid_pipe": "Стеклянная жидкостная труба",
|
||||
|
@ -176,15 +178,15 @@
|
|||
"block.create.granite_pillar": "Гранитная колонна",
|
||||
"block.create.gray_sail": "Серый парус",
|
||||
"block.create.gray_seat": "Серое сиденье",
|
||||
"block.create.gray_valve_handle": "Серная ручка крана",
|
||||
"block.create.gray_valve_handle": "Серый ручной вентиль",
|
||||
"block.create.green_sail": "Зелёный парус",
|
||||
"block.create.green_seat": "Зелёное сиденье",
|
||||
"block.create.green_valve_handle": "Зелёная ручка крана",
|
||||
"block.create.green_valve_handle": "Зелёный ручной вентиль",
|
||||
"block.create.hand_crank": "Рукоятка",
|
||||
"block.create.honey": "Мёд",
|
||||
"block.create.horizontal_framed_glass": "Горизонтальное обрамлённое стекло",
|
||||
"block.create.horizontal_framed_glass_pane": "Горизонтальная обрамлённая стеклянная панель",
|
||||
"block.create.hose_pulley": "Шкив для шланга",
|
||||
"block.create.hose_pulley": "Шкив с шлангом",
|
||||
"block.create.item_drain": "Предметный осушитель",
|
||||
"block.create.jungle_window": "Окно из тропического дерева",
|
||||
"block.create.jungle_window_pane": "Панель окна из тропического дерева",
|
||||
|
@ -200,13 +202,13 @@
|
|||
"block.create.layered_weathered_limestone": "Слоистый выветренный известняк",
|
||||
"block.create.light_blue_sail": "Голубой парус",
|
||||
"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_seat": "Светло-серое сиденье",
|
||||
"block.create.light_gray_valve_handle": "Светло-серая ручка крана",
|
||||
"block.create.light_gray_valve_handle": "Светло-серый ручной вентиль",
|
||||
"block.create.lime_sail": "Лаймовый парус",
|
||||
"block.create.lime_seat": "Лаймовое сиденье",
|
||||
"block.create.lime_valve_handle": "Лаймовая ручка крана",
|
||||
"block.create.lime_valve_handle": "Лаймовый ручной вентиль",
|
||||
"block.create.limesand": "Известковый песок",
|
||||
"block.create.limestone": "Известняк",
|
||||
"block.create.limestone_bricks": "Известняковый кирпич",
|
||||
|
@ -222,7 +224,7 @@
|
|||
"block.create.lit_blaze_burner": "Зажжёная горелка Всполоха",
|
||||
"block.create.magenta_sail": "Пурпурный парус",
|
||||
"block.create.magenta_seat": "Пурпурное сиденье",
|
||||
"block.create.magenta_valve_handle": "Пурпурная ручка крана",
|
||||
"block.create.magenta_valve_handle": "Пурпурный ручной вентиль",
|
||||
"block.create.mechanical_arm": "Механическая рука",
|
||||
"block.create.mechanical_bearing": "Механический вращатель",
|
||||
"block.create.mechanical_crafter": "Механический крафтер",
|
||||
|
@ -235,7 +237,7 @@
|
|||
"block.create.mechanical_press": "Механический пресс",
|
||||
"block.create.mechanical_pump": "Механическая помпа",
|
||||
"block.create.mechanical_saw": "Механическая пила",
|
||||
"block.create.metal_bracket": "Металлический кронштейн",
|
||||
"block.create.metal_bracket": "Металлическая скоба",
|
||||
"block.create.millstone": "Жернов",
|
||||
"block.create.minecart_anchor": "Вагонеточный якорь",
|
||||
"block.create.mossy_andesite": "Замшелый андезит",
|
||||
|
@ -255,7 +257,7 @@
|
|||
"block.create.oak_window_pane": "Панель из дубового окна",
|
||||
"block.create.orange_sail": "Оранжевый парус",
|
||||
"block.create.orange_seat": "Оранжевое сиденье",
|
||||
"block.create.orange_valve_handle": "Оранжевая ручка крана",
|
||||
"block.create.orange_valve_handle": "Оранжевый ручной вентиль",
|
||||
"block.create.ornate_iron_window": "Украшенное железное окно",
|
||||
"block.create.ornate_iron_window_pane": "Панель из украшенного железного окна",
|
||||
"block.create.overgrown_andesite": "Заросший андезит",
|
||||
|
@ -305,7 +307,7 @@
|
|||
"block.create.paved_weathered_limestone_wall": "Стена из мощёного выветренного известняка",
|
||||
"block.create.pink_sail": "Розовый парус",
|
||||
"block.create.pink_seat": "Розовое сиденье",
|
||||
"block.create.pink_valve_handle": "Розовая ручка крана",
|
||||
"block.create.pink_valve_handle": "Розовый ручной вентиль",
|
||||
"block.create.piston_extension_pole": "Удлинитель поршня",
|
||||
"block.create.polished_dark_scoria": "Полированный тёмный пепел",
|
||||
"block.create.polished_dark_scoria_slab": "Плита из полированного тёмного пепла",
|
||||
|
@ -335,15 +337,15 @@
|
|||
"block.create.portable_storage_interface": "Портативный интерфейс хранения",
|
||||
"block.create.powered_latch": "Механизированная защёлка",
|
||||
"block.create.powered_toggle_latch": "Механизированная рычаг-защёлка",
|
||||
"block.create.pulley_magnet": "Шкивный магнит",
|
||||
"block.create.pulley_magnet": "Магнитный шкив",
|
||||
"block.create.pulse_repeater": "Импульсный повторитель",
|
||||
"block.create.purple_sail": "Фиолетовый парус",
|
||||
"block.create.purple_seat": "Фиолетовое сиденье",
|
||||
"block.create.purple_valve_handle": "Фиолетовая ручка крана",
|
||||
"block.create.purple_valve_handle": "Фиолетовый ручной вентиль",
|
||||
"block.create.radial_chassis": "Радиальное шасси",
|
||||
"block.create.red_sail": "Красный парус",
|
||||
"block.create.red_seat": "Красное сиденье",
|
||||
"block.create.red_valve_handle": "Красная ручка крана",
|
||||
"block.create.red_valve_handle": "Красный ручной вентиль",
|
||||
"block.create.redstone_contact": "Контакт сигнала красного камня",
|
||||
"block.create.redstone_link": "Беспроводной передатчик сигнала красного камня",
|
||||
"block.create.refined_radiance_casing": "Сияющий корпус",
|
||||
|
@ -366,12 +368,12 @@
|
|||
"block.create.scoria_pillar": "Колонна из пепла",
|
||||
"block.create.secondary_linear_chassis": "Вторичное линейное шасси",
|
||||
"block.create.sequenced_gearshift": "Последовательный переключатель передач",
|
||||
"block.create.shadow_steel_casing": "Теневой кожух",
|
||||
"block.create.shadow_steel_casing": "Теневой корпус",
|
||||
"block.create.shaft": "Вал",
|
||||
"block.create.smart_chute": "UNLOCALIZED: Smart Chute",
|
||||
"block.create.smart_fluid_pipe": "Умная жидкостная труба",
|
||||
"block.create.speedometer": "Спидометр",
|
||||
"block.create.spout": "Слив",
|
||||
"block.create.spout": "Дозатор",
|
||||
"block.create.spruce_window": "Еловое окно",
|
||||
"block.create.spruce_window_pane": "Панель из елового окна",
|
||||
"block.create.sticky_mechanical_piston": "Липкий механический поршень",
|
||||
|
@ -395,17 +397,18 @@
|
|||
"block.create.weathered_limestone_pillar": "Колонна из выветренного известняка",
|
||||
"block.create.white_sail": "Белый парус",
|
||||
"block.create.white_seat": "Белое сиденье",
|
||||
"block.create.white_valve_handle": "Белая ручка крана",
|
||||
"block.create.white_valve_handle": "Белый ручной вентиль",
|
||||
"block.create.windmill_bearing": "Подшипник ветряной мельницы",
|
||||
"block.create.wooden_bracket": "Деревянный кронштейн",
|
||||
"block.create.wooden_bracket": "Деревянная скоба",
|
||||
"block.create.yellow_sail": "Жёлтый парус",
|
||||
"block.create.yellow_seat": "Жёлтое сиденье",
|
||||
"block.create.yellow_valve_handle": "Жёлтая ручка крана",
|
||||
"block.create.yellow_valve_handle": "Жёлтый ручной вентиль",
|
||||
"block.create.zinc_block": "Цинковый блок",
|
||||
"block.create.zinc_ore": "Цинковая руда",
|
||||
|
||||
"entity.create.contraption": "Штуковина",
|
||||
"entity.create.seat": "сиденье",
|
||||
"entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption",
|
||||
"entity.create.seat": "Сиденье",
|
||||
"entity.create.stationary_contraption": "Стационарная штуковина",
|
||||
"entity.create.super_glue": "Супер-клей",
|
||||
|
||||
|
@ -427,25 +430,25 @@
|
|||
"item.create.chest_minecart_contraption": "Сундуко-вагонеточная штуковина",
|
||||
"item.create.chocolate_bucket": "Ведро шоколада",
|
||||
"item.create.chromatic_compound": "Хроматический компаунд",
|
||||
"item.create.cinder_flour": "Пепельная мука",
|
||||
"item.create.cinder_flour": "Незераковая пыль",
|
||||
"item.create.copper_ingot": "Медный слиток",
|
||||
"item.create.copper_nugget": "Кусочек меди",
|
||||
"item.create.copper_sheet": "Медный лист",
|
||||
"item.create.crafter_slot_cover": "Крышка на слот крафтера",
|
||||
"item.create.crushed_aluminum_ore": "Измельчённая алюминиевая руда",
|
||||
"item.create.crushed_brass": "Дробленая латунь",
|
||||
"item.create.crushed_copper_ore": "Измельчённая медная руда",
|
||||
"item.create.crushed_gold_ore": "Измельчённая золотая руда",
|
||||
"item.create.crushed_iron_ore": "Измельчённая железная руда",
|
||||
"item.create.crushed_lead_ore": "Измельчённая свинцовая руда",
|
||||
"item.create.crushed_nickel_ore": "Измельчённая никелевая руда",
|
||||
"item.create.crushed_osmium_ore": "Измельчённая осмиевая руда",
|
||||
"item.create.crushed_platinum_ore": "Измельчённая платиновая руда",
|
||||
"item.create.crushed_quicksilver_ore": "Измельчённая ртутная руда",
|
||||
"item.create.crushed_silver_ore": "Измельчённая серебрянная руда",
|
||||
"item.create.crushed_tin_ore": "Измельчённая оловянная руда",
|
||||
"item.create.crushed_uranium_ore": "Измельчённая урановая руда",
|
||||
"item.create.crushed_zinc_ore": "Измельчённая цинковая руда",
|
||||
"item.create.crushed_brass": "Дроблёная латунь",
|
||||
"item.create.crushed_copper_ore": "Дроблёная медная руда",
|
||||
"item.create.crushed_gold_ore": "Дроблёная золотая руда",
|
||||
"item.create.crushed_iron_ore": "Дроблёная железная руда",
|
||||
"item.create.crushed_lead_ore": "Дроблёная свинцовая руда",
|
||||
"item.create.crushed_nickel_ore": "Дроблёная никелевая руда",
|
||||
"item.create.crushed_osmium_ore": "Дроблёная осмиевая руда",
|
||||
"item.create.crushed_platinum_ore": "Дроблёная платиновая руда",
|
||||
"item.create.crushed_quicksilver_ore": "Дроблёная ртутная руда",
|
||||
"item.create.crushed_silver_ore": "Дроблёная серебрянная руда",
|
||||
"item.create.crushed_tin_ore": "Дроблёная оловянная руда",
|
||||
"item.create.crushed_uranium_ore": "Дроблёная урановая руда",
|
||||
"item.create.crushed_zinc_ore": "Дроблёная цинковая руда",
|
||||
"item.create.deforester": "Уничтожитель леса",
|
||||
"item.create.dough": "Тесто",
|
||||
"item.create.electron_tube": "Электронная лампа",
|
||||
|
@ -500,15 +503,15 @@
|
|||
"advancement.create.belt": "Передайте за проезд!",
|
||||
"advancement.create.belt.desc": "Соедините два вала с помощью механического ремня.",
|
||||
"advancement.create.tunnel": "В укрытие!",
|
||||
"advancement.create.tunnel.desc": "Украсьте свой механический ремень Туннелем.",
|
||||
"advancement.create.tunnel.desc": "Украсьте свой конвейер туннелем.",
|
||||
"advancement.create.splitter_tunnel": "Разделяй и властвуй",
|
||||
"advancement.create.splitter_tunnel.desc": "Создайте разделитель из группы латунных туннелей..",
|
||||
"advancement.create.splitter_tunnel.desc": "Создайте разделитель из группы латунных туннелей.",
|
||||
"advancement.create.chute": "Упало",
|
||||
"advancement.create.chute.desc": "Разместите желоб, вертикальный аналог ремня.",
|
||||
"advancement.create.chute.desc": "Разместите желоб, вертикальный аналог конвейера.",
|
||||
"advancement.create.upward_chute": "Воздушное похищение",
|
||||
"advancement.create.upward_chute.desc": "Посмотрите как предмет засасывается в желоб с вентилятором.",
|
||||
"advancement.create.belt_funnel": "Болтающиеся воронки",
|
||||
"advancement.create.belt_funnel.desc": "Поместите воронку боком, сверху ремня или депо, чтобы создать её специальный тип.",
|
||||
"advancement.create.belt_funnel.desc": "Поместите воронку боком, сверху конвейера или депо, чтобы создать её специальный тип.",
|
||||
"advancement.create.belt_funnel_kiss": "Механический ужин",
|
||||
"advancement.create.belt_funnel_kiss.desc": "Заставте две смонтированные на ремнях воронки поцеловаться.",
|
||||
"advancement.create.fan": "Механический маг воздуха",
|
||||
|
@ -528,9 +531,9 @@
|
|||
"advancement.create.stressometer": "Так сильно?",
|
||||
"advancement.create.stressometer.desc": "Поставьте и подключите динамометр. Посмотрите на динамометр через очки, чтобы прочитать точное значение.",
|
||||
"advancement.create.aesthetics": "Бах! Эстетично!",
|
||||
"advancement.create.aesthetics.desc": "Разместите кронштейн на валу, трубе или шестерне.",
|
||||
"advancement.create.aesthetics.desc": "Разместите скобы на валу, трубе или шестерне.",
|
||||
"advancement.create.reinforced": "Бах! Усилено!",
|
||||
"advancement.create.reinforced.desc": "Разместите подходящий блок корпуса на вал, трубу и механический ремень.",
|
||||
"advancement.create.reinforced.desc": "Разместите подходящий блок корпуса на вал, трубу и конвейер.",
|
||||
"advancement.create.water_wheel": "Гидравлика",
|
||||
"advancement.create.water_wheel.desc": "Поставьте водяное колесо и попытайтесь заставить его вращаться!",
|
||||
"advancement.create.chocolate_wheel": "Вкусная сила",
|
||||
|
@ -566,15 +569,15 @@
|
|||
"advancement.create.compact": "Автоматическое уплотнение",
|
||||
"advancement.create.compact.desc": "Используйте пресс и чашу для уплотнения некоторых предметов.",
|
||||
"advancement.create.brass": "Действительный сплав",
|
||||
"advancement.create.brass.desc": "Используйте измельчённую медь и измельчённый цинк, чтобы создать немного латуни.",
|
||||
"advancement.create.brass.desc": "Используйте дроблёную медь и дроблёный цинк, чтобы создать немного латуни.",
|
||||
"advancement.create.brass_casing": "Бронзовый век",
|
||||
"advancement.create.brass_casing.desc": "Используйте только что полученную латунь и немного дерева, чтобы создать более продвинутый корпус.",
|
||||
"advancement.create.copper_casing": "Медный век",
|
||||
"advancement.create.copper_casing.desc": "Используйте несколько медных листов для создания медного корпуса.",
|
||||
"advancement.create.spout": "Буль",
|
||||
"advancement.create.spout.desc": "Посмотрите как предмет наполняется с помощью Слива.",
|
||||
"advancement.create.spout.desc": "Посмотрите как предмет наполняется с помощью Дозатора.",
|
||||
"advancement.create.spout_potion": "Основательная пивоварня",
|
||||
"advancement.create.spout_potion.desc": "Посмотрите как Слив наполняет бутылку зельем.",
|
||||
"advancement.create.spout_potion.desc": "Посмотрите как Дозатор наполняет бутылку зельем.",
|
||||
"advancement.create.chocolate": "Сказочный мир",
|
||||
"advancement.create.chocolate.desc": "Получите ведро расплавленного шоколада.",
|
||||
"advancement.create.item_drain": "Осушение",
|
||||
|
@ -666,16 +669,16 @@
|
|||
|
||||
"create.recipe.crushing": "Измельчение",
|
||||
"create.recipe.milling": "Помол",
|
||||
"create.recipe.fan_washing": "Объёмная промывка",
|
||||
"create.recipe.fan_washing": "Массовая промывка",
|
||||
"create.recipe.fan_washing.fan": "Вентилятор за текущей водой",
|
||||
"create.recipe.fan_smoking": "Объёмное копчение",
|
||||
"create.recipe.fan_smoking": "Массовое копчение",
|
||||
"create.recipe.fan_smoking.fan": "Вентилятор за горящим огнём",
|
||||
"create.recipe.fan_blasting": "Объёмное плавление",
|
||||
"create.recipe.fan_blasting": "Массовое плавление",
|
||||
"create.recipe.fan_blasting.fan": "Вентилятор за текущей лавой",
|
||||
"create.recipe.pressing": "Прессование",
|
||||
"create.recipe.mixing": "Смешивание",
|
||||
"create.recipe.automatic_shapeless": "Автоматическая бесформенная сборка",
|
||||
"create.recipe.automatic_brewing": "Автоматической смешивание",
|
||||
"create.recipe.automatic_brewing": "Автоматическое смешивание",
|
||||
"create.recipe.packing": "Прессование",
|
||||
"create.recipe.automatic_packing": "Автоматическая упаковка",
|
||||
"create.recipe.sawing": "Распиливание",
|
||||
|
@ -685,7 +688,7 @@
|
|||
"create.recipe.blockzapper_upgrade": "Ручная блоковая пушка",
|
||||
"create.recipe.sandpaper_polishing": "Полировка наждачной бумагой",
|
||||
"create.recipe.mystery_conversion": "Хроматический метаморфоз",
|
||||
"create.recipe.spout_filling": "Заполнение сливом",
|
||||
"create.recipe.spout_filling": "Заполнение дозатором",
|
||||
"create.recipe.draining": "Осушение предметов",
|
||||
"create.recipe.processing.chance": "%1$s%% шанса",
|
||||
"create.recipe.heat_requirement.none": "Не требует нагрева",
|
||||
|
@ -834,7 +837,7 @@
|
|||
"create.gui.stockpile_switch.invert_signal": "Инвертировать сигнал",
|
||||
"create.gui.stockpile_switch.move_to_lower_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.turn_angle": "Повернуть",
|
||||
"create.gui.sequenced_gearshift.instruction.turn_angle.angle": "Угол",
|
||||
|
@ -989,7 +992,7 @@
|
|||
"create.item_attributes.not_stackable": "не может складываться",
|
||||
"create.item_attributes.not_stackable.inverted": "складывается",
|
||||
"create.item_attributes.equipable": "может быть надет",
|
||||
"create.item_attributes.equipable.inverted": "не ожет быть надет",
|
||||
"create.item_attributes.equipable.inverted": "не может быть надет",
|
||||
"create.item_attributes.furnace_fuel": "является топливом",
|
||||
"create.item_attributes.furnace_fuel.inverted": "не является топливом",
|
||||
"create.item_attributes.in_tag": "помечен %1$s",
|
||||
|
@ -1078,7 +1081,7 @@
|
|||
"create.tooltip.chute.header": "Инвормация о желобе",
|
||||
"create.tooltip.chute.items_move_down": "Предметы двигаются вниз",
|
||||
"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_down": "Вентилятор толкает сверху",
|
||||
"create.tooltip.chute.fans_pull_up": "Вентилятор тянет сверху",
|
||||
|
@ -1100,11 +1103,11 @@
|
|||
|
||||
"create.gui.config.overlay1": "Привет :)",
|
||||
"create.gui.config.overlay2": "Это образец оверлея",
|
||||
"create.gui.config.overlay3": "кликни и тащи с помощью мыши",
|
||||
"create.gui.config.overlay3": "Кликни и тащи с помощью мыши",
|
||||
"create.gui.config.overlay4": "чтобы переместить его",
|
||||
"create.gui.config.overlay5": "Нажми ESC чтобы выйти",
|
||||
"create.gui.config.overlay6": "и сохранить новую позицию",
|
||||
"create.gui.config.overlay7": "Запусти /create overlay reset",
|
||||
"create.gui.config.overlay7": "Введи /create overlay reset",
|
||||
"create.gui.config.overlay8": "чтобы сбросить позицию до стандартной",
|
||||
|
||||
"create.command.killTPSCommand": "killtps",
|
||||
|
@ -1139,10 +1142,10 @@
|
|||
"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.summary": "_Креативный предмет_. Установите кожух на вал, находящийся _в мире_ импользуя _Андезитовый корпус_. Блоки корпуса не будут использованы.",
|
||||
"block.create.andesite_encased_shaft.tooltip.summary": "_Креативный предмет_. Установите корпус на вал, находящийся _в мире_ импользуя _Андезитовый корпус_. Блоки корпуса не будут использованы.",
|
||||
|
||||
"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.summary": "_Украсьте_ ваши _валы, шестерни_ и _трубы_, используя уютное деревянное укрепление.",
|
||||
|
@ -1163,7 +1166,7 @@
|
|||
"block.create.andesite_funnel.tooltip.behaviour3": "Будет _транспортировать_ предметы _вниз_, как воронка без буфера.",
|
||||
|
||||
"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.action1": "_Регулирует оконные ставни_, если на этой стороне туннеля есть окно.",
|
||||
|
||||
|
@ -1179,7 +1182,7 @@
|
|||
"block.create.brass_tunnel.tooltip": "BRASS TUNNEL",
|
||||
"block.create.brass_tunnel.tooltip.summary": "Красивое покрытие для ваших _Механических ремней_! _Латунные туннели_ так же поставляются с фильтрами и возможностью разделения стаков ваших предметов.",
|
||||
"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.behaviour2": "_Латунные тунелли_ поставляюстя с фильтрами, для _входа_ и _выхода_. Если _предмет_ не соответствует _фильтру_, он будет перенаправлен на выход соседнего _туннеля_.",
|
||||
"block.create.brass_tunnel.tooltip.condition3": "Разделение",
|
||||
|
@ -1192,7 +1195,7 @@
|
|||
"block.create.copper_casing.tooltip": "COPPER CASING",
|
||||
"block.create.copper_casing.tooltip.summary": "Прочный машинный корпус для разнообразного использования. Безопасно для украшения.",
|
||||
"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.summary": "_Труба_ в _Медном корпусе_.",
|
||||
|
@ -1210,12 +1213,12 @@
|
|||
"block.create.chute.tooltip": "CHUTE",
|
||||
"block.create.chute.tooltip.summary": "_Собирает_ и транспортирует предметы по вертикали и диагонали. Может как брать так класть предметы в _контейнеры_. Вы так же можете взаиодействовать с желобом, разместив сбоку воронку.",
|
||||
"block.create.chute.tooltip.condition1": "Если соединено с вентилятором",
|
||||
"block.create.chute.tooltip.behaviour1": "Соеденённые с _вентилятором_ желоба могут двигать _предметы_ вверх, и засасывать их с _ремней_ и _депо_.",
|
||||
"block.create.chute.tooltip.behaviour1": "Соеденённые с _вентилятором_ желоба могут двигать _предметы_ вверх, и засасывать их с _конвейера_ и _депо_.",
|
||||
|
||||
"block.create.depot.tooltip": "DEPOT",
|
||||
"block.create.depot.tooltip.summary": "Полезное место куда вы можете класть свои _предметы_. Обеспечивает точку взаимодействия для некоторых машин",
|
||||
"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.summary": "Вкусное угощения для вашей трудяги _Горелки Всполоха_. Зажигает их всех!",
|
||||
|
@ -1247,7 +1250,7 @@
|
|||
"block.create.fluid_tank.tooltip.behaviour1": "Переключает опциональное отображение окна",
|
||||
|
||||
"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.behaviour1": "Всё что _извлекает_ из бака, будет снабжаться _бесконечным запасом_ жидкости. Жидкости _закачивающиеся_ в бак будут _удаляться_.",
|
||||
"block.create.creative_fluid_tank.tooltip.condition2": "Правый клик с гаечным ключом",
|
||||
|
@ -1275,9 +1278,9 @@
|
|||
"block.create.spout.tooltip": "SPOUT",
|
||||
"block.create.spout.tooltip.summary": "Форсунка для пополнения предметов, имеющих возможность хранить жидкость.",
|
||||
"block.create.spout.tooltip.condition1": "Транспортировка жидкости",
|
||||
"block.create.spout.tooltip.behaviour1": "Когда предмет, _с возможностью содержать жидкость_, такой как _ведро_ или _бутылочка_, размещён под сливом, слив будет пытаться заполнить предмет содержащейся в нём _жидкостью_.",
|
||||
"block.create.spout.tooltip.behaviour1": "Когда предмет, _с возможностью содержать жидкость_, такой как _ведро_ или _бутылочка_, размещён под дозатором, дозатор будет пытаться заполнить предмет содержащейся в нём _жидкостью_.",
|
||||
"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.summary": "Депо с решёткой, которое может выкачивать _жидкость_ из ваших _предметов_",
|
||||
|
@ -1287,7 +1290,7 @@
|
|||
"block.create.mechanical_arm.tooltip": "MECHANICAL ARM",
|
||||
"block.create.mechanical_arm.tooltip.summary": "Продвинутуе устройство для перемещения _предметов_.",
|
||||
"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.action1": "Правый клик на _открытом инвентаре_ установит _точку для сбора_, для _механической руки_. Кликните еще раз чтобы установить _точку для размещения_.",
|
||||
"block.create.mechanical_arm.tooltip.control2": "Прокрутка с ключом",
|
||||
|
@ -1408,14 +1411,14 @@
|
|||
"block.create.clutch.tooltip.behaviour1": "_Прекращает_ передачу вращения на другую сторону.",
|
||||
|
||||
"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.behaviour1": "Соединённые блоки будут получать _скорость вращения_ и его _направление_ от этого компонента.",
|
||||
|
||||
"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.behaviour1": "_Без_ сигнала редстоуна присоединённые приводы будут иметь _такую же_ скорость. При получении _сигнала редстоуна_ максимального уровня, соединённые приводы будут вращаться с ровно в два раза меньшей скоростью. Всё, что между этими значениями, будет выдавать скорость от 1 до 2 кратной скорости цепного механизма.",
|
||||
"block.create.adjustable_chain_gearshift.tooltip.behaviour1": "_Без_ сигнала редстоуна присоединённые приводы будут иметь _такую же_ скорость. При получении _сигнала редстоуна_ максимального уровня, соединённые приводы будут вращаться с удвоенной скоростью. Всё, что между минимальным и максимальным значениями, будет выдавать скорость от 1 до 2 кратной скорости цепного механизма.",
|
||||
|
||||
"item.create.belt_connector.tooltip": "BELT CONNECTOR",
|
||||
"item.create.belt_connector.tooltip.summary": "Соединяет _2_ _Вала_ с помощью _механического_ _ремня_._ Соединённые валы будут иметь одинаковые _скорость_ и _направление_ _вращения._ Лента может служить как _конвейер_ для _транспортировки._",
|
||||
|
@ -1493,7 +1496,7 @@
|
|||
"block.create.basin.tooltip": "BASIN",
|
||||
"block.create.basin.tooltip.summary": "Удобный _контейнер_ _для_ _предметов_, используемый при обработке _механическим_ _смешивателем_ и _механическим прессом_. Поддерживает компараторы.",
|
||||
"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.summary": "Блок для нагревания чаши, работающий когда в нём находится прирученый Всполох.",
|
||||
|
@ -1508,7 +1511,7 @@
|
|||
"block.create.mechanical_mixer.tooltip": "MECHANICAL MIXER",
|
||||
"block.create.mechanical_mixer.tooltip.summary": "Кинетический венчик, используемый для смешивания предметов, находящихся под ним. Требуется _постоянная_ _вращательная_ _сила_ и _чаша_, расположенная внизу (с промежутком между ними).",
|
||||
"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.summary": "_Кинетический_ _сборщик_ для автоматизации любого рецепта крафта. _Поместите_ _ингредиенты_ в сетку, _соответственно_ _нужному_ _рецепту_, и расположите их так, чтобы _создать_ _поток_, который _кончается_ на одном из крафтеров.",
|
||||
|
@ -1524,7 +1527,7 @@
|
|||
"block.create.furnace_engine.tooltip": "FURNACE ENGINE",
|
||||
"block.create.furnace_engine.tooltip.summary": "_Мощный_ источник _энергии_ _вращения_, для работы которого требуется _работающая_ _печь.",
|
||||
"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.summary": "Большое металлическое колесо для _удержания_ и _стабилизации_ создаваемой силы с помощью _прикреплённого_ _двигателя_. Маховики _соединяются_ с _двигателями_, если они находятся на расстоянии _1_ _м_ друг от друга и под углом _90°_ друг к другу.",
|
||||
|
@ -1532,7 +1535,7 @@
|
|||
"block.create.flywheel.tooltip.behaviour1": "Обеспечивает вращательную силу для подключенного устройства в зависимости от силы и скорости генератора.",
|
||||
|
||||
"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.behaviour1": "Взаимодействует со стационарными переместителями так, что переместители, обращенные в сторону от интерфейса, вытягивают предметы, а транспортеры, нацеленные на интерфейс, вставляют предметы из прикреплённого инвентаря. Конструкция ненадолго остановится при обмене предметов.",
|
||||
"block.create.portable_storage_interface.tooltip.condition2": "Когда запитан редстоуном",
|
||||
|
@ -1708,7 +1711,7 @@
|
|||
"block.create.deployer.tooltip.behaviour3": "Автоматический активатор будет активирован, если только удерживаемый предмет _совпадает_ с предметом в _фильтре_. Не совпадающие предметы не могут быть помещены; Удерживаемые предметы, соответствующие фильтру, не могут быть извлечены.",
|
||||
|
||||
"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.summary": "Простая схема обрезки длинны проходящего сигнала до _1_ _тика_.",
|
||||
|
@ -1765,7 +1768,7 @@
|
|||
"item.create.shadow_steel.tooltip.summary": "Хроматический материал, _добытый_ _в_ _пустоте_.",
|
||||
|
||||
"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.behaviour1": "_Соединяет_ две вагонетки вместе, пытаясь держать их на _определенной дистанции_ при движении.",
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load diff
1792
src/generated/resources/assets/create/lang/unfinished/zh_tw.json
Normal file
1792
src/generated/resources/assets/create/lang/unfinished/zh_tw.json
Normal file
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"parent": "create:block/gantry_shaft/block_end",
|
||||
"textures": {
|
||||
"2": "create:block/gantry_shaft_flipped"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"parent": "create:block/gantry_shaft/block_end",
|
||||
"textures": {
|
||||
"2": "create:block/gantry_shaft_powered"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"parent": "create:block/gantry_shaft/block_end",
|
||||
"textures": {
|
||||
"2": "create:block/gantry_shaft_powered_flipped"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"parent": "create:block/gantry_shaft/block_middle",
|
||||
"textures": {
|
||||
"2": "create:block/gantry_shaft_flipped"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"parent": "create:block/gantry_shaft/block_middle",
|
||||
"textures": {
|
||||
"2": "create:block/gantry_shaft_powered"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"parent": "create:block/gantry_shaft/block_middle",
|
||||
"textures": {
|
||||
"2": "create:block/gantry_shaft_powered_flipped"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"parent": "create:block/gantry_shaft/block_single",
|
||||
"textures": {
|
||||
"2": "create:block/gantry_shaft_flipped"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"parent": "create:block/gantry_shaft/block_single",
|
||||
"textures": {
|
||||
"2": "create:block/gantry_shaft_powered"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"parent": "create:block/gantry_shaft/block_single",
|
||||
"textures": {
|
||||
"2": "create:block/gantry_shaft_powered_flipped"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"parent": "create:block/gantry_shaft/block_start",
|
||||
"textures": {
|
||||
"2": "create:block/gantry_shaft_flipped"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"parent": "create:block/gantry_shaft/block_start",
|
||||
"textures": {
|
||||
"2": "create:block/gantry_shaft_powered"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"parent": "create:block/gantry_shaft/block_start",
|
||||
"textures": {
|
||||
"2": "create:block/gantry_shaft_powered_flipped"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"parent": "create:block/gantry_pinion/item"
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"parent": "create:block/gantry_shaft/block_single"
|
||||
}
|
|
@ -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"
|
||||
]
|
||||
]
|
||||
}
|
|
@ -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"
|
||||
]
|
||||
]
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"type": "minecraft:block",
|
||||
"pools": [
|
||||
{
|
||||
"rolls": 1,
|
||||
"entries": [
|
||||
{
|
||||
"type": "minecraft:item",
|
||||
"name": "create:gantry_pinion"
|
||||
}
|
||||
],
|
||||
"conditions": [
|
||||
{
|
||||
"condition": "minecraft:survives_explosion"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"type": "minecraft:block",
|
||||
"pools": [
|
||||
{
|
||||
"rolls": 1,
|
||||
"entries": [
|
||||
{
|
||||
"type": "minecraft:item",
|
||||
"name": "create:gantry_shaft"
|
||||
}
|
||||
],
|
||||
"conditions": [
|
||||
{
|
||||
"condition": "minecraft:survives_explosion"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
}
|
|
@ -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
|
||||
}
|
||||
}
|
|
@ -23,6 +23,7 @@
|
|||
"create:redstone_link",
|
||||
"create:analog_lever",
|
||||
"create:adjustable_repeater",
|
||||
"create:adjustable_pulse_repeater"
|
||||
"create:adjustable_pulse_repeater",
|
||||
"#minecraft:signs"
|
||||
]
|
||||
}
|
|
@ -71,6 +71,8 @@ public class AllBlockPartials {
|
|||
CUCKOO_RIGHT_DOOR = get("cuckoo_clock/right_door"), CUCKOO_PIG = get("cuckoo_clock/pig"),
|
||||
CUCKOO_CREEPER = get("cuckoo_clock/creeper"),
|
||||
|
||||
GANTRY_COGS = get("gantry_pinion/wheels"),
|
||||
|
||||
ROPE_COIL = get("rope_pulley/rope_coil"),
|
||||
ROPE_HALF = get("rope_pulley/rope_half"),
|
||||
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"),
|
||||
|
||||
SPEED_CONTROLLER_BRACKET = get("rotation_speed_controller/bracket"),
|
||||
|
||||
COUPLING_ATTACHMENT = getEntity("minecart_coupling/attachment"),
|
||||
COUPLING_RING = getEntity("minecart_coupling/ring"),
|
||||
COUPLING_CONNECTOR = getEntity("minecart_coupling/connector")
|
||||
|
|
|
@ -54,6 +54,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.bea
|
|||
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.LinearChassisBlock;
|
||||
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.LinearChassisBlock.ChassisCTBehaviour;
|
||||
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.RadialChassisBlock;
|
||||
import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionBlock;
|
||||
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.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.BlazeBurnerBlockItem;
|
||||
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.sequencer.SequencedGearshiftBlock;
|
||||
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.tags.BlockTags;
|
||||
import net.minecraft.tags.ItemTags;
|
||||
import net.minecraft.util.Direction.AxisDirection;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraftforge.client.model.generators.ConfiguredModel;
|
||||
import net.minecraftforge.client.model.generators.ModelFile;
|
||||
import net.minecraftforge.common.Tags;
|
||||
import net.minecraftforge.common.ToolType;
|
||||
|
||||
|
@ -686,6 +690,38 @@ public class AllBlocks {
|
|||
.getName() + "/head"))))
|
||||
.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 =
|
||||
REGISTRATE.block("windmill_bearing", WindmillBearingBlock::new)
|
||||
.transform(BuilderTransformers.bearing("windmill", "gearbox", true))
|
||||
|
|
|
@ -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.OrientedContraptionEntity;
|
||||
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.SuperGlueRenderer;
|
||||
import com.simibubi.create.foundation.utility.Lang;
|
||||
|
@ -23,16 +25,27 @@ import net.minecraftforge.fml.client.registry.RenderingRegistry;
|
|||
public class AllEntityTypes {
|
||||
|
||||
public static final RegistryEntry<EntityType<OrientedContraptionEntity>> ORIENTED_CONTRAPTION =
|
||||
register("contraption", OrientedContraptionEntity::new, EntityClassification.MISC, 5, 3, true,
|
||||
AbstractContraptionEntity::build);
|
||||
contraption("contraption", OrientedContraptionEntity::new, 5, 3, true);
|
||||
public static final RegistryEntry<EntityType<ControlledContraptionEntity>> CONTROLLED_CONTRAPTION =
|
||||
register("stationary_contraption", ControlledContraptionEntity::new, EntityClassification.MISC, 20, 40, false,
|
||||
AbstractContraptionEntity::build);
|
||||
contraption("stationary_contraption", ControlledContraptionEntity::new, 20, 40, false);
|
||||
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",
|
||||
SuperGlueEntity::new, EntityClassification.MISC, 10, Integer.MAX_VALUE, false, SuperGlueEntity::build);
|
||||
public static final RegistryEntry<EntityType<SeatEntity>> SEAT =
|
||||
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,
|
||||
EntityClassification group, int range, int updateFrequency, boolean sendVelocity,
|
||||
NonNullConsumer<EntityType.Builder<T>> propertyBuilder) {
|
||||
|
@ -46,14 +59,14 @@ public class AllEntityTypes {
|
|||
.register();
|
||||
}
|
||||
|
||||
public static void register() {}
|
||||
|
||||
@OnlyIn(value = Dist.CLIENT)
|
||||
public static void registerRenderers() {
|
||||
RenderingRegistry.registerEntityRenderingHandler(CONTROLLED_CONTRAPTION.get(),
|
||||
ControlledContraptionEntityRenderer::new);
|
||||
RenderingRegistry.registerEntityRenderingHandler(ORIENTED_CONTRAPTION.get(),
|
||||
OrientedContraptionEntityRenderer::new);
|
||||
RenderingRegistry.registerEntityRenderingHandler(GANTRY_CONTRAPTION.get(),
|
||||
GantryContraptionEntityRenderer::new);
|
||||
RenderingRegistry.registerEntityRenderingHandler(SUPER_GLUE.get(), SuperGlueRenderer::new);
|
||||
RenderingRegistry.registerEntityRenderingHandler(SEAT.get(), SeatEntity.Render::new);
|
||||
}
|
||||
|
|
|
@ -41,10 +41,6 @@ public class AllShapes {
|
|||
SAIL_FRAME_COLLISION = shape(0, 5, 0, 16, 9, 16).erase(2, 0, 2, 14, 16, 14)
|
||||
.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),
|
||||
NOZZLE = shape(2, 0, 2, 14, 14, 14).add(1, 13, 1, 15, 15, 15)
|
||||
.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)
|
||||
.add(2, 0, 2, 14, 2, 14)
|
||||
.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)
|
||||
.build(),
|
||||
HEATER_BLOCK_SPECIAL_COLLISION_SHAPE = shape(0, 0, 0, 16, 4, 16).build(),
|
||||
|
|
|
@ -187,5 +187,7 @@ public class AllTags {
|
|||
AllBlockTags.FAN_TRANSPARENT.add(Blocks.IRON_BARS);
|
||||
|
||||
AllBlockTags.FAN_HEATERS.add(Blocks.MAGMA_BLOCK, Blocks.CAMPFIRE, Blocks.LAVA, Blocks.FIRE);
|
||||
|
||||
AllBlockTags.SAFE_NBT.includeAll(BlockTags.SIGNS);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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.WindmillBearingTileEntity;
|
||||
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.piston.MechanicalPistonRenderer;
|
||||
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.burner.BlazeBurnerRenderer;
|
||||
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.SpeedControllerTileEntity;
|
||||
import com.simibubi.create.content.contraptions.relays.advanced.sequencer.SequencedGearshiftTileEntity;
|
||||
|
@ -204,6 +207,18 @@ public class AllTileEntities {
|
|||
.renderer(() -> CuckooClockRenderer::new)
|
||||
.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()
|
||||
.tileEntity("mechanical_pump", PumpTileEntity::new)
|
||||
.validBlocks(AllBlocks.MECHANICAL_PUMP)
|
||||
|
|
|
@ -14,6 +14,7 @@ import com.simibubi.create.content.logistics.RedstoneLinkNetworkHandler;
|
|||
import com.simibubi.create.content.palettes.AllPaletteBlocks;
|
||||
import com.simibubi.create.content.palettes.PalettesItemGroup;
|
||||
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.AllTriggers;
|
||||
import com.simibubi.create.foundation.command.ChunkUtil;
|
||||
|
@ -99,6 +100,7 @@ public class Create {
|
|||
|
||||
public static void init(final FMLCommonSetupEvent event) {
|
||||
CapabilityMinecartController.register();
|
||||
SchematicInstances.register();
|
||||
schematicReceiver = new ServerSchematicLoader();
|
||||
redstoneLinkNetworkHandler = new RedstoneLinkNetworkHandler();
|
||||
torquePropagator = new TorquePropagator();
|
||||
|
|
|
@ -8,7 +8,6 @@ import java.util.stream.Collectors;
|
|||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import com.simibubi.create.AllBlocks;
|
||||
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 mezz.jei.api.constants.VanillaTypes;
|
||||
|
|
|
@ -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.relays.advanced.SpeedControllerBlock;
|
||||
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.encased.DirectionalShaftHalvesTileEntity;
|
||||
import com.simibubi.create.content.contraptions.relays.encased.EncasedBeltBlock;
|
||||
|
@ -70,11 +69,9 @@ public class RotationPropagator {
|
|||
boolean connectedByGears = definitionFrom.hasIntegratedCogwheel(world, from.getPos(), stateFrom)
|
||||
&& definitionTo.hasIntegratedCogwheel(world, to.getPos(), stateTo);
|
||||
|
||||
// Belt <-> Belt
|
||||
if (from instanceof BeltTileEntity && to instanceof BeltTileEntity && !connectedByAxis) {
|
||||
return ((BeltTileEntity) from).getController()
|
||||
.equals(((BeltTileEntity) to).getController()) ? 1 : 0;
|
||||
}
|
||||
float custom = from.propagateRotationTo(to, stateFrom, stateTo, diff, connectedByAxis, connectedByGears);
|
||||
if (custom != 0)
|
||||
return custom;
|
||||
|
||||
// Axis <-> Axis
|
||||
if (connectedByAxis) {
|
||||
|
@ -230,6 +227,9 @@ public class RotationPropagator {
|
|||
float newSpeed = getConveyedSpeed(currentTE, neighbourTE);
|
||||
float oppositeSpeed = getConveyedSpeed(neighbourTE, currentTE);
|
||||
|
||||
if (newSpeed == 0 && oppositeSpeed == 0)
|
||||
continue;
|
||||
|
||||
boolean incompatible =
|
||||
Math.signum(newSpeed) != Math.signum(speedOfNeighbour) && (newSpeed != 0 && speedOfNeighbour != 0);
|
||||
|
||||
|
@ -395,7 +395,7 @@ public class RotationPropagator {
|
|||
if (!(neighbourKTE.getBlockState()
|
||||
.getBlock() instanceof IRotate))
|
||||
return null;
|
||||
if (!isConnected(currentTE, neighbourKTE))
|
||||
if (!isConnected(currentTE, neighbourKTE) && !isConnected(neighbourKTE, currentTE))
|
||||
return null;
|
||||
return neighbourKTE;
|
||||
}
|
||||
|
@ -403,14 +403,9 @@ public class RotationPropagator {
|
|||
public static boolean isConnected(KineticTileEntity from, KineticTileEntity to) {
|
||||
final BlockState stateFrom = from.getBlockState();
|
||||
final BlockState stateTo = to.getBlockState();
|
||||
|
||||
if (isLargeCogToSpeedController(stateFrom, stateTo, to.getPos()
|
||||
.subtract(from.getPos())))
|
||||
return true;
|
||||
if (isLargeCogToSpeedController(stateTo, stateFrom, from.getPos()
|
||||
.subtract(to.getPos())))
|
||||
return true;
|
||||
return getRotationSpeedModifier(from, to) != 0;
|
||||
return isLargeCogToSpeedController(stateFrom, stateTo, to.getPos()
|
||||
.subtract(from.getPos())) || getRotationSpeedModifier(from, to) != 0
|
||||
|| from.isCustomConnection(to, stateFrom, stateTo);
|
||||
}
|
||||
|
||||
private static List<KineticTileEntity> getConnectedNeighbours(KineticTileEntity te) {
|
||||
|
@ -436,30 +431,11 @@ public class RotationPropagator {
|
|||
neighbours.add(te.getPos()
|
||||
.offset(facing));
|
||||
|
||||
// Some Blocks can interface diagonally
|
||||
BlockState blockState = te.getBlockState();
|
||||
boolean isLargeWheel = isLargeCog(blockState);
|
||||
|
||||
if (!(blockState.getBlock() instanceof IRotate))
|
||||
return neighbours;
|
||||
IRotate block = (IRotate) blockState.getBlock();
|
||||
|
||||
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;
|
||||
return te.addPropagationLocations(block, blockState, neighbours);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -31,7 +31,8 @@ public abstract class KineticBlock extends Block implements IRotate {
|
|||
|
||||
@Override
|
||||
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))
|
||||
return true;
|
||||
}
|
||||
|
@ -46,6 +47,24 @@ public abstract class KineticBlock extends Block implements IRotate {
|
|||
@Override
|
||||
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
|
||||
|
||||
// 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
|
||||
|
@ -63,6 +82,10 @@ public abstract class KineticBlock extends Block implements IRotate {
|
|||
return true;
|
||||
}
|
||||
|
||||
protected boolean areStatesKineticallyEquivalent(BlockState oldState, BlockState newState) {
|
||||
return getRotationAxis(newState) == getRotationAxis(oldState);
|
||||
}
|
||||
|
||||
@Override
|
||||
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);
|
||||
if (!(tileEntity instanceof KineticTileEntity))
|
||||
return;
|
||||
KineticTileEntity kte = (KineticTileEntity) tileEntity;
|
||||
|
||||
if (kte.preventSpeedUpdate) {
|
||||
kte.preventSpeedUpdate = false;
|
||||
return;
|
||||
}
|
||||
|
||||
// Remove previous information when block is added
|
||||
KineticTileEntity kte = (KineticTileEntity) tileEntity;
|
||||
kte.warnOfMovement();
|
||||
kte.clearKineticInformation();
|
||||
kte.updateSpeed = true;
|
||||
|
|
|
@ -30,6 +30,7 @@ import net.minecraft.tileentity.ITickableTileEntity;
|
|||
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.Direction.AxisDirection;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.text.TextFormatting;
|
||||
|
@ -42,6 +43,7 @@ public abstract class KineticTileEntity extends SmartTileEntity
|
|||
public @Nullable BlockPos source;
|
||||
public boolean networkDirty;
|
||||
public boolean updateSpeed;
|
||||
public boolean preventSpeedUpdate;
|
||||
|
||||
protected KineticEffectHandler effects;
|
||||
protected float speed;
|
||||
|
@ -361,11 +363,15 @@ public abstract class KineticTileEntity extends SmartTileEntity
|
|||
}
|
||||
|
||||
KineticTileEntity tileEntity = (KineticTileEntity) tileEntityIn;
|
||||
if (state.getBlock() instanceof KineticBlock
|
||||
&& !((KineticBlock) state.getBlock()).areStatesKineticallyEquivalent(currentState, state)) {
|
||||
if (tileEntity.hasNetwork())
|
||||
tileEntity.getOrCreateNetwork()
|
||||
.remove(tileEntity);
|
||||
tileEntity.detachKinetics();
|
||||
tileEntity.removeSource();
|
||||
}
|
||||
|
||||
world.setBlockState(pos, state, 3);
|
||||
}
|
||||
|
||||
|
@ -417,8 +423,8 @@ public abstract class KineticTileEntity extends SmartTileEntity
|
|||
|
||||
String stressString =
|
||||
spacing + "%s%s" + Lang.translate("generic.unit.stress") + " " + TextFormatting.DARK_GRAY + "%s";
|
||||
tooltip.add(" " + String.format(stressString, TextFormatting.AQUA, IHaveGoggleInformation.format(stressTotal),
|
||||
Lang.translate("gui.goggles.at_current_speed")));
|
||||
tooltip.add(" " + String.format(stressString, TextFormatting.AQUA,
|
||||
IHaveGoggleInformation.format(stressTotal), Lang.translate("gui.goggles.at_current_speed")));
|
||||
|
||||
added = true;
|
||||
}
|
||||
|
@ -454,4 +460,72 @@ public abstract class KineticTileEntity extends SmartTileEntity
|
|||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -183,7 +183,6 @@ public class DeployerTileEntity extends KineticTileEntity {
|
|||
if (state == State.EXPANDING) {
|
||||
if (boop)
|
||||
triggerBoop();
|
||||
else
|
||||
activate();
|
||||
|
||||
state = State.RETRACTING;
|
||||
|
|
|
@ -82,7 +82,7 @@ public class AirCurrent {
|
|||
protected void tickAffectedEntities(World world, Direction facing) {
|
||||
for (Iterator<Entity> iterator = caughtEntities.iterator(); iterator.hasNext();) {
|
||||
Entity entity = iterator.next();
|
||||
if (!entity.getBoundingBox()
|
||||
if (!entity.isAlive() || !entity.getBoundingBox()
|
||||
.intersects(bounds)) {
|
||||
iterator.remove();
|
||||
continue;
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
package com.simibubi.create.content.contraptions.components.fan;
|
||||
|
||||
import com.simibubi.create.AllBlocks;
|
||||
import com.simibubi.create.AllTileEntities;
|
||||
import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock;
|
||||
import com.simibubi.create.content.logistics.block.chute.AbstractChuteBlock;
|
||||
|
@ -33,9 +32,16 @@ public class EncasedFanBlock extends DirectionalKineticBlock implements ITE<Enca
|
|||
|
||||
@Override
|
||||
public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) {
|
||||
super.onBlockAdded(state, worldIn, pos, oldState, isMoving);
|
||||
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
|
||||
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())) {
|
||||
|
@ -70,13 +76,13 @@ public class EncasedFanBlock extends DirectionalKineticBlock implements ITE<Enca
|
|||
.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)
|
||||
return;
|
||||
notifyFanTile(worldIn, pos);
|
||||
if (worldIn.isRemote)
|
||||
if (worldIn.isRemote())
|
||||
return;
|
||||
withTileEntityDo(worldIn, pos, te -> te.updateGenerator(state.get(FACING)));
|
||||
withTileEntityDo(worldIn, pos, te -> te.queueGeneratorUpdate());
|
||||
}
|
||||
|
||||
protected void notifyFanTile(IWorld world, BlockPos pos) {
|
||||
|
|
|
@ -2,6 +2,7 @@ package com.simibubi.create.content.contraptions.components.fan;
|
|||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import com.simibubi.create.AllBlocks;
|
||||
import com.simibubi.create.AllTags.AllBlockTags;
|
||||
import com.simibubi.create.content.contraptions.base.GeneratingKineticTileEntity;
|
||||
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.world.World;
|
||||
|
||||
|
||||
@MethodsReturnNonnullByDefault
|
||||
public class EncasedFanTileEntity extends GeneratingKineticTileEntity implements IAirCurrentSource {
|
||||
|
||||
|
@ -27,17 +27,20 @@ public class EncasedFanTileEntity extends GeneratingKineticTileEntity implements
|
|||
protected int entitySearchCooldown;
|
||||
protected boolean isGenerator;
|
||||
protected boolean updateAirFlow;
|
||||
protected boolean updateGenerator;
|
||||
|
||||
public EncasedFanTileEntity(TileEntityType<? extends EncasedFanTileEntity> type) {
|
||||
super(type);
|
||||
isGenerator = false;
|
||||
airCurrent = new AirCurrent(this);
|
||||
updateAirFlow = true;
|
||||
updateGenerator = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void read(CompoundNBT compound, boolean clientPacket) {
|
||||
super.read(compound, clientPacket);
|
||||
if (!wasMoved)
|
||||
isGenerator = compound.getBoolean("Generating");
|
||||
if (clientPacket)
|
||||
airCurrent.rebuild();
|
||||
|
@ -64,12 +67,20 @@ public class EncasedFanTileEntity extends GeneratingKineticTileEntity implements
|
|||
return isGenerator ? AllConfigs.SERVER.kinetics.generatingFanSpeed.get() : 0;
|
||||
}
|
||||
|
||||
public void updateGenerator(Direction facing) {
|
||||
boolean shouldGenerate = world.isBlockPowered(pos) && facing == Direction.DOWN
|
||||
&& world.isBlockPresent(pos.down()) && blockBelowIsHot();
|
||||
if (shouldGenerate == isGenerator)
|
||||
public void queueGeneratorUpdate() {
|
||||
updateGenerator = true;
|
||||
}
|
||||
|
||||
public void updateGenerator() {
|
||||
BlockState blockState = getBlockState();
|
||||
if (!AllBlocks.ENCASED_FAN.has(blockState))
|
||||
return;
|
||||
if (blockState.get(EncasedFanBlock.FACING) != Direction.DOWN)
|
||||
return;
|
||||
|
||||
boolean shouldGenerate = world.isBlockPowered(pos) && world.isBlockPresent(pos.down()) && blockBelowIsHot();
|
||||
if (shouldGenerate == isGenerator)
|
||||
return;
|
||||
isGenerator = shouldGenerate;
|
||||
updateGeneratedRotation();
|
||||
}
|
||||
|
@ -171,6 +182,11 @@ public class EncasedFanTileEntity extends GeneratingKineticTileEntity implements
|
|||
sendData();
|
||||
}
|
||||
|
||||
if (updateGenerator) {
|
||||
updateGenerator = false;
|
||||
updateGenerator();
|
||||
}
|
||||
|
||||
if (getSpeed() == 0 || isGenerator)
|
||||
return;
|
||||
|
||||
|
|
|
@ -27,8 +27,8 @@ public class CreativeMotorTileEntity extends GeneratingKineticTileEntity {
|
|||
super.addBehaviours(behaviours);
|
||||
Integer max = AllConfigs.SERVER.kinetics.maxMotorSpeed.get();
|
||||
|
||||
CenteredSideValueBoxTransform slot =
|
||||
new CenteredSideValueBoxTransform((motor, side) -> motor.get(CreativeMotorBlock.FACING) == side.getOpposite());
|
||||
CenteredSideValueBoxTransform slot = new CenteredSideValueBoxTransform(
|
||||
(motor, side) -> motor.get(CreativeMotorBlock.FACING) == side.getOpposite());
|
||||
|
||||
generatedSpeed = new ScrollValueBehaviour(Lang.translate("generic.speed"), this, slot);
|
||||
generatedSpeed.between(-max, max);
|
||||
|
@ -55,20 +55,21 @@ public class CreativeMotorTileEntity extends GeneratingKineticTileEntity {
|
|||
}
|
||||
|
||||
public static int step(StepContext context) {
|
||||
if (context.shift)
|
||||
return 1;
|
||||
|
||||
int current = context.currentValue;
|
||||
int magnitude = Math.abs(current) - (context.forward == current > 0 ? 0 : 1);
|
||||
int step = 1;
|
||||
|
||||
if (!context.shift) {
|
||||
int magnitude = Math.abs(current) - (context.forward == current > 0 ? 0 : 1);
|
||||
|
||||
if (magnitude >= 4)
|
||||
step *= 4;
|
||||
if (magnitude >= 32)
|
||||
step *= 4;
|
||||
if (magnitude >= 128)
|
||||
step *= 4;
|
||||
return step;
|
||||
}
|
||||
|
||||
return (int) (current + (context.forward ? step : -step) == 0 ? step + 1 : step);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -153,6 +153,8 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity {
|
|||
|
||||
for (ItemEntity itemEntity : world.getEntitiesWithinAABB(ItemEntity.class,
|
||||
new AxisAlignedBB(pos.down()).shrink(.125f))) {
|
||||
if (!itemEntity.isAlive() || !itemEntity.onGround)
|
||||
continue;
|
||||
ItemStack stack = itemEntity.getItem();
|
||||
Optional<PressingRecipe> recipe = getRecipe(stack);
|
||||
if (!recipe.isPresent())
|
||||
|
@ -233,7 +235,7 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity {
|
|||
for (Entity entity : world.getEntitiesWithinAABBExcludingEntity(null, bb)) {
|
||||
if (!(entity instanceof ItemEntity))
|
||||
continue;
|
||||
if (!entity.isAlive())
|
||||
if (!entity.isAlive() || !entity.onGround)
|
||||
continue;
|
||||
ItemEntity itemEntity = (ItemEntity) entity;
|
||||
pressedItems.add(itemEntity.getItem());
|
||||
|
|
|
@ -74,6 +74,10 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit
|
|||
contraption.onEntityCreated(this);
|
||||
}
|
||||
|
||||
public boolean supportsTerrainCollision() {
|
||||
return contraption instanceof TranslatingContraption;
|
||||
}
|
||||
|
||||
protected void contraptionInitialize() {
|
||||
contraption.onEntityInitialize(world, this);
|
||||
initialized = true;
|
||||
|
@ -594,7 +598,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit
|
|||
}
|
||||
|
||||
public static class ContraptionRotationState {
|
||||
static final ContraptionRotationState NONE = new ContraptionRotationState();
|
||||
public static final ContraptionRotationState NONE = new ContraptionRotationState();
|
||||
|
||||
float xRotation = 0;
|
||||
float yRotation = 0;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -227,6 +227,12 @@ public class BlockMovementTraits {
|
|||
if (state.getBlock() instanceof SailBlock)
|
||||
return facing.getAxis() == state.get(SailBlock.FACING)
|
||||
.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);
|
||||
}
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@ import org.apache.commons.lang3.tuple.Pair;
|
|||
|
||||
import com.simibubi.create.AllBlocks;
|
||||
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.components.actors.SeatBlock;
|
||||
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.chassis.AbstractChassisBlock;
|
||||
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.SuperGlueHandler;
|
||||
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.MechanicalPistonHeadBlock;
|
||||
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.MagnetBlock;
|
||||
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.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.logistics.block.inventories.AdjustableCrateBlock;
|
||||
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.Iterate;
|
||||
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.worldWrappers.WrappedWorld;
|
||||
|
||||
|
@ -59,6 +64,7 @@ import net.minecraft.block.ChestBlock;
|
|||
import net.minecraft.block.DoorBlock;
|
||||
import net.minecraft.block.IWaterLoggable;
|
||||
import net.minecraft.block.PressurePlateBlock;
|
||||
import net.minecraft.block.material.PushReaction;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.fluid.Fluids;
|
||||
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.ChestType;
|
||||
import net.minecraft.state.properties.DoubleBlockHalf;
|
||||
import net.minecraft.state.properties.PistonType;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Direction.Axis;
|
||||
|
@ -134,9 +141,9 @@ public abstract class Contraption {
|
|||
|
||||
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) {
|
||||
return false;
|
||||
|
@ -153,7 +160,7 @@ public abstract class Contraption {
|
|||
|
||||
public static Contraption fromNBT(World world, CompoundNBT nbt, boolean spawnData) {
|
||||
String type = nbt.getString("Type");
|
||||
Contraption contraption = AllContraptionTypes.fromType(type);
|
||||
Contraption contraption = ContraptionType.fromType(type);
|
||||
contraption.readNBT(world, nbt, spawnData);
|
||||
return contraption;
|
||||
}
|
||||
|
@ -240,7 +247,7 @@ public abstract class Contraption {
|
|||
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) {
|
||||
visited.add(pos);
|
||||
frontier.remove(pos);
|
||||
|
@ -264,6 +271,12 @@ public abstract class Contraption {
|
|||
if (AllBlocks.BELT.has(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
|
||||
if (AllBlocks.MECHANICAL_BEARING.has(state))
|
||||
moveBearing(pos, frontier, visited, state);
|
||||
|
@ -280,6 +293,10 @@ public abstract class Contraption {
|
|||
if (state.getBlock() instanceof MechanicalPistonBlock)
|
||||
if (!moveMechanicalPiston(world, pos, frontier, visited, state))
|
||||
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
|
||||
if (state.getBlock() instanceof DoorBlock) {
|
||||
|
@ -296,14 +313,13 @@ public abstract class Contraption {
|
|||
Map<Direction, SuperGlueEntity> superglue = SuperGlueHandler.gatherGlue(world, pos);
|
||||
|
||||
// Slime blocks and super glue drag adjacent blocks if possible
|
||||
boolean isStickyBlock = state.isStickyBlock();
|
||||
for (Direction offset : Iterate.directions) {
|
||||
BlockPos offsetPos = pos.offset(offset);
|
||||
BlockState blockState = world.getBlockState(offsetPos);
|
||||
if (isAnchoringBlockAt(offsetPos))
|
||||
continue;
|
||||
if (!movementAllowed(world, offsetPos)) {
|
||||
if (offset == forcedDirection && isStickyBlock)
|
||||
if (offset == forcedDirection)
|
||||
return false;
|
||||
continue;
|
||||
}
|
||||
|
@ -313,8 +329,20 @@ public abstract class Contraption {
|
|||
boolean blockAttachedTowardsFace =
|
||||
BlockMovementTraits.isBlockAttachedTowards(world, offsetPos, blockState, offset.getOpposite());
|
||||
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);
|
||||
if (faceHasGlue)
|
||||
addGlue(superglue.get(offset));
|
||||
|
@ -324,9 +352,86 @@ public abstract class Contraption {
|
|||
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) {
|
||||
Direction facing = state.get(MechanicalBearingBlock.FACING);
|
||||
if (!canAxisBeStabilized(facing.getAxis())) {
|
||||
if (!canBeStabilized(facing, pos.subtract(anchor))) {
|
||||
BlockPos offset = pos.offset(facing);
|
||||
if (!visited.contains(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,
|
||||
BlockState state) {
|
||||
int limit = AllConfigs.SERVER.kinetics.maxPistonPoles.get();
|
||||
Direction direction = state.get(MechanicalPistonBlock.FACING);
|
||||
if (state.get(MechanicalPistonBlock.STATE) == PistonState.EXTENDED) {
|
||||
BlockPos searchPos = pos;
|
||||
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)
|
||||
PistonState pistonState = state.get(MechanicalPistonBlock.STATE);
|
||||
if (pistonState == PistonState.MOVING)
|
||||
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;
|
||||
while (limit-- >= 0) {
|
||||
searchPos = searchPos.offset(direction.getOpposite());
|
||||
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;
|
||||
}
|
||||
break;
|
||||
if (pistonState == PistonState.EXTENDED || MechanicalPistonBlock.isStickyPiston(state)) {
|
||||
offset = pos.offset(direction);
|
||||
if (!visited.contains(offset))
|
||||
frontier.add(offset);
|
||||
}
|
||||
|
||||
if (limit <= -1)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -726,7 +809,8 @@ public abstract class Contraption {
|
|||
if (brittles != BlockMovementTraits.isBrittle(block.state))
|
||||
continue;
|
||||
|
||||
BlockPos add = block.pos.add(anchor).add(offset);
|
||||
BlockPos add = block.pos.add(anchor)
|
||||
.add(offset);
|
||||
if (customBlockRemoval(world, add, block.state))
|
||||
continue;
|
||||
BlockState oldState = world.getBlockState(add);
|
||||
|
@ -735,7 +819,8 @@ public abstract class Contraption {
|
|||
iterator.remove();
|
||||
world.getWorld()
|
||||
.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)
|
||||
&& oldState.get(BlockStateProperties.WATERLOGGED)
|
||||
.booleanValue()) {
|
||||
|
@ -746,8 +831,12 @@ public abstract class Contraption {
|
|||
}
|
||||
}
|
||||
for (BlockInfo block : blocks.values()) {
|
||||
BlockPos add = block.pos.add(anchor).add(offset);
|
||||
world.markAndNotifyBlock(add, null, block.state, Blocks.AIR.getDefaultState(), BlockFlags.IS_MOVING | BlockFlags.DEFAULT);
|
||||
BlockPos add = block.pos.add(anchor)
|
||||
.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);
|
||||
CompoundNBT tag = block.nbt;
|
||||
if (tileEntity != null)
|
||||
tag = NBTProcessors.process(tileEntity, tag, false);
|
||||
if (tileEntity != null && tag != null) {
|
||||
tag.putInt("x", targetPos.getX());
|
||||
tag.putInt("y", targetPos.getY());
|
||||
|
@ -827,8 +918,12 @@ public abstract class Contraption {
|
|||
}
|
||||
}
|
||||
for (BlockInfo block : blocks.values()) {
|
||||
if (!shouldUpdateAfterMovement(block))
|
||||
continue;
|
||||
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++)
|
||||
|
@ -888,6 +983,10 @@ public abstract class Contraption {
|
|||
callBack.accept(AllMovementBehaviours.of(pair.getLeft().state), pair.getRight());
|
||||
}
|
||||
|
||||
protected boolean shouldUpdateAfterMovement(BlockInfo info) {
|
||||
return true;
|
||||
}
|
||||
|
||||
public void expandBoundsAroundAxis(Axis axis) {
|
||||
AxisAlignedBB bb = bounds;
|
||||
double maxXDiff = Math.max(bb.maxX - 1, -bb.minX);
|
||||
|
|
|
@ -348,7 +348,7 @@ public class ContraptionCollider {
|
|||
return potentialHits;
|
||||
}
|
||||
|
||||
public static boolean collideBlocks(ControlledContraptionEntity contraptionEntity) {
|
||||
public static boolean collideBlocks(AbstractContraptionEntity contraptionEntity) {
|
||||
if (!contraptionEntity.supportsTerrainCollision())
|
||||
return false;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -46,10 +46,6 @@ public class ControlledContraptionEntity extends AbstractContraptionEntity {
|
|||
return entity;
|
||||
}
|
||||
|
||||
public boolean supportsTerrainCollision() {
|
||||
return contraption instanceof TranslatingContraption;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Vec3d getContactPointMotion(Vec3d globalContactPoint) {
|
||||
if (contraption instanceof TranslatingContraption)
|
||||
|
@ -151,8 +147,6 @@ public class ControlledContraptionEntity extends AbstractContraptionEntity {
|
|||
}
|
||||
|
||||
Vec3d motion = getMotion();
|
||||
if (motion.length() < 1 / 4098f)
|
||||
setMotion(Vec3d.ZERO);
|
||||
move(motion.x, motion.y, motion.z);
|
||||
if (ContraptionCollider.collideBlocks(this))
|
||||
getController().collided();
|
||||
|
|
|
@ -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_))
|
||||
return false;
|
||||
if (entity.getContraption()
|
||||
.getType() == AllContraptionTypes.MOUNTED && entity.getRidingEntity() == null)
|
||||
.getType() == ContraptionType.MOUNTED && entity.getRidingEntity() == null)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -5,7 +5,6 @@ import java.util.HashSet;
|
|||
import java.util.Set;
|
||||
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Direction.Axis;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
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) {
|
||||
if (getBlocks() == null)
|
||||
return Collections.EMPTY_SET;
|
||||
return Collections.emptySet();
|
||||
if (cachedColliders == null || cachedColliderDirection != movementDirection) {
|
||||
cachedColliders = new HashSet<>();
|
||||
cachedColliderDirection = movementDirection;
|
||||
|
@ -48,7 +47,7 @@ public abstract class TranslatingContraption extends Contraption {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected boolean canAxisBeStabilized(Axis axis) {
|
||||
public boolean canBeStabilized(Direction facing, BlockPos localPos) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -3,13 +3,12 @@ package com.simibubi.create.content.contraptions.components.structureMovement.be
|
|||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
||||
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 net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Direction.Axis;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.gen.feature.template.Template.BlockInfo;
|
||||
|
@ -43,8 +42,8 @@ public class BearingContraption extends Contraption {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected AllContraptionTypes getType() {
|
||||
return AllContraptionTypes.BEARING;
|
||||
protected ContraptionType getType() {
|
||||
return ContraptionType.BEARING;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -84,8 +83,10 @@ public class BearingContraption extends Contraption {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected boolean canAxisBeStabilized(Axis axis) {
|
||||
return axis == facing.getAxis();
|
||||
public boolean canBeStabilized(Direction facing, BlockPos localPos) {
|
||||
if (facing.getOpposite() == this.facing && BlockPos.ZERO.equals(localPos))
|
||||
return false;
|
||||
return facing.getAxis() == this.facing.getAxis();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -6,13 +6,12 @@ import java.util.Set;
|
|||
|
||||
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.foundation.utility.NBTHelper;
|
||||
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Direction.Axis;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
|
@ -24,8 +23,8 @@ public class ClockworkContraption extends Contraption {
|
|||
private Set<BlockPos> ignoreBlocks = new HashSet<>();
|
||||
|
||||
@Override
|
||||
protected AllContraptionTypes getType() {
|
||||
return AllContraptionTypes.CLOCKWORK;
|
||||
protected ContraptionType getType() {
|
||||
return ContraptionType.CLOCKWORK;
|
||||
}
|
||||
|
||||
private void ignoreBlocks(Set<BlockPos> blocks, BlockPos anchor) {
|
||||
|
@ -110,15 +109,17 @@ public class ClockworkContraption extends Contraption {
|
|||
|
||||
@Override
|
||||
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);
|
||||
offset = tag.getInt("offset");
|
||||
super.readNBT(world, tag, spawnData);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canAxisBeStabilized(Axis axis) {
|
||||
return axis == facing.getAxis();
|
||||
public boolean canBeStabilized(Direction facing, BlockPos localPos) {
|
||||
if (BlockPos.ZERO.equals(localPos) || BlockPos.ZERO.equals(localPos.offset(facing)))
|
||||
return false;
|
||||
return facing.getAxis() == this.facing.getAxis();
|
||||
}
|
||||
|
||||
public static enum HandType {
|
||||
|
|
|
@ -45,7 +45,7 @@ public class StabilizedBearingMovementBehaviour extends MovementBehaviour {
|
|||
AbstractContraptionEntity entity = context.contraption.entity;
|
||||
if (entity instanceof ControlledContraptionEntity) {
|
||||
ControlledContraptionEntity controlledCE = (ControlledContraptionEntity) entity;
|
||||
if (controlledCE.getRotationAxis() == axis)
|
||||
if (context.contraption.canBeStabilized(facing, context.localPos))
|
||||
offset = -controlledCE.getAngle(renderPartialTicks);
|
||||
|
||||
} else if (entity instanceof OrientedContraptionEntity) {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
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 net.minecraft.nbt.CompoundNBT;
|
||||
|
@ -37,8 +37,8 @@ public class StabilizedContraption extends Contraption {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected AllContraptionTypes getType() {
|
||||
return AllContraptionTypes.STABILIZED;
|
||||
protected ContraptionType getType() {
|
||||
return ContraptionType.STABILIZED;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -55,7 +55,7 @@ public class StabilizedContraption extends Contraption {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected boolean canAxisBeStabilized(Axis axis) {
|
||||
public boolean canBeStabilized(Direction facing, BlockPos localPos) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
|
@ -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) {}
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
|
@ -7,7 +7,7 @@ import java.util.List;
|
|||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
||||
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.mounted.CartAssemblerTileEntity.CartMovementMode;
|
||||
import com.simibubi.create.foundation.utility.Iterate;
|
||||
|
@ -47,8 +47,8 @@ public class MountedContraption extends Contraption {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected AllContraptionTypes getType() {
|
||||
return AllContraptionTypes.MOUNTED;
|
||||
protected ContraptionType getType() {
|
||||
return ContraptionType.MOUNTED;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -149,7 +149,7 @@ public class MountedContraption extends Contraption {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected boolean canAxisBeStabilized(Axis axis) {
|
||||
public boolean canBeStabilized(Direction facing, BlockPos localPos) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -247,7 +247,7 @@ public abstract class LinearActuatorTileEntity extends KineticTileEntity impleme
|
|||
}
|
||||
|
||||
public float getMovementSpeed() {
|
||||
float movementSpeed = getSpeed() / 512f + clientOffsetDiff / 2f;
|
||||
float movementSpeed = MathHelper.clamp(getSpeed() / 512f, -.49f, .49f) + clientOffsetDiff / 2f;
|
||||
if (world.isRemote)
|
||||
movementSpeed *= ServerSpeedProvider.get();
|
||||
return movementSpeed;
|
||||
|
|
|
@ -112,7 +112,7 @@ public class MechanicalPistonTileEntity extends LinearActuatorTileEntity {
|
|||
|
||||
@Override
|
||||
public float getMovementSpeed() {
|
||||
float movementSpeed = getSpeed() / 512f;
|
||||
float movementSpeed = MathHelper.clamp(getSpeed() / 512f, -.49f, .49f);
|
||||
if (world.isRemote)
|
||||
movementSpeed *= ServerSpeedProvider.get();
|
||||
Direction pistonDirection = getBlockState().get(BlockStateProperties.FACING);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
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.TranslatingContraption;
|
||||
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 net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.CarpetBlock;
|
||||
import net.minecraft.block.material.PushReaction;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.state.properties.BlockStateProperties;
|
||||
import net.minecraft.state.properties.PistonType;
|
||||
|
@ -38,8 +39,8 @@ public class PistonContraption extends TranslatingContraption {
|
|||
private boolean retract;
|
||||
|
||||
@Override
|
||||
protected AllContraptionTypes getType() {
|
||||
return AllContraptionTypes.PISTON;
|
||||
protected ContraptionType getType() {
|
||||
return ContraptionType.PISTON;
|
||||
}
|
||||
|
||||
public PistonContraption() {}
|
||||
|
@ -164,6 +165,8 @@ public class PistonContraption extends TranslatingContraption {
|
|||
return true;
|
||||
if (!BlockMovementTraits.movementAllowed(world, currentPos))
|
||||
return retracting;
|
||||
if (retracting && state.getPushReaction() == PushReaction.PUSH_ONLY)
|
||||
return true;
|
||||
frontier.add(currentPos);
|
||||
if (BlockMovementTraits.notSupportive(state, orientation))
|
||||
return true;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
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 net.minecraft.nbt.CompoundNBT;
|
||||
|
@ -12,8 +12,8 @@ public class PulleyContraption extends TranslatingContraption {
|
|||
int initialOffset;
|
||||
|
||||
@Override
|
||||
protected AllContraptionTypes getType() {
|
||||
return AllContraptionTypes.PULLEY;
|
||||
protected ContraptionType getType() {
|
||||
return ContraptionType.PULLEY;
|
||||
}
|
||||
|
||||
public PulleyContraption() {}
|
||||
|
|
|
@ -48,6 +48,17 @@ public class PulleyTileEntity extends LinearActuatorTileEntity {
|
|||
return;
|
||||
if (speed == 0)
|
||||
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)
|
||||
return;
|
||||
if (offset <= 0 && getSpeed() < 0)
|
||||
|
@ -70,7 +81,7 @@ public class PulleyTileEntity extends LinearActuatorTileEntity {
|
|||
if (!canAssembleStructure && getSpeed() > 0)
|
||||
return;
|
||||
|
||||
for (int i = ((int) offset); i > 0; i--) {
|
||||
for (i = ((int) offset); i > 0; i--) {
|
||||
BlockPos offset = pos.down(i);
|
||||
BlockState oldState = world.getBlockState(offset);
|
||||
if (oldState.getBlock() instanceof IWaterLoggable && oldState.has(BlockStateProperties.WATERLOGGED)
|
||||
|
|
|
@ -6,6 +6,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Abs
|
|||
import com.simibubi.create.foundation.networking.SimplePacketBase;
|
||||
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.entity.player.ServerPlayerEntity;
|
||||
import net.minecraft.network.PacketBuffer;
|
||||
import net.minecraft.util.Direction;
|
||||
|
@ -45,22 +46,26 @@ public class ContraptionInteractionPacket extends SimplePacketBase {
|
|||
|
||||
@Override
|
||||
public void handle(Supplier<Context> context) {
|
||||
context.get()
|
||||
.enqueueWork(() -> {
|
||||
ServerPlayerEntity sender = context.get()
|
||||
.getSender();
|
||||
context.get().enqueueWork(() -> {
|
||||
ServerPlayerEntity sender = context.get().getSender();
|
||||
if (sender == null)
|
||||
return;
|
||||
Entity entityByID = sender.getServerWorld()
|
||||
.getEntityByID(target);
|
||||
Entity entityByID = sender.getServerWorld().getEntityByID(target);
|
||||
if (!(entityByID instanceof AbstractContraptionEntity))
|
||||
return;
|
||||
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))
|
||||
sender.swingHand(interactionHand, true);
|
||||
});
|
||||
context.get()
|
||||
.setPacketHandled(true);
|
||||
context.get().setPacketHandled(true);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -21,9 +21,7 @@ import com.simibubi.create.foundation.utility.VecHelper;
|
|||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.PotionItem;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.particles.BlockParticleData;
|
||||
import net.minecraft.particles.IParticleData;
|
||||
import net.minecraft.particles.ParticleTypes;
|
||||
import net.minecraft.potion.PotionUtils;
|
||||
import net.minecraft.tileentity.TileEntityType;
|
||||
import net.minecraft.util.Direction;
|
||||
|
|
|
@ -0,0 +1,240 @@
|
|||
package com.simibubi.create.content.contraptions.relays.advanced;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
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 net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockRenderType;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.item.BlockItemUseContext;
|
||||
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.IStringSerializable;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
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;
|
||||
|
||||
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 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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,16 +1,21 @@
|
|||
package com.simibubi.create.content.contraptions.relays.advanced;
|
||||
|
||||
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.HorizontalAxisKineticBlock;
|
||||
import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock;
|
||||
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.placement.IPlacementHelper;
|
||||
import com.simibubi.create.foundation.utility.placement.PlacementHelpers;
|
||||
import com.simibubi.create.foundation.utility.placement.PlacementOffset;
|
||||
|
||||
import mcp.MethodsReturnNonnullByDefault;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
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.World;
|
||||
|
||||
import java.util.function.Predicate;
|
||||
|
||||
public class SpeedControllerBlock extends HorizontalAxisKineticBlock {
|
||||
public class SpeedControllerBlock extends HorizontalAxisKineticBlock implements ITE<SpeedControllerTileEntity> {
|
||||
|
||||
private static final int placementHelperId = PlacementHelpers.register(new PlacementHelper());
|
||||
|
||||
|
@ -44,14 +47,25 @@ public class SpeedControllerBlock extends HorizontalAxisKineticBlock {
|
|||
|
||||
@Override
|
||||
public BlockState getStateForPlacement(BlockItemUseContext context) {
|
||||
BlockState above = context.getWorld().getBlockState(context.getPos().up());
|
||||
if (CogWheelBlock.isLargeCog(above) && above.get(CogWheelBlock.AXIS).isHorizontal())
|
||||
BlockState above = context.getWorld()
|
||||
.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 super.getStateForPlacement(context);
|
||||
}
|
||||
|
||||
@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);
|
||||
ItemStack heldItem = player.getHeldItem(hand);
|
||||
|
@ -72,7 +86,7 @@ public class SpeedControllerBlock extends HorizontalAxisKineticBlock {
|
|||
|
||||
@Override
|
||||
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
|
||||
|
@ -90,12 +104,15 @@ public class SpeedControllerBlock extends HorizontalAxisKineticBlock {
|
|||
@Override
|
||||
public PlacementOffset getOffset(World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) {
|
||||
BlockPos newPos = pos.up();
|
||||
if (!world.getBlockState(newPos).getMaterial().isReplaceable())
|
||||
if (!world.getBlockState(newPos)
|
||||
.getMaterial()
|
||||
.isReplaceable())
|
||||
return PlacementOffset.fail();
|
||||
|
||||
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.success(newPos, s -> s.with(CogWheelBlock.AXIS, newAxis));
|
||||
|
@ -103,7 +120,14 @@ public class SpeedControllerBlock extends HorizontalAxisKineticBlock {
|
|||
|
||||
@Override
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,14 +1,22 @@
|
|||
package com.simibubi.create.content.contraptions.relays.advanced;
|
||||
|
||||
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.content.contraptions.base.KineticTileEntityRenderer;
|
||||
import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer;
|
||||
import com.simibubi.create.foundation.utility.SuperByteBuffer;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.client.renderer.IRenderTypeBuffer;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.client.renderer.WorldRenderer;
|
||||
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> {
|
||||
|
||||
|
@ -21,8 +29,22 @@ public class SpeedControllerRenderer extends SmartTileEntityRenderer<SpeedContro
|
|||
IRenderTypeBuffer buffer, int light, int overlay) {
|
||||
super.renderSafe(tileEntityIn, partialTicks, ms, buffer, light, overlay);
|
||||
|
||||
KineticTileEntityRenderer.renderRotatingBuffer(tileEntityIn, getRotatedModel(tileEntityIn), ms,
|
||||
buffer.getBuffer(RenderType.getSolid()), light);
|
||||
IVertexBuilder builder = buffer.getBuffer(RenderType.getSolid());
|
||||
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) {
|
||||
|
|
|
@ -2,9 +2,11 @@ package com.simibubi.create.content.contraptions.relays.advanced;
|
|||
|
||||
import java.util.List;
|
||||
|
||||
import com.simibubi.create.AllBlocks;
|
||||
import com.simibubi.create.content.contraptions.RotationPropagator;
|
||||
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
|
||||
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.tileEntity.TileEntityBehaviour;
|
||||
import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform;
|
||||
|
@ -22,8 +24,17 @@ public class SpeedControllerTileEntity extends KineticTileEntity {
|
|||
public static final int DEFAULT_SPEED = 16;
|
||||
protected ScrollValueBehaviour targetSpeed;
|
||||
|
||||
boolean hasBracket;
|
||||
|
||||
public SpeedControllerTileEntity(TileEntityType<? extends SpeedControllerTileEntity> type) {
|
||||
super(type);
|
||||
hasBracket = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void lazyTick() {
|
||||
super.lazyTick();
|
||||
updateBracket();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -103,16 +114,25 @@ public class SpeedControllerTileEntity extends KineticTileEntity {
|
|||
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 {
|
||||
|
||||
@Override
|
||||
protected Vec3d getSouthLocation() {
|
||||
return VecHelper.voxelSpace(8, 11.5f, 14);
|
||||
return VecHelper.voxelSpace(8, 11f, 16);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isSideActive(BlockState state, Direction direction) {
|
||||
if (direction.getAxis().isVertical())
|
||||
if (direction.getAxis()
|
||||
.isVertical())
|
||||
return false;
|
||||
return state.get(SpeedControllerBlock.HORIZONTAL_AXIS) != direction.getAxis();
|
||||
}
|
||||
|
|
|
@ -68,6 +68,11 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock implemen
|
|||
withTileEntityDo(worldIn, pos, SequencedGearshiftTileEntity::onRedstoneUpdate);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean areStatesKineticallyEquivalent(BlockState oldState, BlockState newState) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) {
|
||||
if (state.get(VERTICAL))
|
||||
|
|
|
@ -87,6 +87,12 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE<BeltTileEnt
|
|||
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
|
||||
public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) {
|
||||
if (face.getAxis() != getRotationAxis(state))
|
||||
|
|
|
@ -13,6 +13,7 @@ import java.util.Optional;
|
|||
import java.util.function.Function;
|
||||
|
||||
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.relays.belt.transport.BeltInventory;
|
||||
import com.simibubi.create.content.contraptions.relays.belt.transport.BeltMovementHandler;
|
||||
|
@ -480,4 +481,18 @@ public class BeltTileEntity extends KineticTileEntity {
|
|||
.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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -2,12 +2,16 @@ package com.simibubi.create.content.contraptions.relays.elementary;
|
|||
|
||||
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.foundation.advancement.AllTriggers;
|
||||
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.tileentity.TileEntityType;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
|
||||
public class SimpleKineticTileEntity extends KineticTileEntity {
|
||||
|
||||
|
@ -28,4 +32,17 @@ public class SimpleKineticTileEntity extends KineticTileEntity {
|
|||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -36,6 +36,7 @@ public class AdjustablePulleyBlock extends EncasedBeltBlock implements ITE<Adjus
|
|||
|
||||
@Override
|
||||
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())
|
||||
return;
|
||||
withTileEntityDo(worldIn, pos, AdjustablePulleyTileEntity::neighborChanged);
|
||||
|
@ -48,7 +49,14 @@ public class AdjustablePulleyBlock extends EncasedBeltBlock implements ITE<Adjus
|
|||
|
||||
@Override
|
||||
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
|
||||
|
|
|
@ -9,7 +9,6 @@ import com.simibubi.create.foundation.utility.Lang;
|
|||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.block.material.PushReaction;
|
||||
import net.minecraft.item.BlockItemUseContext;
|
||||
import net.minecraft.item.ItemUseContext;
|
||||
|
@ -17,6 +16,7 @@ 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.Direction;
|
||||
import net.minecraft.util.Direction.Axis;
|
||||
|
@ -125,12 +125,23 @@ public class EncasedBeltBlock extends RotatedPillarKineticBlock {
|
|||
.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
|
||||
public BlockState updateAfterWrenched(BlockState newState, ItemUseContext context) {
|
||||
Blocks.AIR.getDefaultState()
|
||||
.updateNeighbors(context.getWorld(), context.getPos(), 1);
|
||||
// Blocks.AIR.getDefaultState()
|
||||
// .updateNeighbors(context.getWorld(), context.getPos(), 1);
|
||||
Axis axis = newState.get(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) {
|
||||
if (facing.getAxis() == axis)
|
||||
continue;
|
||||
|
@ -139,7 +150,7 @@ public class EncasedBeltBlock extends RotatedPillarKineticBlock {
|
|||
newState = updatePostPlacement(newState, facing, context.getWorld()
|
||||
.getBlockState(offset), context.getWorld(), pos, offset);
|
||||
}
|
||||
newState.updateNeighbors(context.getWorld(), context.getPos(), 1 | 2);
|
||||
// newState.updateNeighbors(context.getWorld(), context.getPos(), 1 | 2);
|
||||
return newState;
|
||||
}
|
||||
|
||||
|
@ -155,15 +166,8 @@ public class EncasedBeltBlock extends RotatedPillarKineticBlock {
|
|||
|
||||
public static boolean areBlocksConnected(BlockState state, BlockState other, Direction facing) {
|
||||
Part part = state.get(PART);
|
||||
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);
|
||||
|
||||
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);
|
||||
Axis connectionAxis = getConnectionAxis(state);
|
||||
Axis otherConnectionAxis = getConnectionAxis(other);
|
||||
|
||||
if (otherConnectionAxis != connectionAxis)
|
||||
return false;
|
||||
|
@ -177,6 +181,14 @@ public class EncasedBeltBlock extends RotatedPillarKineticBlock {
|
|||
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) {
|
||||
float fromMod = 1;
|
||||
float toMod = 1;
|
||||
|
|
|
@ -14,7 +14,6 @@ import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld;
|
|||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.block.material.MaterialColor;
|
||||
import net.minecraft.item.BlockItemUseContext;
|
||||
import net.minecraft.particles.RedstoneParticleData;
|
||||
|
@ -114,6 +113,7 @@ public class GaugeBlock extends DirectionalAxisKineticBlock {
|
|||
return context.getFace();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean getAxisAlignmentForPlacement(BlockItemUseContext context) {
|
||||
return context.getPlacementHorizontalFacing().getAxis() != Axis.X;
|
||||
}
|
||||
|
@ -127,8 +127,7 @@ public class GaugeBlock extends DirectionalAxisKineticBlock {
|
|||
return false;
|
||||
if (getRotationAxis(state) == Axis.Y && face != state.get(FACING))
|
||||
return false;
|
||||
BlockState blockState = world.getBlockState(pos.offset(face));
|
||||
if (Block.hasSolidSide(blockState, world, pos, face.getOpposite()) && blockState.getMaterial() != Material.GLASS
|
||||
if (!Block.shouldSideBeRendered(state, world, pos, face)
|
||||
&& !(world instanceof WrappedWorld))
|
||||
return false;
|
||||
return true;
|
||||
|
|
|
@ -44,7 +44,8 @@ public interface IWrenchable {
|
|||
}
|
||||
|
||||
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) {
|
||||
|
|
|
@ -5,6 +5,7 @@ import java.util.function.Supplier;
|
|||
import com.simibubi.create.foundation.networking.SimplePacketBase;
|
||||
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.entity.player.ServerPlayerEntity;
|
||||
import net.minecraft.network.PacketBuffer;
|
||||
import net.minecraft.util.Hand;
|
||||
|
@ -53,15 +54,20 @@ public class ExtendoGripInteractionPacket extends SimplePacketBase {
|
|||
|
||||
@Override
|
||||
public void handle(Supplier<Context> context) {
|
||||
context.get()
|
||||
.enqueueWork(() -> {
|
||||
ServerPlayerEntity sender = context.get()
|
||||
.getSender();
|
||||
context.get().enqueueWork(() -> {
|
||||
ServerPlayerEntity sender = context.get().getSender();
|
||||
if (sender == null)
|
||||
return;
|
||||
Entity entityByID = sender.getServerWorld()
|
||||
.getEntityByID(target);
|
||||
Entity entityByID = sender.getServerWorld().getEntityByID(target);
|
||||
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)
|
||||
sender.attackTargetEntityWithCurrentItem(entityByID);
|
||||
else if (specificPoint == null)
|
||||
|
@ -70,8 +76,7 @@ public class ExtendoGripInteractionPacket extends SimplePacketBase {
|
|||
entityByID.applyPlayerInteraction(sender, specificPoint, interactionHand);
|
||||
}
|
||||
});
|
||||
context.get()
|
||||
.setPacketHandled(true);
|
||||
context.get().setPacketHandled(true);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -10,6 +10,7 @@ import com.simibubi.create.foundation.item.ItemDescription;
|
|||
import com.simibubi.create.foundation.networking.AllPackets;
|
||||
import com.simibubi.create.foundation.utility.BlockHelper;
|
||||
import com.simibubi.create.foundation.utility.Lang;
|
||||
import com.simibubi.create.foundation.utility.NBTProcessors;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
|
@ -115,7 +116,7 @@ public abstract class ZapperItem extends Item {
|
|||
});
|
||||
applyCooldown(player, item, false);
|
||||
}
|
||||
return new ActionResult<ItemStack>(ActionResultType.SUCCESS, item);
|
||||
return new ActionResult<>(ActionResultType.SUCCESS, item);
|
||||
}
|
||||
|
||||
boolean mainHand = hand == Hand.MAIN_HAND;
|
||||
|
@ -125,7 +126,7 @@ public abstract class ZapperItem extends Item {
|
|||
|
||||
// Pass To Offhand
|
||||
if (mainHand && isSwap && gunInOtherHand)
|
||||
return new ActionResult<ItemStack>(ActionResultType.FAIL, item);
|
||||
return new ActionResult<>(ActionResultType.FAIL, item);
|
||||
if (mainHand && !isSwap && gunInOtherHand)
|
||||
item.getTag()
|
||||
.putBoolean("_Swap", true);
|
||||
|
@ -144,7 +145,7 @@ public abstract class ZapperItem extends Item {
|
|||
world.playSound(player, player.getPosition(), AllSoundEvents.BLOCKZAPPER_DENY.get(), SoundCategory.BLOCKS,
|
||||
1f, 0.5f);
|
||||
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();
|
||||
|
@ -169,7 +170,7 @@ public abstract class ZapperItem extends Item {
|
|||
// No target
|
||||
if (pos == null || stateReplaced.getBlock() == Blocks.AIR) {
|
||||
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
|
||||
|
@ -183,7 +184,7 @@ public abstract class ZapperItem extends Item {
|
|||
// Client side
|
||||
if (world.isRemote) {
|
||||
ZapperRenderHandler.dontAnimateItem(hand);
|
||||
return new ActionResult<ItemStack>(ActionResultType.SUCCESS, item);
|
||||
return new ActionResult<>(ActionResultType.SUCCESS, item);
|
||||
}
|
||||
|
||||
// Server side
|
||||
|
@ -195,7 +196,7 @@ public abstract class ZapperItem extends Item {
|
|||
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) {
|
||||
|
@ -240,10 +241,13 @@ public abstract class ZapperItem extends Item {
|
|||
return UseAction.NONE;
|
||||
}
|
||||
|
||||
public static void setTileData(World world, BlockPos pos, CompoundNBT data) {
|
||||
if (data != null) {
|
||||
public static void setTileData(World world, BlockPos pos, BlockState state, CompoundNBT data, PlayerEntity player) {
|
||||
if (data != null && AllBlockTags.SAFE_NBT.matches(state)) {
|
||||
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("y", pos.getY());
|
||||
data.putInt("z", pos.getZ());
|
||||
|
|
|
@ -135,7 +135,7 @@ public class BlockzapperItem extends ZapperItem {
|
|||
blocksnapshot.restore(true, false);
|
||||
return false;
|
||||
}
|
||||
setTileData(world, placed, data);
|
||||
setTileData(world, placed, state, data, player);
|
||||
|
||||
if (player instanceof ServerPlayerEntity && world instanceof ServerWorld) {
|
||||
ServerPlayerEntity serverPlayer = (ServerPlayerEntity) player;
|
||||
|
|
|
@ -10,6 +10,7 @@ import com.simibubi.create.foundation.utility.Lang;
|
|||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
|
@ -36,7 +37,7 @@ public enum TerrainTools {
|
|||
return this != Clear && this != Flatten;
|
||||
}
|
||||
|
||||
public void run(World world, List<BlockPos> targetPositions, Direction facing, @Nullable BlockState paintedState, @Nullable CompoundNBT data) {
|
||||
public void run(World world, List<BlockPos> targetPositions, Direction facing, @Nullable BlockState paintedState, @Nullable CompoundNBT data, PlayerEntity player) {
|
||||
switch (this) {
|
||||
case Clear:
|
||||
targetPositions.forEach(p -> world.setBlockState(p, Blocks.AIR.getDefaultState()));
|
||||
|
@ -47,7 +48,7 @@ public enum TerrainTools {
|
|||
if (!isReplaceable(toReplace))
|
||||
return;
|
||||
world.setBlockState(p, paintedState);
|
||||
ZapperItem.setTileData(world, p, data);
|
||||
ZapperItem.setTileData(world, p, paintedState, data, player);
|
||||
});
|
||||
break;
|
||||
case Flatten:
|
||||
|
@ -67,13 +68,13 @@ public enum TerrainTools {
|
|||
if (!isReplaceable(toReplace))
|
||||
return;
|
||||
world.setBlockState(p, paintedState);
|
||||
ZapperItem.setTileData(world, p, data);
|
||||
ZapperItem.setTileData(world, p, paintedState, data, player);
|
||||
});
|
||||
break;
|
||||
case Place:
|
||||
targetPositions.forEach(p -> {
|
||||
world.setBlockState(p, paintedState);
|
||||
ZapperItem.setTileData(world, p, data);
|
||||
ZapperItem.setTileData(world, p, paintedState, data, player);
|
||||
});
|
||||
break;
|
||||
case Replace:
|
||||
|
@ -82,7 +83,7 @@ public enum TerrainTools {
|
|||
if (isReplaceable(toReplace))
|
||||
return;
|
||||
world.setBlockState(p, paintedState);
|
||||
ZapperItem.setTileData(world, p, data);
|
||||
ZapperItem.setTileData(world, p, paintedState, data, player);
|
||||
});
|
||||
break;
|
||||
}
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue