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

This commit is contained in:
simibubi 2020-10-12 16:25:46 +02:00
commit df5008e7fd
74 changed files with 1414 additions and 155 deletions

View File

@ -1528,20 +1528,26 @@ bec8c280b717306f87050b08a418feab53be71cb data/create/advancements/recipes/create
5af08853632fb5970fe542b3ecbde0ad16d64714 data/create/advancements/recipes/create.base/crafting/kinetics/belt_connector.json 5af08853632fb5970fe542b3ecbde0ad16d64714 data/create/advancements/recipes/create.base/crafting/kinetics/belt_connector.json
80d87f1dde60adb5334e0cff25a9f0b7f67c1526 data/create/advancements/recipes/create.base/crafting/kinetics/black_seat.json 80d87f1dde60adb5334e0cff25a9f0b7f67c1526 data/create/advancements/recipes/create.base/crafting/kinetics/black_seat.json
771e2fc2f3be2867f6d83af8030ed321c0b8ab8d data/create/advancements/recipes/create.base/crafting/kinetics/black_seat_from_other_seat.json 771e2fc2f3be2867f6d83af8030ed321c0b8ab8d data/create/advancements/recipes/create.base/crafting/kinetics/black_seat_from_other_seat.json
86d3e8ba30723ad87e32a589171a35ca907b5db9 data/create/advancements/recipes/create.base/crafting/kinetics/black_valve_handle_from_other_valve_handle.json
ffbe212a442084b0688bbee82ad71c482c9b032c data/create/advancements/recipes/create.base/crafting/kinetics/blue_seat.json ffbe212a442084b0688bbee82ad71c482c9b032c data/create/advancements/recipes/create.base/crafting/kinetics/blue_seat.json
2cc2a11839ad826340fcc7bca1aa1a4d92953b96 data/create/advancements/recipes/create.base/crafting/kinetics/blue_seat_from_other_seat.json 2cc2a11839ad826340fcc7bca1aa1a4d92953b96 data/create/advancements/recipes/create.base/crafting/kinetics/blue_seat_from_other_seat.json
17ffdf52575a3905a8b6372f749858604334c5f0 data/create/advancements/recipes/create.base/crafting/kinetics/blue_valve_handle_from_other_valve_handle.json
0a49cc7cb958c64de1dd35b0acd30070d6a0d81d data/create/advancements/recipes/create.base/crafting/kinetics/brass_hand.json 0a49cc7cb958c64de1dd35b0acd30070d6a0d81d data/create/advancements/recipes/create.base/crafting/kinetics/brass_hand.json
3d16de97e9821ea473d6fc8b22026cca9e9e172b data/create/advancements/recipes/create.base/crafting/kinetics/brown_seat.json 3d16de97e9821ea473d6fc8b22026cca9e9e172b data/create/advancements/recipes/create.base/crafting/kinetics/brown_seat.json
5a53f4229ce56608207d430c7f87ee44f8d41f6f data/create/advancements/recipes/create.base/crafting/kinetics/brown_seat_from_other_seat.json 5a53f4229ce56608207d430c7f87ee44f8d41f6f data/create/advancements/recipes/create.base/crafting/kinetics/brown_seat_from_other_seat.json
d12c6127aa397138d490ccfcf31148fb3754b7a6 data/create/advancements/recipes/create.base/crafting/kinetics/brown_valve_handle_from_other_valve_handle.json
d3ca638ffbca177b4970f046f6c42770e757e33e data/create/advancements/recipes/create.base/crafting/kinetics/cart_assembler.json d3ca638ffbca177b4970f046f6c42770e757e33e data/create/advancements/recipes/create.base/crafting/kinetics/cart_assembler.json
1afaa6917411aa5c9fb1355588b481552bb0e3f8 data/create/advancements/recipes/create.base/crafting/kinetics/chute.json 1afaa6917411aa5c9fb1355588b481552bb0e3f8 data/create/advancements/recipes/create.base/crafting/kinetics/chute.json
a49a70403523bc9d4eadffdac5507806aca9fd9d data/create/advancements/recipes/create.base/crafting/kinetics/clockwork_bearing.json a49a70403523bc9d4eadffdac5507806aca9fd9d data/create/advancements/recipes/create.base/crafting/kinetics/clockwork_bearing.json
403fd0da8ee42a52234e544cf532e454fb80137b data/create/advancements/recipes/create.base/crafting/kinetics/clutch.json 403fd0da8ee42a52234e544cf532e454fb80137b data/create/advancements/recipes/create.base/crafting/kinetics/clutch.json
5bbaac432fce5435c8c3df56ec81d31a0b76a4ee data/create/advancements/recipes/create.base/crafting/kinetics/cogwheel.json 5bbaac432fce5435c8c3df56ec81d31a0b76a4ee data/create/advancements/recipes/create.base/crafting/kinetics/cogwheel.json
27930edef02aac6e74bfab62128688ecfb575008 data/create/advancements/recipes/create.base/crafting/kinetics/copper_valve_handle.json
512e4d45657f6df3df2639040e8c5e76f9119f17 data/create/advancements/recipes/create.base/crafting/kinetics/copper_valve_handle_from_others.json
7b80f6b25e1e21e9545120592bc1a3561ee49603 data/create/advancements/recipes/create.base/crafting/kinetics/crafter_slot_cover.json 7b80f6b25e1e21e9545120592bc1a3561ee49603 data/create/advancements/recipes/create.base/crafting/kinetics/crafter_slot_cover.json
7f55c18bdf5eafe2be65c7afb46ec40777f1aed8 data/create/advancements/recipes/create.base/crafting/kinetics/cuckoo_clock.json 7f55c18bdf5eafe2be65c7afb46ec40777f1aed8 data/create/advancements/recipes/create.base/crafting/kinetics/cuckoo_clock.json
44cf4c0a792e8742a030c82f92a529ade059b475 data/create/advancements/recipes/create.base/crafting/kinetics/cyan_seat.json 44cf4c0a792e8742a030c82f92a529ade059b475 data/create/advancements/recipes/create.base/crafting/kinetics/cyan_seat.json
80dc8151d0b9dff01a8a2abf6b84057c9ef5b908 data/create/advancements/recipes/create.base/crafting/kinetics/cyan_seat_from_other_seat.json 80dc8151d0b9dff01a8a2abf6b84057c9ef5b908 data/create/advancements/recipes/create.base/crafting/kinetics/cyan_seat_from_other_seat.json
2691122d20392bffa45a2b39c84555c90fe07e7d data/create/advancements/recipes/create.base/crafting/kinetics/cyan_valve_handle_from_other_valve_handle.json
9698f2e43c3edcf6bdc31f4b893cdaee2298476c data/create/advancements/recipes/create.base/crafting/kinetics/deployer.json 9698f2e43c3edcf6bdc31f4b893cdaee2298476c data/create/advancements/recipes/create.base/crafting/kinetics/deployer.json
9840f103d4094b04ebf8c1ffbe154e5698dd4d25 data/create/advancements/recipes/create.base/crafting/kinetics/depot.json 9840f103d4094b04ebf8c1ffbe154e5698dd4d25 data/create/advancements/recipes/create.base/crafting/kinetics/depot.json
81a3fe7e87c26767e3be6f97ea1de50f1cd74b65 data/create/advancements/recipes/create.base/crafting/kinetics/empty_blaze_burner.json 81a3fe7e87c26767e3be6f97ea1de50f1cd74b65 data/create/advancements/recipes/create.base/crafting/kinetics/empty_blaze_burner.json
@ -1550,26 +1556,33 @@ a49a70403523bc9d4eadffdac5507806aca9fd9d data/create/advancements/recipes/create
40bbc4d9df2911721a58481f68a6bd8cfcfbeb98 data/create/advancements/recipes/create.base/crafting/kinetics/filter.json 40bbc4d9df2911721a58481f68a6bd8cfcfbeb98 data/create/advancements/recipes/create.base/crafting/kinetics/filter.json
11d89eca0ccb0f1a8cd27acc9fc0c10d7bf83285 data/create/advancements/recipes/create.base/crafting/kinetics/fluid_pipe.json 11d89eca0ccb0f1a8cd27acc9fc0c10d7bf83285 data/create/advancements/recipes/create.base/crafting/kinetics/fluid_pipe.json
a2b33e972c7130cbf105f34d88dd7a9a53d5465c data/create/advancements/recipes/create.base/crafting/kinetics/fluid_tank.json a2b33e972c7130cbf105f34d88dd7a9a53d5465c data/create/advancements/recipes/create.base/crafting/kinetics/fluid_tank.json
a91b11ae44d9b1f479c6dee1f1a4580104059287 data/create/advancements/recipes/create.base/crafting/kinetics/fluid_valve.json
dae9e65a089955c0367dc1453e104c3153ebad79 data/create/advancements/recipes/create.base/crafting/kinetics/gearbox.json dae9e65a089955c0367dc1453e104c3153ebad79 data/create/advancements/recipes/create.base/crafting/kinetics/gearbox.json
8f9819912605cb2499cb3e79ecb0e709b0e38c19 data/create/advancements/recipes/create.base/crafting/kinetics/gearboxfrom_conversion.json 8f9819912605cb2499cb3e79ecb0e709b0e38c19 data/create/advancements/recipes/create.base/crafting/kinetics/gearboxfrom_conversion.json
94b8a1f976b9f853cb6e24b0cef72d2e16c3282f data/create/advancements/recipes/create.base/crafting/kinetics/gearshift.json 94b8a1f976b9f853cb6e24b0cef72d2e16c3282f data/create/advancements/recipes/create.base/crafting/kinetics/gearshift.json
1609e317d4dcd830be7356301f6685d71d87d34c data/create/advancements/recipes/create.base/crafting/kinetics/goggles.json 1609e317d4dcd830be7356301f6685d71d87d34c data/create/advancements/recipes/create.base/crafting/kinetics/goggles.json
585378d03f5ae23e43a587468d183951e3fa58a9 data/create/advancements/recipes/create.base/crafting/kinetics/gray_seat.json 585378d03f5ae23e43a587468d183951e3fa58a9 data/create/advancements/recipes/create.base/crafting/kinetics/gray_seat.json
f0a0c371c6851a5418b4b9480797677c8e871372 data/create/advancements/recipes/create.base/crafting/kinetics/gray_seat_from_other_seat.json f0a0c371c6851a5418b4b9480797677c8e871372 data/create/advancements/recipes/create.base/crafting/kinetics/gray_seat_from_other_seat.json
c023b9221d7983487d21e5ecc7d92246cfc7e791 data/create/advancements/recipes/create.base/crafting/kinetics/gray_valve_handle_from_other_valve_handle.json
72194ca0c9820e8b098534007df7f2b2d3813af6 data/create/advancements/recipes/create.base/crafting/kinetics/green_seat.json 72194ca0c9820e8b098534007df7f2b2d3813af6 data/create/advancements/recipes/create.base/crafting/kinetics/green_seat.json
2ba23f019a110a3e035a49e56ee8156fc11d74c0 data/create/advancements/recipes/create.base/crafting/kinetics/green_seat_from_other_seat.json 2ba23f019a110a3e035a49e56ee8156fc11d74c0 data/create/advancements/recipes/create.base/crafting/kinetics/green_seat_from_other_seat.json
9af3d92d11c3f520df3e22f3069042bf34585010 data/create/advancements/recipes/create.base/crafting/kinetics/green_valve_handle_from_other_valve_handle.json
dbb96a4db4ef8172af73a626bed9727278d804bd data/create/advancements/recipes/create.base/crafting/kinetics/hand_crank.json dbb96a4db4ef8172af73a626bed9727278d804bd data/create/advancements/recipes/create.base/crafting/kinetics/hand_crank.json
a71b626b6ee58a4eabee56f67c48f041a1323506 data/create/advancements/recipes/create.base/crafting/kinetics/large_cogwheel.json a71b626b6ee58a4eabee56f67c48f041a1323506 data/create/advancements/recipes/create.base/crafting/kinetics/large_cogwheel.json
eb007bb079bbe6b6aaad2ca90f5af84261e3f8ea data/create/advancements/recipes/create.base/crafting/kinetics/light_blue_seat.json eb007bb079bbe6b6aaad2ca90f5af84261e3f8ea data/create/advancements/recipes/create.base/crafting/kinetics/light_blue_seat.json
571da50fbf5f2fcd3363b3dab91e7233e0ebffa0 data/create/advancements/recipes/create.base/crafting/kinetics/light_blue_seat_from_other_seat.json 571da50fbf5f2fcd3363b3dab91e7233e0ebffa0 data/create/advancements/recipes/create.base/crafting/kinetics/light_blue_seat_from_other_seat.json
ddd80e84a7d595bbb3cf405a902ebbfd4ea5263c data/create/advancements/recipes/create.base/crafting/kinetics/light_blue_valve_handle_from_other_valve_handle.json
e72a9e36ee72b838d83dee29129085c9717bd1c0 data/create/advancements/recipes/create.base/crafting/kinetics/light_gray_seat.json e72a9e36ee72b838d83dee29129085c9717bd1c0 data/create/advancements/recipes/create.base/crafting/kinetics/light_gray_seat.json
b670caaa6822ba7d9dc59ab4b6f21ab7d1ab2482 data/create/advancements/recipes/create.base/crafting/kinetics/light_gray_seat_from_other_seat.json b670caaa6822ba7d9dc59ab4b6f21ab7d1ab2482 data/create/advancements/recipes/create.base/crafting/kinetics/light_gray_seat_from_other_seat.json
ef79bf45e7aa43374d05a258ccb62a8243047fbb data/create/advancements/recipes/create.base/crafting/kinetics/light_gray_valve_handle_from_other_valve_handle.json
471b41b1beb16be7885b32e3ab5e37e835888ed3 data/create/advancements/recipes/create.base/crafting/kinetics/lime_seat.json 471b41b1beb16be7885b32e3ab5e37e835888ed3 data/create/advancements/recipes/create.base/crafting/kinetics/lime_seat.json
7621220bcda54b559156a5dfb047de3429f1d4d2 data/create/advancements/recipes/create.base/crafting/kinetics/lime_seat_from_other_seat.json 7621220bcda54b559156a5dfb047de3429f1d4d2 data/create/advancements/recipes/create.base/crafting/kinetics/lime_seat_from_other_seat.json
0ce3062d3094ac20cc191b37fe948b54afe1f939 data/create/advancements/recipes/create.base/crafting/kinetics/lime_valve_handle_from_other_valve_handle.json
4375ad2e70aa1311d86093983b4342fcc25fa3f8 data/create/advancements/recipes/create.base/crafting/kinetics/linear_chassis.json 4375ad2e70aa1311d86093983b4342fcc25fa3f8 data/create/advancements/recipes/create.base/crafting/kinetics/linear_chassis.json
88cf153c96c72c6945f4de7c11523bfd82905e61 data/create/advancements/recipes/create.base/crafting/kinetics/linear_chassisfrom_conversion.json 88cf153c96c72c6945f4de7c11523bfd82905e61 data/create/advancements/recipes/create.base/crafting/kinetics/linear_chassisfrom_conversion.json
bf36904e7e691a150379561fb6f945123ebd3978 data/create/advancements/recipes/create.base/crafting/kinetics/magenta_seat.json bf36904e7e691a150379561fb6f945123ebd3978 data/create/advancements/recipes/create.base/crafting/kinetics/magenta_seat.json
da90875fb845ee952ca2cb71f96b8de4f6420c21 data/create/advancements/recipes/create.base/crafting/kinetics/magenta_seat_from_other_seat.json da90875fb845ee952ca2cb71f96b8de4f6420c21 data/create/advancements/recipes/create.base/crafting/kinetics/magenta_seat_from_other_seat.json
8ae8701f89b0881fbf9fcdf18b550e4bdf8d1483 data/create/advancements/recipes/create.base/crafting/kinetics/magenta_valve_handle_from_other_valve_handle.json
3264bf9c4adeea21b250c65a78a7ef9c15fa9720 data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_bearing.json 3264bf9c4adeea21b250c65a78a7ef9c15fa9720 data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_bearing.json
d096f7343b42827c4832bf6c68e7d0135e21c8a9 data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_crafter.json d096f7343b42827c4832bf6c68e7d0135e21c8a9 data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_crafter.json
8e8bb7aa8da72913a69bc4792cfc61f8cf827386 data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_drill.json 8e8bb7aa8da72913a69bc4792cfc61f8cf827386 data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_drill.json
@ -1585,15 +1598,19 @@ d38e8ff9dd33558227678d69393b57a360caa28e data/create/advancements/recipes/create
afeb2a152697b68bc953986d6886cbe527c6d2b5 data/create/advancements/recipes/create.base/crafting/kinetics/nozzle.json afeb2a152697b68bc953986d6886cbe527c6d2b5 data/create/advancements/recipes/create.base/crafting/kinetics/nozzle.json
ccd49c33260333ba850d0b843c4913cb6371eee9 data/create/advancements/recipes/create.base/crafting/kinetics/orange_seat.json ccd49c33260333ba850d0b843c4913cb6371eee9 data/create/advancements/recipes/create.base/crafting/kinetics/orange_seat.json
0556cca38a52f819e7f786ffbf284d5ef3364d0a data/create/advancements/recipes/create.base/crafting/kinetics/orange_seat_from_other_seat.json 0556cca38a52f819e7f786ffbf284d5ef3364d0a data/create/advancements/recipes/create.base/crafting/kinetics/orange_seat_from_other_seat.json
58c0a2742e8f10e45a09cb97e40b542a58c7134b data/create/advancements/recipes/create.base/crafting/kinetics/orange_valve_handle_from_other_valve_handle.json
460240d4e8437b35c24262c5724884ae213e1b9c data/create/advancements/recipes/create.base/crafting/kinetics/pink_seat.json 460240d4e8437b35c24262c5724884ae213e1b9c data/create/advancements/recipes/create.base/crafting/kinetics/pink_seat.json
ca21e2192a2fea0f112764f96c928d337762158b data/create/advancements/recipes/create.base/crafting/kinetics/pink_seat_from_other_seat.json ca21e2192a2fea0f112764f96c928d337762158b data/create/advancements/recipes/create.base/crafting/kinetics/pink_seat_from_other_seat.json
6c11444884679c4dd03d43f5893fca5cdc271915 data/create/advancements/recipes/create.base/crafting/kinetics/pink_valve_handle_from_other_valve_handle.json
960d03f13b383fca0d9b7d3a2885da346d97c4ef data/create/advancements/recipes/create.base/crafting/kinetics/piston_extension_pole.json 960d03f13b383fca0d9b7d3a2885da346d97c4ef data/create/advancements/recipes/create.base/crafting/kinetics/piston_extension_pole.json
02258b70f1db3d91f0ccb5a5ffd362349f8f359d data/create/advancements/recipes/create.base/crafting/kinetics/propeller.json 02258b70f1db3d91f0ccb5a5ffd362349f8f359d data/create/advancements/recipes/create.base/crafting/kinetics/propeller.json
d2a430820a87c24104729eede57628c6a92b277e data/create/advancements/recipes/create.base/crafting/kinetics/purple_seat.json d2a430820a87c24104729eede57628c6a92b277e data/create/advancements/recipes/create.base/crafting/kinetics/purple_seat.json
8eb1319984a8bf9502d8fddb717b11a1ee082f39 data/create/advancements/recipes/create.base/crafting/kinetics/purple_seat_from_other_seat.json 8eb1319984a8bf9502d8fddb717b11a1ee082f39 data/create/advancements/recipes/create.base/crafting/kinetics/purple_seat_from_other_seat.json
a295c929f7c9b31fd97607f8f6a1f8c56c16c7c8 data/create/advancements/recipes/create.base/crafting/kinetics/purple_valve_handle_from_other_valve_handle.json
f80c4cf0e9c649609a8e615d2eefc603cec316cf data/create/advancements/recipes/create.base/crafting/kinetics/radial_chassis.json f80c4cf0e9c649609a8e615d2eefc603cec316cf data/create/advancements/recipes/create.base/crafting/kinetics/radial_chassis.json
f639481c8e1485019bf120463e67811b6d2d8ef9 data/create/advancements/recipes/create.base/crafting/kinetics/red_seat.json f639481c8e1485019bf120463e67811b6d2d8ef9 data/create/advancements/recipes/create.base/crafting/kinetics/red_seat.json
038e18d0815e7de55fc8fcb5fe7127cdad62210f data/create/advancements/recipes/create.base/crafting/kinetics/red_seat_from_other_seat.json 038e18d0815e7de55fc8fcb5fe7127cdad62210f data/create/advancements/recipes/create.base/crafting/kinetics/red_seat_from_other_seat.json
dba0696069fe0850120dc6e1ca1ab741b0fe6d21 data/create/advancements/recipes/create.base/crafting/kinetics/red_valve_handle_from_other_valve_handle.json
74522fbb454832fc0eefa5f52b82b7d7d4e9b7fb data/create/advancements/recipes/create.base/crafting/kinetics/rope_pulley.json 74522fbb454832fc0eefa5f52b82b7d7d4e9b7fb data/create/advancements/recipes/create.base/crafting/kinetics/rope_pulley.json
48e29ec1b301bf4857db06913ee340f49d61cdf9 data/create/advancements/recipes/create.base/crafting/kinetics/rotation_speed_controller.json 48e29ec1b301bf4857db06913ee340f49d61cdf9 data/create/advancements/recipes/create.base/crafting/kinetics/rotation_speed_controller.json
b463cf9343f8d08b8ed3e87f46a19facadd657b0 data/create/advancements/recipes/create.base/crafting/kinetics/secondary_linear_chassisfrom_conversion.json b463cf9343f8d08b8ed3e87f46a19facadd657b0 data/create/advancements/recipes/create.base/crafting/kinetics/secondary_linear_chassisfrom_conversion.json
@ -1611,9 +1628,11 @@ f3fc3d4fee0712906f833aa17185f0bacb21922f data/create/advancements/recipes/create
7c146cc51139c2a8e287a60c8d645fa6f6f48cb1 data/create/advancements/recipes/create.base/crafting/kinetics/whisk.json 7c146cc51139c2a8e287a60c8d645fa6f6f48cb1 data/create/advancements/recipes/create.base/crafting/kinetics/whisk.json
37e545b016a7c5cd283168ac71ace6467a5ad3ef data/create/advancements/recipes/create.base/crafting/kinetics/white_seat.json 37e545b016a7c5cd283168ac71ace6467a5ad3ef data/create/advancements/recipes/create.base/crafting/kinetics/white_seat.json
856760c4b120f7b29a94dd22fe04d62df061d409 data/create/advancements/recipes/create.base/crafting/kinetics/white_seat_from_other_seat.json 856760c4b120f7b29a94dd22fe04d62df061d409 data/create/advancements/recipes/create.base/crafting/kinetics/white_seat_from_other_seat.json
b73e6f8b89e6ef94167b6fa3d0837a27222edb01 data/create/advancements/recipes/create.base/crafting/kinetics/white_valve_handle_from_other_valve_handle.json
ddbe7ae23f48dcaee3ad44a0e597c24380b51682 data/create/advancements/recipes/create.base/crafting/kinetics/wrench.json ddbe7ae23f48dcaee3ad44a0e597c24380b51682 data/create/advancements/recipes/create.base/crafting/kinetics/wrench.json
14c1cac4545f544a78bfd80cf7dd6355794c6679 data/create/advancements/recipes/create.base/crafting/kinetics/yellow_seat.json 14c1cac4545f544a78bfd80cf7dd6355794c6679 data/create/advancements/recipes/create.base/crafting/kinetics/yellow_seat.json
e8c2001863d9819d2a2c1fddeda41a4f126a5c09 data/create/advancements/recipes/create.base/crafting/kinetics/yellow_seat_from_other_seat.json e8c2001863d9819d2a2c1fddeda41a4f126a5c09 data/create/advancements/recipes/create.base/crafting/kinetics/yellow_seat_from_other_seat.json
f05bbae1e39eabb51dffa0babecf07f5de2cee3d data/create/advancements/recipes/create.base/crafting/kinetics/yellow_valve_handle_from_other_valve_handle.json
afc74c4dda92c4976703a1c488182188c3482839 data/create/advancements/recipes/create.base/crafting/logistics/adjustable_crate.json afc74c4dda92c4976703a1c488182188c3482839 data/create/advancements/recipes/create.base/crafting/logistics/adjustable_crate.json
146d55f3c5c9247c9992278873c6b8be890d733f data/create/advancements/recipes/create.base/crafting/logistics/adjustable_pulse_repeater.json 146d55f3c5c9247c9992278873c6b8be890d733f data/create/advancements/recipes/create.base/crafting/logistics/adjustable_pulse_repeater.json
4793d335955c9d6c293e1358dc227eac93a5fe61 data/create/advancements/recipes/create.base/crafting/logistics/adjustable_repeater.json 4793d335955c9d6c293e1358dc227eac93a5fe61 data/create/advancements/recipes/create.base/crafting/logistics/adjustable_repeater.json
@ -2486,20 +2505,26 @@ cf1f3a6306d47025cebe153cf05949ef69ccbe5a data/create/recipes/crafting/kinetics/a
dcf98e667d321fb4bd9fa6dfec7927a84cdbd5d6 data/create/recipes/crafting/kinetics/belt_connector.json dcf98e667d321fb4bd9fa6dfec7927a84cdbd5d6 data/create/recipes/crafting/kinetics/belt_connector.json
1123903a11b13448b61cf8f8a5dc2e8013d39ac0 data/create/recipes/crafting/kinetics/black_seat.json 1123903a11b13448b61cf8f8a5dc2e8013d39ac0 data/create/recipes/crafting/kinetics/black_seat.json
a6243a671bf852a6f92e1927e234ecf23b1c903d data/create/recipes/crafting/kinetics/black_seat_from_other_seat.json a6243a671bf852a6f92e1927e234ecf23b1c903d data/create/recipes/crafting/kinetics/black_seat_from_other_seat.json
c237d1cd362454b25d3756e742c4a2237b5ec2db data/create/recipes/crafting/kinetics/black_valve_handle_from_other_valve_handle.json
0b747fc291b86fa14f86569160d56a48a15c69d3 data/create/recipes/crafting/kinetics/blue_seat.json 0b747fc291b86fa14f86569160d56a48a15c69d3 data/create/recipes/crafting/kinetics/blue_seat.json
30240bae036699b8c9404893983cb7b70332159e data/create/recipes/crafting/kinetics/blue_seat_from_other_seat.json 30240bae036699b8c9404893983cb7b70332159e data/create/recipes/crafting/kinetics/blue_seat_from_other_seat.json
249c1f67d8b56262d286a027d50023e5d672b1c9 data/create/recipes/crafting/kinetics/blue_valve_handle_from_other_valve_handle.json
23fe800a45e81a08eb0aa732c5cb52e4e8ebfe86 data/create/recipes/crafting/kinetics/brass_hand.json 23fe800a45e81a08eb0aa732c5cb52e4e8ebfe86 data/create/recipes/crafting/kinetics/brass_hand.json
c50077a130bc43cd3659faa02ce95789399478b2 data/create/recipes/crafting/kinetics/brown_seat.json c50077a130bc43cd3659faa02ce95789399478b2 data/create/recipes/crafting/kinetics/brown_seat.json
a3c99b38fc8896c9971a5e9dcbae747786ff610d data/create/recipes/crafting/kinetics/brown_seat_from_other_seat.json a3c99b38fc8896c9971a5e9dcbae747786ff610d data/create/recipes/crafting/kinetics/brown_seat_from_other_seat.json
43233c87cfb80d57345a561c3dd2646c8d3c0d8a data/create/recipes/crafting/kinetics/brown_valve_handle_from_other_valve_handle.json
860796dce8756c4cd234f18bbe52108f3b2254c2 data/create/recipes/crafting/kinetics/cart_assembler.json 860796dce8756c4cd234f18bbe52108f3b2254c2 data/create/recipes/crafting/kinetics/cart_assembler.json
3bc3510b64e576d68b19f4ceb5d9bd6591dbcf6c data/create/recipes/crafting/kinetics/chute.json 3bc3510b64e576d68b19f4ceb5d9bd6591dbcf6c data/create/recipes/crafting/kinetics/chute.json
a80e3eabbeba2931d0d58dd9492018a0d78da8b5 data/create/recipes/crafting/kinetics/clockwork_bearing.json a80e3eabbeba2931d0d58dd9492018a0d78da8b5 data/create/recipes/crafting/kinetics/clockwork_bearing.json
501ad764d087b40ce36f3d4256b0d5ee25b2081e data/create/recipes/crafting/kinetics/clutch.json 501ad764d087b40ce36f3d4256b0d5ee25b2081e data/create/recipes/crafting/kinetics/clutch.json
e46bcc6778ff5118252fe6371ef817ae1302253a data/create/recipes/crafting/kinetics/cogwheel.json e46bcc6778ff5118252fe6371ef817ae1302253a data/create/recipes/crafting/kinetics/cogwheel.json
3093be508f6597eee2f3230cd9072f12d2821a6f data/create/recipes/crafting/kinetics/copper_valve_handle.json
886caa21481e62d44d70fd103f8d29f9bac64d60 data/create/recipes/crafting/kinetics/copper_valve_handle_from_others.json
59db5170cec390fe6c20a27d6154deebe044580c data/create/recipes/crafting/kinetics/crafter_slot_cover.json 59db5170cec390fe6c20a27d6154deebe044580c data/create/recipes/crafting/kinetics/crafter_slot_cover.json
cc2ab4b619aa55c03db18b67a62e12b6089e7019 data/create/recipes/crafting/kinetics/cuckoo_clock.json cc2ab4b619aa55c03db18b67a62e12b6089e7019 data/create/recipes/crafting/kinetics/cuckoo_clock.json
f11892864a26c4ba79eb46d890a1a4bd96a1ad93 data/create/recipes/crafting/kinetics/cyan_seat.json f11892864a26c4ba79eb46d890a1a4bd96a1ad93 data/create/recipes/crafting/kinetics/cyan_seat.json
8c35fd379244f72f73e1be6115ed8f5f5484f599 data/create/recipes/crafting/kinetics/cyan_seat_from_other_seat.json 8c35fd379244f72f73e1be6115ed8f5f5484f599 data/create/recipes/crafting/kinetics/cyan_seat_from_other_seat.json
dc62d932f6a3723e050cb043fea233efd685f775 data/create/recipes/crafting/kinetics/cyan_valve_handle_from_other_valve_handle.json
ad1c3ce1e98b8483512bdd754f2e5930c7b3ae85 data/create/recipes/crafting/kinetics/deployer.json ad1c3ce1e98b8483512bdd754f2e5930c7b3ae85 data/create/recipes/crafting/kinetics/deployer.json
be86df1c4d7af14bc5dcfe044d07c03b6c6d2a75 data/create/recipes/crafting/kinetics/depot.json be86df1c4d7af14bc5dcfe044d07c03b6c6d2a75 data/create/recipes/crafting/kinetics/depot.json
9c5d30f25a130d591b924c50e5c83e3b787c2758 data/create/recipes/crafting/kinetics/empty_blaze_burner.json 9c5d30f25a130d591b924c50e5c83e3b787c2758 data/create/recipes/crafting/kinetics/empty_blaze_burner.json
@ -2508,6 +2533,7 @@ e416a453316cc6a2f68795b0ab9c91a842d72510 data/create/recipes/crafting/kinetics/e
0dd0cc11eaa6789fc612af3231ed247893852178 data/create/recipes/crafting/kinetics/filter.json 0dd0cc11eaa6789fc612af3231ed247893852178 data/create/recipes/crafting/kinetics/filter.json
30ae02825e54c0cc07be8f4decf9d432e7d61ba2 data/create/recipes/crafting/kinetics/fluid_pipe.json 30ae02825e54c0cc07be8f4decf9d432e7d61ba2 data/create/recipes/crafting/kinetics/fluid_pipe.json
86ad4d2820e8e2b01de8d977af7796119dfb7430 data/create/recipes/crafting/kinetics/fluid_tank.json 86ad4d2820e8e2b01de8d977af7796119dfb7430 data/create/recipes/crafting/kinetics/fluid_tank.json
3dad2a849796df268cd3a06ed37376f2cc529957 data/create/recipes/crafting/kinetics/fluid_valve.json
84153bd478c0e63a04c77579d6595043f604b7ab data/create/recipes/crafting/kinetics/furnace_minecart_from_contraption_cart.json 84153bd478c0e63a04c77579d6595043f604b7ab data/create/recipes/crafting/kinetics/furnace_minecart_from_contraption_cart.json
5eb05cdf88bccdaddfe7ebfbd8b70d1196d422a6 data/create/recipes/crafting/kinetics/gearbox.json 5eb05cdf88bccdaddfe7ebfbd8b70d1196d422a6 data/create/recipes/crafting/kinetics/gearbox.json
b5da8c58f6b8aba525ae8a12ad906db37b78a566 data/create/recipes/crafting/kinetics/gearboxfrom_conversion.json b5da8c58f6b8aba525ae8a12ad906db37b78a566 data/create/recipes/crafting/kinetics/gearboxfrom_conversion.json
@ -2515,20 +2541,26 @@ b5da8c58f6b8aba525ae8a12ad906db37b78a566 data/create/recipes/crafting/kinetics/g
5b07af1b09125f874500c3fb140efda90061a19e data/create/recipes/crafting/kinetics/goggles.json 5b07af1b09125f874500c3fb140efda90061a19e data/create/recipes/crafting/kinetics/goggles.json
beb7715310352988d5a58d1b39c62f02544795f8 data/create/recipes/crafting/kinetics/gray_seat.json beb7715310352988d5a58d1b39c62f02544795f8 data/create/recipes/crafting/kinetics/gray_seat.json
14e8927183f91c09a2d96fd68d1a722d192b29e8 data/create/recipes/crafting/kinetics/gray_seat_from_other_seat.json 14e8927183f91c09a2d96fd68d1a722d192b29e8 data/create/recipes/crafting/kinetics/gray_seat_from_other_seat.json
b7fa20d10c0e0e7270b1c0d6f3881b8e25b39bea data/create/recipes/crafting/kinetics/gray_valve_handle_from_other_valve_handle.json
9899501f18e7f3452d4ab4bf658079ab414aa176 data/create/recipes/crafting/kinetics/green_seat.json 9899501f18e7f3452d4ab4bf658079ab414aa176 data/create/recipes/crafting/kinetics/green_seat.json
6f65a84e00f25d956a6ae834678ff781569b243a data/create/recipes/crafting/kinetics/green_seat_from_other_seat.json 6f65a84e00f25d956a6ae834678ff781569b243a data/create/recipes/crafting/kinetics/green_seat_from_other_seat.json
63edaccace961a65aa7bd406d36894c7ca4816b8 data/create/recipes/crafting/kinetics/green_valve_handle_from_other_valve_handle.json
9af4b862db77034f61d2d35e45db00f8dda6dc4b data/create/recipes/crafting/kinetics/hand_crank.json 9af4b862db77034f61d2d35e45db00f8dda6dc4b data/create/recipes/crafting/kinetics/hand_crank.json
237541c1c318b8426734c1c43be31fbd01413d39 data/create/recipes/crafting/kinetics/large_cogwheel.json 237541c1c318b8426734c1c43be31fbd01413d39 data/create/recipes/crafting/kinetics/large_cogwheel.json
a33e3301fc6d3a446e61a1c4b8a93aff079baeba data/create/recipes/crafting/kinetics/light_blue_seat.json a33e3301fc6d3a446e61a1c4b8a93aff079baeba data/create/recipes/crafting/kinetics/light_blue_seat.json
958bb5d3aeb8d8e5dbf5d97cf5fd9ff5151575dc data/create/recipes/crafting/kinetics/light_blue_seat_from_other_seat.json 958bb5d3aeb8d8e5dbf5d97cf5fd9ff5151575dc data/create/recipes/crafting/kinetics/light_blue_seat_from_other_seat.json
df1942d27ce3d0548872fe39d3cac24af3122b61 data/create/recipes/crafting/kinetics/light_blue_valve_handle_from_other_valve_handle.json
9531407075ad027e01063aeabc40ae3e4c100df3 data/create/recipes/crafting/kinetics/light_gray_seat.json 9531407075ad027e01063aeabc40ae3e4c100df3 data/create/recipes/crafting/kinetics/light_gray_seat.json
fb66f55b31a60f2168d3b9e80a56ecadebb1db75 data/create/recipes/crafting/kinetics/light_gray_seat_from_other_seat.json fb66f55b31a60f2168d3b9e80a56ecadebb1db75 data/create/recipes/crafting/kinetics/light_gray_seat_from_other_seat.json
e78fec9814d6d0c5c4669c17a8f4d86979972624 data/create/recipes/crafting/kinetics/light_gray_valve_handle_from_other_valve_handle.json
3e18f619a50c1e5fabd6d3acc6d029e4cfec661f data/create/recipes/crafting/kinetics/lime_seat.json 3e18f619a50c1e5fabd6d3acc6d029e4cfec661f data/create/recipes/crafting/kinetics/lime_seat.json
d214afbd44e580f5fd1ebb4f16f07ffe34d87cba data/create/recipes/crafting/kinetics/lime_seat_from_other_seat.json d214afbd44e580f5fd1ebb4f16f07ffe34d87cba data/create/recipes/crafting/kinetics/lime_seat_from_other_seat.json
505a6d895319b1c73509045ecf5d9dc4e8554cde data/create/recipes/crafting/kinetics/lime_valve_handle_from_other_valve_handle.json
61332f88f51bbd465ee0da879e706b994710d949 data/create/recipes/crafting/kinetics/linear_chassis.json 61332f88f51bbd465ee0da879e706b994710d949 data/create/recipes/crafting/kinetics/linear_chassis.json
9bf76daab65d048a135d70db522989ebc77ccaf1 data/create/recipes/crafting/kinetics/linear_chassisfrom_conversion.json 9bf76daab65d048a135d70db522989ebc77ccaf1 data/create/recipes/crafting/kinetics/linear_chassisfrom_conversion.json
d7d96071874a87edf7bbdcf7a462f95a130d2991 data/create/recipes/crafting/kinetics/magenta_seat.json d7d96071874a87edf7bbdcf7a462f95a130d2991 data/create/recipes/crafting/kinetics/magenta_seat.json
5836881feef8fa8b18e4cceb9c3a9a2748b8cf3a data/create/recipes/crafting/kinetics/magenta_seat_from_other_seat.json 5836881feef8fa8b18e4cceb9c3a9a2748b8cf3a data/create/recipes/crafting/kinetics/magenta_seat_from_other_seat.json
2ea43d6527dcb734578067ff442ec20395b0093b data/create/recipes/crafting/kinetics/magenta_valve_handle_from_other_valve_handle.json
946389078db31de69a7dc4fec5feebddf48dcfc3 data/create/recipes/crafting/kinetics/mechanical_bearing.json 946389078db31de69a7dc4fec5feebddf48dcfc3 data/create/recipes/crafting/kinetics/mechanical_bearing.json
a5c7aad0d86cbb66b8688d295e62547da4a2ce0f data/create/recipes/crafting/kinetics/mechanical_crafter.json a5c7aad0d86cbb66b8688d295e62547da4a2ce0f data/create/recipes/crafting/kinetics/mechanical_crafter.json
4372830100d39c4a89ff397a62b01940e1a28cb3 data/create/recipes/crafting/kinetics/mechanical_drill.json 4372830100d39c4a89ff397a62b01940e1a28cb3 data/create/recipes/crafting/kinetics/mechanical_drill.json
@ -2545,15 +2577,19 @@ be4c7fdb0ba1e9ee6d3dcf200dc2718ad83ec8fb data/create/recipes/crafting/kinetics/m
6b1b626394d7269a6861a836992ccdb344b6e7dd data/create/recipes/crafting/kinetics/nozzle.json 6b1b626394d7269a6861a836992ccdb344b6e7dd data/create/recipes/crafting/kinetics/nozzle.json
9c41cd91a0716d591ed6d1b5128ec731b418850f data/create/recipes/crafting/kinetics/orange_seat.json 9c41cd91a0716d591ed6d1b5128ec731b418850f data/create/recipes/crafting/kinetics/orange_seat.json
a8da214f0a521be1204b669f118348a142bc9a3d data/create/recipes/crafting/kinetics/orange_seat_from_other_seat.json a8da214f0a521be1204b669f118348a142bc9a3d data/create/recipes/crafting/kinetics/orange_seat_from_other_seat.json
2fa6b1dd7fe3c8d5bb60345d6b7c5213a54d7e31 data/create/recipes/crafting/kinetics/orange_valve_handle_from_other_valve_handle.json
af871a02d363a619fff8e9dde753aa417b265a80 data/create/recipes/crafting/kinetics/pink_seat.json af871a02d363a619fff8e9dde753aa417b265a80 data/create/recipes/crafting/kinetics/pink_seat.json
840dc5aac716e3d1b79883e8db4bf56f2dc427f9 data/create/recipes/crafting/kinetics/pink_seat_from_other_seat.json 840dc5aac716e3d1b79883e8db4bf56f2dc427f9 data/create/recipes/crafting/kinetics/pink_seat_from_other_seat.json
7e73bcde2b599f1ae5a241dd707c8ab6ce8c5a6e data/create/recipes/crafting/kinetics/pink_valve_handle_from_other_valve_handle.json
5399c3496a90bed9428c48fdd334ad4f763cbf9a data/create/recipes/crafting/kinetics/piston_extension_pole.json 5399c3496a90bed9428c48fdd334ad4f763cbf9a data/create/recipes/crafting/kinetics/piston_extension_pole.json
16199a6729005a279854cb1838401f6e73bdebae data/create/recipes/crafting/kinetics/propeller.json 16199a6729005a279854cb1838401f6e73bdebae data/create/recipes/crafting/kinetics/propeller.json
76ba751b65d312d1b34229d76fff2111b593091a data/create/recipes/crafting/kinetics/purple_seat.json 76ba751b65d312d1b34229d76fff2111b593091a data/create/recipes/crafting/kinetics/purple_seat.json
e6c462d64e1de9c7fca95f9c9a25b8d1575979da data/create/recipes/crafting/kinetics/purple_seat_from_other_seat.json e6c462d64e1de9c7fca95f9c9a25b8d1575979da data/create/recipes/crafting/kinetics/purple_seat_from_other_seat.json
9332957af2e72dee5fc78abcf1995773e08f7561 data/create/recipes/crafting/kinetics/purple_valve_handle_from_other_valve_handle.json
af84b939ced1c0254a27469f857f571afbadc4f6 data/create/recipes/crafting/kinetics/radial_chassis.json af84b939ced1c0254a27469f857f571afbadc4f6 data/create/recipes/crafting/kinetics/radial_chassis.json
1059f08b016e1c222f13bd9976d0fcd8fc982619 data/create/recipes/crafting/kinetics/red_seat.json 1059f08b016e1c222f13bd9976d0fcd8fc982619 data/create/recipes/crafting/kinetics/red_seat.json
0827e86e4b5f9d7023ccc19922bcbbaefd5b42d8 data/create/recipes/crafting/kinetics/red_seat_from_other_seat.json 0827e86e4b5f9d7023ccc19922bcbbaefd5b42d8 data/create/recipes/crafting/kinetics/red_seat_from_other_seat.json
5a10019d23726940152e26af3239d55d16bc7880 data/create/recipes/crafting/kinetics/red_valve_handle_from_other_valve_handle.json
af525e135eb927b64462120d201ecae7a7ec61ed data/create/recipes/crafting/kinetics/rope_pulley.json af525e135eb927b64462120d201ecae7a7ec61ed data/create/recipes/crafting/kinetics/rope_pulley.json
e9f1597d40f62c2247b319303f375f0da271346f data/create/recipes/crafting/kinetics/rotation_speed_controller.json e9f1597d40f62c2247b319303f375f0da271346f data/create/recipes/crafting/kinetics/rotation_speed_controller.json
66922e18791c87fadb7629cdf32d3dd2f50ccd13 data/create/recipes/crafting/kinetics/secondary_linear_chassisfrom_conversion.json 66922e18791c87fadb7629cdf32d3dd2f50ccd13 data/create/recipes/crafting/kinetics/secondary_linear_chassisfrom_conversion.json
@ -2571,9 +2607,11 @@ af5854ee2fa3be195ad9abcdeebe6ed7306b651c data/create/recipes/crafting/kinetics/s
f508d510576c93712e7f5265345a32e8818bbf0d data/create/recipes/crafting/kinetics/whisk.json f508d510576c93712e7f5265345a32e8818bbf0d data/create/recipes/crafting/kinetics/whisk.json
f4d88aa2edea548d29cf2678a111d8bb5db7720a data/create/recipes/crafting/kinetics/white_seat.json f4d88aa2edea548d29cf2678a111d8bb5db7720a data/create/recipes/crafting/kinetics/white_seat.json
7e0d276cd56f04f35d02c25810bffdf8fc297fcd data/create/recipes/crafting/kinetics/white_seat_from_other_seat.json 7e0d276cd56f04f35d02c25810bffdf8fc297fcd data/create/recipes/crafting/kinetics/white_seat_from_other_seat.json
4d3890621caa0bdbb752a395c1f5761dbbc1121e data/create/recipes/crafting/kinetics/white_valve_handle_from_other_valve_handle.json
3ec8bb5660656f1c676035d8ba5460462c1d1865 data/create/recipes/crafting/kinetics/wrench.json 3ec8bb5660656f1c676035d8ba5460462c1d1865 data/create/recipes/crafting/kinetics/wrench.json
5579e58473474c4e59efd1ee39ddf0140d66b618 data/create/recipes/crafting/kinetics/yellow_seat.json 5579e58473474c4e59efd1ee39ddf0140d66b618 data/create/recipes/crafting/kinetics/yellow_seat.json
f055d233ac7ee9eac840a658afa01bedd793ff38 data/create/recipes/crafting/kinetics/yellow_seat_from_other_seat.json f055d233ac7ee9eac840a658afa01bedd793ff38 data/create/recipes/crafting/kinetics/yellow_seat_from_other_seat.json
19c5c8bddeec51c9b47183c728e9ec4313c54410 data/create/recipes/crafting/kinetics/yellow_valve_handle_from_other_valve_handle.json
3f6f3a547dc06c9462da880360f29b49ac3f5e2a data/create/recipes/crafting/logistics/adjustable_crate.json 3f6f3a547dc06c9462da880360f29b49ac3f5e2a data/create/recipes/crafting/logistics/adjustable_crate.json
c465151b64381e2222203bf069b717435fdc2b26 data/create/recipes/crafting/logistics/adjustable_pulse_repeater.json c465151b64381e2222203bf069b717435fdc2b26 data/create/recipes/crafting/logistics/adjustable_pulse_repeater.json
34bcdffae0b104829161c86b7d161068f890daa2 data/create/recipes/crafting/logistics/adjustable_repeater.json 34bcdffae0b104829161c86b7d161068f890daa2 data/create/recipes/crafting/logistics/adjustable_repeater.json
@ -3137,17 +3175,19 @@ d3fdb8ece6cb072a93ddb64a0baad5ac952117a4 data/create/recipes/weathered_limestone
0f3c993eb6dd3f37953f304b8fad15bf60469ef4 data/create/recipes/weathered_limestone_cobblestone_wall_from_weathered_limestone_cobblestone_stonecutting.json 0f3c993eb6dd3f37953f304b8fad15bf60469ef4 data/create/recipes/weathered_limestone_cobblestone_wall_from_weathered_limestone_cobblestone_stonecutting.json
6eceb25fabbb6b389ca35de3b829ad061c9c456a data/create/recipes/weathered_limestone_pillar.json 6eceb25fabbb6b389ca35de3b829ad061c9c456a data/create/recipes/weathered_limestone_pillar.json
11667414f73bc2d00bda7c5c1a7d2934bf6e9165 data/create/recipes/weathered_limestone_pillar_from_weathered_limestone_stonecutting.json 11667414f73bc2d00bda7c5c1a7d2934bf6e9165 data/create/recipes/weathered_limestone_pillar_from_weathered_limestone_stonecutting.json
6d73642c6c64a8f7ebe6041218ac5a9fe2379e52 data/create/tags/blocks/brittle.json f9ecec40e11a87de73c9dc7c2963c1cb10b1a180 data/create/tags/blocks/brittle.json
246ee2ec4e778e38a362f319506564886d4e0e76 data/create/tags/blocks/fan_heaters.json 246ee2ec4e778e38a362f319506564886d4e0e76 data/create/tags/blocks/fan_heaters.json
798ef82869dbe22682121504a372e95607a785dc data/create/tags/blocks/fan_transparent.json 798ef82869dbe22682121504a372e95607a785dc data/create/tags/blocks/fan_transparent.json
74700d556ca80c7a1db5fd4efb09c3ddb26cad66 data/create/tags/blocks/non_movable.json 74700d556ca80c7a1db5fd4efb09c3ddb26cad66 data/create/tags/blocks/non_movable.json
6cdeeac1689f7b5bfd9bc40b462143d8eaf3ad0b data/create/tags/blocks/seats.json 6cdeeac1689f7b5bfd9bc40b462143d8eaf3ad0b data/create/tags/blocks/seats.json
50936b211d94167a35ec78c89954082a336b6269 data/create/tags/blocks/valve_handles.json
7fa13854a216ee49c0ae3b1e0e23c4cd1fbc4859 data/create/tags/blocks/windmill_sails.json 7fa13854a216ee49c0ae3b1e0e23c4cd1fbc4859 data/create/tags/blocks/windmill_sails.json
74700d556ca80c7a1db5fd4efb09c3ddb26cad66 data/create/tags/blocks/windowable.json 74700d556ca80c7a1db5fd4efb09c3ddb26cad66 data/create/tags/blocks/windowable.json
081f5aa35602fc27af2ca01ea9f2fd5e7eb284dc data/create/tags/items/create_ingots.json 081f5aa35602fc27af2ca01ea9f2fd5e7eb284dc data/create/tags/items/create_ingots.json
d2dc4ff179ef7b2aa9276455c196e15d44aa95a8 data/create/tags/items/crushed_ores.json d2dc4ff179ef7b2aa9276455c196e15d44aa95a8 data/create/tags/items/crushed_ores.json
6cdeeac1689f7b5bfd9bc40b462143d8eaf3ad0b data/create/tags/items/seats.json 6cdeeac1689f7b5bfd9bc40b462143d8eaf3ad0b data/create/tags/items/seats.json
abbe5d7cc9d1705509257888154ed7ca23292586 data/create/tags/items/upright_on_belt.json abbe5d7cc9d1705509257888154ed7ca23292586 data/create/tags/items/upright_on_belt.json
50936b211d94167a35ec78c89954082a336b6269 data/create/tags/items/valve_handles.json
16bcb8fcbe9170c2c11f1ca8d99d8b36cd812bbd data/forge/tags/blocks/glass/colorless.json 16bcb8fcbe9170c2c11f1ca8d99d8b36cd812bbd data/forge/tags/blocks/glass/colorless.json
81ced867d24ec814942909965dd4576eff1db685 data/forge/tags/blocks/glass_panes.json 81ced867d24ec814942909965dd4576eff1db685 data/forge/tags/blocks/glass_panes.json
4a0b13a9835106de9a1dd0a71a02372abb48e7b6 data/forge/tags/blocks/ores/copper.json 4a0b13a9835106de9a1dd0a71a02372abb48e7b6 data/forge/tags/blocks/ores/copper.json

