More logistical errands

- Arms can no longer feed random junk to a jukebox
- Arms are no longer oblivious to hot-swapped blocks in its target areas
- Arms can now directly extract from and insert to Deployers and Crafters
- Arms can now feed blaze burners
- Fixed brass funnels deleting items inserted into a full or stalled inventory
- Fixed brass funnels in hopper mode not showing amounts on filters when transferring between server-only inventories
- Arms & Deployers can now be paused using a redstone signal; stopping them after their next completed cycle
- Fixed zapper tools not applying changes when the screen is closed using the confirm button
- Reorganized valve handle registration
- Added more preliminary recipes
This commit is contained in:
simibubi 2020-10-12 16:03:26 +02:00
parent 1b84bbf16f
commit 9852d84fb8
73 changed files with 1389 additions and 130 deletions

View file

@ -1486,20 +1486,26 @@ bec8c280b717306f87050b08a418feab53be71cb data/create/advancements/recipes/create
5af08853632fb5970fe542b3ecbde0ad16d64714 data/create/advancements/recipes/create.base/crafting/kinetics/belt_connector.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
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
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
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
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
1afaa6917411aa5c9fb1355588b481552bb0e3f8 data/create/advancements/recipes/create.base/crafting/kinetics/chute.json
a49a70403523bc9d4eadffdac5507806aca9fd9d data/create/advancements/recipes/create.base/crafting/kinetics/clockwork_bearing.json
403fd0da8ee42a52234e544cf532e454fb80137b data/create/advancements/recipes/create.base/crafting/kinetics/clutch.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
7f55c18bdf5eafe2be65c7afb46ec40777f1aed8 data/create/advancements/recipes/create.base/crafting/kinetics/cuckoo_clock.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
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
9840f103d4094b04ebf8c1ffbe154e5698dd4d25 data/create/advancements/recipes/create.base/crafting/kinetics/depot.json
81a3fe7e87c26767e3be6f97ea1de50f1cd74b65 data/create/advancements/recipes/create.base/crafting/kinetics/empty_blaze_burner.json
@ -1508,26 +1514,33 @@ a49a70403523bc9d4eadffdac5507806aca9fd9d data/create/advancements/recipes/create
40bbc4d9df2911721a58481f68a6bd8cfcfbeb98 data/create/advancements/recipes/create.base/crafting/kinetics/filter.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
a91b11ae44d9b1f479c6dee1f1a4580104059287 data/create/advancements/recipes/create.base/crafting/kinetics/fluid_valve.json
dae9e65a089955c0367dc1453e104c3153ebad79 data/create/advancements/recipes/create.base/crafting/kinetics/gearbox.json
8f9819912605cb2499cb3e79ecb0e709b0e38c19 data/create/advancements/recipes/create.base/crafting/kinetics/gearboxfrom_conversion.json
94b8a1f976b9f853cb6e24b0cef72d2e16c3282f data/create/advancements/recipes/create.base/crafting/kinetics/gearshift.json
1609e317d4dcd830be7356301f6685d71d87d34c data/create/advancements/recipes/create.base/crafting/kinetics/goggles.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
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
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
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
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
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
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
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
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
d096f7343b42827c4832bf6c68e7d0135e21c8a9 data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_crafter.json
8e8bb7aa8da72913a69bc4792cfc61f8cf827386 data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_drill.json
@ -1543,15 +1556,19 @@ d38e8ff9dd33558227678d69393b57a360caa28e data/create/advancements/recipes/create
afeb2a152697b68bc953986d6886cbe527c6d2b5 data/create/advancements/recipes/create.base/crafting/kinetics/nozzle.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
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
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
02258b70f1db3d91f0ccb5a5ffd362349f8f359d data/create/advancements/recipes/create.base/crafting/kinetics/propeller.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
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
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
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
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
@ -1569,9 +1586,11 @@ f3fc3d4fee0712906f833aa17185f0bacb21922f data/create/advancements/recipes/create
7c146cc51139c2a8e287a60c8d645fa6f6f48cb1 data/create/advancements/recipes/create.base/crafting/kinetics/whisk.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
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
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
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
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
@ -2444,20 +2463,26 @@ cf1f3a6306d47025cebe153cf05949ef69ccbe5a data/create/recipes/crafting/kinetics/a
dcf98e667d321fb4bd9fa6dfec7927a84cdbd5d6 data/create/recipes/crafting/kinetics/belt_connector.json
1123903a11b13448b61cf8f8a5dc2e8013d39ac0 data/create/recipes/crafting/kinetics/black_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
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
c50077a130bc43cd3659faa02ce95789399478b2 data/create/recipes/crafting/kinetics/brown_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
3bc3510b64e576d68b19f4ceb5d9bd6591dbcf6c data/create/recipes/crafting/kinetics/chute.json
a80e3eabbeba2931d0d58dd9492018a0d78da8b5 data/create/recipes/crafting/kinetics/clockwork_bearing.json
501ad764d087b40ce36f3d4256b0d5ee25b2081e data/create/recipes/crafting/kinetics/clutch.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
cc2ab4b619aa55c03db18b67a62e12b6089e7019 data/create/recipes/crafting/kinetics/cuckoo_clock.json
f11892864a26c4ba79eb46d890a1a4bd96a1ad93 data/create/recipes/crafting/kinetics/cyan_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
be86df1c4d7af14bc5dcfe044d07c03b6c6d2a75 data/create/recipes/crafting/kinetics/depot.json
9c5d30f25a130d591b924c50e5c83e3b787c2758 data/create/recipes/crafting/kinetics/empty_blaze_burner.json
@ -2466,6 +2491,7 @@ e416a453316cc6a2f68795b0ab9c91a842d72510 data/create/recipes/crafting/kinetics/e
0dd0cc11eaa6789fc612af3231ed247893852178 data/create/recipes/crafting/kinetics/filter.json
30ae02825e54c0cc07be8f4decf9d432e7d61ba2 data/create/recipes/crafting/kinetics/fluid_pipe.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
5eb05cdf88bccdaddfe7ebfbd8b70d1196d422a6 data/create/recipes/crafting/kinetics/gearbox.json
b5da8c58f6b8aba525ae8a12ad906db37b78a566 data/create/recipes/crafting/kinetics/gearboxfrom_conversion.json
@ -2473,20 +2499,26 @@ b5da8c58f6b8aba525ae8a12ad906db37b78a566 data/create/recipes/crafting/kinetics/g
5b07af1b09125f874500c3fb140efda90061a19e data/create/recipes/crafting/kinetics/goggles.json
beb7715310352988d5a58d1b39c62f02544795f8 data/create/recipes/crafting/kinetics/gray_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
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
237541c1c318b8426734c1c43be31fbd01413d39 data/create/recipes/crafting/kinetics/large_cogwheel.json
a33e3301fc6d3a446e61a1c4b8a93aff079baeba data/create/recipes/crafting/kinetics/light_blue_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
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
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
9bf76daab65d048a135d70db522989ebc77ccaf1 data/create/recipes/crafting/kinetics/linear_chassisfrom_conversion.json
d7d96071874a87edf7bbdcf7a462f95a130d2991 data/create/recipes/crafting/kinetics/magenta_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
a5c7aad0d86cbb66b8688d295e62547da4a2ce0f data/create/recipes/crafting/kinetics/mechanical_crafter.json
4372830100d39c4a89ff397a62b01940e1a28cb3 data/create/recipes/crafting/kinetics/mechanical_drill.json
@ -2503,15 +2535,19 @@ be4c7fdb0ba1e9ee6d3dcf200dc2718ad83ec8fb data/create/recipes/crafting/kinetics/m
6b1b626394d7269a6861a836992ccdb344b6e7dd data/create/recipes/crafting/kinetics/nozzle.json
9c41cd91a0716d591ed6d1b5128ec731b418850f data/create/recipes/crafting/kinetics/orange_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
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
16199a6729005a279854cb1838401f6e73bdebae data/create/recipes/crafting/kinetics/propeller.json
76ba751b65d312d1b34229d76fff2111b593091a data/create/recipes/crafting/kinetics/purple_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
1059f08b016e1c222f13bd9976d0fcd8fc982619 data/create/recipes/crafting/kinetics/red_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
e9f1597d40f62c2247b319303f375f0da271346f data/create/recipes/crafting/kinetics/rotation_speed_controller.json
66922e18791c87fadb7629cdf32d3dd2f50ccd13 data/create/recipes/crafting/kinetics/secondary_linear_chassisfrom_conversion.json
@ -2529,9 +2565,11 @@ af5854ee2fa3be195ad9abcdeebe6ed7306b651c data/create/recipes/crafting/kinetics/s
f508d510576c93712e7f5265345a32e8818bbf0d data/create/recipes/crafting/kinetics/whisk.json
f4d88aa2edea548d29cf2678a111d8bb5db7720a data/create/recipes/crafting/kinetics/white_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
5579e58473474c4e59efd1ee39ddf0140d66b618 data/create/recipes/crafting/kinetics/yellow_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
c465151b64381e2222203bf069b717435fdc2b26 data/create/recipes/crafting/logistics/adjustable_pulse_repeater.json
34bcdffae0b104829161c86b7d161068f890daa2 data/create/recipes/crafting/logistics/adjustable_repeater.json
@ -3095,15 +3133,17 @@ d3fdb8ece6cb072a93ddb64a0baad5ac952117a4 data/create/recipes/weathered_limestone
0f3c993eb6dd3f37953f304b8fad15bf60469ef4 data/create/recipes/weathered_limestone_cobblestone_wall_from_weathered_limestone_cobblestone_stonecutting.json
6eceb25fabbb6b389ca35de3b829ad061c9c456a data/create/recipes/weathered_limestone_pillar.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
798ef82869dbe22682121504a372e95607a785dc data/create/tags/blocks/fan_transparent.json
6cdeeac1689f7b5bfd9bc40b462143d8eaf3ad0b data/create/tags/blocks/seats.json
50936b211d94167a35ec78c89954082a336b6269 data/create/tags/blocks/valve_handles.json
7fa13854a216ee49c0ae3b1e0e23c4cd1fbc4859 data/create/tags/blocks/windmill_sails.json
081f5aa35602fc27af2ca01ea9f2fd5e7eb284dc data/create/tags/items/create_ingots.json
d2dc4ff179ef7b2aa9276455c196e15d44aa95a8 data/create/tags/items/crushed_ores.json
6cdeeac1689f7b5bfd9bc40b462143d8eaf3ad0b data/create/tags/items/seats.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
81ced867d24ec814942909965dd4576eff1db685 data/forge/tags/blocks/glass_panes.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": [
"create:nozzle",
"create:hand_crank",
"create:copper_valve_handle",
"create:white_valve_handle",
"create:orange_valve_handle",
"create:magenta_valve_handle",
@ -19,7 +20,6 @@
"create:green_valve_handle",
"create:red_valve_handle",
"create:black_valve_handle",
"create:copper_valve_handle",
"create:rope",
"create:pulley_magnet",
"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.crafter.CrafterCTBehaviour;
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.ValveHandleBlock;
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.deployer.DeployerBlock;
@ -507,8 +507,28 @@ public class AllBlocks {
.transform(customItemModel())
.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 {
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)

View file

@ -65,6 +65,7 @@ public class AllTags {
public static enum AllItemTags {
CRUSHED_ORES(MOD),
SEATS(MOD),
VALVE_HANDLES(MOD),
UPRIGHT_ON_BELT(MOD),
CREATE_INGOTS(MOD),
BEACON_PAYMENT(FORGE),
@ -102,7 +103,7 @@ public class AllTags {
}
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.crafter.MechanicalCrafterRenderer;
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.HandCrankTileEntity;
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()
.tileEntity("hand_crank", HandCrankTileEntity::new)
.validBlocks(AllBlocks.HAND_CRANK)
.validBlocks(AllValveHandles.variants)
.validBlocks(AllBlocks.HAND_CRANK, AllBlocks.COPPER_VALVE_HANDLE)
.validBlocks(AllBlocks.DYED_VALVE_HANDLES)
.renderer(() -> HandCrankRenderer::new)
.register();

View file

@ -183,7 +183,7 @@ public class ConnectedInputHandler {
List<IItemHandlerModifiable> list = data.stream()
.map(l -> CrafterHelper.getCrafter(world, pos.add(l)))
.filter(Predicates.notNull())
.map(crafter -> crafter.inventory)
.map(crafter -> crafter.getInventory())
.collect(Collectors.toList());
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;
boolean wrenched = AllItems.WRENCH.isIn(heldItem);
if (AllBlocks.MECHANICAL_ARM.isIn(heldItem))
return ActionResultType.PASS;
if (hit.getFace() == state.get(HORIZONTAL_FACING)) {
if (crafter.phase != Phase.IDLE && !wrenched) {
@ -202,7 +205,7 @@ public class MechanicalCrafterBlock extends HorizontalKineticBlock implements IT
return ActionResultType.SUCCESS;
}
ItemStack inSlot = crafter.inventory.getStackInSlot(0);
ItemStack inSlot = crafter.getInventory().getStackInSlot(0);
if (inSlot.isEmpty()) {
if (crafter.covered && !wrenched) {
if (worldIn.isRemote)
@ -221,7 +224,7 @@ public class MechanicalCrafterBlock extends HorizontalKineticBlock implements IT
if (worldIn.isRemote)
return ActionResultType.SUCCESS;
player.inventory.placeItemBackInInventory(worldIn, inSlot);
crafter.inventory.setStackInSlot(0, ItemStack.EMPTY);
crafter.getInventory().setStackInSlot(0, ItemStack.EMPTY);
return ActionResultType.SUCCESS;
}

View file

@ -65,7 +65,7 @@ public class MechanicalCrafterRenderer extends SafeTileEntityRenderer<Mechanical
public void renderItems(MechanicalCrafterTileEntity te, float partialTicks, MatrixStack ms,
IRenderTypeBuffer buffer, int light, int overlay) {
if (te.phase == Phase.IDLE) {
ItemStack stack = te.inventory.getStackInSlot(0);
ItemStack stack = te.getInventory().getStackInSlot(0);
if (!stack.isEmpty()) {
ms.push();
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.components.crafter.ConnectedInputHandler.ConnectedInput;
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.behaviour.belt.DirectBeltInputBehaviour;
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.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemStackHandler;
public class MechanicalCrafterTileEntity extends KineticTileEntity {
@ -46,34 +46,34 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
IDLE, ACCEPTING, ASSEMBLING, EXPORTING, WAITING, CRAFTING, INSERTING;
}
protected ItemStackHandler inventory = new ItemStackHandler(1) {
static class Inventory extends SmartInventory {
@Override
public int getSlotLimit(int slot) {
return 1;
private MechanicalCrafterTileEntity te;
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) {
return ItemStack.EMPTY;
};
@Override
public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) {
if (phase != Phase.IDLE)
if (te.phase != Phase.IDLE)
return stack;
if (covered)
if (te.covered)
return stack;
return super.insertItem(slot, stack, simulate);
};
}
protected void onContentsChanged(int slot) {
if (!getStackInSlot(slot).isEmpty() && phase == Phase.IDLE)
checkCompletedRecipe(false);
markDirty();
sendData();
};
};
}
protected Inventory inventory;
protected GroupedItems groupedItems = new GroupedItems();
protected ConnectedInput input = new ConnectedInput();
protected LazyOptional<IItemHandler> invSupplier = LazyOptional.of(() -> input.getItemHandler(world, pos));
@ -92,6 +92,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
setLazyTickRate(20);
phase = Phase.IDLE;
groupedItemsBeforeCraft = new GroupedItems();
inventory = new Inventory(this);
// Does not get serialized due to active checking in tick
wasPoweredBefore = true;
@ -485,4 +486,8 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
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.getName());
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.content.contraptions.base.DirectionalKineticBlock;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.config.AllConfigs;
import net.minecraft.block.Block;
import net.minecraft.block.BlockRenderType;
import net.minecraft.block.BlockState;

View file

@ -1,8 +1,12 @@
package com.simibubi.create.content.contraptions.components.crank;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.ParametersAreNonnullByDefault;
import com.simibubi.create.AllBlockPartials;
import com.tterrag.registrate.util.entry.BlockEntry;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;
@ -12,9 +16,20 @@ import net.minecraftforge.api.distmarker.OnlyIn;
@ParametersAreNonnullByDefault
public class ValveHandleBlock extends HandCrankBlock {
public static final List<BlockEntry<ValveHandleBlock>> entries = new ArrayList<>();
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);
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 mcp.MethodsReturnNonnullByDefault;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.material.PushReaction;
import net.minecraft.entity.player.PlayerEntity;
@ -108,4 +109,16 @@ public class DeployerBlock extends DirectionalAxisKineticBlock implements ITE<De
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

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

View file

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

View file

@ -1,15 +1,16 @@
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.CKinetics;
import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.world.World;
import javax.annotation.Nullable;
@MethodsReturnNonnullByDefault
public interface IAirCurrentSource {
@Nullable

View file

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

View file

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

View file

@ -42,6 +42,7 @@ import net.minecraft.world.storage.loot.LootTable;
import net.minecraft.world.storage.loot.conditions.BlockStateProperty;
import net.minecraft.world.storage.loot.conditions.ILootCondition.IBuilder;
import net.minecraft.world.storage.loot.conditions.SurvivesExplosion;
import net.minecraftforge.common.util.FakePlayer;
@MethodsReturnNonnullByDefault
@ParametersAreNonnullByDefault
@ -86,21 +87,29 @@ public class BlazeBurnerBlock extends Block implements ITE<BlazeBurnerTileEntity
@Override
public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand,
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.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);
if (!(te instanceof BlazeBurnerTileEntity))
return ActionResultType.PASS;
return false;
BlazeBurnerTileEntity burnerTE = (BlazeBurnerTileEntity) te;
if (!((BlazeBurnerTileEntity) te).tryUpdateFuel(player.getHeldItem(hand), player))
return ActionResultType.PASS;
if (!player.isCreative())
player.getHeldItem(hand)
.shrink(1);
return ActionResultType.SUCCESS;
if (!burnerTE.tryUpdateFuel(stack, forceOverflow, simulate))
return false;
if (!simulate && !world.isRemote)
stack.shrink(1);
return true;
}
@Override

View file

@ -5,7 +5,6 @@ import java.util.Random;
import com.simibubi.create.AllItems;
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.processing.burner.BlazeBurnerBlock.HeatLevel;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
@ -14,7 +13,6 @@ import com.simibubi.create.foundation.utility.ColorHelper;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.player.ClientPlayerEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.projectile.EggEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
@ -171,7 +169,7 @@ public class BlazeBurnerTileEntity extends SmartTileEntity {
/**
* @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;
int burnTick = ForgeHooks.getBurnTime(itemStack);
if (burnTick > 0)
@ -185,20 +183,22 @@ public class BlazeBurnerTileEntity extends SmartTileEntity {
return false;
if (newFuel == activeFuel) {
if (remainingBurnTime + burnTick > maxHeatCapacity && player instanceof DeployerFakePlayer)
if (remainingBurnTime + burnTick > maxHeatCapacity && !forceOverflow)
return false;
if (simulate)
return true;
remainingBurnTime = MathHelper.clamp(remainingBurnTime + burnTick, 0, maxHeatCapacity);
} else {
if (simulate)
return true;
activeFuel = newFuel;
remainingBurnTime = burnTick;
}
updateHeatLevel();
HeatLevel level = getHeatLevel();
for (int i = 0; i < 20; i++) {
for (int i = 0; i < 20; i++)
spawnParticles(level, 1 + (.25 * (i / 4)));
}
return true;
}

View file

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

View file

@ -7,6 +7,8 @@ import java.util.Collections;
import java.util.List;
import java.util.Optional;
import javax.annotation.Nullable;
import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.content.contraptions.components.fan.SplashingRecipe;
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.wrapper.RecipeWrapper;
import javax.annotation.Nullable;
public class InWorldProcessing {
public static class SplashingInv extends RecipeWrapper {

View file

@ -1,5 +1,11 @@
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.Create;
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.Iterate;
import com.simibubi.create.foundation.utility.VecHelper;
import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
@ -47,11 +54,6 @@ import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemHandlerHelper;
import javax.annotation.Nullable;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.LinkedList;
import java.util.List;
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInformation, IAirCurrentSource {

View file

@ -1,5 +1,7 @@
package com.simibubi.create.content.logistics.block.depot;
import javax.annotation.ParametersAreNonnullByDefault;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllShapes;
import com.simibubi.create.AllTileEntities;
@ -29,8 +31,6 @@ import net.minecraft.world.IBlockReader;
import net.minecraft.world.World;
import net.minecraftforge.items.ItemStackHandler;
import javax.annotation.ParametersAreNonnullByDefault;
@ParametersAreNonnullByDefault
@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.transport.TransportedItemStack;
import com.simibubi.create.content.logistics.InWorldProcessing;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
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.tileentity.TileEntityType;
import net.minecraft.util.Direction;
import net.minecraftforge.items.ItemHandlerHelper;
public class FunnelTileEntity extends SmartTileEntity {
@ -95,9 +96,12 @@ public class FunnelTileEntity extends SmartTileEntity {
amountToExtract = 1;
Predicate<ItemStack> filter = s -> !filtering.isActive() || filtering.test(s);
Function<ItemStack, Integer> amountThreshold = s -> s.getMaxStackSize() - invManipulation.simulate()
.insert(s)
Function<ItemStack, Integer> amountThreshold = s -> {
int maxStackSize = s.getMaxStackSize();
return maxStackSize - invManipulation.simulate()
.insert(ItemHandlerHelper.copyStackWithSize(s, maxStackSize))
.getCount();
};
if (amountToExtract != -1 && !invManipulation.simulate()
.insert(autoExtractor.simulate()
@ -192,8 +196,9 @@ public class FunnelTileEntity extends SmartTileEntity {
BlockState blockState = getBlockState();
boolean pushingToBelt = blockState.getBlock() instanceof HorizontalInteractionFunnelBlock
&& blockState.get(HorizontalInteractionFunnelBlock.PUSHING);
boolean hopper = FunnelBlock.getFunnelFacing(blockState) == Direction.UP && invManipulation.hasInventory()
&& autoExtractor.hasInventory();
boolean hopper = FunnelBlock.getFunnelFacing(blockState) == Direction.UP && !world.getBlockState(pos.up())
.getMaterial()
.isReplaceable();
return pushingToBelt || hopper;
}
@ -261,7 +266,8 @@ public class FunnelTileEntity extends SmartTileEntity {
}
public void onTransfer(ItemStack stack) {
AllBlocks.CONTENT_OBSERVER.get().onFunnelTransfer(world, pos, stack);
AllBlocks.CONTENT_OBSERVER.get()
.onFunnelTransfer(world, pos, stack);
}
}

View file

@ -59,6 +59,18 @@ public class ArmBlock extends KineticBlock implements ITE<ArmTileEntity> {
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
public Axis getRotationAxis(BlockState state) {
return Axis.Y;

View file

@ -8,11 +8,16 @@ import com.google.common.collect.ImmutableMap;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials;
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.processing.burner.BlazeBurnerBlock;
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.FunnelTileEntity;
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.behaviour.filtering.FilteringBehaviour;
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.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.MusicDiscItem;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.NBTUtil;
import net.minecraft.state.properties.BlockStateProperties;
@ -56,14 +62,17 @@ public abstract class ArmInteractionPoint {
private static ImmutableMap<ArmInteractionPoint, Supplier<ArmInteractionPoint>> POINTS =
ImmutableMap.<ArmInteractionPoint, Supplier<ArmInteractionPoint>>builder()
.put(new Saw(), Saw::new)
.put(new Belt(), Belt::new)
.put(new Depot(), Depot::new)
.put(new Saw(), Saw::new)
.put(new Chute(), Chute::new)
.put(new Jukebox(), Jukebox::new)
.put(new Basin(), Basin::new)
.put(new Millstone(), Millstone::new)
.put(new Funnel(), Funnel::new)
.put(new Jukebox(), Jukebox::new)
.put(new Crafter(), Crafter::new)
.put(new Deployer(), Deployer::new)
.put(new Millstone(), Millstone::new)
.put(new BlazeBurner(), BlazeBurner::new)
.put(new CrushingWheels(), CrushingWheels::new)
.build();
@ -90,6 +99,10 @@ public abstract class ArmInteractionPoint {
return Direction.DOWN;
}
boolean isStillValid(IBlockReader reader) {
return isValid(reader, pos, reader.getBlockState(pos));
}
abstract boolean isValid(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 {
@Override
@ -261,6 +352,8 @@ public abstract class ArmInteractionPoint {
if (!jukeboxTE.getRecord()
.isEmpty())
return stack;
if (!(stack.getItem() instanceof MusicDiscItem))
return stack;
ItemStack remainder = stack.copy();
ItemStack toInsert = remainder.split(1);
if (!simulate && !world.isRemote) {

View file

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

View file

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

View file

@ -6,8 +6,13 @@ import java.util.HashMap;
import java.util.Map;
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.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.logistics.block.belts.tunnel.BeltTunnelBlock;
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.BlockState;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.item.DyeColor;
import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.state.properties.PistonType;
import net.minecraft.util.Direction;
@ -44,6 +50,21 @@ public class BuilderTransformers {
.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(
CTSpriteShiftEntry 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.AllItems;
import com.simibubi.create.AllTags;
import com.simibubi.create.AllTags.AllItemTags;
import com.simibubi.create.Create;
import com.simibubi.create.content.AllSections;
import com.simibubi.create.content.palettes.AllPaletteBlocks;
@ -336,6 +337,16 @@ public class StandardRecipeGen extends CreateRecipeProvider {
.patternLine("CCC")
.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)
.viaShaped(b -> b.key('S', I.andesite())
.key('C', ItemTags.WOOL)
@ -416,6 +427,14 @@ public class StandardRecipeGen extends CreateRecipeProvider {
.patternLine("P")
.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)
.viaShaped(b -> b.key('T', AllBlocks.FLUID_TANK.get())
.key('P', Items.DRIED_KELP)
@ -858,13 +877,15 @@ public class StandardRecipeGen extends CreateRecipeProvider {
GeneratedRecipe blastCrushedMetal(Supplier<? extends IItemProvider> result,
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)
.inBlastFurnace();
}
GeneratedRecipe blastMetalOre(Supplier<? extends IItemProvider> result, Tag<Item> ore) {
return create(result::get).withSuffix("_from_ore").viaCookingTag(() -> ore)
return create(result::get).withSuffix("_from_ore")
.viaCookingTag(() -> ore)
.rewardXP(.1f)
.inBlastFurnace();
}

View file

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