View File

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"create:crafting/kinetics/black_valve_handle_from_other_valve_handle"
]
},
"criteria": {
"has_valve": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"tag": "create:valve_handles"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "create:crafting/kinetics/black_valve_handle_from_other_valve_handle"
}
}
},
"requirements": [
[
"has_valve",
"has_the_recipe"
]
]
}

View File

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"create:crafting/kinetics/blue_valve_handle_from_other_valve_handle"
]
},
"criteria": {
"has_valve": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"tag": "create:valve_handles"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "create:crafting/kinetics/blue_valve_handle_from_other_valve_handle"
}
}
},
"requirements": [
[
"has_valve",
"has_the_recipe"
]
]
}

View File

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"create:crafting/kinetics/brown_valve_handle_from_other_valve_handle"
]
},
"criteria": {
"has_valve": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"tag": "create:valve_handles"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "create:crafting/kinetics/brown_valve_handle_from_other_valve_handle"
}
}
},
"requirements": [
[
"has_valve",
"has_the_recipe"
]
]
}

View File

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

View File

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

View File

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"create:crafting/kinetics/cyan_valve_handle_from_other_valve_handle"
]
},
"criteria": {
"has_valve": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"tag": "create:valve_handles"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "create:crafting/kinetics/cyan_valve_handle_from_other_valve_handle"
}
}
},
"requirements": [
[
"has_valve",
"has_the_recipe"
]
]
}

View File

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

View File

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"create:crafting/kinetics/gray_valve_handle_from_other_valve_handle"
]
},
"criteria": {
"has_valve": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"tag": "create:valve_handles"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "create:crafting/kinetics/gray_valve_handle_from_other_valve_handle"
}
}
},
"requirements": [
[
"has_valve",
"has_the_recipe"
]
]
}

View File

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"create:crafting/kinetics/green_valve_handle_from_other_valve_handle"
]
},
"criteria": {
"has_valve": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"tag": "create:valve_handles"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "create:crafting/kinetics/green_valve_handle_from_other_valve_handle"
}
}
},
"requirements": [
[
"has_valve",
"has_the_recipe"
]
]
}

View File

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"create:crafting/kinetics/light_blue_valve_handle_from_other_valve_handle"
]
},
"criteria": {
"has_valve": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"tag": "create:valve_handles"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "create:crafting/kinetics/light_blue_valve_handle_from_other_valve_handle"
}
}
},
"requirements": [
[
"has_valve",
"has_the_recipe"
]
]
}

View File

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"create:crafting/kinetics/light_gray_valve_handle_from_other_valve_handle"
]
},
"criteria": {
"has_valve": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"tag": "create:valve_handles"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "create:crafting/kinetics/light_gray_valve_handle_from_other_valve_handle"
}
}
},
"requirements": [
[
"has_valve",
"has_the_recipe"
]
]
}

View File

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"create:crafting/kinetics/lime_valve_handle_from_other_valve_handle"
]
},
"criteria": {
"has_valve": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"tag": "create:valve_handles"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "create:crafting/kinetics/lime_valve_handle_from_other_valve_handle"
}
}
},
"requirements": [
[
"has_valve",
"has_the_recipe"
]
]
}

View File

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"create:crafting/kinetics/magenta_valve_handle_from_other_valve_handle"
]
},
"criteria": {
"has_valve": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"tag": "create:valve_handles"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "create:crafting/kinetics/magenta_valve_handle_from_other_valve_handle"
}
}
},
"requirements": [
[
"has_valve",
"has_the_recipe"
]
]
}

View File

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"create:crafting/kinetics/orange_valve_handle_from_other_valve_handle"
]
},
"criteria": {
"has_valve": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"tag": "create:valve_handles"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "create:crafting/kinetics/orange_valve_handle_from_other_valve_handle"
}
}
},
"requirements": [
[
"has_valve",
"has_the_recipe"
]
]
}

View File

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"create:crafting/kinetics/pink_valve_handle_from_other_valve_handle"
]
},
"criteria": {
"has_valve": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"tag": "create:valve_handles"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "create:crafting/kinetics/pink_valve_handle_from_other_valve_handle"
}
}
},
"requirements": [
[
"has_valve",
"has_the_recipe"
]
]
}

View File

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"create:crafting/kinetics/purple_valve_handle_from_other_valve_handle"
]
},
"criteria": {
"has_valve": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"tag": "create:valve_handles"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "create:crafting/kinetics/purple_valve_handle_from_other_valve_handle"
}
}
},
"requirements": [
[
"has_valve",
"has_the_recipe"
]
]
}

View File

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"create:crafting/kinetics/red_valve_handle_from_other_valve_handle"
]
},
"criteria": {
"has_valve": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"tag": "create:valve_handles"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "create:crafting/kinetics/red_valve_handle_from_other_valve_handle"
}
}
},
"requirements": [
[
"has_valve",
"has_the_recipe"
]
]
}

View File

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"create:crafting/kinetics/white_valve_handle_from_other_valve_handle"
]
},
"criteria": {
"has_valve": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"tag": "create:valve_handles"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "create:crafting/kinetics/white_valve_handle_from_other_valve_handle"
}
}
},
"requirements": [
[
"has_valve",
"has_the_recipe"
]
]
}

View File

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"create:crafting/kinetics/yellow_valve_handle_from_other_valve_handle"
]
},
"criteria": {
"has_valve": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"tag": "create:valve_handles"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "create:crafting/kinetics/yellow_valve_handle_from_other_valve_handle"
}
}
},
"requirements": [
[
"has_valve",
"has_the_recipe"
]
]
}

View File

@ -0,0 +1,18 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"#",
"-"
],
"key": {
"#": {
"tag": "forge:dyes/black"
},
"-": {
"tag": "create:valve_handles"
}
},
"result": {
"item": "create:black_valve_handle"
}
}

View File

@ -0,0 +1,18 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"#",
"-"
],
"key": {
"#": {
"tag": "forge:dyes/blue"
},
"-": {
"tag": "create:valve_handles"
}
},
"result": {
"item": "create:blue_valve_handle"
}
}

View File

@ -0,0 +1,18 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"#",
"-"
],
"key": {
"#": {
"tag": "forge:dyes/brown"
},
"-": {
"tag": "create:valve_handles"
}
},
"result": {
"item": "create:brown_valve_handle"
}
}

View File

@ -0,0 +1,18 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"CCC",
" S "
],
"key": {
"S": {
"item": "create:andesite_alloy"
},
"C": {
"tag": "forge:plates/copper"
}
},
"result": {
"item": "create:copper_valve_handle"
}
}

View File

@ -0,0 +1,11 @@
{
"type": "minecraft:crafting_shapeless",
"ingredients": [
{
"tag": "create:valve_handles"
}
],
"result": {
"item": "create:copper_valve_handle"
}
}

View File

@ -0,0 +1,18 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"#",
"-"
],
"key": {
"#": {
"tag": "forge:dyes/cyan"
},
"-": {
"tag": "create:valve_handles"
}
},
"result": {
"item": "create:cyan_valve_handle"
}
}

View File

@ -0,0 +1,22 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"I",
"S",
"P"
],
"key": {
"P": {
"item": "create:shaft"
},
"S": {
"item": "create:fluid_pipe"
},
"I": {
"tag": "forge:plates/iron"
}
},
"result": {
"item": "create:fluid_valve"
}
}

View File

@ -0,0 +1,18 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"#",
"-"
],
"key": {
"#": {
"tag": "forge:dyes/gray"
},
"-": {
"tag": "create:valve_handles"
}
},
"result": {
"item": "create:gray_valve_handle"
}
}

View File

@ -0,0 +1,18 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"#",
"-"
],
"key": {
"#": {
"tag": "forge:dyes/green"
},
"-": {
"tag": "create:valve_handles"
}
},
"result": {
"item": "create:green_valve_handle"
}
}

View File

@ -0,0 +1,18 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"#",
"-"
],
"key": {
"#": {
"tag": "forge:dyes/light_blue"
},
"-": {
"tag": "create:valve_handles"
}
},
"result": {
"item": "create:light_blue_valve_handle"
}
}

View File

@ -0,0 +1,18 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"#",
"-"
],
"key": {
"#": {
"tag": "forge:dyes/light_gray"
},
"-": {
"tag": "create:valve_handles"
}
},
"result": {
"item": "create:light_gray_valve_handle"
}
}

View File

@ -0,0 +1,18 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"#",
"-"
],
"key": {
"#": {
"tag": "forge:dyes/lime"
},
"-": {
"tag": "create:valve_handles"
}
},
"result": {
"item": "create:lime_valve_handle"
}
}

View File

@ -0,0 +1,18 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"#",
"-"
],
"key": {
"#": {
"tag": "forge:dyes/magenta"
},
"-": {
"tag": "create:valve_handles"
}
},
"result": {
"item": "create:magenta_valve_handle"
}
}

View File

@ -0,0 +1,18 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"#",
"-"
],
"key": {
"#": {
"tag": "forge:dyes/orange"
},
"-": {
"tag": "create:valve_handles"
}
},
"result": {
"item": "create:orange_valve_handle"
}
}

View File

@ -0,0 +1,18 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"#",
"-"
],
"key": {
"#": {
"tag": "forge:dyes/pink"
},
"-": {
"tag": "create:valve_handles"
}
},
"result": {
"item": "create:pink_valve_handle"
}
}

View File

@ -0,0 +1,18 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"#",
"-"
],
"key": {
"#": {
"tag": "forge:dyes/purple"
},
"-": {
"tag": "create:valve_handles"
}
},
"result": {
"item": "create:purple_valve_handle"
}
}

View File

@ -0,0 +1,18 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"#",
"-"
],
"key": {
"#": {
"tag": "forge:dyes/red"
},
"-": {
"tag": "create:valve_handles"
}
},
"result": {
"item": "create:red_valve_handle"
}
}

View File

@ -0,0 +1,18 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"#",
"-"
],
"key": {
"#": {
"tag": "forge:dyes/white"
},
"-": {
"tag": "create:valve_handles"
}
},
"result": {
"item": "create:white_valve_handle"
}
}

View File

@ -0,0 +1,18 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"#",
"-"
],
"key": {
"#": {
"tag": "forge:dyes/yellow"
},
"-": {
"tag": "create:valve_handles"
}
},
"result": {
"item": "create:yellow_valve_handle"
}
}

View File

@ -3,6 +3,7 @@
"values": [ "values": [
"create:nozzle", "create:nozzle",
"create:hand_crank", "create:hand_crank",
"create:copper_valve_handle",
"create:white_valve_handle", "create:white_valve_handle",
"create:orange_valve_handle", "create:orange_valve_handle",
"create:magenta_valve_handle", "create:magenta_valve_handle",
@ -19,7 +20,6 @@
"create:green_valve_handle", "create:green_valve_handle",
"create:red_valve_handle", "create:red_valve_handle",
"create:black_valve_handle", "create:black_valve_handle",
"create:copper_valve_handle",
"create:rope", "create:rope",
"create:pulley_magnet", "create:pulley_magnet",
"create:furnace_engine", "create:furnace_engine",

View File

@ -0,0 +1,22 @@
{
"replace": false,
"values": [
"create:copper_valve_handle",
"create:white_valve_handle",
"create:orange_valve_handle",
"create:magenta_valve_handle",
"create:light_blue_valve_handle",
"create:yellow_valve_handle",
"create:lime_valve_handle",
"create:pink_valve_handle",
"create:gray_valve_handle",
"create:light_gray_valve_handle",
"create:cyan_valve_handle",
"create:purple_valve_handle",
"create:blue_valve_handle",
"create:brown_valve_handle",
"create:green_valve_handle",
"create:red_valve_handle",
"create:black_valve_handle"
]
}

View File

@ -0,0 +1,22 @@
{
"replace": false,
"values": [
"create:copper_valve_handle",
"create:white_valve_handle",
"create:orange_valve_handle",
"create:magenta_valve_handle",
"create:light_blue_valve_handle",
"create:yellow_valve_handle",
"create:lime_valve_handle",
"create:pink_valve_handle",
"create:gray_valve_handle",
"create:light_gray_valve_handle",
"create:cyan_valve_handle",
"create:purple_valve_handle",
"create:blue_valve_handle",
"create:brown_valve_handle",
"create:green_valve_handle",
"create:red_valve_handle",
"create:black_valve_handle"
]
}

View File

@ -27,8 +27,8 @@ import com.simibubi.create.content.contraptions.components.actors.SeatMovementBe
import com.simibubi.create.content.contraptions.components.clock.CuckooClockBlock; import com.simibubi.create.content.contraptions.components.clock.CuckooClockBlock;
import com.simibubi.create.content.contraptions.components.crafter.CrafterCTBehaviour; import com.simibubi.create.content.contraptions.components.crafter.CrafterCTBehaviour;
import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterBlock; import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterBlock;
import com.simibubi.create.content.contraptions.components.crank.AllValveHandles;
import com.simibubi.create.content.contraptions.components.crank.HandCrankBlock; import com.simibubi.create.content.contraptions.components.crank.HandCrankBlock;
import com.simibubi.create.content.contraptions.components.crank.ValveHandleBlock;
import com.simibubi.create.content.contraptions.components.crusher.CrushingWheelBlock; import com.simibubi.create.content.contraptions.components.crusher.CrushingWheelBlock;
import com.simibubi.create.content.contraptions.components.crusher.CrushingWheelControllerBlock; import com.simibubi.create.content.contraptions.components.crusher.CrushingWheelControllerBlock;
import com.simibubi.create.content.contraptions.components.deployer.DeployerBlock; import com.simibubi.create.content.contraptions.components.deployer.DeployerBlock;
@ -508,8 +508,28 @@ public class AllBlocks {
.transform(customItemModel()) .transform(customItemModel())
.register(); .register();
public static final BlockEntry<ValveHandleBlock> COPPER_VALVE_HANDLE =
REGISTRATE.block("copper_valve_handle", ValveHandleBlock::copper)
.transform(BuilderTransformers.valveHandle(null))
.register();
public static final BlockEntry<?>[] DYED_VALVE_HANDLES = new BlockEntry<?>[DyeColor.values().length];
static { static {
AllValveHandles.register(REGISTRATE); for (DyeColor colour : DyeColor.values()) {
String colourName = colour.getName();
DYED_VALVE_HANDLES[colour.ordinal()] =
REGISTRATE.block(colourName + "_valve_handle", ValveHandleBlock::dyed)
.transform(BuilderTransformers.valveHandle(colour))
.recipe((c, p) -> ShapedRecipeBuilder.shapedRecipe(c.get())
.patternLine("#")
.patternLine("-")
.key('#', DyeHelper.getTagOfDye(colour))
.key('-', AllItemTags.VALVE_HANDLES.tag)
.addCriterion("has_valve", p.hasItem(AllItemTags.VALVE_HANDLES.tag))
.build(p, Create.asResource("crafting/kinetics/" + c.getName() + "_from_other_valve_handle")))
.register();
}
} }
public static final BlockEntry<FluidTankBlock> FLUID_TANK = REGISTRATE.block("fluid_tank", FluidTankBlock::new) public static final BlockEntry<FluidTankBlock> FLUID_TANK = REGISTRATE.block("fluid_tank", FluidTankBlock::new)

View File

@ -66,6 +66,7 @@ public class AllTags {
public static enum AllItemTags { public static enum AllItemTags {
CRUSHED_ORES(MOD), CRUSHED_ORES(MOD),
SEATS(MOD), SEATS(MOD),
VALVE_HANDLES(MOD),
UPRIGHT_ON_BELT(MOD), UPRIGHT_ON_BELT(MOD),
CREATE_INGOTS(MOD), CREATE_INGOTS(MOD),
BEACON_PAYMENT(FORGE), BEACON_PAYMENT(FORGE),
@ -104,7 +105,7 @@ public class AllTags {
} }
public static enum AllBlockTags { public static enum AllBlockTags {
WINDMILL_SAILS, FAN_HEATERS, WINDOWABLE, NON_MOVABLE, BRITTLE, SEATS, FAN_TRANSPARENT WINDMILL_SAILS, FAN_HEATERS, WINDOWABLE, NON_MOVABLE, BRITTLE, SEATS, VALVE_HANDLES, FAN_TRANSPARENT
; ;

View File

@ -11,7 +11,6 @@ import com.simibubi.create.content.contraptions.components.clock.CuckooClockRend
import com.simibubi.create.content.contraptions.components.clock.CuckooClockTileEntity; import com.simibubi.create.content.contraptions.components.clock.CuckooClockTileEntity;
import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterRenderer; import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterRenderer;
import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterTileEntity; import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterTileEntity;
import com.simibubi.create.content.contraptions.components.crank.AllValveHandles;
import com.simibubi.create.content.contraptions.components.crank.HandCrankRenderer; import com.simibubi.create.content.contraptions.components.crank.HandCrankRenderer;
import com.simibubi.create.content.contraptions.components.crank.HandCrankTileEntity; import com.simibubi.create.content.contraptions.components.crank.HandCrankTileEntity;
import com.simibubi.create.content.contraptions.components.crusher.CrushingWheelControllerTileEntity; import com.simibubi.create.content.contraptions.components.crusher.CrushingWheelControllerTileEntity;
@ -185,8 +184,8 @@ public class AllTileEntities {
public static final TileEntityEntry<HandCrankTileEntity> HAND_CRANK = Create.registrate() public static final TileEntityEntry<HandCrankTileEntity> HAND_CRANK = Create.registrate()
.tileEntity("hand_crank", HandCrankTileEntity::new) .tileEntity("hand_crank", HandCrankTileEntity::new)
.validBlocks(AllBlocks.HAND_CRANK) .validBlocks(AllBlocks.HAND_CRANK, AllBlocks.COPPER_VALVE_HANDLE)
.validBlocks(AllValveHandles.variants) .validBlocks(AllBlocks.DYED_VALVE_HANDLES)
.renderer(() -> HandCrankRenderer::new) .renderer(() -> HandCrankRenderer::new)
.register(); .register();

View File

@ -184,7 +184,7 @@ public class ConnectedInputHandler {
List<IItemHandlerModifiable> list = data.stream() List<IItemHandlerModifiable> list = data.stream()
.map(l -> CrafterHelper.getCrafter(world, pos.add(l))) .map(l -> CrafterHelper.getCrafter(world, pos.add(l)))
.filter(Objects::nonNull) .filter(Objects::nonNull)
.map(crafter -> crafter.inventory) .map(crafter -> crafter.getInventory())
.collect(Collectors.toList()); .collect(Collectors.toList());
return new CombinedInvWrapper(Arrays.copyOf(list.toArray(), list.size(), IItemHandlerModifiable[].class)); return new CombinedInvWrapper(Arrays.copyOf(list.toArray(), list.size(), IItemHandlerModifiable[].class));
} }

View File

@ -169,6 +169,9 @@ public class MechanicalCrafterBlock extends HorizontalKineticBlock implements IT
MechanicalCrafterTileEntity crafter = (MechanicalCrafterTileEntity) te; MechanicalCrafterTileEntity crafter = (MechanicalCrafterTileEntity) te;
boolean wrenched = AllItems.WRENCH.isIn(heldItem); boolean wrenched = AllItems.WRENCH.isIn(heldItem);
if (AllBlocks.MECHANICAL_ARM.isIn(heldItem))
return ActionResultType.PASS;
if (hit.getFace() == state.get(HORIZONTAL_FACING)) { if (hit.getFace() == state.get(HORIZONTAL_FACING)) {
if (crafter.phase != Phase.IDLE && !wrenched) { if (crafter.phase != Phase.IDLE && !wrenched) {
@ -202,7 +205,7 @@ public class MechanicalCrafterBlock extends HorizontalKineticBlock implements IT
return ActionResultType.SUCCESS; return ActionResultType.SUCCESS;
} }
ItemStack inSlot = crafter.inventory.getStackInSlot(0); ItemStack inSlot = crafter.getInventory().getStackInSlot(0);
if (inSlot.isEmpty()) { if (inSlot.isEmpty()) {
if (crafter.covered && !wrenched) { if (crafter.covered && !wrenched) {
if (worldIn.isRemote) if (worldIn.isRemote)
@ -221,7 +224,7 @@ public class MechanicalCrafterBlock extends HorizontalKineticBlock implements IT
if (worldIn.isRemote) if (worldIn.isRemote)
return ActionResultType.SUCCESS; return ActionResultType.SUCCESS;
player.inventory.placeItemBackInInventory(worldIn, inSlot); player.inventory.placeItemBackInInventory(worldIn, inSlot);
crafter.inventory.setStackInSlot(0, ItemStack.EMPTY); crafter.getInventory().setStackInSlot(0, ItemStack.EMPTY);
return ActionResultType.SUCCESS; return ActionResultType.SUCCESS;
} }

View File

@ -65,7 +65,7 @@ public class MechanicalCrafterRenderer extends SafeTileEntityRenderer<Mechanical
public void renderItems(MechanicalCrafterTileEntity te, float partialTicks, MatrixStack ms, public void renderItems(MechanicalCrafterTileEntity te, float partialTicks, MatrixStack ms,
IRenderTypeBuffer buffer, int light, int overlay) { IRenderTypeBuffer buffer, int light, int overlay) {
if (te.phase == Phase.IDLE) { if (te.phase == Phase.IDLE) {
ItemStack stack = te.inventory.getStackInSlot(0); ItemStack stack = te.getInventory().getStackInSlot(0);
if (!stack.isEmpty()) { if (!stack.isEmpty()) {
ms.push(); ms.push();
ms.translate(0, 0, -1 / 256f); ms.translate(0, 0, -1 / 256f);

View File

@ -14,6 +14,7 @@ import com.simibubi.create.AllItems;
import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.components.crafter.ConnectedInputHandler.ConnectedInput; import com.simibubi.create.content.contraptions.components.crafter.ConnectedInputHandler.ConnectedInput;
import com.simibubi.create.content.contraptions.components.crafter.RecipeGridHandler.GroupedItems; import com.simibubi.create.content.contraptions.components.crafter.RecipeGridHandler.GroupedItems;
import com.simibubi.create.foundation.item.SmartInventory;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.edgeInteraction.EdgeInteractionBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.edgeInteraction.EdgeInteractionBehaviour;
@ -38,7 +39,6 @@ import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemStackHandler;
public class MechanicalCrafterTileEntity extends KineticTileEntity { public class MechanicalCrafterTileEntity extends KineticTileEntity {
@ -46,34 +46,34 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
IDLE, ACCEPTING, ASSEMBLING, EXPORTING, WAITING, CRAFTING, INSERTING; IDLE, ACCEPTING, ASSEMBLING, EXPORTING, WAITING, CRAFTING, INSERTING;
} }
protected ItemStackHandler inventory = new ItemStackHandler(1) { static class Inventory extends SmartInventory {
@Override private MechanicalCrafterTileEntity te;
public int getSlotLimit(int slot) {
return 1; public Inventory(MechanicalCrafterTileEntity te) {
super(1, te, 1, false);
this.te = te;
forbidExtraction();
whenContentsChanged(slot -> {
if (getStackInSlot(slot).isEmpty())
return;
if(te.phase == Phase.IDLE)
te.checkCompletedRecipe(false);
});
} }
public ItemStack extractItem(int slot, int amount, boolean simulate) { @Override
return ItemStack.EMPTY;
};
public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) {
if (phase != Phase.IDLE) if (te.phase != Phase.IDLE)
return stack; return stack;
if (covered) if (te.covered)
return stack; return stack;
return super.insertItem(slot, stack, simulate); return super.insertItem(slot, stack, simulate);
}; }
protected void onContentsChanged(int slot) { }
if (!getStackInSlot(slot).isEmpty() && phase == Phase.IDLE)
checkCompletedRecipe(false); protected Inventory inventory;
markDirty();
sendData();
};
};
protected GroupedItems groupedItems = new GroupedItems(); protected GroupedItems groupedItems = new GroupedItems();
protected ConnectedInput input = new ConnectedInput(); protected ConnectedInput input = new ConnectedInput();
protected LazyOptional<IItemHandler> invSupplier = LazyOptional.of(() -> input.getItemHandler(world, pos)); protected LazyOptional<IItemHandler> invSupplier = LazyOptional.of(() -> input.getItemHandler(world, pos));
@ -92,7 +92,8 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
setLazyTickRate(20); setLazyTickRate(20);
phase = Phase.IDLE; phase = Phase.IDLE;
groupedItemsBeforeCraft = new GroupedItems(); groupedItemsBeforeCraft = new GroupedItems();
inventory = new Inventory(this);
// Does not get serialized due to active checking in tick // Does not get serialized due to active checking in tick
wasPoweredBefore = true; wasPoweredBefore = true;
} }
@ -480,4 +481,8 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
invSupplier = LazyOptional.of(() -> input.getItemHandler(world, pos)); invSupplier = LazyOptional.of(() -> input.getItemHandler(world, pos));
} }
public Inventory getInventory() {
return inventory;
}
} }

View File

@ -1,35 +0,0 @@
package com.simibubi.create.content.contraptions.components.crank;
import java.util.ArrayList;
import java.util.List;
import com.simibubi.create.AllTags;
import com.simibubi.create.foundation.data.CreateRegistrate;
import com.simibubi.create.foundation.data.SharedProperties;
import com.tterrag.registrate.util.entry.BlockEntry;
import net.minecraft.item.DyeColor;
public class AllValveHandles {
private static final List<String> types = new ArrayList<>();
static {
for (DyeColor color : DyeColor.values())
types.add(color.getString());
types.add("copper");
}
public static final BlockEntry<?>[] variants = new BlockEntry[types.size()];
public static void register(CreateRegistrate registrate) {
for (int i = 0; i < variants.length; i++) {
String type = types.get(i);
variants[i] = registrate.block(type + "_valve_handle", properties -> new ValveHandleBlock(properties, type.equals("copper")))
.initialProperties(SharedProperties::softMetal)
.blockstate((c, p) -> p.directionalBlock(c.get(), p.models()
.withExistingParent(type + "_valve_handle", p.modLoc("block/valve_handle"))
.texture("3", p.modLoc("block/valve_handle/valve_handle_" + type))))
.tag(AllTags.AllBlockTags.BRITTLE.tag)
.simpleItem()
.register();
}
}
}

View File

@ -5,8 +5,8 @@ import com.simibubi.create.AllShapes;
import com.simibubi.create.AllTileEntities; import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock; import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock;
import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.AllConfigs;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockRenderType;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;

View File

@ -1,8 +1,12 @@
package com.simibubi.create.content.contraptions.components.crank; package com.simibubi.create.content.contraptions.components.crank;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.ParametersAreNonnullByDefault; import javax.annotation.ParametersAreNonnullByDefault;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
import com.tterrag.registrate.util.entry.BlockEntry;
import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
@ -12,9 +16,20 @@ import net.minecraftforge.api.distmarker.OnlyIn;
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
public class ValveHandleBlock extends HandCrankBlock { public class ValveHandleBlock extends HandCrankBlock {
public static final List<BlockEntry<ValveHandleBlock>> entries = new ArrayList<>();
private final boolean inCreativeTab; private final boolean inCreativeTab;
public ValveHandleBlock(Properties properties, boolean inCreativeTab) { public static ValveHandleBlock copper(Properties properties) {
return new ValveHandleBlock(properties, true);
}
public static ValveHandleBlock dyed(Properties properties) {
return new ValveHandleBlock(properties, false);
}
private ValveHandleBlock(Properties properties, boolean inCreativeTab) {
super(properties); super(properties);
this.inCreativeTab = inCreativeTab; this.inCreativeTab = inCreativeTab;
} }

View File

@ -11,6 +11,7 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
import mcp.MethodsReturnNonnullByDefault; import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.material.PushReaction; import net.minecraft.block.material.PushReaction;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
@ -107,5 +108,17 @@ public class DeployerBlock extends DirectionalAxisKineticBlock implements ITE<De
public Class<DeployerTileEntity> getTileEntityClass() { public Class<DeployerTileEntity> getTileEntityClass() {
return DeployerTileEntity.class; return DeployerTileEntity.class;
} }
@Override
public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean isMoving) {
super.onBlockAdded(state, world, pos, oldState, isMoving);
withTileEntityDo(world, pos, DeployerTileEntity::redstoneUpdate);
}
@Override
public void neighborChanged(BlockState state, World world, BlockPos pos, Block p_220069_4_,
BlockPos p_220069_5_, boolean p_220069_6_) {
withTileEntityDo(world, pos, DeployerTileEntity::redstoneUpdate);
}
} }

View File

@ -50,6 +50,7 @@ public class DeployerTileEntity extends KineticTileEntity {
protected boolean boop = false; protected boolean boop = false;
protected List<ItemStack> overflowItems = new ArrayList<>(); protected List<ItemStack> overflowItems = new ArrayList<>();
protected FilteringBehaviour filtering; protected FilteringBehaviour filtering;
protected boolean redstoneLocked;
private LazyOptional<IItemHandlerModifiable> invHandler; private LazyOptional<IItemHandlerModifiable> invHandler;
private ListNBT deferredInventoryList; private ListNBT deferredInventoryList;
@ -66,6 +67,7 @@ public class DeployerTileEntity extends KineticTileEntity {
state = State.WAITING; state = State.WAITING;
mode = Mode.USE; mode = Mode.USE;
heldItem = ItemStack.EMPTY; heldItem = ItemStack.EMPTY;
redstoneLocked = false;
} }
@Override @Override
@ -149,6 +151,9 @@ public class DeployerTileEntity extends KineticTileEntity {
if (mode == Mode.PUNCH && !boop && startBoop(facing)) if (mode == Mode.PUNCH && !boop && startBoop(facing))
return; return;
if (redstoneLocked)
return;
state = State.EXPANDING; state = State.EXPANDING;
Vector3d movementVector = getMovementVector(); Vector3d movementVector = getMovementVector();
Vector3d rayOrigin = VecHelper.getCenterOf(pos) Vector3d rayOrigin = VecHelper.getCenterOf(pos)
@ -260,6 +265,8 @@ public class DeployerTileEntity extends KineticTileEntity {
state = NBTHelper.readEnum(compound, "State", State.class); state = NBTHelper.readEnum(compound, "State", State.class);
mode = NBTHelper.readEnum(compound, "Mode", Mode.class); mode = NBTHelper.readEnum(compound, "Mode", Mode.class);
timer = compound.getInt("Timer"); timer = compound.getInt("Timer");
redstoneLocked = compound.getBoolean("Powered");
deferredInventoryList = compound.getList("Inventory", NBT.TAG_COMPOUND); deferredInventoryList = compound.getList("Inventory", NBT.TAG_COMPOUND);
overflowItems = NBTHelper.readItemList(compound.getList("Overflow", NBT.TAG_COMPOUND)); overflowItems = NBTHelper.readItemList(compound.getList("Overflow", NBT.TAG_COMPOUND));
if (compound.contains("HeldItem")) if (compound.contains("HeldItem"))
@ -281,6 +288,8 @@ public class DeployerTileEntity extends KineticTileEntity {
NBTHelper.writeEnum(compound, "Mode", mode); NBTHelper.writeEnum(compound, "Mode", mode);
NBTHelper.writeEnum(compound, "State", state); NBTHelper.writeEnum(compound, "State", state);
compound.putInt("Timer", timer); compound.putInt("Timer", timer);
compound.putBoolean("Powered", redstoneLocked);
if (player != null) { if (player != null) {
compound.put("HeldItem", player.getHeldItemMainhand() compound.put("HeldItem", player.getHeldItemMainhand()
.serializeNBT()); .serializeNBT());
@ -308,6 +317,16 @@ public class DeployerTileEntity extends KineticTileEntity {
private IItemHandlerModifiable createHandler() { private IItemHandlerModifiable createHandler() {
return new DeployerItemHandler(this); return new DeployerItemHandler(this);
} }
public void redstoneUpdate() {
if (world.isRemote)
return;
boolean blockPowered = world.isBlockPowered(pos);
if (blockPowered == redstoneLocked)
return;
redstoneLocked = blockPowered;
sendData();
}
public AllBlockPartials getHandPose() { public AllBlockPartials getHandPose() {
return mode == Mode.PUNCH ? AllBlockPartials.DEPLOYER_HAND_PUNCHING return mode == Mode.PUNCH ? AllBlockPartials.DEPLOYER_HAND_PUNCHING

View File

@ -1,5 +1,7 @@
package com.simibubi.create.content.contraptions.components.fan; package com.simibubi.create.content.contraptions.components.fan;
import javax.annotation.Nullable;
import com.simibubi.create.AllTags.AllBlockTags; import com.simibubi.create.AllTags.AllBlockTags;
import com.simibubi.create.content.contraptions.base.GeneratingKineticTileEntity; import com.simibubi.create.content.contraptions.base.GeneratingKineticTileEntity;
import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock;
@ -17,8 +19,6 @@ import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nullable;
@MethodsReturnNonnullByDefault @MethodsReturnNonnullByDefault
public class EncasedFanTileEntity extends GeneratingKineticTileEntity implements IAirCurrentSource { public class EncasedFanTileEntity extends GeneratingKineticTileEntity implements IAirCurrentSource {

View File

@ -1,15 +1,16 @@
package com.simibubi.create.content.contraptions.components.fan; package com.simibubi.create.content.contraptions.components.fan;
import javax.annotation.Nullable;
import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.config.CKinetics; import com.simibubi.create.foundation.config.CKinetics;
import mcp.MethodsReturnNonnullByDefault; import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nullable;
@MethodsReturnNonnullByDefault @MethodsReturnNonnullByDefault
public interface IAirCurrentSource { public interface IAirCurrentSource {
@Nullable @Nullable

View File

@ -1,5 +1,7 @@
package com.simibubi.create.content.contraptions.particle; package com.simibubi.create.content.contraptions.particle;
import javax.annotation.Nonnull;
import com.simibubi.create.Create; import com.simibubi.create.Create;
import com.simibubi.create.content.contraptions.components.fan.IAirCurrentSource; import com.simibubi.create.content.contraptions.components.fan.IAirCurrentSource;
import com.simibubi.create.content.logistics.InWorldProcessing; import com.simibubi.create.content.logistics.InWorldProcessing;
@ -21,8 +23,6 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Vector3d; import net.minecraft.util.math.vector.Vector3d;
import javax.annotation.Nonnull;
public class AirFlowParticle extends SimpleAnimatedParticle { public class AirFlowParticle extends SimpleAnimatedParticle {
private final IAirCurrentSource source; private final IAirCurrentSource source;

View File

@ -59,7 +59,7 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt
public BasinTileEntity(TileEntityType<? extends BasinTileEntity> type) { public BasinTileEntity(TileEntityType<? extends BasinTileEntity> type) {
super(type); super(type);
inputInventory = new BasinInventory(9, this); inputInventory = new BasinInventory(9, this);
inputInventory.whenContentsChanged(() -> contentsChanged = true); inputInventory.whenContentsChanged($ -> contentsChanged = true);
outputInventory = new BasinInventory(9, this).forbidInsertion(); outputInventory = new BasinInventory(9, this).forbidInsertion();
itemCapability = LazyOptional.of(() -> new CombinedInvWrapper(inputInventory, outputInventory)); itemCapability = LazyOptional.of(() -> new CombinedInvWrapper(inputInventory, outputInventory));

View File

@ -42,6 +42,7 @@ import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.util.FakePlayer;
@MethodsReturnNonnullByDefault @MethodsReturnNonnullByDefault
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
@ -86,21 +87,29 @@ public class BlazeBurnerBlock extends Block implements ITE<BlazeBurnerTileEntity
@Override @Override
public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand,
BlockRayTraceResult blockRayTraceResult) { BlockRayTraceResult blockRayTraceResult) {
if (!hasTileEntity(state)) ItemStack heldItem = player.getHeldItem(hand);
boolean dontConsume = player.isCreative();
boolean forceOverflow = !(player instanceof FakePlayer);
if (!tryInsert(state, world, pos, dontConsume ? heldItem.copy() : heldItem, forceOverflow, false))
return ActionResultType.PASS; return ActionResultType.PASS;
return ActionResultType.SUCCESS;
}
public static boolean tryInsert(BlockState state, World world, BlockPos pos, ItemStack stack, boolean forceOverflow, boolean simulate) {
if (!state.hasTileEntity())
return false;
TileEntity te = world.getTileEntity(pos); TileEntity te = world.getTileEntity(pos);
if (!(te instanceof BlazeBurnerTileEntity)) if (!(te instanceof BlazeBurnerTileEntity))
return ActionResultType.PASS; return false;
BlazeBurnerTileEntity burnerTE = (BlazeBurnerTileEntity) te;
if (!((BlazeBurnerTileEntity) te).tryUpdateFuel(player.getHeldItem(hand), player)) if (!burnerTE.tryUpdateFuel(stack, forceOverflow, simulate))
return ActionResultType.PASS; return false;
if (!simulate && !world.isRemote)
if (!player.isCreative()) stack.shrink(1);
player.getHeldItem(hand) return true;
.shrink(1);
return ActionResultType.SUCCESS;
} }
@Override @Override

View File

@ -5,7 +5,6 @@ import java.util.Random;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.AllSoundEvents; import com.simibubi.create.AllSoundEvents;
import com.simibubi.create.content.contraptions.components.deployer.DeployerFakePlayer;
import com.simibubi.create.content.contraptions.particle.CubeParticleData; import com.simibubi.create.content.contraptions.particle.CubeParticleData;
import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
@ -15,7 +14,6 @@ import com.simibubi.create.foundation.utility.ColorHelper;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.client.entity.player.ClientPlayerEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.projectile.EggEntity; import net.minecraft.entity.projectile.EggEntity;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
@ -172,7 +170,7 @@ public class BlazeBurnerTileEntity extends SmartTileEntity {
/** /**
* @return true if the heater updated its burn time and a item should be consumed * @return true if the heater updated its burn time and a item should be consumed
*/ */
boolean tryUpdateFuel(ItemStack itemStack, PlayerEntity player) { boolean tryUpdateFuel(ItemStack itemStack, boolean forceOverflow, boolean simulate) {
FuelType newFuel = FuelType.NONE; FuelType newFuel = FuelType.NONE;
int burnTick = ForgeHooks.getBurnTime(itemStack); int burnTick = ForgeHooks.getBurnTime(itemStack);
if (burnTick > 0) if (burnTick > 0)
@ -186,20 +184,22 @@ public class BlazeBurnerTileEntity extends SmartTileEntity {
return false; return false;
if (newFuel == activeFuel) { if (newFuel == activeFuel) {
if (remainingBurnTime + burnTick > maxHeatCapacity && player instanceof DeployerFakePlayer) if (remainingBurnTime + burnTick > maxHeatCapacity && !forceOverflow)
return false; return false;
if (simulate)
return true;
remainingBurnTime = MathHelper.clamp(remainingBurnTime + burnTick, 0, maxHeatCapacity); remainingBurnTime = MathHelper.clamp(remainingBurnTime + burnTick, 0, maxHeatCapacity);
} else { } else {
if (simulate)
return true;
activeFuel = newFuel; activeFuel = newFuel;
remainingBurnTime = burnTick; remainingBurnTime = burnTick;
} }
updateHeatLevel(); updateHeatLevel();
HeatLevel level = getHeatLevel(); HeatLevel level = getHeatLevel();
for (int i = 0; i < 20; i++) { for (int i = 0; i < 20; i++)
spawnParticles(level, 1 + (.25 * (i / 4))); spawnParticles(level, 1 + (.25 * (i / 4)));
}
return true; return true;
} }

View File

@ -103,11 +103,10 @@ public class ZapperScreen extends AbstractSimiScreen {
} }
@Override @Override
public void onClose() { public void removed() {
CompoundNBT nbt = zapper.getTag(); CompoundNBT nbt = zapper.getTag();
writeAdditionalOptions(nbt); writeAdditionalOptions(nbt);
AllPackets.channel.sendToServer(new NbtPacket(zapper, offhand ? Hand.OFF_HAND : Hand.MAIN_HAND)); AllPackets.channel.sendToServer(new NbtPacket(zapper, offhand ? Hand.OFF_HAND : Hand.MAIN_HAND));
super.onClose();
} }
@Override @Override
@ -125,7 +124,7 @@ public class ZapperScreen extends AbstractSimiScreen {
} }
if (confirmButton.isHovered()) { if (confirmButton.isHovered()) {
Minecraft.getInstance().player.closeScreen(); onClose();
return true; return true;
} }

View File

@ -7,6 +7,8 @@ import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import javax.annotation.Nullable;
import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.content.contraptions.components.fan.SplashingRecipe; import com.simibubi.create.content.contraptions.components.fan.SplashingRecipe;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe;
@ -43,8 +45,6 @@ import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.ItemStackHandler;
import net.minecraftforge.items.wrapper.RecipeWrapper; import net.minecraftforge.items.wrapper.RecipeWrapper;
import javax.annotation.Nullable;
public class InWorldProcessing { public class InWorldProcessing {
public static class SplashingInv extends RecipeWrapper { public static class SplashingInv extends RecipeWrapper {

View File

@ -1,5 +1,11 @@
package com.simibubi.create.content.logistics.block.chute; package com.simibubi.create.content.logistics.block.chute;
import java.util.LinkedList;
import java.util.List;
import javax.annotation.Nullable;
import javax.annotation.ParametersAreNonnullByDefault;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.Create; import com.simibubi.create.Create;
import com.simibubi.create.content.contraptions.components.fan.AirCurrent; import com.simibubi.create.content.contraptions.components.fan.AirCurrent;
@ -23,6 +29,7 @@ import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemS
import com.simibubi.create.foundation.utility.BlockHelper; import com.simibubi.create.foundation.utility.BlockHelper;
import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import mcp.MethodsReturnNonnullByDefault; import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
@ -49,11 +56,6 @@ import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemHandlerHelper;
import javax.annotation.Nullable;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.LinkedList;
import java.util.List;
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault @MethodsReturnNonnullByDefault
public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInformation, IAirCurrentSource { public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInformation, IAirCurrentSource {

View File

@ -1,5 +1,7 @@
package com.simibubi.create.content.logistics.block.depot; package com.simibubi.create.content.logistics.block.depot;
import javax.annotation.ParametersAreNonnullByDefault;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllShapes; import com.simibubi.create.AllShapes;
import com.simibubi.create.AllTileEntities; import com.simibubi.create.AllTileEntities;
@ -29,8 +31,6 @@ import net.minecraft.world.IBlockReader;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.ItemStackHandler;
import javax.annotation.ParametersAreNonnullByDefault;
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault @MethodsReturnNonnullByDefault

View File

@ -5,7 +5,6 @@ import java.util.function.Function;
import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; import com.simibubi.create.content.contraptions.relays.belt.BeltHelper;
import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack;
import com.simibubi.create.content.logistics.InWorldProcessing;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour;

View File

@ -24,6 +24,7 @@ import net.minecraft.nbt.CompoundNBT;
import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.tileentity.TileEntityType; import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraftforge.items.ItemHandlerHelper;
public class FunnelTileEntity extends SmartTileEntity { public class FunnelTileEntity extends SmartTileEntity {
@ -95,9 +96,12 @@ public class FunnelTileEntity extends SmartTileEntity {
amountToExtract = 1; amountToExtract = 1;
Predicate<ItemStack> filter = s -> !filtering.isActive() || filtering.test(s); Predicate<ItemStack> filter = s -> !filtering.isActive() || filtering.test(s);
Function<ItemStack, Integer> amountThreshold = s -> s.getMaxStackSize() - invManipulation.simulate() Function<ItemStack, Integer> amountThreshold = s -> {
.insert(s) int maxStackSize = s.getMaxStackSize();
.getCount(); return maxStackSize - invManipulation.simulate()
.insert(ItemHandlerHelper.copyStackWithSize(s, maxStackSize))
.getCount();
};
if (amountToExtract != -1 && !invManipulation.simulate() if (amountToExtract != -1 && !invManipulation.simulate()
.insert(autoExtractor.simulate() .insert(autoExtractor.simulate()
@ -108,7 +112,7 @@ public class FunnelTileEntity extends SmartTileEntity {
ItemStack stack = autoExtractor.extract(amountToExtract, filter, amountThreshold); ItemStack stack = autoExtractor.extract(amountToExtract, filter, amountThreshold);
if (stack.isEmpty()) if (stack.isEmpty())
return; return;
onTransfer(stack); onTransfer(stack);
invManipulation.insert(stack); invManipulation.insert(stack);
startCooldown(); startCooldown();
@ -192,8 +196,9 @@ public class FunnelTileEntity extends SmartTileEntity {
BlockState blockState = getBlockState(); BlockState blockState = getBlockState();
boolean pushingToBelt = blockState.getBlock() instanceof HorizontalInteractionFunnelBlock boolean pushingToBelt = blockState.getBlock() instanceof HorizontalInteractionFunnelBlock
&& blockState.get(HorizontalInteractionFunnelBlock.PUSHING); && blockState.get(HorizontalInteractionFunnelBlock.PUSHING);
boolean hopper = FunnelBlock.getFunnelFacing(blockState) == Direction.UP && invManipulation.hasInventory() boolean hopper = FunnelBlock.getFunnelFacing(blockState) == Direction.UP && !world.getBlockState(pos.up())
&& autoExtractor.hasInventory(); .getMaterial()
.isReplaceable();
return pushingToBelt || hopper; return pushingToBelt || hopper;
} }
@ -259,9 +264,10 @@ public class FunnelTileEntity extends SmartTileEntity {
public double getMaxRenderDistanceSquared() { public double getMaxRenderDistanceSquared() {
return hasFlap() ? super.getMaxRenderDistanceSquared() : 64; return hasFlap() ? super.getMaxRenderDistanceSquared() : 64;
} }
public void onTransfer(ItemStack stack) { public void onTransfer(ItemStack stack) {
AllBlocks.CONTENT_OBSERVER.get().onFunnelTransfer(world, pos, stack); AllBlocks.CONTENT_OBSERVER.get()
.onFunnelTransfer(world, pos, stack);
} }
} }

View File

@ -58,6 +58,18 @@ public class ArmBlock extends KineticBlock implements ITE<ArmTileEntity> {
ISelectionContext p_220053_4_) { ISelectionContext p_220053_4_) {
return state.get(CEILING) ? AllShapes.MECHANICAL_ARM_CEILING : AllShapes.MECHANICAL_ARM; return state.get(CEILING) ? AllShapes.MECHANICAL_ARM_CEILING : AllShapes.MECHANICAL_ARM;
} }
@Override
public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean isMoving) {
super.onBlockAdded(state, world, pos, oldState, isMoving);
withTileEntityDo(world, pos, ArmTileEntity::redstoneUpdate);
}
@Override
public void neighborChanged(BlockState state, World world, BlockPos pos, Block p_220069_4_,
BlockPos p_220069_5_, boolean p_220069_6_) {
withTileEntityDo(world, pos, ArmTileEntity::redstoneUpdate);
}
@Override @Override
public Axis getRotationAxis(BlockState state) { public Axis getRotationAxis(BlockState state) {

View File

@ -8,11 +8,16 @@ import com.google.common.collect.ImmutableMap;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterBlock;
import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterTileEntity;
import com.simibubi.create.content.contraptions.components.deployer.DeployerBlock;
import com.simibubi.create.content.contraptions.components.saw.SawBlock; import com.simibubi.create.content.contraptions.components.saw.SawBlock;
import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock;
import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock;
import com.simibubi.create.content.logistics.block.funnel.FunnelBlock; import com.simibubi.create.content.logistics.block.funnel.FunnelBlock;
import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity; import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity;
import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.advancement.AllTriggers;
import com.simibubi.create.foundation.item.SmartInventory;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour;
@ -24,6 +29,7 @@ import net.minecraft.block.JukeboxBlock;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.item.MusicDiscItem;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.NBTUtil; import net.minecraft.nbt.NBTUtil;
import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.state.properties.BlockStateProperties;
@ -56,14 +62,17 @@ public abstract class ArmInteractionPoint {
private static ImmutableMap<ArmInteractionPoint, Supplier<ArmInteractionPoint>> POINTS = private static ImmutableMap<ArmInteractionPoint, Supplier<ArmInteractionPoint>> POINTS =
ImmutableMap.<ArmInteractionPoint, Supplier<ArmInteractionPoint>>builder() ImmutableMap.<ArmInteractionPoint, Supplier<ArmInteractionPoint>>builder()
.put(new Saw(), Saw::new)
.put(new Belt(), Belt::new) .put(new Belt(), Belt::new)
.put(new Depot(), Depot::new) .put(new Depot(), Depot::new)
.put(new Saw(), Saw::new)
.put(new Chute(), Chute::new) .put(new Chute(), Chute::new)
.put(new Jukebox(), Jukebox::new)
.put(new Basin(), Basin::new) .put(new Basin(), Basin::new)
.put(new Millstone(), Millstone::new)
.put(new Funnel(), Funnel::new) .put(new Funnel(), Funnel::new)
.put(new Jukebox(), Jukebox::new)
.put(new Crafter(), Crafter::new)
.put(new Deployer(), Deployer::new)
.put(new Millstone(), Millstone::new)
.put(new BlazeBurner(), BlazeBurner::new)
.put(new CrushingWheels(), CrushingWheels::new) .put(new CrushingWheels(), CrushingWheels::new)
.build(); .build();
@ -90,6 +99,10 @@ public abstract class ArmInteractionPoint {
return Direction.DOWN; return Direction.DOWN;
} }
boolean isStillValid(IBlockReader reader) {
return isValid(reader, pos, reader.getBlockState(pos));
}
abstract boolean isValid(IBlockReader reader, BlockPos pos, BlockState state); abstract boolean isValid(IBlockReader reader, BlockPos pos, BlockState state);
static boolean isInteractable(IBlockReader reader, BlockPos pos, BlockState state) { static boolean isInteractable(IBlockReader reader, BlockPos pos, BlockState state) {
@ -228,6 +241,84 @@ public abstract class ArmInteractionPoint {
} }
static class Deployer extends ArmInteractionPoint {
@Override
boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) {
return AllBlocks.DEPLOYER.has(state);
}
@Override
Direction getInteractionDirection() {
return state.get(DeployerBlock.FACING)
.getOpposite();
}
@Override
Vec3d getInteractionPositionVector() {
return super.getInteractionPositionVector()
.add(new Vec3d(getInteractionDirection().getDirectionVec()).scale(.65f));
}
}
static class BlazeBurner extends ArmInteractionPoint {
@Override
boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) {
return AllBlocks.BLAZE_BURNER.has(state);
}
@Override
ItemStack extract(World world, int slot, int amount, boolean simulate) {
return ItemStack.EMPTY;
}
@Override
ItemStack insert(World world, ItemStack stack, boolean simulate) {
boolean success = BlazeBurnerBlock.tryInsert(state, world, pos, stack.copy(), false, simulate);
return success ? ItemHandlerHelper.copyStackWithSize(stack, stack.getCount() - 1) : stack;
}
@Override
void cycleMode() {}
}
static class Crafter extends ArmInteractionPoint {
@Override
boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) {
return AllBlocks.MECHANICAL_CRAFTER.has(state);
}
@Override
Direction getInteractionDirection() {
return state.get(MechanicalCrafterBlock.HORIZONTAL_FACING)
.getOpposite();
}
@Override
ItemStack extract(World world, int slot, int amount, boolean simulate) {
TileEntity te = world.getTileEntity(pos);
if (!(te instanceof MechanicalCrafterTileEntity))
return ItemStack.EMPTY;
MechanicalCrafterTileEntity crafter = (MechanicalCrafterTileEntity) te;
SmartInventory inventory = crafter.getInventory();
inventory.allowExtraction();
ItemStack extract = super.extract(world, slot, amount, simulate);
inventory.forbidExtraction();
return extract;
}
@Override
Vec3d getInteractionPositionVector() {
return super.getInteractionPositionVector()
.add(new Vec3d(getInteractionDirection().getDirectionVec()).scale(.5f));
}
}
static class Basin extends ArmInteractionPoint { static class Basin extends ArmInteractionPoint {
@Override @Override
@ -261,6 +352,8 @@ public abstract class ArmInteractionPoint {
if (!jukeboxTE.getRecord() if (!jukeboxTE.getRecord()
.isEmpty()) .isEmpty())
return stack; return stack;
if (!(stack.getItem() instanceof MusicDiscItem))
return stack;
ItemStack remainder = stack.copy(); ItemStack remainder = stack.copy();
ItemStack toInsert = remainder.split(1); ItemStack toInsert = remainder.split(1);
if (!simulate && !world.isRemote) { if (!simulate && !world.isRemote) {

View File

@ -60,6 +60,7 @@ public class ArmTileEntity extends KineticTileEntity {
protected ScrollOptionBehaviour<SelectionMode> selectionMode; protected ScrollOptionBehaviour<SelectionMode> selectionMode;
protected int lastInputIndex = -1; protected int lastInputIndex = -1;
protected int lastOutputIndex = -1; protected int lastOutputIndex = -1;
protected boolean redstoneLocked;
enum Phase { enum Phase {
SEARCH_INPUTS, MOVE_TO_INPUT, SEARCH_OUTPUTS, MOVE_TO_OUTPUT, DANCING SEARCH_INPUTS, MOVE_TO_INPUT, SEARCH_OUTPUTS, MOVE_TO_OUTPUT, DANCING
@ -79,6 +80,7 @@ public class ArmTileEntity extends KineticTileEntity {
previousTarget = ArmAngleTarget.NO_TARGET; previousTarget = ArmAngleTarget.NO_TARGET;
previousBaseAngle = previousTarget.baseAngle; previousBaseAngle = previousTarget.baseAngle;
updateInteractionPoints = true; updateInteractionPoints = true;
redstoneLocked = false;
} }
@Override @Override
@ -188,6 +190,9 @@ public class ArmTileEntity extends KineticTileEntity {
} }
protected void searchForItem() { protected void searchForItem() {
if (redstoneLocked)
return;
boolean foundInput = false; boolean foundInput = false;
// for round robin, we start looking after the last used index, for default we // for round robin, we start looking after the last used index, for default we
// start at 0; // start at 0;
@ -201,6 +206,8 @@ public class ArmTileEntity extends KineticTileEntity {
InteractionPoints: for (int i = startIndex; i < scanRange; i++) { InteractionPoints: for (int i = startIndex; i < scanRange; i++) {
ArmInteractionPoint armInteractionPoint = inputs.get(i); ArmInteractionPoint armInteractionPoint = inputs.get(i);
if (!armInteractionPoint.isStillValid(world))
continue;
for (int j = 0; j < armInteractionPoint.getSlotCount(world); j++) { for (int j = 0; j < armInteractionPoint.getSlotCount(world); j++) {
if (getDistributableAmount(armInteractionPoint, j) == 0) if (getDistributableAmount(armInteractionPoint, j) == 0)
continue; continue;
@ -237,6 +244,9 @@ public class ArmTileEntity extends KineticTileEntity {
for (int i = startIndex; i < scanRange; i++) { for (int i = startIndex; i < scanRange; i++) {
ArmInteractionPoint armInteractionPoint = outputs.get(i); ArmInteractionPoint armInteractionPoint = outputs.get(i);
if (!armInteractionPoint.isStillValid(world))
continue;
ItemStack remainder = armInteractionPoint.insert(world, held, true); ItemStack remainder = armInteractionPoint.insert(world, held, true);
if (remainder.equals(heldItem, false)) if (remainder.equals(heldItem, false))
continue; continue;
@ -325,6 +335,18 @@ public class ArmTileEntity extends KineticTileEntity {
} }
return stack; return stack;
} }
public void redstoneUpdate() {
if (world.isRemote)
return;
boolean blockPowered = world.isBlockPowered(pos);
if (blockPowered == redstoneLocked)
return;
redstoneLocked = blockPowered;
sendData();
if (!redstoneLocked)
searchForItem();
}
protected void initInteractionPoints() { protected void initInteractionPoints() {
if (!updateInteractionPoints || interactionPointTag == null) if (!updateInteractionPoints || interactionPointTag == null)
@ -366,6 +388,7 @@ public class ArmTileEntity extends KineticTileEntity {
} }
NBTHelper.writeEnum(compound, "Phase", phase); NBTHelper.writeEnum(compound, "Phase", phase);
compound.putBoolean("Powered", redstoneLocked);
compound.put("HeldItem", heldItem.serializeNBT()); compound.put("HeldItem", heldItem.serializeNBT());
compound.putInt("TargetPointIndex", chasedPointIndex); compound.putInt("TargetPointIndex", chasedPointIndex);
compound.putFloat("MovementProgress", chasedPointProgress); compound.putFloat("MovementProgress", chasedPointProgress);
@ -383,6 +406,7 @@ public class ArmTileEntity extends KineticTileEntity {
chasedPointIndex = compound.getInt("TargetPointIndex"); chasedPointIndex = compound.getInt("TargetPointIndex");
chasedPointProgress = compound.getFloat("MovementProgress"); chasedPointProgress = compound.getFloat("MovementProgress");
interactionPointTag = compound.getList("InteractionPoints", NBT.TAG_COMPOUND); interactionPointTag = compound.getList("InteractionPoints", NBT.TAG_COMPOUND);
redstoneLocked = compound.getBoolean("Powered");
if (!clientPacket) if (!clientPacket)
return; return;

View File

@ -16,7 +16,6 @@ import com.simibubi.create.foundation.gui.widgets.ScrollInput;
import com.simibubi.create.foundation.gui.widgets.SelectionScrollInput; import com.simibubi.create.foundation.gui.widgets.SelectionScrollInput;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.widget.TextFieldWidget; import net.minecraft.client.gui.widget.TextFieldWidget;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTUtil; import net.minecraft.nbt.NBTUtil;
@ -194,7 +193,7 @@ public class SchematicEditScreen extends AbstractSimiScreen {
@Override @Override
public boolean mouseClicked(double x, double y, int button) { public boolean mouseClicked(double x, double y, int button) {
if (confirmButton.isHovered()) { if (confirmButton.isHovered()) {
Minecraft.getInstance().player.closeScreen(); onClose();
return true; return true;
} }

View File

@ -6,8 +6,13 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.function.Function; import java.util.function.Function;
import javax.annotation.Nullable;
import com.simibubi.create.AllTags.AllBlockTags;
import com.simibubi.create.AllTags.AllItemTags;
import com.simibubi.create.Create; import com.simibubi.create.Create;
import com.simibubi.create.content.contraptions.base.CasingBlock; import com.simibubi.create.content.contraptions.base.CasingBlock;
import com.simibubi.create.content.contraptions.components.crank.ValveHandleBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonGenerator; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonGenerator;
import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock;
import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock.Shape; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock.Shape;
@ -24,6 +29,7 @@ import com.tterrag.registrate.util.nullness.NonNullUnaryOperator;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.item.DyeColor;
import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.state.properties.PistonType; import net.minecraft.state.properties.PistonType;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
@ -44,6 +50,21 @@ public class BuilderTransformers {
.transform(ModelGen.customItemModel("cuckoo_clock", "item")); .transform(ModelGen.customItemModel("cuckoo_clock", "item"));
} }
public static <B extends ValveHandleBlock> NonNullUnaryOperator<BlockBuilder<B, CreateRegistrate>> valveHandle(
@Nullable DyeColor color) {
return b -> b.initialProperties(SharedProperties::softMetal)
.blockstate((c, p) -> {
String variant = color == null ? "copper" : color.getName();
p.directionalBlock(c.get(), p.models()
.withExistingParent(variant + "_valve_handle", p.modLoc("block/valve_handle"))
.texture("3", p.modLoc("block/valve_handle/valve_handle_" + variant)));
})
.tag(AllBlockTags.BRITTLE.tag, AllBlockTags.VALVE_HANDLES.tag)
.item()
.tag(AllItemTags.VALVE_HANDLES.tag)
.build();
}
public static <B extends CasingBlock> NonNullUnaryOperator<BlockBuilder<B, CreateRegistrate>> casing( public static <B extends CasingBlock> NonNullUnaryOperator<BlockBuilder<B, CreateRegistrate>> casing(
CTSpriteShiftEntry ct) { CTSpriteShiftEntry ct) {
return b -> b.onRegister(connectedTextures(new StandardCTBehaviour(ct))) return b -> b.onRegister(connectedTextures(new StandardCTBehaviour(ct)))

View File

@ -8,6 +8,7 @@ import com.google.common.collect.ImmutableList;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.AllTags; import com.simibubi.create.AllTags;
import com.simibubi.create.AllTags.AllItemTags;
import com.simibubi.create.Create; import com.simibubi.create.Create;
import com.simibubi.create.content.AllSections; import com.simibubi.create.content.AllSections;
import com.simibubi.create.content.palettes.AllPaletteBlocks; import com.simibubi.create.content.palettes.AllPaletteBlocks;
@ -336,6 +337,16 @@ public class StandardRecipeGen extends CreateRecipeProvider {
.patternLine("CCC") .patternLine("CCC")
.patternLine(" S")), .patternLine(" S")),
COPPER_VALVE_HANDLE = create(AllBlocks.COPPER_VALVE_HANDLE).unlockedByTag(I::copper)
.viaShaped(b -> b.key('S', I.andesite())
.key('C', I.copperSheet())
.patternLine("CCC")
.patternLine(" S ")),
COPPER_VALVE_HANDLE_FROM_OTHER_HANDLES = create(AllBlocks.COPPER_VALVE_HANDLE).withSuffix("_from_others")
.unlockedByTag(I::copper)
.viaShapeless(b -> b.addIngredient(AllItemTags.VALVE_HANDLES.tag)),
NOZZLE = create(AllBlocks.NOZZLE).unlockedBy(AllBlocks.ENCASED_FAN::get) NOZZLE = create(AllBlocks.NOZZLE).unlockedBy(AllBlocks.ENCASED_FAN::get)
.viaShaped(b -> b.key('S', I.andesite()) .viaShaped(b -> b.key('S', I.andesite())
.key('C', ItemTags.WOOL) .key('C', ItemTags.WOOL)
@ -416,6 +427,14 @@ public class StandardRecipeGen extends CreateRecipeProvider {
.patternLine("P") .patternLine("P")
.patternLine("S")), .patternLine("S")),
FLUID_VALVE = create(AllBlocks.FLUID_VALVE).unlockedByTag(I::copper)
.viaShaped(b -> b.key('P', I.shaft())
.key('S', AllBlocks.FLUID_PIPE.get())
.key('I', I.ironSheet())
.patternLine("I")
.patternLine("S")
.patternLine("P")),
SPOUT = create(AllBlocks.SPOUT).unlockedBy(I::copperCasing) SPOUT = create(AllBlocks.SPOUT).unlockedBy(I::copperCasing)
.viaShaped(b -> b.key('T', AllBlocks.FLUID_TANK.get()) .viaShaped(b -> b.key('T', AllBlocks.FLUID_TANK.get())
.key('P', Items.DRIED_KELP) .key('P', Items.DRIED_KELP)
@ -851,20 +870,22 @@ public class StandardRecipeGen extends CreateRecipeProvider {
GeneratedRecipeBuilder create(Supplier<IItemProvider> result) { GeneratedRecipeBuilder create(Supplier<IItemProvider> result) {
return new GeneratedRecipeBuilder(currentFolder, result); return new GeneratedRecipeBuilder(currentFolder, result);
} }
GeneratedRecipeBuilder create(ItemProviderEntry<? extends IItemProvider> result) { GeneratedRecipeBuilder create(ItemProviderEntry<? extends IItemProvider> result) {
return create(result::get); return create(result::get);
} }
GeneratedRecipe blastCrushedMetal(Supplier<? extends IItemProvider> result, GeneratedRecipe blastCrushedMetal(Supplier<? extends IItemProvider> result,
Supplier<? extends IItemProvider> ingredient) { Supplier<? extends IItemProvider> ingredient) {
return create(result::get).withSuffix("_from_crushed").viaCooking(ingredient::get) return create(result::get).withSuffix("_from_crushed")
.viaCooking(ingredient::get)
.rewardXP(.1f) .rewardXP(.1f)
.inBlastFurnace(); .inBlastFurnace();
} }
GeneratedRecipe blastMetalOre(Supplier<? extends IItemProvider> result, ITag<Item> ore) { GeneratedRecipe blastMetalOre(Supplier<? extends IItemProvider> result, ITag<Item> ore) {
return create(result::get).withSuffix("_from_ore").viaCookingTag(() -> ore) return create(result::get).withSuffix("_from_ore")
.viaCookingTag(() -> ore)
.rewardXP(.1f) .rewardXP(.1f)
.inBlastFurnace(); .inBlastFurnace();
} }

View File

@ -1,5 +1,7 @@
package com.simibubi.create.foundation.item; package com.simibubi.create.foundation.item;
import java.util.function.Consumer;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import com.simibubi.create.foundation.tileEntity.SyncedTileEntity; import com.simibubi.create.foundation.tileEntity.SyncedTileEntity;
@ -30,7 +32,7 @@ public class SmartInventory extends RecipeWrapper
this.stackSize = stackSize; this.stackSize = stackSize;
} }
public SmartInventory whenContentsChanged(Runnable updateCallback) { public SmartInventory whenContentsChanged(Consumer<Integer> updateCallback) {
((SyncedStackHandler) inv).whenContentsChange(updateCallback); ((SyncedStackHandler) inv).whenContentsChange(updateCallback);
return this; return this;
} }
@ -122,7 +124,7 @@ public class SmartInventory extends RecipeWrapper
private SyncedTileEntity te; private SyncedTileEntity te;
private boolean stackNonStackables; private boolean stackNonStackables;
private int stackSize; private int stackSize;
private Runnable updateCallback; private Consumer<Integer> updateCallback;
public SyncedStackHandler(int slots, SyncedTileEntity te, boolean stackNonStackables, int stackSize) { public SyncedStackHandler(int slots, SyncedTileEntity te, boolean stackNonStackables, int stackSize) {
super(slots); super(slots);
@ -135,7 +137,7 @@ public class SmartInventory extends RecipeWrapper
protected void onContentsChanged(int slot) { protected void onContentsChanged(int slot) {
super.onContentsChanged(slot); super.onContentsChanged(slot);
if (updateCallback != null) if (updateCallback != null)
updateCallback.run(); updateCallback.accept(slot);
te.notifyUpdate(); te.notifyUpdate();
} }
@ -144,7 +146,7 @@ public class SmartInventory extends RecipeWrapper
return Math.min(stackNonStackables ? 64 : super.getSlotLimit(slot), stackSize); return Math.min(stackNonStackables ? 64 : super.getSlotLimit(slot), stackSize);
} }
public void whenContentsChange(Runnable updateCallback) { public void whenContentsChange(Consumer<Integer> updateCallback) {
this.updateCallback = updateCallback; this.updateCallback = updateCallback;
} }

View File

@ -7,19 +7,19 @@
"advancement.create.its_alive": "It's Alive!", "advancement.create.its_alive": "It's Alive!",
"advancement.create.its_alive.desc": "Watch your first kinetic component spin.", "advancement.create.its_alive.desc": "Watch your first kinetic component spin.",
"advancement.create.shifting_gears": "Shifting Gear", "advancement.create.shifting_gears": "Shifting Gears",
"advancement.create.shifting_gears.desc": "Connect a large to a small cogwheel allowing you to change the speed of your contraption.", "advancement.create.shifting_gears.desc": "Connect a Large Cogwheel to a Small Cogwheel, allowing you to change the speed of your contraption.",
"advancement.create.overstressed": "Overstressed", "advancement.create.overstressed": "Overstressed",
"advancement.create.overstressed.desc": "Experience the limits of stress firsthand.", "advancement.create.overstressed.desc": "Experience the limits of stress firsthand.",
"advancement.create.belt": "Convey it all", "advancement.create.belt": "Convey It All",
"advancement.create.belt.desc": "Connect two shafts with a Mechanical Belt.", "advancement.create.belt.desc": "Connect two shafts with a Mechanical Belt.",
"advancement.create.wrench": "Configure Conveniently", "advancement.create.wrench": "Configure Conveniently",
"advancement.create.wrench.desc": "Create a Wrench to aid you in building your contraptions.", "advancement.create.wrench.desc": "Create a Wrench to aid you in building your contraptions.",
"advancement.create.goggles": "Stress-o-vision", "advancement.create.goggles": "Stress-O-Vision",
"advancement.create.goggles.desc": "Create some goggles to aid you in getting more kinetic information for components.", "advancement.create.goggles.desc": "Create some Engineer's Goggles to aid you in getting more kinetic information from components.",
"advancement.create.speedometer": "But how fast exactly?", "advancement.create.speedometer": "But How Fast Exactly?",
"advancement.create.speedometer.desc": "Place and power a Speedometer. Look at it through your goggles to read its exact value.", "advancement.create.speedometer.desc": "Place and power a Speedometer. Look at it through your goggles to read its exact value.",
"advancement.create.stressometer": "But how stressed exactly?", "advancement.create.stressometer": "But How Stressed Exactly?",
"advancement.create.stressometer.desc": "Place and power a Stressometer. Look at it through your goggles to read its exact value.", "advancement.create.stressometer.desc": "Place and power a Stressometer. Look at it through your goggles to read its exact value.",
"advancement.create.water_wheel": "Harnessing Hydraulics", "advancement.create.water_wheel": "Harnessing Hydraulics",
@ -27,25 +27,25 @@
"advancement.create.lava_wheel": "Magma Wheel", "advancement.create.lava_wheel": "Magma Wheel",
"advancement.create.lava_wheel.desc": "This shouldn't have worked.", "advancement.create.lava_wheel.desc": "This shouldn't have worked.",
"advancement.create.millstone": "Pocket Crusher", "advancement.create.millstone": "Pocket Crusher",
"advancement.create.millstone.desc": "Place and power a Millstone", "advancement.create.millstone.desc": "Place and power a Millstone.",
"advancement.create.andesite_casing": "The Andesite Age", "advancement.create.andesite_casing": "The Andesite Age",
"advancement.create.andesite_casing.desc": "Use some Andesite Alloy and Wood to create a basic Casing.", "advancement.create.andesite_casing.desc": "Use some Andesite Alloy and Wood to create a basic Casing.",
"advancement.create.mechanical_drill": "Stationary breakers", "advancement.create.mechanical_drill": "Stationary Breakers",
"advancement.create.mechanical_drill.desc": "Place and power a Mechanical mechanical_drill", "advancement.create.mechanical_drill.desc": "Place and power a Mechanical Drill.",
"advancement.create.press": "Press goes 'Bonk!'", "advancement.create.press": "Press Goes 'Bonk!'",
"advancement.create.press.desc": "Power a Mechanical Press and use it to create some Plates.", "advancement.create.press.desc": "Power a Mechanical Press and use it to create some Sheets.",
"advancement.create.polished_rose_quartz": "Pink Diamonds", "advancement.create.polished_rose_quartz": "Pink Diamonds",
"advancement.create.polished_rose_quartz.desc": "Use a piece of sand paper to polish Rose Quartz until it becomes transparent.", "advancement.create.polished_rose_quartz.desc": "Use a piece of Sand Paper to polish Rose Quartz until it becomes transparent.",
"advancement.create.electron_tube": "Beep boop", "advancement.create.electron_tube": "Beep Boop",
"advancement.create.electron_tube.desc": "Make some Electron Tubes, useful in crafting less primitive machinery.", "advancement.create.electron_tube.desc": "Make some Electron Tubes, useful in crafting less primitive machinery.",
"advancement.create.mechanical_saw": "Stationary Chopping", "advancement.create.mechanical_saw": "Stationary Chopping",
"advancement.create.mechanical_saw.desc": "Place and power a Mechanical Saw", "advancement.create.mechanical_saw.desc": "Place and power a Mechanical Saw.",
"advancement.create.basin": "Basin Operation", "advancement.create.basin": "Basin Operation",
"advancement.create.basin.desc": "Place a basin and try throwing items into it.", "advancement.create.basin.desc": "Place a Basin and try throwing items into it.",
"advancement.create.mixer": "Mixin' it Up", "advancement.create.mixer": "Mixin' It Up",
"advancement.create.mixer.desc": "Place a Mechanical Mixer above the basin, power it, and start mixing some ingredients.", "advancement.create.mixer.desc": "Place a Mechanical Mixer above the Basin, power it, and start mixing some ingredients.",
"advancement.create.compact": "Automated Compacting", "advancement.create.compact": "Automated Compacting",
"advancement.create.compact.desc": "Use a press and a basin to compact some items.", "advancement.create.compact.desc": "Use a Press and a Basin to compact some items.",
"advancement.create.expert_lane_1": "The Andesite Expert Lane", "advancement.create.expert_lane_1": "The Andesite Expert Lane",
"advancement.create.expert_lane_1.desc": "Work in Progress", "advancement.create.expert_lane_1.desc": "Work in Progress",
@ -55,15 +55,15 @@
"advancement.create.brass_casing": "The Brass Age", "advancement.create.brass_casing": "The Brass Age",
"advancement.create.brass_casing.desc": "Use newly obtained Brass and some Wood to create a more advanced Casing.", "advancement.create.brass_casing.desc": "Use newly obtained Brass and some Wood to create a more advanced Casing.",
"advancement.create.copper_casing": "The Copper Age", "advancement.create.copper_casing": "The Copper Age",
"advancement.create.copper_casing.desc": "Use some copper sheets to create Copper Casing.", "advancement.create.copper_casing.desc": "Use some Copper Sheets and Wood to create some Copper Casings.",
"advancement.create.crafter": "Automated Assembly", "advancement.create.crafter": "Automated Assembly",
"advancement.create.crafter.desc": "Place and power some Mechanical Crafters", "advancement.create.crafter.desc": "Place and power some Mechanical Crafters.",
"advancement.create.deployer": "Poke, Place, and Attack", "advancement.create.deployer": "Poke, Place, and Attack",
"advancement.create.deployer.desc": "Place and power a Deployer, the perfect reflection of yourself.", "advancement.create.deployer.desc": "Place and power a Deployer, the perfect reflection of yourself.",
"advancement.create.mechanical_arm": "Mechanical Grab'n'Drop", "advancement.create.mechanical_arm": "Mechanical Grab'n'Drop",
"advancement.create.mechanical_arm.desc": "Craft a Mechanical Arm, select in- and outputs, place it down and give it power; then watch it do all the work for you.", "advancement.create.mechanical_arm.desc": "Craft a Mechanical Arm, select in- and outputs, place it down and give it power; then watch as it does all the work for you.",
"advancement.create.musical_arm": "Play me my Theme Tune!", "advancement.create.musical_arm": "Play Me My Theme Tune!",
"advancement.create.musical_arm.desc": "Watch a Mechanical Arm operate your Jukebox.", "advancement.create.musical_arm.desc": "Watch a Mechanical Arm operate your Jukebox.",
"advancement.create.fist_bump": "Pound It, Bro!", "advancement.create.fist_bump": "Pound It, Bro!",
"advancement.create.fist_bump.desc": "Make two Deployers fist-bump.", "advancement.create.fist_bump.desc": "Make two Deployers fist-bump.",
@ -77,7 +77,7 @@
"advancement.create.refined_radiance": "Bright and Inspiring", "advancement.create.refined_radiance": "Bright and Inspiring",
"advancement.create.refined_radiance.desc": "Create Refined Radiance, a powerful chromatic substance.", "advancement.create.refined_radiance.desc": "Create Refined Radiance, a powerful chromatic substance.",
"advancement.create.zapper": "Building with style", "advancement.create.zapper": "Building With Style",
"advancement.create.zapper.desc": "Craft a Blockzapper. A radiant laser gun that helps you build.", "advancement.create.zapper.desc": "Craft a Blockzapper. A radiant laser gun that helps you build.",
"advancement.create.upgraded_zapper": "Radiant Overdrive", "advancement.create.upgraded_zapper": "Radiant Overdrive",
"advancement.create.upgraded_zapper.desc": "Create and activate a fully upgraded Blockzapper.", "advancement.create.upgraded_zapper.desc": "Create and activate a fully upgraded Blockzapper.",
@ -93,4 +93,4 @@
"advancement.create.eob": "End of Beta", "advancement.create.eob": "End of Beta",
"advancement.create.eob.desc": "Expect more content here in the future. <3" "advancement.create.eob.desc": "Expect more content here in the future. <3"
} }