From aef451e3bfcffeab25fabdcd9200388fdb306762 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sun, 20 Sep 2020 21:34:36 +0200 Subject: [PATCH 01/12] Logistics' final stretch, Part II - Belt observer -> Content observer - Content observers can now monitor any inventory and funnel transactions - Stockpile switches no longer only access slots exposed to a specific side of an inventory - Stockpile switches can now take a filter --- src/generated/resources/.cache/cache | 48 ++-- .../create/blockstates/belt_observer.json | 244 ------------------ .../create/blockstates/content_observer.json | 34 +++ .../resources/assets/create/lang/en_ud.json | 2 +- .../resources/assets/create/lang/en_us.json | 2 +- .../assets/create/lang/unfinished/de_de.json | 4 +- .../assets/create/lang/unfinished/fr_fr.json | 4 +- .../assets/create/lang/unfinished/it_it.json | 4 +- .../assets/create/lang/unfinished/ja_jp.json | 4 +- .../assets/create/lang/unfinished/ko_kr.json | 4 +- .../assets/create/lang/unfinished/nl_nl.json | 4 +- .../assets/create/lang/unfinished/pt_br.json | 4 +- .../assets/create/lang/unfinished/ru_ru.json | 4 +- .../assets/create/lang/unfinished/zh_cn.json | 4 +- .../models/block/belt_observer/detect.json | 6 - .../block/belt_observer/detect_belt.json | 6 - .../belt_observer/detect_belt_powered.json | 6 - .../block/belt_observer/detect_powered.json | 6 - .../models/block/belt_observer/eject.json | 6 - .../block/belt_observer/eject_belt.json | 6 - .../belt_observer/eject_belt_powered.json | 6 - .../block/belt_observer/eject_powered.json | 6 - .../models/block/belt_observer/pulse.json | 6 - .../block/belt_observer/pulse_belt.json | 6 - .../belt_observer/pulse_belt_powered.json | 6 - .../block/belt_observer/pulse_powered.json | 6 - .../models/block/belt_observer/split.json | 6 - .../block/belt_observer/split_belt.json | 6 - .../belt_observer/split_belt_powered.json | 6 - .../block/belt_observer/split_powered.json | 6 - .../create/models/item/belt_observer.json | 3 - .../create/models/item/content_observer.json | 3 + ...lt_observer.json => content_observer.json} | 4 +- ...lt_observer.json => content_observer.json} | 2 +- ...lt_observer.json => content_observer.json} | 2 +- .../java/com/simibubi/create/AllBlocks.java | 27 +- .../java/com/simibubi/create/AllShapes.java | 14 +- .../com/simibubi/create/AllTileEntities.java | 13 +- .../components/actors/SeatBlock.java | 22 +- .../actors/SeatMovementBehaviour.java | 12 +- .../contraptions/relays/belt/BeltBlock.java | 6 +- .../belts/observer/BeltObserverBlock.java | 171 ------------ .../belts/observer/BeltObserverRenderer.java | 27 -- .../observer/BeltObserverTileEntity.java | 87 ------- .../block/chute/ChuteTileEntity.java | 6 +- .../block/funnel/BeltFunnelBlock.java | 2 +- .../logistics/block/funnel/FunnelBlock.java | 5 + .../block/funnel/FunnelTileEntity.java | 10 + .../mechanicalArm/ArmInteractionPoint.java | 6 + .../block/redstone/ContentObserverBlock.java | 156 +++++++++++ .../redstone/ContentObserverTileEntity.java | 108 ++++++++ .../FilteredDetectorFilterSlot.java} | 6 +- .../redstone/StockpileSwitchTileEntity.java | 67 ++--- .../create/foundation/data/BlockStateGen.java | 43 --- .../data/recipe/StandardRecipeGen.java | 2 +- .../inventory/InvManipulationBehaviour.java | 22 +- .../models/block/belt_observer/base.json | 116 --------- .../models/block/belt_observer/base_belt.json | 131 ---------- .../belt_observer/base_belt_powered.json | 6 - .../block/belt_observer/base_powered.json | 6 - .../models/block/belt_observer/item.json | 88 ------- .../models/block/content_observer/block.json | 80 ++++++ .../block/content_observer/block_powered.json | 7 + .../create/models/block/stockpile_switch.json | 11 +- .../textures/block/belt_observer_detect.png | Bin 492 -> 0 bytes .../block/belt_observer_detect_powered.png | Bin 481 -> 0 bytes .../textures/block/belt_observer_eject.png | Bin 503 -> 0 bytes .../block/belt_observer_eject_powered.png | Bin 533 -> 0 bytes .../textures/block/belt_observer_front.png | Bin 388 -> 0 bytes .../textures/block/belt_observer_pulse.png | Bin 514 -> 0 bytes .../block/belt_observer_pulse_powered.png | Bin 536 -> 0 bytes .../textures/block/belt_observer_split.png | Bin 534 -> 0 bytes .../block/belt_observer_split_powered.png | Bin 530 -> 0 bytes .../assets/create/textures/block/chute.png | Bin 8002 -> 1564 bytes .../textures/block/content_observer.png | Bin 0 -> 315 bytes .../textures/block/content_observer_inner.png | Bin 0 -> 308 bytes .../block/content_observer_inner_powered.png | Bin 0 -> 310 bytes .../block/content_observer_powered.png | Bin 0 -> 305 bytes ...ch_end.png => filtered_detector_front.png} | Bin .../textures/block/filtered_detector_top.png | Bin 0 -> 453 bytes 80 files changed, 545 insertions(+), 1188 deletions(-) delete mode 100644 src/generated/resources/assets/create/blockstates/belt_observer.json create mode 100644 src/generated/resources/assets/create/blockstates/content_observer.json delete mode 100644 src/generated/resources/assets/create/models/block/belt_observer/detect.json delete mode 100644 src/generated/resources/assets/create/models/block/belt_observer/detect_belt.json delete mode 100644 src/generated/resources/assets/create/models/block/belt_observer/detect_belt_powered.json delete mode 100644 src/generated/resources/assets/create/models/block/belt_observer/detect_powered.json delete mode 100644 src/generated/resources/assets/create/models/block/belt_observer/eject.json delete mode 100644 src/generated/resources/assets/create/models/block/belt_observer/eject_belt.json delete mode 100644 src/generated/resources/assets/create/models/block/belt_observer/eject_belt_powered.json delete mode 100644 src/generated/resources/assets/create/models/block/belt_observer/eject_powered.json delete mode 100644 src/generated/resources/assets/create/models/block/belt_observer/pulse.json delete mode 100644 src/generated/resources/assets/create/models/block/belt_observer/pulse_belt.json delete mode 100644 src/generated/resources/assets/create/models/block/belt_observer/pulse_belt_powered.json delete mode 100644 src/generated/resources/assets/create/models/block/belt_observer/pulse_powered.json delete mode 100644 src/generated/resources/assets/create/models/block/belt_observer/split.json delete mode 100644 src/generated/resources/assets/create/models/block/belt_observer/split_belt.json delete mode 100644 src/generated/resources/assets/create/models/block/belt_observer/split_belt_powered.json delete mode 100644 src/generated/resources/assets/create/models/block/belt_observer/split_powered.json delete mode 100644 src/generated/resources/assets/create/models/item/belt_observer.json create mode 100644 src/generated/resources/assets/create/models/item/content_observer.json rename src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/{belt_observer.json => content_observer.json} (81%) rename src/generated/resources/data/create/loot_tables/blocks/{belt_observer.json => content_observer.json} (85%) rename src/generated/resources/data/create/recipes/crafting/logistics/{belt_observer.json => content_observer.json} (89%) delete mode 100644 src/main/java/com/simibubi/create/content/logistics/block/belts/observer/BeltObserverBlock.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/block/belts/observer/BeltObserverRenderer.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/block/belts/observer/BeltObserverTileEntity.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/block/redstone/ContentObserverBlock.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/block/redstone/ContentObserverTileEntity.java rename src/main/java/com/simibubi/create/content/logistics/block/{belts/observer/BeltObserverFilterSlot.java => redstone/FilteredDetectorFilterSlot.java} (80%) delete mode 100644 src/main/resources/assets/create/models/block/belt_observer/base.json delete mode 100644 src/main/resources/assets/create/models/block/belt_observer/base_belt.json delete mode 100644 src/main/resources/assets/create/models/block/belt_observer/base_belt_powered.json delete mode 100644 src/main/resources/assets/create/models/block/belt_observer/base_powered.json delete mode 100644 src/main/resources/assets/create/models/block/belt_observer/item.json create mode 100644 src/main/resources/assets/create/models/block/content_observer/block.json create mode 100644 src/main/resources/assets/create/models/block/content_observer/block_powered.json delete mode 100644 src/main/resources/assets/create/textures/block/belt_observer_detect.png delete mode 100644 src/main/resources/assets/create/textures/block/belt_observer_detect_powered.png delete mode 100644 src/main/resources/assets/create/textures/block/belt_observer_eject.png delete mode 100644 src/main/resources/assets/create/textures/block/belt_observer_eject_powered.png delete mode 100644 src/main/resources/assets/create/textures/block/belt_observer_front.png delete mode 100644 src/main/resources/assets/create/textures/block/belt_observer_pulse.png delete mode 100644 src/main/resources/assets/create/textures/block/belt_observer_pulse_powered.png delete mode 100644 src/main/resources/assets/create/textures/block/belt_observer_split.png delete mode 100644 src/main/resources/assets/create/textures/block/belt_observer_split_powered.png create mode 100644 src/main/resources/assets/create/textures/block/content_observer.png create mode 100644 src/main/resources/assets/create/textures/block/content_observer_inner.png create mode 100644 src/main/resources/assets/create/textures/block/content_observer_inner_powered.png create mode 100644 src/main/resources/assets/create/textures/block/content_observer_powered.png rename src/main/resources/assets/create/textures/block/{stockpile_switch_end.png => filtered_detector_front.png} (100%) create mode 100644 src/main/resources/assets/create/textures/block/filtered_detector_top.png diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 870f56f0e..10d8136e7 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -20,7 +20,6 @@ a579c40c43dc2174afb66f42d00d0c4a0efaaeee assets/create/blockstates/andesite_bric 1d2d8081581e07d9be4b382aede4f2de4401cc6b assets/create/blockstates/andesite_tunnel.json f9fa6aa530eb0891a74eadfbebc663172a57147a assets/create/blockstates/basin.json f25693a9429f6337149ff24f27900dc4eb82a7c2 assets/create/blockstates/belt.json -40d10934934ea142d71fc6ce598b1455c3ad47b4 assets/create/blockstates/belt_observer.json cf9045eb16e5299a1d917c4cb536289f49411276 assets/create/blockstates/birch_window.json 94a1a91403eb4b035fec48071e7fcae57a8a6abd assets/create/blockstates/birch_window_pane.json 58b07d2af6030342f0354f6d3fd0ee128d2d74b4 assets/create/blockstates/black_seat.json @@ -43,6 +42,7 @@ b59324f051f21d8ce1a48a08f4721a61a3c414d6 assets/create/blockstates/chute.json 4947c261310445fa55b92038326ac82967d192dd assets/create/blockstates/clockwork_bearing.json 1f33834c685e3243882acfe20183fe64dfa872be assets/create/blockstates/clutch.json e5e3757e99c139d67b2a70288466d8a74d818841 assets/create/blockstates/cogwheel.json +36f54136a7756c97f71bc6b47ef4e8e575e72879 assets/create/blockstates/content_observer.json f8eff64c75fc599e9a44a003f54ae9931cd8ce7c assets/create/blockstates/copper_block.json cabf6b8c59eb0e3d56a0a5a856ca058bb3200882 assets/create/blockstates/copper_casing.json 3355a852cdc717e257ca19b3db836068964733e3 assets/create/blockstates/copper_ore.json @@ -349,17 +349,17 @@ c77b46d8b459e5c7cc495393546f3fcca8a1fa1d assets/create/blockstates/weathered_lim a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.json 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json -c87674f2935327f78657f1bb44b3b10b6697a548 assets/create/lang/en_ud.json -62a4c9e5454fd6e899495c95d6fddd020d472bc7 assets/create/lang/en_us.json -42081320880e3248cc1e7e667d38bb3be682790a assets/create/lang/unfinished/de_de.json -8fc3d8467436b5dd9221b0ed72b1a64bf83d0767 assets/create/lang/unfinished/fr_fr.json -a5125e0ca8bb93c7c4f11d49a80a155a7ea14b16 assets/create/lang/unfinished/it_it.json -b173b6500f8a675e266864310ab8e205721dbe12 assets/create/lang/unfinished/ja_jp.json -1af8e96a3129f8aac458b75eff69378a0cc9dd7d assets/create/lang/unfinished/ko_kr.json -343a4455ca0f29b2ae6ac439030c0dfde0e4c59b assets/create/lang/unfinished/nl_nl.json -d7bd8d85e3b8def1b4fe72da0a43845d1bb61c1c assets/create/lang/unfinished/pt_br.json -6e7fdb53ae3121e5575021bb224d1bfbe257c38b assets/create/lang/unfinished/ru_ru.json -1a3e1309d92024445dae821d25168dab74ff5cdd assets/create/lang/unfinished/zh_cn.json +5e8bf32d45aae9207aa4063803d073dda12fefc9 assets/create/lang/en_ud.json +a623a699b4b15b1793846f2981f5ddfcf5f70eaa assets/create/lang/en_us.json +20b98763fcc45b49d4f08c0567de1305ae2ca08b assets/create/lang/unfinished/de_de.json +49356dba136af4ba87c61adcec8a5e86ffed0d19 assets/create/lang/unfinished/fr_fr.json +7aeadfee8cf3f5037a892d20dc5ed5a73015822d assets/create/lang/unfinished/it_it.json +da24efa68279d5bd95c55210cc5ecb46f7b28550 assets/create/lang/unfinished/ja_jp.json +e391370d913d9ea71b061ead791e335c5fd5abe1 assets/create/lang/unfinished/ko_kr.json +920688bd6cfdbb4a3f3a35700868b5639f10bf2a assets/create/lang/unfinished/nl_nl.json +d57b0279090380d35f6f56a34864114b210d815c assets/create/lang/unfinished/pt_br.json +4f957b1130d5f2ae953d687d754417de0f62fd61 assets/create/lang/unfinished/ru_ru.json +c2198b6cee5fdba4049fd2166f6382e5bbaf6581 assets/create/lang/unfinished/zh_cn.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json @@ -415,22 +415,6 @@ aaf2e4259bcfcedd3400e9acb2d64c0cf06f7fb1 assets/create/models/block/andesite_tun c9aec5c30e6821c8f125202cad236afa48f6c358 assets/create/models/block/andesite_tunnel/t_left.json 1dcb8fe81a275ef8a49c04db021ad29abe8b38ae assets/create/models/block/andesite_tunnel/t_right.json e2801a0c3fe8e1c2485291485b977f581fdc8b7c assets/create/models/block/andesite_tunnel/window.json -e8bfb63e0a4426f9d95cd111640169b218dead1b assets/create/models/block/belt_observer/detect.json -a2e63810eceb028484b193ddf4315e1811950dc8 assets/create/models/block/belt_observer/detect_belt.json -034c308d46def892e6638ac0b3374849a6a88a26 assets/create/models/block/belt_observer/detect_belt_powered.json -0bddcf5449e18abbc11e984f4b125141b14baaf7 assets/create/models/block/belt_observer/detect_powered.json -c521e51b557f4643027fe7a8ec9d4f6a4ade1279 assets/create/models/block/belt_observer/eject.json -79863633fc1fec21241650a5eb3203cf4d3fd210 assets/create/models/block/belt_observer/eject_belt.json -a6d8262629371113147f8b13986a6f72c51fc100 assets/create/models/block/belt_observer/eject_belt_powered.json -2dad3c6bd49c4b608ad7c30567bb3e5845c46cf8 assets/create/models/block/belt_observer/eject_powered.json -e1b801f2f37a78f18a787f4484f7b8ec57671c4f assets/create/models/block/belt_observer/pulse.json -fc6dd3e43af11ede6ef5d402d30715ebf69dac2e assets/create/models/block/belt_observer/pulse_belt.json -7d2490e4228ce4f0ee8875d5ac5fef92eea68015 assets/create/models/block/belt_observer/pulse_belt_powered.json -fa79580db6187c864bc8148a41987ecdd1eb03b7 assets/create/models/block/belt_observer/pulse_powered.json -4f14a279e486242a65b4d6dbcdfc33db9b71942b assets/create/models/block/belt_observer/split.json -670adf5eee3f7a4b99267bd837334be6a8173e4e assets/create/models/block/belt_observer/split_belt.json -819d3107908ce21220ad45b0ae3e1c92c13c601d assets/create/models/block/belt_observer/split_belt_powered.json -76078947044ca9fc7860708ae9717a0ae47ebb1e assets/create/models/block/belt_observer/split_powered.json 87f90e8256060683b834d57d3c11248d5ea84e34 assets/create/models/block/birch_window.json 94317904054cbf651846716d8af3bca618d3130f assets/create/models/block/birch_window_pane_noside.json 7a4cae5b075c4ac96a3113afafa391d024fc117f assets/create/models/block/birch_window_pane_noside_alt.json @@ -1028,7 +1012,6 @@ b0f664dd6de3d0ee9afcb6223fbcd53b97fa0d65 assets/create/models/item/andesite_cobb c0e35daccfb398947532e9499d6bda963387cd9c assets/create/models/item/andesite_tunnel.json bf1fc6bdf7fca6f1958a2d3e96202c1cecb50669 assets/create/models/item/basin.json 1da382e7e58eaa9788f5b1d92221ccac573e068f assets/create/models/item/belt_connector.json -695a69d5854e2eb134b55d855bd2b7b18808a01d assets/create/models/item/belt_observer.json 9044243882cfd49a2827e1b910a4c9b0e46daa47 assets/create/models/item/birch_window.json 6ed49f59ea91068ef68720f43e67a9237594bdf0 assets/create/models/item/birch_window_pane.json 22632bd681c8a605f0845f7549770389a741156a assets/create/models/item/black_seat.json @@ -1054,6 +1037,7 @@ fe67c3f380d17735a9436a4579a8be1a02b8e4a0 assets/create/models/item/chute.json b1531a7bd3f7f27b9587d13e818a93dc2d088bc8 assets/create/models/item/clockwork_bearing.json 0a2a0f0aafeab0088172f77afd40c1fa2cc1f2b8 assets/create/models/item/clutch.json dcb09deae110077bcddf090996b51cc66e9a7de3 assets/create/models/item/cogwheel.json +7717e3b21cff39f497f07687c70c1fa40eaa756d assets/create/models/item/content_observer.json 965a90a882d85dba93b30af9bce7ecf8e68ce747 assets/create/models/item/copper_block.json 759bcb5fe7dfdd628716f9b4ff19a5ab00393381 assets/create/models/item/copper_casing.json c5bcfba46f5824654dedaa2c5d5f42deb29e3baf assets/create/models/item/copper_ingot.json @@ -1540,9 +1524,9 @@ afc74c4dda92c4976703a1c488182188c3482839 data/create/advancements/recipes/create 4793d335955c9d6c293e1358dc227eac93a5fe61 data/create/advancements/recipes/create.base/crafting/logistics/adjustable_repeater.json bbcf2a888e12c41aedf7b44a1b0d92b7b9fe853b data/create/advancements/recipes/create.base/crafting/logistics/andesite_funnel.json b53ed0a286512d2695caf0430433483bdeeeef95 data/create/advancements/recipes/create.base/crafting/logistics/andesite_tunnel.json -678bdd68437274edf4630af1440525764be35dc6 data/create/advancements/recipes/create.base/crafting/logistics/belt_observer.json 66dbb3486c5d38d309dd480e3f2ab0eb5ff9e559 data/create/advancements/recipes/create.base/crafting/logistics/brass_funnel.json 2127c0f1d822cc88a24d98ebb9eead9de5837ffe data/create/advancements/recipes/create.base/crafting/logistics/brass_tunnel.json +ca9ad1e9129745c3d21af86bc795b5a65ba086a2 data/create/advancements/recipes/create.base/crafting/logistics/content_observer.json b9b0a8bfff61a89149d4fcadf679f753385212d0 data/create/advancements/recipes/create.base/crafting/logistics/powered_latch.json 9951f2d35f7444c98c022142119b18b1289ca734 data/create/advancements/recipes/create.base/crafting/logistics/powered_toggle_latch.json 76d4c5f04d0a3e6817127a828594388b18f210c4 data/create/advancements/recipes/create.base/crafting/logistics/pulse_repeater.json @@ -2010,7 +1994,6 @@ d3202a337c15c8b8ec41fa5879bb94327bb75057 data/create/loot_tables/blocks/andesite 317aa99086127c649981b7b2fc85e66774a30f58 data/create/loot_tables/blocks/andesite_tunnel.json 14bf1764b9313893b6a6f57094f9506ac9fa71a8 data/create/loot_tables/blocks/basin.json c7f81e30c31837a287d6d6040cdb02c7dec11441 data/create/loot_tables/blocks/belt.json -1104e323abb2a8c25769c47dc5d1154965113cc9 data/create/loot_tables/blocks/belt_observer.json 67a8e2513c3cb09e6fe80279fda94f79d5018c37 data/create/loot_tables/blocks/birch_window.json bf1d5843f93533f84bc4adec5b77da2114fa2025 data/create/loot_tables/blocks/birch_window_pane.json cccc209d172cc7bac76f1b4ac79085ee90742ab2 data/create/loot_tables/blocks/black_seat.json @@ -2033,6 +2016,7 @@ adde89e46b12de1eee6fd0c5cb98c5f45feefc15 data/create/loot_tables/blocks/chiseled 778b53c36d73b6e9c78fd6c091c9c3535c3c18f7 data/create/loot_tables/blocks/clockwork_bearing.json d76113310fc56eca6382d44df174096f2210d416 data/create/loot_tables/blocks/clutch.json 673ba3a5deae9133b917d16c9eb87fe4c2873c8a data/create/loot_tables/blocks/cogwheel.json +096af6b5df6e87d36cb936eea9b00982a554f4af data/create/loot_tables/blocks/content_observer.json f38802b919c49f162f102d6e5d94113f05bf4ab1 data/create/loot_tables/blocks/copper_block.json 5a65a18ea787130ac7b8f5652bfa5ed187446649 data/create/loot_tables/blocks/copper_casing.json 31a51237763c374b7cdf39b9b62c14e965871047 data/create/loot_tables/blocks/copper_ore.json @@ -2480,9 +2464,9 @@ c465151b64381e2222203bf069b717435fdc2b26 data/create/recipes/crafting/logistics/ 34bcdffae0b104829161c86b7d161068f890daa2 data/create/recipes/crafting/logistics/adjustable_repeater.json fc75c87159569cb6ee978e6d51b0c3b0f504b5de data/create/recipes/crafting/logistics/andesite_funnel.json 660e824ab6042c145f02ffcfe95a34c38f113e19 data/create/recipes/crafting/logistics/andesite_tunnel.json -95cc99c90cb146eb85023748c4230840a4e6568e data/create/recipes/crafting/logistics/belt_observer.json 9b4e74f9a950191134d978bf45c3339212677b0d data/create/recipes/crafting/logistics/brass_funnel.json 2ae06df0357c494b53db0ddf9655c60ef2022d0b data/create/recipes/crafting/logistics/brass_tunnel.json +8559045b42abd99490fb9a3cf5d06b08fd014b38 data/create/recipes/crafting/logistics/content_observer.json a32ac53848862837f3044ff9c81ed62c1134fe4f data/create/recipes/crafting/logistics/powered_latch.json 660eb73bcc66c1528cbd4d4204ad6b771f4bd721 data/create/recipes/crafting/logistics/powered_toggle_latch.json 74b8a38d252cce564cc63db2ade41ed2d656d025 data/create/recipes/crafting/logistics/pulse_repeater.json diff --git a/src/generated/resources/assets/create/blockstates/belt_observer.json b/src/generated/resources/assets/create/blockstates/belt_observer.json deleted file mode 100644 index 218931245..000000000 --- a/src/generated/resources/assets/create/blockstates/belt_observer.json +++ /dev/null @@ -1,244 +0,0 @@ -{ - "variants": { - "belt=false,facing=north,mode=detect,powered=false": { - "model": "create:block/belt_observer/detect", - "y": 180 - }, - "belt=true,facing=north,mode=detect,powered=false": { - "model": "create:block/belt_observer/detect_belt", - "y": 180 - }, - "belt=false,facing=south,mode=detect,powered=false": { - "model": "create:block/belt_observer/detect" - }, - "belt=true,facing=south,mode=detect,powered=false": { - "model": "create:block/belt_observer/detect_belt" - }, - "belt=false,facing=west,mode=detect,powered=false": { - "model": "create:block/belt_observer/detect", - "y": 90 - }, - "belt=true,facing=west,mode=detect,powered=false": { - "model": "create:block/belt_observer/detect_belt", - "y": 90 - }, - "belt=false,facing=east,mode=detect,powered=false": { - "model": "create:block/belt_observer/detect", - "y": 270 - }, - "belt=true,facing=east,mode=detect,powered=false": { - "model": "create:block/belt_observer/detect_belt", - "y": 270 - }, - "belt=false,facing=north,mode=pulse,powered=false": { - "model": "create:block/belt_observer/pulse", - "y": 180 - }, - "belt=true,facing=north,mode=pulse,powered=false": { - "model": "create:block/belt_observer/pulse_belt", - "y": 180 - }, - "belt=false,facing=south,mode=pulse,powered=false": { - "model": "create:block/belt_observer/pulse" - }, - "belt=true,facing=south,mode=pulse,powered=false": { - "model": "create:block/belt_observer/pulse_belt" - }, - "belt=false,facing=west,mode=pulse,powered=false": { - "model": "create:block/belt_observer/pulse", - "y": 90 - }, - "belt=true,facing=west,mode=pulse,powered=false": { - "model": "create:block/belt_observer/pulse_belt", - "y": 90 - }, - "belt=false,facing=east,mode=pulse,powered=false": { - "model": "create:block/belt_observer/pulse", - "y": 270 - }, - "belt=true,facing=east,mode=pulse,powered=false": { - "model": "create:block/belt_observer/pulse_belt", - "y": 270 - }, - "belt=false,facing=north,mode=eject,powered=false": { - "model": "create:block/belt_observer/eject", - "y": 180 - }, - "belt=true,facing=north,mode=eject,powered=false": { - "model": "create:block/belt_observer/eject_belt", - "y": 180 - }, - "belt=false,facing=south,mode=eject,powered=false": { - "model": "create:block/belt_observer/eject" - }, - "belt=true,facing=south,mode=eject,powered=false": { - "model": "create:block/belt_observer/eject_belt" - }, - "belt=false,facing=west,mode=eject,powered=false": { - "model": "create:block/belt_observer/eject", - "y": 90 - }, - "belt=true,facing=west,mode=eject,powered=false": { - "model": "create:block/belt_observer/eject_belt", - "y": 90 - }, - "belt=false,facing=east,mode=eject,powered=false": { - "model": "create:block/belt_observer/eject", - "y": 270 - }, - "belt=true,facing=east,mode=eject,powered=false": { - "model": "create:block/belt_observer/eject_belt", - "y": 270 - }, - "belt=false,facing=north,mode=split,powered=false": { - "model": "create:block/belt_observer/split", - "y": 180 - }, - "belt=true,facing=north,mode=split,powered=false": { - "model": "create:block/belt_observer/split_belt", - "y": 180 - }, - "belt=false,facing=south,mode=split,powered=false": { - "model": "create:block/belt_observer/split" - }, - "belt=true,facing=south,mode=split,powered=false": { - "model": "create:block/belt_observer/split_belt" - }, - "belt=false,facing=west,mode=split,powered=false": { - "model": "create:block/belt_observer/split", - "y": 90 - }, - "belt=true,facing=west,mode=split,powered=false": { - "model": "create:block/belt_observer/split_belt", - "y": 90 - }, - "belt=false,facing=east,mode=split,powered=false": { - "model": "create:block/belt_observer/split", - "y": 270 - }, - "belt=true,facing=east,mode=split,powered=false": { - "model": "create:block/belt_observer/split_belt", - "y": 270 - }, - "belt=false,facing=north,mode=detect,powered=true": { - "model": "create:block/belt_observer/detect_powered", - "y": 180 - }, - "belt=true,facing=north,mode=detect,powered=true": { - "model": "create:block/belt_observer/detect_belt_powered", - "y": 180 - }, - "belt=false,facing=south,mode=detect,powered=true": { - "model": "create:block/belt_observer/detect_powered" - }, - "belt=true,facing=south,mode=detect,powered=true": { - "model": "create:block/belt_observer/detect_belt_powered" - }, - "belt=false,facing=west,mode=detect,powered=true": { - "model": "create:block/belt_observer/detect_powered", - "y": 90 - }, - "belt=true,facing=west,mode=detect,powered=true": { - "model": "create:block/belt_observer/detect_belt_powered", - "y": 90 - }, - "belt=false,facing=east,mode=detect,powered=true": { - "model": "create:block/belt_observer/detect_powered", - "y": 270 - }, - "belt=true,facing=east,mode=detect,powered=true": { - "model": "create:block/belt_observer/detect_belt_powered", - "y": 270 - }, - "belt=false,facing=north,mode=pulse,powered=true": { - "model": "create:block/belt_observer/pulse_powered", - "y": 180 - }, - "belt=true,facing=north,mode=pulse,powered=true": { - "model": "create:block/belt_observer/pulse_belt_powered", - "y": 180 - }, - "belt=false,facing=south,mode=pulse,powered=true": { - "model": "create:block/belt_observer/pulse_powered" - }, - "belt=true,facing=south,mode=pulse,powered=true": { - "model": "create:block/belt_observer/pulse_belt_powered" - }, - "belt=false,facing=west,mode=pulse,powered=true": { - "model": "create:block/belt_observer/pulse_powered", - "y": 90 - }, - "belt=true,facing=west,mode=pulse,powered=true": { - "model": "create:block/belt_observer/pulse_belt_powered", - "y": 90 - }, - "belt=false,facing=east,mode=pulse,powered=true": { - "model": "create:block/belt_observer/pulse_powered", - "y": 270 - }, - "belt=true,facing=east,mode=pulse,powered=true": { - "model": "create:block/belt_observer/pulse_belt_powered", - "y": 270 - }, - "belt=false,facing=north,mode=eject,powered=true": { - "model": "create:block/belt_observer/eject_powered", - "y": 180 - }, - "belt=true,facing=north,mode=eject,powered=true": { - "model": "create:block/belt_observer/eject_belt_powered", - "y": 180 - }, - "belt=false,facing=south,mode=eject,powered=true": { - "model": "create:block/belt_observer/eject_powered" - }, - "belt=true,facing=south,mode=eject,powered=true": { - "model": "create:block/belt_observer/eject_belt_powered" - }, - "belt=false,facing=west,mode=eject,powered=true": { - "model": "create:block/belt_observer/eject_powered", - "y": 90 - }, - "belt=true,facing=west,mode=eject,powered=true": { - "model": "create:block/belt_observer/eject_belt_powered", - "y": 90 - }, - "belt=false,facing=east,mode=eject,powered=true": { - "model": "create:block/belt_observer/eject_powered", - "y": 270 - }, - "belt=true,facing=east,mode=eject,powered=true": { - "model": "create:block/belt_observer/eject_belt_powered", - "y": 270 - }, - "belt=false,facing=north,mode=split,powered=true": { - "model": "create:block/belt_observer/split_powered", - "y": 180 - }, - "belt=true,facing=north,mode=split,powered=true": { - "model": "create:block/belt_observer/split_belt_powered", - "y": 180 - }, - "belt=false,facing=south,mode=split,powered=true": { - "model": "create:block/belt_observer/split_powered" - }, - "belt=true,facing=south,mode=split,powered=true": { - "model": "create:block/belt_observer/split_belt_powered" - }, - "belt=false,facing=west,mode=split,powered=true": { - "model": "create:block/belt_observer/split_powered", - "y": 90 - }, - "belt=true,facing=west,mode=split,powered=true": { - "model": "create:block/belt_observer/split_belt_powered", - "y": 90 - }, - "belt=false,facing=east,mode=split,powered=true": { - "model": "create:block/belt_observer/split_powered", - "y": 270 - }, - "belt=true,facing=east,mode=split,powered=true": { - "model": "create:block/belt_observer/split_belt_powered", - "y": 270 - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/content_observer.json b/src/generated/resources/assets/create/blockstates/content_observer.json new file mode 100644 index 000000000..e66a1472c --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/content_observer.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=north,powered=false": { + "model": "create:block/content_observer/block" + }, + "facing=south,powered=false": { + "model": "create:block/content_observer/block", + "y": 180 + }, + "facing=west,powered=false": { + "model": "create:block/content_observer/block", + "y": 270 + }, + "facing=east,powered=false": { + "model": "create:block/content_observer/block", + "y": 90 + }, + "facing=north,powered=true": { + "model": "create:block/content_observer/block_powered" + }, + "facing=south,powered=true": { + "model": "create:block/content_observer/block_powered", + "y": 180 + }, + "facing=west,powered=true": { + "model": "create:block/content_observer/block_powered", + "y": 270 + }, + "facing=east,powered=true": { + "model": "create:block/content_observer/block_powered", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 164f096ac..720fa1360 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -21,7 +21,6 @@ "block.create.andesite_tunnel": "\u05DF\u01DDuun\u27D8 \u01DD\u0287\u0131s\u01DDpu\u2C6F", "block.create.basin": "u\u0131s\u0250\u15FA", "block.create.belt": "\u0287\u05DF\u01DD\u15FA", - "block.create.belt_observer": "\u0279\u01DD\u028C\u0279\u01DDsqO \u0287\u05DF\u01DD\u15FA", "block.create.birch_window": "\u028Dopu\u0131M \u0265\u0254\u0279\u0131\u15FA", "block.create.birch_window_pane": "\u01DDu\u0250\u0500 \u028Dopu\u0131M \u0265\u0254\u0279\u0131\u15FA", "block.create.black_seat": "\u0287\u0250\u01DDS \u029E\u0254\u0250\u05DF\u15FA", @@ -44,6 +43,7 @@ "block.create.clockwork_bearing": "bu\u0131\u0279\u0250\u01DD\u15FA \u029E\u0279o\u028D\u029E\u0254o\u05DF\u0186", "block.create.clutch": "\u0265\u0254\u0287n\u05DF\u0186", "block.create.cogwheel": "\u05DF\u01DD\u01DD\u0265\u028Dbo\u0186", + "block.create.content_observer": "\u0279\u01DD\u028C\u0279\u01DDsqO \u0287u\u01DD\u0287uo\u0186", "block.create.copper_block": "\u029E\u0254o\u05DF\u15FA \u0279\u01DDddo\u0186", "block.create.copper_casing": "bu\u0131s\u0250\u0186 \u0279\u01DDddo\u0186", "block.create.copper_ore": "\u01DD\u0279O \u0279\u01DDddo\u0186", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 9475d69b2..7e02b0a84 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -24,7 +24,6 @@ "block.create.andesite_tunnel": "Andesite Tunnel", "block.create.basin": "Basin", "block.create.belt": "Belt", - "block.create.belt_observer": "Belt Observer", "block.create.birch_window": "Birch Window", "block.create.birch_window_pane": "Birch Window Pane", "block.create.black_seat": "Black Seat", @@ -47,6 +46,7 @@ "block.create.clockwork_bearing": "Clockwork Bearing", "block.create.clutch": "Clutch", "block.create.cogwheel": "Cogwheel", + "block.create.content_observer": "Content Observer", "block.create.copper_block": "Copper Block", "block.create.copper_casing": "Copper Casing", "block.create.copper_ore": "Copper Ore", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index 2f46228b6..09c9e0774 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 804", + "_": "Missing Localizations: 805", "_": "->------------------------] Game Elements [------------------------<-", @@ -25,7 +25,6 @@ "block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel", "block.create.basin": "UNLOCALIZED: Basin", "block.create.belt": "Mechanischer Riemen", - "block.create.belt_observer": "Fließband-Beobachter", "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.black_seat": "UNLOCALIZED: Black Seat", @@ -48,6 +47,7 @@ "block.create.clockwork_bearing": "UNLOCALIZED: Clockwork Bearing", "block.create.clutch": "Kupplung", "block.create.cogwheel": "Zahnrad", + "block.create.content_observer": "UNLOCALIZED: Content Observer", "block.create.copper_block": "UNLOCALIZED: Copper Block", "block.create.copper_casing": "UNLOCALIZED: Copper Casing", "block.create.copper_ore": "UNLOCALIZED: Copper Ore", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index 820163344..0dbeb86da 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 428", + "_": "Missing Localizations: 429", "_": "->------------------------] Game Elements [------------------------<-", @@ -25,7 +25,6 @@ "block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel", "block.create.basin": "Bassin", "block.create.belt": "Tapis roulant", - "block.create.belt_observer": "Observateur d'entité", "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.black_seat": "UNLOCALIZED: Black Seat", @@ -48,6 +47,7 @@ "block.create.clockwork_bearing": "Roulement mécanique horloger", "block.create.clutch": "Embrayage", "block.create.cogwheel": "Roue dentée", + "block.create.content_observer": "UNLOCALIZED: Content Observer", "block.create.copper_block": "Bloc de cuivre", "block.create.copper_casing": "Boîtier en cuivre", "block.create.copper_ore": "Minerai de cuivre", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index 299ac1c3a..2951abe01 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 412", + "_": "Missing Localizations: 413", "_": "->------------------------] Game Elements [------------------------<-", @@ -25,7 +25,6 @@ "block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel", "block.create.basin": "Bacinella", "block.create.belt": "Nastro Meccanico", - "block.create.belt_observer": "Osservatore a Cinghia", "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.black_seat": "UNLOCALIZED: Black Seat", @@ -48,6 +47,7 @@ "block.create.clockwork_bearing": "Supporto del Orologio", "block.create.clutch": "Frizione", "block.create.cogwheel": "Ruota Dentata", + "block.create.content_observer": "UNLOCALIZED: Content Observer", "block.create.copper_block": "Blocco di Rame", "block.create.copper_casing": "Involucro di Rame", "block.create.copper_ore": "Rame Grezzo", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index 4c339d77d..0da7ed792 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 407", + "_": "Missing Localizations: 408", "_": "->------------------------] Game Elements [------------------------<-", @@ -25,7 +25,6 @@ "block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel", "block.create.basin": "鉢", "block.create.belt": "メカニカルベルト", - "block.create.belt_observer": "ベルトオブザーバー", "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.black_seat": "UNLOCALIZED: Black Seat", @@ -48,6 +47,7 @@ "block.create.clockwork_bearing": "時計仕掛けのベアリング", "block.create.clutch": "クラッチ", "block.create.cogwheel": "歯車", + "block.create.content_observer": "UNLOCALIZED: Content Observer", "block.create.copper_block": "銅ブロック", "block.create.copper_casing": "銅ケーシング", "block.create.copper_ore": "銅鉱石", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index fc1468e89..d0b4cc6a4 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 412", + "_": "Missing Localizations: 413", "_": "->------------------------] Game Elements [------------------------<-", @@ -25,7 +25,6 @@ "block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel", "block.create.basin": "대야", "block.create.belt": "컨베이어 벨트", - "block.create.belt_observer": "벨트 감지기", "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.black_seat": "UNLOCALIZED: Black Seat", @@ -48,6 +47,7 @@ "block.create.clockwork_bearing": "시계 베어링", "block.create.clutch": "클러치", "block.create.cogwheel": "톱나버퀴", + "block.create.content_observer": "UNLOCALIZED: Content Observer", "block.create.copper_block": "구리 블럭", "block.create.copper_casing": "구리 케이스", "block.create.copper_ore": "구리 광석", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index a120cfccd..d41a674fe 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 742", + "_": "Missing Localizations: 743", "_": "->------------------------] Game Elements [------------------------<-", @@ -25,7 +25,6 @@ "block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel", "block.create.basin": "Bekken", "block.create.belt": "Mechanische Transportband", - "block.create.belt_observer": "Transportband Observeerder", "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.black_seat": "UNLOCALIZED: Black Seat", @@ -48,6 +47,7 @@ "block.create.clockwork_bearing": "UNLOCALIZED: Clockwork Bearing", "block.create.clutch": "Koppeling", "block.create.cogwheel": "Tandwiel", + "block.create.content_observer": "UNLOCALIZED: Content Observer", "block.create.copper_block": "UNLOCALIZED: Copper Block", "block.create.copper_casing": "UNLOCALIZED: Copper Casing", "block.create.copper_ore": "UNLOCALIZED: Copper Ore", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index f1753a13b..85dbbd4b5 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 811", + "_": "Missing Localizations: 812", "_": "->------------------------] Game Elements [------------------------<-", @@ -25,7 +25,6 @@ "block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel", "block.create.basin": "UNLOCALIZED: Basin", "block.create.belt": "Esteira Mecânica", - "block.create.belt_observer": "Observador de Esteira", "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.black_seat": "UNLOCALIZED: Black Seat", @@ -48,6 +47,7 @@ "block.create.clockwork_bearing": "UNLOCALIZED: Clockwork Bearing", "block.create.clutch": "Embreagem", "block.create.cogwheel": "Roda Dentada", + "block.create.content_observer": "UNLOCALIZED: Content Observer", "block.create.copper_block": "UNLOCALIZED: Copper Block", "block.create.copper_casing": "UNLOCALIZED: Copper Casing", "block.create.copper_ore": "UNLOCALIZED: Copper Ore", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index 4ea84c952..a1b2f184b 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 805", + "_": "Missing Localizations: 806", "_": "->------------------------] Game Elements [------------------------<-", @@ -25,7 +25,6 @@ "block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel", "block.create.basin": "UNLOCALIZED: Basin", "block.create.belt": "Механическая лента", - "block.create.belt_observer": "Ленточный сканер", "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.black_seat": "UNLOCALIZED: Black Seat", @@ -48,6 +47,7 @@ "block.create.clockwork_bearing": "UNLOCALIZED: Clockwork Bearing", "block.create.clutch": "Переключаемая муфта", "block.create.cogwheel": "Шестерня", + "block.create.content_observer": "UNLOCALIZED: Content Observer", "block.create.copper_block": "UNLOCALIZED: Copper Block", "block.create.copper_casing": "UNLOCALIZED: Copper Casing", "block.create.copper_ore": "UNLOCALIZED: Copper Ore", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index de1d2d829..a71cef0e7 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 92", + "_": "Missing Localizations: 93", "_": "->------------------------] Game Elements [------------------------<-", @@ -25,7 +25,6 @@ "block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel", "block.create.basin": "工作盆", "block.create.belt": "传送带", - "block.create.belt_observer": "传送带侦测器", "block.create.birch_window": "白桦窗户", "block.create.birch_window_pane": "白桦窗户板", "block.create.black_seat": "UNLOCALIZED: Black Seat", @@ -48,6 +47,7 @@ "block.create.clockwork_bearing": "时钟轴承", "block.create.clutch": "离合器", "block.create.cogwheel": "齿轮", + "block.create.content_observer": "UNLOCALIZED: Content Observer", "block.create.copper_block": "铜块", "block.create.copper_casing": "铜机壳", "block.create.copper_ore": "铜矿石", diff --git a/src/generated/resources/assets/create/models/block/belt_observer/detect.json b/src/generated/resources/assets/create/models/block/belt_observer/detect.json deleted file mode 100644 index 2d895145a..000000000 --- a/src/generated/resources/assets/create/models/block/belt_observer/detect.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/belt_observer/base", - "textures": { - "texture": "create:block/belt_observer_detect" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/belt_observer/detect_belt.json b/src/generated/resources/assets/create/models/block/belt_observer/detect_belt.json deleted file mode 100644 index 457f5d21d..000000000 --- a/src/generated/resources/assets/create/models/block/belt_observer/detect_belt.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/belt_observer/base_belt", - "textures": { - "texture": "create:block/belt_observer_detect" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/belt_observer/detect_belt_powered.json b/src/generated/resources/assets/create/models/block/belt_observer/detect_belt_powered.json deleted file mode 100644 index a0b2b28d3..000000000 --- a/src/generated/resources/assets/create/models/block/belt_observer/detect_belt_powered.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/belt_observer/base_belt_powered", - "textures": { - "texture": "create:block/belt_observer_detect_powered" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/belt_observer/detect_powered.json b/src/generated/resources/assets/create/models/block/belt_observer/detect_powered.json deleted file mode 100644 index 5e47b062d..000000000 --- a/src/generated/resources/assets/create/models/block/belt_observer/detect_powered.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/belt_observer/base_powered", - "textures": { - "texture": "create:block/belt_observer_detect_powered" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/belt_observer/eject.json b/src/generated/resources/assets/create/models/block/belt_observer/eject.json deleted file mode 100644 index b3ca66e24..000000000 --- a/src/generated/resources/assets/create/models/block/belt_observer/eject.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/belt_observer/base", - "textures": { - "texture": "create:block/belt_observer_eject" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/belt_observer/eject_belt.json b/src/generated/resources/assets/create/models/block/belt_observer/eject_belt.json deleted file mode 100644 index a9f7029e7..000000000 --- a/src/generated/resources/assets/create/models/block/belt_observer/eject_belt.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/belt_observer/base_belt", - "textures": { - "texture": "create:block/belt_observer_eject" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/belt_observer/eject_belt_powered.json b/src/generated/resources/assets/create/models/block/belt_observer/eject_belt_powered.json deleted file mode 100644 index 77cc7bee9..000000000 --- a/src/generated/resources/assets/create/models/block/belt_observer/eject_belt_powered.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/belt_observer/base_belt_powered", - "textures": { - "texture": "create:block/belt_observer_eject_powered" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/belt_observer/eject_powered.json b/src/generated/resources/assets/create/models/block/belt_observer/eject_powered.json deleted file mode 100644 index ba74df7ba..000000000 --- a/src/generated/resources/assets/create/models/block/belt_observer/eject_powered.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/belt_observer/base_powered", - "textures": { - "texture": "create:block/belt_observer_eject_powered" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/belt_observer/pulse.json b/src/generated/resources/assets/create/models/block/belt_observer/pulse.json deleted file mode 100644 index 96053ebdd..000000000 --- a/src/generated/resources/assets/create/models/block/belt_observer/pulse.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/belt_observer/base", - "textures": { - "texture": "create:block/belt_observer_pulse" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/belt_observer/pulse_belt.json b/src/generated/resources/assets/create/models/block/belt_observer/pulse_belt.json deleted file mode 100644 index 17c00b4d2..000000000 --- a/src/generated/resources/assets/create/models/block/belt_observer/pulse_belt.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/belt_observer/base_belt", - "textures": { - "texture": "create:block/belt_observer_pulse" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/belt_observer/pulse_belt_powered.json b/src/generated/resources/assets/create/models/block/belt_observer/pulse_belt_powered.json deleted file mode 100644 index 5b36ec7ed..000000000 --- a/src/generated/resources/assets/create/models/block/belt_observer/pulse_belt_powered.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/belt_observer/base_belt_powered", - "textures": { - "texture": "create:block/belt_observer_pulse_powered" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/belt_observer/pulse_powered.json b/src/generated/resources/assets/create/models/block/belt_observer/pulse_powered.json deleted file mode 100644 index 316f2a16f..000000000 --- a/src/generated/resources/assets/create/models/block/belt_observer/pulse_powered.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/belt_observer/base_powered", - "textures": { - "texture": "create:block/belt_observer_pulse_powered" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/belt_observer/split.json b/src/generated/resources/assets/create/models/block/belt_observer/split.json deleted file mode 100644 index 2c36d0dce..000000000 --- a/src/generated/resources/assets/create/models/block/belt_observer/split.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/belt_observer/base", - "textures": { - "texture": "create:block/belt_observer_split" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/belt_observer/split_belt.json b/src/generated/resources/assets/create/models/block/belt_observer/split_belt.json deleted file mode 100644 index d6e303816..000000000 --- a/src/generated/resources/assets/create/models/block/belt_observer/split_belt.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/belt_observer/base_belt", - "textures": { - "texture": "create:block/belt_observer_split" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/belt_observer/split_belt_powered.json b/src/generated/resources/assets/create/models/block/belt_observer/split_belt_powered.json deleted file mode 100644 index 1ae9418ca..000000000 --- a/src/generated/resources/assets/create/models/block/belt_observer/split_belt_powered.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/belt_observer/base_belt_powered", - "textures": { - "texture": "create:block/belt_observer_split_powered" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/belt_observer/split_powered.json b/src/generated/resources/assets/create/models/block/belt_observer/split_powered.json deleted file mode 100644 index 3b2229601..000000000 --- a/src/generated/resources/assets/create/models/block/belt_observer/split_powered.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/belt_observer/base_powered", - "textures": { - "texture": "create:block/belt_observer_split_powered" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/belt_observer.json b/src/generated/resources/assets/create/models/item/belt_observer.json deleted file mode 100644 index 84c140675..000000000 --- a/src/generated/resources/assets/create/models/item/belt_observer.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "create:block/belt_observer/item" -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/content_observer.json b/src/generated/resources/assets/create/models/item/content_observer.json new file mode 100644 index 000000000..01c7ba5ef --- /dev/null +++ b/src/generated/resources/assets/create/models/item/content_observer.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/content_observer/block" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/belt_observer.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/content_observer.json similarity index 81% rename from src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/belt_observer.json rename to src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/content_observer.json index 9e9f647d0..84dde5a75 100644 --- a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/belt_observer.json +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/logistics/content_observer.json @@ -2,7 +2,7 @@ "parent": "minecraft:recipes/root", "rewards": { "recipes": [ - "create:crafting/logistics/belt_observer" + "create:crafting/logistics/content_observer" ] }, "criteria": { @@ -19,7 +19,7 @@ "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { - "recipe": "create:crafting/logistics/belt_observer" + "recipe": "create:crafting/logistics/content_observer" } } }, diff --git a/src/generated/resources/data/create/loot_tables/blocks/belt_observer.json b/src/generated/resources/data/create/loot_tables/blocks/content_observer.json similarity index 85% rename from src/generated/resources/data/create/loot_tables/blocks/belt_observer.json rename to src/generated/resources/data/create/loot_tables/blocks/content_observer.json index 3919e58e4..09c12c01b 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/belt_observer.json +++ b/src/generated/resources/data/create/loot_tables/blocks/content_observer.json @@ -6,7 +6,7 @@ "entries": [ { "type": "minecraft:item", - "name": "create:belt_observer" + "name": "create:content_observer" } ], "conditions": [ diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/belt_observer.json b/src/generated/resources/data/create/recipes/crafting/logistics/content_observer.json similarity index 89% rename from src/generated/resources/data/create/recipes/crafting/logistics/belt_observer.json rename to src/generated/resources/data/create/recipes/crafting/logistics/content_observer.json index c802d8aaa..6bc6b13f4 100644 --- a/src/generated/resources/data/create/recipes/crafting/logistics/belt_observer.json +++ b/src/generated/resources/data/create/recipes/crafting/logistics/content_observer.json @@ -19,6 +19,6 @@ } }, "result": { - "item": "create:belt_observer" + "item": "create:content_observer" } } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index cab3ae747..fba5eac5b 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -91,7 +91,6 @@ import com.simibubi.create.content.contraptions.relays.encased.GearshiftBlock; import com.simibubi.create.content.contraptions.relays.gauge.GaugeBlock; import com.simibubi.create.content.contraptions.relays.gauge.GaugeGenerator; import com.simibubi.create.content.contraptions.relays.gearbox.GearboxBlock; -import com.simibubi.create.content.logistics.block.belts.observer.BeltObserverBlock; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock; import com.simibubi.create.content.logistics.block.belts.tunnel.BrassTunnelBlock; import com.simibubi.create.content.logistics.block.belts.tunnel.BrassTunnelCTBehaviour; @@ -120,6 +119,7 @@ import com.simibubi.create.content.logistics.block.mechanicalArm.ArmBlock; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmItem; import com.simibubi.create.content.logistics.block.redstone.AnalogLeverBlock; import com.simibubi.create.content.logistics.block.redstone.ContactMovementBehaviour; +import com.simibubi.create.content.logistics.block.redstone.ContentObserverBlock; import com.simibubi.create.content.logistics.block.redstone.NixieTubeBlock; import com.simibubi.create.content.logistics.block.redstone.NixieTubeGenerator; import com.simibubi.create.content.logistics.block.redstone.RedstoneContactBlock; @@ -140,9 +140,6 @@ import com.simibubi.create.foundation.utility.DyeHelper; import com.simibubi.create.foundation.worldgen.OxidizingBlock; import com.tterrag.registrate.util.entry.BlockEntry; -import net.minecraft.advancements.criterion.InventoryChangeTrigger; -import net.minecraft.advancements.criterion.ItemPredicate; -import net.minecraft.advancements.criterion.MinMaxBounds; import net.minecraft.block.Block; import net.minecraft.block.Blocks; import net.minecraft.block.SoundType; @@ -712,24 +709,14 @@ public class AllBlocks { .patternLine("-") .key('#', DyeHelper.getWoolOfDye(colour)) .key('-', ItemTags.WOODEN_SLABS) - .addCriterion("has_wool", - new InventoryChangeTrigger.Instance(MinMaxBounds.IntBound.UNBOUNDED, - MinMaxBounds.IntBound.UNBOUNDED, MinMaxBounds.IntBound.UNBOUNDED, - new ItemPredicate[] { ItemPredicate.Builder.create() - .tag(ItemTags.WOOL) - .build() })) + .addCriterion("has_wool", p.hasItem(ItemTags.WOOL)) .build(p, Create.asResource("crafting/kinetics/" + c.getName())); ShapedRecipeBuilder.shapedRecipe(c.get()) .patternLine("#") .patternLine("-") .key('#', DyeHelper.getTagOfDye(colour)) .key('-', AllItemTags.SEATS.tag) - .addCriterion("has_seat", - new InventoryChangeTrigger.Instance(MinMaxBounds.IntBound.UNBOUNDED, - MinMaxBounds.IntBound.UNBOUNDED, MinMaxBounds.IntBound.UNBOUNDED, - new ItemPredicate[] { ItemPredicate.Builder.create() - .tag(AllItemTags.SEATS.tag) - .build() })) + .addCriterion("has_seat", p.hasItem(AllItemTags.SEATS.tag)) .build(p, Create.asResource("crafting/kinetics/" + c.getName() + "_from_other_seat")); }) .tag(AllBlockTags.SEATS.tag) @@ -881,12 +868,12 @@ public class AllBlocks { .transform(customItemModel("_", "block")) .register(); - public static final BlockEntry BELT_OBSERVER = - REGISTRATE.block("belt_observer", BeltObserverBlock::new) + public static final BlockEntry CONTENT_OBSERVER = + REGISTRATE.block("content_observer", ContentObserverBlock::new) .initialProperties(SharedProperties::stone) - .blockstate(BlockStateGen.beltObserver()) + .blockstate((c, p) -> p.horizontalBlock(c.get(), AssetLookup.forPowered(c, p))) .item() - .transform(customItemModel()) + .transform(customItemModel("_", "block")) .register(); public static final BlockEntry STOCKPILE_SWITCH = diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index 7b1739db2..096b9bb76 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -52,7 +52,11 @@ public class AllShapes { .forHorizontalAxis(), STOCKPILE_SWITCH = shape(0, 0, 0, 16, 2, 16).add(1, 0, 1, 15, 16, 15) .add(0, 14, 0, 16, 16, 16) - .add(3, 3, -1, 13, 13, 2) + .add(3, 3, -2, 13, 13, 2) + .forHorizontal(NORTH), + CONTENT_OBSERVER = shape(0, 0, 0, 16, 6, 16).add(1, 0, 1, 15, 16, 15) + .add(0, 14, 0, 16, 16, 16) + .add(3, 3, -2, 13, 13, 2) .forHorizontal(NORTH), NIXIE_TUBE = shape(0, 0, 0, 16, 4, 16).add(9, 0, 5, 15, 15, 11) .add(1, 0, 5, 7, 15, 11) @@ -68,13 +72,9 @@ public class AllShapes { .add(2, 6, 2, 14, 10, 14) .add(0, 10, 0, 16, 13, 16) .forDirectional(UP), - BELT_FUNNEL_RETRACTED = - shape(2, -5, 14, 12, 14, 18) - .add(0, -5, 8, 16, 16, 14) + BELT_FUNNEL_RETRACTED = shape(2, -5, 14, 12, 14, 18).add(0, -5, 8, 16, 16, 14) .forHorizontal(NORTH), - BELT_FUNNEL_EXTENDED = - shape(2, -4, 14, 14, 14, 18) - .add(3, -4, 10, 13, 13, 14) + BELT_FUNNEL_EXTENDED = shape(2, -4, 14, 14, 14, 18).add(3, -4, 10, 13, 13, 14) .add(2, -4, 6, 14, 14, 10) .add(0, -5, 0, 16, 16, 6) .forHorizontal(NORTH), diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 70e537b4a..2a1e145f2 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -73,8 +73,6 @@ import com.simibubi.create.content.contraptions.relays.gauge.StressGaugeTileEnti import com.simibubi.create.content.contraptions.relays.gearbox.GearboxRenderer; import com.simibubi.create.content.contraptions.relays.gearbox.GearboxTileEntity; import com.simibubi.create.content.contraptions.relays.gearbox.GearshiftTileEntity; -import com.simibubi.create.content.logistics.block.belts.observer.BeltObserverRenderer; -import com.simibubi.create.content.logistics.block.belts.observer.BeltObserverTileEntity; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelRenderer; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelTileEntity; import com.simibubi.create.content.logistics.block.belts.tunnel.BrassTunnelTileEntity; @@ -93,6 +91,7 @@ import com.simibubi.create.content.logistics.block.mechanicalArm.ArmRenderer; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmTileEntity; import com.simibubi.create.content.logistics.block.redstone.AnalogLeverRenderer; import com.simibubi.create.content.logistics.block.redstone.AnalogLeverTileEntity; +import com.simibubi.create.content.logistics.block.redstone.ContentObserverTileEntity; import com.simibubi.create.content.logistics.block.redstone.NixieTubeRenderer; import com.simibubi.create.content.logistics.block.redstone.NixieTubeTileEntity; import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkTileEntity; @@ -427,7 +426,7 @@ public class AllTileEntities { public static final TileEntityEntry STOCKPILE_SWITCH = Create.registrate() .tileEntity("stockpile_switch", StockpileSwitchTileEntity::new) .validBlocks(AllBlocks.STOCKPILE_SWITCH) - //.renderer(() -> renderer) + .renderer(() -> SmartTileEntityRenderer::new) .register(); public static final TileEntityEntry ADJUSTABLE_CRATE = Create.registrate() @@ -454,10 +453,10 @@ public class AllTileEntities { .renderer(() -> FunnelRenderer::new) .register(); - public static final TileEntityEntry BELT_OBSERVER = Create.registrate() - .tileEntity("belt_observer", BeltObserverTileEntity::new) - .validBlocks(AllBlocks.BELT_OBSERVER) - .renderer(() -> BeltObserverRenderer::new) + public static final TileEntityEntry CONTENT_OBSERVER = Create.registrate() + .tileEntity("content_observer", ContentObserverTileEntity::new) + .validBlocks(AllBlocks.CONTENT_OBSERVER) + .renderer(() -> SmartTileEntityRenderer::new) .register(); public static final TileEntityEntry ADJUSTABLE_REPEATER = Create.registrate() diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatBlock.java index 584df561a..f0211af6b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatBlock.java @@ -2,14 +2,19 @@ package com.simibubi.create.content.contraptions.components.actors; import java.util.List; +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; + import com.simibubi.create.AllShapes; +import mcp.MethodsReturnNonnullByDefault; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.MobEntity; +import net.minecraft.entity.item.minecart.AbstractMinecartEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; @@ -25,11 +30,6 @@ import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; - -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; -import mcp.MethodsReturnNonnullByDefault; - @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class SeatBlock extends Block { @@ -56,7 +56,7 @@ public class SeatBlock extends Block { @Override public void onLanded(IBlockReader reader, Entity entity) { BlockPos pos = entity.getPosition(); - if (entity instanceof PlayerEntity || !(entity instanceof LivingEntity) || isSeatOccupied(entity.world, pos)) { + if (!canBePickedUp(entity) || isSeatOccupied(entity.world, pos)) { Blocks.PINK_BED.onLanded(reader, entity); return; } @@ -67,7 +67,8 @@ public class SeatBlock extends Block { } @Override - public PathNodeType getAiPathNodeType(BlockState state, IBlockReader world, BlockPos pos, @Nullable MobEntity entity) { + public PathNodeType getAiPathNodeType(BlockState state, IBlockReader world, BlockPos pos, + @Nullable MobEntity entity) { return PathNodeType.RAIL; } @@ -76,7 +77,7 @@ public class SeatBlock extends Block { ISelectionContext p_220053_4_) { return AllShapes.SEAT; } - + @Override public VoxelShape getCollisionShape(BlockState p_220071_1_, IBlockReader p_220071_2_, BlockPos p_220071_3_, ISelectionContext p_220071_4_) { @@ -113,6 +114,11 @@ public class SeatBlock extends Block { .isEmpty(); } + public static boolean canBePickedUp(Entity passenger) { + return !(passenger instanceof PlayerEntity) + && (passenger instanceof LivingEntity || passenger instanceof AbstractMinecartEntity); + } + public static void sitDown(World world, BlockPos pos, Entity entity) { if (world.isRemote) return; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatMovementBehaviour.java index e400628cd..00ec2db8f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatMovementBehaviour.java @@ -12,8 +12,6 @@ import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; import net.minecraft.block.SlabBlock; import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; import net.minecraft.state.properties.SlabType; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; @@ -73,12 +71,10 @@ public class SeatMovementBehaviour extends MovementBehaviour { if (solid) return; - List entitiesWithinAABB = context.world.getEntitiesWithinAABB(LivingEntity.class, - new AxisAlignedBB(pos).shrink(1 / 16f), e -> !(e instanceof PlayerEntity)); - if (entitiesWithinAABB.isEmpty()) - return; - LivingEntity passenger = entitiesWithinAABB.get(0); - contraptionEntity.addSittingPassenger(passenger, index); + List nearbyEntities = context.world.getEntitiesWithinAABB(Entity.class, + new AxisAlignedBB(pos).shrink(1 / 16f), SeatBlock::canBePickedUp); + if (!nearbyEntities.isEmpty()) + contraptionEntity.addSittingPassenger(nearbyEntities.get(0), index); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java index db898b03c..586082bdb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java @@ -159,7 +159,7 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE, IWrenchable { - - public static final BooleanProperty POWERED = BlockStateProperties.POWERED; - public static final BooleanProperty BELT = BooleanProperty.create("belt"); - public static final EnumProperty MODE = EnumProperty.create("mode", Mode.class); - - public BeltObserverBlock(Properties properties) { - super(properties); - setDefaultState(getDefaultState().with(POWERED, false).with(BELT, false)); - } - - @Override - public TileEntity createTileEntity(BlockState state, IBlockReader world) { - return AllTileEntities.BELT_OBSERVER.create(); - } - - @Override - public PushReaction getPushReaction(BlockState state) { - return PushReaction.BLOCK; - } - - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } - - @Override - public BlockState updatePostPlacement(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn, - BlockPos currentPos, BlockPos facingPos) { - if (facing == stateIn.get(HORIZONTAL_FACING)) - stateIn = stateIn.with(BELT, shouldHaveExtension(stateIn, worldIn, currentPos)); - return stateIn; - } - - @Override - protected void fillStateContainer(Builder builder) { - builder.add(POWERED, HORIZONTAL_FACING, BELT, MODE); - super.fillStateContainer(builder); - } - - private boolean shouldHaveExtension(BlockState state, IWorld world, BlockPos pos) { - Direction direction = state.get(HORIZONTAL_FACING); - BlockState blockState = world.getBlockState(pos.offset(direction)); - - if (!AllBlocks.BELT.has(blockState)) - return false; - if (blockState.get(BeltBlock.SLOPE) != BeltSlope.HORIZONTAL) - return false; - if (blockState.get(BeltBlock.PART) != BeltPart.MIDDLE) - return false; - if (blockState.get(BeltBlock.HORIZONTAL_FACING).getAxis() == direction.getAxis()) - return false; - - return true; - } - - @Override - public BlockState getStateForPlacement(BlockItemUseContext context) { - BlockState state = getDefaultState(); - - Direction preferredFacing = null; - for (Direction face : Direction.values()) { - if (face.getAxis().isVertical()) - continue; - - BlockState blockState = context.getWorld().getBlockState(context.getPos().offset(face)); - if (AllBlocks.BELT.has(blockState) - && blockState.get(BlockStateProperties.HORIZONTAL_FACING).getAxis() != face.getAxis() - && blockState.get(BeltBlock.SLOPE) == BeltSlope.HORIZONTAL) - if (preferredFacing == null) - preferredFacing = face; - else { - preferredFacing = null; - break; - } - } - - if (preferredFacing != null) { - state = state.with(HORIZONTAL_FACING, preferredFacing); - } else if (context.getFace().getAxis().isHorizontal()) { - state = state.with(HORIZONTAL_FACING, context.getFace()); - } else { - state = state.with(HORIZONTAL_FACING, context.getPlacementHorizontalFacing()); - } - - state = state.with(BELT, shouldHaveExtension(state, context.getWorld(), context.getPos())); - - return state; - } - - @Override - public boolean canProvidePower(BlockState state) { - return state.get(POWERED); - } - - @Override - public int getWeakPower(BlockState blockState, IBlockReader blockAccess, BlockPos pos, Direction side) { - return canProvidePower(blockState) ? 15 : 0; - } - - @Override - public boolean canConnectRedstone(BlockState state, IBlockReader world, BlockPos pos, Direction side) { - return side != state.get(HORIZONTAL_FACING).getOpposite(); - } - - @Override - public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { - if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) { - TileEntityBehaviour.destroy(worldIn, pos, FilteringBehaviour.TYPE); - worldIn.removeTileEntity(pos); - } - } - - @Override - public ActionResultType onWrenched(BlockState state, ItemUseContext context) { - World world = context.getWorld(); - if (!world.isRemote) { - world.setBlockState(context.getPos(), state.with(POWERED, false).cycle(MODE), 3); - world.notifyNeighborsOfStateChange(context.getPos(), this); - } - return ActionResultType.SUCCESS; - } - - public enum Mode implements IStringSerializable { - DETECT, PULSE, EJECT, SPLIT; - - @Override - public String getName() { - return Lang.asId(name()); - } - } - - @Override - public Class getTileEntityClass() { - return BeltObserverTileEntity.class; - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/observer/BeltObserverRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/observer/BeltObserverRenderer.java deleted file mode 100644 index 0461fd6cd..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/observer/BeltObserverRenderer.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.simibubi.create.content.logistics.block.belts.observer; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; -import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; - -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.WorldRenderer; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; -import net.minecraft.state.properties.BlockStateProperties; - -public class BeltObserverRenderer extends SafeTileEntityRenderer { - - public BeltObserverRenderer(TileEntityRendererDispatcher dispatcher) { - super(dispatcher); - } - - @Override - protected void renderSafe(BeltObserverTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, - int light, int overlay) { - light = WorldRenderer.getLightmapCoordinates(te.getWorld(), - te.getPos().up().offset(te.getBlockState().get(BlockStateProperties.HORIZONTAL_FACING))); - - FilteringRenderer.renderOnTileEntity(te, partialTicks, ms, buffer, light, overlay); - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/observer/BeltObserverTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/observer/BeltObserverTileEntity.java deleted file mode 100644 index 969fc6ab2..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/observer/BeltObserverTileEntity.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.simibubi.create.content.logistics.block.belts.observer; - -import java.util.List; - -import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; -import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; -import com.simibubi.create.content.logistics.block.belts.observer.BeltObserverBlock.Mode; -import com.simibubi.create.foundation.tileEntity.SmartTileEntity; -import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; - -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntityType; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; - -public class BeltObserverTileEntity extends SmartTileEntity { - - private FilteringBehaviour filtering; - public int turnOffTicks = 0; - - public BeltObserverTileEntity(TileEntityType type) { - super(type); - setLazyTickRate(20); - } - - @Override - public void addBehaviours(List behaviours) { - filtering = new FilteringBehaviour(this, new BeltObserverFilterSlot()).moveText(new Vec3d(0, 5, 0)); - behaviours.add(filtering); - } - - @Override - public void tick() { - super.tick(); - if (turnOffTicks > 0) { - turnOffTicks--; - if (turnOffTicks == 0) - world.getPendingBlockTicks().scheduleTick(pos, getBlockState().getBlock(), 1); - } - - if (!isActive()) - return; - if (getBlockState().get(BeltObserverBlock.MODE) != Mode.DETECT) - return; - - BlockPos targetPos = pos.offset(getBlockState().get(BeltObserverBlock.HORIZONTAL_FACING)); - - BeltTileEntity beltTE = BeltHelper.getSegmentTE(world, targetPos); - if (beltTE == null) - return; - BeltTileEntity controllerTE = beltTE.getControllerTE(); - if (controllerTE == null) - return; - - controllerTE.getInventory().applyToEachWithin(beltTE.index + .5f, .45f, stack -> { - if (filtering.test(stack.stack) && turnOffTicks != 6) { - world.setBlockState(pos, getBlockState().with(BeltObserverBlock.POWERED, true)); - world.notifyNeighborsOfStateChange(pos, getBlockState().getBlock()); - resetTurnOffCooldown(); - } - return null; - }); - - } - - private boolean isActive() { - return getBlockState().get(BeltObserverBlock.BELT); - } - - public void resetTurnOffCooldown() { - turnOffTicks = 6; - } - - @Override - public void write(CompoundNBT compound, boolean clientPacket) { - compound.putInt("TurnOff", turnOffTicks); - super.write(compound, clientPacket); - } - - @Override - protected void read(CompoundNBT compound, boolean clientPacket) { - turnOffTicks = compound.getInt("TurnOff"); - super.read(compound, clientPacket); - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java index e7f2987fb..fe71af5cf 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java @@ -306,19 +306,19 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor private boolean handleDownwardOutput(boolean simulate) { BlockState blockState = getBlockState(); ChuteTileEntity targetChute = getTargetChute(blockState); + Direction direction = blockState.get(ChuteBlock.FACING); if (targetChute != null) { boolean canInsert = targetChute.item.isEmpty(); if (!simulate && canInsert) { - targetChute.setItem(item, 1); + targetChute.setItem(item, direction == Direction.DOWN ? 1 : .51f); setItem(ItemStack.EMPTY); } return canInsert; } // Diagonal chutes can only insert into other chutes - if (blockState.get(ChuteBlock.FACING) - .getAxis() + if (direction.getAxis() .isHorizontal()) return false; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java index 570eef9bf..b6f949a5a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java @@ -99,7 +99,7 @@ public abstract class BeltFunnelBlock extends HorizontalInteractionFunnelBlock { return true; if (!(stateBelow.getBlock() instanceof BeltBlock)) return false; - if (!BeltBlock.canTransport(stateBelow)) + if (!BeltBlock.canTransportObjects(stateBelow)) return false; return true; } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelBlock.java index 4ad08eea1..a9a41f804 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelBlock.java @@ -125,6 +125,11 @@ public abstract class FunnelBlock extends ProperDirectionalBlock implements ITE< return toInsert; if (simulate) inserter.simulate(); + if (!simulate) { + TileEntity tileEntity = worldIn.getTileEntity(pos); + if (tileEntity instanceof FunnelTileEntity) + ((FunnelTileEntity) tileEntity).onTransfer(toInsert); + } return inserter.insert(toInsert); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java index c606f8bf4..979b10795 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java @@ -108,6 +108,8 @@ public class FunnelTileEntity extends SmartTileEntity { ItemStack stack = autoExtractor.extract(amountToExtract, filter, amountThreshold); if (stack.isEmpty()) return; + + onTransfer(stack); invManipulation.insert(stack); startCooldown(); } @@ -142,6 +144,7 @@ public class FunnelTileEntity extends SmartTileEntity { if (stack.isEmpty()) return; flap(false); + onTransfer(stack); inputBehaviour.handleInsertion(stack, facing, false); startCooldown(); } @@ -160,6 +163,7 @@ public class FunnelTileEntity extends SmartTileEntity { return ignore; flap(true); + onTransfer(toInsert); if (remainder.isEmpty()) return TransportedResult.removeItem(); @@ -216,6 +220,8 @@ public class FunnelTileEntity extends SmartTileEntity { return inserted; if (simulate) invManipulation.simulate(); + if (!simulate) + onTransfer(inserted); return invManipulation.insert(inserted); } @@ -253,5 +259,9 @@ public class FunnelTileEntity extends SmartTileEntity { public double getMaxRenderDistanceSquared() { return hasFlap() ? super.getMaxRenderDistanceSquared() : 64; } + + public void onTransfer(ItemStack stack) { + AllBlocks.CONTENT_OBSERVER.get().onFunnelTransfer(world, pos, stack); + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java index 0a8b96359..338ee843f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java @@ -11,6 +11,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.components.saw.SawBlock; 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.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; @@ -346,6 +347,11 @@ public abstract class ArmInteractionPoint { return stack; if (simulate) inserter.simulate(); + if (!simulate) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity instanceof FunnelTileEntity) + ((FunnelTileEntity) tileEntity).onTransfer(stack); + } return inserter.insert(stack); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/ContentObserverBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/ContentObserverBlock.java new file mode 100644 index 000000000..689d48caf --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/ContentObserverBlock.java @@ -0,0 +1,156 @@ +package com.simibubi.create.content.logistics.block.redstone; + +import java.util.Random; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllShapes; +import com.simibubi.create.AllTileEntities; +import com.simibubi.create.content.contraptions.wrench.IWrenchable; +import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity; +import com.simibubi.create.foundation.block.ITE; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; +import com.simibubi.create.foundation.utility.Iterate; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.HorizontalBlock; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.ItemStack; +import net.minecraft.state.BooleanProperty; +import net.minecraft.state.StateContainer.Builder; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.World; +import net.minecraft.world.server.ServerWorld; +import net.minecraftforge.items.CapabilityItemHandler; + +public class ContentObserverBlock extends HorizontalBlock implements ITE, IWrenchable { + + public static final BooleanProperty POWERED = BlockStateProperties.POWERED; + + public ContentObserverBlock(Properties properties) { + super(properties); + setDefaultState(getDefaultState().with(POWERED, false)); + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_, + ISelectionContext p_220053_4_) { + return AllShapes.CONTENT_OBSERVER.get(state.get(HORIZONTAL_FACING)); + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.CONTENT_OBSERVER.create(); + } + + @Override + public boolean hasTileEntity(BlockState state) { + return true; + } + + @Override + protected void fillStateContainer(Builder builder) { + builder.add(POWERED, HORIZONTAL_FACING); + super.fillStateContainer(builder); + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + BlockState state = getDefaultState(); + + Direction preferredFacing = null; + for (Direction face : Iterate.horizontalDirections) { + BlockPos offsetPos = context.getPos() + .offset(face); + World world = context.getWorld(); + boolean canDetect = false; + TileEntity tileEntity = world.getTileEntity(offsetPos); + + if (TileEntityBehaviour.get(tileEntity, TransportedItemStackHandlerBehaviour.TYPE) != null) + canDetect = true; + else if (tileEntity != null && tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) + .isPresent()) + canDetect = true; + else if (tileEntity instanceof FunnelTileEntity) + canDetect = true; + + if (canDetect) { + if (preferredFacing != null) { + preferredFacing = null; + break; + } + preferredFacing = face; + } + + } + + if (preferredFacing != null) + return state.with(HORIZONTAL_FACING, preferredFacing); + return state.with(HORIZONTAL_FACING, context.getPlacementHorizontalFacing() + .getOpposite()); + } + + @Override + public boolean canProvidePower(BlockState state) { + return state.get(POWERED); + } + + @Override + public int getWeakPower(BlockState blockState, IBlockReader blockAccess, BlockPos pos, Direction side) { + return canProvidePower(blockState) && (side == null || side != blockState.get(HORIZONTAL_FACING) + .getOpposite()) ? 15 : 0; + } + + @Override + public void scheduledTick(BlockState state, ServerWorld worldIn, BlockPos pos, Random random) { + worldIn.setBlockState(pos, state.with(POWERED, false), 2); + worldIn.notifyNeighborsOfStateChange(pos, this); + } + + @Override + public boolean canConnectRedstone(BlockState state, IBlockReader world, BlockPos pos, Direction side) { + return side != state.get(HORIZONTAL_FACING) + .getOpposite(); + } + + @Override + public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { + if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) { + TileEntityBehaviour.destroy(worldIn, pos, FilteringBehaviour.TYPE); + worldIn.removeTileEntity(pos); + } + } + + public void onFunnelTransfer(World world, BlockPos funnelPos, ItemStack transferred) { + for (Direction direction : Iterate.horizontalDirections) { + BlockPos detectorPos = funnelPos.offset(direction); + BlockState detectorState = world.getBlockState(detectorPos); + if (!AllBlocks.CONTENT_OBSERVER.has(detectorState)) + continue; + if (detectorState.get(HORIZONTAL_FACING) != direction.getOpposite()) + continue; + withTileEntityDo(world, detectorPos, te -> { + FilteringBehaviour filteringBehaviour = TileEntityBehaviour.get(te, FilteringBehaviour.TYPE); + if (filteringBehaviour == null) + return; + if (!filteringBehaviour.test(transferred)) + return; + te.activate(4); + }); + } + } + + @Override + public Class getTileEntityClass() { + return ContentObserverTileEntity.class; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/ContentObserverTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/ContentObserverTileEntity.java new file mode 100644 index 000000000..83759928b --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/ContentObserverTileEntity.java @@ -0,0 +1,108 @@ +package com.simibubi.create.content.logistics.block.redstone; + +import java.util.List; + +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; +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.InterfaceProvider; + +import net.minecraft.block.BlockState; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; + +public class ContentObserverTileEntity extends SmartTileEntity { + + private static final int DEFAULT_DELAY = 6; + private FilteringBehaviour filtering; + private InvManipulationBehaviour observedInventory; + public int turnOffTicks = 0; + + public ContentObserverTileEntity(TileEntityType type) { + super(type); + setLazyTickRate(20); + } + + @Override + public void addBehaviours(List behaviours) { + filtering = new FilteringBehaviour(this, new FilteredDetectorFilterSlot()).moveText(new Vec3d(0, 5, 0)); + behaviours.add(filtering); + + observedInventory = new InvManipulationBehaviour(this, InterfaceProvider.towardBlockFacing()).bypassSidedness(); + behaviours.add(observedInventory); + } + + @Override + public void tick() { + super.tick(); + BlockState state = getBlockState(); + if (turnOffTicks > 0) { + turnOffTicks--; + if (turnOffTicks == 0) + world.getPendingBlockTicks() + .scheduleTick(pos, state.getBlock(), 1); + } + + if (!isActive()) + return; + + Direction facing = state.get(ContentObserverBlock.HORIZONTAL_FACING); + BlockPos targetPos = pos.offset(facing); + + TransportedItemStackHandlerBehaviour behaviour = + TileEntityBehaviour.get(world, targetPos, TransportedItemStackHandlerBehaviour.TYPE); + if (behaviour != null) { + behaviour.handleCenteredProcessingOnAllItems(.45f, stack -> { + if (!filtering.test(stack.stack) || turnOffTicks == 6) + return TransportedResult.doNothing(); + + activate(); + return TransportedResult.doNothing(); + }); + return; + } + + if (!observedInventory.simulate() + .extract() + .isEmpty()) { + activate(); + return; + } + } + + public void activate() { + activate(DEFAULT_DELAY); + } + + public void activate(int ticks) { + BlockState state = getBlockState(); + turnOffTicks = ticks; + if (state.get(ContentObserverBlock.POWERED)) + return; + world.setBlockState(pos, state.with(ContentObserverBlock.POWERED, true)); + world.notifyNeighborsOfStateChange(pos, state.getBlock()); + } + + private boolean isActive() { + return true; + } + + @Override + public void write(CompoundNBT compound, boolean clientPacket) { + compound.putInt("TurnOff", turnOffTicks); + super.write(compound, clientPacket); + } + + @Override + protected void read(CompoundNBT compound, boolean clientPacket) { + turnOffTicks = compound.getInt("TurnOff"); + super.read(compound, clientPacket); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/observer/BeltObserverFilterSlot.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/FilteredDetectorFilterSlot.java similarity index 80% rename from src/main/java/com/simibubi/create/content/logistics/block/belts/observer/BeltObserverFilterSlot.java rename to src/main/java/com/simibubi/create/content/logistics/block/redstone/FilteredDetectorFilterSlot.java index 01ee5b54c..461c286f8 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/observer/BeltObserverFilterSlot.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/FilteredDetectorFilterSlot.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics.block.belts.observer; +package com.simibubi.create.content.logistics.block.redstone; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; @@ -10,9 +10,9 @@ import net.minecraft.block.BlockState; import net.minecraft.block.HorizontalBlock; import net.minecraft.util.math.Vec3d; -public class BeltObserverFilterSlot extends ValueBoxTransform { +public class FilteredDetectorFilterSlot extends ValueBoxTransform { - Vec3d position = VecHelper.voxelSpace(8f, 14.5f, 16f); + Vec3d position = VecHelper.voxelSpace(8f, 15.5f, 11f); @Override protected Vec3d getLocalOffset(BlockState state) { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchTileEntity.java index af7e59e8d..863070eb1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchTileEntity.java @@ -4,17 +4,15 @@ import java.util.List; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; 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; +import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour.InterfaceProvider; -import net.minecraft.block.BlockState; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; -import net.minecraft.state.properties.BlockStateProperties; -import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; -import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraft.util.math.Vec3d; import net.minecraftforge.items.IItemHandler; public class StockpileSwitchTileEntity extends SmartTileEntity { @@ -23,7 +21,9 @@ public class StockpileSwitchTileEntity extends SmartTileEntity { public float offWhenBelow; public float currentLevel; public boolean powered; - private LazyOptional observedInventory; + + private FilteringBehaviour filtering; + private InvManipulationBehaviour observedInventory; public StockpileSwitchTileEntity(TileEntityType typeIn) { super(typeIn); @@ -31,7 +31,6 @@ public class StockpileSwitchTileEntity extends SmartTileEntity { offWhenBelow = .25f; currentLevel = -1; powered = false; - observedInventory = LazyOptional.empty(); setLazyTickRate(10); } @@ -41,7 +40,6 @@ public class StockpileSwitchTileEntity extends SmartTileEntity { offWhenBelow = compound.getFloat("OffBelow"); currentLevel = compound.getFloat("Current"); powered = compound.getBoolean("Powered"); - super.read(compound, clientPacket); } @@ -51,7 +49,6 @@ public class StockpileSwitchTileEntity extends SmartTileEntity { compound.putFloat("OffBelow", offWhenBelow); compound.putFloat("Current", currentLevel); compound.putBoolean("Powered", powered); - super.write(compound, clientPacket); } @@ -60,19 +57,19 @@ public class StockpileSwitchTileEntity extends SmartTileEntity { } public void updateCurrentLevel() { - if (!observedInventory.isPresent()) { - if (!findNewInventory() && currentLevel != -1) { - world.setBlockState(pos, getBlockState().with(StockpileSwitchBlock.INDICATOR, 0), 3); - currentLevel = -1; - powered = false; - world.notifyNeighbors(pos, getBlockState().getBlock()); - } + if (!observedInventory.hasInventory()) { + if (currentLevel == -1) + return; + world.setBlockState(pos, getBlockState().with(StockpileSwitchBlock.INDICATOR, 0), 3); + currentLevel = -1; + powered = false; + world.notifyNeighbors(pos, getBlockState().getBlock()); return; } float occupied = 0; float totalSpace = 0; - IItemHandler inv = observedInventory.orElse(null); + IItemHandler inv = observedInventory.getInventory(); for (int slot = 0; slot < inv.getSlots(); slot++) { ItemStack stackInSlot = inv.getStackInSlot(slot); @@ -83,7 +80,9 @@ public class StockpileSwitchTileEntity extends SmartTileEntity { continue; totalSpace += 1; - occupied += count * (1f / space); + + if (filtering.test(stackInSlot)) + occupied += count * (1f / space); } currentLevel = (float) occupied / totalSpace; @@ -109,36 +108,16 @@ public class StockpileSwitchTileEntity extends SmartTileEntity { super.lazyTick(); if (world.isRemote) return; - findNewInventory(); updateCurrentLevel(); } - private boolean findNewInventory() { - observedInventory = LazyOptional.empty(); - BlockPos invPos = getPos().offset(getBlockState().get(BlockStateProperties.HORIZONTAL_FACING)); - - if (!world.isBlockPresent(invPos)) - return false; - BlockState invState = world.getBlockState(invPos); - - if (!invState.hasTileEntity()) - return false; - TileEntity invTE = world.getTileEntity(invPos); - if (invTE == null) - return false; - - observedInventory = invTE.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY); - if (observedInventory.isPresent()) { - updateCurrentLevel(); - return true; - } - - return false; - } - @Override public void addBehaviours(List behaviours) { + filtering = new FilteringBehaviour(this, new FilteredDetectorFilterSlot()).moveText(new Vec3d(0, 5, 0)) + .withCallback($ -> updateCurrentLevel()); + behaviours.add(filtering); + observedInventory = new InvManipulationBehaviour(this, InterfaceProvider.towardBlockFacing()).bypassSidedness(); + behaviours.add(observedInventory); } - } diff --git a/src/main/java/com/simibubi/create/foundation/data/BlockStateGen.java b/src/main/java/com/simibubi/create/foundation/data/BlockStateGen.java index 6cf438249..604161694 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BlockStateGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/BlockStateGen.java @@ -21,7 +21,6 @@ import com.simibubi.create.content.contraptions.components.structureMovement.mou import com.simibubi.create.content.contraptions.components.tracks.ReinforcedRailBlock; import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeBlock; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; -import com.simibubi.create.content.logistics.block.belts.observer.BeltObserverBlock; import com.simibubi.create.content.palettes.PavedBlock; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Pointing; @@ -233,48 +232,6 @@ public class BlockStateGen { }); } - public static NonNullBiConsumer, RegistrateBlockstateProvider> beltObserver() { - return (c, p) -> { - - Map> models = new IdentityHashMap<>(); - Map baseModels = new HashMap<>(); - - for (boolean powered : Iterate.trueAndFalse) { - for (boolean belt : Iterate.trueAndFalse) { - String suffix = (belt ? "_belt" : "") + (powered ? "_powered" : ""); - baseModels.put(suffix, p.modLoc("block/belt_observer/base" + suffix)); - } - } - - for (BeltObserverBlock.Mode mode : BeltObserverBlock.Mode.values()) { - String modeName = mode.getName(); - HashMap map = new HashMap<>(); - for (boolean powered : Iterate.trueAndFalse) { - for (boolean belt : Iterate.trueAndFalse) { - String suffix = (belt ? "_belt" : "") + (powered ? "_powered" : ""); - map.put(suffix, p.models() - .withExistingParent("block/belt_observer/" + modeName + suffix, baseModels.get(suffix)) - .texture("texture", - p.modLoc("block/belt_observer_" + modeName + (powered ? "_powered" : "")))); - } - } - models.put(mode, map); - } - - p.getVariantBuilder(c.get()) - .forAllStates(state -> { - String suffix = (state.get(BeltObserverBlock.BELT) ? "_belt" : "") - + (state.get(BeltObserverBlock.POWERED) ? "_powered" : ""); - return ConfiguredModel.builder() - .modelFile(models.get(state.get(BeltObserverBlock.MODE)) - .get(suffix)) - .rotationY((int) state.get(BeltObserverBlock.HORIZONTAL_FACING) - .getHorizontalAngle()) - .build(); - }); - }; - } - public static NonNullBiConsumer, RegistrateBlockstateProvider> linearChassis() { return (c, p) -> { ResourceLocation side = p.modLoc("block/" + c.getName() + "_side"); diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java index cd8f69208..4f8716c89 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java @@ -655,7 +655,7 @@ public class StandardRecipeGen extends CreateRecipeProvider { .patternLine("B B") .patternLine("BBB")), - BELT_OBSERVER = create(AllBlocks.BELT_OBSERVER).unlockedBy(AllItems.BELT_CONNECTOR::get) + BELT_OBSERVER = create(AllBlocks.CONTENT_OBSERVER).unlockedBy(AllItems.BELT_CONNECTOR::get) .viaShaped(b -> b.key('B', I.brassCasing()) .key('R', I.redstone()) .key('I', I.iron()) diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InvManipulationBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InvManipulationBehaviour.java index e8ca01bb1..0a23edb51 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InvManipulationBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InvManipulationBehaviour.java @@ -3,6 +3,8 @@ package com.simibubi.create.foundation.tileEntity.behaviour.inventory; import java.util.function.Function; import java.util.function.Predicate; +import javax.annotation.Nullable; + import com.google.common.base.Predicates; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.item.ItemHelper; @@ -33,17 +35,18 @@ public class InvManipulationBehaviour extends TileEntityBehaviour { protected InterfaceProvider target; protected LazyOptional targetCapability; protected boolean simulateNext; + protected boolean bypassSided; private BehaviourType behaviourType; public static InvManipulationBehaviour forExtraction(SmartTileEntity te, InterfaceProvider target) { return new InvManipulationBehaviour(EXTRACT, te, target); } - + public static InvManipulationBehaviour forInsertion(SmartTileEntity te, InterfaceProvider target) { return new InvManipulationBehaviour(INSERT, te, target); } - + public InvManipulationBehaviour(SmartTileEntity te, InterfaceProvider target) { this(TYPE, te, target); } @@ -56,6 +59,12 @@ public class InvManipulationBehaviour extends TileEntityBehaviour { this.target = target; this.targetCapability = LazyOptional.empty(); simulateNext = false; + bypassSided = false; + } + + public InvManipulationBehaviour bypassSidedness() { + bypassSided = true; + return this; } /** @@ -70,6 +79,11 @@ public class InvManipulationBehaviour extends TileEntityBehaviour { return targetCapability.isPresent(); } + @Nullable + public IItemHandler getInventory() { + return targetCapability.orElse(null); + } + public ItemStack extract() { return extract(getAmountFromFilter()); } @@ -158,8 +172,8 @@ public class InvManipulationBehaviour extends TileEntityBehaviour { TileEntity invTE = world.getTileEntity(pos); if (invTE == null) return; - targetCapability = - invTE.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, targetBlockFace.getFace()); + targetCapability = bypassSided ? invTE.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) + : invTE.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, targetBlockFace.getFace()); if (targetCapability.isPresent()) targetCapability.addListener(this::onHandlerInvalidated); } diff --git a/src/main/resources/assets/create/models/block/belt_observer/base.json b/src/main/resources/assets/create/models/block/belt_observer/base.json deleted file mode 100644 index 32c14f1ba..000000000 --- a/src/main/resources/assets/create/models/block/belt_observer/base.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "block/block", - "textures": { - "brass_casing": "create:block/brass_casing", - "extractor": "create:block/extractor", - "particle": "#texture", - "entity_detector_off": "#texture", - "entity_detector_front": "create:block/belt_observer_front" - }, - "elements": [ - { - "name": "Bottom", - "from": [0, 0, 0], - "to": [16, 2, 16], - "faces": { - "north": {"uv": [0, 14, 16, 16], "texture": "#brass_casing"}, - "east": {"uv": [0, 0, 2, 16], "rotation": 270, "texture": "#entity_detector_off"}, - "south": {"uv": [0, 14, 16, 16], "texture": "#brass_casing"}, - "west": {"uv": [14, 0, 16, 16], "rotation": 90, "texture": "#entity_detector_off"}, - "up": {"uv": [0, 0, 16, 16], "texture": "#brass_casing"}, - "down": {"uv": [0, 0, 16, 16], "texture": "#entity_detector_off"} - } - }, - { - "name": "Top", - "from": [0, 14, 0], - "to": [5, 16, 16], - "faces": { - "north": {"uv": [11, 0, 16, 2], "texture": "#brass_casing"}, - "east": {"uv": [14, 0, 16, 16], "rotation": 270, "texture": "#entity_detector_off"}, - "south": {"uv": [0, 0, 5, 2], "texture": "#brass_casing"}, - "west": {"uv": [0, 0, 2, 16], "rotation": 90, "texture": "#entity_detector_off"}, - "up": {"uv": [11, 0, 16, 16], "rotation": 180, "texture": "#entity_detector_off"}, - "down": {"uv": [0, 0, 5, 16], "texture": "#brass_casing"} - } - }, - { - "name": "Top", - "from": [11, 14, 0], - "to": [16, 16, 16], - "faces": { - "north": {"uv": [0, 0, 5, 2], "texture": "#brass_casing"}, - "east": {"uv": [14, 0, 16, 16], "rotation": 270, "texture": "#entity_detector_off"}, - "south": {"uv": [11, 0, 16, 2], "texture": "#brass_casing"}, - "west": {"uv": [0, 0, 2, 16], "rotation": 90, "texture": "#entity_detector_off"}, - "up": {"uv": [0, 0, 5, 16], "rotation": 180, "texture": "#entity_detector_off"}, - "down": {"uv": [0, 0, 5, 16], "texture": "#brass_casing"} - } - }, - { - "name": "Top", - "from": [5, 14, 0], - "to": [11, 16, 14], - "faces": { - "north": {"uv": [5, 0, 11, 2], "texture": "#brass_casing"}, - "east": {"uv": [14, 0, 16, 14], "rotation": 270, "texture": "#entity_detector_off"}, - "south": {"uv": [5, 1, 11, 3], "rotation": 180, "texture": "#entity_detector_off"}, - "west": {"uv": [0, 0, 2, 14], "rotation": 90, "texture": "#entity_detector_off"}, - "up": {"uv": [5, 2, 11, 16], "rotation": 180, "texture": "#entity_detector_off"}, - "down": {"uv": [5, 2, 11, 16], "texture": "#brass_casing"} - } - }, - { - "name": "Side", - "from": [0, 2, 0], - "to": [2, 14, 16], - "faces": { - "north": {"uv": [14, 2, 16, 14], "texture": "#brass_casing"}, - "east": {"uv": [2, 0, 14, 16], "rotation": 90, "texture": "#brass_casing"}, - "south": {"uv": [0, 2, 2, 14], "texture": "#brass_casing"}, - "west": {"uv": [2, 0, 14, 16], "rotation": 90, "texture": "#entity_detector_off"}, - "down": {"uv": [0, 0, 2, 16], "texture": "#entity_detector_off"} - } - }, - { - "name": "Side", - "from": [14, 2, 0], - "to": [16, 14, 16], - "faces": { - "north": {"uv": [0, 2, 2, 14], "texture": "#brass_casing"}, - "east": {"uv": [2, 0, 14, 16], "rotation": 270, "texture": "#entity_detector_off"}, - "south": {"uv": [14, 2, 16, 14], "texture": "#brass_casing"}, - "west": {"uv": [2, 0, 14, 16], "rotation": 90, "texture": "#brass_casing"}, - "down": {"uv": [0, 0, 2, 16], "texture": "#entity_detector_off"} - } - }, - { - "name": "Center", - "from": [2, 2, 1], - "to": [14, 14, 17], - "faces": { - "north": {"uv": [2, 2, 14, 14], "texture": "#brass_casing"}, - "east": {"uv": [0, 2, 16, 14], "texture": "#entity_detector_front"}, - "south": {"uv": [2, 2, 14, 14], "texture": "#entity_detector_front"}, - "west": {"uv": [0, 2, 16, 14], "texture": "#entity_detector_front"}, - "up": {"uv": [0, 0, 12, 16], "texture": "#brass_casing"}, - "down": {"uv": [0, 0, 12, 16], "texture": "#brass_casing"} - } - }, - { - "name": "Filter", - "from": [5, 13, 13], - "to": [11, 15, 18], - "rotation": {"angle": 0, "axis": "x", "origin": [9, 15, 16]}, - "faces": { - "north": {"uv": [4, 1, 6, 7], "rotation": 270, "texture": "#extractor"}, - "east": {"uv": [4, 2, 6, 7], "rotation": 270, "texture": "#extractor"}, - "south": {"uv": [4, 1, 6, 7], "rotation": 270, "texture": "#extractor"}, - "west": {"uv": [4, 2, 6, 7], "rotation": 270, "texture": "#extractor"}, - "up": {"uv": [0, 9, 5, 15], "rotation": 90, "texture": "#extractor"}, - "down": {"uv": [5, 5, 11, 10], "texture": "#entity_detector_off"} - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt_observer/base_belt.json b/src/main/resources/assets/create/models/block/belt_observer/base_belt.json deleted file mode 100644 index baed95503..000000000 --- a/src/main/resources/assets/create/models/block/belt_observer/base_belt.json +++ /dev/null @@ -1,131 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "block/block", - "textures": { - "3": "create:block/extractor", - "brass_casing": "create:block/brass_casing", - "particle": "#texture", - "entity_detector_off": "#texture", - "entity_detector_front": "create:block/belt_observer_front" - }, - "elements": [ - { - "name": "Bottom", - "from": [0, 0, 0], - "to": [16, 2, 16], - "faces": { - "north": {"uv": [0, 14, 16, 16], "texture": "#brass_casing"}, - "east": {"uv": [0, 0, 2, 16], "rotation": 270, "texture": "#entity_detector_off"}, - "south": {"uv": [0, 14, 16, 16], "texture": "#brass_casing"}, - "west": {"uv": [14, 0, 16, 16], "rotation": 90, "texture": "#entity_detector_off"}, - "up": {"uv": [0, 0, 16, 16], "texture": "#brass_casing"}, - "down": {"uv": [0, 0, 16, 16], "texture": "#entity_detector_off"} - } - }, - { - "name": "Side", - "from": [0, 2, 0], - "to": [2, 14, 16], - "faces": { - "north": {"uv": [14, 2, 16, 14], "texture": "#brass_casing"}, - "east": {"uv": [2, 0, 14, 16], "rotation": 90, "texture": "#brass_casing"}, - "south": {"uv": [0, 2, 2, 14], "texture": "#brass_casing"}, - "west": {"uv": [2, 0, 14, 16], "rotation": 90, "texture": "#entity_detector_off"}, - "up": {"uv": [0, 0, 2, 16], "texture": "#entity_detector_off"}, - "down": {"uv": [0, 0, 2, 16], "texture": "#entity_detector_off"} - } - }, - { - "name": "Side", - "from": [14, 2, 0], - "to": [16, 14, 16], - "faces": { - "north": {"uv": [0, 2, 2, 14], "texture": "#brass_casing"}, - "east": {"uv": [2, 0, 14, 16], "rotation": 270, "texture": "#entity_detector_off"}, - "south": {"uv": [14, 2, 16, 14], "texture": "#brass_casing"}, - "west": {"uv": [2, 0, 14, 16], "rotation": 90, "texture": "#brass_casing"}, - "up": {"uv": [0, 0, 2, 16], "texture": "#entity_detector_off"}, - "down": {"uv": [0, 0, 2, 16], "texture": "#entity_detector_off"} - } - }, - { - "name": "Center", - "from": [2, 2, 1], - "to": [14, 14, 17], - "faces": { - "north": {"uv": [2, 2, 14, 14], "texture": "#brass_casing"}, - "east": {"uv": [0, 2, 16, 14], "texture": "#entity_detector_front"}, - "south": {"uv": [2, 2, 14, 14], "texture": "#entity_detector_front"}, - "west": {"uv": [0, 2, 16, 14], "texture": "#entity_detector_front"}, - "up": {"uv": [0, 0, 12, 16], "texture": "#brass_casing"}, - "down": {"uv": [0, 0, 12, 16], "texture": "#brass_casing"} - } - }, - { - "name": "Belt Thing", - "from": [1, 5, 16], - "to": [15, 11, 30], - "faces": { - "north": {"uv": [1, 0, 15, 6], "texture": "#entity_detector_off"}, - "east": {"uv": [1, 0, 15, 6], "texture": "#entity_detector_off"}, - "south": {"uv": [1, 0, 15, 6], "texture": "#entity_detector_off"}, - "west": {"uv": [2, 0, 16, 6], "texture": "#entity_detector_off"}, - "up": {"uv": [1, 1, 15, 15], "texture": "#brass_casing"}, - "down": {"uv": [1, 1, 15, 15], "texture": "#brass_casing"} - } - }, - { - "name": "Top", - "from": [0, 14, 0], - "to": [5, 16, 16], - "faces": { - "north": {"uv": [11, 0, 16, 2], "texture": "#brass_casing"}, - "east": {"uv": [14, 0, 16, 16], "rotation": 270, "texture": "#entity_detector_off"}, - "south": {"uv": [0, 0, 5, 2], "texture": "#brass_casing"}, - "west": {"uv": [0, 0, 2, 16], "rotation": 90, "texture": "#entity_detector_off"}, - "up": {"uv": [11, 0, 16, 16], "rotation": 180, "texture": "#entity_detector_off"}, - "down": {"uv": [0, 0, 5, 16], "texture": "#entity_detector_off"} - } - }, - { - "name": "Top", - "from": [5, 14, 0], - "to": [11, 16, 14], - "faces": { - "north": {"uv": [5, 0, 11, 2], "texture": "#brass_casing"}, - "east": {"uv": [14, 0, 16, 14], "rotation": 270, "texture": "#entity_detector_off"}, - "south": {"uv": [5, 1, 11, 3], "rotation": 180, "texture": "#entity_detector_off"}, - "west": {"uv": [0, 0, 2, 14], "rotation": 90, "texture": "#entity_detector_off"}, - "up": {"uv": [5, 2, 11, 16], "rotation": 180, "texture": "#entity_detector_off"}, - "down": {"uv": [5, 2, 11, 16], "texture": "#entity_detector_off"} - } - }, - { - "name": "Top", - "from": [11, 14, 0], - "to": [16, 16, 16], - "faces": { - "north": {"uv": [0, 0, 5, 2], "texture": "#brass_casing"}, - "east": {"uv": [14, 0, 16, 16], "rotation": 270, "texture": "#entity_detector_off"}, - "south": {"uv": [11, 0, 16, 2], "texture": "#brass_casing"}, - "west": {"uv": [0, 0, 2, 16], "rotation": 90, "texture": "#entity_detector_off"}, - "up": {"uv": [0, 0, 5, 16], "rotation": 180, "texture": "#entity_detector_off"}, - "down": {"uv": [0, 0, 5, 16], "texture": "#entity_detector_off"} - } - }, - { - "name": "Filter", - "from": [5, 13, 13], - "to": [11, 15, 18], - "rotation": {"angle": 0, "axis": "y", "origin": [9, 15, 16]}, - "faces": { - "north": {"uv": [4, 1, 6, 7], "rotation": 270, "texture": "#3"}, - "east": {"uv": [4, 2, 6, 7], "rotation": 270, "texture": "#3"}, - "south": {"uv": [4, 1, 6, 7], "rotation": 270, "texture": "#3"}, - "west": {"uv": [4, 2, 6, 7], "rotation": 270, "texture": "#3"}, - "up": {"uv": [0, 9, 5, 15], "rotation": 90, "texture": "#3"}, - "down": {"uv": [5, 5, 11, 10], "texture": "#3"} - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt_observer/base_belt_powered.json b/src/main/resources/assets/create/models/block/belt_observer/base_belt_powered.json deleted file mode 100644 index a81d7492c..000000000 --- a/src/main/resources/assets/create/models/block/belt_observer/base_belt_powered.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/belt_observer/base_belt", - "textures": { - "3": "create:block/extractor_powered" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt_observer/base_powered.json b/src/main/resources/assets/create/models/block/belt_observer/base_powered.json deleted file mode 100644 index 17177a585..000000000 --- a/src/main/resources/assets/create/models/block/belt_observer/base_powered.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/belt_observer/base", - "textures": { - "extractor": "create:block/extractor_powered" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt_observer/item.json b/src/main/resources/assets/create/models/block/belt_observer/item.json deleted file mode 100644 index c00967dc9..000000000 --- a/src/main/resources/assets/create/models/block/belt_observer/item.json +++ /dev/null @@ -1,88 +0,0 @@ -{ - "__comment": "Model generated using MrCrayfish's Model Creator (https://mrcrayfish.com/tools?id=mc)", - "parent": "block/block", - "display": { - "gui": { - "rotation": [ 30, 45, 0 ], - "translation": [ 0, 0, 0], - "scale":[ 0.625, 0.625, 0.625 ] - }, - "fixed": { - "rotation": [ 0, 180, 0 ], - "translation": [ 0, 0, 0], - "scale":[ 0.5, 0.5, 0.5 ] - } - }, - "textures": { - "brass_casing": "create:block/brass_casing", - "entity_detector_off": "create:block/belt_observer_detect", - "entity_detector_front": "create:block/belt_observer_front" - }, - "elements": [ - { - "name": "Bottom", - "from": [ 0, 0, 0 ], - "to": [ 16, 2, 16 ], - "faces": { - "north": { "texture": "#brass_casing", "uv": [ 0, 14, 16, 16 ] }, - "east": { "texture": "#entity_detector_off", "uv": [ 0, 0, 2, 16 ], "rotation": 270 }, - "south": { "texture": "#brass_casing", "uv": [ 0, 14, 16, 16 ] }, - "west": { "texture": "#entity_detector_off", "uv": [ 14, 0, 16, 16 ], "rotation": 90 }, - "up": { "texture": "#brass_casing", "uv": [ 0, 0, 16, 16 ] }, - "down": { "texture": "#entity_detector_off", "uv": [ 0, 0, 16, 16 ] } - } - }, - { - "name": "Top", - "from": [ 0, 14, 0 ], - "to": [ 16, 16, 16 ], - "faces": { - "north": { "texture": "#brass_casing", "uv": [ 0, 0, 16, 2 ] }, - "east": { "texture": "#entity_detector_off", "uv": [ 14, 0, 16, 16 ], "rotation": 270 }, - "south": { "texture": "#brass_casing", "uv": [ 0, 0, 16, 2 ] }, - "west": { "texture": "#entity_detector_off", "uv": [ 0, 0, 2, 16 ], "rotation": 90 }, - "up": { "texture": "#entity_detector_off", "uv": [ 0, 0, 16, 16 ], "rotation": 180 }, - "down": { "texture": "#brass_casing", "uv": [ 0, 0, 16, 16 ] } - } - }, - { - "name": "Side", - "from": [ 0, 2, 0 ], - "to": [ 2, 14, 16 ], - "faces": { - "north": { "texture": "#brass_casing", "uv": [ 14, 2, 16, 14 ] }, - "east": { "texture": "#brass_casing", "uv": [ 2, 0, 14, 16 ], "rotation": 90 }, - "south": { "texture": "#brass_casing", "uv": [ 0, 2, 2, 14 ] }, - "west": { "texture": "#entity_detector_off", "uv": [ 2, 0, 14, 16 ], "rotation": 90 }, - "up": { "texture": "#entity_detector_off", "uv": [ 0, 0, 2, 16 ] }, - "down": { "texture": "#entity_detector_off", "uv": [ 0, 0, 2, 16 ] } - } - }, - { - "name": "Side", - "from": [ 14, 2, 0 ], - "to": [ 16, 14, 16 ], - "faces": { - "north": { "texture": "#brass_casing", "uv": [ 0, 2, 2, 14 ] }, - "east": { "texture": "#entity_detector_off", "uv": [ 2, 0, 14, 16 ], "rotation": 270 }, - "south": { "texture": "#brass_casing", "uv": [ 14, 2, 16, 14 ] }, - "west": { "texture": "#brass_casing", "uv": [ 2, 0, 14, 16 ], "rotation": 90 }, - "up": { "texture": "#entity_detector_off", "uv": [ 0, 0, 2, 16 ] }, - "down": { "texture": "#entity_detector_off", "uv": [ 0, 0, 2, 16 ] } - } - }, - { - "name": "Center", - "from": [ 2, 2, 1 ], - "to": [ 14, 14, 17 ], - "faces": { - "north": { "texture": "#brass_casing", "uv": [ 2, 2, 14, 14 ] }, - "east": { "texture": "#entity_detector_front", "uv": [ 0, 2, 16, 14 ] }, - "south": { "texture": "#entity_detector_front", "uv": [ 2, 2, 14, 14 ] }, - "west": { "texture": "#entity_detector_front", "uv": [ 0, 2, 16, 14 ] }, - "up": { "texture": "#brass_casing", "uv": [ 0, 0, 12, 16 ] }, - "down": { "texture": "#brass_casing", "uv": [ 0, 0, 12, 16 ] } - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/content_observer/block.json b/src/main/resources/assets/create/models/block/content_observer/block.json new file mode 100644 index 000000000..4e3ce8d38 --- /dev/null +++ b/src/main/resources/assets/create/models/block/content_observer/block.json @@ -0,0 +1,80 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "5": "create:block/brass_casing_inner", + "8": "create:block/content_observer", + "9": "create:block/content_observer_inner", + "10": "create:block/filtered_detector_top", + "brass_casing": "create:block/brass_casing", + "particle": "create:block/brass_casing_side", + "1_brass_casing": "create:block/brass_casing_side", + "end": "create:block/filtered_detector_front" + }, + "elements": [ + { + "name": "Bottom Plate", + "from": [0, 0, 0], + "to": [16, 6, 16], + "faces": { + "north": {"uv": [0, 10, 16, 16], "texture": "#8"}, + "east": {"uv": [0, 10, 16, 16], "texture": "#8"}, + "south": {"uv": [0, 10, 16, 16], "texture": "#8"}, + "west": {"uv": [0, 10, 16, 16], "texture": "#8"}, + "up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#9"}, + "down": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#brass_casing"} + } + }, + { + "name": "Center", + "from": [0.9, 2, 0.9], + "to": [15.1, 14, 15.1], + "faces": { + "north": {"uv": [0, 1, 12, 15], "rotation": 90, "texture": "#5"}, + "east": {"uv": [0, 1, 12, 15], "rotation": 90, "texture": "#5"}, + "south": {"uv": [0, 1, 12, 15], "rotation": 90, "texture": "#5"}, + "west": {"uv": [0, 1, 12, 15], "rotation": 90, "texture": "#5"}, + "up": {"uv": [0, 0, 14, 14], "rotation": 90, "texture": "#5"}, + "down": {"uv": [0, 0, 14, 14], "rotation": 270, "texture": "#5"} + } + }, + { + "name": "Indicator", + "from": [3.1, 3.1, -1.9], + "to": [12.9, 12.9, 1.1], + "faces": { + "north": {"uv": [0, 0, 10, 10], "texture": "#end"}, + "east": {"uv": [10, 0, 13, 10], "texture": "#end"}, + "west": {"uv": [10, 0, 13, 10], "texture": "#end"}, + "up": {"uv": [10, 0, 13, 10], "rotation": 90, "texture": "#end"}, + "down": {"uv": [10, 0, 13, 10], "rotation": 270, "texture": "#end"} + } + }, + { + "name": "Top Plate", + "from": [0, 14, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 16, 2], "texture": "#1_brass_casing"}, + "east": {"uv": [0, 0, 16, 2], "texture": "#1_brass_casing"}, + "south": {"uv": [0, 0, 16, 2], "texture": "#1_brass_casing"}, + "west": {"uv": [0, 0, 16, 2], "texture": "#1_brass_casing"}, + "up": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#10"}, + "down": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#brass_casing"} + } + } + ], + "display": { + "gui": { + "rotation": [30, -135, 0], + "scale": [0.625, 0.625, 0.625] + } + }, + "groups": [ + { + "name": "stockpile_switch", + "origin": [8, 8, 8], + "children": [0, 1, 2, 3] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/content_observer/block_powered.json b/src/main/resources/assets/create/models/block/content_observer/block_powered.json new file mode 100644 index 000000000..7ae7927b3 --- /dev/null +++ b/src/main/resources/assets/create/models/block/content_observer/block_powered.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/content_observer/block", + "textures": { + "8": "create:block/content_observer_powered", + "9": "create:block/content_observer_inner_powered" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/stockpile_switch.json b/src/main/resources/assets/create/models/block/stockpile_switch.json index cfe456960..9439bb80c 100644 --- a/src/main/resources/assets/create/models/block/stockpile_switch.json +++ b/src/main/resources/assets/create/models/block/stockpile_switch.json @@ -4,10 +4,11 @@ "textures": { "5": "create:block/brass_casing_inner", "6": "create:block/brass_casing", + "7": "create:block/filtered_detector_top", "indicator": "create:block/indicator/0", "particle": "create:block/brass_casing_side", "brass_casing": "create:block/brass_casing_side", - "end": "create:block/stockpile_switch_end" + "end": "create:block/filtered_detector_front" }, "elements": [ { @@ -32,16 +33,16 @@ "east": {"uv": [0, 0, 16, 2], "texture": "#brass_casing"}, "south": {"uv": [0, 0, 16, 2], "texture": "#brass_casing"}, "west": {"uv": [0, 0, 16, 2], "texture": "#brass_casing"}, - "up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#6"}, + "up": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#7"}, "down": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#6"} } }, { "name": "Center", - "from": [1, 2, 1], - "to": [15, 14, 15], + "from": [0.9, 2, 0.9], + "to": [15.1, 14, 15.1], "faces": { - "north": {"uv": [0, 0, 14, 12], "texture": "#5"}, + "north": {"uv": [0, 1, 12, 15], "rotation": 90, "texture": "#5"}, "east": {"uv": [0, 1, 12, 15], "rotation": 90, "texture": "#5"}, "south": {"uv": [0, 1, 12, 15], "rotation": 90, "texture": "#5"}, "west": {"uv": [0, 1, 12, 15], "rotation": 90, "texture": "#5"}, diff --git a/src/main/resources/assets/create/textures/block/belt_observer_detect.png b/src/main/resources/assets/create/textures/block/belt_observer_detect.png deleted file mode 100644 index 4faaaaf6e45fa91531c25adf08c92cd4792e6984..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 492 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!TZf$0OWV41rHT`eEFkMU0KW-vD#sEwP zGfa|cEHjd+h*aGJ+9N%BW1#^S{ss=?e#{l28U??|ZSc@!ZnzQt1EMcBYvyxlt9;4;0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!T@PAyoQ(W{#lgT_1Pn;41 zBK0sFPEPOKo|DkS&2h{$V=Rn3a2;7{z;%C=61_YQp$-N+;K}>=+h?urYNcgTt^=m2 z1k>foRx-;{Wurip&(bKHLj;0@p^YyxQ#$LdKy#vDzvJh{?d#}+v2(`W7~B1WpAXxq zWxNsixV>~50}gbt-!`%=w=`1d@mXHb^=a1&_~%4!v{v9c)E|w?l`SCVO1H6fZ?i!K zi+mwfK28)B1U9;m+Cpnn2u|)`1~)~o6G~$R=YfD*#t4MSv|Ve4ZVp5EgK4HQrfp9B zUK2ye2aW@gDC-hCI3K8fT6BO_WsRe<{cm7klqzww-9&oS09*!FCdmwrtK=Aw(2Zj~ z(qlIc7U1A*;4;3C`$S;p;1zj3{d7P|hPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!TBF_Dw+m zCR^Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!TDK8P1Dg@UK*MWroiYnx3r zo5U~O5_8j!VRq)*o!R+ex0m}i1w>S^a?n}$LP2MFM=++Iu_!wR>+wTSQmw9^BDX>Nge3R6)#F7tQ{+ z9Jv8xEYv}F91%5%5c5SO241&h4ki*Z@zlf*lO9k#>aLa-ToHaa!dD1MP{<`+)hm{E z@jpIcXNPMj20s3ch1`5~PG`AKh@OdFh~9TA=stbJT8(8`MKcdd$KV<|$vFdDXr!OJ zjr9@^{kv^)SB7axfaZbpYTg4Vj9E`3JNqo~0FzDj;K>M+2CxtaTx`Sj6$DFwt+l5@ zjMYGTT|EQ|Ai7+11<{6PFrr+Z{q}$=VPt#IBpBE!$sVtdwe=_5DYJ_)yE(^N{|%xa XT88|{_fyBX00000NkvXXu0mjf;!xmJ diff --git a/src/main/resources/assets/create/textures/block/belt_observer_front.png b/src/main/resources/assets/create/textures/block/belt_observer_front.png deleted file mode 100644 index d5f96f35569754e65bbbd924cd359d1b170dffa6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 388 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 UPsc0sZvX%Q07*qoM6N<$g3kr()c^nh diff --git a/src/main/resources/assets/create/textures/block/chute.png b/src/main/resources/assets/create/textures/block/chute.png index dbc6085e0c745859090913f732dc2f086ff4daaf..03bedacdcccd66bdfc09a7660b556b95ffb57492 100644 GIT binary patch delta 1548 zcmV+n2J`vCKAa4YBYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vG? zA^-p`A_1!6-I4$R1+hs)K~z{rotMu~V^tK#Z%bQBf6yre5==~7F@{Wl2n?f9@W+N( zu_4A}qRA|be*r6Zt_^P7>CT15g)YIEI1v&OVo*#bW+ao0iGOj>p#stlPzpTn=d|DF z>tluxzsc>r@4WlY`QCHSIrla(J3AY6c6Pe6von`Yr`_r4sRJDy9ZwuHFPTib&CN}F z-q_ek+?<&SGF}JBb#+~W_jd%3N^}0JaICkGJf0syNba;5!6$%AYoXh2m z2&6PdPS5k;;D4a2dj(OT?1hn$=GYqmQR9N%O^l6sT^SoE`SGi;2aEv72*}jHg9i_6 z%*tuVP`0wVYVWm5AQC{H0jq0kMj9j=jfN@Is#tk9Mhz!2CE+me1##V{bIR z4T9v%4LyKcqefDxlvj9QV~Frf(|gFqNk|!pt~BZah=0j5iUD9AsMTurfRU4v6B`2p zFD?@iAH3EBl%dqd5kpZAh?wSu9)JKrM$a~|T7hS6je5vJLeBtY1XifLWi0LiK(;V9 z^ne142BNEFd*YDsqrWa{>-%OMIrPN&zEb(aGN>&JwBIsB z0g4(2%m>HE$Ds`5^Eq!QV@9*t&bA&;rcxc&ip8Ak@9%4U^@J<{j~_oa!(@YELhqFY zCq6)#^WN>-CNGtWHm6kTc6qO}x2Np7i^Z@n`G1V+YHa~Tg|;lv$~DG-JR*n)B#|r1 z6AAOEEBdX>WHRPG#TD<6K};kBBQQETY9v@ON|DhR@9yq44ejsS2Yr1__pztQ6>uo0 zi3qDK6tZS8o$fFhr0_+7z= z$BhNBCz$eNPyIF`qfThf;?k1o3zZHI4h0{4`L%m%^s33e*!VSIyz%I-;LVp`^T+Qm zZ3N;N8=DNsjEpxZFX|X)8xH+eH9Qf5I)4ZPx4yo1p1`}GeCFn-$3hv#=`SL{eS$5C zW)U!%_hQ`}qpx{#Q7G1$R6XL+3Coebelr?>7lqPNLCb|j0sZIBjs-D2vgkbBG5#aq ztJTwR(K}X-qUfcjTrQgtdKz*X^P-m;zD=lvQb^wU_|vv60BpnCZ_N18xohlILVtx@ zw{8U}1NZOW4>RZJ=*W7(jQOp=n?plGrVCk8C6pX~wp1|J(}a5u_v~G~ghqifRwv`z z+uN>Mt+usFrDA$582x-9sS*l)|EK0YT>deLrr`6>TxpHkOK2R@f$^t7BosFwDP!ew z(LBHwy#Li==mI>zyQc+W!IxM-kblM9{vptFbcOiWL`ZW>alrh;^)dH!lYTWWgN+zrOZZv@o+maY(Zj@H}T+mf6IM>)YPvXE%|Uk7w?j9#e)o&CgzPP1qs z;{PIxfiMSC6x<5|m5}=fC4ZWDu>01?wQKI@yLUt5K(|?X83xSdIE{jpOiWDJn84)} zR93KByoe0oB|HHEU|B#Q#=Q{t03>wpCnor3%a~g=1T3dpM)3%%Q@RPPp5vJy6cXV% y?hDHQInQ+*16C(cpmY?gRzOsMWTVk={{l*RuH90vaA^Pl002ovP6b4+LSTaC>H6;g literal 8002 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 EU%mq*w*UYD diff --git a/src/main/resources/assets/create/textures/block/content_observer.png b/src/main/resources/assets/create/textures/block/content_observer.png new file mode 100644 index 0000000000000000000000000000000000000000..fae25ed398e5b6521869477025f69902d09cb543 GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sEXgD|57Yp@DX@Pem{V~B-+@}K|z?U_{@IK3wGy75Zzuo?KB zGXJZueCnjZ%5MhEECCN}nU$Lr4%g55lD=TpdWSjJb54JF^0l0;OIYafF0tMJ6((Qv zwK{x&SL6X}lGC~h#t`OWM&XVhAHEnfTL%a&k$mDZBe?LQ!d8RYo`YgR|NsB_b^OC? z{Uh4(^?%te8yq-$j4RcV!6$CQtb2I!_4|?%*SFsI`~TNt@#e;jMgcP#A3pBpPmmJ-@$s$s zjDKJLvd>5>NJ#m^Z^XhO;c-yGR$;HtBY|QMHihu!J!e>o3_6^(e*AjPZxJ(tr9mc- z&#XhElR;#KkN!fLphgLK@x$B-wlaqrV#FI5N@EzjZa-m~5VtJfp(#ec!AR7?xUopo zl3_}B;3i`Y-v%a85xpH56E-`pYfE|lo`*q6t1aT(`N=v!PceA9`njxgN@xNAfBbDw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/content_observer_inner_powered.png b/src/main/resources/assets/create/textures/block/content_observer_inner_powered.png new file mode 100644 index 0000000000000000000000000000000000000000..b99b2d00993b50a4176804a58b687b449d589c9d GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1en@U*9kV~B-+@|-F8zvA7dOn&HkR*}t)jg5_0 zp^oK95lcp!n01@_`u)ZR>#{fg=6}?D;JW;NiGBZmF+Y9CzQ4}Ms6i)f#<2q*>iySC z-w{Y+Jn=NsVXx1h0LG#QTLI(7KW7delUaN?;6PyutchF=x{OPX)GgwE(q8&k~rq58c?2F=N*E z`Tv`Yg}utm*u9$muog+_Nr`-CZ@j@gXYPJu28J4w;JnD=GM|CoV(@hJb6Mw<&;$U& Cq;GNn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/content_observer_powered.png b/src/main/resources/assets/create/textures/block/content_observer_powered.png new file mode 100644 index 0000000000000000000000000000000000000000..e0d087040c676897b038d50f826eddcc6a15b7a6 GIT binary patch literal 305 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sEXgD|57Yp@DX@R+BIV~B-+@}K|z?U_{@IK3wGy75Zzuo?KB zGXJZueCp(fMb8A9Edw4X3Y>ntFrVS0qr$h0jmZ_Cepxdg(-!82TKUYY?5 zR|m79rd|S*p!~c#w(MukT8EZOy3{iz@hh~wOy=1(;n)A?*X`Tl>lNdE{(5abqm41o zEKGx&DdAJooE)C_`~N2;T$%ES@pVdiV$y@8WH#@*-(ROcd_KQE!Hna;6Ng6%4La<7 vtQxabKD^adW)}Zm&vr~nK9_4zVgTe~DWM4f=;Ll_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/stockpile_switch_end.png b/src/main/resources/assets/create/textures/block/filtered_detector_front.png similarity index 100% rename from src/main/resources/assets/create/textures/block/stockpile_switch_end.png rename to src/main/resources/assets/create/textures/block/filtered_detector_front.png diff --git a/src/main/resources/assets/create/textures/block/filtered_detector_top.png b/src/main/resources/assets/create/textures/block/filtered_detector_top.png new file mode 100644 index 0000000000000000000000000000000000000000..0a037bd0d81568933dd8729b38cc429b17d0637e GIT binary patch literal 453 zcmV;$0XqJPP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGizW@LZzX3P}QzQTY0a{5!K~y+Tjgiet z!$1^;XY#8FwcQj2SH(?13WBfUvJc?SeNk}jL-`yo+>0xJDl`owX{TxR8*ZFrQN%;I zoO|cax%W);{dAJ3jZ!K;42WH;!N-GEQYW4i| zX>X?o(aqf>BnWlA`QA&w?e&D{Ny5Rf7pGAOA0Anf!~rBP>V6tQs23|k^hy;9+lwUf ziKgC3N^>&-nC))!djJUo&ur~7wx~6vF!l{ROydC-1@>}jwnRbXYgSET-wDy&onZCY z0fM{~fz%xu4?KmeLFsK#$v4l}@-EuxNeyv;3ly(jW9|g)}0_8+$&iR?#I1;mAFJ{G)ze8mcO>BjM=qs vtskc2!D+9_{zO^mEUWbF>bxoZ2TJ__?Xk2Qc!(!j00000NkvXXu0mjfFIT>< literal 0 HcmV?d00001 From d9d5e60606575d8e5d789f9ad41a8cbf0fb0b629 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 24 Sep 2020 13:39:12 +0200 Subject: [PATCH 02/12] Workstation transfer, Part I - Intermediate changes, probably doesn't even compile --- src/generated/resources/.cache/cache | 4 +- .../portable_storage_interface.json | 12 +- .../item/portable_storage_interface.json | 2 +- .../com/simibubi/create/AllBlockPartials.java | 4 + .../java/com/simibubi/create/AllBlocks.java | 8 +- .../java/com/simibubi/create/AllShapes.java | 3 +- .../com/simibubi/create/AllTileEntities.java | 489 +++++++++--------- .../actors/PortableStorageInterfaceBlock.java | 19 +- .../PortableStorageInterfaceMovement.java | 167 ++++++ .../PortableStorageInterfaceRenderer.java | 64 +++ .../PortableStorageInterfaceTileEntity.java | 56 ++ .../actors/StorageInterfaceMovement.java | 157 ------ .../create/foundation/config/CLogistics.java | 2 + .../portable_storage_interface/block.json | 63 +++ .../block_middle.json | 28 + .../block_middle_powered.json | 28 + .../portable_storage_interface/block_top.json | 120 +++++ .../brass_casing.png | Bin 0 -> 432 bytes .../portable_storage_interface/item.json | 238 +++++++++ .../portable_storage_interface.bbmodel | 1 + .../portable_storage_interface.png | Bin 0 -> 4142 bytes .../block/portable_storage_interface.png | Bin 0 -> 4142 bytes 22 files changed, 1051 insertions(+), 414 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceMovement.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java delete mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/actors/StorageInterfaceMovement.java create mode 100644 src/main/resources/assets/create/models/block/portable_storage_interface/block.json create mode 100644 src/main/resources/assets/create/models/block/portable_storage_interface/block_middle.json create mode 100644 src/main/resources/assets/create/models/block/portable_storage_interface/block_middle_powered.json create mode 100644 src/main/resources/assets/create/models/block/portable_storage_interface/block_top.json create mode 100644 src/main/resources/assets/create/models/block/portable_storage_interface/brass_casing.png create mode 100644 src/main/resources/assets/create/models/block/portable_storage_interface/item.json create mode 100644 src/main/resources/assets/create/models/block/portable_storage_interface/portable_storage_interface.bbmodel create mode 100644 src/main/resources/assets/create/models/block/portable_storage_interface/portable_storage_interface.png create mode 100644 src/main/resources/assets/create/textures/block/portable_storage_interface.png diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 10d8136e7..36b412ed4 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -291,7 +291,7 @@ c8467d55bc22d2e2256b8b732c06c9fdc64d336f assets/create/blockstates/polished_weat 5d811eab3c5e8411f98e2ea98d93d35955ce18fc assets/create/blockstates/polished_weathered_limestone_slab.json acec6cdebe772ca72de94a85d98199e827495acb assets/create/blockstates/polished_weathered_limestone_stairs.json f42ad32aefcfa7ccc6287f57ee1a5f092b65126f assets/create/blockstates/polished_weathered_limestone_wall.json -b7829c2ef2c47188713f8cab21b2c9bc7f9c5b79 assets/create/blockstates/portable_storage_interface.json +1b70b4e5792dccd2110b84e209016ac258005e28 assets/create/blockstates/portable_storage_interface.json 8296d43d5f1c2113012d127038fb319af83aaee4 assets/create/blockstates/powered_latch.json e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggle_latch.json 3a739f9d4276828d83f2d2750bf3227c87bcd438 assets/create/blockstates/pulley_magnet.json @@ -1306,7 +1306,7 @@ e95125318055b8557afd7d108488cf0bdd81fe49 assets/create/models/item/polished_scor 68fb04f7a89c8117bb641e347df9bfc1f1248335 assets/create/models/item/polished_weathered_limestone_slab.json 6d92ee7112aa20e8a1adfe73d8933031c299bed1 assets/create/models/item/polished_weathered_limestone_stairs.json b4995fb4799f33508cd6bf2ded80c0b3e866ad43 assets/create/models/item/polished_weathered_limestone_wall.json -ef2c9dcd5f6385a0f0cdc2e9120c984827863100 assets/create/models/item/portable_storage_interface.json +3bc60b0d9884c2ee0f1dd530e90fceb699eea737 assets/create/models/item/portable_storage_interface.json d3cfc1a1137c4bc98848947d425d2972df144c95 assets/create/models/item/powdered_obsidian.json 1e501c1f2e9250aaaadcf17db62646d08177d4e1 assets/create/models/item/powered_latch.json 3a6dfc7f36e31ebfcd650c3144a7f2210e8a4f9f assets/create/models/item/powered_toggle_latch.json diff --git a/src/generated/resources/assets/create/blockstates/portable_storage_interface.json b/src/generated/resources/assets/create/blockstates/portable_storage_interface.json index 463c071a2..331749529 100644 --- a/src/generated/resources/assets/create/blockstates/portable_storage_interface.json +++ b/src/generated/resources/assets/create/blockstates/portable_storage_interface.json @@ -1,28 +1,28 @@ { "variants": { "facing=down": { - "model": "create:block/portable_storage_interface", + "model": "create:block/portable_storage_interface/block", "x": 180 }, "facing=up": { - "model": "create:block/portable_storage_interface" + "model": "create:block/portable_storage_interface/block" }, "facing=north": { - "model": "create:block/portable_storage_interface", + "model": "create:block/portable_storage_interface/block", "x": 90 }, "facing=south": { - "model": "create:block/portable_storage_interface", + "model": "create:block/portable_storage_interface/block", "x": 90, "y": 180 }, "facing=west": { - "model": "create:block/portable_storage_interface", + "model": "create:block/portable_storage_interface/block", "x": 90, "y": 270 }, "facing=east": { - "model": "create:block/portable_storage_interface", + "model": "create:block/portable_storage_interface/block", "x": 90, "y": 90 } diff --git a/src/generated/resources/assets/create/models/item/portable_storage_interface.json b/src/generated/resources/assets/create/models/item/portable_storage_interface.json index 87d2165ba..3330b9ffd 100644 --- a/src/generated/resources/assets/create/models/item/portable_storage_interface.json +++ b/src/generated/resources/assets/create/models/item/portable_storage_interface.json @@ -1,3 +1,3 @@ { - "parent": "create:block/portable_storage_interface" + "parent": "create:block/portable_storage_interface/item" } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index cc08122af..492ee1335 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -68,6 +68,10 @@ public class AllBlockPartials { SYMMETRY_PLANE = get("symmetry_effect/plane"), SYMMETRY_CROSSPLANE = get("symmetry_effect/crossplane"), SYMMETRY_TRIPLEPLANE = get("symmetry_effect/tripleplane"), + + PORTABLE_STORAGE_INTERFACE_MIDDLE = get("portable_storage_interface/block_middle"), + PORTABLE_STORAGE_INTERFACE_MIDDLE_POWERED = get("portable_storage_interface/block_middle_powered"), + PORTABLE_STORAGE_INTERFACE_TOP = get("portable_storage_interface/block_top"), ARM_COG = get("mechanical_arm/cog"), ARM_BASE = get("mechanical_arm/base"), ARM_LOWER_BODY = get("mechanical_arm/lower_body"), ARM_UPPER_BODY = get("mechanical_arm/upper_body"), diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index fba5eac5b..a73c72662 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -20,6 +20,7 @@ import com.simibubi.create.content.contraptions.components.actors.HarvesterMovem import com.simibubi.create.content.contraptions.components.actors.PloughBlock; import com.simibubi.create.content.contraptions.components.actors.PloughMovementBehaviour; import com.simibubi.create.content.contraptions.components.actors.PortableStorageInterfaceBlock; +import com.simibubi.create.content.contraptions.components.actors.PortableStorageInterfaceMovement; import com.simibubi.create.content.contraptions.components.actors.SawMovementBehaviour; import com.simibubi.create.content.contraptions.components.actors.SeatBlock; import com.simibubi.create.content.contraptions.components.actors.SeatMovementBehaviour; @@ -667,9 +668,10 @@ public class AllBlocks { public static final BlockEntry PORTABLE_STORAGE_INTERFACE = REGISTRATE.block("portable_storage_interface", PortableStorageInterfaceBlock::new) .initialProperties(SharedProperties::stone) -// .onRegister(addMovementBehaviour(new StorageInterfaceMovement())) - .blockstate(BlockStateGen.directionalBlockProvider(false)) - .simpleItem() + .blockstate((c, p) -> p.directionalBlock(c.get(), AssetLookup.partialBaseModel(c, p))) + .onRegister(addMovementBehaviour(new PortableStorageInterfaceMovement())) + .item() + .transform(customItemModel()) .register(); public static final BlockEntry MECHANICAL_HARVESTER = diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index 096b9bb76..f78e208ea 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -32,8 +32,7 @@ public class AllShapes { EIGHT_VOXEL_POLE = shape(4, 0, 4, 12, 16, 12).forAxis(), FURNACE_ENGINE = shape(1, 1, 0, 15, 15, 16).add(0, 0, 9, 16, 16, 14) .forHorizontal(Direction.SOUTH), - PORTABLE_STORAGE_INTERFACE = shape(0, 0, 0, 16, 12, 16).add(3, 12, 3, 13, 16, 13) - .forDirectional(), + PORTABLE_STORAGE_INTERFACE = shape(0, 0, 0, 16, 14, 16).forDirectional(), PULLEY = shape(0, 0, 0, 16, 16, 2).add(1, 1, 2, 15, 15, 14) .add(0, 0, 14, 16, 16, 16) .forHorizontalAxis(), diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 2a1e145f2..2af986739 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -5,6 +5,8 @@ import com.simibubi.create.content.contraptions.components.actors.DrillRenderer; import com.simibubi.create.content.contraptions.components.actors.DrillTileEntity; import com.simibubi.create.content.contraptions.components.actors.HarvesterRenderer; import com.simibubi.create.content.contraptions.components.actors.HarvesterTileEntity; +import com.simibubi.create.content.contraptions.components.actors.PortableStorageInterfaceRenderer; +import com.simibubi.create.content.contraptions.components.actors.PortableStorageInterfaceTileEntity; import com.simibubi.create.content.contraptions.components.clock.CuckooClockRenderer; import com.simibubi.create.content.contraptions.components.clock.CuckooClockTileEntity; import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterRenderer; @@ -106,371 +108,380 @@ public class AllTileEntities { // Schematics public static final TileEntityEntry SCHEMATICANNON = Create.registrate() - .tileEntity("schematicannon", SchematicannonTileEntity::new) - .validBlocks(AllBlocks.SCHEMATICANNON) - .renderer(() -> SchematicannonRenderer::new) - .register(); + .tileEntity("schematicannon", SchematicannonTileEntity::new) + .validBlocks(AllBlocks.SCHEMATICANNON) + .renderer(() -> SchematicannonRenderer::new) + .register(); public static final TileEntityEntry SCHEMATIC_TABLE = Create.registrate() - .tileEntity("schematic_table", SchematicTableTileEntity::new) - .validBlocks(AllBlocks.SCHEMATIC_TABLE) - //.renderer(() -> renderer) - .register(); + .tileEntity("schematic_table", SchematicTableTileEntity::new) + .validBlocks(AllBlocks.SCHEMATIC_TABLE) + // .renderer(() -> renderer) + .register(); // Kinetics public static final TileEntityEntry SIMPLE_KINETIC = Create.registrate() - .tileEntity("simple_kinetic", SimpleKineticTileEntity::new) - .validBlocks(AllBlocks.SHAFT, AllBlocks.COGWHEEL, AllBlocks.LARGE_COGWHEEL, AllBlocks.ENCASED_SHAFT) - .renderer(() -> KineticTileEntityRenderer::new) - .register(); + .tileEntity("simple_kinetic", SimpleKineticTileEntity::new) + .validBlocks(AllBlocks.SHAFT, AllBlocks.COGWHEEL, AllBlocks.LARGE_COGWHEEL, AllBlocks.ENCASED_SHAFT) + .renderer(() -> KineticTileEntityRenderer::new) + .register(); public static final TileEntityEntry MOTOR = Create.registrate() - .tileEntity("motor", CreativeMotorTileEntity::new) - .validBlocks(AllBlocks.CREATIVE_MOTOR) - .renderer(() -> CreativeMotorRenderer::new) - .register(); + .tileEntity("motor", CreativeMotorTileEntity::new) + .validBlocks(AllBlocks.CREATIVE_MOTOR) + .renderer(() -> CreativeMotorRenderer::new) + .register(); public static final TileEntityEntry GEARBOX = Create.registrate() - .tileEntity("gearbox", GearboxTileEntity::new) - .validBlocks(AllBlocks.GEARBOX) - .renderer(() -> GearboxRenderer::new) - .register(); + .tileEntity("gearbox", GearboxTileEntity::new) + .validBlocks(AllBlocks.GEARBOX) + .renderer(() -> GearboxRenderer::new) + .register(); public static final TileEntityEntry ENCASED_SHAFT = Create.registrate() - .tileEntity("encased_shaft", EncasedShaftTileEntity::new) - .validBlocks(AllBlocks.ENCASED_SHAFT, AllBlocks.ENCASED_BELT) - .renderer(() -> EncasedShaftRenderer::new) - .register(); + .tileEntity("encased_shaft", EncasedShaftTileEntity::new) + .validBlocks(AllBlocks.ENCASED_SHAFT, AllBlocks.ENCASED_BELT) + .renderer(() -> EncasedShaftRenderer::new) + .register(); public static final TileEntityEntry ADJUSTABLE_PULLEY = Create.registrate() - .tileEntity("adjustable_pulley", AdjustablePulleyTileEntity::new) - .validBlocks(AllBlocks.ADJUSTABLE_PULLEY) - .renderer(() -> EncasedShaftRenderer::new) - .register(); + .tileEntity("adjustable_pulley", AdjustablePulleyTileEntity::new) + .validBlocks(AllBlocks.ADJUSTABLE_PULLEY) + .renderer(() -> EncasedShaftRenderer::new) + .register(); public static final TileEntityEntry ENCASED_FAN = Create.registrate() - .tileEntity("encased_fan", EncasedFanTileEntity::new) - .validBlocks(AllBlocks.ENCASED_FAN) - .renderer(() -> EncasedFanRenderer::new) - .register(); + .tileEntity("encased_fan", EncasedFanTileEntity::new) + .validBlocks(AllBlocks.ENCASED_FAN) + .renderer(() -> EncasedFanRenderer::new) + .register(); public static final TileEntityEntry NOZZLE = Create.registrate() - .tileEntity("nozzle", NozzleTileEntity::new) - .validBlocks(AllBlocks.NOZZLE) - //.renderer(() -> renderer) - .register(); + .tileEntity("nozzle", NozzleTileEntity::new) + .validBlocks(AllBlocks.NOZZLE) + // .renderer(() -> renderer) + .register(); public static final TileEntityEntry CLUTCH = Create.registrate() - .tileEntity("clutch", ClutchTileEntity::new) - .validBlocks(AllBlocks.CLUTCH) - .renderer(() -> SplitShaftRenderer::new) - .register(); + .tileEntity("clutch", ClutchTileEntity::new) + .validBlocks(AllBlocks.CLUTCH) + .renderer(() -> SplitShaftRenderer::new) + .register(); public static final TileEntityEntry GEARSHIFT = Create.registrate() - .tileEntity("gearshift", GearshiftTileEntity::new) - .validBlocks(AllBlocks.GEARSHIFT) - .renderer(() -> SplitShaftRenderer::new) - .register(); + .tileEntity("gearshift", GearshiftTileEntity::new) + .validBlocks(AllBlocks.GEARSHIFT) + .renderer(() -> SplitShaftRenderer::new) + .register(); public static final TileEntityEntry TURNTABLE = Create.registrate() - .tileEntity("turntable", TurntableTileEntity::new) - .validBlocks(AllBlocks.TURNTABLE) - .renderer(() -> KineticTileEntityRenderer::new) - .register(); + .tileEntity("turntable", TurntableTileEntity::new) + .validBlocks(AllBlocks.TURNTABLE) + .renderer(() -> KineticTileEntityRenderer::new) + .register(); public static final TileEntityEntry HAND_CRANK = Create.registrate() - .tileEntity("hand_crank", HandCrankTileEntity::new) - .validBlocks(AllBlocks.HAND_CRANK) - .renderer(() -> HandCrankRenderer::new) - .register(); + .tileEntity("hand_crank", HandCrankTileEntity::new) + .validBlocks(AllBlocks.HAND_CRANK) + .renderer(() -> HandCrankRenderer::new) + .register(); public static final TileEntityEntry CUCKOO_CLOCK = Create.registrate() - .tileEntity("cuckoo_clock", CuckooClockTileEntity::new) - .validBlocks(AllBlocks.CUCKOO_CLOCK, AllBlocks.MYSTERIOUS_CUCKOO_CLOCK) - .renderer(() -> CuckooClockRenderer::new) - .register(); + .tileEntity("cuckoo_clock", CuckooClockTileEntity::new) + .validBlocks(AllBlocks.CUCKOO_CLOCK, AllBlocks.MYSTERIOUS_CUCKOO_CLOCK) + .renderer(() -> CuckooClockRenderer::new) + .register(); public static final TileEntityEntry MECHANICAL_PUMP = Create.registrate() - .tileEntity("mechanical_pump", PumpTileEntity::new) - .validBlocks(AllBlocks.MECHANICAL_PUMP) - .renderer(() -> PumpRenderer::new) - .register(); + .tileEntity("mechanical_pump", PumpTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_PUMP) + .renderer(() -> PumpRenderer::new) + .register(); public static final TileEntityEntry FLUID_PIPE = Create.registrate() - .tileEntity("fluid_pipe", FluidPipeTileEntity::new) - .validBlocks(AllBlocks.FLUID_PIPE) - .register(); + .tileEntity("fluid_pipe", FluidPipeTileEntity::new) + .validBlocks(AllBlocks.FLUID_PIPE) + .register(); public static final TileEntityEntry ENCASED_FLUID_PIPE = Create.registrate() - .tileEntity("encased_fluid_pipe", StraightPipeTileEntity::new) - .validBlocks(AllBlocks.ENCASED_FLUID_PIPE) - .register(); + .tileEntity("encased_fluid_pipe", StraightPipeTileEntity::new) + .validBlocks(AllBlocks.ENCASED_FLUID_PIPE) + .register(); public static final TileEntityEntry GLASS_FLUID_PIPE = Create.registrate() - .tileEntity("glass_fluid_pipe", StraightPipeTileEntity::new) - .validBlocks(AllBlocks.GLASS_FLUID_PIPE) - .renderer(() -> TransparentStraightPipeRenderer::new) - .register(); + .tileEntity("glass_fluid_pipe", StraightPipeTileEntity::new) + .validBlocks(AllBlocks.GLASS_FLUID_PIPE) + .renderer(() -> TransparentStraightPipeRenderer::new) + .register(); public static final TileEntityEntry FLUID_TANK = Create.registrate() - .tileEntity("fluid_tank", FluidTankTileEntity::new) - .validBlocks(AllBlocks.FLUID_TANK) - .renderer(() -> FluidTankRenderer::new) - .register(); - + .tileEntity("fluid_tank", FluidTankTileEntity::new) + .validBlocks(AllBlocks.FLUID_TANK) + .renderer(() -> FluidTankRenderer::new) + .register(); + public static final TileEntityEntry SPOUT = Create.registrate() - .tileEntity("spout", SpoutTileEntity::new) - .validBlocks(AllBlocks.SPOUT) - .renderer(() -> SpoutRenderer::new) - .register(); + .tileEntity("spout", SpoutTileEntity::new) + .validBlocks(AllBlocks.SPOUT) + .renderer(() -> SpoutRenderer::new) + .register(); public static final TileEntityEntry BELT = Create.registrate() - .tileEntity("belt", BeltTileEntity::new) - .validBlocks(AllBlocks.BELT) - .renderer(() -> BeltRenderer::new) - .register(); + .tileEntity("belt", BeltTileEntity::new) + .validBlocks(AllBlocks.BELT) + .renderer(() -> BeltRenderer::new) + .register(); public static final TileEntityEntry CHUTE = Create.registrate() - .tileEntity("chute", ChuteTileEntity::new) - .validBlocks(AllBlocks.CHUTE) - .renderer(() -> ChuteRenderer::new) - .register(); + .tileEntity("chute", ChuteTileEntity::new) + .validBlocks(AllBlocks.CHUTE) + .renderer(() -> ChuteRenderer::new) + .register(); public static final TileEntityEntry ANDESITE_TUNNEL = Create.registrate() - .tileEntity("andesite_tunnel", BeltTunnelTileEntity::new) - .validBlocks(AllBlocks.ANDESITE_TUNNEL) - .renderer(() -> BeltTunnelRenderer::new) - .register(); + .tileEntity("andesite_tunnel", BeltTunnelTileEntity::new) + .validBlocks(AllBlocks.ANDESITE_TUNNEL) + .renderer(() -> BeltTunnelRenderer::new) + .register(); public static final TileEntityEntry BRASS_TUNNEL = Create.registrate() - .tileEntity("brass_tunnel", BrassTunnelTileEntity::new) - .validBlocks(AllBlocks.BRASS_TUNNEL) - .renderer(() -> BeltTunnelRenderer::new) - .register(); + .tileEntity("brass_tunnel", BrassTunnelTileEntity::new) + .validBlocks(AllBlocks.BRASS_TUNNEL) + .renderer(() -> BeltTunnelRenderer::new) + .register(); public static final TileEntityEntry MECHANICAL_ARM = Create.registrate() - .tileEntity("mechanical_arm", ArmTileEntity::new) - .validBlocks(AllBlocks.MECHANICAL_ARM) - .renderer(() -> ArmRenderer::new) - .register(); + .tileEntity("mechanical_arm", ArmTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_ARM) + .renderer(() -> ArmRenderer::new) + .register(); public static final TileEntityEntry MECHANICAL_PISTON = Create.registrate() - .tileEntity("mechanical_piston", MechanicalPistonTileEntity::new) - .validBlocks(AllBlocks.MECHANICAL_PISTON, AllBlocks.STICKY_MECHANICAL_PISTON) - .renderer(() -> MechanicalPistonRenderer::new) - .register(); + .tileEntity("mechanical_piston", MechanicalPistonTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_PISTON, AllBlocks.STICKY_MECHANICAL_PISTON) + .renderer(() -> MechanicalPistonRenderer::new) + .register(); public static final TileEntityEntry MECHANICAL_BEARING = Create.registrate() - .tileEntity("mechanical_bearing", MechanicalBearingTileEntity::new) - .validBlocks(AllBlocks.MECHANICAL_BEARING) - .renderer(() -> BearingRenderer::new) - .register(); + .tileEntity("mechanical_bearing", MechanicalBearingTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_BEARING) + .renderer(() -> BearingRenderer::new) + .register(); public static final TileEntityEntry CLOCKWORK_BEARING = Create.registrate() - .tileEntity("clockwork_bearing", ClockworkBearingTileEntity::new) - .validBlocks(AllBlocks.CLOCKWORK_BEARING) - .renderer(() -> BearingRenderer::new) - .register(); + .tileEntity("clockwork_bearing", ClockworkBearingTileEntity::new) + .validBlocks(AllBlocks.CLOCKWORK_BEARING) + .renderer(() -> BearingRenderer::new) + .register(); public static final TileEntityEntry ROPE_PULLEY = Create.registrate() - .tileEntity("rope_pulley", PulleyTileEntity::new) - .validBlocks(AllBlocks.ROPE_PULLEY) - .renderer(() -> PulleyRenderer::new) - .register(); + .tileEntity("rope_pulley", PulleyTileEntity::new) + .validBlocks(AllBlocks.ROPE_PULLEY) + .renderer(() -> PulleyRenderer::new) + .register(); public static final TileEntityEntry CHASSIS = Create.registrate() - .tileEntity("chassis", ChassisTileEntity::new) - .validBlocks(AllBlocks.RADIAL_CHASSIS, AllBlocks.LINEAR_CHASSIS, AllBlocks.SECONDARY_LINEAR_CHASSIS) - //.renderer(() -> renderer) - .register(); + .tileEntity("chassis", ChassisTileEntity::new) + .validBlocks(AllBlocks.RADIAL_CHASSIS, AllBlocks.LINEAR_CHASSIS, AllBlocks.SECONDARY_LINEAR_CHASSIS) + // .renderer(() -> renderer) + .register(); public static final TileEntityEntry DRILL = Create.registrate() - .tileEntity("drill", DrillTileEntity::new) - .validBlocks(AllBlocks.MECHANICAL_DRILL) - .renderer(() -> DrillRenderer::new) - .register(); + .tileEntity("drill", DrillTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_DRILL) + .renderer(() -> DrillRenderer::new) + .register(); public static final TileEntityEntry SAW = Create.registrate() - .tileEntity("saw", SawTileEntity::new) - .validBlocks(AllBlocks.MECHANICAL_SAW) - .renderer(() -> SawRenderer::new) - .register(); + .tileEntity("saw", SawTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_SAW) + .renderer(() -> SawRenderer::new) + .register(); public static final TileEntityEntry HARVESTER = Create.registrate() - .tileEntity("harvester", HarvesterTileEntity::new) - .validBlocks(AllBlocks.MECHANICAL_HARVESTER) - .renderer(() -> HarvesterRenderer::new) + .tileEntity("harvester", HarvesterTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_HARVESTER) + .renderer(() -> HarvesterRenderer::new) + .register(); + + public static final TileEntityEntry PORTABLE_STORAGE_INTERFACE = + Create.registrate() + .tileEntity("portable_storage_interface", PortableStorageInterfaceTileEntity::new) + .validBlocks(AllBlocks.PORTABLE_STORAGE_INTERFACE) + .renderer(() -> PortableStorageInterfaceRenderer::new) .register(); public static final TileEntityEntry FLYWHEEL = Create.registrate() - .tileEntity("flywheel", FlywheelTileEntity::new) - .validBlocks(AllBlocks.FLYWHEEL) - .renderer(() -> FlywheelRenderer::new) - .register(); + .tileEntity("flywheel", FlywheelTileEntity::new) + .validBlocks(AllBlocks.FLYWHEEL) + .renderer(() -> FlywheelRenderer::new) + .register(); public static final TileEntityEntry FURNACE_ENGINE = Create.registrate() - .tileEntity("furnace_engine", FurnaceEngineTileEntity::new) - .validBlocks(AllBlocks.FURNACE_ENGINE) - .renderer(() -> EngineRenderer::new) - .register(); + .tileEntity("furnace_engine", FurnaceEngineTileEntity::new) + .validBlocks(AllBlocks.FURNACE_ENGINE) + .renderer(() -> EngineRenderer::new) + .register(); public static final TileEntityEntry MILLSTONE = Create.registrate() - .tileEntity("millstone", MillstoneTileEntity::new) - .validBlocks(AllBlocks.MILLSTONE) - .renderer(() -> MillstoneRenderer::new) - .register(); + .tileEntity("millstone", MillstoneTileEntity::new) + .validBlocks(AllBlocks.MILLSTONE) + .renderer(() -> MillstoneRenderer::new) + .register(); public static final TileEntityEntry CRUSHING_WHEEL = Create.registrate() - .tileEntity("crushing_wheel", CrushingWheelTileEntity::new) - .validBlocks(AllBlocks.CRUSHING_WHEEL) - .renderer(() -> KineticTileEntityRenderer::new) - .register(); + .tileEntity("crushing_wheel", CrushingWheelTileEntity::new) + .validBlocks(AllBlocks.CRUSHING_WHEEL) + .renderer(() -> KineticTileEntityRenderer::new) + .register(); - public static final TileEntityEntry CRUSHING_WHEEL_CONTROLLER = Create.registrate() + public static final TileEntityEntry CRUSHING_WHEEL_CONTROLLER = + Create.registrate() .tileEntity("crushing_wheel_controller", CrushingWheelControllerTileEntity::new) .validBlocks(AllBlocks.CRUSHING_WHEEL_CONTROLLER) - //.renderer(() -> renderer) + // .renderer(() -> renderer) .register(); public static final TileEntityEntry WATER_WHEEL = Create.registrate() - .tileEntity("water_wheel", WaterWheelTileEntity::new) - .validBlocks(AllBlocks.WATER_WHEEL) - .renderer(() -> KineticTileEntityRenderer::new) - .register(); + .tileEntity("water_wheel", WaterWheelTileEntity::new) + .validBlocks(AllBlocks.WATER_WHEEL) + .renderer(() -> KineticTileEntityRenderer::new) + .register(); public static final TileEntityEntry MECHANICAL_PRESS = Create.registrate() - .tileEntity("mechanical_press", MechanicalPressTileEntity::new) - .validBlocks(AllBlocks.MECHANICAL_PRESS) - .renderer(() -> MechanicalPressRenderer::new) - .register(); + .tileEntity("mechanical_press", MechanicalPressTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_PRESS) + .renderer(() -> MechanicalPressRenderer::new) + .register(); public static final TileEntityEntry MECHANICAL_MIXER = Create.registrate() - .tileEntity("mechanical_mixer", MechanicalMixerTileEntity::new) - .validBlocks(AllBlocks.MECHANICAL_MIXER) - .renderer(() -> MechanicalMixerRenderer::new) - .register(); + .tileEntity("mechanical_mixer", MechanicalMixerTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_MIXER) + .renderer(() -> MechanicalMixerRenderer::new) + .register(); public static final TileEntityEntry DEPLOYER = Create.registrate() - .tileEntity("deployer", DeployerTileEntity::new) - .validBlocks(AllBlocks.DEPLOYER) - .renderer(() -> DeployerRenderer::new) - .register(); + .tileEntity("deployer", DeployerTileEntity::new) + .validBlocks(AllBlocks.DEPLOYER) + .renderer(() -> DeployerRenderer::new) + .register(); public static final TileEntityEntry BASIN = Create.registrate() - .tileEntity("basin", BasinTileEntity::new) - .validBlocks(AllBlocks.BASIN) - .renderer(() -> BasinRenderer::new) - .register(); + .tileEntity("basin", BasinTileEntity::new) + .validBlocks(AllBlocks.BASIN) + .renderer(() -> BasinRenderer::new) + .register(); public static final TileEntityEntry HEATER = Create.registrate() - .tileEntity("blaze_heater", BlazeBurnerTileEntity::new) - .validBlocks(AllBlocks.BLAZE_BURNER) - .renderer(() -> BlazeBurnerRenderer::new) - .register(); + .tileEntity("blaze_heater", BlazeBurnerTileEntity::new) + .validBlocks(AllBlocks.BLAZE_BURNER) + .renderer(() -> BlazeBurnerRenderer::new) + .register(); public static final TileEntityEntry MECHANICAL_CRAFTER = Create.registrate() - .tileEntity("mechanical_crafter", MechanicalCrafterTileEntity::new) - .validBlocks(AllBlocks.MECHANICAL_CRAFTER) - .renderer(() -> MechanicalCrafterRenderer::new) - .register(); + .tileEntity("mechanical_crafter", MechanicalCrafterTileEntity::new) + .validBlocks(AllBlocks.MECHANICAL_CRAFTER) + .renderer(() -> MechanicalCrafterRenderer::new) + .register(); public static final TileEntityEntry SEQUENCED_GEARSHIFT = Create.registrate() - .tileEntity("sequenced_gearshift", SequencedGearshiftTileEntity::new) - .validBlocks(AllBlocks.SEQUENCED_GEARSHIFT) - .renderer(() -> SplitShaftRenderer::new) - .register(); + .tileEntity("sequenced_gearshift", SequencedGearshiftTileEntity::new) + .validBlocks(AllBlocks.SEQUENCED_GEARSHIFT) + .renderer(() -> SplitShaftRenderer::new) + .register(); public static final TileEntityEntry ROTATION_SPEED_CONTROLLER = Create.registrate() - .tileEntity("rotation_speed_controller", SpeedControllerTileEntity::new) - .validBlocks(AllBlocks.ROTATION_SPEED_CONTROLLER) - .renderer(() -> SpeedControllerRenderer::new) - .register(); + .tileEntity("rotation_speed_controller", SpeedControllerTileEntity::new) + .validBlocks(AllBlocks.ROTATION_SPEED_CONTROLLER) + .renderer(() -> SpeedControllerRenderer::new) + .register(); public static final TileEntityEntry SPEEDOMETER = Create.registrate() - .tileEntity("speedometer", SpeedGaugeTileEntity::new) - .validBlocks(AllBlocks.SPEEDOMETER) - .renderer(() -> GaugeRenderer::speed) - .register(); + .tileEntity("speedometer", SpeedGaugeTileEntity::new) + .validBlocks(AllBlocks.SPEEDOMETER) + .renderer(() -> GaugeRenderer::speed) + .register(); public static final TileEntityEntry STRESSOMETER = Create.registrate() - .tileEntity("stressometer", StressGaugeTileEntity::new) - .validBlocks(AllBlocks.STRESSOMETER) - .renderer(() -> GaugeRenderer::stress) - .register(); + .tileEntity("stressometer", StressGaugeTileEntity::new) + .validBlocks(AllBlocks.STRESSOMETER) + .renderer(() -> GaugeRenderer::stress) + .register(); public static final TileEntityEntry ANALOG_LEVER = Create.registrate() - .tileEntity("analog_lever", AnalogLeverTileEntity::new) - .validBlocks(AllBlocks.ANALOG_LEVER) - .renderer(() -> AnalogLeverRenderer::new) - .register(); + .tileEntity("analog_lever", AnalogLeverTileEntity::new) + .validBlocks(AllBlocks.ANALOG_LEVER) + .renderer(() -> AnalogLeverRenderer::new) + .register(); public static final TileEntityEntry CART_ASSEMBLER = Create.registrate() - .tileEntity("cart_assembler", CartAssemblerTileEntity::new) - .validBlocks(AllBlocks.CART_ASSEMBLER) - //.renderer(() -> renderer) - .register(); + .tileEntity("cart_assembler", CartAssemblerTileEntity::new) + .validBlocks(AllBlocks.CART_ASSEMBLER) + // .renderer(() -> renderer) + .register(); // Logistics public static final TileEntityEntry REDSTONE_LINK = Create.registrate() - .tileEntity("redstone_link", RedstoneLinkTileEntity::new) - .validBlocks(AllBlocks.REDSTONE_LINK) - .renderer(() -> SmartTileEntityRenderer::new) - .register(); + .tileEntity("redstone_link", RedstoneLinkTileEntity::new) + .validBlocks(AllBlocks.REDSTONE_LINK) + .renderer(() -> SmartTileEntityRenderer::new) + .register(); public static final TileEntityEntry NIXIE_TUBE = Create.registrate() - .tileEntity("nixie_tube", NixieTubeTileEntity::new) - .validBlocks(AllBlocks.NIXIE_TUBE) - .renderer(() -> NixieTubeRenderer::new) - .register(); + .tileEntity("nixie_tube", NixieTubeTileEntity::new) + .validBlocks(AllBlocks.NIXIE_TUBE) + .renderer(() -> NixieTubeRenderer::new) + .register(); public static final TileEntityEntry STOCKPILE_SWITCH = Create.registrate() - .tileEntity("stockpile_switch", StockpileSwitchTileEntity::new) - .validBlocks(AllBlocks.STOCKPILE_SWITCH) - .renderer(() -> SmartTileEntityRenderer::new) - .register(); + .tileEntity("stockpile_switch", StockpileSwitchTileEntity::new) + .validBlocks(AllBlocks.STOCKPILE_SWITCH) + .renderer(() -> SmartTileEntityRenderer::new) + .register(); public static final TileEntityEntry ADJUSTABLE_CRATE = Create.registrate() - .tileEntity("adjustable_crate", AdjustableCrateTileEntity::new) - .validBlocks(AllBlocks.ADJUSTABLE_CRATE) - //.renderer(() -> renderer) - .register(); + .tileEntity("adjustable_crate", AdjustableCrateTileEntity::new) + .validBlocks(AllBlocks.ADJUSTABLE_CRATE) + // .renderer(() -> renderer) + .register(); public static final TileEntityEntry CREATIVE_CRATE = Create.registrate() - .tileEntity("creative_crate", CreativeCrateTileEntity::new) - .validBlocks(AllBlocks.CREATIVE_CRATE) - .renderer(() -> SmartTileEntityRenderer::new) - .register(); + .tileEntity("creative_crate", CreativeCrateTileEntity::new) + .validBlocks(AllBlocks.CREATIVE_CRATE) + .renderer(() -> SmartTileEntityRenderer::new) + .register(); public static final TileEntityEntry DEPOT = Create.registrate() - .tileEntity("depot", DepotTileEntity::new) - .validBlocks(AllBlocks.DEPOT) - .renderer(() -> DepotRenderer::new) - .register(); + .tileEntity("depot", DepotTileEntity::new) + .validBlocks(AllBlocks.DEPOT) + .renderer(() -> DepotRenderer::new) + .register(); public static final TileEntityEntry FUNNEL = Create.registrate() - .tileEntity("funnel", FunnelTileEntity::new) - .validBlocks(AllBlocks.BRASS_FUNNEL, AllBlocks.BRASS_BELT_FUNNEL, AllBlocks.ANDESITE_FUNNEL, AllBlocks.ANDESITE_BELT_FUNNEL) - .renderer(() -> FunnelRenderer::new) - .register(); + .tileEntity("funnel", FunnelTileEntity::new) + .validBlocks(AllBlocks.BRASS_FUNNEL, AllBlocks.BRASS_BELT_FUNNEL, AllBlocks.ANDESITE_FUNNEL, + AllBlocks.ANDESITE_BELT_FUNNEL) + .renderer(() -> FunnelRenderer::new) + .register(); public static final TileEntityEntry CONTENT_OBSERVER = Create.registrate() - .tileEntity("content_observer", ContentObserverTileEntity::new) - .validBlocks(AllBlocks.CONTENT_OBSERVER) - .renderer(() -> SmartTileEntityRenderer::new) - .register(); + .tileEntity("content_observer", ContentObserverTileEntity::new) + .validBlocks(AllBlocks.CONTENT_OBSERVER) + .renderer(() -> SmartTileEntityRenderer::new) + .register(); public static final TileEntityEntry ADJUSTABLE_REPEATER = Create.registrate() - .tileEntity("adjustable_repeater", AdjustableRepeaterTileEntity::new) - .validBlocks(AllBlocks.ADJUSTABLE_REPEATER) - .renderer(() -> AdjustableRepeaterRenderer::new) - .register(); + .tileEntity("adjustable_repeater", AdjustableRepeaterTileEntity::new) + .validBlocks(AllBlocks.ADJUSTABLE_REPEATER) + .renderer(() -> AdjustableRepeaterRenderer::new) + .register(); - public static final TileEntityEntry ADJUSTABLE_PULSE_REPEATER = Create.registrate() + public static final TileEntityEntry ADJUSTABLE_PULSE_REPEATER = + Create.registrate() .tileEntity("adjustable_pulse_repeater", AdjustablePulseRepeaterTileEntity::new) .validBlocks(AllBlocks.ADJUSTABLE_PULSE_REPEATER) .renderer(() -> AdjustableRepeaterRenderer::new) .register(); - public static void register() { - } + public static void register() {} } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceBlock.java index a992df339..d4795c41b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceBlock.java @@ -1,19 +1,20 @@ package com.simibubi.create.content.contraptions.components.actors; +import javax.annotation.ParametersAreNonnullByDefault; + import com.simibubi.create.AllShapes; +import com.simibubi.create.AllTileEntities; import com.simibubi.create.foundation.block.ProperDirectionalBlock; +import mcp.MethodsReturnNonnullByDefault; import net.minecraft.block.BlockState; import net.minecraft.item.BlockItemUseContext; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; - -import javax.annotation.ParametersAreNonnullByDefault; -import mcp.MethodsReturnNonnullByDefault; - @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class PortableStorageInterfaceBlock extends ProperDirectionalBlock { @@ -21,6 +22,16 @@ public class PortableStorageInterfaceBlock extends ProperDirectionalBlock { public PortableStorageInterfaceBlock(Properties p_i48415_1_) { super(p_i48415_1_); } + + @Override + public boolean hasTileEntity(BlockState state) { + return true; + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.PORTABLE_STORAGE_INTERFACE.create(); + } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceMovement.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceMovement.java new file mode 100644 index 000000000..6ceea2f44 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceMovement.java @@ -0,0 +1,167 @@ +package com.simibubi.create.content.contraptions.components.actors; + +import java.util.function.Predicate; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.item.ItemHelper; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.inventory.SingleTargetAutoExtractingBehaviour; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.block.BlockState; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTUtil; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.ItemHandlerHelper; + +public class PortableStorageInterfaceMovement extends MovementBehaviour { + + private static final String _exporting_ = "Exporting"; + private static final String _delay_ = "Delay"; + private static final String _workingPos_ = "WorkingPos"; + + @Override + public Vec3d getActiveAreaOffset(MovementContext context) { + return new Vec3d(context.state.get(PortableStorageInterfaceBlock.FACING) + .getDirectionVec()).scale(.85f); + } + + @Override + public void visitNewPosition(MovementContext context, BlockPos pos) { + Direction currentFacing = getCurrentFacing(context); + PortableStorageInterfaceTileEntity psi = + getValidStationaryInterface(context.world, pos, currentFacing.getAxis()); + if (psi == null) + return; + if (psi.isTransferring()) + return; + context.data.put(_workingPos_, NBTUtil.writeBlockPos(pos)); + context.stall = true; + } + + @Override + public void tick(MovementContext context) { + if (!context.data.contains(_workingPos_)) + return; + if (context.world.isRemote) + return; + + BlockPos pos = NBTUtil.readBlockPos(context.data.getCompound(_workingPos_)); + PortableStorageInterfaceTileEntity stationaryInterface = + getValidStationaryInterface(context.world, pos, getCurrentFacing(context).getAxis()); + if (stationaryInterface == null) { + reset(context); + return; + } + + int nextExtract = context.data.getInt(_delay_); + if (nextExtract > 0) { + nextExtract--; + context.data.putInt(_delay_, nextExtract); + return; + } + + boolean extract = context.data.getBoolean(_exporting_); + boolean success = false; + IItemHandlerModifiable inv = context.contraption.inventory; + SingleTargetAutoExtractingBehaviour extracting = + TileEntityBehaviour.get(stationaryInterface, SingleTargetAutoExtractingBehaviour.TYPE); + FilteringBehaviour filtering = TileEntityBehaviour.get(stationaryInterface, FilteringBehaviour.TYPE); + + if (extract) { + // Export from Contraption + Predicate test = extracting.getFilterTest(); + int exactAmount = extracting.getAmountFromFilter(); + ItemStack itemExtracted = ItemStack.EMPTY; + if (exactAmount != -1) + itemExtracted = ItemHelper.extract(inv, test, exactAmount, false); + else + itemExtracted = ItemHelper.extract(inv, test, stationaryInterface::amountToExtract, false); + + if (!itemExtracted.isEmpty()) { + stationaryInterface.onExtract(itemExtracted); + success = exactAmount == -1; + } + + } else { + // Import to Contraption + if (extracting != null) { + extracting.setSynchronized(false); + extracting.withAdditionalFilter(stack -> { + if (filtering.anyAmount()) + return true; + return ItemHandlerHelper.insertItemStacked(inv, stack, true) + .isEmpty(); + }); + + extracting.withAmountThreshold(stack -> { + ItemStack tester = stack.copy(); + tester.setCount(tester.getMaxStackSize()); + return stack.getCount() - ItemHandlerHelper.insertItemStacked(inv, stack, true) + .getCount(); + }); + + extracting.setCallback(stack -> { + ItemHandlerHelper.insertItemStacked(inv, stack, false); + }); + + success = extracting.extract() && filtering.anyAmount(); + extracting.setSynchronized(true); + stationaryInterface.applyFilteringCallbacks(); + extracting.setCallback(stationaryInterface::onExtract); + } + } + + if (!success) { + reset(context); + return; + } + + context.data.putInt(_delay_, AllConfigs.SERVER.logistics.defaultExtractionTimer.get()); + } + + @Override + public void stopMoving(MovementContext context) { + reset(context); + } + + public void reset(MovementContext context) { + context.data.remove(_workingPos_); + context.data.remove(_delay_); + context.data.remove(_exporting_); + context.stall = false; + } + + private PortableStorageInterfaceTileEntity getValidStationaryInterface(World world, BlockPos pos, Axis validAxis) { + TileEntity te = world.getTileEntity(pos); + if (!(te instanceof PortableStorageInterfaceTileEntity)) + return null; + BlockState blockState = world.getBlockState(pos); + if (!AllBlocks.PORTABLE_STORAGE_INTERFACE.has(blockState)) + return null; + if (blockState.get(PortableStorageInterfaceBlock.FACING) + .getAxis() != validAxis) + return null; + if (world.isBlockPowered(pos)) + return null; + return (PortableStorageInterfaceTileEntity) te; + } + + private Direction getCurrentFacing(MovementContext context) { + Vec3d directionVec = new Vec3d(context.state.get(PortableStorageInterfaceBlock.FACING) + .getDirectionVec()); + directionVec = VecHelper.rotate(directionVec, context.rotation.x, context.rotation.y, context.rotation.z); + return Direction.getFacingFromVector(directionVec.x, directionVec.y, directionVec.z); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java new file mode 100644 index 000000000..7d57fb692 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java @@ -0,0 +1,64 @@ +package com.simibubi.create.content.contraptions.components.actors; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.MatrixStacker; +import com.simibubi.create.foundation.utility.SuperByteBuffer; + +import net.minecraft.block.BlockState; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.util.Direction; +import net.minecraft.util.math.MathHelper; + +public class PortableStorageInterfaceRenderer extends SafeTileEntityRenderer { + + public PortableStorageInterfaceRenderer(TileEntityRendererDispatcher dispatcher) { + super(dispatcher); + } + + @Override + protected void renderSafe(PortableStorageInterfaceTileEntity te, float partialTicks, MatrixStack ms, + IRenderTypeBuffer buffer, int light, int overlay) { + + BlockState blockState = te.getBlockState(); + SuperByteBuffer middle = AllBlockPartials.PORTABLE_STORAGE_INTERFACE_MIDDLE.renderOn(blockState); + SuperByteBuffer top = AllBlockPartials.PORTABLE_STORAGE_INTERFACE_TOP.renderOn(blockState); + IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); + + ms.push(); + + Direction facing = blockState.get(PortableStorageInterfaceBlock.FACING); + MatrixStacker.of(ms) + .centre() + .rotateY(AngleHelper.horizontalAngle(facing)) + .rotateX(facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90) + .unCentre(); + + float progress = (float) ((AnimationTickHolder.getRenderTick() * .25f) % (Math.PI * 2)); + float bounce = (MathHelper.sin(progress) + 1) / 4f; + + if (bounce > 7/16f) { + middle = AllBlockPartials.PORTABLE_STORAGE_INTERFACE_MIDDLE_POWERED.renderOn(blockState); + } + + + ms.translate(0, bounce, 0); + + ms.push(); + ms.translate(0, 6/16f, 0); + middle.renderInto(ms, vb); + ms.pop(); + + ms.translate(0, bounce, 0); + top.renderInto(ms, vb); + + ms.pop(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java new file mode 100644 index 000000000..3e27dd173 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java @@ -0,0 +1,56 @@ +package com.simibubi.create.content.contraptions.components.actors; + +import java.util.List; + +import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; +import com.simibubi.create.foundation.tileEntity.SyncedTileEntity; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; + +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.wrapper.CombinedInvWrapper; + +public class PortableStorageInterfaceTileEntity extends SmartTileEntity { + + protected int transferTimeout; + protected LazyOptional capability; + + public PortableStorageInterfaceTileEntity(TileEntityType tileEntityTypeIn) { + super(tileEntityTypeIn); + transferTimeout = 0; + capability = LazyOptional.empty(); + } + + public void startTransferringTo(Contraption contraption) { + CombinedInvWrapper inventory = contraption.inventory; + capability.invalidate(); + capability = LazyOptional.of(() -> inventory); + + } + + @Override + public void tick() { + super.tick(); + } + + public boolean isTransferring() { + return transferTimeout != 0; + } + + @Override + public LazyOptional getCapability(Capability cap, Direction side) { + return super.getCapability(cap, side); + } + + public void resetTimer() { + + } + + @Override + public void addBehaviours(List behaviours) {} + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/StorageInterfaceMovement.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/StorageInterfaceMovement.java deleted file mode 100644 index c6442a00f..000000000 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/StorageInterfaceMovement.java +++ /dev/null @@ -1,157 +0,0 @@ -//package com.simibubi.create.content.contraptions.components.actors; -// -//import java.util.function.Predicate; -// -//import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; -//import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; -//import com.simibubi.create.content.logistics.block.transposer.TransposerBlock; -//import com.simibubi.create.content.logistics.block.transposer.TransposerTileEntity; -//import com.simibubi.create.foundation.config.AllConfigs; -//import com.simibubi.create.foundation.item.ItemHelper; -//import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -//import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; -//import com.simibubi.create.foundation.tileEntity.behaviour.inventory.SingleTargetAutoExtractingBehaviour; -//import com.simibubi.create.foundation.utility.VecHelper; -// -//import net.minecraft.item.ItemStack; -//import net.minecraft.nbt.NBTUtil; -//import net.minecraft.tileentity.TileEntity; -//import net.minecraft.util.Direction; -//import net.minecraft.util.Direction.Axis; -//import net.minecraft.util.math.BlockPos; -//import net.minecraft.util.math.Vec3d; -//import net.minecraft.world.World; -//import net.minecraftforge.items.IItemHandlerModifiable; -//import net.minecraftforge.items.ItemHandlerHelper; -// -//public class StorageInterfaceMovement extends MovementBehaviour { -// -// private static final String _exporting_ = "Exporting"; -// private static final String _delay_ = "Delay"; -// private static final String _workingPos_ = "WorkingPos"; -// -// @Override -// public Vec3d getActiveAreaOffset(MovementContext context) { -// return new Vec3d(context.state.get(PortableStorageInterfaceBlock.FACING).getDirectionVec()).scale(.85f); -// } -// -// @Override -// public void visitNewPosition(MovementContext context, BlockPos pos) { -// Direction currentFacing = getCurrentFacing(context); -// TransposerTileEntity transposer = getValidTransposer(context.world, pos, currentFacing.getAxis()); -// if (transposer == null) -// return; -// context.data.put(_workingPos_, NBTUtil.writeBlockPos(pos)); -// context.data.putBoolean(_exporting_, -// TransposerBlock.getBlockFacing(transposer.getBlockState()) != currentFacing); -// context.stall = true; -// } -// -// @Override -// public void tick(MovementContext context) { -// if (!context.data.contains(_workingPos_)) -// return; -// if (context.world.isRemote) -// return; -// -// BlockPos pos = NBTUtil.readBlockPos(context.data.getCompound(_workingPos_)); -// TransposerTileEntity transposer = getValidTransposer(context.world, pos, getCurrentFacing(context).getAxis()); -// if (transposer == null) { -// reset(context); -// return; -// } -// -// int nextExtract = context.data.getInt(_delay_); -// if (nextExtract > 0) { -// nextExtract--; -// context.data.putInt(_delay_, nextExtract); -// return; -// } -// -// boolean extract = context.data.getBoolean(_exporting_); -// boolean success = false; -// IItemHandlerModifiable inv = context.contraption.inventory; -// SingleTargetAutoExtractingBehaviour extracting = -// TileEntityBehaviour.get(transposer, SingleTargetAutoExtractingBehaviour.TYPE); -// FilteringBehaviour filtering = TileEntityBehaviour.get(transposer, FilteringBehaviour.TYPE); -// -// if (extract) { -// // Export from Contraption -// Predicate test = extracting.getFilterTest(); -// int exactAmount = extracting.getAmountFromFilter(); -// ItemStack itemExtracted = ItemStack.EMPTY; -// if (exactAmount != -1) -// itemExtracted = ItemHelper.extract(inv, test, exactAmount, false); -// else -// itemExtracted = ItemHelper.extract(inv, test, transposer::amountToExtract, false); -// -// if (!itemExtracted.isEmpty()) { -// transposer.onExtract(itemExtracted); -// success = exactAmount == -1; -// } -// -// } else { -// // Import to Contraption -// if (extracting != null) { -// extracting.setSynchronized(false); -// extracting.withAdditionalFilter(stack -> { -// if (filtering.anyAmount()) -// return true; -// return ItemHandlerHelper.insertItemStacked(inv, stack, true).isEmpty(); -// }); -// -// extracting.withAmountThreshold(stack -> { -// ItemStack tester = stack.copy(); -// tester.setCount(tester.getMaxStackSize()); -// return stack.getCount() - ItemHandlerHelper.insertItemStacked(inv, stack, true).getCount(); -// }); -// -// extracting.setCallback(stack -> { -// ItemHandlerHelper.insertItemStacked(inv, stack, false); -// }); -// -// success = extracting.extract() && filtering.anyAmount(); -// extracting.setSynchronized(true); -// transposer.applyFilteringCallbacks(); -// extracting.setCallback(transposer::onExtract); -// } -// } -// -// if (!success) { -// reset(context); -// return; -// } -// -// context.data.putInt(_delay_, AllConfigs.SERVER.logistics.extractorDelay.get()); -// } -// -// @Override -// public void stopMoving(MovementContext context) { -// reset(context); -// } -// -// public void reset(MovementContext context) { -// context.data.remove(_workingPos_); -// context.data.remove(_delay_); -// context.data.remove(_exporting_); -// context.stall = false; -// } -// -// private TransposerTileEntity getValidTransposer(World world, BlockPos pos, Axis validAxis) { -// TileEntity te = world.getTileEntity(pos); -// if (!(te instanceof TransposerTileEntity)) -// return null; -// if (TransposerBlock.getBlockFacing(world.getBlockState(pos)).getAxis() != validAxis) -// return null; -// if (world.isBlockPowered(pos)) -// return null; -// return (TransposerTileEntity) te; -// } -// -// private Direction getCurrentFacing(MovementContext context) { -// Vec3d directionVec = new Vec3d(context.state.get(PortableStorageInterfaceBlock.FACING).getDirectionVec()); -// directionVec = VecHelper.rotate(directionVec, context.rotation.x, context.rotation.y, context.rotation.z); -// return Direction.getFacingFromVector(directionVec.x, directionVec.y, directionVec.z); -// } -// -//} diff --git a/src/main/java/com/simibubi/create/foundation/config/CLogistics.java b/src/main/java/com/simibubi/create/foundation/config/CLogistics.java index a784769cc..4fa8cc416 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CLogistics.java +++ b/src/main/java/com/simibubi/create/foundation/config/CLogistics.java @@ -4,6 +4,7 @@ public class CLogistics extends ConfigBase { public ConfigInt defaultExtractionLimit = i(64, 1, 64, "defaultExtractionLimit", Comments.defaultExtractionLimit); public ConfigInt defaultExtractionTimer = i(8, 1, "defaultExtractionTimer", Comments.defaultExtractionTimer); + public ConfigInt psiTimeout = i(20, 1, "psiTimeout", Comments.psiTimeout); public ConfigInt mechanicalArmRange = i(5, 1, "mechanicalArmRange", Comments.mechanicalArmRange); public ConfigInt linkRange = i(128, 1, "linkRange", Comments.linkRange); @@ -18,6 +19,7 @@ public class CLogistics extends ConfigBase { static String defaultExtractionTimer = "The amount of ticks a funnel waits between item transferrals, when it is not re-activated by redstone."; static String linkRange = "Maximum possible range in blocks of redstone link connections."; + static String psiTimeout = "The amount of ticks a portable storage interface waits for transfers until letting contraptions move along."; static String mechanicalArmRange = "Maximum distance in blocks a Mechanical Arm can reach across."; } diff --git a/src/main/resources/assets/create/models/block/portable_storage_interface/block.json b/src/main/resources/assets/create/models/block/portable_storage_interface/block.json new file mode 100644 index 000000000..79251958e --- /dev/null +++ b/src/main/resources/assets/create/models/block/portable_storage_interface/block.json @@ -0,0 +1,63 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/portable_storage_interface", + "1": "create:block/brass_casing", + "particle": "create:block/brass_casing" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 12, 16], + "faces": { + "north": {"uv": [0, 10, 8, 16], "texture": "#0"}, + "east": {"uv": [0, 10, 8, 16], "texture": "#0"}, + "south": {"uv": [0, 10, 8, 16], "texture": "#0"}, + "west": {"uv": [0, 10, 8, 16], "texture": "#0"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#1"} + } + }, + { + "from": [0, 12, 1.9], + "to": [2, 14.1, 14.1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 20, 10]}, + "faces": { + "north": {"uv": [7, 10, 8, 11], "texture": "#0"}, + "south": {"uv": [0, 10, 1, 11], "texture": "#0"}, + "west": {"uv": [1, 9, 7, 10], "texture": "#0"}, + "up": {"uv": [0, 2, 2, 14], "texture": "#1"} + } + }, + { + "from": [14, 12, 2], + "to": [16, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 20, 6]}, + "faces": { + "north": {"uv": [0, 10, 1, 11], "texture": "#0"}, + "east": {"uv": [1, 9, 7, 10], "texture": "#0"}, + "south": {"uv": [7, 10, 8, 11], "texture": "#0"}, + "up": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [2, 12, 0], + "to": [14, 14, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 20, 8]}, + "faces": { + "north": {"uv": [1, 9, 7, 10], "texture": "#0"}, + "east": {"uv": [0, 10, 8, 11], "texture": "#0"}, + "south": {"uv": [1, 9, 7, 10], "texture": "#0"}, + "west": {"uv": [0, 10, 8, 11], "texture": "#0"}, + "up": {"uv": [2, 0, 14, 16], "texture": "#1"} + } + } + ], + "groups": [ + { + "name": "Base", + "origin": [10, 20, 8], + "children": [0, 1, 2, 3] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/portable_storage_interface/block_middle.json b/src/main/resources/assets/create/models/block/portable_storage_interface/block_middle.json new file mode 100644 index 000000000..33d29a3ef --- /dev/null +++ b/src/main/resources/assets/create/models/block/portable_storage_interface/block_middle.json @@ -0,0 +1,28 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/portable_storage_interface", + "particle": "create:block/portable_storage_interface" + }, + "elements": [ + { + "from": [2, 0, 2], + "to": [14, 9, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 8, 10]}, + "faces": { + "north": {"uv": [1, 3.5, 7, 8], "texture": "#0"}, + "east": {"uv": [1, 3.5, 7, 8], "texture": "#0"}, + "south": {"uv": [1, 3.5, 7, 8], "texture": "#0"}, + "west": {"uv": [1, 3.5, 7, 8], "texture": "#0"}, + "up": {"uv": [1.5, 3.5, 2, 4], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "Middle", + "origin": [10, 22, 10], + "children": [0] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/portable_storage_interface/block_middle_powered.json b/src/main/resources/assets/create/models/block/portable_storage_interface/block_middle_powered.json new file mode 100644 index 000000000..c64e3e1f3 --- /dev/null +++ b/src/main/resources/assets/create/models/block/portable_storage_interface/block_middle_powered.json @@ -0,0 +1,28 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/portable_storage_interface", + "particle": "create:block/portable_storage_interface" + }, + "elements": [ + { + "from": [2, 0, 2], + "to": [14, 9, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 8, 10]}, + "faces": { + "north": {"uv": [9, 3.5, 15, 8], "texture": "#0"}, + "east": {"uv": [9, 3.5, 15, 8], "texture": "#0"}, + "south": {"uv": [9, 3.5, 15, 8], "texture": "#0"}, + "west": {"uv": [9, 3.5, 15, 8], "texture": "#0"}, + "up": {"uv": [1.5, 3.5, 2, 4], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "Middle", + "origin": [10, 22, 10], + "children": [0] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/portable_storage_interface/block_top.json b/src/main/resources/assets/create/models/block/portable_storage_interface/block_top.json new file mode 100644 index 000000000..88f35fcab --- /dev/null +++ b/src/main/resources/assets/create/models/block/portable_storage_interface/block_top.json @@ -0,0 +1,120 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/portable_storage_interface", + "particle": "create:block/portable_storage_interface" + }, + "elements": [ + { + "from": [3, 7, 3], + "to": [13, 14.1, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [11, 15, 11]}, + "faces": { + "north": {"uv": [1.5, 0, 6.5, 3.5], "texture": "#0"}, + "east": {"uv": [1.5, 0, 6.5, 3.5], "texture": "#0"}, + "south": {"uv": [1.5, 0, 6.5, 3.5], "texture": "#0"}, + "west": {"uv": [1.5, 0, 6.5, 3.5], "texture": "#0"} + } + }, + { + "from": [1, 14, 1], + "to": [15, 16, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 15, 8]}, + "faces": { + "north": {"uv": [8.5, 15, 15.5, 16], "texture": "#0"}, + "east": {"uv": [8.5, 15, 15.5, 16], "texture": "#0"}, + "south": {"uv": [8.5, 15, 15.5, 16], "texture": "#0"}, + "west": {"uv": [8.5, 15, 15.5, 16], "texture": "#0"}, + "up": {"uv": [8.5, 8, 15.5, 15], "texture": "#0"}, + "down": {"uv": [8.5, 8, 15.5, 15], "texture": "#0"} + } + }, + { + "from": [4, 13.1, 13], + "to": [6, 15.1, 14], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 14, 13]}, + "faces": { + "east": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "south": {"uv": [10, 15, 11, 16], "texture": "#0"}, + "west": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"} + } + }, + { + "from": [10, 13.1, 2], + "to": [12, 15.1, 3], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 14, 3]}, + "faces": { + "north": {"uv": [10, 15, 11, 16], "texture": "#0"}, + "east": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "west": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"} + } + }, + { + "from": [2, 13.1, 4], + "to": [3, 15.1, 6], + "rotation": {"angle": 45, "axis": "z", "origin": [3, 14, 8]}, + "faces": { + "north": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "south": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "west": {"uv": [10, 15, 11, 16], "texture": "#0"} + } + }, + { + "from": [13, 13.1, 10], + "to": [14, 15.1, 12], + "rotation": {"angle": -45, "axis": "z", "origin": [13, 14, 8]}, + "faces": { + "north": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "east": {"uv": [10, 15, 11, 16], "texture": "#0"}, + "south": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"} + } + }, + { + "from": [10, 13.1, 13], + "to": [12, 15.1, 14], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 14, 13]}, + "faces": { + "east": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "south": {"uv": [13, 15, 14, 16], "texture": "#0"}, + "west": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"} + } + }, + { + "from": [4, 13.1, 2], + "to": [6, 15.1, 3], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 14, 3]}, + "faces": { + "north": {"uv": [13, 15, 14, 16], "texture": "#0"}, + "east": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "west": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"} + } + }, + { + "from": [2, 13.1, 10], + "to": [3, 15.1, 12], + "rotation": {"angle": 45, "axis": "z", "origin": [3, 14, 8]}, + "faces": { + "north": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "south": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "west": {"uv": [13, 15, 14, 16], "texture": "#0"} + } + }, + { + "from": [13, 13.1, 4], + "to": [14, 15.1, 6], + "rotation": {"angle": -45, "axis": "z", "origin": [13, 14, 8]}, + "faces": { + "north": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"}, + "east": {"uv": [13, 15, 14, 16], "texture": "#0"}, + "south": {"uv": [7.5, 10, 8, 10.5], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "Top", + "origin": [10, 22, 10], + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/portable_storage_interface/brass_casing.png b/src/main/resources/assets/create/models/block/portable_storage_interface/brass_casing.png new file mode 100644 index 0000000000000000000000000000000000000000..fb657ce47b52fd3940f9f47a581da366d3023e64 GIT binary patch literal 432 zcmV;h0Z;ykP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGizW@LZzX3P}QzQTY0YynfK~y+TjZnc# z!$1(-q)BQLwJ9iAJxMPGDG2_C$6f{hKoAd}{Uv|Iga1%bA!#Amc9U4&=7mZ0AU=l2 z%8!ig~x}(aTt)}zy~u#LB26yw@^Mj z^sdZTp=(p`#PBQ*2co#0APcN=1ItYbqt86H%8k8&3(?Skn4Jn!k7BzF3{F#Q=g>iM zHz63lhE%=}o1q9sOS*kl}v zbmrNy6HQPzxNlKt&p=oWBKl*!O|?BdoW3nTHJBd&=V>uZ&JNn>PZYV6W!kyFzGxHw afl}Y;%erM$6Rz+80000 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/portable_storage_interface.png b/src/main/resources/assets/create/textures/block/portable_storage_interface.png new file mode 100644 index 0000000000000000000000000000000000000000..0e9ade6777821ca96b04a5b3c5572d9a36e90dae GIT binary patch literal 4142 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 literal 0 HcmV?d00001 From 2d6d360da4a968792106427d53c9dad56abeb338 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 24 Sep 2020 13:39:40 +0200 Subject: [PATCH 03/12] Workstation transfer, Part II - Intermediate changes, probably doesn't even compile --- .../fluids/actors/SpoutRenderer.java | 14 +- .../fluids/actors/SpoutTileEntity.java | 112 ++------ .../processing/BasinTileEntity.java | 43 +-- .../foundation/fluid/CombinedTankWrapper.java | 143 ++++++++++ .../tileEntity/behaviour/BehaviourType.java | 14 + .../fluid/SmartFluidTankBehaviour.java | 261 ++++++++++++++++++ 6 files changed, 473 insertions(+), 114 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/fluid/CombinedTankWrapper.java create mode 100644 src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutRenderer.java index a97ee37b3..5b15356fd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutRenderer.java @@ -3,9 +3,9 @@ package com.simibubi.create.content.contraptions.fluids.actors; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.fluid.FluidRenderer; +import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour.TankSegment; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.LerpedFloat; -import com.simibubi.create.foundation.utility.Pair; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; @@ -27,9 +27,13 @@ public class SpoutRenderer extends SafeTileEntityRenderer { protected void renderSafe(SpoutTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { - Pair fluid = te.getFluid(); - FluidStack fluidStack = fluid.getFirst(); - float level = fluid.getSecond() + SmartFluidTankBehaviour tank = te.tank; + if (tank == null) + return; + + TankSegment primaryTank = tank.getPrimaryTank(); + FluidStack fluidStack = primaryTank.getRenderedFluid(); + float level = primaryTank.getFluidLevel() .getValue(partialTicks); if (!fluidStack.isEmpty() && level != 0) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java index b723a4849..3933cae55 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java @@ -7,16 +7,13 @@ import java.util.ArrayList; import java.util.List; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; -import com.simibubi.create.foundation.fluid.SmartFluidTank; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; 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.ProcessingResult; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; -import com.simibubi.create.foundation.utility.LerpedFloat; -import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; -import com.simibubi.create.foundation.utility.Pair; +import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.item.ItemStack; @@ -32,58 +29,22 @@ import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; -import net.minecraftforge.fluids.capability.IFluidHandler; -import net.minecraftforge.fluids.capability.templates.FluidTank; - -// FIXME: Quite similar to FluidTankTileEntity, create a behaviour public class SpoutTileEntity extends SmartTileEntity { - protected FluidTank tank; - protected LazyOptional capability; - protected LerpedFloat fluidLevel; - protected FluidStack renderedFluid; - public static final int FILLING_TIME = 20; - protected int processingTicks; - - private static final int SYNC_RATE = 8; - protected int syncCooldown; - protected boolean queuedSync; - - protected boolean sendSplash; + protected BeltProcessingBehaviour beltProcessing; + protected int processingTicks; + protected boolean sendSplash; + + SmartFluidTankBehaviour tank; public SpoutTileEntity(TileEntityType tileEntityTypeIn) { super(tileEntityTypeIn); - tank = new SmartFluidTank(1000, this::onFluidStackChanged); - capability = LazyOptional.of(() -> tank); - fluidLevel = LerpedFloat.linear() - .startWithValue(0) - .chase(0, .25, Chaser.EXP); - renderedFluid = FluidStack.EMPTY; processingTicks = -1; } - protected void onFluidStackChanged(FluidStack newFluidStack) { - if (!hasWorld()) - return; - fluidLevel.chase(tank.getFluidAmount() / (float) tank.getCapacity(), .25, Chaser.EXP); - if (!world.isRemote) { - markDirty(); - sendData(); - } - } - - @Override - public void initialize() { - super.initialize(); - if (!world.isRemote) { - fluidLevel.forceNextSync(); - onFluidStackChanged(tank.getFluid()); - } - } - @Override public AxisAlignedBB getRenderBoundingBox() { return super.getRenderBoundingBox().expand(0, -2, 0); @@ -91,9 +52,13 @@ public class SpoutTileEntity extends SmartTileEntity { @Override public void addBehaviours(List behaviours) { + tank = SmartFluidTankBehaviour.single(this, 1000); + behaviours.add(tank); + beltProcessing = new BeltProcessingBehaviour(this).whenItemEnters(this::onItemReceived) .whileItemHeld(this::whenItemHeld); behaviours.add(beltProcessing); + } protected ProcessingResult onItemReceived(TransportedItemStack transported, @@ -102,7 +67,7 @@ public class SpoutTileEntity extends SmartTileEntity { return PASS; if (tank.isEmpty()) return HOLD; - if (FillingBySpout.getRequiredAmountForItem(world, transported.stack, tank.getFluid()) == -1) + if (FillingBySpout.getRequiredAmountForItem(world, transported.stack, getCurrentFluidInTank()) == -1) return PASS; return HOLD; } @@ -115,7 +80,7 @@ public class SpoutTileEntity extends SmartTileEntity { return PASS; if (tank.isEmpty()) return HOLD; - FluidStack fluid = tank.getFluid(); + FluidStack fluid = getCurrentFluidInTank(); int requiredAmountForItem = FillingBySpout.getRequiredAmountForItem(world, transported.stack, fluid.copy()); if (requiredAmountForItem == -1) return PASS; @@ -142,24 +107,21 @@ public class SpoutTileEntity extends SmartTileEntity { handler.handleProcessingOnItem(transported, TransportedResult.convertToAndLeaveHeld(outList, held)); } - tank.setFluid(fluid); + tank.getPrimaryHandler().setFluid(fluid); sendSplash = true; markDirty(); sendData(); return PASS; } - @Override - public void remove() { - capability.invalidate(); - super.remove(); + private FluidStack getCurrentFluidInTank() { + return tank.getPrimaryHandler().getFluid(); } @Override protected void write(CompoundNBT compound, boolean clientPacket) { super.write(compound, clientPacket); - compound.put("TankContent", tank.writeToNBT(new CompoundNBT())); - compound.put("Level", fluidLevel.writeNBT()); + compound.putInt("ProcessingTicks", processingTicks); if (sendSplash && clientPacket) { compound.putBoolean("Splash", true); @@ -170,61 +132,27 @@ public class SpoutTileEntity extends SmartTileEntity { @Override protected void read(CompoundNBT compound, boolean clientPacket) { super.read(compound, clientPacket); - tank.readFromNBT(compound.getCompound("TankContent")); - fluidLevel.readNBT(compound.getCompound("Level"), clientPacket); processingTicks = compound.getInt("ProcessingTicks"); - if (!tank.getFluid() - .isEmpty()) - renderedFluid = tank.getFluid(); - if (!clientPacket) return; if (compound.contains("Splash")) - spawnSplash(renderedFluid); + spawnSplash(tank.getPrimaryTank().getRenderedFluid()); } @Override public LazyOptional getCapability(Capability cap, Direction side) { if (cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY && side != Direction.DOWN) - return capability.cast(); + return tank.getCapability().cast(); return super.getCapability(cap, side); } - public Pair getFluid() { - return Pair.of(renderedFluid, fluidLevel); - } - - public void sendDataImmediately() { - syncCooldown = 0; - queuedSync = false; - sendData(); - } - - @Override + public void tick() { super.tick(); if (processingTicks >= 0) processingTicks--; if (processingTicks >= 8 && world.isRemote) - spawnProcessingParticles(renderedFluid); - if (syncCooldown > 0) { - syncCooldown--; - if (syncCooldown == 0 && queuedSync) - sendData(); - } - if (fluidLevel != null) - fluidLevel.tickChaser(); - } - - @Override - public void sendData() { - if (syncCooldown > 0) { - queuedSync = true; - return; - } - super.sendData(); - queuedSync = false; - syncCooldown = SYNC_RATE; + spawnProcessingParticles(tank.getPrimaryTank().getRenderedFluid()); } protected void spawnProcessingParticles(FluidStack fluid) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java index 5dcbc472c..48565aa16 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java @@ -5,18 +5,18 @@ import java.util.Optional; import javax.annotation.Nonnull; -import com.simibubi.create.content.contraptions.fluids.CombinedFluidHandler; +import com.simibubi.create.foundation.fluid.CombinedTankWrapper; import com.simibubi.create.foundation.item.SmartInventory; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.ListNBT; import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; @@ -27,6 +27,7 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.wrapper.CombinedInvWrapper; @@ -34,20 +35,25 @@ import net.minecraftforge.items.wrapper.CombinedInvWrapper; public class BasinTileEntity extends SmartTileEntity implements ITickableTileEntity { public BasinInputInventory inputInventory; + public SmartFluidTankBehaviour inputTank; + protected SmartInventory outputInventory; + protected SmartFluidTankBehaviour outputTank; + protected LazyOptional itemCapability; - protected LazyOptional fluidCapability; - - private boolean contentsChanged; + protected LazyOptional fluidCapability; + private FilteringBehaviour filtering; + private boolean contentsChanged; public BasinTileEntity(TileEntityType type) { super(type); inputInventory = new BasinInputInventory(9, this); - inputInventory.withMaxStackSize(8).forbidExtraction(); + inputInventory.withMaxStackSize(8) + .forbidExtraction(); outputInventory = new SmartInventory(9, this).forbidInsertion(); itemCapability = LazyOptional.of(() -> new CombinedInvWrapper(inputInventory, outputInventory)); - fluidCapability = LazyOptional.of(() -> new CombinedFluidHandler(9, 1000)); + contentsChanged = true; } @@ -58,6 +64,16 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt .withCallback(newFilter -> contentsChanged = true) .forRecipes(); behaviours.add(filtering); + + inputTank = new SmartFluidTankBehaviour(SmartFluidTankBehaviour.INPUT, this, 2, 1000, true).forbidExtraction(); + outputTank = new SmartFluidTankBehaviour(SmartFluidTankBehaviour.OUTPUT, this, 2, 1000, true).forbidInsertion(); + behaviours.add(inputTank); + behaviours.add(outputTank); + fluidCapability = LazyOptional.of(() -> { + LazyOptional inputCap = inputTank.getCapability(); + LazyOptional outputCap = outputTank.getCapability(); + return new CombinedTankWrapper(inputCap.orElse(null), outputCap.orElse(null)); + }); } @Override @@ -65,9 +81,6 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt super.read(compound, clientPacket); inputInventory.deserializeNBT(compound.getCompound("InputItems")); outputInventory.deserializeNBT(compound.getCompound("OutputItems")); - if (compound.contains("fluids")) - fluidCapability - .ifPresent(combinedFluidHandler -> combinedFluidHandler.readFromNBT(compound.getList("fluids", 10))); } @Override @@ -75,10 +88,6 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt super.write(compound, clientPacket); compound.put("InputItems", inputInventory.serializeNBT()); compound.put("OutputItems", outputInventory.serializeNBT()); - fluidCapability.ifPresent(combinedFuidHandler -> { - ListNBT nbt = combinedFuidHandler.getListNBT(); - compound.put("fluids", nbt); - }); } public void onEmptied() { @@ -123,15 +132,15 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt public FilteringBehaviour getFilter() { return filtering; } - + public void notifyChangeOfContents() { contentsChanged = true; } - + public SmartInventory getInputInventory() { return inputInventory; } - + public SmartInventory getOutputInventory() { return outputInventory; } diff --git a/src/main/java/com/simibubi/create/foundation/fluid/CombinedTankWrapper.java b/src/main/java/com/simibubi/create/foundation/fluid/CombinedTankWrapper.java new file mode 100644 index 000000000..2a5bb5661 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/fluid/CombinedTankWrapper.java @@ -0,0 +1,143 @@ +package com.simibubi.create.foundation.fluid; + +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.items.wrapper.EmptyHandler; + +/** + * Combines multiple IFluidHandlers into one interface (See CombinedInvWrapper + * for items) + */ +public class CombinedTankWrapper implements IFluidHandler { + + protected final IFluidHandler[] itemHandler; + protected final int[] baseIndex; + protected final int tankCount; + protected boolean enforceVariety; + + public CombinedTankWrapper(IFluidHandler... fluidHandlers) { + this.itemHandler = fluidHandlers; + this.baseIndex = new int[fluidHandlers.length]; + int index = 0; + for (int i = 0; i < fluidHandlers.length; i++) { + index += fluidHandlers[i].getTanks(); + baseIndex[i] = index; + } + this.tankCount = index; + } + + public CombinedTankWrapper enforceVariety() { + enforceVariety = true; + return this; + } + + @Override + public int getTanks() { + return tankCount; + } + + @Override + public FluidStack getFluidInTank(int tank) { + int index = getIndexForSlot(tank); + IFluidHandler handler = getHandlerFromIndex(index); + tank = getSlotFromIndex(tank, index); + return handler.getFluidInTank(tank); + } + + @Override + public int getTankCapacity(int tank) { + int index = getIndexForSlot(tank); + IFluidHandler handler = getHandlerFromIndex(index); + int localSlot = getSlotFromIndex(tank, index); + return handler.getTankCapacity(localSlot); + } + + @Override + public boolean isFluidValid(int tank, FluidStack stack) { + int index = getIndexForSlot(tank); + IFluidHandler handler = getHandlerFromIndex(index); + int localSlot = getSlotFromIndex(tank, index); + return handler.isFluidValid(localSlot, stack); + } + + @Override + public int fill(FluidStack resource, FluidAction action) { + int filled = 0; + resource = resource.copy(); + + for (IFluidHandler iFluidHandler : itemHandler) { + boolean skipRest = false; + int filledIntoCurrent = iFluidHandler.fill(resource, action); + + for (int i = 0; i < iFluidHandler.getTanks(); i++) + if (iFluidHandler.getFluidInTank(i).isFluidEqual(resource) && enforceVariety) + skipRest = true; + + resource.shrink(filledIntoCurrent); + filled += filledIntoCurrent; + + if (resource.isEmpty() || skipRest) + break; + } + + return filled; + } + + @Override + public FluidStack drain(FluidStack resource, FluidAction action) { + FluidStack drained = FluidStack.EMPTY; + resource = resource.copy(); + + for (IFluidHandler iFluidHandler : itemHandler) { + FluidStack drainedFromCurrent = iFluidHandler.drain(resource, action); + int amount = drainedFromCurrent.getAmount(); + resource.shrink(amount); + + if (!drainedFromCurrent.isEmpty()) + drained = new FluidStack(drainedFromCurrent.getFluid(), amount + drained.getAmount()); + if (resource.isEmpty()) + break; + } + + return drained; + } + + @Override + public FluidStack drain(int maxDrain, FluidAction action) { + FluidStack drained = FluidStack.EMPTY; + + for (IFluidHandler iFluidHandler : itemHandler) { + FluidStack drainedFromCurrent = iFluidHandler.drain(maxDrain, action); + int amount = drainedFromCurrent.getAmount(); + maxDrain -= amount; + + if (!drainedFromCurrent.isEmpty()) + drained = new FluidStack(drainedFromCurrent.getFluid(), amount + drained.getAmount()); + if (maxDrain == 0) + break; + } + + return drained; + } + + protected int getIndexForSlot(int slot) { + if (slot < 0) + return -1; + for (int i = 0; i < baseIndex.length; i++) + if (slot - baseIndex[i] < 0) + return i; + return -1; + } + + protected IFluidHandler getHandlerFromIndex(int index) { + if (index < 0 || index >= itemHandler.length) + return (IFluidHandler) EmptyHandler.INSTANCE; + return itemHandler[index]; + } + + protected int getSlotFromIndex(int slot, int index) { + if (index <= 0 || index >= baseIndex.length) + return slot; + return slot - baseIndex[index - 1]; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/BehaviourType.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/BehaviourType.java index 0942955f5..8b3f90827 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/BehaviourType.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/BehaviourType.java @@ -4,4 +4,18 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; public class BehaviourType { + private String name; + + public BehaviourType(String name) { + this.name = name; + } + + public BehaviourType() { + this(""); + } + + public String getName() { + return name; + } + } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java new file mode 100644 index 000000000..971f7fd1e --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java @@ -0,0 +1,261 @@ +package com.simibubi.create.foundation.tileEntity.behaviour.fluid; + +import java.util.function.Consumer; + +import org.apache.commons.lang3.mutable.MutableInt; + +import com.simibubi.create.foundation.fluid.CombinedTankWrapper; +import com.simibubi.create.foundation.fluid.SmartFluidTank; +import com.simibubi.create.foundation.item.SmartInventory; +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; +import com.simibubi.create.foundation.utility.LerpedFloat; +import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; +import com.simibubi.create.foundation.utility.NBTHelper; + +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.ListNBT; +import net.minecraftforge.common.util.Constants.NBT; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; + +public class SmartFluidTankBehaviour extends TileEntityBehaviour { + + public static BehaviourType + + TYPE = new BehaviourType<>(), INPUT = new BehaviourType<>("Input"), OUTPUT = new BehaviourType<>("Output"); + + private static final int SYNC_RATE = 8; + + protected int syncCooldown; + protected boolean queuedSync; + protected TankSegment[] tanks; + protected LazyOptional capability; + protected boolean extractionAllowed; + protected boolean insertionAllowed; + + private BehaviourType behaviourType; + + public static SmartFluidTankBehaviour single(SmartTileEntity te, int capacity) { + return new SmartFluidTankBehaviour(TYPE, te, 1, capacity, false); + } + + public SmartFluidTankBehaviour(BehaviourType type, SmartTileEntity te, int tanks, + int tankCapacity, boolean enforceVariety) { + super(te); + insertionAllowed = true; + extractionAllowed = true; + behaviourType = type; + this.tanks = new TankSegment[tanks]; + IFluidHandler[] handlers = new IFluidHandler[tanks]; + for (int i = 0; i < tanks; i++) { + TankSegment tankSegment = new TankSegment(tankCapacity); + this.tanks[i] = tankSegment; + handlers[i] = tankSegment.tank; + } + capability = LazyOptional.of(() -> new InternalFluidHandler(handlers)); + } + + public SmartFluidTankBehaviour allowInsertion() { + insertionAllowed = true; + return this; + } + + public SmartFluidTankBehaviour allowExtraction() { + extractionAllowed = true; + return this; + } + + public SmartFluidTankBehaviour forbidInsertion() { + insertionAllowed = false; + return this; + } + + public SmartFluidTankBehaviour forbidExtraction() { + extractionAllowed = false; + return this; + } + + @Override + public void initialize() { + super.initialize(); + if (getWorld().isRemote) + return; + foreach(ts -> { + ts.fluidLevel.forceNextSync(); + ts.onFluidStackChanged(ts.tank.getFluid()); + }); + } + + @Override + public void tick() { + super.tick(); + + if (syncCooldown > 0) { + syncCooldown--; + if (syncCooldown == 0 && queuedSync) + tileEntity.sendData(); + } + + foreach(te -> { + LerpedFloat fluidLevel = te.getFluidLevel(); + if (fluidLevel != null) + fluidLevel.tickChaser(); + }); + } + + public void sendDataImmediately() { + syncCooldown = 0; + queuedSync = false; + tileEntity.sendData(); + } + + public void sendDataLazily() { + if (syncCooldown > 0) { + queuedSync = true; + return; + } + tileEntity.sendData(); + queuedSync = false; + syncCooldown = SYNC_RATE; + } + + @Override + public void remove() { + super.remove(); + capability.invalidate(); + } + + public SmartFluidTank getPrimaryHandler() { + return getPrimaryTank().tank; + } + + public TankSegment getPrimaryTank() { + return tanks[0]; + } + + public TankSegment[] getTanks() { + return tanks; + } + + public boolean isEmpty() { + for (TankSegment tankSegment : tanks) + if (!tankSegment.tank.isEmpty()) + return false; + return true; + } + + public void foreach(Consumer action) { + for (TankSegment tankSegment : tanks) + action.accept(tankSegment); + } + + public LazyOptional getCapability() { + return capability; + } + + @Override + public void write(CompoundNBT nbt, boolean clientPacket) { + super.write(nbt, clientPacket); + ListNBT tanksNBT = new ListNBT(); + foreach(ts -> tanksNBT.add(ts.writeNBT())); + nbt.put(getType().getName() + "Tanks", tanksNBT); + } + + @Override + public void read(CompoundNBT nbt, boolean clientPacket) { + super.read(nbt, clientPacket); + MutableInt index = new MutableInt(0); + NBTHelper.iterateCompoundList(nbt.getList(getType().getName() + "Tanks", NBT.TAG_COMPOUND), c -> { + if (index.intValue() >= tanks.length) + return; + tanks[index.intValue()].readNBT(c, clientPacket); + index.increment(); + }); + } + + class InternalFluidHandler extends CombinedTankWrapper { + + public InternalFluidHandler(IFluidHandler[] handlers) { + super(handlers); + if (enforceVariety) + enforceVariety(); + } + + @Override + public int fill(FluidStack resource, FluidAction action) { + if (!insertionAllowed) + return 0; + return super.fill(resource, action); + } + + @Override + public FluidStack drain(FluidStack resource, FluidAction action) { + if (!extractionAllowed) + return FluidStack.EMPTY; + return super.drain(resource, action); + } + + @Override + public FluidStack drain(int maxDrain, FluidAction action) { + if (!extractionAllowed) + return FluidStack.EMPTY; + return super.drain(maxDrain, action); + } + + } + + public class TankSegment { + + protected SmartFluidTank tank; + protected LerpedFloat fluidLevel; + protected FluidStack renderedFluid; + + public TankSegment(int capacity) { + tank = new SmartFluidTank(1000, f -> onFluidStackChanged(f)); + fluidLevel = LerpedFloat.linear() + .startWithValue(0) + .chase(0, .25, Chaser.EXP); + renderedFluid = FluidStack.EMPTY; + } + + protected void onFluidStackChanged(FluidStack newFluidStack) { + if (!tileEntity.hasWorld()) + return; + fluidLevel.chase(tank.getFluidAmount() / (float) tank.getCapacity(), .25, Chaser.EXP); + if (!getWorld().isRemote) + sendDataLazily(); + } + + public FluidStack getRenderedFluid() { + return renderedFluid; + } + + public LerpedFloat getFluidLevel() { + return fluidLevel; + } + + public CompoundNBT writeNBT() { + CompoundNBT compound = new CompoundNBT(); + compound.put("TankContent", tank.writeToNBT(new CompoundNBT())); + compound.put("Level", fluidLevel.writeNBT()); + return compound; + } + + public void readNBT(CompoundNBT compound, boolean clientPacket) { + tank.readFromNBT(compound.getCompound("TankContent")); + fluidLevel.readNBT(compound.getCompound("Level"), clientPacket); + if (!tank.getFluid() + .isEmpty()) + renderedFluid = tank.getFluid(); + } + + } + + @Override + public BehaviourType getType() { + return behaviourType; + } +} From 27b05bc43e057e8e54425a8a50e6749a7704337b Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 24 Sep 2020 20:32:16 +0200 Subject: [PATCH 04/12] Portable Storage Interface remaster - Implemented new PSI models by Kryppers - PSIs are now used in pairs like contacts - PSIs now act as an inventory proxy of the attached contraption - Comparators can detect when two PSIs are interfacing - Contraptions will continue moving after a second of inactivity --- .../actors/PortableStorageInterfaceBlock.java | 28 ++- .../PortableStorageInterfaceMovement.java | 181 ++++++++---------- .../PortableStorageInterfaceRenderer.java | 104 +++++++--- .../PortableStorageInterfaceTileEntity.java | 116 ++++++++++- .../foundation/item/ItemHandlerWrapper.java | 49 +++++ .../tileEntity/SmartTileEntity.java | 11 ++ .../fluid/SmartFluidTankBehaviour.java | 1 - .../inventory/InvManipulationBehaviour.java | 17 +- 8 files changed, 362 insertions(+), 145 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/item/ItemHandlerWrapper.java diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceBlock.java index d4795c41b..078b33117 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceBlock.java @@ -4,6 +4,7 @@ import javax.annotation.ParametersAreNonnullByDefault; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; +import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.block.ProperDirectionalBlock; import mcp.MethodsReturnNonnullByDefault; @@ -14,20 +15,22 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; +import net.minecraft.world.World; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class PortableStorageInterfaceBlock extends ProperDirectionalBlock { +public class PortableStorageInterfaceBlock extends ProperDirectionalBlock + implements ITE { public PortableStorageInterfaceBlock(Properties p_i48415_1_) { super(p_i48415_1_); } - + @Override public boolean hasTileEntity(BlockState state) { return true; } - + @Override public TileEntity createTileEntity(BlockState state, IBlockReader world) { return AllTileEntities.PORTABLE_STORAGE_INTERFACE.create(); @@ -44,4 +47,23 @@ public class PortableStorageInterfaceBlock extends ProperDirectionalBlock { return AllShapes.PORTABLE_STORAGE_INTERFACE.get(state.get(FACING)); } + @Override + public boolean hasComparatorInputOverride(BlockState state) { + return true; + } + + @Override + public int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) { + try { + return getTileEntity(worldIn, pos).isConnected() ? 15 : 0; + } catch (TileEntityException e) { + } + return 0; + } + + @Override + public Class getTileEntityClass() { + return PortableStorageInterfaceTileEntity.class; + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceMovement.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceMovement.java index 6ceea2f44..f91b4dca7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceMovement.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceMovement.java @@ -1,133 +1,104 @@ package com.simibubi.create.content.contraptions.components.actors; -import java.util.function.Predicate; +import java.util.Optional; +import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; -import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.item.ItemHelper; -import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.inventory.SingleTargetAutoExtractingBehaviour; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; -import net.minecraft.item.ItemStack; +import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.nbt.NBTUtil; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; -import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; -import net.minecraftforge.items.IItemHandlerModifiable; -import net.minecraftforge.items.ItemHandlerHelper; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; public class PortableStorageInterfaceMovement extends MovementBehaviour { - private static final String _exporting_ = "Exporting"; - private static final String _delay_ = "Delay"; - private static final String _workingPos_ = "WorkingPos"; + static final String _workingPos_ = "WorkingPos"; + static final String _clientPrevPos_ = "ClientPrevPos"; @Override public Vec3d getActiveAreaOffset(MovementContext context) { return new Vec3d(context.state.get(PortableStorageInterfaceBlock.FACING) - .getDirectionVec()).scale(.85f); + .getDirectionVec()).scale(1.85f); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void renderInContraption(MovementContext context, MatrixStack ms, MatrixStack msLocal, + IRenderTypeBuffer buffer) { + PortableStorageInterfaceRenderer.renderInContraption(context, ms, msLocal, buffer); } @Override public void visitNewPosition(MovementContext context, BlockPos pos) { - Direction currentFacing = getCurrentFacing(context); - PortableStorageInterfaceTileEntity psi = - getValidStationaryInterface(context.world, pos, currentFacing.getAxis()); + context.data.remove(_workingPos_); + if (findInterface(context, pos)) + context.stall = true; + } + + protected boolean findInterface(MovementContext context, BlockPos pos) { + Optional currentFacingIfValid = getCurrentFacingIfValid(context); + if (!currentFacingIfValid.isPresent()) + return false; + + Direction currentFacing = currentFacingIfValid.get(); + PortableStorageInterfaceTileEntity psi = findStationaryInterface(context.world, pos, currentFacing); if (psi == null) - return; - if (psi.isTransferring()) - return; - context.data.put(_workingPos_, NBTUtil.writeBlockPos(pos)); - context.stall = true; + return false; + + if (psi.isTransferring() && !context.world.isRemote) + return false; + context.data.put(_workingPos_, NBTUtil.writeBlockPos(psi.getPos())); + if (!context.world.isRemote) { + Vec3d diff = VecHelper.getCenterOf(psi.getPos()) + .subtract(context.position); + diff = VecHelper.project(diff, new Vec3d(currentFacing.getDirectionVec())); + float distance = (float) (diff.length() + 1.85f - 1); + psi.startTransferringTo(context.contraption, distance); + } else { + context.data.put(_clientPrevPos_, NBTUtil.writeBlockPos(pos)); + } + return true; } @Override public void tick(MovementContext context) { - if (!context.data.contains(_workingPos_)) + if (context.world.isRemote) { + boolean stalled = context.contraption.stalled; + if (stalled && !context.data.contains(_workingPos_)) { + BlockPos pos = new BlockPos(context.position); + if (!context.data.contains(_clientPrevPos_) + || !NBTUtil.readBlockPos(context.data.getCompound(_clientPrevPos_)) + .equals(pos)) + findInterface(context, pos); + } + if (!stalled) + reset(context); return; - if (context.world.isRemote) + } + + if (!context.data.contains(_workingPos_)) return; BlockPos pos = NBTUtil.readBlockPos(context.data.getCompound(_workingPos_)); + Optional currentFacingIfValid = getCurrentFacingIfValid(context); + if (!currentFacingIfValid.isPresent()) + return; + PortableStorageInterfaceTileEntity stationaryInterface = - getValidStationaryInterface(context.world, pos, getCurrentFacing(context).getAxis()); - if (stationaryInterface == null) { + getStationaryInterfaceAt(context.world, pos, currentFacingIfValid.get()); + if (stationaryInterface == null || !stationaryInterface.isTransferring()) { reset(context); return; } - - int nextExtract = context.data.getInt(_delay_); - if (nextExtract > 0) { - nextExtract--; - context.data.putInt(_delay_, nextExtract); - return; - } - - boolean extract = context.data.getBoolean(_exporting_); - boolean success = false; - IItemHandlerModifiable inv = context.contraption.inventory; - SingleTargetAutoExtractingBehaviour extracting = - TileEntityBehaviour.get(stationaryInterface, SingleTargetAutoExtractingBehaviour.TYPE); - FilteringBehaviour filtering = TileEntityBehaviour.get(stationaryInterface, FilteringBehaviour.TYPE); - - if (extract) { - // Export from Contraption - Predicate test = extracting.getFilterTest(); - int exactAmount = extracting.getAmountFromFilter(); - ItemStack itemExtracted = ItemStack.EMPTY; - if (exactAmount != -1) - itemExtracted = ItemHelper.extract(inv, test, exactAmount, false); - else - itemExtracted = ItemHelper.extract(inv, test, stationaryInterface::amountToExtract, false); - - if (!itemExtracted.isEmpty()) { - stationaryInterface.onExtract(itemExtracted); - success = exactAmount == -1; - } - - } else { - // Import to Contraption - if (extracting != null) { - extracting.setSynchronized(false); - extracting.withAdditionalFilter(stack -> { - if (filtering.anyAmount()) - return true; - return ItemHandlerHelper.insertItemStacked(inv, stack, true) - .isEmpty(); - }); - - extracting.withAmountThreshold(stack -> { - ItemStack tester = stack.copy(); - tester.setCount(tester.getMaxStackSize()); - return stack.getCount() - ItemHandlerHelper.insertItemStacked(inv, stack, true) - .getCount(); - }); - - extracting.setCallback(stack -> { - ItemHandlerHelper.insertItemStacked(inv, stack, false); - }); - - success = extracting.extract() && filtering.anyAmount(); - extracting.setSynchronized(true); - stationaryInterface.applyFilteringCallbacks(); - extracting.setCallback(stationaryInterface::onExtract); - } - } - - if (!success) { - reset(context); - return; - } - - context.data.putInt(_delay_, AllConfigs.SERVER.logistics.defaultExtractionTimer.get()); } @Override @@ -136,32 +107,42 @@ public class PortableStorageInterfaceMovement extends MovementBehaviour { } public void reset(MovementContext context) { + context.data.remove(_clientPrevPos_); context.data.remove(_workingPos_); - context.data.remove(_delay_); - context.data.remove(_exporting_); context.stall = false; } - private PortableStorageInterfaceTileEntity getValidStationaryInterface(World world, BlockPos pos, Axis validAxis) { + private PortableStorageInterfaceTileEntity findStationaryInterface(World world, BlockPos pos, Direction facing) { + for (int i = 0; i < 2; i++) { + PortableStorageInterfaceTileEntity interfaceAt = + getStationaryInterfaceAt(world, pos.offset(facing, i), facing); + if (interfaceAt == null) + continue; + return interfaceAt; + } + return null; + } + + private PortableStorageInterfaceTileEntity getStationaryInterfaceAt(World world, BlockPos pos, Direction facing) { TileEntity te = world.getTileEntity(pos); if (!(te instanceof PortableStorageInterfaceTileEntity)) return null; BlockState blockState = world.getBlockState(pos); if (!AllBlocks.PORTABLE_STORAGE_INTERFACE.has(blockState)) return null; - if (blockState.get(PortableStorageInterfaceBlock.FACING) - .getAxis() != validAxis) - return null; - if (world.isBlockPowered(pos)) + if (blockState.get(PortableStorageInterfaceBlock.FACING) != facing.getOpposite()) return null; return (PortableStorageInterfaceTileEntity) te; } - private Direction getCurrentFacing(MovementContext context) { + private Optional getCurrentFacingIfValid(MovementContext context) { Vec3d directionVec = new Vec3d(context.state.get(PortableStorageInterfaceBlock.FACING) .getDirectionVec()); directionVec = VecHelper.rotate(directionVec, context.rotation.x, context.rotation.y, context.rotation.z); - return Direction.getFacingFromVector(directionVec.x, directionVec.y, directionVec.z); + Direction facingFromVector = Direction.getFacingFromVector(directionVec.x, directionVec.y, directionVec.z); + if (directionVec.distanceTo(new Vec3d(facingFromVector.getDirectionVec())) > 1 / 8f) + return Optional.empty(); + return Optional.of(facingFromVector); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java index 7d57fb692..d3f869473 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java @@ -1,20 +1,25 @@ package com.simibubi.create.content.contraptions.components.actors; +import java.util.function.Consumer; + import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.SuperByteBuffer; import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.nbt.NBTUtil; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.BlockPos; public class PortableStorageInterfaceRenderer extends SafeTileEntityRenderer { @@ -25,40 +30,83 @@ public class PortableStorageInterfaceRenderer extends SafeTileEntityRenderer sbb.renderInto(ms, vb), ms); + } - ms.push(); - - Direction facing = blockState.get(PortableStorageInterfaceBlock.FACING); - MatrixStacker.of(ms) - .centre() - .rotateY(AngleHelper.horizontalAngle(facing)) - .rotateX(facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90) - .unCentre(); - - float progress = (float) ((AnimationTickHolder.getRenderTick() * .25f) % (Math.PI * 2)); - float bounce = (MathHelper.sin(progress) + 1) / 4f; + public static void renderInContraption(MovementContext context, MatrixStack ms, MatrixStack msLocal, + IRenderTypeBuffer buffer) { + BlockState blockState = context.state; + PortableStorageInterfaceTileEntity te = getTargetPSI(context); + IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); + float renderPartialTicks = Minecraft.getInstance() + .getRenderPartialTicks(); - if (bounce > 7/16f) { - middle = AllBlockPartials.PORTABLE_STORAGE_INTERFACE_MIDDLE_POWERED.renderOn(blockState); + float progress = 0; + boolean lit = false; + if (te != null) { + progress = te.getExtensionDistance(renderPartialTicks); + lit = te.isConnected(); } + render(blockState, progress, lit, sbb -> sbb.light(msLocal.peek() + .getModel()) + .renderInto(ms, vb), ms, msLocal); + } - ms.translate(0, bounce, 0); - - ms.push(); - ms.translate(0, 6/16f, 0); - middle.renderInto(ms, vb); - ms.pop(); - - ms.translate(0, bounce, 0); - top.renderInto(ms, vb); + protected static PortableStorageInterfaceTileEntity getTargetPSI(MovementContext context) { + String _workingPos_ = PortableStorageInterfaceMovement._workingPos_; + if (!context.contraption.stalled || !context.data.contains(_workingPos_)) + return null; - ms.pop(); + BlockPos pos = NBTUtil.readBlockPos(context.data.getCompound(_workingPos_)); + TileEntity tileEntity = context.world.getTileEntity(pos); + if (!(tileEntity instanceof PortableStorageInterfaceTileEntity)) + return null; + + PortableStorageInterfaceTileEntity psi = (PortableStorageInterfaceTileEntity) tileEntity; + if (!psi.isTransferring()) + return null; + return psi; + } + + private static void render(BlockState blockState, float progress, boolean lit, + Consumer drawCallback, MatrixStack... matrixStacks) { + for (MatrixStack ms : matrixStacks) + ms.push(); + + SuperByteBuffer middle = AllBlockPartials.PORTABLE_STORAGE_INTERFACE_MIDDLE.renderOn(blockState); + SuperByteBuffer top = AllBlockPartials.PORTABLE_STORAGE_INTERFACE_TOP.renderOn(blockState); + if (lit) + middle = AllBlockPartials.PORTABLE_STORAGE_INTERFACE_MIDDLE_POWERED.renderOn(blockState); + + Direction facing = blockState.get(PortableStorageInterfaceBlock.FACING); + for (MatrixStack ms : matrixStacks) + MatrixStacker.of(ms) + .centre() + .rotateY(AngleHelper.horizontalAngle(facing)) + .rotateX(facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90) + .unCentre(); + + for (MatrixStack ms : matrixStacks) { + ms.translate(0, progress / 2f, 0); + ms.push(); + ms.translate(0, 6 / 16f, 0); + } + + drawCallback.accept(middle); + + for (MatrixStack ms : matrixStacks) { + ms.pop(); + ms.translate(0, progress / 2f, 0); + } + + drawCallback.accept(top); + + for (MatrixStack ms : matrixStacks) + ms.pop(); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java index 3e27dd173..06eabc2fd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java @@ -3,54 +3,150 @@ package com.simibubi.create.content.contraptions.components.actors; import java.util.List; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; +import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.item.ItemHandlerWrapper; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; -import com.simibubi.create.foundation.tileEntity.SyncedTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.utility.LerpedFloat; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; +import net.minecraft.util.math.MathHelper; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.IItemHandlerModifiable; -import net.minecraftforge.items.wrapper.CombinedInvWrapper; public class PortableStorageInterfaceTileEntity extends SmartTileEntity { - protected int transferTimeout; + protected int transferTimer; + protected float distance; protected LazyOptional capability; + protected LerpedFloat connectionAnimation; public PortableStorageInterfaceTileEntity(TileEntityType tileEntityTypeIn) { super(tileEntityTypeIn); - transferTimeout = 0; + transferTimer = 0; capability = LazyOptional.empty(); + connectionAnimation = LerpedFloat.linear().startWithValue(0); } - public void startTransferringTo(Contraption contraption) { - CombinedInvWrapper inventory = contraption.inventory; + public void startTransferringTo(Contraption contraption, float distance) { capability.invalidate(); - capability = LazyOptional.of(() -> inventory); - + capability = LazyOptional.of(() -> new InterfaceItemHandler(contraption.inventory)); + this.distance = distance; + startConnecting(); + notifyUpdate(); } @Override public void tick() { super.tick(); + boolean wasConnected = isConnected(); + + if (transferTimer > 0) { + transferTimer--; + if (transferTimer == 0) + capability.invalidate(); + } + + boolean isConnected = isConnected(); + if (wasConnected != isConnected && !world.isRemote) + markDirty(); + + float progress = 0; + int timeUnit = getTransferTimeout() / 2; + if (isConnected) + progress = 1; + else if (transferTimer >= timeUnit * 3) + progress = MathHelper.lerp((transferTimer - timeUnit * 3) / (float) timeUnit, 1, 0); + else if (transferTimer < timeUnit) + progress = MathHelper.lerp(transferTimer / (float) timeUnit, 0, 1); + connectionAnimation.setValue(progress); } + @Override + protected void read(CompoundNBT compound, boolean clientPacket) { + super.read(compound, clientPacket); + transferTimer = compound.getInt("Timer"); + distance = compound.getFloat("Distance"); + } + + @Override + protected void write(CompoundNBT compound, boolean clientPacket) { + super.write(compound, clientPacket); + compound.putInt("Timer", transferTimer); + compound.putFloat("Distance", distance); + } + public boolean isTransferring() { - return transferTimeout != 0; + return transferTimer != 0; + } + + boolean isConnected() { + int timeUnit = getTransferTimeout() / 2; + return transferTimer >= timeUnit && transferTimer < timeUnit * 3; + } + + float getExtensionDistance(float partialTicks) { + return connectionAnimation.getValue(partialTicks) * distance / 2; + } + + float getConnectionDistance() { + return distance; } @Override public LazyOptional getCapability(Capability cap, Direction side) { + if (isItemHandlerCap(cap)) + return capability.cast(); return super.getCapability(cap, side); } - public void resetTimer() { + public void startConnecting() { + transferTimer = getTransferTimeout() * 2; + } + + public void onContentTransferred() { + int timeUnit = getTransferTimeout() / 2; + transferTimer = timeUnit * 3; + sendData(); + } + protected Integer getTransferTimeout() { + return AllConfigs.SERVER.logistics.psiTimeout.get(); } @Override public void addBehaviours(List behaviours) {} + class InterfaceItemHandler extends ItemHandlerWrapper { + + public InterfaceItemHandler(IItemHandlerModifiable wrapped) { + super(wrapped); + } + + @Override + public ItemStack extractItem(int slot, int amount, boolean simulate) { + if (!isConnected()) + return ItemStack.EMPTY; + ItemStack extractItem = super.extractItem(slot, amount, simulate); + if (!simulate && !extractItem.isEmpty()) + onContentTransferred(); + return extractItem; + } + + @Override + public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { + if (!isConnected()) + return stack; + ItemStack insertItem = super.insertItem(slot, stack, simulate); + if (!simulate && !insertItem.equals(stack, false)) + onContentTransferred(); + return insertItem; + } + + } + } diff --git a/src/main/java/com/simibubi/create/foundation/item/ItemHandlerWrapper.java b/src/main/java/com/simibubi/create/foundation/item/ItemHandlerWrapper.java new file mode 100644 index 000000000..6a2190269 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/item/ItemHandlerWrapper.java @@ -0,0 +1,49 @@ +package com.simibubi.create.foundation.item; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.items.IItemHandlerModifiable; + +public class ItemHandlerWrapper implements IItemHandlerModifiable { + + private IItemHandlerModifiable wrapped; + + public ItemHandlerWrapper(IItemHandlerModifiable wrapped) { + this.wrapped = wrapped; + } + + @Override + public int getSlots() { + return wrapped.getSlots(); + } + + @Override + public ItemStack getStackInSlot(int slot) { + return wrapped.getStackInSlot(slot); + } + + @Override + public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { + return wrapped.insertItem(slot, stack, simulate); + } + + @Override + public ItemStack extractItem(int slot, int amount, boolean simulate) { + return wrapped.extractItem(slot, amount, simulate); + } + + @Override + public int getSlotLimit(int slot) { + return wrapped.getSlotLimit(slot); + } + + @Override + public boolean isItemValid(int slot, ItemStack stack) { + return wrapped.isItemValid(slot, stack); + } + + @Override + public void setStackInSlot(int slot, ItemStack stack) { + wrapped.setStackInSlot(slot, stack); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/SmartTileEntity.java b/src/main/java/com/simibubi/create/foundation/tileEntity/SmartTileEntity.java index bb1a42cdc..a40427a62 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/SmartTileEntity.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/SmartTileEntity.java @@ -11,6 +11,9 @@ import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntityType; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.items.CapabilityItemHandler; public abstract class SmartTileEntity extends SyncedTileEntity implements ITickableTileEntity { @@ -145,5 +148,13 @@ public abstract class SmartTileEntity extends SyncedTileEntity implements ITicka return (T) behaviours.get(type); return null; } + + protected boolean isItemHandlerCap(Capability cap) { + return cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY; + } + + protected boolean isFluidHandlerCap(Capability cap) { + return cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY; + } } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java index 971f7fd1e..03b111842 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java @@ -6,7 +6,6 @@ import org.apache.commons.lang3.mutable.MutableInt; import com.simibubi.create.foundation.fluid.CombinedTankWrapper; import com.simibubi.create.foundation.fluid.SmartFluidTank; -import com.simibubi.create.foundation.item.SmartInventory; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InvManipulationBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InvManipulationBehaviour.java index 0a23edb51..727544e9a 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InvManipulationBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InvManipulationBehaviour.java @@ -36,6 +36,7 @@ public class InvManipulationBehaviour extends TileEntityBehaviour { protected LazyOptional targetCapability; protected boolean simulateNext; protected boolean bypassSided; + private boolean findNewNextTick; private BehaviourType behaviourType; @@ -55,7 +56,7 @@ public class InvManipulationBehaviour extends TileEntityBehaviour { InterfaceProvider target) { super(te); behaviourType = type; - setLazyTickRate(40); + setLazyTickRate(5); this.target = target; this.targetCapability = LazyOptional.empty(); simulateNext = false; @@ -137,11 +138,12 @@ public class InvManipulationBehaviour extends TileEntityBehaviour { @Override public void initialize() { super.initialize(); - findNewCapability(); + findNewNextTick = true; } protected void onHandlerInvalidated(LazyOptional handler) { - findNewCapability(); + findNewNextTick = true; + targetCapability = LazyOptional.empty(); } @Override @@ -150,6 +152,15 @@ public class InvManipulationBehaviour extends TileEntityBehaviour { if (!targetCapability.isPresent()) findNewCapability(); } + + @Override + public void tick() { + super.tick(); + if (findNewNextTick) { + findNewNextTick = false; + findNewCapability(); + } + } public int getAmountFromFilter() { int amount = -1; From 6e285e2f8bc652840c066fdfea5ae8104ff97e80 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 25 Sep 2020 17:22:16 +0200 Subject: [PATCH 05/12] Valves and Valve handles - Added a straight pipe variant to cut flows using rotational input - Added a slower more precise variant of the hand crank - Basins now render their contained fluids --- src/generated/resources/.cache/cache | 34 +-- .../assets/create/blockstates/fluid_pipe.json | 204 ++++++++-------- .../create/blockstates/fluid_valve.json | 100 ++++++++ .../create/blockstates/radial_chassis.json | 24 +- .../create/blockstates/valve_handle.json | 30 +++ .../resources/assets/create/lang/en_ud.json | 2 + .../resources/assets/create/lang/en_us.json | 2 + .../assets/create/lang/unfinished/de_de.json | 4 +- .../assets/create/lang/unfinished/fr_fr.json | 4 +- .../assets/create/lang/unfinished/it_it.json | 4 +- .../assets/create/lang/unfinished/ja_jp.json | 4 +- .../assets/create/lang/unfinished/ko_kr.json | 4 +- .../assets/create/lang/unfinished/nl_nl.json | 4 +- .../assets/create/lang/unfinished/pt_br.json | 4 +- .../assets/create/lang/unfinished/ru_ru.json | 4 +- .../assets/create/lang/unfinished/zh_cn.json | 4 +- .../create/models/item/fluid_valve.json | 3 + .../create/models/item/valve_handle.json | 3 + .../loot_tables/blocks/fluid_valve.json | 19 ++ .../loot_tables/blocks/valve_handle.json | 19 ++ .../data/create/tags/blocks/brittle.json | 1 + .../com/simibubi/create/AllBlockPartials.java | 24 +- .../java/com/simibubi/create/AllBlocks.java | 20 ++ .../java/com/simibubi/create/AllShapes.java | 4 + .../com/simibubi/create/AllTileEntities.java | 10 +- .../base/DirectionalAxisKineticBlock.java | 66 +++--- .../components/actors/DrillRenderer.java | 4 +- .../PortableStorageInterfaceTileEntity.java | 9 + .../components/clock/CuckooClockRenderer.java | 2 +- .../components/crank/HandCrankBlock.java | 12 + .../components/crank/HandCrankRenderer.java | 14 +- .../components/crank/HandCrankTileEntity.java | 8 +- .../components/crank/ValveHandleBlock.java | 36 +++ .../components/fan/EncasedFanRenderer.java | 4 +- .../components/flywheel/FlywheelRenderer.java | 2 +- .../motor/CreativeMotorRenderer.java | 2 +- .../components/saw/SawRenderer.java | 2 +- .../bearing/BearingRenderer.java | 2 +- .../pulley/PulleyRenderer.java | 2 +- .../contraptions/fluids/FluidNetwork.java | 7 +- .../contraptions/fluids/FluidNetworkFlow.java | 2 + .../contraptions/fluids/FluidPropagator.java | 1 + .../contraptions/fluids/PumpRenderer.java | 4 +- .../fluids/actors/SpoutTileEntity.java | 6 +- .../fluids/pipes/FluidValveBlock.java | 73 ++++++ .../fluids/pipes/FluidValveRenderer.java | 60 +++++ .../fluids/pipes/FluidValveTileEntity.java | 128 ++++++++++ .../fluids/pipes/GlassFluidPipeBlock.java | 11 +- .../fluids/pipes/StraightPipeTileEntity.java | 4 + .../processing/BasinRenderer.java | 61 +++++ .../processing/BasinTileEntity.java | 1 + .../relays/encased/SplitShaftRenderer.java | 2 +- .../relays/gearbox/GearboxRenderer.java | 2 +- .../fluid/SmartFluidTankBehaviour.java | 8 +- .../foundation/utility/DirectionHelper.java | 6 + .../models/block/deployer/vertical.json | 3 +- .../models/block/fluid_pipe/window.json | 62 +++-- .../fluid_valve/block_horizontal_closed.json | 44 ++++ .../fluid_valve/block_horizontal_open.json | 44 ++++ .../fluid_valve/block_vertical_closed.json | 44 ++++ .../fluid_valve/block_vertical_open.json | 44 ++++ .../create/models/block/fluid_valve/item.json | 201 ++++++++++++++++ .../models/block/fluid_valve/pointer.json | 95 ++++++++ .../create/models/block/valve_handle.json | 222 ++++++++++++++++++ .../create/textures/block/fluid_pipe.png | Bin 1356 -> 669 bytes .../create/textures/block/fluid_valve.png | Bin 0 -> 696 bytes .../textures/block/glass_fluid_pipe.png | Bin 499 -> 330 bytes 67 files changed, 1612 insertions(+), 223 deletions(-) create mode 100644 src/generated/resources/assets/create/blockstates/fluid_valve.json create mode 100644 src/generated/resources/assets/create/blockstates/valve_handle.json create mode 100644 src/generated/resources/assets/create/models/item/fluid_valve.json create mode 100644 src/generated/resources/assets/create/models/item/valve_handle.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/fluid_valve.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/valve_handle.json create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/crank/ValveHandleBlock.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveBlock.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveTileEntity.java create mode 100644 src/main/resources/assets/create/models/block/fluid_valve/block_horizontal_closed.json create mode 100644 src/main/resources/assets/create/models/block/fluid_valve/block_horizontal_open.json create mode 100644 src/main/resources/assets/create/models/block/fluid_valve/block_vertical_closed.json create mode 100644 src/main/resources/assets/create/models/block/fluid_valve/block_vertical_open.json create mode 100644 src/main/resources/assets/create/models/block/fluid_valve/item.json create mode 100644 src/main/resources/assets/create/models/block/fluid_valve/pointer.json create mode 100644 src/main/resources/assets/create/models/block/valve_handle.json create mode 100644 src/main/resources/assets/create/textures/block/fluid_valve.png diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 36b412ed4..4e96a6802 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -127,8 +127,9 @@ de8a40b7daf1497d5aecee47a43b3e0b1d030b00 assets/create/blockstates/fancy_scoria_ fc9ac0a7e7191b93516719455a17177fa6524ecc assets/create/blockstates/fancy_weathered_limestone_bricks_slab.json b2a7c321b1795f20e7433f81a55ce4683de081b8 assets/create/blockstates/fancy_weathered_limestone_bricks_stairs.json 6372fe02ba0065acb0758121c45a15a1a8fdc5de assets/create/blockstates/fancy_weathered_limestone_bricks_wall.json -fe9169716dd21a81a3710a89f0a9b7ea4dcd4d51 assets/create/blockstates/fluid_pipe.json +4c3e0500f9382d2e426e823fe876f57f4d7ee3b4 assets/create/blockstates/fluid_pipe.json f0eaab18e16c4f3f65ebf3b55b08f0dc445720fe assets/create/blockstates/fluid_tank.json +5408d92ab02af86539ac42971d4033545970bb3a assets/create/blockstates/fluid_valve.json e9da1794b6ece7f9aa8bcb43d42c23a55446133b assets/create/blockstates/flywheel.json ac00d40e1ef50a37041c0481afa1a23a14dea78e assets/create/blockstates/framed_glass.json 61df7769fa61f6dd2868a4377e54320fdd473b4e assets/create/blockstates/framed_glass_pane.json @@ -297,7 +298,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl 3a739f9d4276828d83f2d2750bf3227c87bcd438 assets/create/blockstates/pulley_magnet.json 469e430d96cb0a5e1aaf6b7cc5d401d488c9e600 assets/create/blockstates/pulse_repeater.json 92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json -8d7e653bfd9846e684a0d3725595714a19201017 assets/create/blockstates/radial_chassis.json +89b63c6e5875da07226854651079bcea85439f5b assets/create/blockstates/radial_chassis.json da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json 8929677f2cc5354aa19ef182af69f9f0b41eb242 assets/create/blockstates/redstone_contact.json c29213b77ac0c78d8979c5f6188d2b265696f9b9 assets/create/blockstates/redstone_link.json @@ -332,6 +333,7 @@ e815bfd854c2653f10828bb11950f7fb991d7efc assets/create/blockstates/stressometer. 8b0c2c7ac72529565b3339aa8df7565858100afa assets/create/blockstates/tiled_glass.json a2454400b1cf9889f70aebdc89c52a1be25f543c assets/create/blockstates/tiled_glass_pane.json a8094531617e27a545c4815ab2062bf0ffca3633 assets/create/blockstates/turntable.json +c9b34d2c455b5fb60bffd19adff1ca4387bc566a assets/create/blockstates/valve_handle.json 69dfe8afaa8eb6105dae9f76ab8b7847bf90b8c6 assets/create/blockstates/vertical_framed_glass.json c4db76b9d36cfb098df0d158cb6f8b82768ebe14 assets/create/blockstates/vertical_framed_glass_pane.json d995547bcd71603ba7378d8998098e462030bfd0 assets/create/blockstates/water_wheel.json @@ -349,17 +351,17 @@ c77b46d8b459e5c7cc495393546f3fcca8a1fa1d assets/create/blockstates/weathered_lim a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.json 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json -5e8bf32d45aae9207aa4063803d073dda12fefc9 assets/create/lang/en_ud.json -a623a699b4b15b1793846f2981f5ddfcf5f70eaa assets/create/lang/en_us.json -20b98763fcc45b49d4f08c0567de1305ae2ca08b assets/create/lang/unfinished/de_de.json -49356dba136af4ba87c61adcec8a5e86ffed0d19 assets/create/lang/unfinished/fr_fr.json -7aeadfee8cf3f5037a892d20dc5ed5a73015822d assets/create/lang/unfinished/it_it.json -da24efa68279d5bd95c55210cc5ecb46f7b28550 assets/create/lang/unfinished/ja_jp.json -e391370d913d9ea71b061ead791e335c5fd5abe1 assets/create/lang/unfinished/ko_kr.json -920688bd6cfdbb4a3f3a35700868b5639f10bf2a assets/create/lang/unfinished/nl_nl.json -d57b0279090380d35f6f56a34864114b210d815c assets/create/lang/unfinished/pt_br.json -4f957b1130d5f2ae953d687d754417de0f62fd61 assets/create/lang/unfinished/ru_ru.json -c2198b6cee5fdba4049fd2166f6382e5bbaf6581 assets/create/lang/unfinished/zh_cn.json +e7a5a4320a332f5ed4341d3c08dd50a2e945d8bb assets/create/lang/en_ud.json +040cb0a702643a865f30bae9eeacaeaa94bbce7d assets/create/lang/en_us.json +5c6ce1933165fecd71fbdf67cb8de955368d1bfc assets/create/lang/unfinished/de_de.json +b8c3464b86dd7a934d3beec6c005e4799cbdf7af assets/create/lang/unfinished/fr_fr.json +c91eb4509e5afe6f288ed737f407914ae983480a assets/create/lang/unfinished/it_it.json +16fb593c1179f58811153b2f7c7cffb55615587f assets/create/lang/unfinished/ja_jp.json +4d975de4cd34e10e7156fe35a0e5f4e40650aa69 assets/create/lang/unfinished/ko_kr.json +f98f523352796c3496c27085182118bbd597a7ad assets/create/lang/unfinished/nl_nl.json +714e68af6c0f614d069ff0b31763bced1f968437 assets/create/lang/unfinished/pt_br.json +a18338a37536490b2f7b6a8836add3e133b16920 assets/create/lang/unfinished/ru_ru.json +e7ad3d9140bb94d5aa2720b651d8bf1308ad0da4 assets/create/lang/unfinished/zh_cn.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1136,6 +1138,7 @@ ce6ee1fe4a92e26af75c2eaebd5055efdbdff169 assets/create/models/item/fancy_scoria_ 7bdb3d8a59586654df0c2a84d73a346b898d247b assets/create/models/item/fancy_weathered_limestone_bricks_wall.json e5e6fb6eb182b85b977e1025a7fe84d46de59320 assets/create/models/item/fluid_pipe.json e7d2097256fed545064a37d233e7b810b04c26a4 assets/create/models/item/fluid_tank.json +f4727119b75ab632c3ad295be4d398b1919d782f assets/create/models/item/fluid_valve.json 8707332c0cb6ee123e7962d08536a60725c64ce8 assets/create/models/item/flywheel.json d62b93d3c274d280f3eec22a28b5175943411d25 assets/create/models/item/framed_glass.json 1041d462c6e856f7f3f2365c299c0599703d1ed7 assets/create/models/item/framed_glass_pane.json @@ -1356,6 +1359,7 @@ b1d3d00ff05908feacad06a86800da96cc9bc65d assets/create/models/item/tiled_glass.j 8a2a81a8cbc52b6021e57107d79a32f73b82d8fe assets/create/models/item/tiled_glass_pane.json c081317f106a2b04700aafde12c57445844c20ab assets/create/models/item/tree_fertilizer.json fb24881c4e92bbb7ffa54a71e0af6b1c66d84829 assets/create/models/item/turntable.json +ee706dcb209ad93f12a1cc4c3c502aa24153c82b assets/create/models/item/valve_handle.json 32f49b724af10c8d7e2ed5a3c82280e83b75f789 assets/create/models/item/vertical_framed_glass.json 5e331da9d4086412f5722923e3008246ed286a00 assets/create/models/item/vertical_framed_glass_pane.json 00c2929de9b7171656bea74e1a6d694c6a45b075 assets/create/models/item/vertical_gearbox.json @@ -2103,6 +2107,7 @@ e4d0fe35d3441a5815bd4e1357329b284e63ecd8 data/create/loot_tables/blocks/fancy_we 6bb505bad78cbb01a5cb5a069435bf4ed0e62adf data/create/loot_tables/blocks/fancy_weathered_limestone_bricks_wall.json c8aa9bbed8fd703eb1853de0b7c9e04dffb7a511 data/create/loot_tables/blocks/fluid_pipe.json 108d27b697d2ea0719d74a704c6e344a8d63375b data/create/loot_tables/blocks/fluid_tank.json +40dbf1f193787f3c6437de8c0a828ba4e37f10fc data/create/loot_tables/blocks/fluid_valve.json f37526c092c645045c22674dea6c7b1ec503c9c3 data/create/loot_tables/blocks/flywheel.json ce0bb978b11935bc2d1218445f8ab18099af6b8a data/create/loot_tables/blocks/framed_glass.json 89bd90ecd7a1ce1f75bd873989cc58a84c8dcef9 data/create/loot_tables/blocks/framed_glass_pane.json @@ -2306,6 +2311,7 @@ ec2889e712702644092197a4b41a682fb953817d data/create/loot_tables/blocks/stockpil 05e843ca6eb5e299bf41de123977a1045c120ad4 data/create/loot_tables/blocks/tiled_glass.json e999969f05d2625e61757aa82092d232b99f6e0a data/create/loot_tables/blocks/tiled_glass_pane.json 7b66ad2c48449bafd0cdbd086ac41218cb73a814 data/create/loot_tables/blocks/turntable.json +4192595ca6a8e0845a871dc8f99724185e1e955c data/create/loot_tables/blocks/valve_handle.json 028e293b5cd694017962f67dc80dba719f904e28 data/create/loot_tables/blocks/vertical_framed_glass.json d0156602dd5f4a274c293df67e19374820c72890 data/create/loot_tables/blocks/vertical_framed_glass_pane.json 2883c63ceb1273009dbf91cb0693756cadf79a1a data/create/loot_tables/blocks/water_wheel.json @@ -3020,7 +3026,7 @@ 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 -10bed57f3eb989a643eb3609f177e30536f07965 data/create/tags/blocks/brittle.json +c8e33479d80b6dbd23bded9ce15d1b08841819bb 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 diff --git a/src/generated/resources/assets/create/blockstates/fluid_pipe.json b/src/generated/resources/assets/create/blockstates/fluid_pipe.json index 3b646b920..581373307 100644 --- a/src/generated/resources/assets/create/blockstates/fluid_pipe.json +++ b/src/generated/resources/assets/create/blockstates/fluid_pipe.json @@ -60,10 +60,10 @@ }, { "when": { - "down": "false", - "north": "true", + "south": "false", "up": "true", - "south": "false" + "down": "false", + "north": "true" }, "apply": { "model": "create:block/fluid_pipe/lu_x" @@ -71,10 +71,10 @@ }, { "when": { - "down": "false", - "north": "false", + "south": "true", "up": "true", - "south": "true" + "down": "false", + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/ru_x" @@ -82,10 +82,10 @@ }, { "when": { - "down": "true", - "north": "true", + "south": "false", "up": "false", - "south": "false" + "down": "true", + "north": "true" }, "apply": { "model": "create:block/fluid_pipe/ld_x" @@ -93,10 +93,10 @@ }, { "when": { - "down": "true", - "north": "false", + "south": "true", "up": "false", - "south": "true" + "down": "true", + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/rd_x" @@ -104,32 +104,10 @@ }, { "when": { - "down": "true", - "north": "false", + "south": "false", "up": "true", - "south": "false" - }, - "apply": { - "model": "create:block/fluid_pipe/ud_x" - } - }, - { - "when": { - "down": "false", - "north": "false", - "up": "true", - "south": "false" - }, - "apply": { - "model": "create:block/fluid_pipe/ud_x" - } - }, - { - "when": { "down": "true", - "north": "false", - "up": "false", - "south": "false" + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -137,10 +115,32 @@ }, { "when": { + "south": "false", + "up": "true", "down": "false", - "north": "true", + "north": "false" + }, + "apply": { + "model": "create:block/fluid_pipe/ud_x" + } + }, + { + "when": { + "south": "false", "up": "false", - "south": "true" + "down": "true", + "north": "false" + }, + "apply": { + "model": "create:block/fluid_pipe/ud_x" + } + }, + { + "when": { + "south": "true", + "up": "false", + "down": "false", + "north": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -148,10 +148,10 @@ }, { "when": { - "down": "false", - "north": "true", + "south": "false", "up": "false", - "south": "false" + "down": "false", + "north": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -159,10 +159,10 @@ }, { "when": { - "down": "false", - "north": "false", + "south": "true", "up": "false", - "south": "true" + "down": "false", + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -170,10 +170,10 @@ }, { "when": { - "down": "false", - "north": "false", + "south": "false", "up": "false", - "south": "false" + "down": "false", + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/none_x" @@ -181,10 +181,10 @@ }, { "when": { + "south": "true", "west": "true", - "east": "false", "north": "false", - "south": "true" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/lu_y" @@ -192,10 +192,10 @@ }, { "when": { + "south": "true", "west": "false", - "east": "true", "north": "false", - "south": "true" + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/ru_y" @@ -203,10 +203,10 @@ }, { "when": { + "south": "false", "west": "true", - "east": "false", "north": "true", - "south": "false" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ld_y" @@ -214,10 +214,10 @@ }, { "when": { + "south": "false", "west": "false", - "east": "true", "north": "true", - "south": "false" + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/rd_y" @@ -225,10 +225,10 @@ }, { "when": { + "south": "true", "west": "false", - "east": "false", "north": "true", - "south": "true" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -236,10 +236,10 @@ }, { "when": { + "south": "true", "west": "false", - "east": "false", "north": "false", - "south": "true" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -247,10 +247,10 @@ }, { "when": { + "south": "false", "west": "false", - "east": "false", "north": "true", - "south": "false" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -258,10 +258,10 @@ }, { "when": { + "south": "false", "west": "true", - "east": "true", "north": "false", - "south": "false" + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -269,10 +269,10 @@ }, { "when": { + "south": "false", "west": "true", - "east": "false", "north": "false", - "south": "false" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -280,10 +280,10 @@ }, { "when": { + "south": "false", "west": "false", - "east": "true", "north": "false", - "south": "false" + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -291,10 +291,10 @@ }, { "when": { + "south": "false", "west": "false", - "east": "false", "north": "false", - "south": "false" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/none_y" @@ -302,10 +302,10 @@ }, { "when": { - "west": "false", - "east": "true", + "up": "true", "down": "false", - "up": "true" + "west": "false", + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/lu_z" @@ -313,10 +313,10 @@ }, { "when": { - "west": "true", - "east": "false", + "up": "true", "down": "false", - "up": "true" + "west": "true", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ru_z" @@ -324,10 +324,10 @@ }, { "when": { - "west": "false", - "east": "true", + "up": "false", "down": "true", - "up": "false" + "west": "false", + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/ld_z" @@ -335,10 +335,10 @@ }, { "when": { - "west": "true", - "east": "false", + "up": "false", "down": "true", - "up": "false" + "west": "true", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/rd_z" @@ -346,10 +346,10 @@ }, { "when": { - "west": "false", - "east": "false", + "up": "true", "down": "true", - "up": "true" + "west": "false", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -357,10 +357,10 @@ }, { "when": { - "west": "false", - "east": "false", + "up": "true", "down": "false", - "up": "true" + "west": "false", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -368,10 +368,10 @@ }, { "when": { - "west": "false", - "east": "false", + "up": "false", "down": "true", - "up": "false" + "west": "false", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -379,10 +379,10 @@ }, { "when": { + "up": "false", + "down": "false", "west": "true", - "east": "true", - "down": "false", - "up": "false" + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -390,10 +390,10 @@ }, { "when": { + "up": "false", + "down": "false", "west": "false", - "east": "true", - "down": "false", - "up": "false" + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -401,10 +401,10 @@ }, { "when": { + "up": "false", + "down": "false", "west": "true", - "east": "false", - "down": "false", - "up": "false" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -412,10 +412,10 @@ }, { "when": { - "west": "false", - "east": "false", + "up": "false", "down": "false", - "up": "false" + "west": "false", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/none_z" diff --git a/src/generated/resources/assets/create/blockstates/fluid_valve.json b/src/generated/resources/assets/create/blockstates/fluid_valve.json new file mode 100644 index 000000000..41d048d24 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/fluid_valve.json @@ -0,0 +1,100 @@ +{ + "variants": { + "axis_along_first=false,enabled=false,facing=down": { + "model": "create:block/fluid_valve/block_horizontal_closed", + "x": 270, + "y": 90 + }, + "axis_along_first=true,enabled=false,facing=down": { + "model": "create:block/fluid_valve/block_horizontal_closed", + "x": 270 + }, + "axis_along_first=false,enabled=true,facing=down": { + "model": "create:block/fluid_valve/block_horizontal_open", + "x": 270, + "y": 90 + }, + "axis_along_first=true,enabled=true,facing=down": { + "model": "create:block/fluid_valve/block_horizontal_open", + "x": 270 + }, + "axis_along_first=false,enabled=false,facing=up": { + "model": "create:block/fluid_valve/block_horizontal_closed", + "x": 90, + "y": 90 + }, + "axis_along_first=true,enabled=false,facing=up": { + "model": "create:block/fluid_valve/block_horizontal_closed", + "x": 90 + }, + "axis_along_first=false,enabled=true,facing=up": { + "model": "create:block/fluid_valve/block_horizontal_open", + "x": 90, + "y": 90 + }, + "axis_along_first=true,enabled=true,facing=up": { + "model": "create:block/fluid_valve/block_horizontal_open", + "x": 90 + }, + "axis_along_first=false,enabled=false,facing=north": { + "model": "create:block/fluid_valve/block_vertical_closed", + "y": 180 + }, + "axis_along_first=true,enabled=false,facing=north": { + "model": "create:block/fluid_valve/block_horizontal_closed", + "y": 180 + }, + "axis_along_first=false,enabled=true,facing=north": { + "model": "create:block/fluid_valve/block_vertical_open", + "y": 180 + }, + "axis_along_first=true,enabled=true,facing=north": { + "model": "create:block/fluid_valve/block_horizontal_open", + "y": 180 + }, + "axis_along_first=false,enabled=false,facing=south": { + "model": "create:block/fluid_valve/block_vertical_closed" + }, + "axis_along_first=true,enabled=false,facing=south": { + "model": "create:block/fluid_valve/block_horizontal_closed" + }, + "axis_along_first=false,enabled=true,facing=south": { + "model": "create:block/fluid_valve/block_vertical_open" + }, + "axis_along_first=true,enabled=true,facing=south": { + "model": "create:block/fluid_valve/block_horizontal_open" + }, + "axis_along_first=false,enabled=false,facing=west": { + "model": "create:block/fluid_valve/block_horizontal_closed", + "y": 90 + }, + "axis_along_first=true,enabled=false,facing=west": { + "model": "create:block/fluid_valve/block_vertical_closed", + "y": 90 + }, + "axis_along_first=false,enabled=true,facing=west": { + "model": "create:block/fluid_valve/block_horizontal_open", + "y": 90 + }, + "axis_along_first=true,enabled=true,facing=west": { + "model": "create:block/fluid_valve/block_vertical_open", + "y": 90 + }, + "axis_along_first=false,enabled=false,facing=east": { + "model": "create:block/fluid_valve/block_horizontal_closed", + "y": 270 + }, + "axis_along_first=true,enabled=false,facing=east": { + "model": "create:block/fluid_valve/block_vertical_closed", + "y": 270 + }, + "axis_along_first=false,enabled=true,facing=east": { + "model": "create:block/fluid_valve/block_horizontal_open", + "y": 270 + }, + "axis_along_first=true,enabled=true,facing=east": { + "model": "create:block/fluid_valve/block_vertical_open", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/radial_chassis.json b/src/generated/resources/assets/create/blockstates/radial_chassis.json index 9d00ea8b1..d60327a8a 100644 --- a/src/generated/resources/assets/create/blockstates/radial_chassis.json +++ b/src/generated/resources/assets/create/blockstates/radial_chassis.json @@ -149,8 +149,8 @@ }, { "when": { - "sticky_north": "true", - "axis": "x" + "axis": "x", + "sticky_north": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky" @@ -158,8 +158,8 @@ }, { "when": { - "sticky_north": "true", - "axis": "y" + "axis": "y", + "sticky_north": "true" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -168,8 +168,8 @@ }, { "when": { - "sticky_north": "true", - "axis": "z" + "axis": "z", + "sticky_north": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -178,8 +178,8 @@ }, { "when": { - "sticky_north": "false", - "axis": "x" + "axis": "x", + "sticky_north": "false" }, "apply": { "model": "create:block/radial_chassis_side_x" @@ -187,8 +187,8 @@ }, { "when": { - "sticky_north": "false", - "axis": "y" + "axis": "y", + "sticky_north": "false" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -197,8 +197,8 @@ }, { "when": { - "sticky_north": "false", - "axis": "z" + "axis": "z", + "sticky_north": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", diff --git a/src/generated/resources/assets/create/blockstates/valve_handle.json b/src/generated/resources/assets/create/blockstates/valve_handle.json new file mode 100644 index 000000000..d3333b2e6 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/valve_handle.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/valve_handle", + "x": 180 + }, + "facing=up": { + "model": "create:block/valve_handle" + }, + "facing=north": { + "model": "create:block/valve_handle", + "x": 90 + }, + "facing=south": { + "model": "create:block/valve_handle", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/valve_handle", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/valve_handle", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 720fa1360..b30104b36 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -130,6 +130,7 @@ "block.create.fancy_weathered_limestone_bricks_wall": "\u05DF\u05DF\u0250M s\u029E\u0254\u0131\u0279\u15FA \u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM \u028E\u0254u\u0250\u2132", "block.create.fluid_pipe": "\u01DDd\u0131\u0500 p\u0131n\u05DF\u2132", "block.create.fluid_tank": "\u029Eu\u0250\u27D8 p\u0131n\u05DF\u2132", + "block.create.fluid_valve": "\u01DD\u028C\u05DF\u0250\u039B p\u0131n\u05DF\u2132", "block.create.flywheel": "\u05DF\u01DD\u01DD\u0265\u028D\u028E\u05DF\u2132", "block.create.framed_glass": "ss\u0250\u05DF\u2141 p\u01DD\u026F\u0250\u0279\u2132", "block.create.framed_glass_pane": "\u01DDu\u0250\u0500 ss\u0250\u05DF\u2141 p\u01DD\u026F\u0250\u0279\u2132", @@ -333,6 +334,7 @@ "block.create.tiled_glass": "ss\u0250\u05DF\u2141 p\u01DD\u05DF\u0131\u27D8", "block.create.tiled_glass_pane": "\u01DDu\u0250\u0500 ss\u0250\u05DF\u2141 p\u01DD\u05DF\u0131\u27D8", "block.create.turntable": "\u01DD\u05DFq\u0250\u0287u\u0279n\u27D8", + "block.create.valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B", "block.create.vertical_framed_glass": "ss\u0250\u05DF\u2141 p\u01DD\u026F\u0250\u0279\u2132 \u05DF\u0250\u0254\u0131\u0287\u0279\u01DD\u039B", "block.create.vertical_framed_glass_pane": "\u01DDu\u0250\u0500 ss\u0250\u05DF\u2141 p\u01DD\u026F\u0250\u0279\u2132 \u05DF\u0250\u0254\u0131\u0287\u0279\u01DD\u039B", "block.create.water_wheel": "\u05DF\u01DD\u01DD\u0265M \u0279\u01DD\u0287\u0250M", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 7e02b0a84..1daf3530c 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -133,6 +133,7 @@ "block.create.fancy_weathered_limestone_bricks_wall": "Fancy Weathered Limestone Bricks Wall", "block.create.fluid_pipe": "Fluid Pipe", "block.create.fluid_tank": "Fluid Tank", + "block.create.fluid_valve": "Fluid Valve", "block.create.flywheel": "Flywheel", "block.create.framed_glass": "Framed Glass", "block.create.framed_glass_pane": "Framed Glass Pane", @@ -336,6 +337,7 @@ "block.create.tiled_glass": "Tiled Glass", "block.create.tiled_glass_pane": "Tiled Glass Pane", "block.create.turntable": "Turntable", + "block.create.valve_handle": "Valve Handle", "block.create.vertical_framed_glass": "Vertical Framed Glass", "block.create.vertical_framed_glass_pane": "Vertical Framed Glass Pane", "block.create.water_wheel": "Water Wheel", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index 09c9e0774..c72d05bb9 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 805", + "_": "Missing Localizations: 807", "_": "->------------------------] Game Elements [------------------------<-", @@ -134,6 +134,7 @@ "block.create.fancy_weathered_limestone_bricks_wall": "UNLOCALIZED: Fancy Weathered Limestone Bricks Wall", "block.create.fluid_pipe": "UNLOCALIZED: Fluid Pipe", "block.create.fluid_tank": "UNLOCALIZED: Fluid Tank", + "block.create.fluid_valve": "UNLOCALIZED: Fluid Valve", "block.create.flywheel": "UNLOCALIZED: Flywheel", "block.create.framed_glass": "UNLOCALIZED: Framed Glass", "block.create.framed_glass_pane": "UNLOCALIZED: Framed Glass Pane", @@ -337,6 +338,7 @@ "block.create.tiled_glass": "Glasfliesen", "block.create.tiled_glass_pane": "Glasfliesenscheibe", "block.create.turntable": "Drehtisch", + "block.create.valve_handle": "UNLOCALIZED: Valve Handle", "block.create.vertical_framed_glass": "UNLOCALIZED: Vertical Framed Glass", "block.create.vertical_framed_glass_pane": "UNLOCALIZED: Vertical Framed Glass Pane", "block.create.water_wheel": "Wasserrad", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index 0dbeb86da..3420ffb7e 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 429", + "_": "Missing Localizations: 431", "_": "->------------------------] Game Elements [------------------------<-", @@ -134,6 +134,7 @@ "block.create.fancy_weathered_limestone_bricks_wall": "UNLOCALIZED: Fancy Weathered Limestone Bricks Wall", "block.create.fluid_pipe": "UNLOCALIZED: Fluid Pipe", "block.create.fluid_tank": "UNLOCALIZED: Fluid Tank", + "block.create.fluid_valve": "UNLOCALIZED: Fluid Valve", "block.create.flywheel": "Volant d'inertie", "block.create.framed_glass": "Grande fenêtre en verre", "block.create.framed_glass_pane": "Grande vitre encadrée", @@ -337,6 +338,7 @@ "block.create.tiled_glass": "Verre carrelé", "block.create.tiled_glass_pane": "Vitre carrelé", "block.create.turntable": "Plaque tournante", + "block.create.valve_handle": "UNLOCALIZED: Valve Handle", "block.create.vertical_framed_glass": "Fenêtre en verre verticale", "block.create.vertical_framed_glass_pane": "Vitre encadrée verticale", "block.create.water_wheel": "Roue à eau", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index 2951abe01..705586333 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 413", + "_": "Missing Localizations: 415", "_": "->------------------------] Game Elements [------------------------<-", @@ -134,6 +134,7 @@ "block.create.fancy_weathered_limestone_bricks_wall": "UNLOCALIZED: Fancy Weathered Limestone Bricks Wall", "block.create.fluid_pipe": "UNLOCALIZED: Fluid Pipe", "block.create.fluid_tank": "UNLOCALIZED: Fluid Tank", + "block.create.fluid_valve": "UNLOCALIZED: Fluid Valve", "block.create.flywheel": "Volano", "block.create.framed_glass": "Finestra Grande Vetro", "block.create.framed_glass_pane": "Pannello di Finestra Grande Vetro", @@ -337,6 +338,7 @@ "block.create.tiled_glass": "Vetro Piastrellato", "block.create.tiled_glass_pane": "Pannello di Vetro Piastrellato", "block.create.turntable": "Piatto", + "block.create.valve_handle": "UNLOCALIZED: Valve Handle", "block.create.vertical_framed_glass": "Finestra Verticale Vetro", "block.create.vertical_framed_glass_pane": "Pannello di Finestra Verticale Vetro", "block.create.water_wheel": "Ruota d'Acqua", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index 0da7ed792..a3a287baf 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 408", + "_": "Missing Localizations: 410", "_": "->------------------------] Game Elements [------------------------<-", @@ -134,6 +134,7 @@ "block.create.fancy_weathered_limestone_bricks_wall": "UNLOCALIZED: Fancy Weathered Limestone Bricks Wall", "block.create.fluid_pipe": "UNLOCALIZED: Fluid Pipe", "block.create.fluid_tank": "UNLOCALIZED: Fluid Tank", + "block.create.fluid_valve": "UNLOCALIZED: Fluid Valve", "block.create.flywheel": "勢車", "block.create.framed_glass": "大きなガラス窓", "block.create.framed_glass_pane": "大きなガラス窓板", @@ -337,6 +338,7 @@ "block.create.tiled_glass": "タイルガラス", "block.create.tiled_glass_pane": "タイルガラス板", "block.create.turntable": "ターンテーブル", + "block.create.valve_handle": "UNLOCALIZED: Valve Handle", "block.create.vertical_framed_glass": "垂直ガラス窓", "block.create.vertical_framed_glass_pane": "垂直ガラス窓板", "block.create.water_wheel": "水車", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index d0b4cc6a4..0acc022b0 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 413", + "_": "Missing Localizations: 415", "_": "->------------------------] Game Elements [------------------------<-", @@ -134,6 +134,7 @@ "block.create.fancy_weathered_limestone_bricks_wall": "UNLOCALIZED: Fancy Weathered Limestone Bricks Wall", "block.create.fluid_pipe": "UNLOCALIZED: Fluid Pipe", "block.create.fluid_tank": "UNLOCALIZED: Fluid Tank", + "block.create.fluid_valve": "UNLOCALIZED: Fluid Valve", "block.create.flywheel": "플라이휠", "block.create.framed_glass": "큰 유리", "block.create.framed_glass_pane": "큰 유리판", @@ -337,6 +338,7 @@ "block.create.tiled_glass": "타일 유리", "block.create.tiled_glass_pane": "타일 유리판", "block.create.turntable": "돌림판", + "block.create.valve_handle": "UNLOCALIZED: Valve Handle", "block.create.vertical_framed_glass": "수직 유리", "block.create.vertical_framed_glass_pane": "수직 유리판", "block.create.water_wheel": "물레방아", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index d41a674fe..876604dd5 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 743", + "_": "Missing Localizations: 745", "_": "->------------------------] Game Elements [------------------------<-", @@ -134,6 +134,7 @@ "block.create.fancy_weathered_limestone_bricks_wall": "UNLOCALIZED: Fancy Weathered Limestone Bricks Wall", "block.create.fluid_pipe": "UNLOCALIZED: Fluid Pipe", "block.create.fluid_tank": "UNLOCALIZED: Fluid Tank", + "block.create.fluid_valve": "UNLOCALIZED: Fluid Valve", "block.create.flywheel": "UNLOCALIZED: Flywheel", "block.create.framed_glass": "Ingelijst Glas", "block.create.framed_glass_pane": "UNLOCALIZED: Framed Glass Pane", @@ -337,6 +338,7 @@ "block.create.tiled_glass": "Getegeld Glas", "block.create.tiled_glass_pane": "Getegeld Glazen Paneel", "block.create.turntable": "Draaischijf", + "block.create.valve_handle": "UNLOCALIZED: Valve Handle", "block.create.vertical_framed_glass": "UNLOCALIZED: Vertical Framed Glass", "block.create.vertical_framed_glass_pane": "UNLOCALIZED: Vertical Framed Glass Pane", "block.create.water_wheel": "Waterrad", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index 85dbbd4b5..a83331be0 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 812", + "_": "Missing Localizations: 814", "_": "->------------------------] Game Elements [------------------------<-", @@ -134,6 +134,7 @@ "block.create.fancy_weathered_limestone_bricks_wall": "UNLOCALIZED: Fancy Weathered Limestone Bricks Wall", "block.create.fluid_pipe": "UNLOCALIZED: Fluid Pipe", "block.create.fluid_tank": "UNLOCALIZED: Fluid Tank", + "block.create.fluid_valve": "UNLOCALIZED: Fluid Valve", "block.create.flywheel": "UNLOCALIZED: Flywheel", "block.create.framed_glass": "UNLOCALIZED: Framed Glass", "block.create.framed_glass_pane": "UNLOCALIZED: Framed Glass Pane", @@ -337,6 +338,7 @@ "block.create.tiled_glass": "Vidro Entalhado", "block.create.tiled_glass_pane": "Vidraça Entalhada", "block.create.turntable": "Mesa giratória", + "block.create.valve_handle": "UNLOCALIZED: Valve Handle", "block.create.vertical_framed_glass": "UNLOCALIZED: Vertical Framed Glass", "block.create.vertical_framed_glass_pane": "UNLOCALIZED: Vertical Framed Glass Pane", "block.create.water_wheel": "Roda de Água", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index a1b2f184b..6844d5fea 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 806", + "_": "Missing Localizations: 808", "_": "->------------------------] Game Elements [------------------------<-", @@ -134,6 +134,7 @@ "block.create.fancy_weathered_limestone_bricks_wall": "UNLOCALIZED: Fancy Weathered Limestone Bricks Wall", "block.create.fluid_pipe": "UNLOCALIZED: Fluid Pipe", "block.create.fluid_tank": "UNLOCALIZED: Fluid Tank", + "block.create.fluid_valve": "UNLOCALIZED: Fluid Valve", "block.create.flywheel": "UNLOCALIZED: Flywheel", "block.create.framed_glass": "UNLOCALIZED: Framed Glass", "block.create.framed_glass_pane": "UNLOCALIZED: Framed Glass Pane", @@ -337,6 +338,7 @@ "block.create.tiled_glass": "Плиточное стекло", "block.create.tiled_glass_pane": "Плиточная стеклянная панель", "block.create.turntable": "Поворотный стол", + "block.create.valve_handle": "UNLOCALIZED: Valve Handle", "block.create.vertical_framed_glass": "UNLOCALIZED: Vertical Framed Glass", "block.create.vertical_framed_glass_pane": "UNLOCALIZED: Vertical Framed Glass Pane", "block.create.water_wheel": "Водяное колесо", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index a71cef0e7..863fb68e4 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 93", + "_": "Missing Localizations: 95", "_": "->------------------------] Game Elements [------------------------<-", @@ -134,6 +134,7 @@ "block.create.fancy_weathered_limestone_bricks_wall": "方纹风化石灰岩砖墙", "block.create.fluid_pipe": "UNLOCALIZED: Fluid Pipe", "block.create.fluid_tank": "UNLOCALIZED: Fluid Tank", + "block.create.fluid_valve": "UNLOCALIZED: Fluid Valve", "block.create.flywheel": "飞轮", "block.create.framed_glass": "边框玻璃", "block.create.framed_glass_pane": "边框玻璃板", @@ -337,6 +338,7 @@ "block.create.tiled_glass": "十字玻璃窗", "block.create.tiled_glass_pane": "十字玻璃窗板", "block.create.turntable": "转盘", + "block.create.valve_handle": "UNLOCALIZED: Valve Handle", "block.create.vertical_framed_glass": "竖直边框玻璃", "block.create.vertical_framed_glass_pane": "竖直边框玻璃板", "block.create.water_wheel": "水车", diff --git a/src/generated/resources/assets/create/models/item/fluid_valve.json b/src/generated/resources/assets/create/models/item/fluid_valve.json new file mode 100644 index 000000000..b31acf275 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/fluid_valve.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/fluid_valve/item" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/valve_handle.json b/src/generated/resources/assets/create/models/item/valve_handle.json new file mode 100644 index 000000000..716895f8c --- /dev/null +++ b/src/generated/resources/assets/create/models/item/valve_handle.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/valve_handle" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/fluid_valve.json b/src/generated/resources/data/create/loot_tables/blocks/fluid_valve.json new file mode 100644 index 000000000..3dc9088e1 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/fluid_valve.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:fluid_valve" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/valve_handle.json b/src/generated/resources/data/create/loot_tables/blocks/valve_handle.json new file mode 100644 index 000000000..940044950 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/valve_handle.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:valve_handle" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/tags/blocks/brittle.json b/src/generated/resources/data/create/tags/blocks/brittle.json index ca0269645..a639c5622 100644 --- a/src/generated/resources/data/create/tags/blocks/brittle.json +++ b/src/generated/resources/data/create/tags/blocks/brittle.json @@ -3,6 +3,7 @@ "values": [ "create:nozzle", "create:hand_crank", + "create:valve_handle", "create:rope", "create:pulley_magnet", "create:furnace_engine", diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index 492ee1335..9bbae39ee 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -68,7 +68,7 @@ public class AllBlockPartials { SYMMETRY_PLANE = get("symmetry_effect/plane"), SYMMETRY_CROSSPLANE = get("symmetry_effect/crossplane"), SYMMETRY_TRIPLEPLANE = get("symmetry_effect/tripleplane"), - + PORTABLE_STORAGE_INTERFACE_MIDDLE = get("portable_storage_interface/block_middle"), PORTABLE_STORAGE_INTERFACE_MIDDLE_POWERED = get("portable_storage_interface/block_middle_powered"), PORTABLE_STORAGE_INTERFACE_TOP = get("portable_storage_interface/block_top"), @@ -82,7 +82,7 @@ public class AllBlockPartials { FLAG_LONG_IN = get("mechanical_arm/flag/long_in"), FLAG_LONG_OUT = get("mechanical_arm/flag/long_out"), MECHANICAL_PUMP_ARROW = get("mechanical_pump/arrow"), MECHANICAL_PUMP_COG = get("mechanical_pump/cog"), - FLUID_PIPE_CASING = get("fluid_pipe/casing"), + FLUID_PIPE_CASING = get("fluid_pipe/casing"), FLUID_VALVE_POINTER = get("fluid_valve/pointer"), SPOUT_TOP = get("spout/top"), SPOUT_MIDDLE = get("spout/middle"), SPOUT_BOTTOM = get("spout/bottom"), @@ -161,6 +161,11 @@ public class AllBlockPartials { return CreateClient.bufferCache.renderPartial(this, referenceState); } + public SuperByteBuffer renderOnDirectionalSouth(BlockState referenceState) { + Direction facing = referenceState.get(FACING); + return renderOnDirectionalSouth(referenceState, facing); + } + public SuperByteBuffer renderOnDirectional(BlockState referenceState) { Direction facing = referenceState.get(FACING); return renderOnDirectional(referenceState, facing); @@ -168,10 +173,10 @@ public class AllBlockPartials { public SuperByteBuffer renderOnHorizontal(BlockState referenceState) { Direction facing = referenceState.get(HORIZONTAL_FACING); - return renderOnDirectional(referenceState, facing); + return renderOnDirectionalSouth(referenceState, facing); } - public SuperByteBuffer renderOnDirectional(BlockState referenceState, Direction facing) { + public SuperByteBuffer renderOnDirectionalSouth(BlockState referenceState, Direction facing) { MatrixStack ms = new MatrixStack(); // TODO 1.15 find a way to cache this model matrix computation MatrixStacker.of(ms) @@ -182,4 +187,15 @@ public class AllBlockPartials { return CreateClient.bufferCache.renderDirectionalPartial(this, referenceState, facing, ms); } + public SuperByteBuffer renderOnDirectional(BlockState referenceState, Direction facing) { + MatrixStack ms = new MatrixStack(); + // TODO 1.15 find a way to cache this model matrix computation + MatrixStacker.of(ms) + .centre() + .rotateY(AngleHelper.horizontalAngle(facing)) + .rotateX(facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90) + .unCentre(); + return CreateClient.bufferCache.renderDirectionalPartial(this, referenceState, facing, ms); + } + } diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index a73c72662..3514f9fb9 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -28,6 +28,7 @@ import com.simibubi.create.content.contraptions.components.clock.CuckooClockBloc 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.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; @@ -65,6 +66,7 @@ import com.simibubi.create.content.contraptions.fluids.PumpBlock; import com.simibubi.create.content.contraptions.fluids.actors.SpoutBlock; import com.simibubi.create.content.contraptions.fluids.pipes.EncasedPipeBlock; import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeBlock; +import com.simibubi.create.content.contraptions.fluids.pipes.FluidValveBlock; import com.simibubi.create.content.contraptions.fluids.pipes.GlassFluidPipeBlock; import com.simibubi.create.content.contraptions.fluids.tank.FluidTankBlock; import com.simibubi.create.content.contraptions.fluids.tank.FluidTankGenerator; @@ -491,6 +493,24 @@ public class AllBlocks { .transform(customItemModel()) .register(); + public static final BlockEntry FLUID_VALVE = REGISTRATE.block("fluid_valve", FluidValveBlock::new) + .initialProperties(SharedProperties::softMetal) + .blockstate((c, p) -> BlockStateGen.directionalAxisBlock(c, p, + (state, vertical) -> AssetLookup.partialBaseModel(c, p, vertical ? "vertical" : "horizontal", + state.get(FluidValveBlock.ENABLED) ? "open" : "closed"))) + .onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::new)) + .item() + .transform(customItemModel()) + .register(); + + public static final BlockEntry VALVE_HANDLE = REGISTRATE.block("valve_handle", ValveHandleBlock::new) + .initialProperties(SharedProperties::softMetal) + .blockstate(BlockStateGen.directionalBlockProvider(false)) + .transform(StressConfigDefaults.setCapacity(32.0)) + .tag(AllBlockTags.BRITTLE.tag) + .simpleItem() + .register(); + public static final BlockEntry FLUID_TANK = REGISTRATE.block("fluid_tank", FluidTankBlock::new) .initialProperties(SharedProperties::softMetal) .properties(Block.Properties::nonOpaque) diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index f78e208ea..f8b275fe1 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -47,6 +47,8 @@ public class AllShapes { .forDirectional(), CRANK = shape(5, 0, 5, 11, 6, 11).add(1, 3, 1, 15, 8, 15) .forDirectional(), + VALVE_HANDLE = shape(1, 0, 1, 15, 5, 15) + .forDirectional(), CART_ASSEMBLER = shape(0, 12, 0, 16, 16, 16).add(-2, 0, 1, 18, 14, 15) .forHorizontalAxis(), STOCKPILE_SWITCH = shape(0, 0, 0, 16, 2, 16).add(1, 0, 1, 15, 16, 15) @@ -77,6 +79,8 @@ public class AllShapes { .add(2, -4, 6, 14, 14, 10) .add(0, -5, 0, 16, 16, 6) .forHorizontal(NORTH), + FLUID_VALVE = shape(3, -1, 3, 13, 17, 13).add(2, 2, 2, 14, 14, 14) + .forAxis(), PUMP = shape(2, 0, 2, 14, 5, 14).add(4, 0, 4, 12, 16, 12) .add(3, 12, 3, 13, 16, 13) .forDirectional(Direction.UP) diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 2af986739..77ae674b0 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -50,6 +50,8 @@ import com.simibubi.create.content.contraptions.fluids.PumpTileEntity; import com.simibubi.create.content.contraptions.fluids.actors.SpoutRenderer; import com.simibubi.create.content.contraptions.fluids.actors.SpoutTileEntity; import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeTileEntity; +import com.simibubi.create.content.contraptions.fluids.pipes.FluidValveRenderer; +import com.simibubi.create.content.contraptions.fluids.pipes.FluidValveTileEntity; import com.simibubi.create.content.contraptions.fluids.pipes.StraightPipeTileEntity; import com.simibubi.create.content.contraptions.fluids.pipes.TransparentStraightPipeRenderer; import com.simibubi.create.content.contraptions.fluids.tank.FluidTankRenderer; @@ -182,7 +184,7 @@ public class AllTileEntities { public static final TileEntityEntry HAND_CRANK = Create.registrate() .tileEntity("hand_crank", HandCrankTileEntity::new) - .validBlocks(AllBlocks.HAND_CRANK) + .validBlocks(AllBlocks.HAND_CRANK, AllBlocks.VALVE_HANDLE) .renderer(() -> HandCrankRenderer::new) .register(); @@ -213,6 +215,12 @@ public class AllTileEntities { .validBlocks(AllBlocks.GLASS_FLUID_PIPE) .renderer(() -> TransparentStraightPipeRenderer::new) .register(); + + public static final TileEntityEntry FLUID_VALVE = Create.registrate() + .tileEntity("fluid_valve", FluidValveTileEntity::new) + .validBlocks(AllBlocks.FLUID_VALVE) + .renderer(() -> FluidValveRenderer::new) + .register(); public static final TileEntityEntry FLUID_TANK = Create.registrate() .tileEntity("fluid_tank", FluidTankTileEntity::new) diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/DirectionalAxisKineticBlock.java b/src/main/java/com/simibubi/create/content/contraptions/base/DirectionalAxisKineticBlock.java index dd623508c..e3e4bc013 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/DirectionalAxisKineticBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/DirectionalAxisKineticBlock.java @@ -1,5 +1,8 @@ package com.simibubi.create.content.contraptions.base; +import com.simibubi.create.foundation.utility.DirectionHelper; +import com.simibubi.create.foundation.utility.Iterate; + import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.item.BlockItemUseContext; @@ -46,49 +49,38 @@ public abstract class DirectionalAxisKineticBlock extends DirectionalKineticBloc BlockPos pos = context.getPos(); World world = context.getWorld(); boolean alongFirst = false; + Axis faceAxis = facing.getAxis(); - if (facing.getAxis() - .isHorizontal()) { - alongFirst = facing.getAxis() == Axis.Z; + if (faceAxis.isHorizontal()) { + alongFirst = faceAxis == Axis.Z; + Direction positivePerpendicular = DirectionHelper.getPositivePerpendicular(faceAxis); - Block blockAbove = world.getBlockState(pos.offset(Direction.UP)) - .getBlock(); - boolean shaftAbove = blockAbove instanceof IRotate && ((IRotate) blockAbove).hasShaftTowards(world, - pos.up(), world.getBlockState(pos.up()), Direction.DOWN); - Block blockBelow = world.getBlockState(pos.offset(Direction.DOWN)) - .getBlock(); - boolean shaftBelow = blockBelow instanceof IRotate && ((IRotate) blockBelow).hasShaftTowards(world, - pos.down(), world.getBlockState(pos.down()), Direction.UP); + boolean shaftAbove = prefersConnectionTo(world, pos, Direction.UP, true); + boolean shaftBelow = prefersConnectionTo(world, pos, Direction.DOWN, true); + boolean preferLeft = prefersConnectionTo(world, pos, positivePerpendicular, false); + boolean preferRight = prefersConnectionTo(world, pos, positivePerpendicular.getOpposite(), false); - if (shaftAbove || shaftBelow) - alongFirst = facing.getAxis() == Axis.X; + if (shaftAbove || shaftBelow || preferLeft || preferRight) + alongFirst = faceAxis == Axis.X; } - if (facing.getAxis() - .isVertical()) { + if (faceAxis.isVertical()) { alongFirst = getAxisAlignmentForPlacement(context); Direction prefferedSide = null; - for (Direction side : Direction.values()) { - if (side.getAxis() - .isVertical()) + + for (Direction side : Iterate.horizontalDirections) { + if (!prefersConnectionTo(world, pos, side, true) + && !prefersConnectionTo(world, pos, side.rotateY(), false)) continue; - BlockState blockState = context.getWorld() - .getBlockState(context.getPos() - .offset(side)); - if (blockState.getBlock() instanceof IRotate) { - if (((IRotate) blockState.getBlock()).hasShaftTowards(context.getWorld(), context.getPos() - .offset(side), blockState, side.getOpposite())) - if (prefferedSide != null && prefferedSide.getAxis() != side.getAxis()) { - prefferedSide = null; - break; - } else { - prefferedSide = side; - } + if (prefferedSide != null && prefferedSide.getAxis() != side.getAxis()) { + prefferedSide = null; + break; } + prefferedSide = side; } - if (prefferedSide != null) { + + if (prefferedSide != null) alongFirst = prefferedSide.getAxis() == Axis.X; - } } return this.getDefaultState() @@ -96,6 +88,16 @@ public abstract class DirectionalAxisKineticBlock extends DirectionalKineticBloc .with(AXIS_ALONG_FIRST_COORDINATE, alongFirst); } + protected boolean prefersConnectionTo(IWorldReader reader, BlockPos pos, Direction facing, boolean shaftAxis) { + if (!shaftAxis) + return false; + BlockPos neighbourPos = pos.offset(facing); + BlockState blockState = reader.getBlockState(neighbourPos); + Block block = blockState.getBlock(); + return block instanceof IRotate + && ((IRotate) block).hasShaftTowards(reader, neighbourPos, blockState, facing.getOpposite()); + } + @Override public Axis getRotationAxis(BlockState state) { Axis pistonAxis = state.get(FACING) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java index 2ff91b4b0..40945edf1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java @@ -27,11 +27,11 @@ public class DrillRenderer extends KineticTileEntityRenderer { @Override protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { - return AllBlockPartials.DRILL_HEAD.renderOnDirectional(te.getBlockState()); + return AllBlockPartials.DRILL_HEAD.renderOnDirectionalSouth(te.getBlockState()); } protected static SuperByteBuffer getRotatingModel(BlockState state) { - return AllBlockPartials.DRILL_HEAD.renderOnDirectional(state); + return AllBlockPartials.DRILL_HEAD.renderOnDirectionalSouth(state); } public static void renderInContraption(MovementContext context, MatrixStack ms, MatrixStack msLocal, diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java index 06eabc2fd..7fc799514 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java @@ -13,7 +13,10 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.MathHelper; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.IItemHandlerModifiable; @@ -79,6 +82,12 @@ public class PortableStorageInterfaceTileEntity extends SmartTileEntity { compound.putInt("Timer", transferTimer); compound.putFloat("Distance", distance); } + + @Override + @OnlyIn(Dist.CLIENT) + public AxisAlignedBB getRenderBoundingBox() { + return super.getRenderBoundingBox().grow(2); + } public boolean isTransferring() { return transferTimer != 0; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java index b99b6d784..6e8250e35 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java @@ -95,7 +95,7 @@ public class CuckooClockRenderer extends KineticTileEntityRenderer { } private SuperByteBuffer transform(AllBlockPartials partial, KineticTileEntity te) { - return partial.renderOnDirectional(te.getBlockState(), te.getBlockState() + return partial.renderOnDirectionalSouth(te.getBlockState(), te.getBlockState() .get(CuckooClockBlock.HORIZONTAL_FACING) .getOpposite()); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankBlock.java index da13c072d..7df494c09 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankBlock.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.contraptions.components.crank; +import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock; @@ -22,6 +23,8 @@ import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; public class HandCrankBlock extends DirectionalKineticBlock implements ITE { @@ -33,6 +36,15 @@ public class HandCrankBlock extends DirectionalKineticBlock implements ITE { protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { BlockState state = te.getBlockState(); if (state.get(FACING).getAxis().isHorizontal()) - return AllBlockPartials.SHAFT_HALF.renderOnDirectional(state.rotate(Rotation.CLOCKWISE_180)); + return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouth(state.rotate(Rotation.CLOCKWISE_180)); return CreateClient.bufferCache.renderBlockIn(KineticTileEntityRenderer.KINETIC_TILE, getRenderedBlockState(te)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java index eb3584ff4..82c793e94 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java @@ -42,7 +42,7 @@ public class BearingRenderer extends KineticTileEntityRenderer { @Override protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { - return AllBlockPartials.SHAFT_HALF.renderOnDirectional(te.getBlockState(), te.getBlockState() + return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouth(te.getBlockState(), te.getBlockState() .get(BearingBlock.FACING) .getOpposite()); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java index bc1de8681..9994c52ec 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java @@ -77,7 +77,7 @@ public class PulleyRenderer extends KineticTileEntityRenderer { @Override protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { BlockState blockState = te.getBlockState(); - return AllBlockPartials.ROPE_COIL.renderOnDirectional(blockState, horizontalFacing(blockState)); + return AllBlockPartials.ROPE_COIL.renderOnDirectionalSouth(blockState, horizontalFacing(blockState)); } public Direction horizontalFacing(BlockState blockState) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidNetwork.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidNetwork.java index 0e9492909..9fcdb4b3e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidNetwork.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidNetwork.java @@ -10,6 +10,7 @@ import java.util.Map; import java.util.Set; import com.google.common.collect.ImmutableList; +import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.foundation.utility.BlockFace; import com.simibubi.create.foundation.utility.Pair; @@ -218,6 +219,9 @@ public class FluidNetwork { continue; for (Direction face : FluidPropagator.getPipeConnections(currentState, pipe)) { + if (!pipe.canTransferToward(FluidStack.EMPTY, world.getBlockState(currentPos), face, false)) + continue; + BlockFace blockFace = new BlockFace(currentPos, face); BlockPos connectedPos = blockFace.getConnectedPos(); @@ -229,7 +233,8 @@ public class FluidNetwork { continue; if (collectEndpoint(world, blockFace, openEnds, distance)) continue; - if (FluidPropagator.getPipe(world, connectedPos) == null) + FluidPipeBehaviour pipeBehaviour = FluidPropagator.getPipe(world, connectedPos); + if (pipeBehaviour == null) continue; if (visited.contains(connectedPos)) continue; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidNetworkFlow.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidNetworkFlow.java index 9c861bb2e..7e630a56f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidNetworkFlow.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidNetworkFlow.java @@ -218,6 +218,8 @@ class FluidNetworkFlow { if (entry.getValue() != pulling) continue; Direction face = entry.getKey(); + if (!pipe.canTransferToward(fluidStack, state, face, false)) + continue; BlockFace addedBlockFace = new BlockFace(currentPos.offset(face), face.getOpposite()); if (skipping && !canSkip(previousFlow, addedBlockFace)) { allFlowsComplete = false; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPropagator.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPropagator.java index 066750b38..8345cf985 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPropagator.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPropagator.java @@ -14,6 +14,7 @@ import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeBlock; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.utility.BlockFace; +import com.simibubi.create.foundation.utility.Debug; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.outliner.Outline.OutlineParams; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java index 579445cb8..ff887c908 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java @@ -45,14 +45,14 @@ public class PumpRenderer extends KineticTileEntityRenderer { .rotateY(yRot) .rotateZ(angle) .translateBack(rotationOffset); - arrow.renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + arrow.light(light).renderInto(ms, buffer.getBuffer(RenderType.getSolid())); ms.pop(); } } @Override protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { - return AllBlockPartials.MECHANICAL_PUMP_COG.renderOnDirectional(te.getBlockState()); + return AllBlockPartials.MECHANICAL_PUMP_COG.renderOnDirectionalSouth(te.getBlockState()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java index 3933cae55..552858f1e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java @@ -89,8 +89,7 @@ public class SpoutTileEntity extends SmartTileEntity { if (processingTicks == -1) { processingTicks = FILLING_TIME; - markDirty(); - sendData(); + notifyUpdate(); return HOLD; } @@ -109,8 +108,7 @@ public class SpoutTileEntity extends SmartTileEntity { tank.getPrimaryHandler().setFluid(fluid); sendSplash = true; - markDirty(); - sendData(); + notifyUpdate(); return PASS; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveBlock.java new file mode 100644 index 000000000..c56476060 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveBlock.java @@ -0,0 +1,73 @@ +package com.simibubi.create.content.contraptions.fluids.pipes; + +import com.simibubi.create.AllShapes; +import com.simibubi.create.AllTileEntities; +import com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock; +import com.simibubi.create.foundation.utility.Iterate; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.state.BooleanProperty; +import net.minecraft.state.StateContainer.Builder; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.IWorldReader; + +public class FluidValveBlock extends DirectionalAxisKineticBlock { + + public static final BooleanProperty ENABLED = BooleanProperty.create("enabled"); + + public FluidValveBlock(Properties properties) { + super(properties); + setDefaultState(getDefaultState().with(ENABLED, false)); + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_, + ISelectionContext p_220053_4_) { + return AllShapes.FLUID_VALVE.get(getPipeAxis(state)); + } + + @Override + protected void fillStateContainer(Builder builder) { + super.fillStateContainer(builder.add(ENABLED)); + } + + @Override + protected boolean prefersConnectionTo(IWorldReader reader, BlockPos pos, Direction facing, boolean shaftAxis) { + if (!shaftAxis) { + BlockPos offset = pos.offset(facing); + BlockState blockState = reader.getBlockState(offset); + return FluidPipeBlock.canConnectTo(reader, offset, blockState, facing); + } + return super.prefersConnectionTo(reader, pos, facing, shaftAxis); + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.FLUID_VALVE.create(); + } + + public static Axis getPipeAxis(BlockState state) { + if (!(state.getBlock() instanceof FluidValveBlock)) + return null; + Direction facing = state.get(FACING); + boolean alongFirst = !state.get(AXIS_ALONG_FIRST_COORDINATE); + for (Axis axis : Iterate.axes) { + if (axis == facing.getAxis()) + continue; + if (!alongFirst) { + alongFirst = true; + continue; + } + return axis; + } + return null; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java new file mode 100644 index 000000000..c50f78bb4 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java @@ -0,0 +1,60 @@ +package com.simibubi.create.content.contraptions.fluids.pipes; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.MatrixStacker; +import com.simibubi.create.foundation.utility.SuperByteBuffer; + +import net.minecraft.block.BlockState; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.math.MathHelper; + +public class FluidValveRenderer extends KineticTileEntityRenderer { + + public FluidValveRenderer(TileEntityRendererDispatcher dispatcher) { + super(dispatcher); + } + + @Override + protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, + int light, int overlay) { + super.renderSafe(te, partialTicks, ms, buffer, light, overlay); + BlockState blockState = te.getBlockState(); + SuperByteBuffer pointer = AllBlockPartials.FLUID_VALVE_POINTER.renderOn(blockState); + Direction facing = blockState.get(FluidValveBlock.FACING); + + if (!(te instanceof FluidValveTileEntity)) + return; + FluidValveTileEntity valve = (FluidValveTileEntity) te; + float pointerRotation = MathHelper.lerp(valve.pointer.getValue(partialTicks), 0, -90); + Axis pipeAxis = FluidValveBlock.getPipeAxis(blockState); + Axis shaftAxis = KineticTileEntityRenderer.getRotationAxisOf(te); + + int pointerRotationOffset = 0; + if (pipeAxis.isHorizontal() && shaftAxis == Axis.Z || pipeAxis.isVertical()) + pointerRotationOffset = 90; + + MatrixStacker.of(ms) + .centre() + .rotateY(AngleHelper.horizontalAngle(facing)) + .rotateX(facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90) + .rotateY(pointerRotationOffset + pointerRotation) + .unCentre(); + + pointer.light(light) + .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + } + + @Override + protected BlockState getRenderedBlockState(KineticTileEntity te) { + return KineticTileEntityRenderer.shaft(KineticTileEntityRenderer.getRotationAxisOf(te)); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveTileEntity.java new file mode 100644 index 000000000..b3d3efc27 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveTileEntity.java @@ -0,0 +1,128 @@ +package com.simibubi.create.content.contraptions.fluids.pipes; + +import java.util.List; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.fluids.FluidPipeAttachmentBehaviour; +import com.simibubi.create.content.contraptions.fluids.FluidPipeBehaviour; +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.utility.LerpedFloat; +import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; + +import net.minecraft.block.BlockState; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.AxisDirection; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.ILightReader; +import net.minecraftforge.fluids.FluidStack; + +public class FluidValveTileEntity extends KineticTileEntity { + + LerpedFloat pointer; + + public FluidValveTileEntity(TileEntityType tileEntityTypeIn) { + super(tileEntityTypeIn); + pointer = LerpedFloat.linear() + .startWithValue(0).chase(0, 0, Chaser.LINEAR); + } + + @Override + public void onSpeedChanged(float previousSpeed) { + super.onSpeedChanged(previousSpeed); + float speed = getSpeed(); + pointer.chase(speed > 0 ? 1 : 0, getChaseSpeed(), Chaser.LINEAR); + sendData(); + } + + @Override + public void tick() { + super.tick(); + pointer.tickChaser(); + + if (world.isRemote) + return; + + BlockState blockState = getBlockState(); + if (!(blockState.getBlock() instanceof FluidValveBlock)) + return; + boolean stateOpen = blockState.get(FluidValveBlock.ENABLED); + + if (stateOpen && pointer.getValue() == 0) { + switchToBlockState(world, pos, blockState.with(FluidValveBlock.ENABLED, false)); + return; + } + if (!stateOpen && pointer.getValue() == 1) { + switchToBlockState(world, pos, blockState.with(FluidValveBlock.ENABLED, true)); + return; + } + } + + private float getChaseSpeed() { + return MathHelper.clamp(Math.abs(getSpeed()) / 16 / 20, 0, 1); + } + + @Override + protected void write(CompoundNBT compound, boolean clientPacket) { + super.write(compound, clientPacket); + compound.put("Pointer", pointer.writeNBT()); + } + + @Override + protected void read(CompoundNBT compound, boolean clientPacket) { + super.read(compound, clientPacket); + pointer.readNBT(compound.getCompound("Pointer"), clientPacket); + } + + @Override + public void addBehaviours(List behaviours) { + behaviours.add(new ValvePipeBehaviour(this)); + behaviours.add(new ValvePipeAttachmentBehaviour(this)); + } + + class ValvePipeBehaviour extends FluidPipeBehaviour { + + public ValvePipeBehaviour(SmartTileEntity te) { + super(te); + } + + @Override + public boolean isConnectedTo(BlockState state, Direction direction) { + return FluidValveBlock.getPipeAxis(state) == direction.getAxis(); + } + + @Override + public boolean canTransferToward(FluidStack fluid, BlockState state, Direction direction, boolean inbound) { + if (state.has(FluidValveBlock.ENABLED) && state.get(FluidValveBlock.ENABLED)) + return super.canTransferToward(fluid, state, direction, inbound); + return false; + } + + } + + class ValvePipeAttachmentBehaviour extends FluidPipeAttachmentBehaviour { + + public ValvePipeAttachmentBehaviour(SmartTileEntity te) { + super(te); + } + + @Override + public AttachmentTypes getAttachment(ILightReader world, BlockPos pos, BlockState state, Direction direction) { + AttachmentTypes attachment = super.getAttachment(world, pos, state, direction); + + BlockState facingState = world.getBlockState(pos.offset(direction)); + if (AllBlocks.FLUID_VALVE.has(facingState) + && FluidValveBlock.getPipeAxis(facingState) == FluidValveBlock.getPipeAxis(state) + && direction.getAxisDirection() == AxisDirection.NEGATIVE) + return AttachmentTypes.NONE; + + return attachment; + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/GlassFluidPipeBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/GlassFluidPipeBlock.java index 83f3bae69..33d1dad10 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/GlassFluidPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/GlassFluidPipeBlock.java @@ -36,19 +36,18 @@ public class GlassFluidPipeBlock extends AxisPipeBlock { public TileEntity createTileEntity(BlockState state, IBlockReader world) { return AllTileEntities.GLASS_FLUID_PIPE.create(); } - + @Override public ActionResultType onWrenched(BlockState state, ItemUseContext context) { BlockState newState = state; World world = context.getWorld(); BlockPos pos = context.getPos(); - if (!state.get(ALT)) - newState = state.with(ALT, true); - else - newState = toRegularPipe(world, pos, state); +// if (!state.get(ALT)) +// newState = state.with(ALT, true); +// else + newState = toRegularPipe(world, pos, state); world.setBlockState(pos, newState, 3); return ActionResultType.SUCCESS; } - } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/StraightPipeTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/StraightPipeTileEntity.java index b5e273f5b..3a19835f9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/StraightPipeTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/StraightPipeTileEntity.java @@ -56,6 +56,10 @@ public class StraightPipeTileEntity extends SmartTileEntity { return AttachmentTypes.NONE; } } + if (otherState.getBlock() instanceof FluidValveBlock + && FluidValveBlock.getPipeAxis(otherState) == direction.getAxis()) + return AttachmentTypes.NONE; + return attachment; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java index 447181e64..e9e232abd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java @@ -3,6 +3,9 @@ package com.simibubi.create.content.contraptions.processing; import java.util.Random; import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.fluid.FluidRenderer; +import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour.TankSegment; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; import com.simibubi.create.foundation.utility.VecHelper; @@ -13,7 +16,9 @@ import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; +import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemStackHandler; @@ -28,6 +33,8 @@ public class BasinRenderer extends SmartTileEntityRenderer { int light, int overlay) { super.renderSafe(basin, partialTicks, ms, buffer, light, overlay); + float fluidSurface = renderFluids(basin, partialTicks, ms, buffer, light, overlay); + ms.push(); BlockPos pos = basin.getPos(); ms.translate(.5, .2f, .5); @@ -57,4 +64,58 @@ public class BasinRenderer extends SmartTileEntityRenderer { } + protected float renderFluids(BasinTileEntity basin, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, + int light, int overlay) { + SmartFluidTankBehaviour inputFluids = basin.getBehaviour(SmartFluidTankBehaviour.INPUT); + SmartFluidTankBehaviour outputFluids = basin.getBehaviour(SmartFluidTankBehaviour.OUTPUT); + SmartFluidTankBehaviour[] tanks = { inputFluids, outputFluids }; + int renderedFluids = 0; + float totalUnits = 0; + + for (SmartFluidTankBehaviour behaviour : tanks) { + if (behaviour == null) + continue; + for (TankSegment tankSegment : behaviour.getTanks()) { + if (tankSegment.getRenderedFluid() + .isEmpty()) + continue; + totalUnits += tankSegment.getTotalUnits(partialTicks); + renderedFluids++; + } + } + + if (renderedFluids == 0) + return 0; + if (totalUnits == 0) + return 0; + + float fluidLevel = MathHelper.clamp(totalUnits / 2000, 0, 1); + + float xMin = 2 / 16f; + float xMax = 2 / 16f; + final float yMin = 2 / 16f; + final float yMax = yMin + 12 / 16f * fluidLevel; + final float zMin = 2 / 16f; + final float zMax = 14 / 16f; + + for (SmartFluidTankBehaviour behaviour : tanks) { + if (behaviour == null) + continue; + for (TankSegment tankSegment : behaviour.getTanks()) { + FluidStack renderedFluid = tankSegment.getRenderedFluid(); + if (renderedFluid.isEmpty()) + continue; + + float partial = tankSegment.getTotalUnits(partialTicks) / totalUnits; + xMax += partial * 12 / 16f; + FluidRenderer.renderTiledFluidBB(renderedFluid, xMin, yMin, zMin, xMax, yMax, zMax, buffer, ms, light, + false); + + xMin = xMax; + } + } + + return fluidLevel; + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java index 48565aa16..1c28f9a3a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java @@ -114,6 +114,7 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt @Override public void tick() { + super.tick(); if (!contentsChanged) return; contentsChanged = false; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java index 6d04e0b0e..f2f4a7bfa 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java @@ -47,7 +47,7 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer { angle = angle / 180f * (float) Math.PI; SuperByteBuffer superByteBuffer = - AllBlockPartials.SHAFT_HALF.renderOnDirectional(te.getBlockState(), direction); + AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouth(te.getBlockState(), direction); kineticRotationTransform(superByteBuffer, te, axis, angle, light); superByteBuffer.renderInto(ms, buffer.getBuffer(RenderType.getSolid())); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java index 2983b8673..e1a9211ea 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java @@ -33,7 +33,7 @@ public class GearboxRenderer extends KineticTileEntityRenderer { if (boxAxis == axis) continue; - SuperByteBuffer shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectional(te.getBlockState(), direction); + SuperByteBuffer shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouth(te.getBlockState(), direction); float offset = getRotationOffsetForPosition(te, pos, axis); float angle = (time * te.getSpeed() * 3f / 10) % 360; diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java index 03b111842..810f84b60 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java @@ -54,7 +54,7 @@ public class SmartFluidTankBehaviour extends TileEntityBehaviour { this.tanks[i] = tankSegment; handlers[i] = tankSegment.tank; } - capability = LazyOptional.of(() -> new InternalFluidHandler(handlers)); + capability = LazyOptional.of(() -> new InternalFluidHandler(handlers, enforceVariety)); } public SmartFluidTankBehaviour allowInsertion() { @@ -177,7 +177,7 @@ public class SmartFluidTankBehaviour extends TileEntityBehaviour { class InternalFluidHandler extends CombinedTankWrapper { - public InternalFluidHandler(IFluidHandler[] handlers) { + public InternalFluidHandler(IFluidHandler[] handlers, boolean enforceVariety) { super(handlers); if (enforceVariety) enforceVariety(); @@ -235,6 +235,10 @@ public class SmartFluidTankBehaviour extends TileEntityBehaviour { public LerpedFloat getFluidLevel() { return fluidLevel; } + + public float getTotalUnits(float partialTicks) { + return fluidLevel.getValue(partialTicks) * tank.getCapacity(); + } public CompoundNBT writeNBT() { CompoundNBT compound = new CompoundNBT(); diff --git a/src/main/java/com/simibubi/create/foundation/utility/DirectionHelper.java b/src/main/java/com/simibubi/create/foundation/utility/DirectionHelper.java index e9bd8eea0..17f134c80 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/DirectionHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/DirectionHelper.java @@ -8,6 +8,7 @@ import static net.minecraft.util.Direction.UP; import static net.minecraft.util.Direction.WEST; import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; /** * A bunch of methods that got stripped out of Direction in 1.15 @@ -73,4 +74,9 @@ public class DirectionHelper { return WEST; } } + + public static Direction getPositivePerpendicular(Axis horizontalAxis) { + return horizontalAxis == Axis.X ? SOUTH : EAST; + } + } diff --git a/src/main/resources/assets/create/models/block/deployer/vertical.json b/src/main/resources/assets/create/models/block/deployer/vertical.json index e65b29b4f..3dda75643 100644 --- a/src/main/resources/assets/create/models/block/deployer/vertical.json +++ b/src/main/resources/assets/create/models/block/deployer/vertical.json @@ -7,7 +7,8 @@ "7": "create:block/piston_inner", "gearbox_top": "create:block/gearbox_top", "gearbox": "create:block/gearbox", - "andesite_casing_short": "create:block/andesite_casing_short" + "andesite_casing_short": "create:block/andesite_casing_short", + "particle": "create:block/gearbox_top" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/window.json b/src/main/resources/assets/create/models/block/fluid_pipe/window.json index 5cfccad79..ee5187561 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/window.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/window.json @@ -20,8 +20,8 @@ }, { "name": "Inner", - "from": [4, 0, 11.5], - "to": [12, 16, 11.5], + "from": [4, 0, 11.9], + "to": [12, 16, 11.9], "shade": false, "faces": { "north": {"uv": [0, 8, 16, 16], "rotation": 90, "texture": "#0"} @@ -29,17 +29,8 @@ }, { "name": "Inner", - "from": [4, 0, 4.5], - "to": [12, 16, 4.5], - "shade": false, - "faces": { - "south": {"uv": [0, 8, 16, 16], "rotation": 90, "texture": "#0"} - } - }, - { - "name": "Inner", - "from": [4.5, 0, 4], - "to": [4.5, 16, 12], + "from": [4.1, 0, 4], + "to": [4.1, 16, 12], "shade": false, "faces": { "east": {"uv": [0, 8, 16, 16], "rotation": 90, "texture": "#0"} @@ -47,12 +38,53 @@ }, { "name": "Inner", - "from": [11.5, 0, 4], - "to": [11.5, 16, 12], + "from": [4, 0, 4.1], + "to": [12, 16, 4.1], + "shade": false, + "faces": { + "south": {"uv": [0, 8, 16, 16], "rotation": 90, "texture": "#0"} + } + }, + { + "name": "Inner", + "from": [11.9, 0, 4], + "to": [11.9, 16, 12], "shade": false, "faces": { "west": {"uv": [0, 8, 16, 16], "rotation": 90, "texture": "#0"} } + }, + { + "from": [4, 0, 4], + "to": [6, 16, 6], + "faces": { + "east": {"uv": [0, 14, 16, 16], "rotation": 90, "texture": "#0"}, + "south": {"uv": [0, 8, 16, 10], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [4, 0, 10], + "to": [6, 16, 12], + "faces": { + "north": {"uv": [0, 10, 16, 8], "rotation": 90, "texture": "#0"}, + "east": {"uv": [0, 16, 16, 14], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [10, 0, 4], + "to": [12, 16, 6], + "faces": { + "south": {"uv": [0, 14, 16, 16], "rotation": 90, "texture": "#0"}, + "west": {"uv": [0, 8, 16, 10], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [10, 0, 10], + "to": [12, 16, 12], + "faces": { + "north": {"uv": [0, 16, 16, 14], "rotation": 90, "texture": "#0"}, + "west": {"uv": [0, 10, 16, 8], "rotation": 90, "texture": "#0"} + } } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/fluid_valve/block_horizontal_closed.json b/src/main/resources/assets/create/models/block/fluid_valve/block_horizontal_closed.json new file mode 100644 index 000000000..2bfe51234 --- /dev/null +++ b/src/main/resources/assets/create/models/block/fluid_valve/block_horizontal_closed.json @@ -0,0 +1,44 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "2": "create:block/fluid_valve", + "3": "create:block/fluid_pipe", + "particle": "create:block/oxidized/copper_block_0" + }, + "elements": [ + { + "name": "ValveCenter", + "from": [2, 2, 2], + "to": [14, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [24, 11, 11]}, + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#3"}, + "east": {"uv": [6, 0, 12, 6], "texture": "#2"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#2"}, + "west": {"uv": [6, 0, 12, 6], "texture": "#2"}, + "up": {"uv": [0, 0, 6, 6], "rotation": 90, "texture": "#3"}, + "down": {"uv": [0, 0, 6, 6], "rotation": 90, "texture": "#3"} + } + }, + { + "from": [4, 14, 4], + "to": [12, 16, 12], + "faces": { + "north": {"uv": [0, 6, 4, 7], "texture": "#3"}, + "east": {"uv": [0, 6, 4, 7], "texture": "#3"}, + "south": {"uv": [0, 6, 4, 7], "texture": "#3"}, + "west": {"uv": [0, 6, 4, 7], "texture": "#3"} + } + }, + { + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [0, 7, 4, 6], "texture": "#3"}, + "east": {"uv": [0, 7, 4, 6], "texture": "#3"}, + "south": {"uv": [0, 7, 4, 6], "texture": "#3"}, + "west": {"uv": [0, 7, 4, 6], "texture": "#3"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/fluid_valve/block_horizontal_open.json b/src/main/resources/assets/create/models/block/fluid_valve/block_horizontal_open.json new file mode 100644 index 000000000..3a705864b --- /dev/null +++ b/src/main/resources/assets/create/models/block/fluid_valve/block_horizontal_open.json @@ -0,0 +1,44 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "2": "create:block/fluid_valve", + "3": "create:block/fluid_pipe", + "particle": "create:block/oxidized/copper_block_0" + }, + "elements": [ + { + "name": "ValveCenter", + "from": [2, 2, 2], + "to": [14, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [24, 11, 11]}, + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#3"}, + "east": {"uv": [6, 0, 12, 6], "texture": "#2"}, + "south": {"uv": [0, 6, 6, 12], "texture": "#2"}, + "west": {"uv": [6, 0, 12, 6], "texture": "#2"}, + "up": {"uv": [0, 0, 6, 6], "rotation": 90, "texture": "#3"}, + "down": {"uv": [0, 0, 6, 6], "rotation": 90, "texture": "#3"} + } + }, + { + "from": [4, 14, 4], + "to": [12, 16, 12], + "faces": { + "north": {"uv": [0, 6, 4, 7], "texture": "#3"}, + "east": {"uv": [0, 6, 4, 7], "texture": "#3"}, + "south": {"uv": [0, 6, 4, 7], "texture": "#3"}, + "west": {"uv": [0, 6, 4, 7], "texture": "#3"} + } + }, + { + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [0, 7, 4, 6], "texture": "#3"}, + "east": {"uv": [0, 7, 4, 6], "texture": "#3"}, + "south": {"uv": [0, 7, 4, 6], "texture": "#3"}, + "west": {"uv": [0, 7, 4, 6], "texture": "#3"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/fluid_valve/block_vertical_closed.json b/src/main/resources/assets/create/models/block/fluid_valve/block_vertical_closed.json new file mode 100644 index 000000000..db7e80b05 --- /dev/null +++ b/src/main/resources/assets/create/models/block/fluid_valve/block_vertical_closed.json @@ -0,0 +1,44 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "2": "create:block/fluid_valve", + "3": "create:block/fluid_pipe", + "particle": "create:block/oxidized/copper_block_0" + }, + "elements": [ + { + "name": "ValveCenter", + "from": [2, 2, 2], + "to": [14, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [24, 11, 11]}, + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#3"}, + "east": {"uv": [0, 0, 6, 6], "rotation": 90, "texture": "#3"}, + "south": {"uv": [0, 0, 6, 6], "rotation": 90, "texture": "#2"}, + "west": {"uv": [0, 0, 6, 6], "rotation": 90, "texture": "#3"}, + "up": {"uv": [6, 0, 12, 6], "rotation": 90, "texture": "#2"}, + "down": {"uv": [6, 0, 12, 6], "rotation": 90, "texture": "#2"} + } + }, + { + "from": [0, 4, 4], + "to": [2, 12, 12], + "faces": { + "north": {"uv": [0, 6, 4, 7], "rotation": 90, "texture": "#3"}, + "south": {"uv": [0, 6, 4, 7], "rotation": 270, "texture": "#3"}, + "up": {"uv": [0, 6, 4, 7], "rotation": 270, "texture": "#3"}, + "down": {"uv": [0, 6, 4, 7], "rotation": 270, "texture": "#3"} + } + }, + { + "from": [14, 4, 4], + "to": [16, 12, 12], + "faces": { + "north": {"uv": [0, 7, 4, 6], "rotation": 90, "texture": "#3"}, + "south": {"uv": [0, 7, 4, 6], "rotation": 270, "texture": "#3"}, + "up": {"uv": [0, 7, 4, 6], "rotation": 270, "texture": "#3"}, + "down": {"uv": [0, 7, 4, 6], "rotation": 270, "texture": "#3"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/fluid_valve/block_vertical_open.json b/src/main/resources/assets/create/models/block/fluid_valve/block_vertical_open.json new file mode 100644 index 000000000..c4a17315a --- /dev/null +++ b/src/main/resources/assets/create/models/block/fluid_valve/block_vertical_open.json @@ -0,0 +1,44 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "2": "create:block/fluid_valve", + "3": "create:block/fluid_pipe", + "particle": "create:block/oxidized/copper_block_0" + }, + "elements": [ + { + "name": "ValveCenter", + "from": [2, 2, 2], + "to": [14, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [24, 11, 11]}, + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#3"}, + "east": {"uv": [0, 0, 6, 6], "rotation": 90, "texture": "#3"}, + "south": {"uv": [0, 6, 6, 12], "rotation": 90, "texture": "#2"}, + "west": {"uv": [0, 0, 6, 6], "rotation": 90, "texture": "#3"}, + "up": {"uv": [6, 0, 12, 6], "rotation": 90, "texture": "#2"}, + "down": {"uv": [6, 0, 12, 6], "rotation": 90, "texture": "#2"} + } + }, + { + "from": [0, 4, 4], + "to": [2, 12, 12], + "faces": { + "north": {"uv": [0, 6, 4, 7], "rotation": 90, "texture": "#3"}, + "south": {"uv": [0, 6, 4, 7], "rotation": 270, "texture": "#3"}, + "up": {"uv": [0, 6, 4, 7], "rotation": 270, "texture": "#3"}, + "down": {"uv": [0, 6, 4, 7], "rotation": 270, "texture": "#3"} + } + }, + { + "from": [14, 4, 4], + "to": [16, 12, 12], + "faces": { + "north": {"uv": [0, 7, 4, 6], "rotation": 90, "texture": "#3"}, + "south": {"uv": [0, 7, 4, 6], "rotation": 270, "texture": "#3"}, + "up": {"uv": [0, 7, 4, 6], "rotation": 270, "texture": "#3"}, + "down": {"uv": [0, 7, 4, 6], "rotation": 270, "texture": "#3"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/fluid_valve/item.json b/src/main/resources/assets/create/models/block/fluid_valve/item.json new file mode 100644 index 000000000..576eb104c --- /dev/null +++ b/src/main/resources/assets/create/models/block/fluid_valve/item.json @@ -0,0 +1,201 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "2": "create:block/fluid_valve", + "3": "create:block/fluid_pipe", + "4": "create:block/pump", + "1_1": "create:block/axis_top", + "1_0": "create:block/axis", + "particle": "create:block/oxidized/copper_block_0" + }, + "elements": [ + { + "name": "ValveCenter", + "from": [2, 2, 2], + "to": [14, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [24, 11, 11]}, + "faces": { + "north": {"uv": [6, 0, 12, 6], "texture": "#2"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#3"}, + "south": {"uv": [6, 0, 12, 6], "texture": "#2"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#3"}, + "up": {"uv": [0, 0, 6, 6], "rotation": 90, "texture": "#2"}, + "down": {"uv": [0, 0, 6, 6], "rotation": 90, "texture": "#3"} + } + }, + { + "name": "Axis", + "from": [6, 6, 0], + "to": [10, 10, 16], + "shade": false, + "faces": { + "north": {"uv": [6, 6, 10, 10], "rotation": 180, "texture": "#1_1"}, + "east": {"uv": [6, 0, 10, 16], "rotation": 90, "texture": "#1_0"}, + "south": {"uv": [6, 6, 10, 10], "texture": "#1_1"}, + "west": {"uv": [6, 0, 10, 16], "rotation": 270, "texture": "#1_0"}, + "up": {"uv": [6, 0, 10, 16], "texture": "#1_0"}, + "down": {"uv": [6, 0, 10, 16], "rotation": 180, "texture": "#1_0"} + } + }, + { + "from": [2.5, 14.1, 9.5], + "to": [4.5, 15.1, 11.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12, 2, 13, 4], "rotation": 270, "texture": "#4"}, + "east": {"uv": [12, 2, 14, 3], "rotation": 180, "texture": "#4"}, + "south": {"uv": [12, 3, 14, 4], "texture": "#4"}, + "west": {"uv": [12, 3, 14, 4], "rotation": 180, "texture": "#4"}, + "up": {"uv": [12, 2, 14, 4], "rotation": 90, "texture": "#4"}, + "down": {"uv": [14, 2, 12, 4], "rotation": 90, "texture": "#4"} + } + }, + { + "from": [2.5, 14.1, 11.5], + "to": [6.5, 15.1, 13.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12, 0, 13, 4], "rotation": 90, "texture": "#4"}, + "east": {"uv": [14, 0, 16, 1], "rotation": 180, "texture": "#4"}, + "south": {"uv": [15, 0, 16, 4], "rotation": 90, "texture": "#4"}, + "west": {"uv": [12, 3, 14, 4], "texture": "#4"}, + "up": {"uv": [14, 0, 16, 4], "rotation": 90, "texture": "#4"}, + "down": {"uv": [16, 0, 14, 4], "rotation": 90, "texture": "#4"} + } + }, + { + "from": [9.5, 14.1, 2.5], + "to": [11.5, 15.1, 4.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [14, 3, 12, 4], "rotation": 180, "texture": "#4"}, + "east": {"uv": [14, 3, 12, 4], "texture": "#4"}, + "south": {"uv": [14, 2, 12, 3], "rotation": 180, "texture": "#4"}, + "west": {"uv": [12, 4, 13, 2], "rotation": 270, "texture": "#4"}, + "up": {"uv": [14, 2, 12, 4], "rotation": 180, "texture": "#4"}, + "down": {"uv": [12, 2, 14, 4], "texture": "#4"} + } + }, + { + "from": [11.5, 14.1, 2.5], + "to": [13.5, 15.1, 6.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [14, 3, 12, 4], "texture": "#4"}, + "east": {"uv": [15, 4, 16, 0], "rotation": 90, "texture": "#4"}, + "south": {"uv": [16, 0, 14, 1], "rotation": 180, "texture": "#4"}, + "west": {"uv": [12, 4, 13, 0], "rotation": 90, "texture": "#4"}, + "up": {"uv": [16, 0, 14, 4], "rotation": 180, "texture": "#4"}, + "down": {"uv": [14, 0, 16, 4], "texture": "#4"} + } + }, + { + "name": "Center", + "from": [6.5, 14, 6.5], + "to": [9.5, 16, 9.5], + "faces": { + "north": {"uv": [6, 8.5, 7.5, 9.5], "texture": "#2"}, + "east": {"uv": [6, 8.5, 7.5, 9.5], "texture": "#2"}, + "south": {"uv": [6, 8.5, 7.5, 9.5], "texture": "#2"}, + "west": {"uv": [6, 8.5, 7.5, 9.5], "texture": "#2"}, + "up": {"uv": [6, 10, 7.5, 11.5], "texture": "#2"} + } + }, + { + "name": "WestPointer", + "from": [7, 14, 9], + "to": [9, 15, 13], + "faces": { + "east": {"uv": [9.5, 9.5, 7.5, 10], "texture": "#2"}, + "south": {"uv": [7, 9.5, 7.5, 10], "texture": "#2"}, + "west": {"uv": [9.5, 9.5, 7.5, 10], "texture": "#2"}, + "up": {"uv": [9.5, 8.5, 7.5, 9.5], "rotation": 90, "texture": "#2"} + } + }, + { + "name": "WestPointer", + "from": [7, 14, 3], + "to": [9, 15, 7], + "faces": { + "north": {"uv": [7.5, 9.5, 7, 10], "texture": "#2"}, + "east": {"uv": [9.5, 9.5, 7.5, 10], "texture": "#2"}, + "west": {"uv": [9.5, 9.5, 7.5, 10], "texture": "#2"}, + "up": {"uv": [9.5, 8.5, 7.5, 9.5], "rotation": 90, "texture": "#2"} + } + }, + { + "from": [-1, 3, 3], + "to": [2, 13, 13], + "faces": { + "north": {"uv": [6, 5, 11, 6.5], "rotation": 270, "texture": "#3"}, + "south": {"uv": [6, 5, 11, 6.5], "rotation": 90, "texture": "#3"}, + "west": {"uv": [6, 0, 11, 5], "texture": "#3"}, + "up": {"uv": [6, 5, 11, 6.5], "rotation": 90, "texture": "#3"}, + "down": {"uv": [6, 5, 11, 6.5], "rotation": 90, "texture": "#3"} + } + }, + { + "from": [14, 3, 3], + "to": [17, 13, 13], + "faces": { + "north": {"uv": [6, 6.5, 11, 5], "rotation": 270, "texture": "#3"}, + "east": {"uv": [11, 0, 6, 5], "texture": "#3"}, + "south": {"uv": [6, 6.5, 11, 5], "rotation": 90, "texture": "#3"}, + "up": {"uv": [6, 6.5, 11, 5], "rotation": 90, "texture": "#3"}, + "down": {"uv": [6, 6.5, 11, 5], "rotation": 90, "texture": "#3"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 135, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [0, + { + "name": "shaft", + "origin": [8, 8, 8], + "children": [1] + }, + { + "name": "Pointer", + "origin": [7.5, 14, 8], + "children": [ + { + "name": "arrow", + "origin": [8, 8, 8], + "children": [2, 3] + }, + { + "name": "arrow", + "origin": [8, 8, 8], + "children": [4, 5] + }, 6, 7, 8] + }, 9, 10] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/fluid_valve/pointer.json b/src/main/resources/assets/create/models/block/fluid_valve/pointer.json new file mode 100644 index 000000000..eb686e2a8 --- /dev/null +++ b/src/main/resources/assets/create/models/block/fluid_valve/pointer.json @@ -0,0 +1,95 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "2": "create:block/fluid_valve", + "4": "create:block/pump" + }, + "elements": [ + { + "from": [2.5, 14.1, 9.5], + "to": [4.5, 15.1, 11.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12, 2, 13, 4], "rotation": 270, "texture": "#4"}, + "east": {"uv": [12, 2, 14, 3], "rotation": 180, "texture": "#4"}, + "south": {"uv": [12, 3, 14, 4], "texture": "#4"}, + "west": {"uv": [12, 3, 14, 4], "rotation": 180, "texture": "#4"}, + "up": {"uv": [12, 2, 14, 4], "rotation": 90, "texture": "#4"}, + "down": {"uv": [14, 2, 12, 4], "rotation": 90, "texture": "#4"} + } + }, + { + "from": [2.5, 14.1, 11.5], + "to": [6.5, 15.1, 13.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12, 0, 13, 4], "rotation": 90, "texture": "#4"}, + "east": {"uv": [14, 0, 16, 1], "rotation": 180, "texture": "#4"}, + "south": {"uv": [15, 0, 16, 4], "rotation": 90, "texture": "#4"}, + "west": {"uv": [12, 3, 14, 4], "texture": "#4"}, + "up": {"uv": [14, 0, 16, 4], "rotation": 90, "texture": "#4"}, + "down": {"uv": [16, 0, 14, 4], "rotation": 90, "texture": "#4"} + } + }, + { + "from": [9.5, 14.1, 2.5], + "to": [11.5, 15.1, 4.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [14, 3, 12, 4], "rotation": 180, "texture": "#4"}, + "east": {"uv": [14, 3, 12, 4], "texture": "#4"}, + "south": {"uv": [14, 2, 12, 3], "rotation": 180, "texture": "#4"}, + "west": {"uv": [12, 4, 13, 2], "rotation": 270, "texture": "#4"}, + "up": {"uv": [14, 2, 12, 4], "rotation": 180, "texture": "#4"}, + "down": {"uv": [12, 2, 14, 4], "texture": "#4"} + } + }, + { + "from": [11.5, 14.1, 2.5], + "to": [13.5, 15.1, 6.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [14, 3, 12, 4], "texture": "#4"}, + "east": {"uv": [15, 4, 16, 0], "rotation": 90, "texture": "#4"}, + "south": {"uv": [16, 0, 14, 1], "rotation": 180, "texture": "#4"}, + "west": {"uv": [12, 4, 13, 0], "rotation": 90, "texture": "#4"}, + "up": {"uv": [16, 0, 14, 4], "rotation": 180, "texture": "#4"}, + "down": {"uv": [14, 0, 16, 4], "texture": "#4"} + } + }, + { + "name": "Center", + "from": [6.5, 14, 6.5], + "to": [9.5, 16, 9.5], + "faces": { + "north": {"uv": [6, 8.5, 7.5, 9.5], "texture": "#2"}, + "east": {"uv": [6, 8.5, 7.5, 9.5], "texture": "#2"}, + "south": {"uv": [6, 8.5, 7.5, 9.5], "texture": "#2"}, + "west": {"uv": [6, 8.5, 7.5, 9.5], "texture": "#2"}, + "up": {"uv": [6, 10, 7.5, 11.5], "texture": "#2"} + } + }, + { + "name": "WestPointer", + "from": [7, 14, 9], + "to": [9, 15, 13], + "faces": { + "east": {"uv": [9.5, 9.5, 7.5, 10], "texture": "#2"}, + "south": {"uv": [7, 9.5, 7.5, 10], "texture": "#2"}, + "west": {"uv": [9.5, 9.5, 7.5, 10], "texture": "#2"}, + "up": {"uv": [9.5, 8.5, 7.5, 9.5], "rotation": 90, "texture": "#2"} + } + }, + { + "name": "WestPointer", + "from": [7, 14, 3], + "to": [9, 15, 7], + "faces": { + "north": {"uv": [7.5, 9.5, 7, 10], "texture": "#2"}, + "east": {"uv": [9.5, 9.5, 7.5, 10], "texture": "#2"}, + "west": {"uv": [9.5, 9.5, 7.5, 10], "texture": "#2"}, + "up": {"uv": [9.5, 8.5, 7.5, 9.5], "rotation": 90, "texture": "#2"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/valve_handle.json b/src/main/resources/assets/create/models/block/valve_handle.json new file mode 100644 index 000000000..f0397083c --- /dev/null +++ b/src/main/resources/assets/create/models/block/valve_handle.json @@ -0,0 +1,222 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "2": "create:block/fluid_valve", + "particle": "create:block/oxidized/copper_block_0" + }, + "elements": [ + { + "name": "BranchNorth", + "from": [7, 1.5, 10], + "to": [9, 3.5, 14], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 2.5, 10.5]}, + "faces": { + "east": {"uv": [8.5, 6, 10.5, 7], "texture": "#2"}, + "west": {"uv": [8.5, 6, 10.5, 7], "rotation": 180, "texture": "#2"}, + "up": {"uv": [8.5, 6, 10.5, 7], "rotation": 270, "texture": "#2"}, + "down": {"uv": [8.5, 6, 10.5, 7], "rotation": 90, "texture": "#2"} + } + }, + { + "name": "WheelSouth", + "from": [5, 2, 1], + "to": [11, 5, 3], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 5, 8]}, + "faces": { + "north": {"uv": [0, 13, 3, 14.5], "rotation": 180, "texture": "#2"}, + "east": {"uv": [3, 12, 4.5, 13], "rotation": 270, "texture": "#2"}, + "south": {"uv": [0, 14.5, 3, 16], "texture": "#2"}, + "west": {"uv": [3, 12, 4.5, 13], "rotation": 90, "texture": "#2"}, + "up": {"uv": [0, 12, 3, 13], "texture": "#2"}, + "down": {"uv": [0, 12, 3, 13], "rotation": 180, "texture": "#2"} + } + }, + { + "name": "WheelSouthWest", + "from": [9, 2.1, 1], + "to": [11, 4.9, 6.65685], + "rotation": {"angle": 45, "axis": "y", "origin": [11, 3, 1]}, + "faces": { + "east": {"uv": [0, 13, 3, 14.5], "texture": "#2"}, + "west": {"uv": [0, 14.5, 3, 16], "rotation": 180, "texture": "#2"}, + "up": {"uv": [0, 12, 3, 13], "rotation": 90, "texture": "#2"}, + "down": {"uv": [0, 12, 3, 13], "rotation": 90, "texture": "#2"} + } + }, + { + "name": "WheelWest", + "from": [13, 2, 5], + "to": [15, 5, 11], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 5, 8]}, + "faces": { + "north": {"uv": [3, 12, 4.5, 13], "rotation": 90, "texture": "#2"}, + "east": {"uv": [0, 13, 3, 14.5], "rotation": 180, "texture": "#2"}, + "south": {"uv": [3, 12, 4.5, 13], "rotation": 270, "texture": "#2"}, + "west": {"uv": [0, 14.5, 3, 16], "texture": "#2"}, + "up": {"uv": [0, 12, 3, 13], "rotation": 90, "texture": "#2"}, + "down": {"uv": [0, 12, 3, 13], "rotation": 90, "texture": "#2"} + } + }, + { + "name": "WheelNorthWest", + "from": [13, 2.1, 11], + "to": [15, 4.9, 16.65685], + "rotation": {"angle": -45, "axis": "y", "origin": [15, 5, 11]}, + "faces": { + "east": {"uv": [0, 13, 3, 14.5], "rotation": 180, "texture": "#2"}, + "west": {"uv": [0, 14.5, 3, 16], "texture": "#2"}, + "up": {"uv": [0, 12, 3, 13], "rotation": 90, "texture": "#2"}, + "down": {"uv": [0, 12, 3, 13], "rotation": 90, "texture": "#2"} + } + }, + { + "name": "WheelNorth", + "from": [5, 2, 13], + "to": [11, 5, 15], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 5, 20]}, + "faces": { + "north": {"uv": [0, 14.5, 3, 16], "rotation": 180, "texture": "#2"}, + "east": {"uv": [3, 12, 4.5, 13], "rotation": 270, "texture": "#2"}, + "south": {"uv": [0, 13, 3, 14.5], "texture": "#2"}, + "west": {"uv": [3, 12, 4.5, 13], "rotation": 180, "texture": "#2"}, + "up": {"uv": [0, 12, 3, 13], "rotation": 180, "texture": "#2"}, + "down": {"uv": [0, 12, 3, 13], "texture": "#2"} + } + }, + { + "name": "WheelEast", + "from": [1, 2, 5], + "to": [3, 5, 11], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 5, 8]}, + "faces": { + "north": {"uv": [3, 12, 4.5, 13], "rotation": 90, "texture": "#2"}, + "east": {"uv": [0, 14.5, 3, 16], "rotation": 180, "texture": "#2"}, + "south": {"uv": [3, 12, 4.5, 13], "rotation": 270, "texture": "#2"}, + "west": {"uv": [0, 13, 3, 14.5], "texture": "#2"}, + "up": {"uv": [0, 12, 3, 13], "rotation": 270, "texture": "#2"}, + "down": {"uv": [0, 12, 3, 13], "rotation": 270, "texture": "#2"} + } + }, + { + "name": "WheelSouthEast", + "from": [5, 2.1, 1], + "to": [7, 4.9, 6.65685], + "rotation": {"angle": -45, "axis": "y", "origin": [5, 3, 1]}, + "faces": { + "east": {"uv": [0, 14.5, 3, 16], "rotation": 180, "texture": "#2"}, + "west": {"uv": [0, 13, 3, 14.5], "texture": "#2"}, + "up": {"uv": [0, 12, 3, 13], "rotation": 270, "texture": "#2"}, + "down": {"uv": [0, 12, 3, 13], "rotation": 270, "texture": "#2"} + } + }, + { + "name": "WhealNorthEast", + "from": [1, 2.1, 11], + "to": [3, 4.9, 16.65685], + "rotation": {"angle": 45, "axis": "y", "origin": [1, 3, 11]}, + "faces": { + "east": {"uv": [0, 14.5, 3, 16], "rotation": 180, "texture": "#2"}, + "west": {"uv": [0, 13, 3, 14.5], "texture": "#2"}, + "up": {"uv": [0, 12, 3, 13], "rotation": 270, "texture": "#2"}, + "down": {"uv": [0, 12, 3, 13], "rotation": 270, "texture": "#2"} + } + }, + { + "name": "WheelMid", + "from": [5.5, 0, 5.5], + "to": [10.5, 5, 10.5], + "rotation": {"angle": 0, "axis": "x", "origin": [14, -7, 14]}, + "faces": { + "north": {"uv": [6, 6, 8.5, 8.5], "rotation": 180, "texture": "#2"}, + "east": {"uv": [6, 6, 8.5, 8.5], "rotation": 270, "texture": "#2"}, + "south": {"uv": [6, 6, 8.5, 8.5], "texture": "#2"}, + "west": {"uv": [6, 6, 8.5, 8.5], "rotation": 90, "texture": "#2"}, + "up": {"uv": [6, 6, 8.5, 8.5], "rotation": 180, "texture": "#2"}, + "down": {"uv": [6, 6, 8.5, 8.5], "texture": "#2"} + } + }, + { + "name": "BranchWest", + "from": [10, 1.5, 7], + "to": [14, 3.5, 9], + "rotation": {"angle": 22.5, "axis": "z", "origin": [10.5, 2.5, 8]}, + "faces": { + "north": {"uv": [8.5, 6, 10.5, 7], "rotation": 180, "texture": "#2"}, + "south": {"uv": [8.5, 6, 10.5, 7], "texture": "#2"}, + "up": {"uv": [8.5, 6, 10.5, 7], "rotation": 180, "texture": "#2"}, + "down": {"uv": [8.5, 6, 10.5, 7], "texture": "#2"} + } + }, + { + "name": "BranchEast", + "from": [2, 1.5, 7], + "to": [6, 3.5, 9], + "rotation": {"angle": -22.5, "axis": "z", "origin": [5.5, 2.5, 8.5]}, + "faces": { + "north": {"uv": [8.5, 6, 10.5, 7], "rotation": 180, "texture": "#2"}, + "south": {"uv": [8.5, 6, 10.5, 7], "texture": "#2"}, + "up": {"uv": [8.5, 6, 10.5, 7], "rotation": 180, "texture": "#2"}, + "down": {"uv": [8.5, 6, 10.5, 7], "texture": "#2"} + } + }, + { + "name": "BranchSouth", + "from": [7, 1.5, 2], + "to": [9, 3.5, 6], + "rotation": {"angle": 22.5, "axis": "x", "origin": [8, 2.5, 5.5]}, + "faces": { + "east": {"uv": [8.5, 6, 10.5, 7], "texture": "#2"}, + "west": {"uv": [8.5, 6, 10.5, 7], "rotation": 180, "texture": "#2"}, + "up": {"uv": [8.5, 6, 10.5, 7], "rotation": 270, "texture": "#2"}, + "down": {"uv": [8.5, 6, 10.5, 7], "rotation": 90, "texture": "#2"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0.75], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 1], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 0.75, 0], + "scale": [0.35, 0.35, 0.35] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 2.75, 0], + "scale": [0.75, 0.75, 0.75] + }, + "head": { + "translation": [0, 13, 0] + }, + "fixed": { + "rotation": [-90, 0, 0], + "translation": [0, 0, -3.5], + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + { + "name": "Wheel", + "origin": [8, 5.5, -2.5], + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/fluid_pipe.png b/src/main/resources/assets/create/textures/block/fluid_pipe.png index 16b475d5e8d64cb7a2ed93d1758023b497777397..6f96b5d30d30b36870d76696c6df360b7dd4e42b 100644 GIT binary patch delta 613 zcmX@ZHJ5dQBnLAC1B1(wu45Aw73#eMd_r8C+?>i?oJ;NPmPUK6P7BEak-;a?iuJ!!E4kMWJp zfBdc>C+_b>)`?A`(UY1_m~bXJoynRObS~}Hs#o`UCO*gx-a12f>ZD@58+t!v8P={{ zo1Gn+u3hBpVdy*0t|9mC```QWetFFNd7D>t&yKx}x%cON&&{u6RAIQp;Ir%9`S|$r zdlx#@OE%02dSb!ApS}L~=YLEIc8rn@H4IICNq;_h81s zhrAnh<*v=0{lYnsV@{K%_{`uvi{luV2lji1l=pu4P_^;aVS$U~&vmNSwR;@h8TItW zf6@J+Kf*htyV8E!D@-xAV+`8sG|5_g%d^rG+{?DRe+Kk^dUlxOJ;R;@f?ms6MJ9??=1dWF5X#wA^ykHI295F$ z3pa_o7&=VP-1PmOKYuNQ=N@OFoqUU#PilEAVu=cg;x@1o(`jb%{x0@F&-BCHzMlra vIzFuUJ8!}h!+Q%kFBK^N=9Mgs=0kG=0MUVjMN zBTqoy54AR!+%W3*ib&v+JQ7Wk$hge3i{t%`T6k;Bl!HR zmou{QQdZ8KC}}yn9@oeyZ=EXY9Ds5ZAAPMXl~>A%a)696=AeAz+?vX%U1MCN_{nBG zx!E4bAKOh8W-@85d%eEa=ZXt*GJmgA6)3)b?UwxX=dTBn7+<|}UM_reLbm_e)BepH zxAo-I)1V#zzuj-D;zD$y<;tRD({URaW1tm|^n}Cv!Gv;PGV{XbRv;Viu4--9Hjc!A zbULL<>kpbzE)}F$C~6xSW1M6b7(Wc-eS>dAGq=C-`WXp=o*Y|Q(ze09!+*KODZ53$ zJBHj`sD0{b@Eg6@J=}LTGIOudit3Eq-KojF-P*yl7zHnJ*i+$>6O8u_x?^jvtDPVS zKa-j{rSUT$x0sf;!< z9jgaQLIA5j|8zq>eDkRGQGbe2jc!xw|Hcsjx!49OK7OV7!dt7R>h z77JReUoB-dPt1ywYp*JKsi(pF`uzLTDS8O1l?AEzaZ+OQpcgO4-G8v1x;`4{95-^N zrDE@gOP_=+MzqTa7KjT-)z59RNjw(QmdEwqs__M+i09m(na zudn1~c`2)fHZsOuG?FMFRjx$$YsI}1T<4bOh39#b<;O2R4tWhpG`w)zP>56`=xN_FuH6NE?nZaH&dmo+#h-z;= z4-To9!gX4)RBdyBtx*q4M<#gFku!Fnvw1rl<`3EIN5`RQVcR3fVIB4&^B@B71|!A?%7;X!!AIy->n5reyjd$o^o0P6so5H4(t z0{B4K7-(DCW`B-_Ffa~byaDAJst38i%@0WwnB|q@%Q0ahR&y$gZ))P1xURk&{{f*e z$3klwEKiK*0pODsjfB96Vunn_bEJ$h`lcAUjyVK#_jKE~#$>+bZeyypA&PSyR#Q-J zW3FNfa^@JJIh?r~#U=+v!nwECPF*fabVu_k38FurnSX&V4{9x~!_H6@D66BfT=d_e z)7sY@4oM%@yV7rWCG7U4ml^7YtOcEBApX#oLFh?397>o96C;QUZ#0x3dXv2GKf4&> z1-lbm11DU!0hd$;-Vis9yK@-hqlSEs7slr?PBiG>^J&ki3paFtxfVHXcieq$?W4x# egGX~k{uKvc+>HgR;J}Xn0000$(ATTg+DFZ{0hoif#g^!a>q_5jq28Ikf8!s;}DM?9YW@ckU!)ZZY?(XicE-vdB z7z&f38w)ZjG85CILaZz-e0+Q?%*}0WZ2bKEtgBp1W;(hvGDR>lwoRR}=Fs8d`lf>w z(LiTxUT<3tqzp@f{DS|J2pHsN`6&W5a~60+7BevL9R^{>Eak-;om!{ zx2Rb`prw&%(lS%F3#+zdW>5aNqOM~K7W#D)9l^NQw6*@9T>&d_j4%5 zc+B)rR7w9RRcgSob;tL9A)afe+mDxQZ83dyZ^GKG8`I`?H+3xEvS!t$b*_!O%%ALH zD|vR{L(DzKr`@x8LUMfm{tA;`;ouro={(gPszoUN=ef+odOza+p=X@h zKe(b*CO3Y%lQH9B%7rF<`#%$I$6jf&GM!iCctGLmyU*IOxrx2I%nMu`TZOfxK5?x$ zY&$32@#d|l?nUYISkrGwG%q@y{_*eQ`G(yYRxCWZCl-A@-m}d4z=c*Ft8zP8rpPUd z+$$2KZ@>R;>&19t5qD%sQ|4O7`O+2An=+37e*gQhq6SCG#a5kN8(H)G1$O)|@Ucj| zY_h|aQPgk6Y0*PBnRb-36;4?8zwpis=M*EJ&XRKvkI6jxUlYp8@r1+k(QVd$fr)=4 oKD=de=}4TgJ?hT70-JwK_O_MvH$+Vq17n22)78&qol`;+0KqjbCIA2c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/glass_fluid_pipe.png b/src/main/resources/assets/create/textures/block/glass_fluid_pipe.png index f5b36798da394edf54c801fb1d657d9839dfcb47..0ad8834d590629b341aa8c93690b3f3f6acaacc1 100644 GIT binary patch delta 286 zcmey&e2Qs;BnLAC1A~SxfAB;_g?h^XpAgq+L0(O6PO+2c0wv~!dbR|(bss#tG}`M( zcT)Ab?FTEOFHbJmlpDC>!p#e>Uan3HoEzfV?C%Oxd?D}HaUdmJ666>B9|JIKs=dPj zl;$k(h%9Dc&{F_m#;Y=N(m=s#PZ!4!jr!nJ|872JMUK_tjx`P2|NcMDcSR?9U6W^b z0OO^v{~mccsM(!4I3>_!Mt17{8LnJQOkeJOpOf2iq3l@U!k&f8vcwGCD*0+}C<$3s zyO{o)xVQ3bKyj02**)tSYHD8$+)IC{7jS&ht~mX7*LS^*emt>$r%m4o+wE!KYQKN5 S`wRm&&?TO(elF{r5}E)~!hNX# delta 456 zcmV;(0XP220`miq83+ad001BJ|6!3KAb$yPNLh0L04^Z_04^Z`2V4CA0004qNklD^nd^F z+n-9{irzuEdJ)j4+h57X@UQ5zWU1GGixzOj1i_87kK>f3y1=Tfw~ws zBpQX7Siq(e(hLHi1O>t%Js^OR4u}Du)QFry!3Mnh_Xo@&1;F%x15wRP5;e@hl^2ln y0SLhI!mU%!5z#0lEecQT_-L3~aPt28jR63(vh3vPmyi1Z0000 Date: Sat, 26 Sep 2020 00:59:43 +0200 Subject: [PATCH 06/12] Midnight bugs - Fixed deployers not firing any right-click actions - Fixed basin renderer crashing outside of dev env - Fixed some lighting and flickering on psis --- .../PortableStorageInterfaceRenderer.java | 2 +- .../PortableStorageInterfaceTileEntity.java | 2 +- .../components/deployer/DeployerHandler.java | 53 +++++++++++-------- .../train/MinecartTrain.java | 18 +++++++ .../IItemHandlerModifiableIntermediate.java | 15 ++++++ .../foundation/item/SmartInventory.java | 13 ++++- 6 files changed, 78 insertions(+), 25 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/item/IItemHandlerModifiableIntermediate.java diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java index d3f869473..9efa6b692 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java @@ -33,7 +33,7 @@ public class PortableStorageInterfaceRenderer extends SafeTileEntityRenderer sbb.renderInto(ms, vb), ms); + render(blockState, progress, te.isConnected(), sbb -> sbb.light(light).renderInto(ms, vb), ms); } public static void renderInContraption(MovementContext context, MatrixStack ms, MatrixStack msLocal, diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java index 7fc799514..9c5e3abcd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java @@ -95,7 +95,7 @@ public class PortableStorageInterfaceTileEntity extends SmartTileEntity { boolean isConnected() { int timeUnit = getTransferTimeout() / 2; - return transferTimer >= timeUnit && transferTimer < timeUnit * 3; + return transferTimer >= timeUnit && transferTimer <= timeUnit * 3; } float getExtensionDistance(float partialTicks) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerHandler.java index 0ee36f6df..5dfceef48 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerHandler.java @@ -6,16 +6,6 @@ import static net.minecraftforge.eventbus.api.Event.Result.DENY; import java.util.ArrayList; import java.util.List; -import net.minecraft.advancements.CriteriaTriggers; -import net.minecraft.block.BeehiveBlock; -import net.minecraft.block.Block; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.server.management.PlayerInteractionManager; -import net.minecraft.stats.Stats; -import net.minecraft.tileentity.BeehiveTileEntity; -import net.minecraft.tileentity.TileEntity; import org.apache.commons.lang3.tuple.Pair; import com.google.common.collect.Multimap; @@ -23,14 +13,20 @@ import com.simibubi.create.content.contraptions.components.deployer.DeployerTile import com.simibubi.create.content.curiosities.tools.SandPaperItem; import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; +import net.minecraft.advancements.CriteriaTriggers; +import net.minecraft.block.BeehiveBlock; +import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.material.Material; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.enchantment.Enchantments; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.Fluids; import net.minecraft.inventory.EquipmentSlotType; @@ -43,6 +39,10 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUseContext; import net.minecraft.item.Items; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.server.management.PlayerInteractionManager; +import net.minecraft.stats.Stats; +import net.minecraft.tileentity.BeehiveTileEntity; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; @@ -95,7 +95,8 @@ public class DeployerHandler { static boolean shouldActivate(ItemStack held, World world, BlockPos targetPos) { if (held.getItem() instanceof BlockItem) - if (world.getBlockState(targetPos).getBlock() == ((BlockItem) held.getItem()).getBlock()) + if (world.getBlockState(targetPos) + .getBlock() == ((BlockItem) held.getItem()).getBlock()) return false; if (held.getItem() instanceof BucketItem) { @@ -155,7 +156,8 @@ public class DeployerHandler { } if (!success && stack.isFood() && entity instanceof PlayerEntity) { PlayerEntity playerEntity = (PlayerEntity) entity; - if (playerEntity.canEat(item.getFood().canEatWhenFull())) { + if (playerEntity.canEat(item.getFood() + .canEatWhenFull())) { playerEntity.onFoodEaten(world, stack); player.spawnedItemEffects = stack.copy(); success = true; @@ -254,8 +256,11 @@ public class DeployerHandler { boolean flag1 = !(player.isSneaking() && holdingSomething) || (stack.doesSneakBypassUse(world, clickedPos, player)); + if (clickedState.getBlock() instanceof BeehiveBlock) + return; // Beehives assume a lot about the usage context. Crashes to side-effects + // Use on block - if (useBlock != DENY && flag1 && clickedState.getBlock() instanceof BeehiveBlock && clickedState.onUse(world, player, hand, result) == ActionResultType.SUCCESS) + if (useBlock != DENY && flag1 && clickedState.onUse(world, player, hand, result) == ActionResultType.SUCCESS) return; if (stack.isEmpty()) return; @@ -304,7 +309,7 @@ public class DeployerHandler { private static boolean safeTryHarvestBlock(PlayerInteractionManager interactionManager, BlockPos clickedPos) { BlockState state = interactionManager.world.getBlockState(clickedPos); - if(!(state.getBlock() instanceof BeehiveBlock)) + if (!(state.getBlock() instanceof BeehiveBlock)) return interactionManager.tryHarvestBlock(clickedPos); else { harvestBeehive(interactionManager, state, clickedPos); @@ -312,19 +317,24 @@ public class DeployerHandler { return true; } - private static void harvestBeehive(PlayerInteractionManager interactionManager, BlockState state, BlockPos clickedPos) { - // Modified code from PlayerInteractionManager, Block and BeehiveBlock to handle deployers breaking beehives without crash. + private static void harvestBeehive(PlayerInteractionManager interactionManager, BlockState state, + BlockPos clickedPos) { + // Modified code from PlayerInteractionManager, Block and BeehiveBlock to handle + // deployers breaking beehives without crash. ItemStack itemstack = interactionManager.player.getHeldItemMainhand(); ItemStack itemstack1 = itemstack.copy(); boolean flag1 = state.canHarvestBlock(interactionManager.world, clickedPos, interactionManager.player); itemstack.onBlockDestroyed(interactionManager.world, state, clickedPos, interactionManager.player); if (itemstack.isEmpty() && !itemstack1.isEmpty()) - net.minecraftforge.event.ForgeEventFactory.onPlayerDestroyItem(interactionManager.player, itemstack1, Hand.MAIN_HAND); + net.minecraftforge.event.ForgeEventFactory.onPlayerDestroyItem(interactionManager.player, itemstack1, + Hand.MAIN_HAND); - boolean flag = state.removedByPlayer(interactionManager.world, clickedPos, interactionManager.player, flag1, interactionManager.world.getFluidState(clickedPos)); + boolean flag = state.removedByPlayer(interactionManager.world, clickedPos, interactionManager.player, flag1, + interactionManager.world.getFluidState(clickedPos)); if (flag) - state.getBlock().onPlayerDestroy(interactionManager.world, clickedPos, state); + state.getBlock() + .onPlayerDestroy(interactionManager.world, clickedPos, state); if (flag && flag1) { interactionManager.player.addStat(Stats.BLOCK_MINED.get(state.getBlock())); @@ -334,12 +344,13 @@ public class DeployerHandler { Block.spawnDrops(state, interactionManager.world, clickedPos, te, interactionManager.player, heldItem); if (!interactionManager.world.isRemote && te instanceof BeehiveTileEntity) { - BeehiveTileEntity beehivetileentity = (BeehiveTileEntity)te; + BeehiveTileEntity beehivetileentity = (BeehiveTileEntity) te; if (EnchantmentHelper.getEnchantmentLevel(Enchantments.SILK_TOUCH, heldItem) == 0) { interactionManager.world.updateComparatorOutputLevel(clickedPos, state.getBlock()); } - CriteriaTriggers.BEE_NEST_DESTROYED.test((ServerPlayerEntity)interactionManager.player, state.getBlock(), heldItem, beehivetileentity.getBeeCount()); + CriteriaTriggers.BEE_NEST_DESTROYED.test((ServerPlayerEntity) interactionManager.player, + state.getBlock(), heldItem, beehivetileentity.getBeeCount()); } } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartTrain.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartTrain.java index 987e73920..9390bed32 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartTrain.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartTrain.java @@ -2,9 +2,11 @@ package com.simibubi.create.content.contraptions.components.structureMovement.tr import java.util.ArrayList; import java.util.Collections; +import java.util.List; import java.util.UUID; import com.simibubi.create.CreateClient; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionEntity; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.Iterate; @@ -55,6 +57,8 @@ public class MinecartTrain { // SOFT collision - modify motion of carts with stressed links @t+1 double sharedMotion = 0; int participants = 0; + boolean stall = false; + for (int i = 0; i < couplings.size(); i++) { MinecartCoupling minecartCoupling = couplings.get(i); boolean last = i + 1 == couplings.size(); @@ -64,6 +68,14 @@ public class MinecartTrain { sharedMotion += minecartCoupling.mainCart.get() .getMotion() .length(); + + List passengers = minecartCoupling.mainCart.get().getPassengers(); + if (!passengers.isEmpty() && passengers.get(0) instanceof ContraptionEntity) + if (((ContraptionEntity) passengers.get(0)).isStalled()) { + stall = true; + break; + } + if (last) { participants++; @@ -137,6 +149,12 @@ public class MinecartTrain { MinecartCoupling minecartCoupling = couplings.get(i); if (!minecartCoupling.areBothEndsPresent()) continue; + + if (stall) { + minecartCoupling.asCouple().forEach(ame -> ame.setMotion(Vec3d.ZERO)); + continue; + } + double stress = getStressOfCoupling(minecartCoupling); if (stress > maxStress) { maxStress = stress; diff --git a/src/main/java/com/simibubi/create/foundation/item/IItemHandlerModifiableIntermediate.java b/src/main/java/com/simibubi/create/foundation/item/IItemHandlerModifiableIntermediate.java new file mode 100644 index 000000000..9e035eb1f --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/item/IItemHandlerModifiableIntermediate.java @@ -0,0 +1,15 @@ +package com.simibubi.create.foundation.item; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.items.IItemHandlerModifiable; + +interface IItemHandlerModifiableIntermediate extends IItemHandlerModifiable { + + @Override + public default ItemStack getStackInSlot(int slot) { + return getStackInSlotIntermediate(slot); + } + + public ItemStack getStackInSlotIntermediate(int slot); + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/foundation/item/SmartInventory.java b/src/main/java/com/simibubi/create/foundation/item/SmartInventory.java index 71ddba451..7e5050848 100644 --- a/src/main/java/com/simibubi/create/foundation/item/SmartInventory.java +++ b/src/main/java/com/simibubi/create/foundation/item/SmartInventory.java @@ -7,11 +7,10 @@ import com.simibubi.create.foundation.tileEntity.SyncedTileEntity; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraftforge.common.util.INBTSerializable; -import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.wrapper.RecipeWrapper; -public class SmartInventory extends RecipeWrapper implements IItemHandlerModifiable, INBTSerializable { +public class SmartInventory extends RecipeWrapper implements IItemHandlerModifiableIntermediate, INBTSerializable { private boolean extractionAllowed; private boolean insertionAllowed; @@ -83,6 +82,11 @@ public class SmartInventory extends RecipeWrapper implements IItemHandlerModifia inv.setStackInSlot(slot, stack); } + @Override + public ItemStack getStackInSlot(int slot) { + return super.getStackInSlot(slot); + } + public int getStackLimit(int slot, @Nonnull ItemStack stack) { return Math.min(getSlotLimit(slot), stack.getMaxStackSize()); } @@ -118,4 +122,9 @@ public class SmartInventory extends RecipeWrapper implements IItemHandlerModifia } + @Override + public ItemStack getStackInSlotIntermediate(int slot) { + return getStackInSlot(slot); + } + } From c1316d1c8d0df6acd43dd20114bcf977ce8ae9b4 Mon Sep 17 00:00:00 2001 From: grimmauld Date: Thu, 1 Oct 2020 12:37:55 +0200 Subject: [PATCH 07/12] Dump the moving bucket --- .../java/com/simibubi/create/AllBlocks.java | 2 + .../processing/BasinMovementBehaviour.java | 64 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/processing/BasinMovementBehaviour.java diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 3514f9fb9..7a253cb0d 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -73,6 +73,7 @@ import com.simibubi.create.content.contraptions.fluids.tank.FluidTankGenerator; import com.simibubi.create.content.contraptions.fluids.tank.FluidTankItem; import com.simibubi.create.content.contraptions.fluids.tank.FluidTankModel; import com.simibubi.create.content.contraptions.processing.BasinBlock; +import com.simibubi.create.content.contraptions.processing.BasinMovementBehaviour; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlockItem; import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerBlock; @@ -408,6 +409,7 @@ public class AllBlocks { public static final BlockEntry BASIN = REGISTRATE.block("basin", BasinBlock::new) .initialProperties(SharedProperties::stone) .blockstate((ctx, prov) -> prov.simpleBlock(ctx.getEntry(), AssetLookup.standardModel(ctx, prov))) + .onRegister(addMovementBehaviour(new BasinMovementBehaviour())) .simpleItem() .register(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinMovementBehaviour.java new file mode 100644 index 000000000..890f26db5 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinMovementBehaviour.java @@ -0,0 +1,64 @@ +package com.simibubi.create.content.contraptions.processing; + +import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.foundation.utility.VecHelper; +import net.minecraft.entity.item.ItemEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Direction; +import net.minecraft.util.math.Vec3d; +import net.minecraftforge.items.ItemStackHandler; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class BasinMovementBehaviour extends MovementBehaviour { + @SuppressWarnings("unchecked") + public Map getOrReadInventory(MovementContext context) { + if (!(context.temporaryData instanceof List)) { + Map map = new HashMap<>(); + map.put("InputItems", new ItemStackHandler(9)); + map.put("OutputItems", new ItemStackHandler(8)); + map.forEach((s, h) -> h.deserializeNBT(context.tileData.getCompound(s))); + context.temporaryData = map; + } + return (Map) context.temporaryData; + } + + @Override + public void writeExtraData(MovementContext context) { + super.writeExtraData(context); + getOrReadInventory(context).forEach((s, h) -> context.tileData.put(s, h.serializeNBT())); + } + + @Override + public boolean hasSpecialMovementRenderer() { + return false; + } + + @Override + public void tick(MovementContext context) { + super.tick(context); + Vec3d facingVec = VecHelper.rotate(new Vec3d(Direction.UP.getDirectionVec()), context.rotation.x, context.rotation.y, context.rotation.z); + facingVec.normalize(); + if (Direction.getFacingFromVector(facingVec.x, facingVec.y, facingVec.z) == Direction.DOWN) + dump(context, facingVec); + } + + private void dump(MovementContext context, Vec3d facingVec) { + getOrReadInventory(context).forEach((key, itemStackHandler) -> { + for (int i = 0; i < itemStackHandler.getSlots(); i++) { + if (itemStackHandler.getStackInSlot(i).isEmpty()) + continue; + ItemEntity itemEntity = new ItemEntity(context.world, context.position.x, context.position.y, context.position.z, itemStackHandler.getStackInSlot(i)); + itemEntity.setMotion(facingVec.scale(.05)); + context.world.addEntity(itemEntity); + itemStackHandler.setStackInSlot(i, ItemStack.EMPTY); + } + context.tileData.put(key, itemStackHandler.serializeNBT()); + }); + context.temporaryData = null; + context.contraption.customRenderTEs.stream().filter(te -> te.getPos().equals(context.localPos)).forEach(te -> te.read(context.tileData)); + } +} From 59f19adb8958309928a0c38a6b60a8b837c2ade2 Mon Sep 17 00:00:00 2001 From: grimmauld Date: Thu, 1 Oct 2020 13:08:16 +0200 Subject: [PATCH 08/12] optimized bucket dumping --- .../processing/BasinMovementBehaviour.java | 111 ++++++++++++------ 1 file changed, 74 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinMovementBehaviour.java index 890f26db5..b658ea9d0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinMovementBehaviour.java @@ -1,36 +1,25 @@ package com.simibubi.create.content.contraptions.processing; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; -import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandlerModifiable; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import javax.annotation.Nullable; public class BasinMovementBehaviour extends MovementBehaviour { - @SuppressWarnings("unchecked") - public Map getOrReadInventory(MovementContext context) { - if (!(context.temporaryData instanceof List)) { - Map map = new HashMap<>(); - map.put("InputItems", new ItemStackHandler(9)); - map.put("OutputItems", new ItemStackHandler(8)); - map.forEach((s, h) -> h.deserializeNBT(context.tileData.getCompound(s))); - context.temporaryData = map; - } - return (Map) context.temporaryData; - } - - @Override - public void writeExtraData(MovementContext context) { - super.writeExtraData(context); - getOrReadInventory(context).forEach((s, h) -> context.tileData.put(s, h.serializeNBT())); - } + private static final Object NO_OR_EMPTY_BASIN = new Object(); @Override public boolean hasSpecialMovementRenderer() { @@ -40,25 +29,73 @@ public class BasinMovementBehaviour extends MovementBehaviour { @Override public void tick(MovementContext context) { super.tick(context); - Vec3d facingVec = VecHelper.rotate(new Vec3d(Direction.UP.getDirectionVec()), context.rotation.x, context.rotation.y, context.rotation.z); - facingVec.normalize(); - if (Direction.getFacingFromVector(facingVec.x, facingVec.y, facingVec.z) == Direction.DOWN) - dump(context, facingVec); + if (context.temporaryData != NO_OR_EMPTY_BASIN) { + Vec3d facingVec = VecHelper.rotate(new Vec3d(Direction.UP.getDirectionVec()), context.rotation.x, context.rotation.y, context.rotation.z); + facingVec.normalize(); + if (Direction.getFacingFromVector(facingVec.x, facingVec.y, facingVec.z) == Direction.DOWN) { + dump(context, facingVec); + } + } } private void dump(MovementContext context, Vec3d facingVec) { - getOrReadInventory(context).forEach((key, itemStackHandler) -> { - for (int i = 0; i < itemStackHandler.getSlots(); i++) { - if (itemStackHandler.getStackInSlot(i).isEmpty()) - continue; - ItemEntity itemEntity = new ItemEntity(context.world, context.position.x, context.position.y, context.position.z, itemStackHandler.getStackInSlot(i)); - itemEntity.setMotion(facingVec.scale(.05)); - context.world.addEntity(itemEntity); - itemStackHandler.setStackInSlot(i, ItemStack.EMPTY); + BasinTileEntity te = getOrCreate(context); + if (te == null) + return; + te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY).ifPresent(itemStackHandler -> { + if (!(itemStackHandler instanceof IItemHandlerModifiable)) + return; + for (int i = 0; i < itemStackHandler.getSlots(); i++) { + if (itemStackHandler.getStackInSlot(i).isEmpty()) + continue; + ItemEntity itemEntity = new ItemEntity(context.world, context.position.x, context.position.y, context.position.z, itemStackHandler.getStackInSlot(i)); + itemEntity.setMotion(facingVec.scale(.05)); + context.world.addEntity(itemEntity); + ((IItemHandlerModifiable) itemStackHandler).setStackInSlot(i, ItemStack.EMPTY); + } + te.write(context.tileData); + context.temporaryData = NO_OR_EMPTY_BASIN; } - context.tileData.put(key, itemStackHandler.serializeNBT()); - }); - context.temporaryData = null; - context.contraption.customRenderTEs.stream().filter(te -> te.getPos().equals(context.localPos)).forEach(te -> te.read(context.tileData)); + ); + } + + @Nullable + private BasinTileEntity getOrCreate(MovementContext context) { + if (!(context.temporaryData instanceof BasinTileEntity || context.temporaryData == NO_OR_EMPTY_BASIN)) { + if (context.contraption.customRenderTEs.isEmpty()) { + // customRenderTEs are sometimes completely empty? Probably a server thing + context.tileData.putInt("x", context.localPos.getX()); + context.tileData.putInt("y", context.localPos.getY()); + context.tileData.putInt("z", context.localPos.getZ()); + TileEntity te = TileEntity.create(context.tileData); + if (te == null) { + context.temporaryData = NO_OR_EMPTY_BASIN; + return null; + } + te.setLocation(new WrappedWorld(context.world) { + @Override + public BlockState getBlockState(BlockPos pos) { + if (!pos.equals(te.getPos())) + return Blocks.AIR.getDefaultState(); + return context.state; + } + }, te.getPos()); + if (te instanceof KineticTileEntity) + ((KineticTileEntity) te).setSpeed(0); + te.getBlockState(); + context.temporaryData = te; + } else { + for (TileEntity te : context.contraption.customRenderTEs) { + if (te instanceof BasinTileEntity && te.getPos().equals(context.localPos)) { + context.temporaryData = te; + return ((BasinTileEntity) te); + } + } + context.temporaryData = NO_OR_EMPTY_BASIN; + } + } + if (!(context.temporaryData instanceof BasinTileEntity)) + return null; + return ((BasinTileEntity) context.temporaryData); } } From 5cf4e02f458220936a7cc09747dd2006a29ae7f1 Mon Sep 17 00:00:00 2001 From: grimmauld Date: Thu, 1 Oct 2020 15:18:27 +0200 Subject: [PATCH 09/12] Simi Says - reverted to temporary ItemStackHandlers to modify basins to avoid having weird TEs that should only exist on Clients present on the server --- .../processing/BasinMovementBehaviour.java | 94 +++++-------------- .../processing/BasinTileEntity.java | 4 + 2 files changed, 28 insertions(+), 70 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinMovementBehaviour.java index b658ea9d0..39b6f3d3b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinMovementBehaviour.java @@ -1,25 +1,25 @@ package com.simibubi.create.content.contraptions.processing; -import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; -import net.minecraftforge.items.CapabilityItemHandler; -import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.ItemStackHandler; -import javax.annotation.Nullable; +import java.util.HashMap; +import java.util.Map; public class BasinMovementBehaviour extends MovementBehaviour { - private static final Object NO_OR_EMPTY_BASIN = new Object(); + public Map getOrReadInventory(MovementContext context) { + Map map = new HashMap<>(); + map.put("InputItems", new ItemStackHandler(9)); + map.put("OutputItems", new ItemStackHandler(8)); + map.forEach((s, h) -> h.deserializeNBT(context.tileData.getCompound(s))); + return map; + } @Override public boolean hasSpecialMovementRenderer() { @@ -29,73 +29,27 @@ public class BasinMovementBehaviour extends MovementBehaviour { @Override public void tick(MovementContext context) { super.tick(context); - if (context.temporaryData != NO_OR_EMPTY_BASIN) { + if (context.temporaryData == null || (boolean) context.temporaryData) { Vec3d facingVec = VecHelper.rotate(new Vec3d(Direction.UP.getDirectionVec()), context.rotation.x, context.rotation.y, context.rotation.z); facingVec.normalize(); - if (Direction.getFacingFromVector(facingVec.x, facingVec.y, facingVec.z) == Direction.DOWN) { + if (Direction.getFacingFromVector(facingVec.x, facingVec.y, facingVec.z) == Direction.DOWN) dump(context, facingVec); - } } } private void dump(MovementContext context, Vec3d facingVec) { - BasinTileEntity te = getOrCreate(context); - if (te == null) - return; - te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY).ifPresent(itemStackHandler -> { - if (!(itemStackHandler instanceof IItemHandlerModifiable)) - return; - for (int i = 0; i < itemStackHandler.getSlots(); i++) { - if (itemStackHandler.getStackInSlot(i).isEmpty()) - continue; - ItemEntity itemEntity = new ItemEntity(context.world, context.position.x, context.position.y, context.position.z, itemStackHandler.getStackInSlot(i)); - itemEntity.setMotion(facingVec.scale(.05)); - context.world.addEntity(itemEntity); - ((IItemHandlerModifiable) itemStackHandler).setStackInSlot(i, ItemStack.EMPTY); - } - te.write(context.tileData); - context.temporaryData = NO_OR_EMPTY_BASIN; + getOrReadInventory(context).forEach((key, itemStackHandler) -> { + for (int i = 0; i < itemStackHandler.getSlots(); i++) { + if (itemStackHandler.getStackInSlot(i).isEmpty()) + continue; + ItemEntity itemEntity = new ItemEntity(context.world, context.position.x, context.position.y, context.position.z, itemStackHandler.getStackInSlot(i)); + itemEntity.setMotion(facingVec.scale(.05)); + context.world.addEntity(itemEntity); + itemStackHandler.setStackInSlot(i, ItemStack.EMPTY); } - ); - } - - @Nullable - private BasinTileEntity getOrCreate(MovementContext context) { - if (!(context.temporaryData instanceof BasinTileEntity || context.temporaryData == NO_OR_EMPTY_BASIN)) { - if (context.contraption.customRenderTEs.isEmpty()) { - // customRenderTEs are sometimes completely empty? Probably a server thing - context.tileData.putInt("x", context.localPos.getX()); - context.tileData.putInt("y", context.localPos.getY()); - context.tileData.putInt("z", context.localPos.getZ()); - TileEntity te = TileEntity.create(context.tileData); - if (te == null) { - context.temporaryData = NO_OR_EMPTY_BASIN; - return null; - } - te.setLocation(new WrappedWorld(context.world) { - @Override - public BlockState getBlockState(BlockPos pos) { - if (!pos.equals(te.getPos())) - return Blocks.AIR.getDefaultState(); - return context.state; - } - }, te.getPos()); - if (te instanceof KineticTileEntity) - ((KineticTileEntity) te).setSpeed(0); - te.getBlockState(); - context.temporaryData = te; - } else { - for (TileEntity te : context.contraption.customRenderTEs) { - if (te instanceof BasinTileEntity && te.getPos().equals(context.localPos)) { - context.temporaryData = te; - return ((BasinTileEntity) te); - } - } - context.temporaryData = NO_OR_EMPTY_BASIN; - } - } - if (!(context.temporaryData instanceof BasinTileEntity)) - return null; - return ((BasinTileEntity) context.temporaryData); + context.tileData.put(key, itemStackHandler.serializeNBT()); + }); + context.contraption.customRenderTEs.stream().filter(te -> te.getPos().equals(context.localPos) && te instanceof BasinTileEntity).forEach(te -> ((BasinTileEntity) te).readOnlyItems(context.tileData)); + context.temporaryData = false; // did already dump, so can't any more } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java index 1c28f9a3a..6b437512f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java @@ -167,4 +167,8 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt } + public void readOnlyItems(CompoundNBT compound) { + inputInventory.deserializeNBT(compound.getCompound("InputItems")); + outputInventory.deserializeNBT(compound.getCompound("OutputItems")); + } } From d5f2d9b1012bd7228c941f01be49206811421b8e Mon Sep 17 00:00:00 2001 From: grimmauld Date: Thu, 1 Oct 2020 18:49:40 +0200 Subject: [PATCH 10/12] fruit loops --- src/generated/resources/.cache/cache | 99 ++++- .../blockstates/black_valve_handle.json | 30 ++ .../create/blockstates/blue_valve_handle.json | 30 ++ .../blockstates/brown_valve_handle.json | 30 ++ .../blockstates/copper_valve_handle.json | 30 ++ .../create/blockstates/cyan_valve_handle.json | 30 ++ .../assets/create/blockstates/fluid_pipe.json | 190 ++++----- .../create/blockstates/gray_valve_handle.json | 30 ++ .../blockstates/green_valve_handle.json | 30 ++ .../blockstates/light_blue_valve_handle.json | 30 ++ .../blockstates/light_gray_valve_handle.json | 30 ++ .../create/blockstates/lime_valve_handle.json | 30 ++ .../blockstates/magenta_valve_handle.json | 30 ++ .../blockstates/orange_valve_handle.json | 30 ++ .../create/blockstates/pink_valve_handle.json | 30 ++ .../blockstates/purple_valve_handle.json | 30 ++ .../create/blockstates/radial_chassis.json | 24 +- ...alve_handle.json => red_valve_handle.json} | 12 +- .../blockstates/white_valve_handle.json | 30 ++ .../blockstates/yellow_valve_handle.json | 30 ++ .../resources/assets/create/lang/en_ud.json | 18 +- .../resources/assets/create/lang/en_us.json | 18 +- .../assets/create/lang/unfinished/de_de.json | 20 +- .../assets/create/lang/unfinished/fr_fr.json | 20 +- .../assets/create/lang/unfinished/it_it.json | 20 +- .../assets/create/lang/unfinished/ja_jp.json | 20 +- .../assets/create/lang/unfinished/ko_kr.json | 20 +- .../assets/create/lang/unfinished/nl_nl.json | 20 +- .../assets/create/lang/unfinished/pt_br.json | 20 +- .../assets/create/lang/unfinished/ru_ru.json | 20 +- .../assets/create/lang/unfinished/zh_cn.json | 20 +- .../create/models/block/black_seat.json | 1 + .../models/block/black_valve_handle.json | 6 + .../assets/create/models/block/blue_seat.json | 1 + .../models/block/blue_valve_handle.json | 6 + .../create/models/block/brown_seat.json | 1 + .../models/block/brown_valve_handle.json | 6 + .../models/block/copper_valve_handle.json | 6 + .../assets/create/models/block/cyan_seat.json | 1 + .../models/block/cyan_valve_handle.json | 6 + .../assets/create/models/block/gray_seat.json | 1 + .../models/block/gray_valve_handle.json | 6 + .../create/models/block/green_seat.json | 1 + .../models/block/green_valve_handle.json | 6 + .../create/models/block/light_blue_seat.json | 1 + .../models/block/light_blue_valve_handle.json | 6 + .../create/models/block/light_gray_seat.json | 1 + .../models/block/light_gray_valve_handle.json | 6 + .../assets/create/models/block/lime_seat.json | 1 + .../models/block/lime_valve_handle.json | 6 + .../create/models/block/magenta_seat.json | 1 + .../models/block/magenta_valve_handle.json | 6 + .../create/models/block/orange_seat.json | 1 + .../models/block/orange_valve_handle.json | 6 + .../assets/create/models/block/pink_seat.json | 1 + .../models/block/pink_valve_handle.json | 6 + .../create/models/block/purple_seat.json | 1 + .../models/block/purple_valve_handle.json | 6 + .../assets/create/models/block/red_seat.json | 1 + .../create/models/block/red_valve_handle.json | 6 + .../create/models/block/white_seat.json | 1 + .../models/block/white_valve_handle.json | 6 + .../create/models/block/yellow_seat.json | 1 + .../models/block/yellow_valve_handle.json | 6 + .../models/item/black_valve_handle.json | 3 + .../create/models/item/blue_valve_handle.json | 3 + .../models/item/brown_valve_handle.json | 3 + .../models/item/copper_valve_handle.json | 3 + .../create/models/item/cyan_valve_handle.json | 3 + .../create/models/item/gray_valve_handle.json | 3 + .../models/item/green_valve_handle.json | 3 + .../models/item/light_blue_valve_handle.json | 3 + .../models/item/light_gray_valve_handle.json | 3 + .../create/models/item/lime_valve_handle.json | 3 + .../models/item/magenta_valve_handle.json | 3 + .../models/item/orange_valve_handle.json | 3 + .../create/models/item/pink_valve_handle.json | 3 + .../models/item/purple_valve_handle.json | 3 + .../create/models/item/red_valve_handle.json | 3 + .../create/models/item/valve_handle.json | 3 - .../models/item/white_valve_handle.json | 3 + .../models/item/yellow_valve_handle.json | 3 + .../blocks/black_valve_handle.json | 19 + .../loot_tables/blocks/blue_valve_handle.json | 19 + .../blocks/brown_valve_handle.json | 19 + .../blocks/copper_valve_handle.json | 19 + .../loot_tables/blocks/cyan_valve_handle.json | 19 + .../loot_tables/blocks/gray_valve_handle.json | 19 + .../blocks/green_valve_handle.json | 19 + .../blocks/light_blue_valve_handle.json | 19 + .../blocks/light_gray_valve_handle.json | 19 + .../loot_tables/blocks/lime_valve_handle.json | 19 + .../blocks/magenta_valve_handle.json | 19 + .../blocks/orange_valve_handle.json | 19 + .../loot_tables/blocks/pink_valve_handle.json | 19 + .../blocks/purple_valve_handle.json | 19 + ...alve_handle.json => red_valve_handle.json} | 2 +- .../blocks/white_valve_handle.json | 19 + .../blocks/yellow_valve_handle.json | 19 + .../data/create/tags/blocks/brittle.json | 18 +- .../java/com/simibubi/create/AllBlocks.java | 12 +- .../com/simibubi/create/AllTileEntities.java | 4 +- .../components/crank/AllValveHandles.java | 36 ++ .../components/crank/ValveHandleBlock.java | 20 +- .../create/models/block/valve_handle.json | 371 ++++++++++++------ .../block/valve_handle/valve_handle_black.png | Bin 0 -> 354 bytes .../block/valve_handle/valve_handle_blue.png | Bin 0 -> 389 bytes .../block/valve_handle/valve_handle_brown.png | Bin 0 -> 361 bytes .../valve_handle/valve_handle_copper.png | Bin 0 -> 2048 bytes .../block/valve_handle/valve_handle_cyan.png | Bin 0 -> 373 bytes .../block/valve_handle/valve_handle_gray.png | Bin 0 -> 363 bytes .../block/valve_handle/valve_handle_green.png | Bin 0 -> 334 bytes .../valve_handle/valve_handle_light_blue.png | Bin 0 -> 365 bytes .../valve_handle/valve_handle_light_gray.png | Bin 0 -> 367 bytes .../block/valve_handle/valve_handle_lime.png | Bin 0 -> 1572 bytes .../valve_handle/valve_handle_magenta.png | Bin 0 -> 1508 bytes .../valve_handle/valve_handle_orange.png | Bin 0 -> 372 bytes .../block/valve_handle/valve_handle_pink.png | Bin 0 -> 373 bytes .../valve_handle/valve_handle_purple.png | Bin 0 -> 338 bytes .../block/valve_handle/valve_handle_red.png | Bin 0 -> 1907 bytes .../block/valve_handle/valve_handle_white.png | Bin 0 -> 355 bytes .../valve_handle/valve_handle_yellow.png | Bin 0 -> 1467 bytes 122 files changed, 1680 insertions(+), 280 deletions(-) create mode 100644 src/generated/resources/assets/create/blockstates/black_valve_handle.json create mode 100644 src/generated/resources/assets/create/blockstates/blue_valve_handle.json create mode 100644 src/generated/resources/assets/create/blockstates/brown_valve_handle.json create mode 100644 src/generated/resources/assets/create/blockstates/copper_valve_handle.json create mode 100644 src/generated/resources/assets/create/blockstates/cyan_valve_handle.json create mode 100644 src/generated/resources/assets/create/blockstates/gray_valve_handle.json create mode 100644 src/generated/resources/assets/create/blockstates/green_valve_handle.json create mode 100644 src/generated/resources/assets/create/blockstates/light_blue_valve_handle.json create mode 100644 src/generated/resources/assets/create/blockstates/light_gray_valve_handle.json create mode 100644 src/generated/resources/assets/create/blockstates/lime_valve_handle.json create mode 100644 src/generated/resources/assets/create/blockstates/magenta_valve_handle.json create mode 100644 src/generated/resources/assets/create/blockstates/orange_valve_handle.json create mode 100644 src/generated/resources/assets/create/blockstates/pink_valve_handle.json create mode 100644 src/generated/resources/assets/create/blockstates/purple_valve_handle.json rename src/generated/resources/assets/create/blockstates/{valve_handle.json => red_valve_handle.json} (51%) create mode 100644 src/generated/resources/assets/create/blockstates/white_valve_handle.json create mode 100644 src/generated/resources/assets/create/blockstates/yellow_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/block/black_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/block/blue_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/block/brown_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/block/copper_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/block/cyan_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/block/gray_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/block/green_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/block/light_blue_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/block/light_gray_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/block/lime_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/block/magenta_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/block/orange_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/block/pink_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/block/purple_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/block/red_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/block/white_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/block/yellow_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/item/black_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/item/blue_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/item/brown_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/item/copper_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/item/cyan_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/item/gray_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/item/green_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/item/light_blue_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/item/light_gray_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/item/lime_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/item/magenta_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/item/orange_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/item/pink_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/item/purple_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/item/red_valve_handle.json delete mode 100644 src/generated/resources/assets/create/models/item/valve_handle.json create mode 100644 src/generated/resources/assets/create/models/item/white_valve_handle.json create mode 100644 src/generated/resources/assets/create/models/item/yellow_valve_handle.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/black_valve_handle.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/blue_valve_handle.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/brown_valve_handle.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/copper_valve_handle.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/cyan_valve_handle.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/gray_valve_handle.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/green_valve_handle.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/light_blue_valve_handle.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/light_gray_valve_handle.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/lime_valve_handle.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/magenta_valve_handle.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/orange_valve_handle.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/pink_valve_handle.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/purple_valve_handle.json rename src/generated/resources/data/create/loot_tables/blocks/{valve_handle.json => red_valve_handle.json} (85%) create mode 100644 src/generated/resources/data/create/loot_tables/blocks/white_valve_handle.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/yellow_valve_handle.json create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/crank/AllValveHandles.java create mode 100644 src/main/resources/assets/create/textures/block/valve_handle/valve_handle_black.png create mode 100644 src/main/resources/assets/create/textures/block/valve_handle/valve_handle_blue.png create mode 100644 src/main/resources/assets/create/textures/block/valve_handle/valve_handle_brown.png create mode 100644 src/main/resources/assets/create/textures/block/valve_handle/valve_handle_copper.png create mode 100644 src/main/resources/assets/create/textures/block/valve_handle/valve_handle_cyan.png create mode 100644 src/main/resources/assets/create/textures/block/valve_handle/valve_handle_gray.png create mode 100644 src/main/resources/assets/create/textures/block/valve_handle/valve_handle_green.png create mode 100644 src/main/resources/assets/create/textures/block/valve_handle/valve_handle_light_blue.png create mode 100644 src/main/resources/assets/create/textures/block/valve_handle/valve_handle_light_gray.png create mode 100644 src/main/resources/assets/create/textures/block/valve_handle/valve_handle_lime.png create mode 100644 src/main/resources/assets/create/textures/block/valve_handle/valve_handle_magenta.png create mode 100644 src/main/resources/assets/create/textures/block/valve_handle/valve_handle_orange.png create mode 100644 src/main/resources/assets/create/textures/block/valve_handle/valve_handle_pink.png create mode 100644 src/main/resources/assets/create/textures/block/valve_handle/valve_handle_purple.png create mode 100644 src/main/resources/assets/create/textures/block/valve_handle/valve_handle_red.png create mode 100644 src/main/resources/assets/create/textures/block/valve_handle/valve_handle_white.png create mode 100644 src/main/resources/assets/create/textures/block/valve_handle/valve_handle_yellow.png diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 4e96a6802..264330a9d 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -23,14 +23,17 @@ f25693a9429f6337149ff24f27900dc4eb82a7c2 assets/create/blockstates/belt.json cf9045eb16e5299a1d917c4cb536289f49411276 assets/create/blockstates/birch_window.json 94a1a91403eb4b035fec48071e7fcae57a8a6abd assets/create/blockstates/birch_window_pane.json 58b07d2af6030342f0354f6d3fd0ee128d2d74b4 assets/create/blockstates/black_seat.json +a71ddf3291bd13d7877f2fe32c42f50407f99afb assets/create/blockstates/black_valve_handle.json 923aeb2a556f67bc0526f237dd97af2d37b4c9f1 assets/create/blockstates/blaze_burner.json 4854d1ef52130a7887aecc60bcaffbd66f0871a8 assets/create/blockstates/blue_seat.json +9d7341a5cae5d47788c595167946dfb6441cebd1 assets/create/blockstates/blue_valve_handle.json fba967b1f6e44b34a9d9662e2fedfc13aad7f36c assets/create/blockstates/brass_belt_funnel.json 8b1dd00adcc7e74c5a9feed069e2610b15a338cb assets/create/blockstates/brass_block.json b8dd6e505943e06706d0718ece620ab3cf943650 assets/create/blockstates/brass_casing.json 3057e1121117c0cd651c288cd8e2d46bdf64afb1 assets/create/blockstates/brass_funnel.json 672eedcd3520c6d39603449165a23be9c612c620 assets/create/blockstates/brass_tunnel.json e81608346d43406ee72cae0f78b8bcfb37ba2d75 assets/create/blockstates/brown_seat.json +322289524c058fac66bbe76b4924c3b0c0c33b84 assets/create/blockstates/brown_valve_handle.json 26f3b6a8f8249e4e622ab200057d75e228762817 assets/create/blockstates/cart_assembler.json 7299cea212d879d6d5611bd139b24768b9af236f assets/create/blockstates/chiseled_dark_scoria.json 0f01f813388d3e6907c1cfd992e4b21c914e267e assets/create/blockstates/chiseled_dolomite.json @@ -48,12 +51,14 @@ cabf6b8c59eb0e3d56a0a5a856ca058bb3200882 assets/create/blockstates/copper_casing 3355a852cdc717e257ca19b3db836068964733e3 assets/create/blockstates/copper_ore.json dc76bca1fdd41c8e6ada27fd59a2b73d7adc9596 assets/create/blockstates/copper_shingles.json ecf4a72411870bfdbf8a59469b114cd77621c343 assets/create/blockstates/copper_tiles.json +890be245b914c1a9f29f48a8c5d325640b5be160 assets/create/blockstates/copper_valve_handle.json 3df0d5d5170a2f6cbab0f8a9bc8f2d64229589af assets/create/blockstates/creative_crate.json f0031f5e970b3d5695472ed384950b8631b015ed assets/create/blockstates/creative_motor.json fe2f78b94c20944399101e7369e2d43324297fb6 assets/create/blockstates/crushing_wheel.json a1dd6cb3daa97ea871290ef7b178d28b564ee2a2 assets/create/blockstates/crushing_wheel_controller.json b1126c191877cff86b4e2de83e1fcbd151451cb7 assets/create/blockstates/cuckoo_clock.json 4de72f65bff4e5d9c8153fa3adeee6b61d6f912b assets/create/blockstates/cyan_seat.json +2c04d57e56849f243aec8a1e769574d24daac1e9 assets/create/blockstates/cyan_valve_handle.json 1726b1b9e04a0634e7e1fdcf1cf4cc898efc5c2f assets/create/blockstates/dark_oak_window.json 50d4627d8e8b5adade12de764ab528ddacfa9ea5 assets/create/blockstates/dark_oak_window_pane.json 21e435ad3baf69970446b0acd3db0d6d02dc9fcb assets/create/blockstates/dark_scoria.json @@ -127,7 +132,7 @@ de8a40b7daf1497d5aecee47a43b3e0b1d030b00 assets/create/blockstates/fancy_scoria_ fc9ac0a7e7191b93516719455a17177fa6524ecc assets/create/blockstates/fancy_weathered_limestone_bricks_slab.json b2a7c321b1795f20e7433f81a55ce4683de081b8 assets/create/blockstates/fancy_weathered_limestone_bricks_stairs.json 6372fe02ba0065acb0758121c45a15a1a8fdc5de assets/create/blockstates/fancy_weathered_limestone_bricks_wall.json -4c3e0500f9382d2e426e823fe876f57f4d7ee3b4 assets/create/blockstates/fluid_pipe.json +3d97226b5e8d8f70ed08e45e78db1faf78d5e28b assets/create/blockstates/fluid_pipe.json f0eaab18e16c4f3f65ebf3b55b08f0dc445720fe assets/create/blockstates/fluid_tank.json 5408d92ab02af86539ac42971d4033545970bb3a assets/create/blockstates/fluid_valve.json e9da1794b6ece7f9aa8bcb43d42c23a55446133b assets/create/blockstates/flywheel.json @@ -157,7 +162,9 @@ d97fdea02187e63f6b63913357c79a18660d676d assets/create/blockstates/granite_cobbl 9ce66b5a61c3aad398756d26e4efee2b9e12a275 assets/create/blockstates/granite_cobblestone_wall.json f8659e81cd2a623475a6a9aca59149e82de56b1c assets/create/blockstates/granite_pillar.json a5ec5401ba9f3e102a2e1b35837f643847afbca4 assets/create/blockstates/gray_seat.json +5f17a5868616b33eb157965a661046cab7a1427f assets/create/blockstates/gray_valve_handle.json 13059309684db0cc7a0f1f4fce2407cf06cce80a assets/create/blockstates/green_seat.json +f4a0fc68e8daaa0a47cdc951ced4310057a874b0 assets/create/blockstates/green_valve_handle.json 6ab675fa06317e6d07c0c1a453e7bb43e3f46b3b assets/create/blockstates/hand_crank.json be3bef7e091d8b50bfc1c6b7275946d1f636aefd assets/create/blockstates/horizontal_framed_glass.json 18d9fdaa1352a7e2ec91135e46dae5c02ccd8f8f assets/create/blockstates/horizontal_framed_glass_pane.json @@ -174,8 +181,11 @@ a4cfcdc038af0f93a58d88ea8860b34d73632ff4 assets/create/blockstates/layered_dolom 8535d628f8834be62cdf62ef4b60c2ce3a7af99f assets/create/blockstates/layered_scoria.json 419d7fffc5cbd392f10211afa8d17e3eb8df8380 assets/create/blockstates/layered_weathered_limestone.json 2a0a8b1715700bf1e284ee57ef9f7f163c12f3ee assets/create/blockstates/light_blue_seat.json +9bee040558a6b24e21f837fc808e17fae1883e71 assets/create/blockstates/light_blue_valve_handle.json d9a2551e001bb315d071bb9f1f013323a66a5d09 assets/create/blockstates/light_gray_seat.json +8bea8c86de8c218c8932eef140f0ed439e173156 assets/create/blockstates/light_gray_valve_handle.json 1de3a88c003df03f5006e1bbaa0236589aba08ad assets/create/blockstates/lime_seat.json +179a3e68b9f2e289eafe0e98e768befbbf91c5c2 assets/create/blockstates/lime_valve_handle.json c4dcb169bd1dffe8501bff455e3eb6ba979f60ab assets/create/blockstates/limesand.json e7cb0b25e511610b46dfd219e0cc5ea60a79d56b assets/create/blockstates/limestone.json e7c7b952137c4cb615988ea59b9f14303c9a4dfe assets/create/blockstates/limestone_bricks.json @@ -189,6 +199,7 @@ e7c7b952137c4cb615988ea59b9f14303c9a4dfe assets/create/blockstates/limestone_bri b7506b862d13b3f915c60d38bb7a20afc935f70a assets/create/blockstates/limestone_pillar.json 69790737767e06f000c7824749c46664a123160e assets/create/blockstates/linear_chassis.json 84c494d24cc58af274fdd054896c680e8095d2d0 assets/create/blockstates/magenta_seat.json +3bfce5016e5c929b74368dc2d734e62ae34587a4 assets/create/blockstates/magenta_valve_handle.json 3b3250d6e209403a93d025604a8081087965016e assets/create/blockstates/mechanical_arm.json ddcf4bb281e046fbb1026b8f46a2cf12448598df assets/create/blockstates/mechanical_bearing.json 5586beef2d9183dc34d8e8d2723620c0569592ae assets/create/blockstates/mechanical_crafter.json @@ -219,6 +230,7 @@ b1126c191877cff86b4e2de83e1fcbd151451cb7 assets/create/blockstates/mysterious_cu cf60989f63f02067fc4e4ad25033ac83167cdeb0 assets/create/blockstates/oak_window.json 4a796509c3953171f04f957351282205840b3760 assets/create/blockstates/oak_window_pane.json 5764a24f6c4fa552b61d2a02135adfc7d93c2e10 assets/create/blockstates/orange_seat.json +1445074ec21a3735ea912b624c0f9f18a450d2d3 assets/create/blockstates/orange_valve_handle.json 8e2028e1a0450a592eed5e10276ba19b1195a206 assets/create/blockstates/ornate_iron_window.json f59198fd966927e21e9bf76e64de533d05ea893b assets/create/blockstates/ornate_iron_window_pane.json c46f0b62967cf483ec0720a9297c8ccc97f5547d assets/create/blockstates/overgrown_andesite.json @@ -267,6 +279,7 @@ cb23aef25f3106b06c8fa8f152c638bb0d2185d8 assets/create/blockstates/paved_weather d62b0992cec1de45dad1f2c273132225f4ef33a0 assets/create/blockstates/paved_weathered_limestone_stairs.json dba4cf86e82ed4502fffed363fbce226a445e774 assets/create/blockstates/paved_weathered_limestone_wall.json 919a79e4a4a5fab0aac3ef48e1c786017d6aa001 assets/create/blockstates/pink_seat.json +471a3bb474a0ae0453143888d561256cce894e3f assets/create/blockstates/pink_valve_handle.json 975c97018e9e2419943eaab43aed0970e96feaf7 assets/create/blockstates/piston_extension_pole.json 2f764f460aa1d75ba995da180bc6f8d2bd9db385 assets/create/blockstates/polished_dark_scoria.json 262b22dcf3e151e63f58710f6b6fe4fc4fc2a70c assets/create/blockstates/polished_dark_scoria_slab.json @@ -298,8 +311,10 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl 3a739f9d4276828d83f2d2750bf3227c87bcd438 assets/create/blockstates/pulley_magnet.json 469e430d96cb0a5e1aaf6b7cc5d401d488c9e600 assets/create/blockstates/pulse_repeater.json 92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json -89b63c6e5875da07226854651079bcea85439f5b assets/create/blockstates/radial_chassis.json +61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json +8d7e653bfd9846e684a0d3725595714a19201017 assets/create/blockstates/radial_chassis.json da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json +722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json 8929677f2cc5354aa19ef182af69f9f0b41eb242 assets/create/blockstates/redstone_contact.json c29213b77ac0c78d8979c5f6188d2b265696f9b9 assets/create/blockstates/redstone_link.json b76ed5f6d271349b2509708c11e713bb299a57b6 assets/create/blockstates/refined_radiance_casing.json @@ -333,7 +348,6 @@ e815bfd854c2653f10828bb11950f7fb991d7efc assets/create/blockstates/stressometer. 8b0c2c7ac72529565b3339aa8df7565858100afa assets/create/blockstates/tiled_glass.json a2454400b1cf9889f70aebdc89c52a1be25f543c assets/create/blockstates/tiled_glass_pane.json a8094531617e27a545c4815ab2062bf0ffca3633 assets/create/blockstates/turntable.json -c9b34d2c455b5fb60bffd19adff1ca4387bc566a assets/create/blockstates/valve_handle.json 69dfe8afaa8eb6105dae9f76ab8b7847bf90b8c6 assets/create/blockstates/vertical_framed_glass.json c4db76b9d36cfb098df0d158cb6f8b82768ebe14 assets/create/blockstates/vertical_framed_glass_pane.json d995547bcd71603ba7378d8998098e462030bfd0 assets/create/blockstates/water_wheel.json @@ -348,20 +362,22 @@ fd7a9c7095372485081436c91489cadb2b0c514e assets/create/blockstates/weathered_lim c60c3115fd6eeaa3a696428a87a74d184ab7d62d assets/create/blockstates/weathered_limestone_cobblestone_wall.json c77b46d8b459e5c7cc495393546f3fcca8a1fa1d assets/create/blockstates/weathered_limestone_pillar.json 4647010162eb4c350fad236d860317eaa1884c77 assets/create/blockstates/white_seat.json +89000903d0ab8139e919abea7aa0361b34c24e55 assets/create/blockstates/white_valve_handle.json a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.json +6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json -e7a5a4320a332f5ed4341d3c08dd50a2e945d8bb assets/create/lang/en_ud.json -040cb0a702643a865f30bae9eeacaeaa94bbce7d assets/create/lang/en_us.json -5c6ce1933165fecd71fbdf67cb8de955368d1bfc assets/create/lang/unfinished/de_de.json -b8c3464b86dd7a934d3beec6c005e4799cbdf7af assets/create/lang/unfinished/fr_fr.json -c91eb4509e5afe6f288ed737f407914ae983480a assets/create/lang/unfinished/it_it.json -16fb593c1179f58811153b2f7c7cffb55615587f assets/create/lang/unfinished/ja_jp.json -4d975de4cd34e10e7156fe35a0e5f4e40650aa69 assets/create/lang/unfinished/ko_kr.json -f98f523352796c3496c27085182118bbd597a7ad assets/create/lang/unfinished/nl_nl.json -714e68af6c0f614d069ff0b31763bced1f968437 assets/create/lang/unfinished/pt_br.json -a18338a37536490b2f7b6a8836add3e133b16920 assets/create/lang/unfinished/ru_ru.json -e7ad3d9140bb94d5aa2720b651d8bf1308ad0da4 assets/create/lang/unfinished/zh_cn.json +c113d0a180880243538e9b1c3019c863df3fbdc1 assets/create/lang/en_ud.json +88bb3904aaac091ed7ce4bb336dbf3e770c022dd assets/create/lang/en_us.json +ca20d938212e7bd07f98b6547113dd7054ebb8ac assets/create/lang/unfinished/de_de.json +3e59c20a5966a30f80fd4c565bbdb48a08f16aab assets/create/lang/unfinished/fr_fr.json +2e6088860eba69341a168d44c9db6aef9bcc2682 assets/create/lang/unfinished/it_it.json +0135c7d92bac5955a620c25588ed86785479dd4b assets/create/lang/unfinished/ja_jp.json +b7fb3f75f54e9568e9eda012df72ce9deb2aae09 assets/create/lang/unfinished/ko_kr.json +9630962c49ec42b5f76b20ca5ea0b35f285eae24 assets/create/lang/unfinished/nl_nl.json +4ceb1a664412c9385faa27f409f4bc5669aaf7f8 assets/create/lang/unfinished/pt_br.json +f66486f19a4142831608e2e38d8074b967a324c1 assets/create/lang/unfinished/ru_ru.json +b37970264c2fda5394ed38a6f3d56be01185ed07 assets/create/lang/unfinished/zh_cn.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json @@ -424,7 +440,9 @@ e2801a0c3fe8e1c2485291485b977f581fdc8b7c assets/create/models/block/andesite_tun 62b3f2edc5ef5d7dabbcff19220921b0e3582376 assets/create/models/block/birch_window_pane_side.json 95d4230eb366f5e7684820c9337e3956ed34042a assets/create/models/block/birch_window_pane_side_alt.json 97d79ab99c0fb278a9b5dc54e1c6563868f87b76 assets/create/models/block/black_seat.json +02747ea1a0e5d4a1cd466bf26878885a89d347fa assets/create/models/block/black_valve_handle.json e58b00a7222152d7facbe0e82f00933b974df747 assets/create/models/block/blue_seat.json +c7f91468b196fbda137e6b31764870b3bbfda6b6 assets/create/models/block/blue_valve_handle.json 24dff9a8d22c9a88286d2b7d08384ac9f281a512 assets/create/models/block/brass_belt_funnel_pull_extended.json c9c5f53c9d4f6cf6f509452e91cab1ba5b57f807 assets/create/models/block/brass_belt_funnel_pull_powered_extended.json addcf821a2348c0985bf9a72229355cfab818069 assets/create/models/block/brass_belt_funnel_pull_powered_retracted.json @@ -443,6 +461,7 @@ a959e03ca339badb49fe58ba53d86a84352e91f3 assets/create/models/block/brass_tunnel 0585fbe58da3a8ed0dc98cc7ed79ac067312078d assets/create/models/block/brass_tunnel/t_right.json a0612a633756433e1b37ddc6d290aa1fc07839ef assets/create/models/block/brass_tunnel/window.json 4eed0ad902f5e84f2b6c160f3283e8028640e77d assets/create/models/block/brown_seat.json +6c39677f8c3a84280835c717ea1ef569b7c76a1b assets/create/models/block/brown_valve_handle.json 028a07b49c05fe8a93f1d8c229d81e73d887c2df assets/create/models/block/chiseled_dark_scoria.json b1f9ee4867373dd8f976625bab744a1c72c7fd16 assets/create/models/block/chiseled_dolomite.json cd7751090cf3d55296b8e415d0af9b6f18d69770 assets/create/models/block/chiseled_gabbro.json @@ -451,6 +470,7 @@ ac07568fa7b2d3fa84d0fe89a498514d30514291 assets/create/models/block/chiseled_sco ecb2b85ee210dce329d2be66b98d0f0d4e6fc223 assets/create/models/block/chiseled_weathered_limestone.json f9a3f0939ea43b404eb2826b94211a25fca5ebc2 assets/create/models/block/clockwork_bearing.json 70406933cc4fa5471af6e562fd84a397347dba17 assets/create/models/block/copper_casing.json +b2c528cfd24a5cb0cb96c45d0a914f1090f8c32b assets/create/models/block/copper_valve_handle.json 1ef7060b0ca7e9c0bfc8151f98ca08da31862cda assets/create/models/block/crate/brass/bottom.json 4ef2c7c3018f2d219f159a3ce58ceb00610b9c5d assets/create/models/block/crate/brass/left.json c76cfec1279d307c52f9502fdba3425f38219168 assets/create/models/block/crate/brass/right.json @@ -462,6 +482,7 @@ a09f639bde4c61d68592eb06c807e7a6791ff950 assets/create/models/block/crate/brass/ a123e3c8a9e2ea1665f268cf3991aa7e4b3119c6 assets/create/models/block/crate/creative/single.json 29ab5cfe7aed1271ede125e91bf78c1372b5f96e assets/create/models/block/crate/creative/top.json 6704782830b3d872321e895b6903709c18e3778f assets/create/models/block/cyan_seat.json +f45ef4a5f0aa8482d493661673b1c0ab6d061157 assets/create/models/block/cyan_valve_handle.json 57e70af1da4e971eca075616b787b70104189d60 assets/create/models/block/dark_oak_window.json c7b06bc1688f3f9417d38c492d83069f493df78e assets/create/models/block/dark_oak_window_pane_noside.json 3cf8adcb5d1c8f53d2144e1a85bebe593522a34e assets/create/models/block/dark_oak_window_pane_noside_alt.json @@ -657,7 +678,9 @@ cf267628d47aa424bc20977e69e255ceda3ddfe4 assets/create/models/block/granite_cobb a4f50b75a3186829fc5d62ee4e33997cd202dbd5 assets/create/models/block/granite_cobblestone_wall_side.json 349a58ac4e4535d0fe9ea467632ed904da2c6098 assets/create/models/block/granite_pillar.json 6eb5e59e803e1055968b90f3099cd0a17a1d3fd5 assets/create/models/block/gray_seat.json +7e213be39cc928363bf2b096f055439211050b8d assets/create/models/block/gray_valve_handle.json 1438b8ce54ac5557b8f10dcef94f3525eae19461 assets/create/models/block/green_seat.json +cc7ce9b6bc687ad5027a67c3bf22bdf5bcd71674 assets/create/models/block/green_valve_handle.json 9730fcb02f679087e81e24c836751e625be6a298 assets/create/models/block/horizontal_framed_glass.json d13df8a5920c5778d98081fb0e97f045e2fd46a2 assets/create/models/block/horizontal_framed_glass_pane_noside.json 3e975bec02e2670ce2b1868cebcbd780a5ebf3f8 assets/create/models/block/horizontal_framed_glass_pane_noside_alt.json @@ -680,8 +703,11 @@ ff78465839cbd36a356cd4153c721c88b1f0b297 assets/create/models/block/layered_gabb 9408ce7ba29a96053c9333b15a05d716752392c6 assets/create/models/block/layered_scoria.json da71aca99ac5cf3731896be47e15d774397a3330 assets/create/models/block/layered_weathered_limestone.json 1a28b07da68d1461cd04c971ae548d94165e0cf3 assets/create/models/block/light_blue_seat.json +68e01f8d8a31f07f236383e19b49ae1be4cbe3f4 assets/create/models/block/light_blue_valve_handle.json 292bec1b9f962b17b29147d982a9b177618b7eb9 assets/create/models/block/light_gray_seat.json +42338c4965da63962ea08077dc9e899aaf4c3c65 assets/create/models/block/light_gray_valve_handle.json 31c9474210d8535c5417021fe042d4cc31e17328 assets/create/models/block/lime_seat.json +74008bd0d775b0e2e96b43be2e51d0f3c3abdf21 assets/create/models/block/lime_valve_handle.json ce6fb36a386c895486e021823eb008b0fa4862c3 assets/create/models/block/limesand.json a2cbc86d24fdd70c5f33c8b30ba52a8928dde63f assets/create/models/block/limestone.json 447686a6861773e03c5c18f2de4bc11d06c65f78 assets/create/models/block/limestone_bricks.json @@ -706,6 +732,7 @@ eee8ae85daa99fcd594da3d4af393726af69493b assets/create/models/block/limestone_co 999ce855842170f47db9d1e8e8636c24f7d3ad3d assets/create/models/block/linear_chassis_top.json b9abbd1dcf71e0a1416fd998a82a560c06cef5a3 assets/create/models/block/linear_chassis_top_bottom.json cbee001cd1bb1125a97d1bb2d1e6e5a68f129303 assets/create/models/block/magenta_seat.json +bc5a03a5552eb4a518abefe5e8615f14ee13ca29 assets/create/models/block/magenta_valve_handle.json 0492070642fda75b943080022368505f2d065730 assets/create/models/block/mechanical_bearing.json edf6ee4e590ebf162c00aa952d992f1bee2cad8a assets/create/models/block/mossy_andesite.json 55256e4df0038a619d80d3e6c50b0f3e3682e90a assets/create/models/block/mossy_dark_scoria.json @@ -724,6 +751,7 @@ e55363147cc27fba84590c7e24460603988118e3 assets/create/models/block/oak_window_p aa12818d00d1995e5b8a218cb613215ec0161d23 assets/create/models/block/oak_window_pane_side.json 488dfd3f4bd82ab1b5b751b4a46881befb8d6819 assets/create/models/block/oak_window_pane_side_alt.json fda0628a09ef726e3e8323b2f38b6a3e612dc2ca assets/create/models/block/orange_seat.json +3b07f3f1985495051d173725b01ddd52b5f70ac4 assets/create/models/block/orange_valve_handle.json 006115bf8e36367c0c409effdeab939a54c20776 assets/create/models/block/ornate_iron_window.json cc9614e892b12c6053d45a35d534eddf36285cf1 assets/create/models/block/ornate_iron_window_pane_noside.json 6b935d54de7c37f835df48f7b6e5e614a0d12b6e assets/create/models/block/ornate_iron_window_pane_noside_alt.json @@ -853,6 +881,7 @@ cc36e21013b80b1dfa041b55047096db127ffa51 assets/create/models/block/paved_weathe 34ba32e570e0a54501db071b9f8c38513edea93d assets/create/models/block/paved_weathered_limestone_wall_post.json daf65510d95730bcf0373d746f2a2dbfe6b44fc0 assets/create/models/block/paved_weathered_limestone_wall_side.json ecc60ce7ee6b753073a99c597db95d6d9df3d438 assets/create/models/block/pink_seat.json +7ada61878d3a3c1d3cc33bcf9a80c21b8f9aaff2 assets/create/models/block/pink_valve_handle.json 83a4922d5799a5a1391a2675e9273caa24cde192 assets/create/models/block/polished_dark_scoria.json 3fcab24848791fcd591bf4a2a73147c3391e24b8 assets/create/models/block/polished_dark_scoria_slab.json 7c1b4b3b22c711224a54d55d7c49429c4238d5a7 assets/create/models/block/polished_dark_scoria_slab_double.json @@ -914,6 +943,7 @@ e6097d9ab9dc9954cbc750020bc33c7a423b73c6 assets/create/models/block/powered_togg 622239a3a09fcac7235b9670eb395a530839a59b assets/create/models/block/pulse_repeater_powered.json 0102e253c941904f12de7acdd46b0079ee3ccf69 assets/create/models/block/pulse_repeater_pulsing.json 96adc7865ebe64b43865bc2fe914830c11258856 assets/create/models/block/purple_seat.json +062406aacf25e099f9b28a3bf7cacfcaa1da4ef6 assets/create/models/block/purple_valve_handle.json 27d64a828607f94296c0b86cdb35fad996bc5d23 assets/create/models/block/radial_chassis_side_x.json 7d1439a0b06e4014e396d498a9e42168f67773a5 assets/create/models/block/radial_chassis_side_x_sticky.json a9885a3f69e3e2a2812c33bafd9140fcc5cc7c25 assets/create/models/block/radial_chassis_side_y.json @@ -921,6 +951,7 @@ a9885a3f69e3e2a2812c33bafd9140fcc5cc7c25 assets/create/models/block/radial_chass 522f4733118d6fba172696e9478c8f9fe88b236e assets/create/models/block/radial_chassis_side_z.json bffca231a146a6ac49e028f3790cdcbf375e98b0 assets/create/models/block/radial_chassis_side_z_sticky.json 12d4f4119b994c5d71c96ab3aa09beb89dad1e10 assets/create/models/block/red_seat.json +0064825ee3c1702c524d34abb6adb66906586851 assets/create/models/block/red_valve_handle.json c4bb40ed2bddabff154a34f4eff7a485bf6488a0 assets/create/models/block/refined_radiance_casing.json c145d8e0d7f8f41afa80b9727a107b2ad2f0c3c9 assets/create/models/block/scoria.json 59c6f6a4ffe43485244a8561d7e8341f796e268b assets/create/models/block/scoria_bricks.json @@ -989,7 +1020,9 @@ eb838d687f7a925f5b91c4784bfbf33070515e31 assets/create/models/block/weathered_li 5a866d7cca51056c15a5f51e171d89598426fade assets/create/models/block/weathered_limestone_cobblestone_wall_side.json a5b04a1a35735713f51dcd5a80d9e582e6575bbc assets/create/models/block/weathered_limestone_pillar.json 1377e12f56dce1466ce44078d7154870c5cf7b2a assets/create/models/block/white_seat.json +899f33d51cf36cb1c283bc7e6363f9d451e5736e assets/create/models/block/white_valve_handle.json 0a0e2cc973e35586ae00ed17b919383868e992e8 assets/create/models/block/yellow_seat.json +55edee7b0833ab19b98694fab21ae0c8e91f76fd assets/create/models/block/yellow_valve_handle.json c94c60d1d77404af7d74a29a094c7bdf7501b385 assets/create/models/block/zinc_block.json a3ff06384fff574ac4cd6c253259f0734b025cab assets/create/models/block/zinc_ore.json 67ef6fd6ec26fc216fa5319b8538beb223da1530 assets/create/models/item/acacia_window.json @@ -1017,8 +1050,10 @@ bf1fc6bdf7fca6f1958a2d3e96202c1cecb50669 assets/create/models/item/basin.json 9044243882cfd49a2827e1b910a4c9b0e46daa47 assets/create/models/item/birch_window.json 6ed49f59ea91068ef68720f43e67a9237594bdf0 assets/create/models/item/birch_window_pane.json 22632bd681c8a605f0845f7549770389a741156a assets/create/models/item/black_seat.json +56a6baedc608792cd6ab72a1c4fd53046cbda070 assets/create/models/item/black_valve_handle.json 80a6e8b00709fe0521aca5b789ae17485ed9c56d assets/create/models/item/blaze_burner.json 0e1977585128fc0ecef640f72e5fc5e9fb47ef92 assets/create/models/item/blue_seat.json +bec96ebf3369d3cffa9bb1b8bf9f2a5cd5d0ef96 assets/create/models/item/blue_valve_handle.json 17d340c3678bd24cb085ba49490b2b4cb341a9e7 assets/create/models/item/brass_block.json f5a18f4279c2e845a5967b1c2f9e807c2bb77afb assets/create/models/item/brass_casing.json 099961ca4a75b6ecfddd1db6dd29909276759f3b assets/create/models/item/brass_funnel.json @@ -1028,6 +1063,7 @@ a37be4a0ec9bf6c381527403c57ced4f81abd67c assets/create/models/item/brass_nugget. 14ea6ee4db6e7e76446e331a70b6b6bec31e8eb7 assets/create/models/item/brass_sheet.json 427bef12405e2a99fbf49e27ea5944add244252a assets/create/models/item/brass_tunnel.json 24df6f8391d8ba09cef46e69d65d32ea770745cd assets/create/models/item/brown_seat.json +54211d3bdbeba2ea4dbaed43daa740ae3331640f assets/create/models/item/brown_valve_handle.json 3e232a103f7f916fc11edb4d541ca99fe7b44181 assets/create/models/item/cart_assembler.json 99d64b76b3baa84c3bd4b96ccd3376ca12425950 assets/create/models/item/chiseled_dark_scoria.json 83d3571eacde52568786802b268f24c6578c1e5d assets/create/models/item/chiseled_dolomite.json @@ -1048,6 +1084,7 @@ c5bcfba46f5824654dedaa2c5d5f42deb29e3baf assets/create/models/item/copper_ingot. 200ef8378a9c014571c414433d4aef73a204dc01 assets/create/models/item/copper_sheet.json d7cb2f7bac8fae893fc5179af8140786a908f3f5 assets/create/models/item/copper_shingles.json f56bf22324faf8958eaef4d94b958f1108d52e5a assets/create/models/item/copper_tiles.json +5583368909c319acfcf0f7a419bedf23272fe613 assets/create/models/item/copper_valve_handle.json 4e9126b349d55c65aa5407f05700579e52101c1f assets/create/models/item/crafter_slot_cover.json 7b333dea353afaa27b182aedc647c9e9e34e92ef assets/create/models/item/creative_crate.json 5b39403f6c81f05e566b621b62e267267de47c41 assets/create/models/item/creative_motor.json @@ -1059,6 +1096,7 @@ f56bf22324faf8958eaef4d94b958f1108d52e5a assets/create/models/item/copper_tiles. 823c91f63565db54ec3944a1e90e7aee18e41062 assets/create/models/item/crushing_wheel.json dae5cffa4e1263d6a113469f79fba8695fa8232a assets/create/models/item/cuckoo_clock.json 3e3edc9ccded444496d3336926b93bbf1234cd84 assets/create/models/item/cyan_seat.json +523cd531eadaadc45fb356ca58b99a8fe206c3a7 assets/create/models/item/cyan_valve_handle.json f786a43e296d9f10d7c302fe3ae9cddf4ba9984e assets/create/models/item/dark_oak_window.json e3e9ebbc694edad1f473e5c3a897d95cc87528ae assets/create/models/item/dark_oak_window_pane.json f0e98871e4bb68c29954f2de24566a6404f21d9c assets/create/models/item/dark_scoria.json @@ -1168,7 +1206,9 @@ c1bb87fdbbefaf74e1ead186c43417a051ab3965 assets/create/models/item/granite_cobbl e2d8561a8048fe6144362d13478bba4825588810 assets/create/models/item/granite_cobblestone_wall.json b84a947a1b297513c85bb8d2dbbb780304c95e43 assets/create/models/item/granite_pillar.json e7daa31c1fc445d542bad476dfe1d6a8811f2070 assets/create/models/item/gray_seat.json +0f4981408b08a736ff3eb5bdf1823cd7019ae9fe assets/create/models/item/gray_valve_handle.json 1c9c9157a06108bf58967bfc4fb069c35d20e90a assets/create/models/item/green_seat.json +ecb9f32f62d3fa43fb226ab85adc2eb229fdfb77 assets/create/models/item/green_valve_handle.json 398b1a7c76c7bdb6a23b1248fdce98f6d835467f assets/create/models/item/hand_crank.json cfab82a2cf7495d21778c1de9730a26afbdd523d assets/create/models/item/handheld_blockzapper.json dee43bf1a9c211a752fac2c07aeba123f7f0c914 assets/create/models/item/handheld_worldshaper.json @@ -1190,8 +1230,11 @@ ad40f8eb28bea731131aeaffee55abecb8bc6a56 assets/create/models/item/layered_limes e7585210cf4754c89b4ba3dc95827b75029f0523 assets/create/models/item/layered_scoria.json 2df30e7f8cacc1efd6e025564d495f782e0dc697 assets/create/models/item/layered_weathered_limestone.json be2b6d54afc515d93d6d5b3023c506c53cc946f8 assets/create/models/item/light_blue_seat.json +34c308977750da24db80bf2ea2dd6cfc22ea1db6 assets/create/models/item/light_blue_valve_handle.json 1b36382eae41b35585e5659cda019310731000fc assets/create/models/item/light_gray_seat.json +a89d397ac14482a973f7937f046dbf8e42d017bc assets/create/models/item/light_gray_valve_handle.json 2127f20dca4421802812e249b3caca6230a37eee assets/create/models/item/lime_seat.json +785b008d703728497f5f941e3211d6e10389f1b5 assets/create/models/item/lime_valve_handle.json a29733a916141abf84492a288fe9ac4ed531f47d assets/create/models/item/limesand.json e0a1c6102acc10a36de5ae87da629dd3d676e204 assets/create/models/item/limestone.json 1c2b99db54863eac4947824f4169e51c25d05bde assets/create/models/item/limestone_bricks.json @@ -1205,6 +1248,7 @@ ebdf23b99b7895e347c29057c8070a6e16e56beb assets/create/models/item/limestone_cob 8065de871ad2fbaed711735561b8ed91a2ce0004 assets/create/models/item/limestone_pillar.json d245aa4994ff197b1ffeb7980d05f96bd20cdeb3 assets/create/models/item/linear_chassis.json d912be3e87f2beaa8e22747f867739139667241b assets/create/models/item/magenta_seat.json +928c5e3747fb758d2610475258cc168b0d4ee7b6 assets/create/models/item/magenta_valve_handle.json 932facf4bf93b471e8630f4132a4284a9f4d0d39 assets/create/models/item/mechanical_arm.json 49dcc373c33f6fc3760add10eb51bd96cd4fd028 assets/create/models/item/mechanical_bearing.json 65ac4f19973ddeb1bb4d672f57319130e736e116 assets/create/models/item/mechanical_crafter.json @@ -1235,6 +1279,7 @@ bafe601f186e868819da3d29f7be7dc96f9ba790 assets/create/models/item/nixie_tube.js 7a336a340f3e4927d7a35f9d79e8a03693b802aa assets/create/models/item/oak_window.json f274fe391ac584656c9817a5650b1c1e38e44c58 assets/create/models/item/oak_window_pane.json 25dfcc8b6f085722f6b2a0c686b77d437e61542e assets/create/models/item/orange_seat.json +62ac36250e2505f23ea4d2c3b4630239c049f276 assets/create/models/item/orange_valve_handle.json 0ffe242e3165d9a0e3fe16ad4c4ca91c7e9828b2 assets/create/models/item/ornate_iron_window.json 7d7da05da6248abc177e89988ed5c2aff1151767 assets/create/models/item/ornate_iron_window_pane.json db23dec78b3355fc0de3485b8e9d915a20dc1f93 assets/create/models/item/overgrown_andesite.json @@ -1283,6 +1328,7 @@ d60c4fb6e0e68d8f6c137a0c601145c342236c18 assets/create/models/item/paved_limesto d81f85aea5e683539a0f3c805c154b76a9d88a9d assets/create/models/item/paved_weathered_limestone_stairs.json 25eaccadfbabb60301f487807b0e839d525f2c80 assets/create/models/item/paved_weathered_limestone_wall.json 9664f171c7856661776c5c4ef0b6880a77db648e assets/create/models/item/pink_seat.json +7d12cc24b86fcb3f0ca6fee650d1dee683859c0d assets/create/models/item/pink_valve_handle.json 04ce23dc141bedccc75b4512263da8b498f13205 assets/create/models/item/piston_extension_pole.json 1f7846aa06c3c22614c98cbec9112cc8632fa1b8 assets/create/models/item/polished_dark_scoria.json c46f1191cfa225fa76973208646e7bd86d7fcb5f assets/create/models/item/polished_dark_scoria_slab.json @@ -1316,9 +1362,11 @@ d3cfc1a1137c4bc98848947d425d2972df144c95 assets/create/models/item/powdered_obsi 16f363038d5afeae34e0724a6a9f0b8f6e65424a assets/create/models/item/propeller.json 4b8a27ff05ed5331889dfc4b0b4562f3e94b0dfe assets/create/models/item/pulse_repeater.json a598b2f5eb34b061e81efb8a55267a02f8e08a61 assets/create/models/item/purple_seat.json +e5138f9e37ca4d24cda2eb7b24a021eb7c8ae21c assets/create/models/item/purple_valve_handle.json 469652eb5baa92008dbfc4deec232c3381684af6 assets/create/models/item/radial_chassis.json ba99e2fdb64892f4f479a8ac51c226cb5f71f659 assets/create/models/item/red_sand_paper.json 3e251514aa698076b73fdbfef720b78b21d3bd93 assets/create/models/item/red_seat.json +b959a1b35105c2c21933418bd29ce12a090716f8 assets/create/models/item/red_valve_handle.json b9a4ac219a27e60a82f55129f2df5ae6183981e2 assets/create/models/item/redstone_contact.json 52e561abeb954d0349e640566de92ef80ccbf919 assets/create/models/item/redstone_link.json d9dd4546f4f4c6ed5fef66de9d272d469db4e81f assets/create/models/item/refined_radiance.json @@ -1359,7 +1407,6 @@ b1d3d00ff05908feacad06a86800da96cc9bc65d assets/create/models/item/tiled_glass.j 8a2a81a8cbc52b6021e57107d79a32f73b82d8fe assets/create/models/item/tiled_glass_pane.json c081317f106a2b04700aafde12c57445844c20ab assets/create/models/item/tree_fertilizer.json fb24881c4e92bbb7ffa54a71e0af6b1c66d84829 assets/create/models/item/turntable.json -ee706dcb209ad93f12a1cc4c3c502aa24153c82b assets/create/models/item/valve_handle.json 32f49b724af10c8d7e2ed5a3c82280e83b75f789 assets/create/models/item/vertical_framed_glass.json 5e331da9d4086412f5722923e3008246ed286a00 assets/create/models/item/vertical_framed_glass_pane.json 00c2929de9b7171656bea74e1a6d694c6a45b075 assets/create/models/item/vertical_gearbox.json @@ -1378,8 +1425,10 @@ def7382f3216c59d835ab64f534678f3d31ecc51 assets/create/models/item/weathered_lim 8914910270736f8f15364c623cd08d4638383cc5 assets/create/models/item/wheat_flour.json 0cc80844db689404d4722c93f1002b0bed05edcd assets/create/models/item/whisk.json 69328eb4f91c4407fbcad5e3c4b88363f1a9572c assets/create/models/item/white_seat.json +be7a2d59d43083d7f2427193dcb9d68004224dd3 assets/create/models/item/white_valve_handle.json 2527b52413965a3e84b4718e08a9b8bb30a741ea assets/create/models/item/wrench.json 4b49bc2418410cded5f0b7da3430f1a22e049f18 assets/create/models/item/yellow_seat.json +790daf016f980801e7587b548a325082c65f6f03 assets/create/models/item/yellow_valve_handle.json 9365b5cf29e35d070d077c54520f6cc780aeb842 assets/create/models/item/zinc_block.json 9dfaa12884667458f8f727ae7666e7e4e50181d9 assets/create/models/item/zinc_ingot.json 9f9455ccb5fc9e3cbfce73862b46078346a522a5 assets/create/models/item/zinc_nugget.json @@ -2001,14 +2050,17 @@ c7f81e30c31837a287d6d6040cdb02c7dec11441 data/create/loot_tables/blocks/belt.jso 67a8e2513c3cb09e6fe80279fda94f79d5018c37 data/create/loot_tables/blocks/birch_window.json bf1d5843f93533f84bc4adec5b77da2114fa2025 data/create/loot_tables/blocks/birch_window_pane.json cccc209d172cc7bac76f1b4ac79085ee90742ab2 data/create/loot_tables/blocks/black_seat.json +f3573f47b8a914aa222633893e158f84fcd6f3d8 data/create/loot_tables/blocks/black_valve_handle.json a2313c9b7d114396fca3c86a740d23fce3873679 data/create/loot_tables/blocks/blaze_burner.json 3834f7ac2bbc42cead02d4973842adb9ad97e6bf data/create/loot_tables/blocks/blue_seat.json +fcddccd1bf45c2f4ad5f1520e209a4f04487274a data/create/loot_tables/blocks/blue_valve_handle.json 1dbc446abe190b2832b2ce7d52c2f2d2bdd45949 data/create/loot_tables/blocks/brass_belt_funnel.json 70d9d4def43d5b31fa7cdc5ca5002c71cf4a90b0 data/create/loot_tables/blocks/brass_block.json 8a14258ad5d79d9e4dc5a318905644b446196420 data/create/loot_tables/blocks/brass_casing.json 1dbc446abe190b2832b2ce7d52c2f2d2bdd45949 data/create/loot_tables/blocks/brass_funnel.json 6c8e784677d1a843b6c707484c79751acdb46ebc data/create/loot_tables/blocks/brass_tunnel.json d415862a0abe20e8c5c2c8125bb672065330a9bc data/create/loot_tables/blocks/brown_seat.json +fedfe922f568c06adc2dfdd641b9abc90ba5af8a data/create/loot_tables/blocks/brown_valve_handle.json 0be542fef3bc0e1a0d556883568a1400a8b97df1 data/create/loot_tables/blocks/cart_assembler.json ab820bbaaf67c6697dfbab33c05fb73b18c70bfb data/create/loot_tables/blocks/chiseled_dark_scoria.json 1f907058afd7d8dbe628c9ab315b8ddbdccfbfda data/create/loot_tables/blocks/chiseled_dolomite.json @@ -2026,12 +2078,14 @@ f38802b919c49f162f102d6e5d94113f05bf4ab1 data/create/loot_tables/blocks/copper_b 31a51237763c374b7cdf39b9b62c14e965871047 data/create/loot_tables/blocks/copper_ore.json a5a7ba88a1d38da83b37bbe842dc7cc0544f37be data/create/loot_tables/blocks/copper_shingles.json c013613df278f6e8b4c9dad5f16e0ec6c3e992e3 data/create/loot_tables/blocks/copper_tiles.json +5c15f22db359a2af8efa18561e080cdf361a0100 data/create/loot_tables/blocks/copper_valve_handle.json b160899aa785dc54d8c6cc095337f70b81f3e44f data/create/loot_tables/blocks/creative_crate.json d8f2f8921b9200b1d9476a77ee1be32c25308ac3 data/create/loot_tables/blocks/creative_motor.json c28fa42746a4d5ca2f824001b67e58673810169e data/create/loot_tables/blocks/crushing_wheel.json 205f5899101262f31f5c1a88bb7d954918d08d04 data/create/loot_tables/blocks/crushing_wheel_controller.json d370ee874b5b6b98e9a8c368218fe61f644d956d data/create/loot_tables/blocks/cuckoo_clock.json 49a14b9e93abdf02a7aef9c0c4085ac89617fae4 data/create/loot_tables/blocks/cyan_seat.json +fe24fd296812fea3f838defa2ca6270523d9d48e data/create/loot_tables/blocks/cyan_valve_handle.json fd309e1d39dcbcb25c3361edecd8c9afa0f847d0 data/create/loot_tables/blocks/dark_oak_window.json 58e6307ba0efa65a0715662a391fe7dc6fba0c68 data/create/loot_tables/blocks/dark_oak_window_pane.json 7a40002e4c05f6456b52558b9ee9607cfc868a69 data/create/loot_tables/blocks/dark_scoria.json @@ -2135,7 +2189,9 @@ feca8a1f62e0e13fcb2252d5f782d74938b84431 data/create/loot_tables/blocks/granite_ 1d225a68b09d6f389aa7ed48aa05979bdaa482a9 data/create/loot_tables/blocks/granite_cobblestone_wall.json 87a4ac3db5ec80613b940abccc72fc4b37cee0ba data/create/loot_tables/blocks/granite_pillar.json d014357b3a467b23473c8223f32471a04a9ff94c data/create/loot_tables/blocks/gray_seat.json +35f916fd0f8465a070270615dbddd716ff68d5bb data/create/loot_tables/blocks/gray_valve_handle.json a71599eecd3f1179e3d0367623460e798828aa6d data/create/loot_tables/blocks/green_seat.json +865ebead9601b29e6326dc9e1d4c1ca92f3b7a3b data/create/loot_tables/blocks/green_valve_handle.json 9bdc47ea3ffc52f037f12f40f387e6b72a352c4e data/create/loot_tables/blocks/hand_crank.json 22012e7759f1dbccbb06bcaf0311a54190270825 data/create/loot_tables/blocks/horizontal_framed_glass.json 5d3f585539942f13bbc458a0a002849c1f034fc1 data/create/loot_tables/blocks/horizontal_framed_glass_pane.json @@ -2152,8 +2208,11 @@ fa8a5922f7346a15a80b5c7e5dfc26d24ea98728 data/create/loot_tables/blocks/layered_ 0ec9e366708637a01e600a2a12cc267d81b3f69b data/create/loot_tables/blocks/layered_scoria.json 54816065cd735dfe53b1eb551110ba18c6e3746a data/create/loot_tables/blocks/layered_weathered_limestone.json b403848d3a4b4ad7a048e70c21e200e40d0c67e3 data/create/loot_tables/blocks/light_blue_seat.json +32afe3fff74ccda4151567961fa6c0b8e3735358 data/create/loot_tables/blocks/light_blue_valve_handle.json 0cc2b20cb6e2dae6cf9d759c85926663f6066c99 data/create/loot_tables/blocks/light_gray_seat.json +8cc64a1dfb7ce7be2c063248d912c68ad2fe999c data/create/loot_tables/blocks/light_gray_valve_handle.json f7893090c6ecb4862c90c408b7f9ce8316f8b608 data/create/loot_tables/blocks/lime_seat.json +cae6d16c8967164698efbce3b91018a8e79a81e9 data/create/loot_tables/blocks/lime_valve_handle.json 7dfd638cc6f0d22bbc8fcbdb7212a3bfc8c85223 data/create/loot_tables/blocks/limesand.json 9d585f677a32a2336df5f17b5b389cdee867939f data/create/loot_tables/blocks/limestone.json 57134f7d3d32fc1c48f2a20c4be84388587092bc data/create/loot_tables/blocks/limestone_bricks.json @@ -2167,6 +2226,7 @@ cb315814960850b5080598b89ee94c833b5048f7 data/create/loot_tables/blocks/limeston 371115e5ceb08c07a9ab2371509960c31e0baa8a data/create/loot_tables/blocks/limestone_pillar.json aa751d2e8a7889907c08c4bec6f6ca266230b6d7 data/create/loot_tables/blocks/linear_chassis.json 9e5e017cd3b4f544f487a5ca22ef610a4addc8ec data/create/loot_tables/blocks/magenta_seat.json +517e983d7387ec0d86845d4cf3deaa6d68c71170 data/create/loot_tables/blocks/magenta_valve_handle.json e64c32da44b7e92dbef36fcb448c42b9bd9ae47c data/create/loot_tables/blocks/mechanical_arm.json 90ddf7b5c3b61758a4ad12a1e6ef16fe6ebf7794 data/create/loot_tables/blocks/mechanical_bearing.json e93872a90e4f4642a003539e7db28fdacfdcd114 data/create/loot_tables/blocks/mechanical_crafter.json @@ -2197,6 +2257,7 @@ d3ea271bb5774c73d44ab2e73195c9d5a4ff9c92 data/create/loot_tables/blocks/nixie_tu 0b2b142cfb3ebe9d4506e498a8e31f48d00db58d data/create/loot_tables/blocks/oak_window.json 90cc4d5857f47c48e2b82f394de9567023c5c8ce data/create/loot_tables/blocks/oak_window_pane.json 2333aaea940816b6bc8454ba24e0c9f52af94ac0 data/create/loot_tables/blocks/orange_seat.json +13338687962ef5b48dd9d142a2a862637d5c6953 data/create/loot_tables/blocks/orange_valve_handle.json 267e9e24fac93e3496a80fcb6ed8e9d1c329d2d2 data/create/loot_tables/blocks/ornate_iron_window.json 1fe77a16f4c86993b5fb30f1f48362787fd7cd0b data/create/loot_tables/blocks/ornate_iron_window_pane.json 8d91485a5f353c6fb84e16bd0d9d4a55aaeb31ab data/create/loot_tables/blocks/overgrown_andesite.json @@ -2245,6 +2306,7 @@ dfeba5c6de20e9ec0252e43b7c4046f017284d3d data/create/loot_tables/blocks/paved_we 67b9227237ed2a8c09c4183c0f2ab1b3bd07084b data/create/loot_tables/blocks/paved_weathered_limestone_stairs.json d3e4ab984aef19ee21a1c5b868eb3fde96c05afd data/create/loot_tables/blocks/paved_weathered_limestone_wall.json 6f32e1217986407e41358e9417de63602c78e810 data/create/loot_tables/blocks/pink_seat.json +d85b09659f08a73513c57b1b2e5ec7fc4b6f340a data/create/loot_tables/blocks/pink_valve_handle.json 1087b6c6d88dc7c71ed81e1d3e180fe065e6d098 data/create/loot_tables/blocks/piston_extension_pole.json 05302657546d8d410e367e84d4d5e01f01523236 data/create/loot_tables/blocks/polished_dark_scoria.json 1b323a883816428ff851462f61d00eaee7255e33 data/create/loot_tables/blocks/polished_dark_scoria_slab.json @@ -2276,8 +2338,10 @@ a3fb7d3e3bf9dc73ce754002f10c469d57db1f71 data/create/loot_tables/blocks/powered_ 205f5899101262f31f5c1a88bb7d954918d08d04 data/create/loot_tables/blocks/pulley_magnet.json e8fb62c91226ac107dee45c5ebc54c8dd0aee224 data/create/loot_tables/blocks/pulse_repeater.json d7f6caa568e6508177a644fb78dc18ce26c9b2c0 data/create/loot_tables/blocks/purple_seat.json +773e4dc856044dabfe9d2323cbda0460dfb626ee data/create/loot_tables/blocks/purple_valve_handle.json 768420dab8785909891e52c4d77a182d99ba11d3 data/create/loot_tables/blocks/radial_chassis.json 71b0fa3b174efe94a2a735ab2426c376c0ef674a data/create/loot_tables/blocks/red_seat.json +59ee0fd35978068fbce0882e0b207db7eeb202c0 data/create/loot_tables/blocks/red_valve_handle.json f5907a694206facc01f61f3428f72488486761c7 data/create/loot_tables/blocks/redstone_contact.json 886a0c1386fb12104b736a15689030aaff771270 data/create/loot_tables/blocks/redstone_link.json 5569a01114939be4b09cc1414e33d7211d7aada3 data/create/loot_tables/blocks/refined_radiance_casing.json @@ -2311,7 +2375,6 @@ ec2889e712702644092197a4b41a682fb953817d data/create/loot_tables/blocks/stockpil 05e843ca6eb5e299bf41de123977a1045c120ad4 data/create/loot_tables/blocks/tiled_glass.json e999969f05d2625e61757aa82092d232b99f6e0a data/create/loot_tables/blocks/tiled_glass_pane.json 7b66ad2c48449bafd0cdbd086ac41218cb73a814 data/create/loot_tables/blocks/turntable.json -4192595ca6a8e0845a871dc8f99724185e1e955c data/create/loot_tables/blocks/valve_handle.json 028e293b5cd694017962f67dc80dba719f904e28 data/create/loot_tables/blocks/vertical_framed_glass.json d0156602dd5f4a274c293df67e19374820c72890 data/create/loot_tables/blocks/vertical_framed_glass_pane.json 2883c63ceb1273009dbf91cb0693756cadf79a1a data/create/loot_tables/blocks/water_wheel.json @@ -2326,7 +2389,9 @@ a89f425c47c3831071b556697169a3124370aed7 data/create/loot_tables/blocks/weathere e8f3af61d9a2fd1ff5b32c9bb474ed005e6d70c4 data/create/loot_tables/blocks/weathered_limestone_cobblestone_wall.json 54358a64639957cc66ffa5296ff45723f7adf00e data/create/loot_tables/blocks/weathered_limestone_pillar.json 969eda31556feb5a68e350762848d17453275fee data/create/loot_tables/blocks/white_seat.json +79fe374f8e677088f928a3a49ff5eeed6128d165 data/create/loot_tables/blocks/white_valve_handle.json 37ead431a278928a09b260ae06a448e2c791a73e data/create/loot_tables/blocks/yellow_seat.json +899bb208908a2f9bec5e544ff47526f3e24db720 data/create/loot_tables/blocks/yellow_valve_handle.json 94661e726b3d19271550359ae898a5590939512e data/create/loot_tables/blocks/zinc_block.json 37248ca92d474e440b91c27e3c8e78e568328100 data/create/loot_tables/blocks/zinc_ore.json b65bac8bc2fbfd476040c1aab1c0588b8bd59ebe data/create/recipes/acacia_window.json @@ -3026,7 +3091,7 @@ 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 -c8e33479d80b6dbd23bded9ce15d1b08841819bb data/create/tags/blocks/brittle.json +6d73642c6c64a8f7ebe6041218ac5a9fe2379e52 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 diff --git a/src/generated/resources/assets/create/blockstates/black_valve_handle.json b/src/generated/resources/assets/create/blockstates/black_valve_handle.json new file mode 100644 index 000000000..ab5f48af8 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/black_valve_handle.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/black_valve_handle", + "x": 180 + }, + "facing=up": { + "model": "create:block/black_valve_handle" + }, + "facing=north": { + "model": "create:block/black_valve_handle", + "x": 90 + }, + "facing=south": { + "model": "create:block/black_valve_handle", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/black_valve_handle", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/black_valve_handle", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/blue_valve_handle.json b/src/generated/resources/assets/create/blockstates/blue_valve_handle.json new file mode 100644 index 000000000..fa05f73c2 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/blue_valve_handle.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/blue_valve_handle", + "x": 180 + }, + "facing=up": { + "model": "create:block/blue_valve_handle" + }, + "facing=north": { + "model": "create:block/blue_valve_handle", + "x": 90 + }, + "facing=south": { + "model": "create:block/blue_valve_handle", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/blue_valve_handle", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/blue_valve_handle", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/brown_valve_handle.json b/src/generated/resources/assets/create/blockstates/brown_valve_handle.json new file mode 100644 index 000000000..aac125cd9 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/brown_valve_handle.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/brown_valve_handle", + "x": 180 + }, + "facing=up": { + "model": "create:block/brown_valve_handle" + }, + "facing=north": { + "model": "create:block/brown_valve_handle", + "x": 90 + }, + "facing=south": { + "model": "create:block/brown_valve_handle", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/brown_valve_handle", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/brown_valve_handle", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/copper_valve_handle.json b/src/generated/resources/assets/create/blockstates/copper_valve_handle.json new file mode 100644 index 000000000..d8e371297 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/copper_valve_handle.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/copper_valve_handle", + "x": 180 + }, + "facing=up": { + "model": "create:block/copper_valve_handle" + }, + "facing=north": { + "model": "create:block/copper_valve_handle", + "x": 90 + }, + "facing=south": { + "model": "create:block/copper_valve_handle", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/copper_valve_handle", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/copper_valve_handle", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/cyan_valve_handle.json b/src/generated/resources/assets/create/blockstates/cyan_valve_handle.json new file mode 100644 index 000000000..ca7d5322d --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/cyan_valve_handle.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/cyan_valve_handle", + "x": 180 + }, + "facing=up": { + "model": "create:block/cyan_valve_handle" + }, + "facing=north": { + "model": "create:block/cyan_valve_handle", + "x": 90 + }, + "facing=south": { + "model": "create:block/cyan_valve_handle", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/cyan_valve_handle", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/cyan_valve_handle", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/fluid_pipe.json b/src/generated/resources/assets/create/blockstates/fluid_pipe.json index 581373307..a4cffcde7 100644 --- a/src/generated/resources/assets/create/blockstates/fluid_pipe.json +++ b/src/generated/resources/assets/create/blockstates/fluid_pipe.json @@ -60,10 +60,10 @@ }, { "when": { - "south": "false", - "up": "true", "down": "false", - "north": "true" + "north": "true", + "up": "true", + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lu_x" @@ -71,10 +71,10 @@ }, { "when": { - "south": "true", - "up": "true", "down": "false", - "north": "false" + "north": "false", + "up": "true", + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/ru_x" @@ -82,10 +82,10 @@ }, { "when": { - "south": "false", - "up": "false", "down": "true", - "north": "true" + "north": "true", + "up": "false", + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ld_x" @@ -93,10 +93,10 @@ }, { "when": { - "south": "true", - "up": "false", "down": "true", - "north": "false" + "north": "false", + "up": "false", + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/rd_x" @@ -104,21 +104,21 @@ }, { "when": { - "south": "false", - "up": "true", "down": "true", - "north": "false" - }, - "apply": { - "model": "create:block/fluid_pipe/ud_x" - } - }, - { - "when": { - "south": "false", + "north": "false", "up": "true", - "down": "false", - "north": "false" + "south": "false" + }, + "apply": { + "model": "create:block/fluid_pipe/ud_x" + } + }, + { + "when": { + "down": "false", + "north": "false", + "up": "true", + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -126,10 +126,10 @@ }, { "when": { - "south": "false", - "up": "false", "down": "true", - "north": "false" + "north": "false", + "up": "false", + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -137,10 +137,10 @@ }, { "when": { - "south": "true", - "up": "false", "down": "false", - "north": "true" + "north": "true", + "up": "false", + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -148,10 +148,10 @@ }, { "when": { - "south": "false", - "up": "false", "down": "false", - "north": "true" + "north": "true", + "up": "false", + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -159,10 +159,10 @@ }, { "when": { - "south": "true", - "up": "false", "down": "false", - "north": "false" + "north": "false", + "up": "false", + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -170,10 +170,10 @@ }, { "when": { - "south": "false", - "up": "false", "down": "false", - "north": "false" + "north": "false", + "up": "false", + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/none_x" @@ -181,10 +181,10 @@ }, { "when": { - "south": "true", "west": "true", + "east": "false", "north": "false", - "east": "false" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/lu_y" @@ -192,10 +192,10 @@ }, { "when": { - "south": "true", "west": "false", + "east": "true", "north": "false", - "east": "true" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/ru_y" @@ -203,10 +203,10 @@ }, { "when": { - "south": "false", "west": "true", + "east": "false", "north": "true", - "east": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ld_y" @@ -214,10 +214,10 @@ }, { "when": { - "south": "false", "west": "false", + "east": "true", "north": "true", - "east": "true" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/rd_y" @@ -225,10 +225,10 @@ }, { "when": { - "south": "true", "west": "false", + "east": "false", "north": "true", - "east": "false" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -236,10 +236,10 @@ }, { "when": { - "south": "true", "west": "false", + "east": "false", "north": "false", - "east": "false" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -247,10 +247,10 @@ }, { "when": { - "south": "false", "west": "false", + "east": "false", "north": "true", - "east": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -258,10 +258,10 @@ }, { "when": { - "south": "false", "west": "true", + "east": "true", "north": "false", - "east": "true" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -269,10 +269,10 @@ }, { "when": { - "south": "false", "west": "true", + "east": "false", "north": "false", - "east": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -280,10 +280,10 @@ }, { "when": { - "south": "false", "west": "false", + "east": "true", "north": "false", - "east": "true" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -291,10 +291,10 @@ }, { "when": { - "south": "false", "west": "false", + "east": "false", "north": "false", - "east": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/none_y" @@ -302,10 +302,10 @@ }, { "when": { - "up": "true", - "down": "false", "west": "false", - "east": "true" + "down": "false", + "east": "true", + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/lu_z" @@ -313,10 +313,10 @@ }, { "when": { - "up": "true", - "down": "false", "west": "true", - "east": "false" + "down": "false", + "east": "false", + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/ru_z" @@ -324,10 +324,10 @@ }, { "when": { - "up": "false", - "down": "true", "west": "false", - "east": "true" + "down": "true", + "east": "true", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/ld_z" @@ -335,10 +335,10 @@ }, { "when": { - "up": "false", - "down": "true", "west": "true", - "east": "false" + "down": "true", + "east": "false", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/rd_z" @@ -346,10 +346,10 @@ }, { "when": { - "up": "true", + "west": "false", "down": "true", - "west": "false", - "east": "false" + "east": "false", + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -357,10 +357,10 @@ }, { "when": { - "up": "true", + "west": "false", "down": "false", - "west": "false", - "east": "false" + "east": "false", + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -368,10 +368,10 @@ }, { "when": { - "up": "false", + "west": "false", "down": "true", - "west": "false", - "east": "false" + "east": "false", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -379,10 +379,10 @@ }, { "when": { - "up": "false", - "down": "false", "west": "true", - "east": "true" + "down": "false", + "east": "true", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -390,10 +390,10 @@ }, { "when": { - "up": "false", - "down": "false", "west": "false", - "east": "true" + "down": "false", + "east": "true", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -401,10 +401,10 @@ }, { "when": { - "up": "false", - "down": "false", "west": "true", - "east": "false" + "down": "false", + "east": "false", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -412,10 +412,10 @@ }, { "when": { - "up": "false", - "down": "false", "west": "false", - "east": "false" + "down": "false", + "east": "false", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/none_z" diff --git a/src/generated/resources/assets/create/blockstates/gray_valve_handle.json b/src/generated/resources/assets/create/blockstates/gray_valve_handle.json new file mode 100644 index 000000000..9b85eb843 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/gray_valve_handle.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/gray_valve_handle", + "x": 180 + }, + "facing=up": { + "model": "create:block/gray_valve_handle" + }, + "facing=north": { + "model": "create:block/gray_valve_handle", + "x": 90 + }, + "facing=south": { + "model": "create:block/gray_valve_handle", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/gray_valve_handle", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/gray_valve_handle", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/green_valve_handle.json b/src/generated/resources/assets/create/blockstates/green_valve_handle.json new file mode 100644 index 000000000..aed9eac23 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/green_valve_handle.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/green_valve_handle", + "x": 180 + }, + "facing=up": { + "model": "create:block/green_valve_handle" + }, + "facing=north": { + "model": "create:block/green_valve_handle", + "x": 90 + }, + "facing=south": { + "model": "create:block/green_valve_handle", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/green_valve_handle", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/green_valve_handle", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/light_blue_valve_handle.json b/src/generated/resources/assets/create/blockstates/light_blue_valve_handle.json new file mode 100644 index 000000000..e42c11775 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/light_blue_valve_handle.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/light_blue_valve_handle", + "x": 180 + }, + "facing=up": { + "model": "create:block/light_blue_valve_handle" + }, + "facing=north": { + "model": "create:block/light_blue_valve_handle", + "x": 90 + }, + "facing=south": { + "model": "create:block/light_blue_valve_handle", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/light_blue_valve_handle", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/light_blue_valve_handle", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/light_gray_valve_handle.json b/src/generated/resources/assets/create/blockstates/light_gray_valve_handle.json new file mode 100644 index 000000000..488dc982a --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/light_gray_valve_handle.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/light_gray_valve_handle", + "x": 180 + }, + "facing=up": { + "model": "create:block/light_gray_valve_handle" + }, + "facing=north": { + "model": "create:block/light_gray_valve_handle", + "x": 90 + }, + "facing=south": { + "model": "create:block/light_gray_valve_handle", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/light_gray_valve_handle", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/light_gray_valve_handle", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/lime_valve_handle.json b/src/generated/resources/assets/create/blockstates/lime_valve_handle.json new file mode 100644 index 000000000..e761549f8 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/lime_valve_handle.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/lime_valve_handle", + "x": 180 + }, + "facing=up": { + "model": "create:block/lime_valve_handle" + }, + "facing=north": { + "model": "create:block/lime_valve_handle", + "x": 90 + }, + "facing=south": { + "model": "create:block/lime_valve_handle", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/lime_valve_handle", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/lime_valve_handle", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/magenta_valve_handle.json b/src/generated/resources/assets/create/blockstates/magenta_valve_handle.json new file mode 100644 index 000000000..bfcd42027 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/magenta_valve_handle.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/magenta_valve_handle", + "x": 180 + }, + "facing=up": { + "model": "create:block/magenta_valve_handle" + }, + "facing=north": { + "model": "create:block/magenta_valve_handle", + "x": 90 + }, + "facing=south": { + "model": "create:block/magenta_valve_handle", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/magenta_valve_handle", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/magenta_valve_handle", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/orange_valve_handle.json b/src/generated/resources/assets/create/blockstates/orange_valve_handle.json new file mode 100644 index 000000000..696d65489 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/orange_valve_handle.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/orange_valve_handle", + "x": 180 + }, + "facing=up": { + "model": "create:block/orange_valve_handle" + }, + "facing=north": { + "model": "create:block/orange_valve_handle", + "x": 90 + }, + "facing=south": { + "model": "create:block/orange_valve_handle", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/orange_valve_handle", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/orange_valve_handle", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/pink_valve_handle.json b/src/generated/resources/assets/create/blockstates/pink_valve_handle.json new file mode 100644 index 000000000..6097d8dee --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/pink_valve_handle.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/pink_valve_handle", + "x": 180 + }, + "facing=up": { + "model": "create:block/pink_valve_handle" + }, + "facing=north": { + "model": "create:block/pink_valve_handle", + "x": 90 + }, + "facing=south": { + "model": "create:block/pink_valve_handle", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/pink_valve_handle", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/pink_valve_handle", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/purple_valve_handle.json b/src/generated/resources/assets/create/blockstates/purple_valve_handle.json new file mode 100644 index 000000000..caaa8c991 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/purple_valve_handle.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/purple_valve_handle", + "x": 180 + }, + "facing=up": { + "model": "create:block/purple_valve_handle" + }, + "facing=north": { + "model": "create:block/purple_valve_handle", + "x": 90 + }, + "facing=south": { + "model": "create:block/purple_valve_handle", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/purple_valve_handle", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/purple_valve_handle", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/radial_chassis.json b/src/generated/resources/assets/create/blockstates/radial_chassis.json index d60327a8a..9d00ea8b1 100644 --- a/src/generated/resources/assets/create/blockstates/radial_chassis.json +++ b/src/generated/resources/assets/create/blockstates/radial_chassis.json @@ -149,8 +149,8 @@ }, { "when": { - "axis": "x", - "sticky_north": "true" + "sticky_north": "true", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky" @@ -158,8 +158,8 @@ }, { "when": { - "axis": "y", - "sticky_north": "true" + "sticky_north": "true", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -168,8 +168,8 @@ }, { "when": { - "axis": "z", - "sticky_north": "true" + "sticky_north": "true", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -178,8 +178,8 @@ }, { "when": { - "axis": "x", - "sticky_north": "false" + "sticky_north": "false", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x" @@ -187,8 +187,8 @@ }, { "when": { - "axis": "y", - "sticky_north": "false" + "sticky_north": "false", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -197,8 +197,8 @@ }, { "when": { - "axis": "z", - "sticky_north": "false" + "sticky_north": "false", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_x", diff --git a/src/generated/resources/assets/create/blockstates/valve_handle.json b/src/generated/resources/assets/create/blockstates/red_valve_handle.json similarity index 51% rename from src/generated/resources/assets/create/blockstates/valve_handle.json rename to src/generated/resources/assets/create/blockstates/red_valve_handle.json index d3333b2e6..0bff1aa0f 100644 --- a/src/generated/resources/assets/create/blockstates/valve_handle.json +++ b/src/generated/resources/assets/create/blockstates/red_valve_handle.json @@ -1,28 +1,28 @@ { "variants": { "facing=down": { - "model": "create:block/valve_handle", + "model": "create:block/red_valve_handle", "x": 180 }, "facing=up": { - "model": "create:block/valve_handle" + "model": "create:block/red_valve_handle" }, "facing=north": { - "model": "create:block/valve_handle", + "model": "create:block/red_valve_handle", "x": 90 }, "facing=south": { - "model": "create:block/valve_handle", + "model": "create:block/red_valve_handle", "x": 90, "y": 180 }, "facing=west": { - "model": "create:block/valve_handle", + "model": "create:block/red_valve_handle", "x": 90, "y": 270 }, "facing=east": { - "model": "create:block/valve_handle", + "model": "create:block/red_valve_handle", "x": 90, "y": 90 } diff --git a/src/generated/resources/assets/create/blockstates/white_valve_handle.json b/src/generated/resources/assets/create/blockstates/white_valve_handle.json new file mode 100644 index 000000000..ced0ad42e --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/white_valve_handle.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/white_valve_handle", + "x": 180 + }, + "facing=up": { + "model": "create:block/white_valve_handle" + }, + "facing=north": { + "model": "create:block/white_valve_handle", + "x": 90 + }, + "facing=south": { + "model": "create:block/white_valve_handle", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/white_valve_handle", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/white_valve_handle", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/yellow_valve_handle.json b/src/generated/resources/assets/create/blockstates/yellow_valve_handle.json new file mode 100644 index 000000000..0edbf38a0 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/yellow_valve_handle.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/yellow_valve_handle", + "x": 180 + }, + "facing=up": { + "model": "create:block/yellow_valve_handle" + }, + "facing=north": { + "model": "create:block/yellow_valve_handle", + "x": 90 + }, + "facing=south": { + "model": "create:block/yellow_valve_handle", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/yellow_valve_handle", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/yellow_valve_handle", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index b30104b36..b38c1f753 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -24,14 +24,17 @@ "block.create.birch_window": "\u028Dopu\u0131M \u0265\u0254\u0279\u0131\u15FA", "block.create.birch_window_pane": "\u01DDu\u0250\u0500 \u028Dopu\u0131M \u0265\u0254\u0279\u0131\u15FA", "block.create.black_seat": "\u0287\u0250\u01DDS \u029E\u0254\u0250\u05DF\u15FA", + "block.create.black_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u029E\u0254\u0250\u05DF\u15FA", "block.create.blaze_burner": "\u0279\u01DDu\u0279n\u15FA \u01DDz\u0250\u05DF\u15FA", "block.create.blue_seat": "\u0287\u0250\u01DDS \u01DDn\u05DF\u15FA", + "block.create.blue_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u01DDn\u05DF\u15FA", "block.create.brass_belt_funnel": "\u05DF\u01DDuun\u2132 \u0287\u05DF\u01DD\u15FA ss\u0250\u0279\u15FA", "block.create.brass_block": "\u029E\u0254o\u05DF\u15FA ss\u0250\u0279\u15FA", "block.create.brass_casing": "bu\u0131s\u0250\u0186 ss\u0250\u0279\u15FA", "block.create.brass_funnel": "\u05DF\u01DDuun\u2132 ss\u0250\u0279\u15FA", "block.create.brass_tunnel": "\u05DF\u01DDuun\u27D8 ss\u0250\u0279\u15FA", "block.create.brown_seat": "\u0287\u0250\u01DDS u\u028Do\u0279\u15FA", + "block.create.brown_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B u\u028Do\u0279\u15FA", "block.create.cart_assembler": "\u0279\u01DD\u05DFq\u026F\u01DDss\u2C6F \u0287\u0279\u0250\u0186", "block.create.chiseled_dark_scoria": "\u0250\u0131\u0279o\u0254S \u029E\u0279\u0250\u15E1 p\u01DD\u05DF\u01DDs\u0131\u0265\u0186", "block.create.chiseled_dolomite": "\u01DD\u0287\u0131\u026Fo\u05DFo\u15E1 p\u01DD\u05DF\u01DDs\u0131\u0265\u0186", @@ -49,12 +52,14 @@ "block.create.copper_ore": "\u01DD\u0279O \u0279\u01DDddo\u0186", "block.create.copper_shingles": "s\u01DD\u05DFbu\u0131\u0265S \u0279\u01DDddo\u0186", "block.create.copper_tiles": "s\u01DD\u05DF\u0131\u27D8 \u0279\u01DDddo\u0186", + "block.create.copper_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u0279\u01DDddo\u0186", "block.create.creative_crate": "\u01DD\u0287\u0250\u0279\u0186 \u01DD\u028C\u0131\u0287\u0250\u01DD\u0279\u0186", "block.create.creative_motor": "\u0279o\u0287oW \u01DD\u028C\u0131\u0287\u0250\u01DD\u0279\u0186", "block.create.crushing_wheel": "\u05DF\u01DD\u01DD\u0265M bu\u0131\u0265sn\u0279\u0186", "block.create.crushing_wheel_controller": "\u0279\u01DD\u05DF\u05DFo\u0279\u0287uo\u0186 \u05DF\u01DD\u01DD\u0265M bu\u0131\u0265sn\u0279\u0186", "block.create.cuckoo_clock": "\u029E\u0254o\u05DF\u0186 oo\u029E\u0254n\u0186", "block.create.cyan_seat": "\u0287\u0250\u01DDS u\u0250\u028E\u0186", + "block.create.cyan_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B u\u0250\u028E\u0186", "block.create.dark_oak_window": "\u028Dopu\u0131M \u029E\u0250O \u029E\u0279\u0250\u15E1", "block.create.dark_oak_window_pane": "\u01DDu\u0250\u0500 \u028Dopu\u0131M \u029E\u0250O \u029E\u0279\u0250\u15E1", "block.create.dark_scoria": "\u0250\u0131\u0279o\u0254S \u029E\u0279\u0250\u15E1", @@ -158,7 +163,9 @@ "block.create.granite_cobblestone_wall": "\u05DF\u05DF\u0250M \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 \u01DD\u0287\u0131u\u0250\u0279\u2141", "block.create.granite_pillar": "\u0279\u0250\u05DF\u05DF\u0131\u0500 \u01DD\u0287\u0131u\u0250\u0279\u2141", "block.create.gray_seat": "\u0287\u0250\u01DDS \u028E\u0250\u0279\u2141", + "block.create.gray_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u028E\u0250\u0279\u2141", "block.create.green_seat": "\u0287\u0250\u01DDS u\u01DD\u01DD\u0279\u2141", + "block.create.green_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B u\u01DD\u01DD\u0279\u2141", "block.create.hand_crank": "\u029Eu\u0250\u0279\u0186 pu\u0250H", "block.create.horizontal_framed_glass": "ss\u0250\u05DF\u2141 p\u01DD\u026F\u0250\u0279\u2132 \u05DF\u0250\u0287uoz\u0131\u0279oH", "block.create.horizontal_framed_glass_pane": "\u01DDu\u0250\u0500 ss\u0250\u05DF\u2141 p\u01DD\u026F\u0250\u0279\u2132 \u05DF\u0250\u0287uoz\u0131\u0279oH", @@ -175,8 +182,11 @@ "block.create.layered_scoria": "\u0250\u0131\u0279o\u0254S p\u01DD\u0279\u01DD\u028E\u0250\uA780", "block.create.layered_weathered_limestone": "\u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM p\u01DD\u0279\u01DD\u028E\u0250\uA780", "block.create.light_blue_seat": "\u0287\u0250\u01DDS \u01DDn\u05DF\u15FA \u0287\u0265b\u0131\uA780", + "block.create.light_blue_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u01DDn\u05DF\u15FA \u0287\u0265b\u0131\uA780", "block.create.light_gray_seat": "\u0287\u0250\u01DDS \u028E\u0250\u0279\u2141 \u0287\u0265b\u0131\uA780", + "block.create.light_gray_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u028E\u0250\u0279\u2141 \u0287\u0265b\u0131\uA780", "block.create.lime_seat": "\u0287\u0250\u01DDS \u01DD\u026F\u0131\uA780", + "block.create.lime_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u01DD\u026F\u0131\uA780", "block.create.limesand": "pu\u0250s\u01DD\u026F\u0131\uA780", "block.create.limestone": "\u01DDuo\u0287s\u01DD\u026F\u0131\uA780", "block.create.limestone_bricks": "s\u029E\u0254\u0131\u0279\u15FA \u01DDuo\u0287s\u01DD\u026F\u0131\uA780", @@ -190,6 +200,7 @@ "block.create.limestone_pillar": "\u0279\u0250\u05DF\u05DF\u0131\u0500 \u01DDuo\u0287s\u01DD\u026F\u0131\uA780", "block.create.linear_chassis": "s\u0131ss\u0250\u0265\u0186 \u0279\u0250\u01DDu\u0131\uA780", "block.create.magenta_seat": "\u0287\u0250\u01DDS \u0250\u0287u\u01DDb\u0250W", + "block.create.magenta_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u0250\u0287u\u01DDb\u0250W", "block.create.mechanical_arm": "\u026F\u0279\u2C6F \u05DF\u0250\u0254\u0131u\u0250\u0265\u0254\u01DDW", "block.create.mechanical_bearing": "bu\u0131\u0279\u0250\u01DD\u15FA \u05DF\u0250\u0254\u0131u\u0250\u0265\u0254\u01DDW", "block.create.mechanical_crafter": "\u0279\u01DD\u0287\u025F\u0250\u0279\u0186 \u05DF\u0250\u0254\u0131u\u0250\u0265\u0254\u01DDW", @@ -220,6 +231,7 @@ "block.create.oak_window": "\u028Dopu\u0131M \u029E\u0250O", "block.create.oak_window_pane": "\u01DDu\u0250\u0500 \u028Dopu\u0131M \u029E\u0250O", "block.create.orange_seat": "\u0287\u0250\u01DDS \u01DDbu\u0250\u0279O", + "block.create.orange_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u01DDbu\u0250\u0279O", "block.create.ornate_iron_window": "\u028Dopu\u0131M uo\u0279I \u01DD\u0287\u0250u\u0279O", "block.create.ornate_iron_window_pane": "\u01DDu\u0250\u0500 \u028Dopu\u0131M uo\u0279I \u01DD\u0287\u0250u\u0279O", "block.create.overgrown_andesite": "\u01DD\u0287\u0131s\u01DDpu\u2C6F u\u028Do\u0279b\u0279\u01DD\u028CO", @@ -268,6 +280,7 @@ "block.create.paved_weathered_limestone_stairs": "s\u0279\u0131\u0250\u0287S \u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM p\u01DD\u028C\u0250\u0500", "block.create.paved_weathered_limestone_wall": "\u05DF\u05DF\u0250M \u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM p\u01DD\u028C\u0250\u0500", "block.create.pink_seat": "\u0287\u0250\u01DDS \u029Eu\u0131\u0500", + "block.create.pink_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u029Eu\u0131\u0500", "block.create.piston_extension_pole": "\u01DD\u05DFo\u0500 uo\u0131su\u01DD\u0287x\u018E uo\u0287s\u0131\u0500", "block.create.polished_dark_scoria": "\u0250\u0131\u0279o\u0254S \u029E\u0279\u0250\u15E1 p\u01DD\u0265s\u0131\u05DFo\u0500", "block.create.polished_dark_scoria_slab": "q\u0250\u05DFS \u0250\u0131\u0279o\u0254S \u029E\u0279\u0250\u15E1 p\u01DD\u0265s\u0131\u05DFo\u0500", @@ -299,8 +312,10 @@ "block.create.pulley_magnet": "\u0287\u01DDub\u0250W \u028E\u01DD\u05DF\u05DFn\u0500", "block.create.pulse_repeater": "\u0279\u01DD\u0287\u0250\u01DDd\u01DD\u1D1A \u01DDs\u05DFn\u0500", "block.create.purple_seat": "\u0287\u0250\u01DDS \u01DD\u05DFd\u0279n\u0500", + "block.create.purple_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u01DD\u05DFd\u0279n\u0500", "block.create.radial_chassis": "s\u0131ss\u0250\u0265\u0186 \u05DF\u0250\u0131p\u0250\u1D1A", "block.create.red_seat": "\u0287\u0250\u01DDS p\u01DD\u1D1A", + "block.create.red_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B p\u01DD\u1D1A", "block.create.redstone_contact": "\u0287\u0254\u0250\u0287uo\u0186 \u01DDuo\u0287sp\u01DD\u1D1A", "block.create.redstone_link": "\u029Eu\u0131\uA780 \u01DDuo\u0287sp\u01DD\u1D1A", "block.create.refined_radiance_casing": "bu\u0131s\u0250\u0186 \u0287u\u0250\u0131p\u0250\u1D1A", @@ -334,7 +349,6 @@ "block.create.tiled_glass": "ss\u0250\u05DF\u2141 p\u01DD\u05DF\u0131\u27D8", "block.create.tiled_glass_pane": "\u01DDu\u0250\u0500 ss\u0250\u05DF\u2141 p\u01DD\u05DF\u0131\u27D8", "block.create.turntable": "\u01DD\u05DFq\u0250\u0287u\u0279n\u27D8", - "block.create.valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B", "block.create.vertical_framed_glass": "ss\u0250\u05DF\u2141 p\u01DD\u026F\u0250\u0279\u2132 \u05DF\u0250\u0254\u0131\u0287\u0279\u01DD\u039B", "block.create.vertical_framed_glass_pane": "\u01DDu\u0250\u0500 ss\u0250\u05DF\u2141 p\u01DD\u026F\u0250\u0279\u2132 \u05DF\u0250\u0254\u0131\u0287\u0279\u01DD\u039B", "block.create.water_wheel": "\u05DF\u01DD\u01DD\u0265M \u0279\u01DD\u0287\u0250M", @@ -349,7 +363,9 @@ "block.create.weathered_limestone_cobblestone_wall": "\u05DF\u05DF\u0250M \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 \u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM", "block.create.weathered_limestone_pillar": "\u0279\u0250\u05DF\u05DF\u0131\u0500 \u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM", "block.create.white_seat": "\u0287\u0250\u01DDS \u01DD\u0287\u0131\u0265M", + "block.create.white_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u01DD\u0287\u0131\u0265M", "block.create.yellow_seat": "\u0287\u0250\u01DDS \u028Do\u05DF\u05DF\u01DD\u028E", + "block.create.yellow_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u028Do\u05DF\u05DF\u01DD\u028E", "block.create.zinc_block": "\u029E\u0254o\u05DF\u15FA \u0254u\u0131Z", "block.create.zinc_ore": "\u01DD\u0279O \u0254u\u0131Z", "entity.create.contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 1daf3530c..934c85910 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -27,14 +27,17 @@ "block.create.birch_window": "Birch Window", "block.create.birch_window_pane": "Birch Window Pane", "block.create.black_seat": "Black Seat", + "block.create.black_valve_handle": "Black Valve Handle", "block.create.blaze_burner": "Blaze Burner", "block.create.blue_seat": "Blue Seat", + "block.create.blue_valve_handle": "Blue Valve Handle", "block.create.brass_belt_funnel": "Brass Belt Funnel", "block.create.brass_block": "Brass Block", "block.create.brass_casing": "Brass Casing", "block.create.brass_funnel": "Brass Funnel", "block.create.brass_tunnel": "Brass Tunnel", "block.create.brown_seat": "Brown Seat", + "block.create.brown_valve_handle": "Brown Valve Handle", "block.create.cart_assembler": "Cart Assembler", "block.create.chiseled_dark_scoria": "Chiseled Dark Scoria", "block.create.chiseled_dolomite": "Chiseled Dolomite", @@ -52,12 +55,14 @@ "block.create.copper_ore": "Copper Ore", "block.create.copper_shingles": "Copper Shingles", "block.create.copper_tiles": "Copper Tiles", + "block.create.copper_valve_handle": "Copper Valve Handle", "block.create.creative_crate": "Creative Crate", "block.create.creative_motor": "Creative Motor", "block.create.crushing_wheel": "Crushing Wheel", "block.create.crushing_wheel_controller": "Crushing Wheel Controller", "block.create.cuckoo_clock": "Cuckoo Clock", "block.create.cyan_seat": "Cyan Seat", + "block.create.cyan_valve_handle": "Cyan Valve Handle", "block.create.dark_oak_window": "Dark Oak Window", "block.create.dark_oak_window_pane": "Dark Oak Window Pane", "block.create.dark_scoria": "Dark Scoria", @@ -161,7 +166,9 @@ "block.create.granite_cobblestone_wall": "Granite Cobblestone Wall", "block.create.granite_pillar": "Granite Pillar", "block.create.gray_seat": "Gray Seat", + "block.create.gray_valve_handle": "Gray Valve Handle", "block.create.green_seat": "Green Seat", + "block.create.green_valve_handle": "Green Valve Handle", "block.create.hand_crank": "Hand Crank", "block.create.horizontal_framed_glass": "Horizontal Framed Glass", "block.create.horizontal_framed_glass_pane": "Horizontal Framed Glass Pane", @@ -178,8 +185,11 @@ "block.create.layered_scoria": "Layered Scoria", "block.create.layered_weathered_limestone": "Layered Weathered Limestone", "block.create.light_blue_seat": "Light Blue Seat", + "block.create.light_blue_valve_handle": "Light Blue Valve Handle", "block.create.light_gray_seat": "Light Gray Seat", + "block.create.light_gray_valve_handle": "Light Gray Valve Handle", "block.create.lime_seat": "Lime Seat", + "block.create.lime_valve_handle": "Lime Valve Handle", "block.create.limesand": "Limesand", "block.create.limestone": "Limestone", "block.create.limestone_bricks": "Limestone Bricks", @@ -193,6 +203,7 @@ "block.create.limestone_pillar": "Limestone Pillar", "block.create.linear_chassis": "Linear Chassis", "block.create.magenta_seat": "Magenta Seat", + "block.create.magenta_valve_handle": "Magenta Valve Handle", "block.create.mechanical_arm": "Mechanical Arm", "block.create.mechanical_bearing": "Mechanical Bearing", "block.create.mechanical_crafter": "Mechanical Crafter", @@ -223,6 +234,7 @@ "block.create.oak_window": "Oak Window", "block.create.oak_window_pane": "Oak Window Pane", "block.create.orange_seat": "Orange Seat", + "block.create.orange_valve_handle": "Orange Valve Handle", "block.create.ornate_iron_window": "Ornate Iron Window", "block.create.ornate_iron_window_pane": "Ornate Iron Window Pane", "block.create.overgrown_andesite": "Overgrown Andesite", @@ -271,6 +283,7 @@ "block.create.paved_weathered_limestone_stairs": "Paved Weathered Limestone Stairs", "block.create.paved_weathered_limestone_wall": "Paved Weathered Limestone Wall", "block.create.pink_seat": "Pink Seat", + "block.create.pink_valve_handle": "Pink Valve Handle", "block.create.piston_extension_pole": "Piston Extension Pole", "block.create.polished_dark_scoria": "Polished Dark Scoria", "block.create.polished_dark_scoria_slab": "Polished Dark Scoria Slab", @@ -302,8 +315,10 @@ "block.create.pulley_magnet": "Pulley Magnet", "block.create.pulse_repeater": "Pulse Repeater", "block.create.purple_seat": "Purple Seat", + "block.create.purple_valve_handle": "Purple Valve Handle", "block.create.radial_chassis": "Radial Chassis", "block.create.red_seat": "Red Seat", + "block.create.red_valve_handle": "Red Valve Handle", "block.create.redstone_contact": "Redstone Contact", "block.create.redstone_link": "Redstone Link", "block.create.refined_radiance_casing": "Radiant Casing", @@ -337,7 +352,6 @@ "block.create.tiled_glass": "Tiled Glass", "block.create.tiled_glass_pane": "Tiled Glass Pane", "block.create.turntable": "Turntable", - "block.create.valve_handle": "Valve Handle", "block.create.vertical_framed_glass": "Vertical Framed Glass", "block.create.vertical_framed_glass_pane": "Vertical Framed Glass Pane", "block.create.water_wheel": "Water Wheel", @@ -352,7 +366,9 @@ "block.create.weathered_limestone_cobblestone_wall": "Weathered Limestone Cobblestone Wall", "block.create.weathered_limestone_pillar": "Weathered Limestone Pillar", "block.create.white_seat": "White Seat", + "block.create.white_valve_handle": "White Valve Handle", "block.create.yellow_seat": "Yellow Seat", + "block.create.yellow_valve_handle": "Yellow Valve Handle", "block.create.zinc_block": "Zinc Block", "block.create.zinc_ore": "Zinc Ore", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index c72d05bb9..e184d37aa 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 807", + "_": "Missing Localizations: 823", "_": "->------------------------] Game Elements [------------------------<-", @@ -28,14 +28,17 @@ "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.black_seat": "UNLOCALIZED: Black Seat", + "block.create.black_valve_handle": "UNLOCALIZED: Black Valve Handle", "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", + "block.create.blue_valve_handle": "UNLOCALIZED: Blue Valve Handle", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", "block.create.brass_block": "UNLOCALIZED: Brass Block", "block.create.brass_casing": "UNLOCALIZED: Brass Casing", "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", "block.create.brown_seat": "UNLOCALIZED: Brown Seat", + "block.create.brown_valve_handle": "UNLOCALIZED: Brown Valve Handle", "block.create.cart_assembler": "UNLOCALIZED: Cart Assembler", "block.create.chiseled_dark_scoria": "UNLOCALIZED: Chiseled Dark Scoria", "block.create.chiseled_dolomite": "UNLOCALIZED: Chiseled Dolomite", @@ -53,12 +56,14 @@ "block.create.copper_ore": "UNLOCALIZED: Copper Ore", "block.create.copper_shingles": "UNLOCALIZED: Copper Shingles", "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", + "block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle", "block.create.creative_crate": "Bauplankanonenmacher", "block.create.creative_motor": "UNLOCALIZED: Creative Motor", "block.create.crushing_wheel": "Mahlwerkrad", "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", "block.create.cuckoo_clock": "UNLOCALIZED: Cuckoo Clock", "block.create.cyan_seat": "UNLOCALIZED: Cyan Seat", + "block.create.cyan_valve_handle": "UNLOCALIZED: Cyan Valve Handle", "block.create.dark_oak_window": "UNLOCALIZED: Dark Oak Window", "block.create.dark_oak_window_pane": "UNLOCALIZED: Dark Oak Window Pane", "block.create.dark_scoria": "UNLOCALIZED: Dark Scoria", @@ -162,7 +167,9 @@ "block.create.granite_cobblestone_wall": "UNLOCALIZED: Granite Cobblestone Wall", "block.create.granite_pillar": "UNLOCALIZED: Granite Pillar", "block.create.gray_seat": "UNLOCALIZED: Gray Seat", + "block.create.gray_valve_handle": "UNLOCALIZED: Gray Valve Handle", "block.create.green_seat": "UNLOCALIZED: Green Seat", + "block.create.green_valve_handle": "UNLOCALIZED: Green Valve Handle", "block.create.hand_crank": "UNLOCALIZED: Hand Crank", "block.create.horizontal_framed_glass": "UNLOCALIZED: Horizontal Framed Glass", "block.create.horizontal_framed_glass_pane": "UNLOCALIZED: Horizontal Framed Glass Pane", @@ -179,8 +186,11 @@ "block.create.layered_scoria": "UNLOCALIZED: Layered Scoria", "block.create.layered_weathered_limestone": "UNLOCALIZED: Layered Weathered Limestone", "block.create.light_blue_seat": "UNLOCALIZED: Light Blue Seat", + "block.create.light_blue_valve_handle": "UNLOCALIZED: Light Blue Valve Handle", "block.create.light_gray_seat": "UNLOCALIZED: Light Gray Seat", + "block.create.light_gray_valve_handle": "UNLOCALIZED: Light Gray Valve Handle", "block.create.lime_seat": "UNLOCALIZED: Lime Seat", + "block.create.lime_valve_handle": "UNLOCALIZED: Lime Valve Handle", "block.create.limesand": "Kalksand", "block.create.limestone": "Kalkstein", "block.create.limestone_bricks": "Kalksteinziegel", @@ -194,6 +204,7 @@ "block.create.limestone_pillar": "Kalksteinsäule", "block.create.linear_chassis": "Schubgerüst", "block.create.magenta_seat": "UNLOCALIZED: Magenta Seat", + "block.create.magenta_valve_handle": "UNLOCALIZED: Magenta Valve Handle", "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", "block.create.mechanical_bearing": "Mechanisches Lager", "block.create.mechanical_crafter": "UNLOCALIZED: Mechanical Crafter", @@ -224,6 +235,7 @@ "block.create.oak_window": "UNLOCALIZED: Oak Window", "block.create.oak_window_pane": "UNLOCALIZED: Oak Window Pane", "block.create.orange_seat": "UNLOCALIZED: Orange Seat", + "block.create.orange_valve_handle": "UNLOCALIZED: Orange Valve Handle", "block.create.ornate_iron_window": "UNLOCALIZED: Ornate Iron Window", "block.create.ornate_iron_window_pane": "UNLOCALIZED: Ornate Iron Window Pane", "block.create.overgrown_andesite": "UNLOCALIZED: Overgrown Andesite", @@ -272,6 +284,7 @@ "block.create.paved_weathered_limestone_stairs": "UNLOCALIZED: Paved Weathered Limestone Stairs", "block.create.paved_weathered_limestone_wall": "UNLOCALIZED: Paved Weathered Limestone Wall", "block.create.pink_seat": "UNLOCALIZED: Pink Seat", + "block.create.pink_valve_handle": "UNLOCALIZED: Pink Valve Handle", "block.create.piston_extension_pole": "Kolben-Pleuelverlängerung", "block.create.polished_dark_scoria": "UNLOCALIZED: Polished Dark Scoria", "block.create.polished_dark_scoria_slab": "UNLOCALIZED: Polished Dark Scoria Slab", @@ -303,8 +316,10 @@ "block.create.pulley_magnet": "UNLOCALIZED: Pulley Magnet", "block.create.pulse_repeater": "Pulsierender Verstärker", "block.create.purple_seat": "UNLOCALIZED: Purple Seat", + "block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle", "block.create.radial_chassis": "Drehgerüst", "block.create.red_seat": "UNLOCALIZED: Red Seat", + "block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle", "block.create.redstone_contact": "Redstone-Kontakt", "block.create.redstone_link": "Redstone-Verbindung", "block.create.refined_radiance_casing": "UNLOCALIZED: Radiant Casing", @@ -338,7 +353,6 @@ "block.create.tiled_glass": "Glasfliesen", "block.create.tiled_glass_pane": "Glasfliesenscheibe", "block.create.turntable": "Drehtisch", - "block.create.valve_handle": "UNLOCALIZED: Valve Handle", "block.create.vertical_framed_glass": "UNLOCALIZED: Vertical Framed Glass", "block.create.vertical_framed_glass_pane": "UNLOCALIZED: Vertical Framed Glass Pane", "block.create.water_wheel": "Wasserrad", @@ -353,7 +367,9 @@ "block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall", "block.create.weathered_limestone_pillar": "Verwitterte Kalksteinsäule", "block.create.white_seat": "UNLOCALIZED: White Seat", + "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", + "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", "block.create.zinc_block": "UNLOCALIZED: Zinc Block", "block.create.zinc_ore": "UNLOCALIZED: Zinc Ore", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index 3420ffb7e..64940f884 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 431", + "_": "Missing Localizations: 447", "_": "->------------------------] Game Elements [------------------------<-", @@ -28,14 +28,17 @@ "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.black_seat": "UNLOCALIZED: Black Seat", + "block.create.black_valve_handle": "UNLOCALIZED: Black Valve Handle", "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", + "block.create.blue_valve_handle": "UNLOCALIZED: Blue Valve Handle", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", "block.create.brass_block": "UNLOCALIZED: Brass Block", "block.create.brass_casing": "Boîtier en laiton", "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", "block.create.brown_seat": "UNLOCALIZED: Brown Seat", + "block.create.brown_valve_handle": "UNLOCALIZED: Brown Valve Handle", "block.create.cart_assembler": "Assembleur de wagon", "block.create.chiseled_dark_scoria": "UNLOCALIZED: Chiseled Dark Scoria", "block.create.chiseled_dolomite": "UNLOCALIZED: Chiseled Dolomite", @@ -53,12 +56,14 @@ "block.create.copper_ore": "Minerai de cuivre", "block.create.copper_shingles": "Bardeaux de cuivre", "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", + "block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle", "block.create.creative_crate": "Créateur de schémacanon", "block.create.creative_motor": "Moteur", "block.create.crushing_wheel": "Roue de concassage", "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", "block.create.cuckoo_clock": "Horloge à coucou", "block.create.cyan_seat": "UNLOCALIZED: Cyan Seat", + "block.create.cyan_valve_handle": "UNLOCALIZED: Cyan Valve Handle", "block.create.dark_oak_window": "UNLOCALIZED: Dark Oak Window", "block.create.dark_oak_window_pane": "UNLOCALIZED: Dark Oak Window Pane", "block.create.dark_scoria": "Scorie sombre", @@ -162,7 +167,9 @@ "block.create.granite_cobblestone_wall": "UNLOCALIZED: Granite Cobblestone Wall", "block.create.granite_pillar": "UNLOCALIZED: Granite Pillar", "block.create.gray_seat": "UNLOCALIZED: Gray Seat", + "block.create.gray_valve_handle": "UNLOCALIZED: Gray Valve Handle", "block.create.green_seat": "UNLOCALIZED: Green Seat", + "block.create.green_valve_handle": "UNLOCALIZED: Green Valve Handle", "block.create.hand_crank": "Manivelle", "block.create.horizontal_framed_glass": "Fenêtre en verre horizontale", "block.create.horizontal_framed_glass_pane": "Vitre encadrée horizontale", @@ -179,8 +186,11 @@ "block.create.layered_scoria": "UNLOCALIZED: Layered Scoria", "block.create.layered_weathered_limestone": "UNLOCALIZED: Layered Weathered Limestone", "block.create.light_blue_seat": "UNLOCALIZED: Light Blue Seat", + "block.create.light_blue_valve_handle": "UNLOCALIZED: Light Blue Valve Handle", "block.create.light_gray_seat": "UNLOCALIZED: Light Gray Seat", + "block.create.light_gray_valve_handle": "UNLOCALIZED: Light Gray Valve Handle", "block.create.lime_seat": "UNLOCALIZED: Lime Seat", + "block.create.lime_valve_handle": "UNLOCALIZED: Lime Valve Handle", "block.create.limesand": "Chaux", "block.create.limestone": "Calcaire", "block.create.limestone_bricks": "Briques de calcaire", @@ -194,6 +204,7 @@ "block.create.limestone_pillar": "Pillier de calcaire", "block.create.linear_chassis": "Châssis linéaire", "block.create.magenta_seat": "UNLOCALIZED: Magenta Seat", + "block.create.magenta_valve_handle": "UNLOCALIZED: Magenta Valve Handle", "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", "block.create.mechanical_bearing": "Roulement mécanique", "block.create.mechanical_crafter": "Établi mécanique", @@ -224,6 +235,7 @@ "block.create.oak_window": "UNLOCALIZED: Oak Window", "block.create.oak_window_pane": "UNLOCALIZED: Oak Window Pane", "block.create.orange_seat": "UNLOCALIZED: Orange Seat", + "block.create.orange_valve_handle": "UNLOCALIZED: Orange Valve Handle", "block.create.ornate_iron_window": "UNLOCALIZED: Ornate Iron Window", "block.create.ornate_iron_window_pane": "UNLOCALIZED: Ornate Iron Window Pane", "block.create.overgrown_andesite": "UNLOCALIZED: Overgrown Andesite", @@ -272,6 +284,7 @@ "block.create.paved_weathered_limestone_stairs": "UNLOCALIZED: Paved Weathered Limestone Stairs", "block.create.paved_weathered_limestone_wall": "UNLOCALIZED: Paved Weathered Limestone Wall", "block.create.pink_seat": "UNLOCALIZED: Pink Seat", + "block.create.pink_valve_handle": "UNLOCALIZED: Pink Valve Handle", "block.create.piston_extension_pole": "Pôle d'extension de piston", "block.create.polished_dark_scoria": "Scorie sombre polie", "block.create.polished_dark_scoria_slab": "UNLOCALIZED: Polished Dark Scoria Slab", @@ -303,8 +316,10 @@ "block.create.pulley_magnet": "Aimant de poulie", "block.create.pulse_repeater": "Répéteur d'impulsions", "block.create.purple_seat": "UNLOCALIZED: Purple Seat", + "block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle", "block.create.radial_chassis": "Châssis radial", "block.create.red_seat": "UNLOCALIZED: Red Seat", + "block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle", "block.create.redstone_contact": "redstone_contact Redstone", "block.create.redstone_link": "Liaison Redstone", "block.create.refined_radiance_casing": "UNLOCALIZED: Radiant Casing", @@ -338,7 +353,6 @@ "block.create.tiled_glass": "Verre carrelé", "block.create.tiled_glass_pane": "Vitre carrelé", "block.create.turntable": "Plaque tournante", - "block.create.valve_handle": "UNLOCALIZED: Valve Handle", "block.create.vertical_framed_glass": "Fenêtre en verre verticale", "block.create.vertical_framed_glass_pane": "Vitre encadrée verticale", "block.create.water_wheel": "Roue à eau", @@ -353,7 +367,9 @@ "block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall", "block.create.weathered_limestone_pillar": "Pillier de calcaire patinées", "block.create.white_seat": "UNLOCALIZED: White Seat", + "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", + "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", "block.create.zinc_block": "UNLOCALIZED: Zinc Block", "block.create.zinc_ore": "Minerai de zinc", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index 705586333..469aed4fe 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 415", + "_": "Missing Localizations: 431", "_": "->------------------------] Game Elements [------------------------<-", @@ -28,14 +28,17 @@ "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.black_seat": "UNLOCALIZED: Black Seat", + "block.create.black_valve_handle": "UNLOCALIZED: Black Valve Handle", "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", + "block.create.blue_valve_handle": "UNLOCALIZED: Blue Valve Handle", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", "block.create.brass_block": "Blocco di Ottone", "block.create.brass_casing": "Involucro di Ottone", "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", "block.create.brown_seat": "UNLOCALIZED: Brown Seat", + "block.create.brown_valve_handle": "UNLOCALIZED: Brown Valve Handle", "block.create.cart_assembler": "Assemblatore Carrello da Miniera", "block.create.chiseled_dark_scoria": "UNLOCALIZED: Chiseled Dark Scoria", "block.create.chiseled_dolomite": "UNLOCALIZED: Chiseled Dolomite", @@ -53,12 +56,14 @@ "block.create.copper_ore": "Rame Grezzo", "block.create.copper_shingles": "Tegole di Rame", "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", + "block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle", "block.create.creative_crate": "Creatore Cannoneschematico", "block.create.creative_motor": "Motore", "block.create.crushing_wheel": "Ruota di Frantumazione", "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", "block.create.cuckoo_clock": "Orologio a Cucù", "block.create.cyan_seat": "UNLOCALIZED: Cyan Seat", + "block.create.cyan_valve_handle": "UNLOCALIZED: Cyan Valve Handle", "block.create.dark_oak_window": "UNLOCALIZED: Dark Oak Window", "block.create.dark_oak_window_pane": "UNLOCALIZED: Dark Oak Window Pane", "block.create.dark_scoria": "Scoria Scura", @@ -162,7 +167,9 @@ "block.create.granite_cobblestone_wall": "UNLOCALIZED: Granite Cobblestone Wall", "block.create.granite_pillar": "UNLOCALIZED: Granite Pillar", "block.create.gray_seat": "UNLOCALIZED: Gray Seat", + "block.create.gray_valve_handle": "UNLOCALIZED: Gray Valve Handle", "block.create.green_seat": "UNLOCALIZED: Green Seat", + "block.create.green_valve_handle": "UNLOCALIZED: Green Valve Handle", "block.create.hand_crank": "Manovella", "block.create.horizontal_framed_glass": "Finestra Orizzontale Vetro", "block.create.horizontal_framed_glass_pane": "Pannello di Finestra Orizzontale Vetro", @@ -179,8 +186,11 @@ "block.create.layered_scoria": "UNLOCALIZED: Layered Scoria", "block.create.layered_weathered_limestone": "UNLOCALIZED: Layered Weathered Limestone", "block.create.light_blue_seat": "UNLOCALIZED: Light Blue Seat", + "block.create.light_blue_valve_handle": "UNLOCALIZED: Light Blue Valve Handle", "block.create.light_gray_seat": "UNLOCALIZED: Light Gray Seat", + "block.create.light_gray_valve_handle": "UNLOCALIZED: Light Gray Valve Handle", "block.create.lime_seat": "UNLOCALIZED: Lime Seat", + "block.create.lime_valve_handle": "UNLOCALIZED: Lime Valve Handle", "block.create.limesand": "Silico Calcare", "block.create.limestone": "Calcare", "block.create.limestone_bricks": "Mattoni di Calcare", @@ -194,6 +204,7 @@ "block.create.limestone_pillar": "Pilastro di Calcare", "block.create.linear_chassis": "Telaio Lineare", "block.create.magenta_seat": "UNLOCALIZED: Magenta Seat", + "block.create.magenta_valve_handle": "UNLOCALIZED: Magenta Valve Handle", "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", "block.create.mechanical_bearing": "Supporto Meccanico", "block.create.mechanical_crafter": "Costruttore Meccanico", @@ -224,6 +235,7 @@ "block.create.oak_window": "UNLOCALIZED: Oak Window", "block.create.oak_window_pane": "UNLOCALIZED: Oak Window Pane", "block.create.orange_seat": "UNLOCALIZED: Orange Seat", + "block.create.orange_valve_handle": "UNLOCALIZED: Orange Valve Handle", "block.create.ornate_iron_window": "UNLOCALIZED: Ornate Iron Window", "block.create.ornate_iron_window_pane": "UNLOCALIZED: Ornate Iron Window Pane", "block.create.overgrown_andesite": "UNLOCALIZED: Overgrown Andesite", @@ -272,6 +284,7 @@ "block.create.paved_weathered_limestone_stairs": "UNLOCALIZED: Paved Weathered Limestone Stairs", "block.create.paved_weathered_limestone_wall": "UNLOCALIZED: Paved Weathered Limestone Wall", "block.create.pink_seat": "UNLOCALIZED: Pink Seat", + "block.create.pink_valve_handle": "UNLOCALIZED: Pink Valve Handle", "block.create.piston_extension_pole": "Palo Pistome", "block.create.polished_dark_scoria": "Scoria Scura Levigata", "block.create.polished_dark_scoria_slab": "UNLOCALIZED: Polished Dark Scoria Slab", @@ -303,8 +316,10 @@ "block.create.pulley_magnet": "Magnete della Puleggia", "block.create.pulse_repeater": "Ripetitore di Impulsi", "block.create.purple_seat": "UNLOCALIZED: Purple Seat", + "block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle", "block.create.radial_chassis": "Telaio Radiale", "block.create.red_seat": "UNLOCALIZED: Red Seat", + "block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle", "block.create.redstone_contact": "Contatto Redstone", "block.create.redstone_link": "Collegamento Redstone", "block.create.refined_radiance_casing": "UNLOCALIZED: Radiant Casing", @@ -338,7 +353,6 @@ "block.create.tiled_glass": "Vetro Piastrellato", "block.create.tiled_glass_pane": "Pannello di Vetro Piastrellato", "block.create.turntable": "Piatto", - "block.create.valve_handle": "UNLOCALIZED: Valve Handle", "block.create.vertical_framed_glass": "Finestra Verticale Vetro", "block.create.vertical_framed_glass_pane": "Pannello di Finestra Verticale Vetro", "block.create.water_wheel": "Ruota d'Acqua", @@ -353,7 +367,9 @@ "block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall", "block.create.weathered_limestone_pillar": "Pilastro di Calcare Consumato", "block.create.white_seat": "UNLOCALIZED: White Seat", + "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", + "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", "block.create.zinc_block": "Blocco di Zinco", "block.create.zinc_ore": "Zinco Grezzo", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index a3a287baf..adc7f0ed1 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 410", + "_": "Missing Localizations: 426", "_": "->------------------------] Game Elements [------------------------<-", @@ -28,14 +28,17 @@ "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.black_seat": "UNLOCALIZED: Black Seat", + "block.create.black_valve_handle": "UNLOCALIZED: Black Valve Handle", "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", + "block.create.blue_valve_handle": "UNLOCALIZED: Blue Valve Handle", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", "block.create.brass_block": "真鍮ブロック", "block.create.brass_casing": "真鍮ケーシング", "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", "block.create.brown_seat": "UNLOCALIZED: Brown Seat", + "block.create.brown_valve_handle": "UNLOCALIZED: Brown Valve Handle", "block.create.cart_assembler": "カートアセンブラ", "block.create.chiseled_dark_scoria": "UNLOCALIZED: Chiseled Dark Scoria", "block.create.chiseled_dolomite": "UNLOCALIZED: Chiseled Dolomite", @@ -53,12 +56,14 @@ "block.create.copper_ore": "銅鉱石", "block.create.copper_shingles": "銅のこけら板", "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", + "block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle", "block.create.creative_crate": "概略図砲クリエティフィアー", "block.create.creative_motor": "モーター", "block.create.crushing_wheel": "破砕ホイール", "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", "block.create.cuckoo_clock": "鳩時計", "block.create.cyan_seat": "UNLOCALIZED: Cyan Seat", + "block.create.cyan_valve_handle": "UNLOCALIZED: Cyan Valve Handle", "block.create.dark_oak_window": "UNLOCALIZED: Dark Oak Window", "block.create.dark_oak_window_pane": "UNLOCALIZED: Dark Oak Window Pane", "block.create.dark_scoria": "ダークスコリア", @@ -162,7 +167,9 @@ "block.create.granite_cobblestone_wall": "UNLOCALIZED: Granite Cobblestone Wall", "block.create.granite_pillar": "UNLOCALIZED: Granite Pillar", "block.create.gray_seat": "UNLOCALIZED: Gray Seat", + "block.create.gray_valve_handle": "UNLOCALIZED: Gray Valve Handle", "block.create.green_seat": "UNLOCALIZED: Green Seat", + "block.create.green_valve_handle": "UNLOCALIZED: Green Valve Handle", "block.create.hand_crank": "ハンドクランク", "block.create.horizontal_framed_glass": "横型ガラス窓", "block.create.horizontal_framed_glass_pane": "横型ガラス窓板", @@ -179,8 +186,11 @@ "block.create.layered_scoria": "UNLOCALIZED: Layered Scoria", "block.create.layered_weathered_limestone": "UNLOCALIZED: Layered Weathered Limestone", "block.create.light_blue_seat": "UNLOCALIZED: Light Blue Seat", + "block.create.light_blue_valve_handle": "UNLOCALIZED: Light Blue Valve Handle", "block.create.light_gray_seat": "UNLOCALIZED: Light Gray Seat", + "block.create.light_gray_valve_handle": "UNLOCALIZED: Light Gray Valve Handle", "block.create.lime_seat": "UNLOCALIZED: Lime Seat", + "block.create.lime_valve_handle": "UNLOCALIZED: Lime Valve Handle", "block.create.limesand": "石灰砕砂", "block.create.limestone": "石灰岩", "block.create.limestone_bricks": "石灰岩レンガ", @@ -194,6 +204,7 @@ "block.create.limestone_pillar": "石灰岩の柱", "block.create.linear_chassis": "リニアシャーシ", "block.create.magenta_seat": "UNLOCALIZED: Magenta Seat", + "block.create.magenta_valve_handle": "UNLOCALIZED: Magenta Valve Handle", "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", "block.create.mechanical_bearing": "メカニカルベアリング", "block.create.mechanical_crafter": "メカニカルクラフター", @@ -224,6 +235,7 @@ "block.create.oak_window": "UNLOCALIZED: Oak Window", "block.create.oak_window_pane": "UNLOCALIZED: Oak Window Pane", "block.create.orange_seat": "UNLOCALIZED: Orange Seat", + "block.create.orange_valve_handle": "UNLOCALIZED: Orange Valve Handle", "block.create.ornate_iron_window": "UNLOCALIZED: Ornate Iron Window", "block.create.ornate_iron_window_pane": "UNLOCALIZED: Ornate Iron Window Pane", "block.create.overgrown_andesite": "UNLOCALIZED: Overgrown Andesite", @@ -272,6 +284,7 @@ "block.create.paved_weathered_limestone_stairs": "UNLOCALIZED: Paved Weathered Limestone Stairs", "block.create.paved_weathered_limestone_wall": "UNLOCALIZED: Paved Weathered Limestone Wall", "block.create.pink_seat": "UNLOCALIZED: Pink Seat", + "block.create.pink_valve_handle": "UNLOCALIZED: Pink Valve Handle", "block.create.piston_extension_pole": "ピストン延長ポール", "block.create.polished_dark_scoria": "磨かれたダークスコリア", "block.create.polished_dark_scoria_slab": "UNLOCALIZED: Polished Dark Scoria Slab", @@ -303,8 +316,10 @@ "block.create.pulley_magnet": "プーリーマグネット", "block.create.pulse_repeater": "パルスリピーター", "block.create.purple_seat": "UNLOCALIZED: Purple Seat", + "block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle", "block.create.radial_chassis": "ラジアルシャーシ", "block.create.red_seat": "UNLOCALIZED: Red Seat", + "block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle", "block.create.redstone_contact": "レッドストーンコンタクト", "block.create.redstone_link": "レッドストーンリンク", "block.create.refined_radiance_casing": "UNLOCALIZED: Radiant Casing", @@ -338,7 +353,6 @@ "block.create.tiled_glass": "タイルガラス", "block.create.tiled_glass_pane": "タイルガラス板", "block.create.turntable": "ターンテーブル", - "block.create.valve_handle": "UNLOCALIZED: Valve Handle", "block.create.vertical_framed_glass": "垂直ガラス窓", "block.create.vertical_framed_glass_pane": "垂直ガラス窓板", "block.create.water_wheel": "水車", @@ -353,7 +367,9 @@ "block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall", "block.create.weathered_limestone_pillar": "風化した石灰岩の柱", "block.create.white_seat": "UNLOCALIZED: White Seat", + "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", + "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", "block.create.zinc_block": "亜鉛ブロック", "block.create.zinc_ore": "亜鉛鉱石", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index 0acc022b0..345430ff2 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 415", + "_": "Missing Localizations: 431", "_": "->------------------------] Game Elements [------------------------<-", @@ -28,14 +28,17 @@ "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.black_seat": "UNLOCALIZED: Black Seat", + "block.create.black_valve_handle": "UNLOCALIZED: Black Valve Handle", "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", + "block.create.blue_valve_handle": "UNLOCALIZED: Blue Valve Handle", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", "block.create.brass_block": "황동 블럭", "block.create.brass_casing": "황동 케이스", "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", "block.create.brown_seat": "UNLOCALIZED: Brown Seat", + "block.create.brown_valve_handle": "UNLOCALIZED: Brown Valve Handle", "block.create.cart_assembler": "카트 조립기", "block.create.chiseled_dark_scoria": "UNLOCALIZED: Chiseled Dark Scoria", "block.create.chiseled_dolomite": "UNLOCALIZED: Chiseled Dolomite", @@ -53,12 +56,14 @@ "block.create.copper_ore": "구리 광석", "block.create.copper_shingles": "구리 판자", "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", + "block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle", "block.create.creative_crate": "청사진 대포 지원기", "block.create.creative_motor": "모터", "block.create.crushing_wheel": "분쇄 휠", "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", "block.create.cuckoo_clock": "뻐꾸기 시계", "block.create.cyan_seat": "UNLOCALIZED: Cyan Seat", + "block.create.cyan_valve_handle": "UNLOCALIZED: Cyan Valve Handle", "block.create.dark_oak_window": "UNLOCALIZED: Dark Oak Window", "block.create.dark_oak_window_pane": "UNLOCALIZED: Dark Oak Window Pane", "block.create.dark_scoria": "짙은 스코리아", @@ -162,7 +167,9 @@ "block.create.granite_cobblestone_wall": "UNLOCALIZED: Granite Cobblestone Wall", "block.create.granite_pillar": "UNLOCALIZED: Granite Pillar", "block.create.gray_seat": "UNLOCALIZED: Gray Seat", + "block.create.gray_valve_handle": "UNLOCALIZED: Gray Valve Handle", "block.create.green_seat": "UNLOCALIZED: Green Seat", + "block.create.green_valve_handle": "UNLOCALIZED: Green Valve Handle", "block.create.hand_crank": "핸드 크랭크", "block.create.horizontal_framed_glass": "수평 유리", "block.create.horizontal_framed_glass_pane": "수평 유리판", @@ -179,8 +186,11 @@ "block.create.layered_scoria": "UNLOCALIZED: Layered Scoria", "block.create.layered_weathered_limestone": "UNLOCALIZED: Layered Weathered Limestone", "block.create.light_blue_seat": "UNLOCALIZED: Light Blue Seat", + "block.create.light_blue_valve_handle": "UNLOCALIZED: Light Blue Valve Handle", "block.create.light_gray_seat": "UNLOCALIZED: Light Gray Seat", + "block.create.light_gray_valve_handle": "UNLOCALIZED: Light Gray Valve Handle", "block.create.lime_seat": "UNLOCALIZED: Lime Seat", + "block.create.lime_valve_handle": "UNLOCALIZED: Lime Valve Handle", "block.create.limesand": "석회모래", "block.create.limestone": "석회암", "block.create.limestone_bricks": "석회암 벽돌", @@ -194,6 +204,7 @@ "block.create.limestone_pillar": "석회암 기둥", "block.create.linear_chassis": "직선 섀시", "block.create.magenta_seat": "UNLOCALIZED: Magenta Seat", + "block.create.magenta_valve_handle": "UNLOCALIZED: Magenta Valve Handle", "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", "block.create.mechanical_bearing": "베어링", "block.create.mechanical_crafter": "기계식 조합기", @@ -224,6 +235,7 @@ "block.create.oak_window": "UNLOCALIZED: Oak Window", "block.create.oak_window_pane": "UNLOCALIZED: Oak Window Pane", "block.create.orange_seat": "UNLOCALIZED: Orange Seat", + "block.create.orange_valve_handle": "UNLOCALIZED: Orange Valve Handle", "block.create.ornate_iron_window": "UNLOCALIZED: Ornate Iron Window", "block.create.ornate_iron_window_pane": "UNLOCALIZED: Ornate Iron Window Pane", "block.create.overgrown_andesite": "UNLOCALIZED: Overgrown Andesite", @@ -272,6 +284,7 @@ "block.create.paved_weathered_limestone_stairs": "UNLOCALIZED: Paved Weathered Limestone Stairs", "block.create.paved_weathered_limestone_wall": "UNLOCALIZED: Paved Weathered Limestone Wall", "block.create.pink_seat": "UNLOCALIZED: Pink Seat", + "block.create.pink_valve_handle": "UNLOCALIZED: Pink Valve Handle", "block.create.piston_extension_pole": "피스톤 연장 축", "block.create.polished_dark_scoria": "윤나는 짙은 스코리아", "block.create.polished_dark_scoria_slab": "UNLOCALIZED: Polished Dark Scoria Slab", @@ -303,8 +316,10 @@ "block.create.pulley_magnet": "도르래 자석", "block.create.pulse_repeater": "펄스 리피터", "block.create.purple_seat": "UNLOCALIZED: Purple Seat", + "block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle", "block.create.radial_chassis": "원형 섀시", "block.create.red_seat": "UNLOCALIZED: Red Seat", + "block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle", "block.create.redstone_contact": "동형 감지기", "block.create.redstone_link": "레드스톤 링크", "block.create.refined_radiance_casing": "UNLOCALIZED: Radiant Casing", @@ -338,7 +353,6 @@ "block.create.tiled_glass": "타일 유리", "block.create.tiled_glass_pane": "타일 유리판", "block.create.turntable": "돌림판", - "block.create.valve_handle": "UNLOCALIZED: Valve Handle", "block.create.vertical_framed_glass": "수직 유리", "block.create.vertical_framed_glass_pane": "수직 유리판", "block.create.water_wheel": "물레방아", @@ -353,7 +367,9 @@ "block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall", "block.create.weathered_limestone_pillar": "풍화된 석회암 기둥", "block.create.white_seat": "UNLOCALIZED: White Seat", + "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", + "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", "block.create.zinc_block": "아연 블럭", "block.create.zinc_ore": "아연 광석", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index 876604dd5..a9bd3d243 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 745", + "_": "Missing Localizations: 761", "_": "->------------------------] Game Elements [------------------------<-", @@ -28,14 +28,17 @@ "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.black_seat": "UNLOCALIZED: Black Seat", + "block.create.black_valve_handle": "UNLOCALIZED: Black Valve Handle", "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", + "block.create.blue_valve_handle": "UNLOCALIZED: Blue Valve Handle", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", "block.create.brass_block": "UNLOCALIZED: Brass Block", "block.create.brass_casing": "UNLOCALIZED: Brass Casing", "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", "block.create.brown_seat": "UNLOCALIZED: Brown Seat", + "block.create.brown_valve_handle": "UNLOCALIZED: Brown Valve Handle", "block.create.cart_assembler": "Kar Assembler", "block.create.chiseled_dark_scoria": "UNLOCALIZED: Chiseled Dark Scoria", "block.create.chiseled_dolomite": "UNLOCALIZED: Chiseled Dolomite", @@ -53,12 +56,14 @@ "block.create.copper_ore": "UNLOCALIZED: Copper Ore", "block.create.copper_shingles": "UNLOCALIZED: Copper Shingles", "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", + "block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle", "block.create.creative_crate": "Bouwtekeningkannon Creatiefeerder", "block.create.creative_motor": "UNLOCALIZED: Creative Motor", "block.create.crushing_wheel": "Verpulveraar", "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", "block.create.cuckoo_clock": "UNLOCALIZED: Cuckoo Clock", "block.create.cyan_seat": "UNLOCALIZED: Cyan Seat", + "block.create.cyan_valve_handle": "UNLOCALIZED: Cyan Valve Handle", "block.create.dark_oak_window": "UNLOCALIZED: Dark Oak Window", "block.create.dark_oak_window_pane": "UNLOCALIZED: Dark Oak Window Pane", "block.create.dark_scoria": "UNLOCALIZED: Dark Scoria", @@ -162,7 +167,9 @@ "block.create.granite_cobblestone_wall": "UNLOCALIZED: Granite Cobblestone Wall", "block.create.granite_pillar": "UNLOCALIZED: Granite Pillar", "block.create.gray_seat": "UNLOCALIZED: Gray Seat", + "block.create.gray_valve_handle": "UNLOCALIZED: Gray Valve Handle", "block.create.green_seat": "UNLOCALIZED: Green Seat", + "block.create.green_valve_handle": "UNLOCALIZED: Green Valve Handle", "block.create.hand_crank": "UNLOCALIZED: Hand Crank", "block.create.horizontal_framed_glass": "UNLOCALIZED: Horizontal Framed Glass", "block.create.horizontal_framed_glass_pane": "UNLOCALIZED: Horizontal Framed Glass Pane", @@ -179,8 +186,11 @@ "block.create.layered_scoria": "UNLOCALIZED: Layered Scoria", "block.create.layered_weathered_limestone": "UNLOCALIZED: Layered Weathered Limestone", "block.create.light_blue_seat": "UNLOCALIZED: Light Blue Seat", + "block.create.light_blue_valve_handle": "UNLOCALIZED: Light Blue Valve Handle", "block.create.light_gray_seat": "UNLOCALIZED: Light Gray Seat", + "block.create.light_gray_valve_handle": "UNLOCALIZED: Light Gray Valve Handle", "block.create.lime_seat": "UNLOCALIZED: Lime Seat", + "block.create.lime_valve_handle": "UNLOCALIZED: Lime Valve Handle", "block.create.limesand": "Kalkzand", "block.create.limestone": "Kalksteen", "block.create.limestone_bricks": "Kalksteenstenen", @@ -194,6 +204,7 @@ "block.create.limestone_pillar": "Kalksteen Pillar", "block.create.linear_chassis": "Lineaar Frame", "block.create.magenta_seat": "UNLOCALIZED: Magenta Seat", + "block.create.magenta_valve_handle": "UNLOCALIZED: Magenta Valve Handle", "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", "block.create.mechanical_bearing": "Mechanische Lager", "block.create.mechanical_crafter": "Mechanische Werkbank", @@ -224,6 +235,7 @@ "block.create.oak_window": "UNLOCALIZED: Oak Window", "block.create.oak_window_pane": "UNLOCALIZED: Oak Window Pane", "block.create.orange_seat": "UNLOCALIZED: Orange Seat", + "block.create.orange_valve_handle": "UNLOCALIZED: Orange Valve Handle", "block.create.ornate_iron_window": "UNLOCALIZED: Ornate Iron Window", "block.create.ornate_iron_window_pane": "UNLOCALIZED: Ornate Iron Window Pane", "block.create.overgrown_andesite": "UNLOCALIZED: Overgrown Andesite", @@ -272,6 +284,7 @@ "block.create.paved_weathered_limestone_stairs": "UNLOCALIZED: Paved Weathered Limestone Stairs", "block.create.paved_weathered_limestone_wall": "UNLOCALIZED: Paved Weathered Limestone Wall", "block.create.pink_seat": "UNLOCALIZED: Pink Seat", + "block.create.pink_valve_handle": "UNLOCALIZED: Pink Valve Handle", "block.create.piston_extension_pole": "Zuiger Verlengpaal", "block.create.polished_dark_scoria": "UNLOCALIZED: Polished Dark Scoria", "block.create.polished_dark_scoria_slab": "UNLOCALIZED: Polished Dark Scoria Slab", @@ -303,8 +316,10 @@ "block.create.pulley_magnet": "UNLOCALIZED: Pulley Magnet", "block.create.pulse_repeater": "Pulse Versterker", "block.create.purple_seat": "UNLOCALIZED: Purple Seat", + "block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle", "block.create.radial_chassis": "Rotation Frame", "block.create.red_seat": "UNLOCALIZED: Red Seat", + "block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle", "block.create.redstone_contact": "Redstone redstone_contact", "block.create.redstone_link": "Redstone Brug", "block.create.refined_radiance_casing": "UNLOCALIZED: Radiant Casing", @@ -338,7 +353,6 @@ "block.create.tiled_glass": "Getegeld Glas", "block.create.tiled_glass_pane": "Getegeld Glazen Paneel", "block.create.turntable": "Draaischijf", - "block.create.valve_handle": "UNLOCALIZED: Valve Handle", "block.create.vertical_framed_glass": "UNLOCALIZED: Vertical Framed Glass", "block.create.vertical_framed_glass_pane": "UNLOCALIZED: Vertical Framed Glass Pane", "block.create.water_wheel": "Waterrad", @@ -353,7 +367,9 @@ "block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall", "block.create.weathered_limestone_pillar": "Verweerde Kalksteen Pilaar", "block.create.white_seat": "UNLOCALIZED: White Seat", + "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", + "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", "block.create.zinc_block": "UNLOCALIZED: Zinc Block", "block.create.zinc_ore": "UNLOCALIZED: Zinc Ore", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index a83331be0..cddf57c76 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 814", + "_": "Missing Localizations: 830", "_": "->------------------------] Game Elements [------------------------<-", @@ -28,14 +28,17 @@ "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.black_seat": "UNLOCALIZED: Black Seat", + "block.create.black_valve_handle": "UNLOCALIZED: Black Valve Handle", "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", + "block.create.blue_valve_handle": "UNLOCALIZED: Blue Valve Handle", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", "block.create.brass_block": "UNLOCALIZED: Brass Block", "block.create.brass_casing": "UNLOCALIZED: Brass Casing", "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", "block.create.brown_seat": "UNLOCALIZED: Brown Seat", + "block.create.brown_valve_handle": "UNLOCALIZED: Brown Valve Handle", "block.create.cart_assembler": "UNLOCALIZED: Cart Assembler", "block.create.chiseled_dark_scoria": "UNLOCALIZED: Chiseled Dark Scoria", "block.create.chiseled_dolomite": "UNLOCALIZED: Chiseled Dolomite", @@ -53,12 +56,14 @@ "block.create.copper_ore": "UNLOCALIZED: Copper Ore", "block.create.copper_shingles": "UNLOCALIZED: Copper Shingles", "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", + "block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle", "block.create.creative_crate": "Criativador Esquemaannon", "block.create.creative_motor": "UNLOCALIZED: Creative Motor", "block.create.crushing_wheel": "Roda de Moer", "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", "block.create.cuckoo_clock": "UNLOCALIZED: Cuckoo Clock", "block.create.cyan_seat": "UNLOCALIZED: Cyan Seat", + "block.create.cyan_valve_handle": "UNLOCALIZED: Cyan Valve Handle", "block.create.dark_oak_window": "UNLOCALIZED: Dark Oak Window", "block.create.dark_oak_window_pane": "UNLOCALIZED: Dark Oak Window Pane", "block.create.dark_scoria": "UNLOCALIZED: Dark Scoria", @@ -162,7 +167,9 @@ "block.create.granite_cobblestone_wall": "UNLOCALIZED: Granite Cobblestone Wall", "block.create.granite_pillar": "UNLOCALIZED: Granite Pillar", "block.create.gray_seat": "UNLOCALIZED: Gray Seat", + "block.create.gray_valve_handle": "UNLOCALIZED: Gray Valve Handle", "block.create.green_seat": "UNLOCALIZED: Green Seat", + "block.create.green_valve_handle": "UNLOCALIZED: Green Valve Handle", "block.create.hand_crank": "UNLOCALIZED: Hand Crank", "block.create.horizontal_framed_glass": "UNLOCALIZED: Horizontal Framed Glass", "block.create.horizontal_framed_glass_pane": "UNLOCALIZED: Horizontal Framed Glass Pane", @@ -179,8 +186,11 @@ "block.create.layered_scoria": "UNLOCALIZED: Layered Scoria", "block.create.layered_weathered_limestone": "UNLOCALIZED: Layered Weathered Limestone", "block.create.light_blue_seat": "UNLOCALIZED: Light Blue Seat", + "block.create.light_blue_valve_handle": "UNLOCALIZED: Light Blue Valve Handle", "block.create.light_gray_seat": "UNLOCALIZED: Light Gray Seat", + "block.create.light_gray_valve_handle": "UNLOCALIZED: Light Gray Valve Handle", "block.create.lime_seat": "UNLOCALIZED: Lime Seat", + "block.create.lime_valve_handle": "UNLOCALIZED: Lime Valve Handle", "block.create.limesand": "Areia Calcária", "block.create.limestone": "Calcário", "block.create.limestone_bricks": "Tijolos de Calcário", @@ -194,6 +204,7 @@ "block.create.limestone_pillar": "Pilar de Calcário", "block.create.linear_chassis": "Chassis de Translado", "block.create.magenta_seat": "UNLOCALIZED: Magenta Seat", + "block.create.magenta_valve_handle": "UNLOCALIZED: Magenta Valve Handle", "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", "block.create.mechanical_bearing": "Rolamento Mecânico", "block.create.mechanical_crafter": "UNLOCALIZED: Mechanical Crafter", @@ -224,6 +235,7 @@ "block.create.oak_window": "UNLOCALIZED: Oak Window", "block.create.oak_window_pane": "UNLOCALIZED: Oak Window Pane", "block.create.orange_seat": "UNLOCALIZED: Orange Seat", + "block.create.orange_valve_handle": "UNLOCALIZED: Orange Valve Handle", "block.create.ornate_iron_window": "UNLOCALIZED: Ornate Iron Window", "block.create.ornate_iron_window_pane": "UNLOCALIZED: Ornate Iron Window Pane", "block.create.overgrown_andesite": "UNLOCALIZED: Overgrown Andesite", @@ -272,6 +284,7 @@ "block.create.paved_weathered_limestone_stairs": "UNLOCALIZED: Paved Weathered Limestone Stairs", "block.create.paved_weathered_limestone_wall": "UNLOCALIZED: Paved Weathered Limestone Wall", "block.create.pink_seat": "UNLOCALIZED: Pink Seat", + "block.create.pink_valve_handle": "UNLOCALIZED: Pink Valve Handle", "block.create.piston_extension_pole": "Vara de Extensão do Pistão", "block.create.polished_dark_scoria": "UNLOCALIZED: Polished Dark Scoria", "block.create.polished_dark_scoria_slab": "UNLOCALIZED: Polished Dark Scoria Slab", @@ -303,8 +316,10 @@ "block.create.pulley_magnet": "UNLOCALIZED: Pulley Magnet", "block.create.pulse_repeater": "Repetidor de Pulso", "block.create.purple_seat": "UNLOCALIZED: Purple Seat", + "block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle", "block.create.radial_chassis": "Chassis de Rotação", "block.create.red_seat": "UNLOCALIZED: Red Seat", + "block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle", "block.create.redstone_contact": "Contato de Redstone", "block.create.redstone_link": "Conexão de Redstone", "block.create.refined_radiance_casing": "UNLOCALIZED: Radiant Casing", @@ -338,7 +353,6 @@ "block.create.tiled_glass": "Vidro Entalhado", "block.create.tiled_glass_pane": "Vidraça Entalhada", "block.create.turntable": "Mesa giratória", - "block.create.valve_handle": "UNLOCALIZED: Valve Handle", "block.create.vertical_framed_glass": "UNLOCALIZED: Vertical Framed Glass", "block.create.vertical_framed_glass_pane": "UNLOCALIZED: Vertical Framed Glass Pane", "block.create.water_wheel": "Roda de Água", @@ -353,7 +367,9 @@ "block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall", "block.create.weathered_limestone_pillar": "Pilar de Calcário Resistido", "block.create.white_seat": "UNLOCALIZED: White Seat", + "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", + "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", "block.create.zinc_block": "UNLOCALIZED: Zinc Block", "block.create.zinc_ore": "UNLOCALIZED: Zinc Ore", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index 6844d5fea..0aaaab8c0 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 808", + "_": "Missing Localizations: 824", "_": "->------------------------] Game Elements [------------------------<-", @@ -28,14 +28,17 @@ "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.black_seat": "UNLOCALIZED: Black Seat", + "block.create.black_valve_handle": "UNLOCALIZED: Black Valve Handle", "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", + "block.create.blue_valve_handle": "UNLOCALIZED: Blue Valve Handle", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", "block.create.brass_block": "UNLOCALIZED: Brass Block", "block.create.brass_casing": "UNLOCALIZED: Brass Casing", "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", "block.create.brown_seat": "UNLOCALIZED: Brown Seat", + "block.create.brown_valve_handle": "UNLOCALIZED: Brown Valve Handle", "block.create.cart_assembler": "UNLOCALIZED: Cart Assembler", "block.create.chiseled_dark_scoria": "UNLOCALIZED: Chiseled Dark Scoria", "block.create.chiseled_dolomite": "UNLOCALIZED: Chiseled Dolomite", @@ -53,12 +56,14 @@ "block.create.copper_ore": "UNLOCALIZED: Copper Ore", "block.create.copper_shingles": "UNLOCALIZED: Copper Shingles", "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", + "block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle", "block.create.creative_crate": "Креативный ящик", "block.create.creative_motor": "UNLOCALIZED: Creative Motor", "block.create.crushing_wheel": "Дробильное колесо", "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", "block.create.cuckoo_clock": "UNLOCALIZED: Cuckoo Clock", "block.create.cyan_seat": "UNLOCALIZED: Cyan Seat", + "block.create.cyan_valve_handle": "UNLOCALIZED: Cyan Valve Handle", "block.create.dark_oak_window": "UNLOCALIZED: Dark Oak Window", "block.create.dark_oak_window_pane": "UNLOCALIZED: Dark Oak Window Pane", "block.create.dark_scoria": "UNLOCALIZED: Dark Scoria", @@ -162,7 +167,9 @@ "block.create.granite_cobblestone_wall": "UNLOCALIZED: Granite Cobblestone Wall", "block.create.granite_pillar": "UNLOCALIZED: Granite Pillar", "block.create.gray_seat": "UNLOCALIZED: Gray Seat", + "block.create.gray_valve_handle": "UNLOCALIZED: Gray Valve Handle", "block.create.green_seat": "UNLOCALIZED: Green Seat", + "block.create.green_valve_handle": "UNLOCALIZED: Green Valve Handle", "block.create.hand_crank": "UNLOCALIZED: Hand Crank", "block.create.horizontal_framed_glass": "UNLOCALIZED: Horizontal Framed Glass", "block.create.horizontal_framed_glass_pane": "UNLOCALIZED: Horizontal Framed Glass Pane", @@ -179,8 +186,11 @@ "block.create.layered_scoria": "UNLOCALIZED: Layered Scoria", "block.create.layered_weathered_limestone": "UNLOCALIZED: Layered Weathered Limestone", "block.create.light_blue_seat": "UNLOCALIZED: Light Blue Seat", + "block.create.light_blue_valve_handle": "UNLOCALIZED: Light Blue Valve Handle", "block.create.light_gray_seat": "UNLOCALIZED: Light Gray Seat", + "block.create.light_gray_valve_handle": "UNLOCALIZED: Light Gray Valve Handle", "block.create.lime_seat": "UNLOCALIZED: Lime Seat", + "block.create.lime_valve_handle": "UNLOCALIZED: Lime Valve Handle", "block.create.limesand": "Известь", "block.create.limestone": "Известняк", "block.create.limestone_bricks": "Известковые кирпичи", @@ -194,6 +204,7 @@ "block.create.limestone_pillar": "Известняковая колонна", "block.create.linear_chassis": "Поступательная рама", "block.create.magenta_seat": "UNLOCALIZED: Magenta Seat", + "block.create.magenta_valve_handle": "UNLOCALIZED: Magenta Valve Handle", "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", "block.create.mechanical_bearing": "Механический подшипник", "block.create.mechanical_crafter": "UNLOCALIZED: Mechanical Crafter", @@ -224,6 +235,7 @@ "block.create.oak_window": "UNLOCALIZED: Oak Window", "block.create.oak_window_pane": "UNLOCALIZED: Oak Window Pane", "block.create.orange_seat": "UNLOCALIZED: Orange Seat", + "block.create.orange_valve_handle": "UNLOCALIZED: Orange Valve Handle", "block.create.ornate_iron_window": "UNLOCALIZED: Ornate Iron Window", "block.create.ornate_iron_window_pane": "UNLOCALIZED: Ornate Iron Window Pane", "block.create.overgrown_andesite": "UNLOCALIZED: Overgrown Andesite", @@ -272,6 +284,7 @@ "block.create.paved_weathered_limestone_stairs": "UNLOCALIZED: Paved Weathered Limestone Stairs", "block.create.paved_weathered_limestone_wall": "UNLOCALIZED: Paved Weathered Limestone Wall", "block.create.pink_seat": "UNLOCALIZED: Pink Seat", + "block.create.pink_valve_handle": "UNLOCALIZED: Pink Valve Handle", "block.create.piston_extension_pole": "Удлинитель поршня", "block.create.polished_dark_scoria": "UNLOCALIZED: Polished Dark Scoria", "block.create.polished_dark_scoria_slab": "UNLOCALIZED: Polished Dark Scoria Slab", @@ -303,8 +316,10 @@ "block.create.pulley_magnet": "UNLOCALIZED: Pulley Magnet", "block.create.pulse_repeater": "Повторитель импульса", "block.create.purple_seat": "UNLOCALIZED: Purple Seat", + "block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle", "block.create.radial_chassis": "Поворотная рама", "block.create.red_seat": "UNLOCALIZED: Red Seat", + "block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle", "block.create.redstone_contact": "Контактное соединение", "block.create.redstone_link": "Сигнальное соединение", "block.create.refined_radiance_casing": "UNLOCALIZED: Radiant Casing", @@ -338,7 +353,6 @@ "block.create.tiled_glass": "Плиточное стекло", "block.create.tiled_glass_pane": "Плиточная стеклянная панель", "block.create.turntable": "Поворотный стол", - "block.create.valve_handle": "UNLOCALIZED: Valve Handle", "block.create.vertical_framed_glass": "UNLOCALIZED: Vertical Framed Glass", "block.create.vertical_framed_glass_pane": "UNLOCALIZED: Vertical Framed Glass Pane", "block.create.water_wheel": "Водяное колесо", @@ -353,7 +367,9 @@ "block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall", "block.create.weathered_limestone_pillar": "Колонна из обветренного известняка", "block.create.white_seat": "UNLOCALIZED: White Seat", + "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", + "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", "block.create.zinc_block": "UNLOCALIZED: Zinc Block", "block.create.zinc_ore": "UNLOCALIZED: Zinc Ore", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index 863fb68e4..7d9492e23 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 95", + "_": "Missing Localizations: 111", "_": "->------------------------] Game Elements [------------------------<-", @@ -28,14 +28,17 @@ "block.create.birch_window": "白桦窗户", "block.create.birch_window_pane": "白桦窗户板", "block.create.black_seat": "UNLOCALIZED: Black Seat", + "block.create.black_valve_handle": "UNLOCALIZED: Black Valve Handle", "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", + "block.create.blue_valve_handle": "UNLOCALIZED: Blue Valve Handle", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", "block.create.brass_block": "黄铜块", "block.create.brass_casing": "黄铜机壳", "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", "block.create.brown_seat": "UNLOCALIZED: Brown Seat", + "block.create.brown_valve_handle": "UNLOCALIZED: Brown Valve Handle", "block.create.cart_assembler": "矿车装配站", "block.create.chiseled_dark_scoria": "錾制深色熔渣", "block.create.chiseled_dolomite": "錾制白云岩", @@ -53,12 +56,14 @@ "block.create.copper_ore": "铜矿石", "block.create.copper_shingles": "铜瓦", "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", + "block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle", "block.create.creative_crate": "创造板条箱", "block.create.creative_motor": "创造马达", "block.create.crushing_wheel": "粉碎轮", "block.create.crushing_wheel_controller": "粉碎轮控制器", "block.create.cuckoo_clock": "布谷鸟闹钟", "block.create.cyan_seat": "UNLOCALIZED: Cyan Seat", + "block.create.cyan_valve_handle": "UNLOCALIZED: Cyan Valve Handle", "block.create.dark_oak_window": "深色橡木窗户", "block.create.dark_oak_window_pane": "深色橡木窗户板", "block.create.dark_scoria": "深色熔渣", @@ -162,7 +167,9 @@ "block.create.granite_cobblestone_wall": "花岗岩圆石墙", "block.create.granite_pillar": "竖纹花岗岩", "block.create.gray_seat": "UNLOCALIZED: Gray Seat", + "block.create.gray_valve_handle": "UNLOCALIZED: Gray Valve Handle", "block.create.green_seat": "UNLOCALIZED: Green Seat", + "block.create.green_valve_handle": "UNLOCALIZED: Green Valve Handle", "block.create.hand_crank": "手摇曲柄", "block.create.horizontal_framed_glass": "竖直边框玻璃", "block.create.horizontal_framed_glass_pane": "竖直边框玻璃板", @@ -179,8 +186,11 @@ "block.create.layered_scoria": "层叠熔渣", "block.create.layered_weathered_limestone": "层叠风化石灰岩", "block.create.light_blue_seat": "UNLOCALIZED: Light Blue Seat", + "block.create.light_blue_valve_handle": "UNLOCALIZED: Light Blue Valve Handle", "block.create.light_gray_seat": "UNLOCALIZED: Light Gray Seat", + "block.create.light_gray_valve_handle": "UNLOCALIZED: Light Gray Valve Handle", "block.create.lime_seat": "UNLOCALIZED: Lime Seat", + "block.create.lime_valve_handle": "UNLOCALIZED: Lime Valve Handle", "block.create.limesand": "石灰沙", "block.create.limestone": "石灰岩", "block.create.limestone_bricks": "石灰岩砖", @@ -194,6 +204,7 @@ "block.create.limestone_pillar": "竖纹石灰岩", "block.create.linear_chassis": "机壳底盘", "block.create.magenta_seat": "UNLOCALIZED: Magenta Seat", + "block.create.magenta_valve_handle": "UNLOCALIZED: Magenta Valve Handle", "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", "block.create.mechanical_bearing": "动力轴承", "block.create.mechanical_crafter": "动力制造器", @@ -224,6 +235,7 @@ "block.create.oak_window": "橡木窗户", "block.create.oak_window_pane": "橡木窗户板", "block.create.orange_seat": "UNLOCALIZED: Orange Seat", + "block.create.orange_valve_handle": "UNLOCALIZED: Orange Valve Handle", "block.create.ornate_iron_window": "华丽铁窗户", "block.create.ornate_iron_window_pane": "华丽铁窗户板", "block.create.overgrown_andesite": "生草安山岩", @@ -272,6 +284,7 @@ "block.create.paved_weathered_limestone_stairs": "风化石灰岩铺路石楼梯", "block.create.paved_weathered_limestone_wall": "风化石灰岩铺路石墙", "block.create.pink_seat": "UNLOCALIZED: Pink Seat", + "block.create.pink_valve_handle": "UNLOCALIZED: Pink Valve Handle", "block.create.piston_extension_pole": "活塞杆", "block.create.polished_dark_scoria": "磨制深色熔渣", "block.create.polished_dark_scoria_slab": "磨制深色熔渣台阶", @@ -303,8 +316,10 @@ "block.create.pulley_magnet": "传送带磁铁", "block.create.pulse_repeater": "脉冲中继器", "block.create.purple_seat": "UNLOCALIZED: Purple Seat", + "block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle", "block.create.radial_chassis": "旋转底盘", "block.create.red_seat": "UNLOCALIZED: Red Seat", + "block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle", "block.create.redstone_contact": "信号检测器", "block.create.redstone_link": "无限红石信号终端", "block.create.refined_radiance_casing": "UNLOCALIZED: Radiant Casing", @@ -338,7 +353,6 @@ "block.create.tiled_glass": "十字玻璃窗", "block.create.tiled_glass_pane": "十字玻璃窗板", "block.create.turntable": "转盘", - "block.create.valve_handle": "UNLOCALIZED: Valve Handle", "block.create.vertical_framed_glass": "竖直边框玻璃", "block.create.vertical_framed_glass_pane": "竖直边框玻璃板", "block.create.water_wheel": "水车", @@ -353,7 +367,9 @@ "block.create.weathered_limestone_cobblestone_wall": "风化石灰岩圆石墙", "block.create.weathered_limestone_pillar": "竖纹风化石灰岩", "block.create.white_seat": "UNLOCALIZED: White Seat", + "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", + "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", "block.create.zinc_block": "锌块", "block.create.zinc_ore": "锌矿石", diff --git a/src/generated/resources/assets/create/models/block/black_seat.json b/src/generated/resources/assets/create/models/block/black_seat.json index c5e3b9429..cc46801aa 100644 --- a/src/generated/resources/assets/create/models/block/black_seat.json +++ b/src/generated/resources/assets/create/models/block/black_seat.json @@ -1,6 +1,7 @@ { "parent": "create:block/seat", "textures": { + "3": "create:block/valve_handle/valve_handle_black", "1": "create:block/seat/top_black", "2": "create:block/seat/side_black" } diff --git a/src/generated/resources/assets/create/models/block/black_valve_handle.json b/src/generated/resources/assets/create/models/block/black_valve_handle.json new file mode 100644 index 000000000..ab80a3b74 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/black_valve_handle.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/valve_handle", + "textures": { + "3": "create:block/valve_handle/valve_handle_black" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/blue_seat.json b/src/generated/resources/assets/create/models/block/blue_seat.json index 5b23c4325..bb33491ff 100644 --- a/src/generated/resources/assets/create/models/block/blue_seat.json +++ b/src/generated/resources/assets/create/models/block/blue_seat.json @@ -1,6 +1,7 @@ { "parent": "create:block/seat", "textures": { + "3": "create:block/valve_handle/valve_handle_blue", "1": "create:block/seat/top_blue", "2": "create:block/seat/side_blue" } diff --git a/src/generated/resources/assets/create/models/block/blue_valve_handle.json b/src/generated/resources/assets/create/models/block/blue_valve_handle.json new file mode 100644 index 000000000..fdd760222 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/blue_valve_handle.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/valve_handle", + "textures": { + "3": "create:block/valve_handle/valve_handle_blue" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brown_seat.json b/src/generated/resources/assets/create/models/block/brown_seat.json index 5734d07ff..f370cc960 100644 --- a/src/generated/resources/assets/create/models/block/brown_seat.json +++ b/src/generated/resources/assets/create/models/block/brown_seat.json @@ -1,6 +1,7 @@ { "parent": "create:block/seat", "textures": { + "3": "create:block/valve_handle/valve_handle_brown", "1": "create:block/seat/top_brown", "2": "create:block/seat/side_brown" } diff --git a/src/generated/resources/assets/create/models/block/brown_valve_handle.json b/src/generated/resources/assets/create/models/block/brown_valve_handle.json new file mode 100644 index 000000000..f3c7519cc --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brown_valve_handle.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/valve_handle", + "textures": { + "3": "create:block/valve_handle/valve_handle_brown" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/copper_valve_handle.json b/src/generated/resources/assets/create/models/block/copper_valve_handle.json new file mode 100644 index 000000000..c57f42889 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/copper_valve_handle.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/valve_handle", + "textures": { + "3": "create:block/valve_handle/valve_handle_copper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/cyan_seat.json b/src/generated/resources/assets/create/models/block/cyan_seat.json index a1b7657eb..7c6b716f3 100644 --- a/src/generated/resources/assets/create/models/block/cyan_seat.json +++ b/src/generated/resources/assets/create/models/block/cyan_seat.json @@ -1,6 +1,7 @@ { "parent": "create:block/seat", "textures": { + "3": "create:block/valve_handle/valve_handle_cyan", "1": "create:block/seat/top_cyan", "2": "create:block/seat/side_cyan" } diff --git a/src/generated/resources/assets/create/models/block/cyan_valve_handle.json b/src/generated/resources/assets/create/models/block/cyan_valve_handle.json new file mode 100644 index 000000000..b05a779c1 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/cyan_valve_handle.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/valve_handle", + "textures": { + "3": "create:block/valve_handle/valve_handle_cyan" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/gray_seat.json b/src/generated/resources/assets/create/models/block/gray_seat.json index bebf4b2a3..88531f731 100644 --- a/src/generated/resources/assets/create/models/block/gray_seat.json +++ b/src/generated/resources/assets/create/models/block/gray_seat.json @@ -1,6 +1,7 @@ { "parent": "create:block/seat", "textures": { + "3": "create:block/valve_handle/valve_handle_gray", "1": "create:block/seat/top_gray", "2": "create:block/seat/side_gray" } diff --git a/src/generated/resources/assets/create/models/block/gray_valve_handle.json b/src/generated/resources/assets/create/models/block/gray_valve_handle.json new file mode 100644 index 000000000..91dd5ef30 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/gray_valve_handle.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/valve_handle", + "textures": { + "3": "create:block/valve_handle/valve_handle_gray" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/green_seat.json b/src/generated/resources/assets/create/models/block/green_seat.json index ba27dc660..4928af689 100644 --- a/src/generated/resources/assets/create/models/block/green_seat.json +++ b/src/generated/resources/assets/create/models/block/green_seat.json @@ -1,6 +1,7 @@ { "parent": "create:block/seat", "textures": { + "3": "create:block/valve_handle/valve_handle_green", "1": "create:block/seat/top_green", "2": "create:block/seat/side_green" } diff --git a/src/generated/resources/assets/create/models/block/green_valve_handle.json b/src/generated/resources/assets/create/models/block/green_valve_handle.json new file mode 100644 index 000000000..6da85080d --- /dev/null +++ b/src/generated/resources/assets/create/models/block/green_valve_handle.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/valve_handle", + "textures": { + "3": "create:block/valve_handle/valve_handle_green" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/light_blue_seat.json b/src/generated/resources/assets/create/models/block/light_blue_seat.json index 9621c729c..de84d3296 100644 --- a/src/generated/resources/assets/create/models/block/light_blue_seat.json +++ b/src/generated/resources/assets/create/models/block/light_blue_seat.json @@ -1,6 +1,7 @@ { "parent": "create:block/seat", "textures": { + "3": "create:block/valve_handle/valve_handle_light_blue", "1": "create:block/seat/top_light_blue", "2": "create:block/seat/side_light_blue" } diff --git a/src/generated/resources/assets/create/models/block/light_blue_valve_handle.json b/src/generated/resources/assets/create/models/block/light_blue_valve_handle.json new file mode 100644 index 000000000..3362ca403 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/light_blue_valve_handle.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/valve_handle", + "textures": { + "3": "create:block/valve_handle/valve_handle_light_blue" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/light_gray_seat.json b/src/generated/resources/assets/create/models/block/light_gray_seat.json index fd48a9cc2..a7ccb4ea4 100644 --- a/src/generated/resources/assets/create/models/block/light_gray_seat.json +++ b/src/generated/resources/assets/create/models/block/light_gray_seat.json @@ -1,6 +1,7 @@ { "parent": "create:block/seat", "textures": { + "3": "create:block/valve_handle/valve_handle_light_gray", "1": "create:block/seat/top_light_gray", "2": "create:block/seat/side_light_gray" } diff --git a/src/generated/resources/assets/create/models/block/light_gray_valve_handle.json b/src/generated/resources/assets/create/models/block/light_gray_valve_handle.json new file mode 100644 index 000000000..ad69c973a --- /dev/null +++ b/src/generated/resources/assets/create/models/block/light_gray_valve_handle.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/valve_handle", + "textures": { + "3": "create:block/valve_handle/valve_handle_light_gray" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/lime_seat.json b/src/generated/resources/assets/create/models/block/lime_seat.json index d30c6df57..310d9e98f 100644 --- a/src/generated/resources/assets/create/models/block/lime_seat.json +++ b/src/generated/resources/assets/create/models/block/lime_seat.json @@ -1,6 +1,7 @@ { "parent": "create:block/seat", "textures": { + "3": "create:block/valve_handle/valve_handle_lime", "1": "create:block/seat/top_lime", "2": "create:block/seat/side_lime" } diff --git a/src/generated/resources/assets/create/models/block/lime_valve_handle.json b/src/generated/resources/assets/create/models/block/lime_valve_handle.json new file mode 100644 index 000000000..e00bd0ec8 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/lime_valve_handle.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/valve_handle", + "textures": { + "3": "create:block/valve_handle/valve_handle_lime" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/magenta_seat.json b/src/generated/resources/assets/create/models/block/magenta_seat.json index f6ab2380b..88bd3b160 100644 --- a/src/generated/resources/assets/create/models/block/magenta_seat.json +++ b/src/generated/resources/assets/create/models/block/magenta_seat.json @@ -1,6 +1,7 @@ { "parent": "create:block/seat", "textures": { + "3": "create:block/valve_handle/valve_handle_magenta", "1": "create:block/seat/top_magenta", "2": "create:block/seat/side_magenta" } diff --git a/src/generated/resources/assets/create/models/block/magenta_valve_handle.json b/src/generated/resources/assets/create/models/block/magenta_valve_handle.json new file mode 100644 index 000000000..44cc26395 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/magenta_valve_handle.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/valve_handle", + "textures": { + "3": "create:block/valve_handle/valve_handle_magenta" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/orange_seat.json b/src/generated/resources/assets/create/models/block/orange_seat.json index bc267cb18..53ab45ba4 100644 --- a/src/generated/resources/assets/create/models/block/orange_seat.json +++ b/src/generated/resources/assets/create/models/block/orange_seat.json @@ -1,6 +1,7 @@ { "parent": "create:block/seat", "textures": { + "3": "create:block/valve_handle/valve_handle_orange", "1": "create:block/seat/top_orange", "2": "create:block/seat/side_orange" } diff --git a/src/generated/resources/assets/create/models/block/orange_valve_handle.json b/src/generated/resources/assets/create/models/block/orange_valve_handle.json new file mode 100644 index 000000000..a06b206b2 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/orange_valve_handle.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/valve_handle", + "textures": { + "3": "create:block/valve_handle/valve_handle_orange" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/pink_seat.json b/src/generated/resources/assets/create/models/block/pink_seat.json index a6a9781aa..a17f52de9 100644 --- a/src/generated/resources/assets/create/models/block/pink_seat.json +++ b/src/generated/resources/assets/create/models/block/pink_seat.json @@ -1,6 +1,7 @@ { "parent": "create:block/seat", "textures": { + "3": "create:block/valve_handle/valve_handle_pink", "1": "create:block/seat/top_pink", "2": "create:block/seat/side_pink" } diff --git a/src/generated/resources/assets/create/models/block/pink_valve_handle.json b/src/generated/resources/assets/create/models/block/pink_valve_handle.json new file mode 100644 index 000000000..ddbd94eaa --- /dev/null +++ b/src/generated/resources/assets/create/models/block/pink_valve_handle.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/valve_handle", + "textures": { + "3": "create:block/valve_handle/valve_handle_pink" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/purple_seat.json b/src/generated/resources/assets/create/models/block/purple_seat.json index 1db18ce5e..9ab7a7fc0 100644 --- a/src/generated/resources/assets/create/models/block/purple_seat.json +++ b/src/generated/resources/assets/create/models/block/purple_seat.json @@ -1,6 +1,7 @@ { "parent": "create:block/seat", "textures": { + "3": "create:block/valve_handle/valve_handle_purple", "1": "create:block/seat/top_purple", "2": "create:block/seat/side_purple" } diff --git a/src/generated/resources/assets/create/models/block/purple_valve_handle.json b/src/generated/resources/assets/create/models/block/purple_valve_handle.json new file mode 100644 index 000000000..a2449a3bf --- /dev/null +++ b/src/generated/resources/assets/create/models/block/purple_valve_handle.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/valve_handle", + "textures": { + "3": "create:block/valve_handle/valve_handle_purple" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/red_seat.json b/src/generated/resources/assets/create/models/block/red_seat.json index 0d294e9f0..b0ef025c0 100644 --- a/src/generated/resources/assets/create/models/block/red_seat.json +++ b/src/generated/resources/assets/create/models/block/red_seat.json @@ -1,6 +1,7 @@ { "parent": "create:block/seat", "textures": { + "3": "create:block/valve_handle/valve_handle_red", "1": "create:block/seat/top_red", "2": "create:block/seat/side_red" } diff --git a/src/generated/resources/assets/create/models/block/red_valve_handle.json b/src/generated/resources/assets/create/models/block/red_valve_handle.json new file mode 100644 index 000000000..d4465688b --- /dev/null +++ b/src/generated/resources/assets/create/models/block/red_valve_handle.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/valve_handle", + "textures": { + "3": "create:block/valve_handle/valve_handle_red" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/white_seat.json b/src/generated/resources/assets/create/models/block/white_seat.json index c3b473e2a..a48f08c46 100644 --- a/src/generated/resources/assets/create/models/block/white_seat.json +++ b/src/generated/resources/assets/create/models/block/white_seat.json @@ -1,6 +1,7 @@ { "parent": "create:block/seat", "textures": { + "3": "create:block/valve_handle/valve_handle_white", "1": "create:block/seat/top_white", "2": "create:block/seat/side_white" } diff --git a/src/generated/resources/assets/create/models/block/white_valve_handle.json b/src/generated/resources/assets/create/models/block/white_valve_handle.json new file mode 100644 index 000000000..6c867367f --- /dev/null +++ b/src/generated/resources/assets/create/models/block/white_valve_handle.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/valve_handle", + "textures": { + "3": "create:block/valve_handle/valve_handle_white" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/yellow_seat.json b/src/generated/resources/assets/create/models/block/yellow_seat.json index 561829e5e..325602525 100644 --- a/src/generated/resources/assets/create/models/block/yellow_seat.json +++ b/src/generated/resources/assets/create/models/block/yellow_seat.json @@ -1,6 +1,7 @@ { "parent": "create:block/seat", "textures": { + "3": "create:block/valve_handle/valve_handle_yellow", "1": "create:block/seat/top_yellow", "2": "create:block/seat/side_yellow" } diff --git a/src/generated/resources/assets/create/models/block/yellow_valve_handle.json b/src/generated/resources/assets/create/models/block/yellow_valve_handle.json new file mode 100644 index 000000000..0b5c669fd --- /dev/null +++ b/src/generated/resources/assets/create/models/block/yellow_valve_handle.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/valve_handle", + "textures": { + "3": "create:block/valve_handle/valve_handle_yellow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/black_valve_handle.json b/src/generated/resources/assets/create/models/item/black_valve_handle.json new file mode 100644 index 000000000..7407f374e --- /dev/null +++ b/src/generated/resources/assets/create/models/item/black_valve_handle.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/black_valve_handle" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/blue_valve_handle.json b/src/generated/resources/assets/create/models/item/blue_valve_handle.json new file mode 100644 index 000000000..945f59227 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/blue_valve_handle.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/blue_valve_handle" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/brown_valve_handle.json b/src/generated/resources/assets/create/models/item/brown_valve_handle.json new file mode 100644 index 000000000..ae74f78c1 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/brown_valve_handle.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/brown_valve_handle" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/copper_valve_handle.json b/src/generated/resources/assets/create/models/item/copper_valve_handle.json new file mode 100644 index 000000000..45f592b30 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/copper_valve_handle.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/copper_valve_handle" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cyan_valve_handle.json b/src/generated/resources/assets/create/models/item/cyan_valve_handle.json new file mode 100644 index 000000000..90274434f --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cyan_valve_handle.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/cyan_valve_handle" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/gray_valve_handle.json b/src/generated/resources/assets/create/models/item/gray_valve_handle.json new file mode 100644 index 000000000..8b9d7dc23 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/gray_valve_handle.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/gray_valve_handle" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/green_valve_handle.json b/src/generated/resources/assets/create/models/item/green_valve_handle.json new file mode 100644 index 000000000..87f376e1d --- /dev/null +++ b/src/generated/resources/assets/create/models/item/green_valve_handle.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/green_valve_handle" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/light_blue_valve_handle.json b/src/generated/resources/assets/create/models/item/light_blue_valve_handle.json new file mode 100644 index 000000000..b9a68f054 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/light_blue_valve_handle.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/light_blue_valve_handle" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/light_gray_valve_handle.json b/src/generated/resources/assets/create/models/item/light_gray_valve_handle.json new file mode 100644 index 000000000..1b3bd3a5d --- /dev/null +++ b/src/generated/resources/assets/create/models/item/light_gray_valve_handle.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/light_gray_valve_handle" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/lime_valve_handle.json b/src/generated/resources/assets/create/models/item/lime_valve_handle.json new file mode 100644 index 000000000..98d457c68 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/lime_valve_handle.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/lime_valve_handle" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/magenta_valve_handle.json b/src/generated/resources/assets/create/models/item/magenta_valve_handle.json new file mode 100644 index 000000000..14b0c57d0 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/magenta_valve_handle.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/magenta_valve_handle" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/orange_valve_handle.json b/src/generated/resources/assets/create/models/item/orange_valve_handle.json new file mode 100644 index 000000000..e8d275537 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/orange_valve_handle.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/orange_valve_handle" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/pink_valve_handle.json b/src/generated/resources/assets/create/models/item/pink_valve_handle.json new file mode 100644 index 000000000..2b7db5fa0 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/pink_valve_handle.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/pink_valve_handle" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/purple_valve_handle.json b/src/generated/resources/assets/create/models/item/purple_valve_handle.json new file mode 100644 index 000000000..89f8cddd1 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/purple_valve_handle.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/purple_valve_handle" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/red_valve_handle.json b/src/generated/resources/assets/create/models/item/red_valve_handle.json new file mode 100644 index 000000000..1bbed3331 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/red_valve_handle.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/red_valve_handle" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/valve_handle.json b/src/generated/resources/assets/create/models/item/valve_handle.json deleted file mode 100644 index 716895f8c..000000000 --- a/src/generated/resources/assets/create/models/item/valve_handle.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "create:block/valve_handle" -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/white_valve_handle.json b/src/generated/resources/assets/create/models/item/white_valve_handle.json new file mode 100644 index 000000000..d81403c93 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/white_valve_handle.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/white_valve_handle" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/yellow_valve_handle.json b/src/generated/resources/assets/create/models/item/yellow_valve_handle.json new file mode 100644 index 000000000..eda359168 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/yellow_valve_handle.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/yellow_valve_handle" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/black_valve_handle.json b/src/generated/resources/data/create/loot_tables/blocks/black_valve_handle.json new file mode 100644 index 000000000..1861b0337 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/black_valve_handle.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:black_valve_handle" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/blue_valve_handle.json b/src/generated/resources/data/create/loot_tables/blocks/blue_valve_handle.json new file mode 100644 index 000000000..c8a0e64d9 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/blue_valve_handle.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:blue_valve_handle" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/brown_valve_handle.json b/src/generated/resources/data/create/loot_tables/blocks/brown_valve_handle.json new file mode 100644 index 000000000..2b3845dcb --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/brown_valve_handle.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:brown_valve_handle" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/copper_valve_handle.json b/src/generated/resources/data/create/loot_tables/blocks/copper_valve_handle.json new file mode 100644 index 000000000..86d70bc02 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/copper_valve_handle.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:copper_valve_handle" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/cyan_valve_handle.json b/src/generated/resources/data/create/loot_tables/blocks/cyan_valve_handle.json new file mode 100644 index 000000000..08650e062 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/cyan_valve_handle.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:cyan_valve_handle" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/gray_valve_handle.json b/src/generated/resources/data/create/loot_tables/blocks/gray_valve_handle.json new file mode 100644 index 000000000..db996c7d2 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/gray_valve_handle.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:gray_valve_handle" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/green_valve_handle.json b/src/generated/resources/data/create/loot_tables/blocks/green_valve_handle.json new file mode 100644 index 000000000..3138cc7e0 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/green_valve_handle.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:green_valve_handle" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/light_blue_valve_handle.json b/src/generated/resources/data/create/loot_tables/blocks/light_blue_valve_handle.json new file mode 100644 index 000000000..6d3005ae2 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/light_blue_valve_handle.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:light_blue_valve_handle" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/light_gray_valve_handle.json b/src/generated/resources/data/create/loot_tables/blocks/light_gray_valve_handle.json new file mode 100644 index 000000000..92a453917 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/light_gray_valve_handle.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:light_gray_valve_handle" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/lime_valve_handle.json b/src/generated/resources/data/create/loot_tables/blocks/lime_valve_handle.json new file mode 100644 index 000000000..b0f193da4 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/lime_valve_handle.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:lime_valve_handle" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/magenta_valve_handle.json b/src/generated/resources/data/create/loot_tables/blocks/magenta_valve_handle.json new file mode 100644 index 000000000..33188b6b5 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/magenta_valve_handle.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:magenta_valve_handle" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/orange_valve_handle.json b/src/generated/resources/data/create/loot_tables/blocks/orange_valve_handle.json new file mode 100644 index 000000000..537e63db0 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/orange_valve_handle.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:orange_valve_handle" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/pink_valve_handle.json b/src/generated/resources/data/create/loot_tables/blocks/pink_valve_handle.json new file mode 100644 index 000000000..f73647fdb --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/pink_valve_handle.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:pink_valve_handle" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/purple_valve_handle.json b/src/generated/resources/data/create/loot_tables/blocks/purple_valve_handle.json new file mode 100644 index 000000000..e6d6e7ca9 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/purple_valve_handle.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:purple_valve_handle" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/valve_handle.json b/src/generated/resources/data/create/loot_tables/blocks/red_valve_handle.json similarity index 85% rename from src/generated/resources/data/create/loot_tables/blocks/valve_handle.json rename to src/generated/resources/data/create/loot_tables/blocks/red_valve_handle.json index 940044950..d4090bf79 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/valve_handle.json +++ b/src/generated/resources/data/create/loot_tables/blocks/red_valve_handle.json @@ -6,7 +6,7 @@ "entries": [ { "type": "minecraft:item", - "name": "create:valve_handle" + "name": "create:red_valve_handle" } ], "conditions": [ diff --git a/src/generated/resources/data/create/loot_tables/blocks/white_valve_handle.json b/src/generated/resources/data/create/loot_tables/blocks/white_valve_handle.json new file mode 100644 index 000000000..dcb5f3a1f --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/white_valve_handle.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:white_valve_handle" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/yellow_valve_handle.json b/src/generated/resources/data/create/loot_tables/blocks/yellow_valve_handle.json new file mode 100644 index 000000000..0359a3354 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/yellow_valve_handle.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:yellow_valve_handle" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/tags/blocks/brittle.json b/src/generated/resources/data/create/tags/blocks/brittle.json index a639c5622..dba3575c4 100644 --- a/src/generated/resources/data/create/tags/blocks/brittle.json +++ b/src/generated/resources/data/create/tags/blocks/brittle.json @@ -3,7 +3,23 @@ "values": [ "create:nozzle", "create:hand_crank", - "create: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", + "create:copper_valve_handle", "create:rope", "create:pulley_magnet", "create:furnace_engine", diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 7a253cb0d..c90ae2de4 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -28,7 +28,7 @@ import com.simibubi.create.content.contraptions.components.clock.CuckooClockBloc 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.HandCrankBlock; -import com.simibubi.create.content.contraptions.components.crank.ValveHandleBlock; +import com.simibubi.create.content.contraptions.components.crank.AllValveHandles; 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; @@ -505,13 +505,9 @@ public class AllBlocks { .transform(customItemModel()) .register(); - public static final BlockEntry VALVE_HANDLE = REGISTRATE.block("valve_handle", ValveHandleBlock::new) - .initialProperties(SharedProperties::softMetal) - .blockstate(BlockStateGen.directionalBlockProvider(false)) - .transform(StressConfigDefaults.setCapacity(32.0)) - .tag(AllBlockTags.BRITTLE.tag) - .simpleItem() - .register(); + static { + AllValveHandles.register(REGISTRATE); + } public static final BlockEntry FLUID_TANK = REGISTRATE.block("fluid_tank", FluidTankBlock::new) .initialProperties(SharedProperties::softMetal) diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 77ae674b0..3c64fc2f4 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -11,6 +11,7 @@ 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; @@ -184,7 +185,8 @@ public class AllTileEntities { public static final TileEntityEntry HAND_CRANK = Create.registrate() .tileEntity("hand_crank", HandCrankTileEntity::new) - .validBlocks(AllBlocks.HAND_CRANK, AllBlocks.VALVE_HANDLE) + .validBlocks(AllBlocks.HAND_CRANK) + .validBlocks(AllValveHandles.variants) .renderer(() -> HandCrankRenderer::new) .register(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/AllValveHandles.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/AllValveHandles.java new file mode 100644 index 000000000..a6faae88f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/AllValveHandles.java @@ -0,0 +1,36 @@ +package com.simibubi.create.content.contraptions.components.crank; + +import com.simibubi.create.AllTags; +import com.simibubi.create.foundation.config.StressConfigDefaults; +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; + +import java.util.ArrayList; +import java.util.List; + +public class AllValveHandles { + private static final List 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)))) + .transform(StressConfigDefaults.setCapacity(32.0)) + .tag(AllTags.AllBlockTags.BRITTLE.tag) + .simpleItem() + .register(); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/ValveHandleBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/ValveHandleBlock.java index aaabde21b..e93a929eb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/ValveHandleBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/ValveHandleBlock.java @@ -3,7 +3,11 @@ package com.simibubi.create.content.contraptions.components.crank; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllShapes; +import mcp.MethodsReturnNonnullByDefault; import net.minecraft.block.BlockState; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemStack; +import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; @@ -11,10 +15,22 @@ import net.minecraft.world.IBlockReader; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -public class ValveHandleBlock extends HandCrankBlock { +import javax.annotation.ParametersAreNonnullByDefault; - public ValveHandleBlock(Properties properties) { +@ParametersAreNonnullByDefault +public class ValveHandleBlock extends HandCrankBlock { + private final boolean inCreativeTab; + + public ValveHandleBlock(Properties properties, boolean inCreativeTab) { super(properties); + this.inCreativeTab = inCreativeTab; + } + + @Override + public void fillItemGroup(ItemGroup group, NonNullList p_149666_2_) { + if (group != ItemGroup.SEARCH && !inCreativeTab) + return; + super.fillItemGroup(group, p_149666_2_); } @Override diff --git a/src/main/resources/assets/create/models/block/valve_handle.json b/src/main/resources/assets/create/models/block/valve_handle.json index f0397083c..c5b9b3258 100644 --- a/src/main/resources/assets/create/models/block/valve_handle.json +++ b/src/main/resources/assets/create/models/block/valve_handle.json @@ -2,174 +2,291 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "2": "create:block/fluid_valve", - "particle": "create:block/oxidized/copper_block_0" + "particle": "create:block/oxidized/copper_block_0", + "3": "create:block/valve_handle/valve_handle_copper" }, "elements": [ { - "name": "BranchNorth", - "from": [7, 1.5, 10], - "to": [9, 3.5, 14], - "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 2.5, 10.5]}, + "name": "WheelMid", + "from": [5.5, 0, 5.5], + "to": [10.5, 4, 10.5], + "rotation": {"angle": 0, "axis": "y", "origin": [14, -7, 14]}, "faces": { - "east": {"uv": [8.5, 6, 10.5, 7], "texture": "#2"}, - "west": {"uv": [8.5, 6, 10.5, 7], "rotation": 180, "texture": "#2"}, - "up": {"uv": [8.5, 6, 10.5, 7], "rotation": 270, "texture": "#2"}, - "down": {"uv": [8.5, 6, 10.5, 7], "rotation": 90, "texture": "#2"} + "north": {"uv": [0, 5, 5, 9], "texture": "#3"}, + "east": {"uv": [0, 5, 5, 9], "texture": "#3"}, + "south": {"uv": [0, 5, 5, 9], "texture": "#3"}, + "west": {"uv": [0, 5, 5, 9], "texture": "#3"}, + "up": {"uv": [0, 0, 5, 5], "rotation": 180, "texture": "#3"}, + "down": {"uv": [0, 0, 5, 5], "texture": "#3"} } }, { - "name": "WheelSouth", - "from": [5, 2, 1], - "to": [11, 5, 3], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 5, 8]}, + "name": "Nubbin", + "from": [6.5, 4, 6.5], + "to": [9.5, 5, 9.5], + "rotation": {"angle": 0, "axis": "y", "origin": [15.5, 11.5, 15.5]}, "faces": { - "north": {"uv": [0, 13, 3, 14.5], "rotation": 180, "texture": "#2"}, - "east": {"uv": [3, 12, 4.5, 13], "rotation": 270, "texture": "#2"}, - "south": {"uv": [0, 14.5, 3, 16], "texture": "#2"}, - "west": {"uv": [3, 12, 4.5, 13], "rotation": 90, "texture": "#2"}, - "up": {"uv": [0, 12, 3, 13], "texture": "#2"}, - "down": {"uv": [0, 12, 3, 13], "rotation": 180, "texture": "#2"} + "north": {"uv": [1, 1, 4, 2], "texture": "#3"}, + "east": {"uv": [1, 3, 4, 4], "rotation": 180, "texture": "#3"}, + "south": {"uv": [1, 3, 4, 4], "texture": "#3"}, + "west": {"uv": [1, 1, 2, 4], "rotation": 90, "texture": "#3"}, + "up": {"uv": [1, 1, 4, 4], "texture": "#3"} } }, { - "name": "WheelSouthWest", - "from": [9, 2.1, 1], - "to": [11, 4.9, 6.65685], - "rotation": {"angle": 45, "axis": "y", "origin": [11, 3, 1]}, + "name": "BranchNorthTop", + "from": [6.5, 2.8888, 12.3314], + "to": [9.5, 5.8888, 14.3314], + "rotation": {"angle": -45, "axis": "x", "origin": [7.14142, 4.75147, 12.11726]}, "faces": { - "east": {"uv": [0, 13, 3, 14.5], "texture": "#2"}, - "west": {"uv": [0, 14.5, 3, 16], "rotation": 180, "texture": "#2"}, - "up": {"uv": [0, 12, 3, 13], "rotation": 90, "texture": "#2"}, - "down": {"uv": [0, 12, 3, 13], "rotation": 90, "texture": "#2"} + "north": {"uv": [4, 8, 5, 9], "texture": "#3"}, + "east": {"uv": [1, 6, 4, 8], "rotation": 90, "texture": "#3"}, + "south": {"uv": [0, 0, 0, 0], "texture": "#3"}, + "west": {"uv": [1, 6, 4, 8], "rotation": 270, "texture": "#3"}, + "up": {"uv": [1, 6, 4, 8], "texture": "#3"}, + "down": {"uv": [1, 6, 4, 8], "rotation": 180, "texture": "#3"} } }, { - "name": "WheelWest", - "from": [13, 2, 5], - "to": [15, 5, 11], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 5, 8]}, + "name": "BranchNorthMid", + "from": [7, 3.3888, 9.3314], + "to": [9, 5.3888, 12.3314], + "rotation": {"angle": -45, "axis": "x", "origin": [7.14142, 4.75147, 12.11726]}, "faces": { - "north": {"uv": [3, 12, 4.5, 13], "rotation": 90, "texture": "#2"}, - "east": {"uv": [0, 13, 3, 14.5], "rotation": 180, "texture": "#2"}, - "south": {"uv": [3, 12, 4.5, 13], "rotation": 270, "texture": "#2"}, - "west": {"uv": [0, 14.5, 3, 16], "texture": "#2"}, - "up": {"uv": [0, 12, 3, 13], "rotation": 90, "texture": "#2"}, - "down": {"uv": [0, 12, 3, 13], "rotation": 90, "texture": "#2"} + "east": {"uv": [5, 8, 8, 10], "texture": "#3"}, + "west": {"uv": [5, 8, 8, 10], "rotation": 180, "texture": "#3"}, + "up": {"uv": [5, 8, 8, 10], "rotation": 270, "texture": "#3"}, + "down": {"uv": [5, 8, 8, 10], "rotation": 90, "texture": "#3"} } }, { - "name": "WheelNorthWest", - "from": [13, 2.1, 11], - "to": [15, 4.9, 16.65685], - "rotation": {"angle": -45, "axis": "y", "origin": [15, 5, 11]}, + "name": "BranchNorthBottom", + "from": [6.5, 2.8888, 7.3314], + "to": [9.5, 5.8888, 9.3314], + "rotation": {"angle": -45, "axis": "x", "origin": [7.14142, 4.75147, 12.11726]}, "faces": { - "east": {"uv": [0, 13, 3, 14.5], "rotation": 180, "texture": "#2"}, - "west": {"uv": [0, 14.5, 3, 16], "texture": "#2"}, - "up": {"uv": [0, 12, 3, 13], "rotation": 90, "texture": "#2"}, - "down": {"uv": [0, 12, 3, 13], "rotation": 90, "texture": "#2"} + "east": {"uv": [1, 6, 4, 8], "rotation": 270, "texture": "#3"}, + "south": {"uv": [4, 8, 5, 9], "texture": "#3"}, + "west": {"uv": [1, 6, 4, 8], "rotation": 90, "texture": "#3"}, + "down": {"uv": [1, 6, 4, 8], "texture": "#3"} } }, { "name": "WheelNorth", - "from": [5, 2, 13], - "to": [11, 5, 15], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 5, 20]}, + "from": [5, 5, 12.8], + "to": [11, 8, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [7.14142, 4.75147, 12.11726]}, "faces": { - "north": {"uv": [0, 14.5, 3, 16], "rotation": 180, "texture": "#2"}, - "east": {"uv": [3, 12, 4.5, 13], "rotation": 270, "texture": "#2"}, - "south": {"uv": [0, 13, 3, 14.5], "texture": "#2"}, - "west": {"uv": [3, 12, 4.5, 13], "rotation": 180, "texture": "#2"}, - "up": {"uv": [0, 12, 3, 13], "rotation": 180, "texture": "#2"}, - "down": {"uv": [0, 12, 3, 13], "texture": "#2"} + "north": {"uv": [5, 5, 11, 8], "rotation": 180, "texture": "#3"}, + "east": {"uv": [9, 4, 10, 5], "rotation": 270, "texture": "#3"}, + "south": {"uv": [5, 2, 11, 5], "texture": "#3"}, + "west": {"uv": [9, 4, 10, 5], "rotation": 180, "texture": "#3"}, + "up": {"uv": [5, 0, 11, 2], "rotation": 180, "texture": "#3"}, + "down": {"uv": [5, 0, 11, 2], "texture": "#3"} + } + }, + { + "name": "WheelNorthEast", + "from": [3.5888, 5.1, 6.9846], + "to": [5.5888, 7.9, 12.64145], + "rotation": {"angle": 45, "axis": "y", "origin": [7.14142, 4.75147, 12.11726]}, + "faces": { + "east": {"uv": [5, 5, 11, 8], "rotation": 180, "texture": "#3"}, + "west": {"uv": [5, 2, 11, 5], "texture": "#3"}, + "up": {"uv": [5, 0, 11, 2], "rotation": 270, "texture": "#3"}, + "down": {"uv": [5, 0, 11, 2], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "BranchEastTop", + "from": [1, 5, 6.5], + "to": [3, 8, 9.5], + "rotation": {"angle": -45, "axis": "z", "origin": [1, 5, 8]}, + "faces": { + "north": {"uv": [1, 6, 4, 8], "rotation": 270, "texture": "#3"}, + "east": {"uv": [4, 8, 5, 9], "texture": "#3"}, + "south": {"uv": [1, 6, 4, 8], "rotation": 90, "texture": "#3"}, + "west": {"uv": [0, 0, 0, 0], "texture": "#3"}, + "up": {"uv": [1, 6, 4, 8], "rotation": 90, "texture": "#3"}, + "down": {"uv": [1, 6, 4, 8], "rotation": 90, "texture": "#3"} + } + }, + { + "name": "BranchEastMid", + "from": [3, 5.5, 7], + "to": [6, 7.5, 9], + "rotation": {"angle": -45, "axis": "z", "origin": [1, 5, 8]}, + "faces": { + "north": {"uv": [5, 8, 8, 10], "rotation": 180, "texture": "#3"}, + "south": {"uv": [5, 8, 8, 10], "texture": "#3"}, + "up": {"uv": [5, 8, 8, 10], "texture": "#3"}, + "down": {"uv": [5, 8, 8, 10], "texture": "#3"} + } + }, + { + "name": "BranchEastBottom", + "from": [6, 5, 6.5], + "to": [8, 8, 9.5], + "rotation": {"angle": -45, "axis": "z", "origin": [1, 5, 8]}, + "faces": { + "north": {"uv": [1, 6, 4, 8], "rotation": 90, "texture": "#3"}, + "south": {"uv": [1, 6, 4, 8], "rotation": 270, "texture": "#3"}, + "west": {"uv": [4, 8, 5, 9], "texture": "#3"}, + "down": {"uv": [1, 6, 4, 8], "rotation": 270, "texture": "#3"} } }, { "name": "WheelEast", - "from": [1, 2, 5], - "to": [3, 5, 11], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 5, 8]}, + "from": [5, 5, 1], + "to": [11, 8, 3.2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 6.5, 1.9]}, "faces": { - "north": {"uv": [3, 12, 4.5, 13], "rotation": 90, "texture": "#2"}, - "east": {"uv": [0, 14.5, 3, 16], "rotation": 180, "texture": "#2"}, - "south": {"uv": [3, 12, 4.5, 13], "rotation": 270, "texture": "#2"}, - "west": {"uv": [0, 13, 3, 14.5], "texture": "#2"}, - "up": {"uv": [0, 12, 3, 13], "rotation": 270, "texture": "#2"}, - "down": {"uv": [0, 12, 3, 13], "rotation": 270, "texture": "#2"} + "north": {"uv": [5, 2, 11, 5], "texture": "#3"}, + "east": {"uv": [9, 4, 10, 5], "rotation": 180, "texture": "#3"}, + "south": {"uv": [5, 5, 11, 8], "rotation": 180, "texture": "#3"}, + "west": {"uv": [9, 4, 10, 5], "rotation": 270, "texture": "#3"}, + "up": {"uv": [5, 0, 11, 2], "texture": "#3"}, + "down": {"uv": [5, 0, 11, 2], "rotation": 180, "texture": "#3"} } }, { "name": "WheelSouthEast", - "from": [5, 2.1, 1], - "to": [7, 4.9, 6.65685], - "rotation": {"angle": -45, "axis": "y", "origin": [5, 3, 1]}, + "from": [3.5888, 5.1, 3.35855], + "to": [5.5888, 7.9, 9.0154], + "rotation": {"angle": -45, "axis": "y", "origin": [7.14142, 4.75147, 3.88274]}, "faces": { - "east": {"uv": [0, 14.5, 3, 16], "rotation": 180, "texture": "#2"}, - "west": {"uv": [0, 13, 3, 14.5], "texture": "#2"}, - "up": {"uv": [0, 12, 3, 13], "rotation": 270, "texture": "#2"}, - "down": {"uv": [0, 12, 3, 13], "rotation": 270, "texture": "#2"} + "east": {"uv": [11, 5, 5, 8], "rotation": 180, "texture": "#3"}, + "west": {"uv": [11, 2, 5, 5], "texture": "#3"}, + "up": {"uv": [11, 0, 5, 2], "rotation": 270, "texture": "#3"}, + "down": {"uv": [11, 0, 5, 2], "rotation": 270, "texture": "#3"} } }, { - "name": "WhealNorthEast", - "from": [1, 2.1, 11], - "to": [3, 4.9, 16.65685], - "rotation": {"angle": 45, "axis": "y", "origin": [1, 3, 11]}, + "name": "BranchSouthTop", + "from": [6.5, 2.8888, 1.6686], + "to": [9.5, 5.8888, 3.6686], + "rotation": {"angle": 45, "axis": "x", "origin": [7.14142, 4.75147, 3.88274]}, "faces": { - "east": {"uv": [0, 14.5, 3, 16], "rotation": 180, "texture": "#2"}, - "west": {"uv": [0, 13, 3, 14.5], "texture": "#2"}, - "up": {"uv": [0, 12, 3, 13], "rotation": 270, "texture": "#2"}, - "down": {"uv": [0, 12, 3, 13], "rotation": 270, "texture": "#2"} + "north": {"uv": [0, 0, 0, 0], "texture": "#3"}, + "east": {"uv": [1, 8, 4, 6], "rotation": 90, "texture": "#3"}, + "south": {"uv": [5, 8, 4, 9], "texture": "#3"}, + "west": {"uv": [1, 8, 4, 6], "rotation": 270, "texture": "#3"}, + "up": {"uv": [1, 8, 4, 6], "texture": "#3"}, + "down": {"uv": [1, 8, 4, 6], "rotation": 180, "texture": "#3"} } }, { - "name": "WheelMid", - "from": [5.5, 0, 5.5], - "to": [10.5, 5, 10.5], - "rotation": {"angle": 0, "axis": "x", "origin": [14, -7, 14]}, + "name": "BranchSouthMid", + "from": [7, 3.3888, 3.6686], + "to": [9, 5.3888, 6.6686], + "rotation": {"angle": 45, "axis": "x", "origin": [7.14142, 4.75147, 3.88274]}, "faces": { - "north": {"uv": [6, 6, 8.5, 8.5], "rotation": 180, "texture": "#2"}, - "east": {"uv": [6, 6, 8.5, 8.5], "rotation": 270, "texture": "#2"}, - "south": {"uv": [6, 6, 8.5, 8.5], "texture": "#2"}, - "west": {"uv": [6, 6, 8.5, 8.5], "rotation": 90, "texture": "#2"}, - "up": {"uv": [6, 6, 8.5, 8.5], "rotation": 180, "texture": "#2"}, - "down": {"uv": [6, 6, 8.5, 8.5], "texture": "#2"} + "east": {"uv": [8, 8, 5, 10], "texture": "#3"}, + "west": {"uv": [8, 8, 5, 10], "rotation": 180, "texture": "#3"}, + "up": {"uv": [8, 8, 5, 10], "rotation": 270, "texture": "#3"}, + "down": {"uv": [8, 8, 5, 10], "rotation": 90, "texture": "#3"} } }, { - "name": "BranchWest", - "from": [10, 1.5, 7], - "to": [14, 3.5, 9], - "rotation": {"angle": 22.5, "axis": "z", "origin": [10.5, 2.5, 8]}, + "name": "BranchSouthBottom", + "from": [6.5, 2.8888, 6.6686], + "to": [9.5, 5.8888, 8.6686], + "rotation": {"angle": 45, "axis": "x", "origin": [7.14142, 4.75147, 3.88274]}, "faces": { - "north": {"uv": [8.5, 6, 10.5, 7], "rotation": 180, "texture": "#2"}, - "south": {"uv": [8.5, 6, 10.5, 7], "texture": "#2"}, - "up": {"uv": [8.5, 6, 10.5, 7], "rotation": 180, "texture": "#2"}, - "down": {"uv": [8.5, 6, 10.5, 7], "texture": "#2"} + "north": {"uv": [5, 8, 4, 9], "texture": "#3"}, + "east": {"uv": [1, 8, 4, 6], "rotation": 270, "texture": "#3"}, + "west": {"uv": [1, 8, 4, 6], "rotation": 90, "texture": "#3"}, + "down": {"uv": [1, 8, 4, 6], "texture": "#3"} } }, { - "name": "BranchEast", - "from": [2, 1.5, 7], - "to": [6, 3.5, 9], - "rotation": {"angle": -22.5, "axis": "z", "origin": [5.5, 2.5, 8.5]}, + "name": "WheelSouth", + "from": [1, 5, 5], + "to": [3.2, 8, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 6.5, 7.9]}, "faces": { - "north": {"uv": [8.5, 6, 10.5, 7], "rotation": 180, "texture": "#2"}, - "south": {"uv": [8.5, 6, 10.5, 7], "texture": "#2"}, - "up": {"uv": [8.5, 6, 10.5, 7], "rotation": 180, "texture": "#2"}, - "down": {"uv": [8.5, 6, 10.5, 7], "texture": "#2"} + "north": {"uv": [9, 4, 10, 5], "rotation": 180, "texture": "#3"}, + "east": {"uv": [5, 5, 11, 8], "rotation": 180, "texture": "#3"}, + "south": {"uv": [9, 4, 10, 5], "rotation": 270, "texture": "#3"}, + "west": {"uv": [5, 2, 11, 5], "texture": "#3"}, + "up": {"uv": [5, 0, 11, 2], "rotation": 270, "texture": "#3"}, + "down": {"uv": [5, 0, 11, 2], "rotation": 270, "texture": "#3"} } }, { - "name": "BranchSouth", - "from": [7, 1.5, 2], - "to": [9, 3.5, 6], - "rotation": {"angle": 22.5, "axis": "x", "origin": [8, 2.5, 5.5]}, + "name": "WheelSouthWest", + "from": [10.4112, 5.1, 3.35855], + "to": [12.4112, 7.9, 9.0154], + "rotation": {"angle": 45, "axis": "y", "origin": [8.85858, 4.75147, 3.88274]}, "faces": { - "east": {"uv": [8.5, 6, 10.5, 7], "texture": "#2"}, - "west": {"uv": [8.5, 6, 10.5, 7], "rotation": 180, "texture": "#2"}, - "up": {"uv": [8.5, 6, 10.5, 7], "rotation": 270, "texture": "#2"}, - "down": {"uv": [8.5, 6, 10.5, 7], "rotation": 90, "texture": "#2"} + "east": {"uv": [5, 2, 11, 5], "texture": "#3"}, + "west": {"uv": [5, 5, 11, 8], "rotation": 180, "texture": "#3"}, + "up": {"uv": [11, 2, 5, 0], "rotation": 270, "texture": "#3"}, + "down": {"uv": [11, 2, 5, 0], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "BranchWestBottom", + "from": [8, 5, 6.5], + "to": [10, 8, 9.5], + "rotation": {"angle": 45, "axis": "z", "origin": [15, 5, 8]}, + "faces": { + "north": {"uv": [1, 8, 4, 6], "rotation": 90, "texture": "#3"}, + "east": {"uv": [5, 8, 4, 9], "texture": "#3"}, + "south": {"uv": [1, 8, 4, 6], "rotation": 270, "texture": "#3"}, + "down": {"uv": [1, 8, 4, 6], "rotation": 270, "texture": "#3"} + } + }, + { + "name": "BranchWestMid", + "from": [10, 5.5, 7], + "to": [13, 7.5, 9], + "rotation": {"angle": 45, "axis": "z", "origin": [15, 5, 8]}, + "faces": { + "north": {"uv": [8, 8, 5, 10], "rotation": 180, "texture": "#3"}, + "south": {"uv": [8, 8, 5, 10], "texture": "#3"}, + "up": {"uv": [8, 8, 5, 10], "texture": "#3"}, + "down": {"uv": [8, 8, 5, 10], "texture": "#3"} + } + }, + { + "name": "BranchWestTop", + "from": [13, 5, 6.5], + "to": [15, 8, 9.5], + "rotation": {"angle": 45, "axis": "z", "origin": [15, 5, 8]}, + "faces": { + "north": {"uv": [1, 8, 4, 6], "rotation": 270, "texture": "#3"}, + "east": {"uv": [0, 0, 0, 0], "texture": "#3"}, + "south": {"uv": [1, 8, 4, 6], "rotation": 90, "texture": "#3"}, + "west": {"uv": [5, 8, 4, 9], "texture": "#3"}, + "up": {"uv": [1, 8, 4, 6], "rotation": 90, "texture": "#3"}, + "down": {"uv": [1, 8, 4, 6], "rotation": 90, "texture": "#3"} + } + }, + { + "name": "WheelWest", + "from": [12.8, 5, 5], + "to": [15, 8, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 8, 8]}, + "faces": { + "north": {"uv": [9, 4, 10, 5], "rotation": 270, "texture": "#3"}, + "east": {"uv": [5, 2, 11, 5], "texture": "#3"}, + "south": {"uv": [9, 4, 10, 5], "rotation": 180, "texture": "#3"}, + "west": {"uv": [5, 5, 11, 8], "rotation": 180, "texture": "#3"}, + "up": {"uv": [5, 0, 11, 2], "rotation": 90, "texture": "#3"}, + "down": {"uv": [5, 0, 11, 2], "rotation": 90, "texture": "#3"} + } + }, + { + "name": "WheelNorthWest", + "from": [10.4112, 5.1, 6.9846], + "to": [12.4112, 7.9, 12.64145], + "rotation": {"angle": -45, "axis": "y", "origin": [8.85858, 4.75147, 12.11726]}, + "faces": { + "east": {"uv": [11, 2, 5, 5], "texture": "#3"}, + "west": {"uv": [11, 5, 5, 8], "rotation": 180, "texture": "#3"}, + "up": {"uv": [5, 2, 11, 0], "rotation": 270, "texture": "#3"}, + "down": {"uv": [5, 2, 11, 0], "rotation": 270, "texture": "#3"} } } ], @@ -213,10 +330,36 @@ } }, "groups": [ + { + "name": "Hub", + "origin": [8, 5.5, -2.5], + "children": [0, 1] + }, { "name": "Wheel", "origin": [8, 5.5, -2.5], - "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] + "children": [ + { + "name": "North", + "origin": [1, 3, 11], + "children": [2, 3, 4, 5, 6] + }, + { + "name": "East", + "origin": [1, 3, 11], + "children": [7, 8, 9, 10, 11] + }, + { + "name": "South", + "origin": [1, 3, 11], + "children": [12, 13, 14, 15, 16] + }, + { + "name": "West", + "origin": [1, 3, 11], + "children": [17, 18, 19, 20, 21] + } + ] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/valve_handle/valve_handle_black.png b/src/main/resources/assets/create/textures/block/valve_handle/valve_handle_black.png new file mode 100644 index 0000000000000000000000000000000000000000..7a458d0a60bc484b34a3ee5e3d9e627822592164 GIT binary patch literal 354 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/valve_handle/valve_handle_gray.png b/src/main/resources/assets/create/textures/block/valve_handle/valve_handle_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..fc540caabaaebb5d1f9f82512d77e6a143dea303 GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=De8Ak0{?)V>TT$X?><>&pIwi;>qv>hD}pJ)qDJPZ!4!i_>o>Z1g*9AmZvDpnThL z(ZZ>V8a^rObg*)MTJZT=nx0Xzsu&YSid)xiW@AqCj z`gDtX>5C^ljv80z&o2L7zFm;nwU3jo2ak|>u13jy1 zluvW7+T?is^jy9shS>EdJ|&%QoVs7S)n|ecL&37Y5mSBl`x=)$aN>KTFnep;nTT$X?><>&pIwi;>ryMQ49?A5iGFr;B5V#p$;b4E>Hc2(YaFes0#8 zn@j&RHMEGt9d@o@)PKOJ(s7?bN%?k;Y6T1qtM_Lyvry==W}$L@_zCOais zm+gA9_n!TEe)qScO$=X|&v7cgP;6CXV+d(E-MO79!K7ZTWW`h-XTh#59tX@0RGK`` zTChHPcGRiRhHk-Cvu|(PQ`hW!AV|-RU9lzUfa+hb%~eMigrm>8z#KoR#$q ae;76?CyBqDWIY||O$JX_KbLh*2~7Zf&V{A` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/valve_handle/valve_handle_light_blue.png b/src/main/resources/assets/create/textures/block/valve_handle/valve_handle_light_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..ec7020d83ea935a18f0a466c8a4535d9e38c1634 GIT binary patch literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=De8Ak0{?)V>TT$X?><>&pIwi;>rY^XfF|KR}^ho-U3d7N_3^*!mqd5c$_M?`ez5 zDYwm+y-ON88@Uy}CY|At-E~=y$0ufCGT#Iv!J}a^SC8_nyS!v&`zr1GNk3oieXl=b z|61OoGJH|n7R)HmuisWt$yLC#Xh!oSfxvkSHMJQWrlc=WVe!^E=(pv9(?gjPvR96Z zy)0?k6_9a?E2^$vrh;?UCMT=8JTh-ws$*X5loZU!6o2hhnsx2q24>woEQfQVw3d7? zpSwvc>%lXhPQ{ps>om#*p3dA_*YWJ_g86}`#j>*bWfpdKvirBpKO5MXXIXcB{ezyw z`Wd?S?V08`ACNGXva>(OlYHfG`26_kf-z0fF`e~H5BM8ylr!%=n6M2P3JjjEelF{r G5}E)>=a7>C literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/valve_handle/valve_handle_light_gray.png b/src/main/resources/assets/create/textures/block/valve_handle/valve_handle_light_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..9b2bfcae00f2528493d25873c5234472974301e7 GIT binary patch literal 367 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=De8Ak0{?)V>TT$X?><>&pIwi;>radFHph?|?#oJY5_^EKa|jVC#3-L7>%M`F)@8 z^W%pmy?1gxJ9Cl7@rMinfdPS+E*3GUsCaMmZAy=wp|tVf#$J(&pJrXP%iLG_dC%FZ z;BJoI5K+O*`}6N*?fqmiQC}%S+F-8!4RK3`hdG`i++{)x5A3|PLff7&`#k5~_R>0V z&Vx&n?z*=v`^&Ppp?0G1QBU>8t@owZ@*0$}EI6K_r+Yhh0&kfCPeJPOfbb$o^%i3T zrI1x~P5uhyIs`AVKBQGH!LeAiOlZUHw8ssXr9-DKvfwdsxEe3CLi^$8&oe5?QeqeSk3Oza2uzswJ~w?E83)X62j9T*M_p00i_ I>zopr08IXpKmY&$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/valve_handle/valve_handle_lime.png b/src/main/resources/assets/create/textures/block/valve_handle/valve_handle_lime.png new file mode 100644 index 0000000000000000000000000000000000000000..dcb6992a10f6d57517de774023a87e87dbaf3c6a GIT binary patch literal 1572 zcmV+<2HW|GP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-_ZlI$o9{O1&N1cVTR%rocA+kKc#+4VSYq8ZR0{3c=#?$tRZ~M7yuullAL<9_%GN>CHXhpknmA zA45O(8G8Acp#JE~v)*Vue&TU-c|Hz#Ms^U6T|AE1Z9Sc5lg_;CAC`0eqq;RLWe>eR zdj%Lx;E$bgorx{(Zbsq#&r^px@_`YtUozv)tY2eiZt(@YTYACH=A-9lD2xrqAiQ97 z^dw(nw-9<^?TY*~fHkRoydJR|EsoLm>aq_&DwwmVYbi^DA>j19rUf*`Um)vh2`yrY z6^u2oSXNIxDL|v)loL0@5j<6}#!$OE z7g}-CidQKjawAwef-}O5PtAO#{3q>pG{!7lA{%e4ke8b^jWi~6^A0NzLgQd63*Xhu zL*3X1Vi^p|f;nP=*_Q312z}HRFP<58V!g3@Ymm0%01zRzAQ@sXU<0vGAgj(P5pay) zCnIym-W4!FBCe4c;D$MXoakn3%u!mlPTW@GXaNzzffdvw&LGQsLH($YsG%$@-iSyL zl_*Ja;NXLV5H!p)Dl4m3(V(hPljg|LM~NY7j4{QWTw)wyl0s6GVoE7z1kG@rF+0N| z=i&+%U!;VhC6-ijMfp@;rG~0C)>LzIjT^Rq3r$UnEw$XKqm;Vu(nHrCd+K?h)&>th zWQ3t3jx_Sk+F|vXHF{z0d)DZ%HW~BFPCr^4^Ei>o85nb(z_?BZP|$92W+Qp; zCUcWBn;bTUIIu=C$!Rnh1B1SklR-CkAIyErn-TxFcysTVGn2aif;ls(JIsCN?F-gg zUT+j$1kGJIF||B!u$AG3@SaQouS&lkusA?ErTN0yz25@X{AhJ)&9nOZNm_iH1JWz? zYGoPO-J47J=uw+(=NLPFlCq1yZ=P*#i3M*eU)z>(JjM)rg9$RBmL1orC&ZpcwKf2K zrBknDMYaczcV1bsC8JIZAl>0h)ofpJdF?fxxt$Y!MfY5nn#sZKq2^J%4`j*^k4;L~3E~G6+EX_*TtkhcF zGM=9}&wbgMdF<1-keWA`>M0mWonFv*DwP`)^MuM9HYw^cgtvdEz!x0S*HuK(lwm0003SNkl!f*YuiA{TVF62~sQD`!oCV}gu}h?Z$qJNkNm=6lzV zH}yby>{ZyBf%4k-(7V05`yOm02g+ll1oKd`+E##LHk6FDV4?*8sd220<2Olwc_@hz z%VMgC5=)#{yr$g*y@1uWVlh=s0+@rIWTFM{O|{+|jFf0Q7Iw!+@s%L6 zWm};a;7mZAYvRTb%8=f_p?#li<2^hry*_|f*IoMM#d+=fvi&cgUycJDBf%f_4}ec{ W4Si+ zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-_ZlIu1M{O2ih1Ogzq9Eajkl^f*vX)cn-vi&BR z%2(={Wf6iv07N$^nfBM8-TZ+cTW5{a5PkCA;^&e}oFPQJerqP!jqAR#r|_gV*8_%1 zFw462ZQEz)^|2thtv{aiCY0?bZbzr*?NCN!hOq78b|k#?wC_#Y>$3Z@o&E2H=VLwA zqx-!JC`MKI6E@t0#Nx^$imZPgI$V(tj7Z#+-PHT{wKJD^E8ZpDYG?D-%X2A=_1nPT zYP9vF?`tsay~f_#+Ff=YmGWk9>fFkdV2E-$naeyzz+WMUITA+1 z77GxoK=Z&Th7vI<+sRR-Or6@C3l*g3xN*SDTv(U~g`$i}Ny$cqQ3k;Xu7Tww)3sPCHUtnVD= z3vcWfUD#s7-Ebm=EO;GglY0Am=se=IU{I>>x|VI z7C9e$$l(q>{1J|Lq$3y5r?{fUmr!C!C0DLe(f-xfU}~(X=0*)vYOZPXEwtED%N<y$V z$vGa#4a{s}G=(xyBOTyW8i)Zw*NC;#h1~(uzgY zYM444ww=pqxMyQ;3LB!#h*~*RM>(yi9LuqiBWzozHL~Qj59dr=I(sGzF4yG}RBAO&~bS8(^-PBbY6B<@V&4X-e+3wU9sIC8&czX@*gq1 zAhrI26m779$zSaT{PxU>-DUGebuN4JNNO{Sip@*Ya%b~>?y0pmna$_sT^rb%R+Z9& zR(%Qbpw+HeT+7V}6!_5uKP?z)w7ZJZMg2#|wH1}F%pP34N|vU^fMyqK4qdD%Ih5lQ z_7?}5U0s9^$?l55s)a#GtB@XV+SQ&2wkiF>)K~VKi~f(ix~{x%2$uL=UR~<+U?%(J zY^Rv+wcRC5$pu|Gz>z|u1fw)b6jN?00Fv{VR5V8P4&WWuJAP9L zkVG--JR_Yiuz5zgtymZ11e1VrQ<2UW2MNr;(I|~>(~JPN_B)q6>)qH^;~mr!72Hub z=N;+nf&?(4vECh|83D9tx<%U7rGw6*7$cgZtv0!XVMkkgitn%X?)J5S*}Xmn1_S&e-F0000< KMNUMnLSTY)Nz)hr literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/valve_handle/valve_handle_orange.png b/src/main/resources/assets/create/textures/block/valve_handle/valve_handle_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..31fc651acb03418a3f58828d160e75da2419de36 GIT binary patch literal 372 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=De8Ak0{?)V>TT$X?><>&pIwi;>ri)oF26Bm)B@qo<2wh{fr*6ZZNYHV|p`|KK0+ z$YW-}gc}^y;bQk%r$4Z*;AC^#X6K|Xc8n+I>;Zw3WueyF&RkG2@ob*3t7w|G{Qci| zlila{uXZr%i;Ihz(8K@r#_q~{E;BkN^)z#}?eIv<;$`UQX4!Ja(Yj%>m|x@^AzPj$ z7ebr2oO!s4ZP~p<_1Te4t_>?qFB!?JerWn@!pT-tBFDJL#-%vaILCPM+Wl$;t7Ikp zwtBoPTHxWp+8$gsC5>%C)58BJEb?)w|2%e*ZA%cVm(Unea4F2?A$)!==6 zvm?vV$$Om6NL;w7pZ_{Tu;BME!`)Z-zaQKrRv#$hbii`gftkP98SdY6&f75ANaZsy Pd>A}k{an^LB{Ts5ek79m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/valve_handle/valve_handle_pink.png b/src/main/resources/assets/create/textures/block/valve_handle/valve_handle_pink.png new file mode 100644 index 0000000000000000000000000000000000000000..7d43bcf141d3b65b868e5a3a68960d56e27c0672 GIT binary patch literal 373 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=De8Ak0{?)V>TT$X?><>&pIwi;>qt_Po#eMg|5(CQlc~5R21qCm8x2b`Wr#KheG7 z`a~UZmXo|Y-K4U#);S+H+`%BUsI9AssgPC5>avTHV#Kr$7MH}9ZFqBJW30=TKWSzA zx8(nqfB*E?KB4T4CtFEje zY$)Sd?o~34!B9vlCa~-hkIuzQI-5KnclpLXHE~m8{57+e`J1(s?#1=*zwNPh*Isk~ zdh}t5ynA_;Vwrn)x2xy#JO~ZFYOH_m`P7d4_vGit^E1mVQvSE1p5YIZ^v$9Z4jmJM QfdRze>FVdQ&MBb@01`NpDgXcg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/valve_handle/valve_handle_purple.png b/src/main/resources/assets/create/textures/block/valve_handle/valve_handle_purple.png new file mode 100644 index 0000000000000000000000000000000000000000..b047c80fc342a8f65e5eb20508995664120f6325 GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=De8Ak0{?)V>TT$X?><>&pIwi;>ro^GvVSUZBu@PZ!4!i_>o>EaW?6Akg-IVywrl z2{R3Mrt~)|ddy>QcK%?nhoMVVLq@7GdJ~IrmReMB;F((`$X*PFx>*iY{&xUFXSA}u&dsn=+GWbc!F*^7M991J> zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1bvvg9ZX{O1&N1cX?`aabef27UZV7Q0-o>Z;ch zU5;mCArNGyWS(lj{_W}?{0xa#)&=p=dySusHkyQn==EDq(sthWi#{4pc6D|bm>5r9 zufA>n1iO0-2zJ}^vt5O<=aD_pG4q~~M`VM>_LDskn`Ni{uHqh->}5OquNO1BU0z-H zcN+jkb(oKhGL4Bf?q)>c^_PYXcdQ3a#EiC^cgyZQcIs^2z&l$v>~z|8euhG6za9Jy zqirYm9=nOqjkP24QwP`y`ue+K*Q@m2*6xz^K+3DVsbed%1xLVXc@Fcq0{$G@VO|lJ zV2cHeRj`?H6-AK@knLotQld_6J_{8r(VAugp2ifz()W}H7L|Q0U$zbhs6+s0quz$dD6j{ zKm;5G{3NX0ur(PBkaMPz>fnaigB&p+zQ&nlMrj$T!JY%CiJU-|wGR3TR-mEe z*jeSA^Da1X(IwB`dgr|le$=QGIN0EV4C#*8H}9tHyt zv>BXfA#2TGZg8ffK~gva*2oQVDh#(Y4^Unso z8>7BP^s||CwK-Tv)YG&e+cjuUo`=y1)=wrrgfZFo}V_)hNX1QC(T_Vs_!9X(SUDii3g2UFIRm& z)qA(kgWvV4Z-d?p-Z}sfw$AMs9GcWUq1KjA4Ja+IV5mizAXo|3+QC6ybS>MZ|6qNinu^u|Us_Y{AGjy8alq(W&_}MGpp_}lzS?0EE3AOP8;w7hO zDf>q8vHGhn%vuPdLrTNy1}+b==#{h=s6SSwmr8fpC#IX_@sb;Hrgp}ufA zSu-A=kQIiD--zS1cIT=tryOqTd-IURaDiRjX%U{%6lI~|*~r(i9#x0Hc{fE;i`Bo}SgvmczRg{XnL z*ShlfG#_bEZ8xQdx|ggU)fnHMz4W~{u-1J$2nzZSv41?(9aWpwtePu7Q-ouPKQi(} zu%x{(B`0cF`2poi{rUFnQSC8Bs^o<(4)k$XH2ucZQ$7GJmw@V9By%!;eAO+#$}IJz z?CkLGS9A3M-G5hTI?KyqQvFERKS(@vPu5E=m^Q^{ky5KJLhi4ov9DEX$G(1?vmK|% zsQv>OVkaPw6bu;v000JJOGiWi{{a60|De66lK=n!32;bRa{vG?BLDy{BLR4&KXw2B z00(qQO+^Rf3IPo@F2yp?+5i9np-DtRR5;6hkugggK^TUgotcfd#cZRM0m~Q&*CzxM z5Q5rRXlE@3@()s^&OZnQtcA1|5(}GHB!qM!L@k9(Au4#2W6j>pPKw#v+uJ?;ns52$ znSI~yo#M!o&2zHwiDdbz~sFJF28;UfT77Z(%fQ&-qpUm?{gJ=?4L-u~fK0kyfdJdya` t{voMO0a|_P5BmL#dg8!@@~Gcc{{g|e&D706c^?1(002ovPDHLkV1o5Yk-Go@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/valve_handle/valve_handle_white.png b/src/main/resources/assets/create/textures/block/valve_handle/valve_handle_white.png new file mode 100644 index 0000000000000000000000000000000000000000..35431ecdd2ed146d9512b76f133a4d6e899a986b GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=De8Ak0{?)V>TT$X?><>&pIwi;>q@ZSLm(c|f5Lo-U3d7N_4%Pz*j|AkZ2=v+PED zc0g{Lfd>y;qvPl62R`WkU|ayStnq>QojIpMCR&*3b;KQx)fY97n0NE!xo2;`Z~OJ9 z!doP1k{fI5&b;q>dh4~$gamUaUX*HnV9T(;luefNQ;Nxje3#HEA^!4g&o4xFAGBn7 z-_7#(X5~$VivDxAWSMT>(opf3#%a>m++18K&BYQZ&hhN#BCTKd7TwM1TV-uh&E}M3 z^(1B4>|3)gf1L0y`)0ztz{N@|^D~Qd5-bl{t*PTzYij>(Eo1Kc&em>kh&M~9SLXW4 v>f*VxmYsY5{QCF9JbV`g|E;KJe!za@LUGzAW&=i`-x)kz{an^LB{Ts52_%dJ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/valve_handle/valve_handle_yellow.png b/src/main/resources/assets/create/textures/block/valve_handle/valve_handle_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..38528ef648fd2860fb3d650a5f01bd1cbff3d8d5 GIT binary patch literal 1467 zcmV;s1w{IZP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-|ajw3e={nsgS1aZ-J9IZfZkmKiRaoKIVyD`)G z2{0wN#9~n-^&UmrrvLNzFn{4<8>~?mqEFsiT$(g-h7j$(_DojS{XE#4@Ih~`7YvnP zmi_4avCq)E`+}fHUq0$hsK-w{j&7chLz$5o!m*3Tk?_{jc{b^+%lfdL^BI-bYghKG z=VuK7qdE8!Hr$28;?6UQ>`$IL+>sBANOZ}JyNZ90ow>v(@Gj{IJDZPQK0;xvKL-8@ zqoXJH9=nCm6Kl7~{FG6!kJlr1qs1}$-d$D?q`Wzsx@~1iFa(?`YnjIg_&CU6jf4@g z#R|q6*en>;P$CAhgOnO&8r0WZsUk(?&H*!XWm&o?ffHBR6kyQcAW52$2sSEM6R7#h zg;w0O;#G=>+z6ITa7I}1GR!;W?~KdQ7_)SVY`m~SUOa0WX-wwk9abQO#=+DreAh4! zEZGNQ1q`|cbHoO-E!#zLbgwO0JPYicRb%(jpwNy3K!n&1$&i2n>q#7WvVl1e0mle_ zGBRgTE?|J1<3?tH8xaq3BG1@Z6KL78F~k^C%!!krg}LNYFe#>#az@Y$*BPrb zEOIVfq-b%)mr!C!C0CSB)#|FRp~jkOZrr5d_&48zX|bi2J9U&&*Y3LSp~s$j9;me; zLx&rFgb_y?`C{#``jItyV(x3!=&&{!(`6U#tU(>Z%>~VN;wEQcjFrH6m<*txd2(hW zsq$oQa%L0bP&fu_Jr0y{H%G(>( zT3+8MvIv@|aAIm@pt1GtW9FDg6zRpLzMgDF^I3wu&G88B!RFGLHw)h_=wpkcRO#*| z21oNz(T}vU%MXr9Qb+1U083aRzMLLH7E_ki&UQHk(pqcUd-W)%r9zw9LM%-4&8ni7 zmeLInT8D|p)_yWmwa4E2(3DO-A`uaf(}q$pZKpAN_Rdp-znmNa;bq%Vil4kQ^JQwI z-Loven&g9{u#@pXO8d!6A7X|Ln(g6W6h-Y8?3v9?uJl z_#4xb`4`QayULjs7p?#R00v@9M??Vs0RI60puMM)00009a7bBm001r{001r{0eGc9 zb^rhX2XskIMF->x0S*E$AawpA0002$Nkl1C2bbLwMR|Np|^ZC87Y*RS^6cKHh&Yc2QSfjjYU02i@& VO6b`wGlu{G002ovPDHLkV1f+%xbFY} literal 0 HcmV?d00001 From fd9dd5feae682288dd173ff372db39106146f785 Mon Sep 17 00:00:00 2001 From: grimmauld Date: Thu, 1 Oct 2020 23:27:33 +0200 Subject: [PATCH 11/12] apparently i messed with seats? remove unnecessary texture key in seat model json files --- .../resources/assets/create/models/block/black_seat.json | 1 - .../resources/assets/create/models/block/blue_seat.json | 1 - .../resources/assets/create/models/block/brown_seat.json | 1 - .../resources/assets/create/models/block/cyan_seat.json | 1 - .../resources/assets/create/models/block/gray_seat.json | 1 - .../resources/assets/create/models/block/green_seat.json | 1 - .../resources/assets/create/models/block/light_blue_seat.json | 1 - .../resources/assets/create/models/block/light_gray_seat.json | 1 - .../resources/assets/create/models/block/lime_seat.json | 1 - .../resources/assets/create/models/block/magenta_seat.json | 1 - .../resources/assets/create/models/block/orange_seat.json | 1 - .../resources/assets/create/models/block/pink_seat.json | 1 - .../resources/assets/create/models/block/purple_seat.json | 1 - src/generated/resources/assets/create/models/block/red_seat.json | 1 - .../resources/assets/create/models/block/white_seat.json | 1 - .../resources/assets/create/models/block/yellow_seat.json | 1 - 16 files changed, 16 deletions(-) diff --git a/src/generated/resources/assets/create/models/block/black_seat.json b/src/generated/resources/assets/create/models/block/black_seat.json index cc46801aa..c5e3b9429 100644 --- a/src/generated/resources/assets/create/models/block/black_seat.json +++ b/src/generated/resources/assets/create/models/block/black_seat.json @@ -1,7 +1,6 @@ { "parent": "create:block/seat", "textures": { - "3": "create:block/valve_handle/valve_handle_black", "1": "create:block/seat/top_black", "2": "create:block/seat/side_black" } diff --git a/src/generated/resources/assets/create/models/block/blue_seat.json b/src/generated/resources/assets/create/models/block/blue_seat.json index bb33491ff..5b23c4325 100644 --- a/src/generated/resources/assets/create/models/block/blue_seat.json +++ b/src/generated/resources/assets/create/models/block/blue_seat.json @@ -1,7 +1,6 @@ { "parent": "create:block/seat", "textures": { - "3": "create:block/valve_handle/valve_handle_blue", "1": "create:block/seat/top_blue", "2": "create:block/seat/side_blue" } diff --git a/src/generated/resources/assets/create/models/block/brown_seat.json b/src/generated/resources/assets/create/models/block/brown_seat.json index f370cc960..5734d07ff 100644 --- a/src/generated/resources/assets/create/models/block/brown_seat.json +++ b/src/generated/resources/assets/create/models/block/brown_seat.json @@ -1,7 +1,6 @@ { "parent": "create:block/seat", "textures": { - "3": "create:block/valve_handle/valve_handle_brown", "1": "create:block/seat/top_brown", "2": "create:block/seat/side_brown" } diff --git a/src/generated/resources/assets/create/models/block/cyan_seat.json b/src/generated/resources/assets/create/models/block/cyan_seat.json index 7c6b716f3..a1b7657eb 100644 --- a/src/generated/resources/assets/create/models/block/cyan_seat.json +++ b/src/generated/resources/assets/create/models/block/cyan_seat.json @@ -1,7 +1,6 @@ { "parent": "create:block/seat", "textures": { - "3": "create:block/valve_handle/valve_handle_cyan", "1": "create:block/seat/top_cyan", "2": "create:block/seat/side_cyan" } diff --git a/src/generated/resources/assets/create/models/block/gray_seat.json b/src/generated/resources/assets/create/models/block/gray_seat.json index 88531f731..bebf4b2a3 100644 --- a/src/generated/resources/assets/create/models/block/gray_seat.json +++ b/src/generated/resources/assets/create/models/block/gray_seat.json @@ -1,7 +1,6 @@ { "parent": "create:block/seat", "textures": { - "3": "create:block/valve_handle/valve_handle_gray", "1": "create:block/seat/top_gray", "2": "create:block/seat/side_gray" } diff --git a/src/generated/resources/assets/create/models/block/green_seat.json b/src/generated/resources/assets/create/models/block/green_seat.json index 4928af689..ba27dc660 100644 --- a/src/generated/resources/assets/create/models/block/green_seat.json +++ b/src/generated/resources/assets/create/models/block/green_seat.json @@ -1,7 +1,6 @@ { "parent": "create:block/seat", "textures": { - "3": "create:block/valve_handle/valve_handle_green", "1": "create:block/seat/top_green", "2": "create:block/seat/side_green" } diff --git a/src/generated/resources/assets/create/models/block/light_blue_seat.json b/src/generated/resources/assets/create/models/block/light_blue_seat.json index de84d3296..9621c729c 100644 --- a/src/generated/resources/assets/create/models/block/light_blue_seat.json +++ b/src/generated/resources/assets/create/models/block/light_blue_seat.json @@ -1,7 +1,6 @@ { "parent": "create:block/seat", "textures": { - "3": "create:block/valve_handle/valve_handle_light_blue", "1": "create:block/seat/top_light_blue", "2": "create:block/seat/side_light_blue" } diff --git a/src/generated/resources/assets/create/models/block/light_gray_seat.json b/src/generated/resources/assets/create/models/block/light_gray_seat.json index a7ccb4ea4..fd48a9cc2 100644 --- a/src/generated/resources/assets/create/models/block/light_gray_seat.json +++ b/src/generated/resources/assets/create/models/block/light_gray_seat.json @@ -1,7 +1,6 @@ { "parent": "create:block/seat", "textures": { - "3": "create:block/valve_handle/valve_handle_light_gray", "1": "create:block/seat/top_light_gray", "2": "create:block/seat/side_light_gray" } diff --git a/src/generated/resources/assets/create/models/block/lime_seat.json b/src/generated/resources/assets/create/models/block/lime_seat.json index 310d9e98f..d30c6df57 100644 --- a/src/generated/resources/assets/create/models/block/lime_seat.json +++ b/src/generated/resources/assets/create/models/block/lime_seat.json @@ -1,7 +1,6 @@ { "parent": "create:block/seat", "textures": { - "3": "create:block/valve_handle/valve_handle_lime", "1": "create:block/seat/top_lime", "2": "create:block/seat/side_lime" } diff --git a/src/generated/resources/assets/create/models/block/magenta_seat.json b/src/generated/resources/assets/create/models/block/magenta_seat.json index 88bd3b160..f6ab2380b 100644 --- a/src/generated/resources/assets/create/models/block/magenta_seat.json +++ b/src/generated/resources/assets/create/models/block/magenta_seat.json @@ -1,7 +1,6 @@ { "parent": "create:block/seat", "textures": { - "3": "create:block/valve_handle/valve_handle_magenta", "1": "create:block/seat/top_magenta", "2": "create:block/seat/side_magenta" } diff --git a/src/generated/resources/assets/create/models/block/orange_seat.json b/src/generated/resources/assets/create/models/block/orange_seat.json index 53ab45ba4..bc267cb18 100644 --- a/src/generated/resources/assets/create/models/block/orange_seat.json +++ b/src/generated/resources/assets/create/models/block/orange_seat.json @@ -1,7 +1,6 @@ { "parent": "create:block/seat", "textures": { - "3": "create:block/valve_handle/valve_handle_orange", "1": "create:block/seat/top_orange", "2": "create:block/seat/side_orange" } diff --git a/src/generated/resources/assets/create/models/block/pink_seat.json b/src/generated/resources/assets/create/models/block/pink_seat.json index a17f52de9..a6a9781aa 100644 --- a/src/generated/resources/assets/create/models/block/pink_seat.json +++ b/src/generated/resources/assets/create/models/block/pink_seat.json @@ -1,7 +1,6 @@ { "parent": "create:block/seat", "textures": { - "3": "create:block/valve_handle/valve_handle_pink", "1": "create:block/seat/top_pink", "2": "create:block/seat/side_pink" } diff --git a/src/generated/resources/assets/create/models/block/purple_seat.json b/src/generated/resources/assets/create/models/block/purple_seat.json index 9ab7a7fc0..1db18ce5e 100644 --- a/src/generated/resources/assets/create/models/block/purple_seat.json +++ b/src/generated/resources/assets/create/models/block/purple_seat.json @@ -1,7 +1,6 @@ { "parent": "create:block/seat", "textures": { - "3": "create:block/valve_handle/valve_handle_purple", "1": "create:block/seat/top_purple", "2": "create:block/seat/side_purple" } diff --git a/src/generated/resources/assets/create/models/block/red_seat.json b/src/generated/resources/assets/create/models/block/red_seat.json index b0ef025c0..0d294e9f0 100644 --- a/src/generated/resources/assets/create/models/block/red_seat.json +++ b/src/generated/resources/assets/create/models/block/red_seat.json @@ -1,7 +1,6 @@ { "parent": "create:block/seat", "textures": { - "3": "create:block/valve_handle/valve_handle_red", "1": "create:block/seat/top_red", "2": "create:block/seat/side_red" } diff --git a/src/generated/resources/assets/create/models/block/white_seat.json b/src/generated/resources/assets/create/models/block/white_seat.json index a48f08c46..c3b473e2a 100644 --- a/src/generated/resources/assets/create/models/block/white_seat.json +++ b/src/generated/resources/assets/create/models/block/white_seat.json @@ -1,7 +1,6 @@ { "parent": "create:block/seat", "textures": { - "3": "create:block/valve_handle/valve_handle_white", "1": "create:block/seat/top_white", "2": "create:block/seat/side_white" } diff --git a/src/generated/resources/assets/create/models/block/yellow_seat.json b/src/generated/resources/assets/create/models/block/yellow_seat.json index 325602525..561829e5e 100644 --- a/src/generated/resources/assets/create/models/block/yellow_seat.json +++ b/src/generated/resources/assets/create/models/block/yellow_seat.json @@ -1,7 +1,6 @@ { "parent": "create:block/seat", "textures": { - "3": "create:block/valve_handle/valve_handle_yellow", "1": "create:block/seat/top_yellow", "2": "create:block/seat/side_yellow" } From 334bde9de5cba8d3d968f41c9b1acf986eb92bde Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 2 Oct 2020 14:28:48 +0200 Subject: [PATCH 12/12] Quality - Visual rework of all active UIs - Fixed large scale renderers such as belts, cannons, pulleys to disappear when partially out of frame - Schematic and Quill now has the ability to convert a selection to a readied schematic instantly - Moved option input of cart assemblers to side faces - Fixed crash when attempting to smelt items on belts/depots - Stockpile switches can now be inverted - Fixed stockpile switches not dynamically updating gui indicators frequently enough - Tanks can no longer be directly interacted with in survival mode - Sequenced gearshifts now emit a comparator signal based on their current instruction index - The Piston instruction for sequencers can now accept distances up to 128m - Fixed some rendering inconsistencies with symmetry mirrors - Reworked symmetry mirror models to match the tool better - Attribute filters can now add inverted conditions to the list - Added the attribute "can be crushed" - Made the schematicannon interface a little less confusing - Fixed launched items of the schematicannon rendering warped --- src/generated/resources/.cache/cache | 22 +- .../create/blockstates/radial_chassis.json | 48 +-- .../resources/assets/create/lang/en_us.json | 44 ++- .../assets/create/lang/unfinished/de_de.json | 42 ++- .../assets/create/lang/unfinished/fr_fr.json | 40 +- .../assets/create/lang/unfinished/it_it.json | 40 +- .../assets/create/lang/unfinished/ja_jp.json | 40 +- .../assets/create/lang/unfinished/ko_kr.json | 40 +- .../assets/create/lang/unfinished/nl_nl.json | 42 ++- .../assets/create/lang/unfinished/pt_br.json | 42 ++- .../assets/create/lang/unfinished/ru_ru.json | 42 ++- .../assets/create/lang/unfinished/zh_cn.json | 40 +- .../components/fan/AirCurrent.java | 3 +- .../mounted/CartAssemblerTileEntity.java | 38 +- .../pulley/PulleyRenderer.java | 5 + .../pulley/PulleyTileEntity.java | 2 +- .../fluids/tank/FluidTankBlock.java | 3 + .../sequencer/SequencedGearshiftBlock.java | 10 + .../sequencer/SequencedGearshiftScreen.java | 90 +++-- .../sequencer/SequencerInstructions.java | 2 +- .../relays/belt/BeltRenderer.java | 5 + .../relays/belt/BeltTileEntity.java | 2 +- .../curiosities/symmetry/SymmetryHandler.java | 11 +- .../symmetry/SymmetryWandScreen.java | 64 ++-- .../curiosities/zapper/ZapperScreen.java | 29 +- .../zapper/blockzapper/BlockzapperScreen.java | 16 +- .../terrainzapper/WorldshaperScreen.java | 26 +- .../inventories/AdjustableCrateContainer.java | 6 +- .../inventories/AdjustableCrateScreen.java | 29 +- .../block/redstone/StockpileSwitchBlock.java | 2 +- .../block/redstone/StockpileSwitchScreen.java | 172 +++++---- .../redstone/StockpileSwitchTileEntity.java | 58 ++- .../item/filter/AbstractFilterScreen.java | 13 +- .../item/filter/AttributeFilterContainer.java | 37 +- .../item/filter/AttributeFilterScreen.java | 104 ++++-- .../item/filter/FilterContainer.java | 6 +- .../logistics/item/filter/FilterItem.java | 15 +- .../logistics/item/filter/FilterScreen.java | 16 +- .../item/filter/FilterScreenPacket.java | 6 +- .../logistics/item/filter/ItemAttribute.java | 50 ++- .../packet/ConfigureStockswitchPacket.java | 7 +- .../schematics/ClientSchematicLoader.java | 22 +- .../schematics/ServerSchematicLoader.java | 95 ++++- .../block/SchematicTableContainer.java | 4 +- .../block/SchematicTableScreen.java | 27 +- .../block/SchematicannonContainer.java | 19 +- .../block/SchematicannonRenderer.java | 21 +- .../block/SchematicannonScreen.java | 318 ++++++++++------ .../client/SchematicAndQuillHandler.java | 52 ++- .../client/SchematicEditScreen.java | 72 ++-- .../client/SchematicHotbarSlotOverlay.java | 6 +- .../client/SchematicPromptScreen.java | 103 ++++++ .../packet/InstantSchematicPacket.java | 52 +++ .../create/foundation/gui/AllGuiTextures.java | 81 ++-- .../create/foundation/gui/AllIcons.java | 8 +- .../foundation/gui/TextInputPromptScreen.java | 106 ------ .../foundation/gui/ToolSelectionScreen.java | 2 +- .../foundation/gui/widgets/ScrollInput.java | 5 + .../foundation/networking/AllPackets.java | 2 + .../assets/create/lang/default/messages.json | 48 ++- .../block/symmetry_effect/crossplane.json | 283 +++++++------- .../models/block/symmetry_effect/plane.json | 200 +++++----- .../block/symmetry_effect/tripleplane.json | 346 +++++++++--------- .../create/textures/block/symmetry_mirror.png | Bin 0 -> 262 bytes .../create/textures/gui/curiosities.png | Bin 0 -> 2097 bytes .../create/textures/gui/curiosities_2.png | Bin 0 -> 1488 bytes .../create/textures/gui/double_flexcrate.png | Bin 2133 -> 0 bytes .../assets/create/textures/gui/filter.png | Bin 15775 -> 0 bytes .../assets/create/textures/gui/filters.png | Bin 0 -> 1855 bytes .../gui/flex_crate_and_stockpile_switch.png | Bin 13655 -> 0 bytes .../assets/create/textures/gui/icons.png | Bin 4434 -> 4289 bytes .../assets/create/textures/gui/logistics.png | Bin 0 -> 4761 bytes .../create/textures/gui/logistics_2.png | Bin 0 -> 1771 bytes .../gui/{background.png => overlay.png} | Bin .../assets/create/textures/gui/schematic.png | Bin 1809 -> 0 bytes .../create/textures/gui/schematic_table.png | Bin 1999 -> 0 bytes .../create/textures/gui/schematicannon.png | Bin 13735 -> 0 bytes .../assets/create/textures/gui/schematics.png | Bin 0 -> 1987 bytes .../create/textures/gui/schematics_2.png | Bin 0 -> 4015 bytes .../assets/create/textures/gui/sequencer.png | Bin 2241 -> 1696 bytes .../create/textures/gui/wand_symmetry.png | Bin 1781 -> 0 bytes .../assets/create/textures/gui/widgets.png | Bin 2992 -> 2406 bytes .../assets/create/textures/gui/zapper.png | Bin 10750 -> 0 bytes 83 files changed, 1949 insertions(+), 1232 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/schematics/client/SchematicPromptScreen.java create mode 100644 src/main/java/com/simibubi/create/content/schematics/packet/InstantSchematicPacket.java delete mode 100644 src/main/java/com/simibubi/create/foundation/gui/TextInputPromptScreen.java create mode 100644 src/main/resources/assets/create/textures/block/symmetry_mirror.png create mode 100644 src/main/resources/assets/create/textures/gui/curiosities.png create mode 100644 src/main/resources/assets/create/textures/gui/curiosities_2.png delete mode 100644 src/main/resources/assets/create/textures/gui/double_flexcrate.png delete mode 100644 src/main/resources/assets/create/textures/gui/filter.png create mode 100644 src/main/resources/assets/create/textures/gui/filters.png delete mode 100644 src/main/resources/assets/create/textures/gui/flex_crate_and_stockpile_switch.png create mode 100644 src/main/resources/assets/create/textures/gui/logistics.png create mode 100644 src/main/resources/assets/create/textures/gui/logistics_2.png rename src/main/resources/assets/create/textures/gui/{background.png => overlay.png} (100%) delete mode 100644 src/main/resources/assets/create/textures/gui/schematic.png delete mode 100644 src/main/resources/assets/create/textures/gui/schematic_table.png delete mode 100644 src/main/resources/assets/create/textures/gui/schematicannon.png create mode 100644 src/main/resources/assets/create/textures/gui/schematics.png create mode 100644 src/main/resources/assets/create/textures/gui/schematics_2.png delete mode 100644 src/main/resources/assets/create/textures/gui/wand_symmetry.png delete mode 100644 src/main/resources/assets/create/textures/gui/zapper.png diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 4e96a6802..4b59050cb 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -298,7 +298,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl 3a739f9d4276828d83f2d2750bf3227c87bcd438 assets/create/blockstates/pulley_magnet.json 469e430d96cb0a5e1aaf6b7cc5d401d488c9e600 assets/create/blockstates/pulse_repeater.json 92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json -89b63c6e5875da07226854651079bcea85439f5b assets/create/blockstates/radial_chassis.json +bdd56f32ce0a148b6e466a55ab2777f69fc08cfc assets/create/blockstates/radial_chassis.json da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json 8929677f2cc5354aa19ef182af69f9f0b41eb242 assets/create/blockstates/redstone_contact.json c29213b77ac0c78d8979c5f6188d2b265696f9b9 assets/create/blockstates/redstone_link.json @@ -352,16 +352,16 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json e7a5a4320a332f5ed4341d3c08dd50a2e945d8bb assets/create/lang/en_ud.json -040cb0a702643a865f30bae9eeacaeaa94bbce7d assets/create/lang/en_us.json -5c6ce1933165fecd71fbdf67cb8de955368d1bfc assets/create/lang/unfinished/de_de.json -b8c3464b86dd7a934d3beec6c005e4799cbdf7af assets/create/lang/unfinished/fr_fr.json -c91eb4509e5afe6f288ed737f407914ae983480a assets/create/lang/unfinished/it_it.json -16fb593c1179f58811153b2f7c7cffb55615587f assets/create/lang/unfinished/ja_jp.json -4d975de4cd34e10e7156fe35a0e5f4e40650aa69 assets/create/lang/unfinished/ko_kr.json -f98f523352796c3496c27085182118bbd597a7ad assets/create/lang/unfinished/nl_nl.json -714e68af6c0f614d069ff0b31763bced1f968437 assets/create/lang/unfinished/pt_br.json -a18338a37536490b2f7b6a8836add3e133b16920 assets/create/lang/unfinished/ru_ru.json -e7ad3d9140bb94d5aa2720b651d8bf1308ad0da4 assets/create/lang/unfinished/zh_cn.json +29d60a3aac3eb9c7a1c0e9ce4bf4db0bb83f5d53 assets/create/lang/en_us.json +f1ceb5595b8056d8a452ace3f45d7aa7bda8d89b assets/create/lang/unfinished/de_de.json +32059f6ed1f468e707d59adff9b23bf06d9da2b8 assets/create/lang/unfinished/fr_fr.json +a02eef6cf319384a767d1719846a07c98ba203ad assets/create/lang/unfinished/it_it.json +c9ea726ce46c82709285d6231b5fcda533911d74 assets/create/lang/unfinished/ja_jp.json +548ce211b40c3f68b1f9b2ff503e4c2ef68ae21c assets/create/lang/unfinished/ko_kr.json +9d54d6fee5c0b52c03dcbf0fd7106c2a9a7e7a17 assets/create/lang/unfinished/nl_nl.json +bf617f18f5901015f09c097c4de673ff6a1ab764 assets/create/lang/unfinished/pt_br.json +753697d68b3c1e5aa70aa7ee094c33c8fd195594 assets/create/lang/unfinished/ru_ru.json +4b8c4bd41cd2ee5c1f427aa49748fafa1237edf7 assets/create/lang/unfinished/zh_cn.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/blockstates/radial_chassis.json b/src/generated/resources/assets/create/blockstates/radial_chassis.json index d60327a8a..1aa3d3728 100644 --- a/src/generated/resources/assets/create/blockstates/radial_chassis.json +++ b/src/generated/resources/assets/create/blockstates/radial_chassis.json @@ -89,8 +89,8 @@ }, { "when": { - "sticky_west": "true", - "axis": "x" + "axis": "x", + "sticky_west": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -99,8 +99,8 @@ }, { "when": { - "sticky_west": "true", - "axis": "y" + "axis": "y", + "sticky_west": "true" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -109,8 +109,8 @@ }, { "when": { - "sticky_west": "true", - "axis": "z" + "axis": "z", + "sticky_west": "true" }, "apply": { "model": "create:block/radial_chassis_side_z_sticky", @@ -119,8 +119,8 @@ }, { "when": { - "sticky_west": "false", - "axis": "x" + "axis": "x", + "sticky_west": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -129,8 +129,8 @@ }, { "when": { - "sticky_west": "false", - "axis": "y" + "axis": "y", + "sticky_west": "false" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -139,8 +139,8 @@ }, { "when": { - "sticky_west": "false", - "axis": "z" + "axis": "z", + "sticky_west": "false" }, "apply": { "model": "create:block/radial_chassis_side_z", @@ -207,8 +207,8 @@ }, { "when": { - "sticky_east": "true", - "axis": "x" + "axis": "x", + "sticky_east": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -217,8 +217,8 @@ }, { "when": { - "sticky_east": "true", - "axis": "y" + "axis": "y", + "sticky_east": "true" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -227,8 +227,8 @@ }, { "when": { - "sticky_east": "true", - "axis": "z" + "axis": "z", + "sticky_east": "true" }, "apply": { "model": "create:block/radial_chassis_side_z_sticky" @@ -236,8 +236,8 @@ }, { "when": { - "sticky_east": "false", - "axis": "x" + "axis": "x", + "sticky_east": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -246,8 +246,8 @@ }, { "when": { - "sticky_east": "false", - "axis": "y" + "axis": "y", + "sticky_east": "false" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -256,8 +256,8 @@ }, { "when": { - "sticky_east": "false", - "axis": "z" + "axis": "z", + "sticky_east": "false" }, "apply": { "model": "create:block/radial_chassis_side_z" diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 1daf3530c..5d325aa9c 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -662,12 +662,9 @@ "create.gui.adjustable_crate.title": "Adjustable Crate", "create.gui.adjustable_crate.storageSpace": "Storage Space", "create.gui.stockpile_switch.title": "Stockpile Switch", - "create.gui.stockpile_switch.lowerLimit": "Lower Threshold", - "create.gui.stockpile_switch.upperLimit": "Upper Threshold", - "create.gui.stockpile_switch.startAt": "Start Signal at", - "create.gui.stockpile_switch.startAbove": "Start Signal above", - "create.gui.stockpile_switch.stopAt": "Stop Signal at", - "create.gui.stockpile_switch.stopBelow": "Stop Signal below", + "create.gui.stockpile_switch.invert_signal": "Invert Signal", + "create.gui.stockpile_switch.move_to_lower_at": "Move to lower lane at %1$s%%", + "create.gui.stockpile_switch.move_to_upper_at": "Move to upper lane at %1$s%%", "create.gui.sequenced_gearshift.title": "Sequenced Gearshift", "create.gui.sequenced_gearshift.instruction": "Instruction", "create.gui.sequenced_gearshift.instruction.turn_angle": "Turn", @@ -688,7 +685,8 @@ "create.schematicAndQuill.secondPos": "Second position set.", "create.schematicAndQuill.noTarget": "Hold [Ctrl] to select Air blocks.", "create.schematicAndQuill.abort": "Removed selection.", - "create.schematicAndQuill.prompt": "Enter a name for the Schematic:", + "create.schematicAndQuill.title": "Schematic Name:", + "create.schematicAndQuill.convert": "Save and Deploy Immediately", "create.schematicAndQuill.fallbackName": "My Schematic", "create.schematicAndQuill.saved": "Saved as %1$s", @@ -735,28 +733,33 @@ "create.schematic.tool.flip.description.3": "", "create.schematics.synchronizing": "Syncing...", - "create.schematics.uploadTooLarge": "Your schematic is too big.", + "create.schematics.uploadTooLarge": "Your schematic exceeds limitations specified by the server.", "create.schematics.maxAllowedSize": "The maximum allowed schematic file size is:", "create.gui.schematicTable.title": "Schematic Table", + "create.gui.schematicTable.refresh": "Refresh Files", + "create.gui.schematicTable.open_folder": "Open Folder", "create.gui.schematicTable.availableSchematics": "Available Schematics", "create.gui.schematicTable.noSchematics": "No Schematics Saved", "create.gui.schematicTable.uploading": "Uploading...", "create.gui.schematicTable.finished": "Upload Finished!", "create.gui.schematicannon.title": "Schematicannon", - "create.gui.schematicannon.settingsTitle": "Placement Settings", - "create.gui.schematicannon.listPrinter": "Material List Printer", + "create.gui.schematicannon.listPrinter": "Checklist Printer", "create.gui.schematicannon.gunpowderLevel": "Gunpowder at %1$s%%", "create.gui.schematicannon.shotsRemaining": "Shots left: %1$s", "create.gui.schematicannon.shotsRemainingWithBackup": "With backup: %1$s", "create.gui.schematicannon.optionEnabled": "Currently Enabled", "create.gui.schematicannon.optionDisabled": "Currently Disabled", + "create.gui.schematicannon.showOptions": "Show Printer Settings", "create.gui.schematicannon.option.dontReplaceSolid": "Don't Replace Solid Blocks", "create.gui.schematicannon.option.replaceWithSolid": "Replace Solid with Solid", "create.gui.schematicannon.option.replaceWithAny": "Replace Solid with Any", "create.gui.schematicannon.option.replaceWithEmpty": "Replace Solid with Empty", "create.gui.schematicannon.option.skipMissing": "Skip missing Blocks", "create.gui.schematicannon.option.skipTileEntities": "Protect Tile Entities", + "create.gui.schematicannon.slot.gunpowder": "Add gunpowder to fuel the cannon", + "create.gui.schematicannon.slot.listPrinter": "Place books here to print a Checklist for your Schematic", + "create.gui.schematicannon.slot.schematic": "Add your Schematic here. Make sure it is deployed at a specific location.", "create.gui.schematicannon.option.skipMissing.description": "If the cannon cannot find a required Block for placement, it will continue at the next Location.", "create.gui.schematicannon.option.skipTileEntities.description": "The cannon will avoid replacing data holding blocks such as Chests.", "create.gui.schematicannon.option.dontReplaceSolid.description": "The cannon will never replace any Solid blocks in its working area, only non-Solid and Air.", @@ -792,23 +795,42 @@ "create.gui.filter.ignore_data.description": "Items match regardless of their attributes.", "create.item_attributes.placeable": "is placeable", + "create.item_attributes.placeable.inverted": "is not placeable", "create.item_attributes.consumable": "can be eaten", + "create.item_attributes.consumable.inverted": "cannot be eaten", "create.item_attributes.smeltable": "can be Smelted", + "create.item_attributes.smeltable.inverted": "cannot be Smelted", "create.item_attributes.washable": "can be Washed", + "create.item_attributes.washable.inverted": "cannot be Washed", "create.item_attributes.smokable": "can be Smoked", + "create.item_attributes.smokable.inverted": "cannot be Smoked", + "create.item_attributes.crushable": "can be Crushed", + "create.item_attributes.crushable.inverted": "cannot be Crushed", "create.item_attributes.blastable": "is smeltable in Blast Furnace", + "create.item_attributes.blastable.inverted": "is not smeltable in Blast Furnace", "create.item_attributes.enchanted": "is enchanted", + "create.item_attributes.enchanted.inverted": "is unenchanted", "create.item_attributes.damaged": "is damaged", + "create.item_attributes.damaged.inverted": "is not damaged", "create.item_attributes.badly_damaged": "is heavily damaged", + "create.item_attributes.badly_damaged.inverted": "is not heavily damaged", "create.item_attributes.not_stackable": "cannot stack", + "create.item_attributes.not_stackable.inverted": "can be stacked", "create.item_attributes.equipable": "can be equipped", + "create.item_attributes.equipable.inverted": "cannot be equipped", "create.item_attributes.furnace_fuel": "is furnace fuel", + "create.item_attributes.furnace_fuel.inverted": "is not furnace fuel", "create.item_attributes.in_tag": "is tagged %1$s", - "create.item_attributes.in_item_group": "belongs to %1$s", + "create.item_attributes.in_tag.inverted": "is not tagged %1$s", + "create.item_attributes.in_item_group": "is in group '%1$s'", + "create.item_attributes.in_item_group.inverted": "is not in group '%1$s'", "create.item_attributes.added_by": "was added by %1$s", + "create.item_attributes.added_by.inverted": "was not added by %1$s", "create.gui.attribute_filter.no_selected_attributes": "No attributes selected", "create.gui.attribute_filter.selected_attributes": "Selected attributes:", + "create.gui.attribute_filter.add_attribute": "Add attribute to List", + "create.gui.attribute_filter.add_inverted_attribute": "Add opposite attribute to List", "create.gui.attribute_filter.whitelist_disjunctive": "Whitelist (Any)", "create.gui.attribute_filter.whitelist_disjunctive.description": "Items pass if they have any of the selected attributes.", "create.gui.attribute_filter.whitelist_conjunctive": "Whitelist (All)", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index c72d05bb9..576d1eb4c 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 807", + "_": "Missing Localizations: 837", "_": "->------------------------] Game Elements [------------------------<-", @@ -663,12 +663,9 @@ "create.gui.adjustable_crate.title": "adjustable_crate", "create.gui.adjustable_crate.storageSpace": "Lagerraum", "create.gui.stockpile_switch.title": "Vorratssensor", - "create.gui.stockpile_switch.lowerLimit": "Untergrenze", - "create.gui.stockpile_switch.upperLimit": "Obergrenze", - "create.gui.stockpile_switch.startAt": "Signal bei", - "create.gui.stockpile_switch.startAbove": "Signal über", - "create.gui.stockpile_switch.stopAt": "Signalstopp bei", - "create.gui.stockpile_switch.stopBelow": "Signalstopp über", + "create.gui.stockpile_switch.invert_signal": "UNLOCALIZED: Invert Signal", + "create.gui.stockpile_switch.move_to_lower_at": "UNLOCALIZED: Move to lower lane at %1$s%%", + "create.gui.stockpile_switch.move_to_upper_at": "UNLOCALIZED: Move to upper lane at %1$s%%", "create.gui.sequenced_gearshift.title": "UNLOCALIZED: Sequenced Gearshift", "create.gui.sequenced_gearshift.instruction": "UNLOCALIZED: Instruction", "create.gui.sequenced_gearshift.instruction.turn_angle": "UNLOCALIZED: Turn", @@ -689,7 +686,8 @@ "create.schematicAndQuill.secondPos": "Zweite Position festgelegt.", "create.schematicAndQuill.noTarget": "Halte [Strg] zur Auswahl von Luft.", "create.schematicAndQuill.abort": "Auswahl zurückgesetzt.", - "create.schematicAndQuill.prompt": "Gib dem Bauplan einen Namen:", + "create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:", + "create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately", "create.schematicAndQuill.fallbackName": "Mein Bauplan", "create.schematicAndQuill.saved": "Gespeichert als %1$s", @@ -740,24 +738,29 @@ "create.schematics.maxAllowedSize": "Die maximale Bauplan-Dateigröße ist:", "create.gui.schematicTable.title": "Bauplantisch", + "create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files", + "create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder", "create.gui.schematicTable.availableSchematics": "Verfügbare Baupläne", "create.gui.schematicTable.noSchematics": "Keine gespeicherten Baupläne", "create.gui.schematicTable.uploading": "Hochladen...", "create.gui.schematicTable.finished": "Hochgeladen!", "create.gui.schematicannon.title": "Bauplankanone", - "create.gui.schematicannon.settingsTitle": "Platzier-Optionen", "create.gui.schematicannon.listPrinter": "Materiallistendruck", "create.gui.schematicannon.gunpowderLevel": "Schwarzpulver bei %1$s%%", "create.gui.schematicannon.shotsRemaining": "%1$s Schuss übrig", "create.gui.schematicannon.shotsRemainingWithBackup": "Mit Reserve: %1$s", "create.gui.schematicannon.optionEnabled": "Aktiviert", "create.gui.schematicannon.optionDisabled": "Deaktiviert", + "create.gui.schematicannon.showOptions": "UNLOCALIZED: Show Printer Settings", "create.gui.schematicannon.option.dontReplaceSolid": "Feste Blöcke nicht ersetzen", "create.gui.schematicannon.option.replaceWithSolid": "Feste Blöcke mit festen ersetzen", "create.gui.schematicannon.option.replaceWithAny": "Feste Blöcke immer ersetzen", "create.gui.schematicannon.option.replaceWithEmpty": "Feste Blöcke mit Leere ersetzen", "create.gui.schematicannon.option.skipMissing": "Fehlende Blöcke ignorieren", "create.gui.schematicannon.option.skipTileEntities": "Tile Entities ignorieren", + "create.gui.schematicannon.slot.gunpowder": "UNLOCALIZED: Add gunpowder to fuel the cannon", + "create.gui.schematicannon.slot.listPrinter": "UNLOCALIZED: Place books here to print a Checklist for your Schematic", + "create.gui.schematicannon.slot.schematic": "UNLOCALIZED: Add your Schematic here. Make sure it is deployed at a specific location.", "create.gui.schematicannon.option.skipMissing.description": "Wenn die Bauplankanone einen benötigten Block nicht finden kann, wird sie einfach beim nächsten weiter machen.", "create.gui.schematicannon.option.skipTileEntities.description": "Die Bauplankanone wird versuchen, Blöcke mit extra Daten, beispielsweise Truhen, nicht zu ersetzen.", "create.gui.schematicannon.option.dontReplaceSolid.description": "Die Kanone wird ausschließlich nicht feste Blöcke und Luft in ihrem Arbeitsbereich ersetzen.", @@ -793,23 +796,42 @@ "create.gui.filter.ignore_data.description": "UNLOCALIZED: Items match regardless of their attributes.", "create.item_attributes.placeable": "UNLOCALIZED: is placeable", + "create.item_attributes.placeable.inverted": "UNLOCALIZED: is not placeable", "create.item_attributes.consumable": "UNLOCALIZED: can be eaten", + "create.item_attributes.consumable.inverted": "UNLOCALIZED: cannot be eaten", "create.item_attributes.smeltable": "UNLOCALIZED: can be Smelted", + "create.item_attributes.smeltable.inverted": "UNLOCALIZED: cannot be Smelted", "create.item_attributes.washable": "UNLOCALIZED: can be Washed", + "create.item_attributes.washable.inverted": "UNLOCALIZED: cannot be Washed", "create.item_attributes.smokable": "UNLOCALIZED: can be Smoked", + "create.item_attributes.smokable.inverted": "UNLOCALIZED: cannot be Smoked", + "create.item_attributes.crushable": "UNLOCALIZED: can be Crushed", + "create.item_attributes.crushable.inverted": "UNLOCALIZED: cannot be Crushed", "create.item_attributes.blastable": "UNLOCALIZED: is smeltable in Blast Furnace", + "create.item_attributes.blastable.inverted": "UNLOCALIZED: is not smeltable in Blast Furnace", "create.item_attributes.enchanted": "UNLOCALIZED: is enchanted", + "create.item_attributes.enchanted.inverted": "UNLOCALIZED: is unenchanted", "create.item_attributes.damaged": "UNLOCALIZED: is damaged", + "create.item_attributes.damaged.inverted": "UNLOCALIZED: is not damaged", "create.item_attributes.badly_damaged": "UNLOCALIZED: is heavily damaged", + "create.item_attributes.badly_damaged.inverted": "UNLOCALIZED: is not heavily damaged", "create.item_attributes.not_stackable": "UNLOCALIZED: cannot stack", + "create.item_attributes.not_stackable.inverted": "UNLOCALIZED: can be stacked", "create.item_attributes.equipable": "UNLOCALIZED: can be equipped", + "create.item_attributes.equipable.inverted": "UNLOCALIZED: cannot be equipped", "create.item_attributes.furnace_fuel": "UNLOCALIZED: is furnace fuel", + "create.item_attributes.furnace_fuel.inverted": "UNLOCALIZED: is not furnace fuel", "create.item_attributes.in_tag": "UNLOCALIZED: is tagged %1$s", - "create.item_attributes.in_item_group": "UNLOCALIZED: belongs to %1$s", + "create.item_attributes.in_tag.inverted": "UNLOCALIZED: is not tagged %1$s", + "create.item_attributes.in_item_group": "UNLOCALIZED: is in group '%1$s'", + "create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'", "create.item_attributes.added_by": "UNLOCALIZED: was added by %1$s", + "create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s", "create.gui.attribute_filter.no_selected_attributes": "UNLOCALIZED: No attributes selected", "create.gui.attribute_filter.selected_attributes": "UNLOCALIZED: Selected attributes:", + "create.gui.attribute_filter.add_attribute": "UNLOCALIZED: Add attribute to List", + "create.gui.attribute_filter.add_inverted_attribute": "UNLOCALIZED: Add opposite attribute to List", "create.gui.attribute_filter.whitelist_disjunctive": "UNLOCALIZED: Whitelist (Any)", "create.gui.attribute_filter.whitelist_disjunctive.description": "UNLOCALIZED: Items pass if they have any of the selected attributes.", "create.gui.attribute_filter.whitelist_conjunctive": "UNLOCALIZED: Whitelist (All)", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index 3420ffb7e..1ef35a073 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 431", + "_": "Missing Localizations: 461", "_": "->------------------------] Game Elements [------------------------<-", @@ -663,12 +663,9 @@ "create.gui.adjustable_crate.title": "Caisse réglable", "create.gui.adjustable_crate.storageSpace": "Espace de stockage", "create.gui.stockpile_switch.title": "Commutateur de stockage", - "create.gui.stockpile_switch.lowerLimit": "Seuil inférieur", - "create.gui.stockpile_switch.upperLimit": "Seuil supérieur", - "create.gui.stockpile_switch.startAt": "Signal de départ à", - "create.gui.stockpile_switch.startAbove": "Signal de démarrage au-dessus", - "create.gui.stockpile_switch.stopAt": "Signal d'arrêt à", - "create.gui.stockpile_switch.stopBelow": "Signal d'arrêt en-dessous", + "create.gui.stockpile_switch.invert_signal": "UNLOCALIZED: Invert Signal", + "create.gui.stockpile_switch.move_to_lower_at": "UNLOCALIZED: Move to lower lane at %1$s%%", + "create.gui.stockpile_switch.move_to_upper_at": "UNLOCALIZED: Move to upper lane at %1$s%%", "create.gui.sequenced_gearshift.title": "Décaleur de rotation séquencé", "create.gui.sequenced_gearshift.instruction": "Instructions", "create.gui.sequenced_gearshift.instruction.turn_angle": "Tourner", @@ -689,7 +686,8 @@ "create.schematicAndQuill.secondPos": "Seconde position définie.", "create.schematicAndQuill.noTarget": "Enfoncez [Ctrl] pour sélectionner les blocs d'air.", "create.schematicAndQuill.abort": "Sélection supprimée.", - "create.schematicAndQuill.prompt": "Entrez un nom pour le schéma:", + "create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:", + "create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately", "create.schematicAndQuill.fallbackName": "Mon schéma", "create.schematicAndQuill.saved": "Sauvegardé en tant que %1$s", @@ -740,24 +738,29 @@ "create.schematics.maxAllowedSize": "La taille de fichier schématique maximale autorisée est:", "create.gui.schematicTable.title": "Table à schéma", + "create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files", + "create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder", "create.gui.schematicTable.availableSchematics": "Schémas disponibles", "create.gui.schematicTable.noSchematics": "Aucun schéma enregistré", "create.gui.schematicTable.uploading": "Téléchargement...", "create.gui.schematicTable.finished": "Téléchargement terminé!", "create.gui.schematicannon.title": "Schémacanon", - "create.gui.schematicannon.settingsTitle": "Options de placement", "create.gui.schematicannon.listPrinter": "Imprimante de liste de matériaux", "create.gui.schematicannon.gunpowderLevel": "Poudre à canon à %1$s%%", "create.gui.schematicannon.shotsRemaining": "Tirs restants: %1$s", "create.gui.schematicannon.shotsRemainingWithBackup": "Avec sauvegarde: %1$s", "create.gui.schematicannon.optionEnabled": "Actuellement activé", "create.gui.schematicannon.optionDisabled": "Actuellement désactivé", + "create.gui.schematicannon.showOptions": "UNLOCALIZED: Show Printer Settings", "create.gui.schematicannon.option.dontReplaceSolid": "Ne remplacez pas les blocs solides", "create.gui.schematicannon.option.replaceWithSolid": "Remplacer solide par solide", "create.gui.schematicannon.option.replaceWithAny": "Remplacer le solide par n'importe quoi", "create.gui.schematicannon.option.replaceWithEmpty": "Remplacer le solide par rien", "create.gui.schematicannon.option.skipMissing": "Ignorer les blocs manquants", "create.gui.schematicannon.option.skipTileEntities": "Protéger les Tile Entities", + "create.gui.schematicannon.slot.gunpowder": "UNLOCALIZED: Add gunpowder to fuel the cannon", + "create.gui.schematicannon.slot.listPrinter": "UNLOCALIZED: Place books here to print a Checklist for your Schematic", + "create.gui.schematicannon.slot.schematic": "UNLOCALIZED: Add your Schematic here. Make sure it is deployed at a specific location.", "create.gui.schematicannon.option.skipMissing.description": "Si le canon ne peut pas trouver un bloc requis pour le placement, il continuera au prochain emplacement.", "create.gui.schematicannon.option.skipTileEntities.description": "Le canon évitera de remplacer les blocs de stockage de données tels que les coffres.", "create.gui.schematicannon.option.dontReplaceSolid.description": "Le canon ne remplacera jamais les blocs solides dans sa zone de travail, seulement non solides et air.", @@ -793,23 +796,42 @@ "create.gui.filter.ignore_data.description": "Les éléments correspondent indépendamment de leurs attributs.", "create.item_attributes.placeable": "est placeable", + "create.item_attributes.placeable.inverted": "UNLOCALIZED: is not placeable", "create.item_attributes.consumable": "peut être mangé", + "create.item_attributes.consumable.inverted": "UNLOCALIZED: cannot be eaten", "create.item_attributes.smeltable": "UNLOCALIZED: can be Smelted", + "create.item_attributes.smeltable.inverted": "UNLOCALIZED: cannot be Smelted", "create.item_attributes.washable": "UNLOCALIZED: can be Washed", + "create.item_attributes.washable.inverted": "UNLOCALIZED: cannot be Washed", "create.item_attributes.smokable": "UNLOCALIZED: can be Smoked", + "create.item_attributes.smokable.inverted": "UNLOCALIZED: cannot be Smoked", + "create.item_attributes.crushable": "UNLOCALIZED: can be Crushed", + "create.item_attributes.crushable.inverted": "UNLOCALIZED: cannot be Crushed", "create.item_attributes.blastable": "UNLOCALIZED: is smeltable in Blast Furnace", + "create.item_attributes.blastable.inverted": "UNLOCALIZED: is not smeltable in Blast Furnace", "create.item_attributes.enchanted": "est enchanté", + "create.item_attributes.enchanted.inverted": "UNLOCALIZED: is unenchanted", "create.item_attributes.damaged": "est endommagé", + "create.item_attributes.damaged.inverted": "UNLOCALIZED: is not damaged", "create.item_attributes.badly_damaged": "est fortement damaged", + "create.item_attributes.badly_damaged.inverted": "UNLOCALIZED: is not heavily damaged", "create.item_attributes.not_stackable": "ne peut pas s'empiler", + "create.item_attributes.not_stackable.inverted": "UNLOCALIZED: can be stacked", "create.item_attributes.equipable": "peut être équipé", + "create.item_attributes.equipable.inverted": "UNLOCALIZED: cannot be equipped", "create.item_attributes.furnace_fuel": "est du combustible", + "create.item_attributes.furnace_fuel.inverted": "UNLOCALIZED: is not furnace fuel", "create.item_attributes.in_tag": "est étiqueté %1$s", + "create.item_attributes.in_tag.inverted": "UNLOCALIZED: is not tagged %1$s", "create.item_attributes.in_item_group": "appartient à %1$s", + "create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'", "create.item_attributes.added_by": "a été ajouté par %1$s", + "create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s", "create.gui.attribute_filter.no_selected_attributes": "Aucun attribut sélectionné", "create.gui.attribute_filter.selected_attributes": "Attributs sélectionnés:", + "create.gui.attribute_filter.add_attribute": "UNLOCALIZED: Add attribute to List", + "create.gui.attribute_filter.add_inverted_attribute": "UNLOCALIZED: Add opposite attribute to List", "create.gui.attribute_filter.whitelist_disjunctive": "Liste blanche (n'importe)", "create.gui.attribute_filter.whitelist_disjunctive.description": "Les objets réussissent s'ils possèdent l'un des attributs sélectionnés.", "create.gui.attribute_filter.whitelist_conjunctive": "Liste blanche (tout)", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index 705586333..0b462f7df 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 415", + "_": "Missing Localizations: 445", "_": "->------------------------] Game Elements [------------------------<-", @@ -663,12 +663,9 @@ "create.gui.adjustable_crate.title": "Baule Regolabile", "create.gui.adjustable_crate.storageSpace": "Spazio di Immagazzinamento", "create.gui.stockpile_switch.title": "Interruttore Accumulatore", - "create.gui.stockpile_switch.lowerLimit": "Soglia Inferiore", - "create.gui.stockpile_switch.upperLimit": "Soglia Superiore", - "create.gui.stockpile_switch.startAt": "Inizia Segnale al", - "create.gui.stockpile_switch.startAbove": "Inizia il Segnale dop.", - "create.gui.stockpile_switch.stopAt": "Ferma Segnale al", - "create.gui.stockpile_switch.stopBelow": "Ferma il Segnale dop.", + "create.gui.stockpile_switch.invert_signal": "UNLOCALIZED: Invert Signal", + "create.gui.stockpile_switch.move_to_lower_at": "UNLOCALIZED: Move to lower lane at %1$s%%", + "create.gui.stockpile_switch.move_to_upper_at": "UNLOCALIZED: Move to upper lane at %1$s%%", "create.gui.sequenced_gearshift.title": "Cambio Sequenziale", "create.gui.sequenced_gearshift.instruction": "Istruzione", "create.gui.sequenced_gearshift.instruction.turn_angle": "Gira", @@ -689,7 +686,8 @@ "create.schematicAndQuill.secondPos": "Seconda posizione impostata.", "create.schematicAndQuill.noTarget": "Premi [Ctrl] per selezionare il Blocco d'Aria.", "create.schematicAndQuill.abort": "Selezione rimossa.", - "create.schematicAndQuill.prompt": "Immettere un nome per lo schema:", + "create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:", + "create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately", "create.schematicAndQuill.fallbackName": "La mia Schematica", "create.schematicAndQuill.saved": "Salvata come %1$s", @@ -740,24 +738,29 @@ "create.schematics.maxAllowedSize": "La dimensione massima consentita del file schematica è:", "create.gui.schematicTable.title": "Banco Schematico", + "create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files", + "create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder", "create.gui.schematicTable.availableSchematics": "Schatiche disponibili", "create.gui.schematicTable.noSchematics": "Nessuna Schatica Salvata", "create.gui.schematicTable.uploading": "Caricamento...", "create.gui.schematicTable.finished": "Caricamento Finito!", "create.gui.schematicannon.title": "Cannoneschematico", - "create.gui.schematicannon.settingsTitle": "Impostazioni di Posizionamento", "create.gui.schematicannon.listPrinter": "Stampante Lisra dei Materiali", "create.gui.schematicannon.gunpowderLevel": "Polvere da sparo al %1$s%%", "create.gui.schematicannon.shotsRemaining": "Spari Rimanenti: %1$s", "create.gui.schematicannon.shotsRemainingWithBackup": "Con il backup: %1$s", "create.gui.schematicannon.optionEnabled": "Attualmente Abilitato", "create.gui.schematicannon.optionDisabled": "Attualmente Disabilitato", + "create.gui.schematicannon.showOptions": "UNLOCALIZED: Show Printer Settings", "create.gui.schematicannon.option.dontReplaceSolid": "Non sostituire i Blocchi Solidi", "create.gui.schematicannon.option.replaceWithSolid": "Sostituisci Solidi con Solidi", "create.gui.schematicannon.option.replaceWithAny": "Sostituisci Solidi con Qualsiasi", "create.gui.schematicannon.option.replaceWithEmpty": "Sostituisci Solidi con il Vuoto", "create.gui.schematicannon.option.skipMissing": "Salta i Blocchi Mancanti", "create.gui.schematicannon.option.skipTileEntities": "Proteggi i Blocchi Entità", + "create.gui.schematicannon.slot.gunpowder": "UNLOCALIZED: Add gunpowder to fuel the cannon", + "create.gui.schematicannon.slot.listPrinter": "UNLOCALIZED: Place books here to print a Checklist for your Schematic", + "create.gui.schematicannon.slot.schematic": "UNLOCALIZED: Add your Schematic here. Make sure it is deployed at a specific location.", "create.gui.schematicannon.option.skipMissing.description": "Se il cannone non riesce a trovare un blocco richiesto per il posizionamento, continuerà nella posizione successiva.", "create.gui.schematicannon.option.skipTileEntities.description": "Il cannone eviterà di sostituire i blocchi di dati come bauli.", "create.gui.schematicannon.option.dontReplaceSolid.description": "Il cannone non sostituirà mai alcun blocco Solido nella sua area di lavoro, solo non solidi e aria.", @@ -793,23 +796,42 @@ "create.gui.filter.ignore_data.description": "Gli oggetti corrispondono indipendentemente dai loro attributi.", "create.item_attributes.placeable": "è posizionabile", + "create.item_attributes.placeable.inverted": "UNLOCALIZED: is not placeable", "create.item_attributes.consumable": "può essere mangiato", + "create.item_attributes.consumable.inverted": "UNLOCALIZED: cannot be eaten", "create.item_attributes.smeltable": "può essere Fuso", + "create.item_attributes.smeltable.inverted": "UNLOCALIZED: cannot be Smelted", "create.item_attributes.washable": "può essere Lavato", + "create.item_attributes.washable.inverted": "UNLOCALIZED: cannot be Washed", "create.item_attributes.smokable": "può essere Affumicato", + "create.item_attributes.smokable.inverted": "UNLOCALIZED: cannot be Smoked", + "create.item_attributes.crushable": "UNLOCALIZED: can be Crushed", + "create.item_attributes.crushable.inverted": "UNLOCALIZED: cannot be Crushed", "create.item_attributes.blastable": "è fondibile in un Forno fusorio", + "create.item_attributes.blastable.inverted": "UNLOCALIZED: is not smeltable in Blast Furnace", "create.item_attributes.enchanted": "è incantato", + "create.item_attributes.enchanted.inverted": "UNLOCALIZED: is unenchanted", "create.item_attributes.damaged": "è danneggiato", + "create.item_attributes.damaged.inverted": "UNLOCALIZED: is not damaged", "create.item_attributes.badly_damaged": "è gravemente danneggiato", + "create.item_attributes.badly_damaged.inverted": "UNLOCALIZED: is not heavily damaged", "create.item_attributes.not_stackable": "non impilabile", + "create.item_attributes.not_stackable.inverted": "UNLOCALIZED: can be stacked", "create.item_attributes.equipable": "può essere equipaggiato", + "create.item_attributes.equipable.inverted": "UNLOCALIZED: cannot be equipped", "create.item_attributes.furnace_fuel": "è il combustibile della fornace", + "create.item_attributes.furnace_fuel.inverted": "UNLOCALIZED: is not furnace fuel", "create.item_attributes.in_tag": "è etichettato %1$s", + "create.item_attributes.in_tag.inverted": "UNLOCALIZED: is not tagged %1$s", "create.item_attributes.in_item_group": "appartiene a %1$s", + "create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'", "create.item_attributes.added_by": "è stato aggiunto da %1$s", + "create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s", "create.gui.attribute_filter.no_selected_attributes": "Nessun attributo selezionato", "create.gui.attribute_filter.selected_attributes": "Attributi selezionati:", + "create.gui.attribute_filter.add_attribute": "UNLOCALIZED: Add attribute to List", + "create.gui.attribute_filter.add_inverted_attribute": "UNLOCALIZED: Add opposite attribute to List", "create.gui.attribute_filter.whitelist_disjunctive": "Lista Bianca (Qualsiasi)", "create.gui.attribute_filter.whitelist_disjunctive.description": "Gli oggetti passano se hanno uno degli attributi selezionati.", "create.gui.attribute_filter.whitelist_conjunctive": "Lista Bianca (Tutti)", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index a3a287baf..adf7de27a 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 410", + "_": "Missing Localizations: 440", "_": "->------------------------] Game Elements [------------------------<-", @@ -663,12 +663,9 @@ "create.gui.adjustable_crate.title": "調整可能なクレート", "create.gui.adjustable_crate.storageSpace": "収納スペース", "create.gui.stockpile_switch.title": "在庫スイッチ", - "create.gui.stockpile_switch.lowerLimit": "下限しきい値", - "create.gui.stockpile_switch.upperLimit": "上限しきい値", - "create.gui.stockpile_switch.startAt": "開始信号", - "create.gui.stockpile_switch.startAbove": "以上の開始信号", - "create.gui.stockpile_switch.stopAt": "停止信号", - "create.gui.stockpile_switch.stopBelow": "以下の停止信号", + "create.gui.stockpile_switch.invert_signal": "UNLOCALIZED: Invert Signal", + "create.gui.stockpile_switch.move_to_lower_at": "UNLOCALIZED: Move to lower lane at %1$s%%", + "create.gui.stockpile_switch.move_to_upper_at": "UNLOCALIZED: Move to upper lane at %1$s%%", "create.gui.sequenced_gearshift.title": "シーケンスギアシフト", "create.gui.sequenced_gearshift.instruction": "命令", "create.gui.sequenced_gearshift.instruction.turn_angle": "回転", @@ -689,7 +686,8 @@ "create.schematicAndQuill.secondPos": "2番目の位置セット。", "create.schematicAndQuill.noTarget": "[Ctrl] を押したままで空気ブロックを選択します", "create.schematicAndQuill.abort": "選択を削除しました。", - "create.schematicAndQuill.prompt": "概略図の名前を入力してください:", + "create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:", + "create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately", "create.schematicAndQuill.fallbackName": "My Schematic", "create.schematicAndQuill.saved": "%1$s として保存しました", @@ -740,24 +738,29 @@ "create.schematics.maxAllowedSize": "最大許容概略図ファイルサイズは:", "create.gui.schematicTable.title": "概略図テーブル", + "create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files", + "create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder", "create.gui.schematicTable.availableSchematics": "利用可能な概略図", "create.gui.schematicTable.noSchematics": "保存された概略図はありません", "create.gui.schematicTable.uploading": "アップロードしています...", "create.gui.schematicTable.finished": "アップロードが完了しました!", "create.gui.schematicannon.title": "概略図砲", - "create.gui.schematicannon.settingsTitle": "配置設定", "create.gui.schematicannon.listPrinter": "材料リストプリンター", "create.gui.schematicannon.gunpowderLevel": "火薬はあと %1$s%% 残っています", "create.gui.schematicannon.shotsRemaining": "残りのショット数: %1$s", "create.gui.schematicannon.shotsRemainingWithBackup": "バックアップあり: %1$s", "create.gui.schematicannon.optionEnabled": "現在有効", "create.gui.schematicannon.optionDisabled": "現在無効", + "create.gui.schematicannon.showOptions": "UNLOCALIZED: Show Printer Settings", "create.gui.schematicannon.option.dontReplaceSolid": "固体ブロックを置き換えない", "create.gui.schematicannon.option.replaceWithSolid": "固体を固体に置き換える", "create.gui.schematicannon.option.replaceWithAny": "固体を任意のものに置き換える", "create.gui.schematicannon.option.replaceWithEmpty": "空の固体と交換", "create.gui.schematicannon.option.skipMissing": "不足しているブロックをスキップ", "create.gui.schematicannon.option.skipTileEntities": "タイルエンティティを保護する", + "create.gui.schematicannon.slot.gunpowder": "UNLOCALIZED: Add gunpowder to fuel the cannon", + "create.gui.schematicannon.slot.listPrinter": "UNLOCALIZED: Place books here to print a Checklist for your Schematic", + "create.gui.schematicannon.slot.schematic": "UNLOCALIZED: Add your Schematic here. Make sure it is deployed at a specific location.", "create.gui.schematicannon.option.skipMissing.description": "大砲が配置に必要なブロックを見つけられない場合、次の場所に進みます。", "create.gui.schematicannon.option.skipTileEntities.description": "大砲は、チェストなどのデータ保持ブロックの交換を回避します。", "create.gui.schematicannon.option.dontReplaceSolid.description": "大砲は、その作業領域の固体ブロックを置き換えることはなく、非固体と空気のみを置き換えます。", @@ -793,23 +796,42 @@ "create.gui.filter.ignore_data.description": "アイテムは属性に関係なく一致します。", "create.item_attributes.placeable": "設置可能か", + "create.item_attributes.placeable.inverted": "UNLOCALIZED: is not placeable", "create.item_attributes.consumable": "食べられるか", + "create.item_attributes.consumable.inverted": "UNLOCALIZED: cannot be eaten", "create.item_attributes.smeltable": "精錬可能か", + "create.item_attributes.smeltable.inverted": "UNLOCALIZED: cannot be Smelted", "create.item_attributes.washable": "洗えるか", + "create.item_attributes.washable.inverted": "UNLOCALIZED: cannot be Washed", "create.item_attributes.smokable": "燻製可能か", + "create.item_attributes.smokable.inverted": "UNLOCALIZED: cannot be Smoked", + "create.item_attributes.crushable": "UNLOCALIZED: can be Crushed", + "create.item_attributes.crushable.inverted": "UNLOCALIZED: cannot be Crushed", "create.item_attributes.blastable": "高炉で製錬可能か", + "create.item_attributes.blastable.inverted": "UNLOCALIZED: is not smeltable in Blast Furnace", "create.item_attributes.enchanted": "エンチャント済みか", + "create.item_attributes.enchanted.inverted": "UNLOCALIZED: is unenchanted", "create.item_attributes.damaged": "破損してるか", + "create.item_attributes.damaged.inverted": "UNLOCALIZED: is not damaged", "create.item_attributes.badly_damaged": "ひどく損傷してるか", + "create.item_attributes.badly_damaged.inverted": "UNLOCALIZED: is not heavily damaged", "create.item_attributes.not_stackable": "スタック可能か", + "create.item_attributes.not_stackable.inverted": "UNLOCALIZED: can be stacked", "create.item_attributes.equipable": "装備可能か", + "create.item_attributes.equipable.inverted": "UNLOCALIZED: cannot be equipped", "create.item_attributes.furnace_fuel": "かまどの燃料か", + "create.item_attributes.furnace_fuel.inverted": "UNLOCALIZED: is not furnace fuel", "create.item_attributes.in_tag": "%1$s のタグが付けられてるか", + "create.item_attributes.in_tag.inverted": "UNLOCALIZED: is not tagged %1$s", "create.item_attributes.in_item_group": "%1$s に属してるか", + "create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'", "create.item_attributes.added_by": "%1$s によって追加されたか", + "create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s", "create.gui.attribute_filter.no_selected_attributes": "属性が選択されていません", "create.gui.attribute_filter.selected_attributes": "選択された属性:", + "create.gui.attribute_filter.add_attribute": "UNLOCALIZED: Add attribute to List", + "create.gui.attribute_filter.add_inverted_attribute": "UNLOCALIZED: Add opposite attribute to List", "create.gui.attribute_filter.whitelist_disjunctive": "ホワイトリスト(どれか)", "create.gui.attribute_filter.whitelist_disjunctive.description": "選択した属性のいずれかを持っている場合、アイテムは通り抜けます。", "create.gui.attribute_filter.whitelist_conjunctive": "ホワイトリスト(全て)", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index 0acc022b0..6d0bdcaef 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 415", + "_": "Missing Localizations: 445", "_": "->------------------------] Game Elements [------------------------<-", @@ -663,12 +663,9 @@ "create.gui.adjustable_crate.title": "가변 창고 ", "create.gui.adjustable_crate.storageSpace": "저장 공간", "create.gui.stockpile_switch.title": "수량 스위치", - "create.gui.stockpile_switch.lowerLimit": "최소 신호 유지수량", - "create.gui.stockpile_switch.upperLimit": "최초 신호 발동수량", - "create.gui.stockpile_switch.startAt": "다음 수량에 신호 주기", - "create.gui.stockpile_switch.startAbove": "다음 수량이상일떄 신호 주기", - "create.gui.stockpile_switch.stopAt": "다음 수량에 신호 멈추기", - "create.gui.stockpile_switch.stopBelow": "다음 수량이하일때 신호 멈추기", + "create.gui.stockpile_switch.invert_signal": "UNLOCALIZED: Invert Signal", + "create.gui.stockpile_switch.move_to_lower_at": "UNLOCALIZED: Move to lower lane at %1$s%%", + "create.gui.stockpile_switch.move_to_upper_at": "UNLOCALIZED: Move to upper lane at %1$s%%", "create.gui.sequenced_gearshift.title": "순서 기어쉬프트", "create.gui.sequenced_gearshift.instruction": "설명", "create.gui.sequenced_gearshift.instruction.turn_angle": "회전", @@ -689,7 +686,8 @@ "create.schematicAndQuill.secondPos": "두번째 위치 지정됨.", "create.schematicAndQuill.noTarget": "[Ctrl]을 눌러 공기 블럭을 선택하기.", "create.schematicAndQuill.abort": "위치 제거됨.", - "create.schematicAndQuill.prompt": "청사진의 제목을 작성하기:", + "create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:", + "create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately", "create.schematicAndQuill.fallbackName": "내 청사진", "create.schematicAndQuill.saved": "%1$s로 저장됨", @@ -740,24 +738,29 @@ "create.schematics.maxAllowedSize": "최대 청사진 파일 크기는:", "create.gui.schematicTable.title": "청사진 테이블", + "create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files", + "create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder", "create.gui.schematicTable.availableSchematics": "이용가능한 청사진", "create.gui.schematicTable.noSchematics": "저장된 청사진 없음", "create.gui.schematicTable.uploading": "업로딩 중...", "create.gui.schematicTable.finished": "업로드 완료!", "create.gui.schematicannon.title": "청사진 대포", - "create.gui.schematicannon.settingsTitle": "설치 설정", "create.gui.schematicannon.listPrinter": "재료 목록 프린터", "create.gui.schematicannon.gunpowderLevel": "화약 용량 %1$s%%", "create.gui.schematicannon.shotsRemaining": "남은 발포 수 : %1$s", "create.gui.schematicannon.shotsRemainingWithBackup": "화약 여분: %1$s", "create.gui.schematicannon.optionEnabled": "현재 활성화 됨", "create.gui.schematicannon.optionDisabled": "현재 비활성화 됨", + "create.gui.schematicannon.showOptions": "UNLOCALIZED: Show Printer Settings", "create.gui.schematicannon.option.dontReplaceSolid": "온전한 블럭을 대체하지 않음", "create.gui.schematicannon.option.replaceWithSolid": "온전한 블럭을 재료로 대체함", "create.gui.schematicannon.option.replaceWithAny": "온전한 블럭을 아무 재료로 대체함", "create.gui.schematicannon.option.replaceWithEmpty": "온전한 블럭을 공기로 채움", "create.gui.schematicannon.option.skipMissing": "부족한 블럭을 무시하고 진행", "create.gui.schematicannon.option.skipTileEntities": "타일 엔티티를 보호", + "create.gui.schematicannon.slot.gunpowder": "UNLOCALIZED: Add gunpowder to fuel the cannon", + "create.gui.schematicannon.slot.listPrinter": "UNLOCALIZED: Place books here to print a Checklist for your Schematic", + "create.gui.schematicannon.slot.schematic": "UNLOCALIZED: Add your Schematic here. Make sure it is deployed at a specific location.", "create.gui.schematicannon.option.skipMissing.description": "만약 대포가 설치에 필요한 블럭을 찾지 못할 경우,건너뛰고 다음 블럭 설치를 진행합니다.", "create.gui.schematicannon.option.skipTileEntities.description": "대포가 상세정보가 든 상자같은 타일 엔티티 설치를 무시합니다.", "create.gui.schematicannon.option.dontReplaceSolid.description": "대포가 작업구역의 온전한 블럭을 대체하지 않습니다.", @@ -793,23 +796,42 @@ "create.gui.filter.ignore_data.description": "상세정보와 상관없이 아이템 종류만 일치한다면 통과시킵니다.", "create.item_attributes.placeable": "설치할 수 있음", + "create.item_attributes.placeable.inverted": "UNLOCALIZED: is not placeable", "create.item_attributes.consumable": "먹을 수 있음", + "create.item_attributes.consumable.inverted": "UNLOCALIZED: cannot be eaten", "create.item_attributes.smeltable": "구워질 수 있음", + "create.item_attributes.smeltable.inverted": "UNLOCALIZED: cannot be Smelted", "create.item_attributes.washable": "세척될 수 있음", + "create.item_attributes.washable.inverted": "UNLOCALIZED: cannot be Washed", "create.item_attributes.smokable": "훈연될 수 있음", + "create.item_attributes.smokable.inverted": "UNLOCALIZED: cannot be Smoked", + "create.item_attributes.crushable": "UNLOCALIZED: can be Crushed", + "create.item_attributes.crushable.inverted": "UNLOCALIZED: cannot be Crushed", "create.item_attributes.blastable": "용광로에 녹일 수 있음", + "create.item_attributes.blastable.inverted": "UNLOCALIZED: is not smeltable in Blast Furnace", "create.item_attributes.enchanted": "마법부여됨", + "create.item_attributes.enchanted.inverted": "UNLOCALIZED: is unenchanted", "create.item_attributes.damaged": "내구도가 닮", + "create.item_attributes.damaged.inverted": "UNLOCALIZED: is not damaged", "create.item_attributes.badly_damaged": "심각하게 내구도가 닮", + "create.item_attributes.badly_damaged.inverted": "UNLOCALIZED: is not heavily damaged", "create.item_attributes.not_stackable": "겹쳐질 수 없음", + "create.item_attributes.not_stackable.inverted": "UNLOCALIZED: can be stacked", "create.item_attributes.equipable": "장착할 수 있음", + "create.item_attributes.equipable.inverted": "UNLOCALIZED: cannot be equipped", "create.item_attributes.furnace_fuel": "화로 연료로 쓸 수 있음", + "create.item_attributes.furnace_fuel.inverted": "UNLOCALIZED: is not furnace fuel", "create.item_attributes.in_tag": "%1$s로 등록됨", + "create.item_attributes.in_tag.inverted": "UNLOCALIZED: is not tagged %1$s", "create.item_attributes.in_item_group": "%1$s탭에 속함", + "create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'", "create.item_attributes.added_by": "%1$s가 추가함", + "create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s", "create.gui.attribute_filter.no_selected_attributes": "속성이 선택되지 않음", "create.gui.attribute_filter.selected_attributes": "선택된 속성:", + "create.gui.attribute_filter.add_attribute": "UNLOCALIZED: Add attribute to List", + "create.gui.attribute_filter.add_inverted_attribute": "UNLOCALIZED: Add opposite attribute to List", "create.gui.attribute_filter.whitelist_disjunctive": "화이트리스트 (최소)", "create.gui.attribute_filter.whitelist_disjunctive.description": "아이템이 선택된 속성 중 하나라도 가지고 있다면 통과시킵니다.", "create.gui.attribute_filter.whitelist_conjunctive": "화이트리스트 (모두)", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index 876604dd5..360c1c3cd 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 745", + "_": "Missing Localizations: 775", "_": "->------------------------] Game Elements [------------------------<-", @@ -663,12 +663,9 @@ "create.gui.adjustable_crate.title": "FlexKrat", "create.gui.adjustable_crate.storageSpace": "Opslagruimte", "create.gui.stockpile_switch.title": "Voorraad Schakelaar", - "create.gui.stockpile_switch.lowerLimit": "Lagere drempel", - "create.gui.stockpile_switch.upperLimit": "Hogere drempel", - "create.gui.stockpile_switch.startAt": "Start Signaal op", - "create.gui.stockpile_switch.startAbove": "Start Signaal boven", - "create.gui.stockpile_switch.stopAt": "Stop Signaal op", - "create.gui.stockpile_switch.stopBelow": "Stop Signaal onder", + "create.gui.stockpile_switch.invert_signal": "UNLOCALIZED: Invert Signal", + "create.gui.stockpile_switch.move_to_lower_at": "UNLOCALIZED: Move to lower lane at %1$s%%", + "create.gui.stockpile_switch.move_to_upper_at": "UNLOCALIZED: Move to upper lane at %1$s%%", "create.gui.sequenced_gearshift.title": "UNLOCALIZED: Sequenced Gearshift", "create.gui.sequenced_gearshift.instruction": "UNLOCALIZED: Instruction", "create.gui.sequenced_gearshift.instruction.turn_angle": "UNLOCALIZED: Turn", @@ -689,7 +686,8 @@ "create.schematicAndQuill.secondPos": "Tweede positie ingesteld.", "create.schematicAndQuill.noTarget": "Houd [Ctrl] ingedrukt om een Lucht block te kiezen.", "create.schematicAndQuill.abort": "Keuze verwijderd.", - "create.schematicAndQuill.prompt": "Vul een naam in voor de bouwtekening:", + "create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:", + "create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately", "create.schematicAndQuill.fallbackName": "Mijn Bouwtekening", "create.schematicAndQuill.saved": "Opgeslagen als %1$s", @@ -740,24 +738,29 @@ "create.schematics.maxAllowedSize": "De maximum toegestane grote van een Bouwtekings bestand is:", "create.gui.schematicTable.title": "Bouwtekening Tafel", + "create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files", + "create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder", "create.gui.schematicTable.availableSchematics": "Beschikbare Bouwtekeningen", "create.gui.schematicTable.noSchematics": "Geen Bouwtekeningen opgeslagen", "create.gui.schematicTable.uploading": "Uploaden...", "create.gui.schematicTable.finished": "Upload Klaar!", "create.gui.schematicannon.title": "Bouwtekeningkannon", - "create.gui.schematicannon.settingsTitle": "Plaatsing Instellingen", "create.gui.schematicannon.listPrinter": "Materiaal lijst Printer", "create.gui.schematicannon.gunpowderLevel": "Buskruit op %1$s%%", "create.gui.schematicannon.shotsRemaining": "Schoten over: %1$s", "create.gui.schematicannon.shotsRemainingWithBackup": "Met backup: %1$s", "create.gui.schematicannon.optionEnabled": "Momenteel Ingeschakeld", "create.gui.schematicannon.optionDisabled": "Momenteel Uitgeschakeld", + "create.gui.schematicannon.showOptions": "UNLOCALIZED: Show Printer Settings", "create.gui.schematicannon.option.dontReplaceSolid": "Niet vaste blokken vervangen", "create.gui.schematicannon.option.replaceWithSolid": "Vervang vast met vast", "create.gui.schematicannon.option.replaceWithAny": "Vervang vast met alles", "create.gui.schematicannon.option.replaceWithEmpty": "Vervang vast met leeg", "create.gui.schematicannon.option.skipMissing": "Sla missende blokken over", "create.gui.schematicannon.option.skipTileEntities": "Bescherm Tile Entities", + "create.gui.schematicannon.slot.gunpowder": "UNLOCALIZED: Add gunpowder to fuel the cannon", + "create.gui.schematicannon.slot.listPrinter": "UNLOCALIZED: Place books here to print a Checklist for your Schematic", + "create.gui.schematicannon.slot.schematic": "UNLOCALIZED: Add your Schematic here. Make sure it is deployed at a specific location.", "create.gui.schematicannon.option.skipMissing.description": "Als het Bouwtekeningkannon niet een geschikt blok kan vinden om te plaatsen gaat hij door bij de volgende locatie.", "create.gui.schematicannon.option.skipTileEntities.description": "Het Bouwtekeningkannon probeert blokken met data zoals kisten te vermijden", "create.gui.schematicannon.option.dontReplaceSolid.description": "Het Bouwtekeningkannon zal nooit vaste blokken in zijn gebied vervangen, alleen niet-vaste blokken en lucht", @@ -793,23 +796,42 @@ "create.gui.filter.ignore_data.description": "UNLOCALIZED: Items match regardless of their attributes.", "create.item_attributes.placeable": "UNLOCALIZED: is placeable", + "create.item_attributes.placeable.inverted": "UNLOCALIZED: is not placeable", "create.item_attributes.consumable": "UNLOCALIZED: can be eaten", + "create.item_attributes.consumable.inverted": "UNLOCALIZED: cannot be eaten", "create.item_attributes.smeltable": "UNLOCALIZED: can be Smelted", + "create.item_attributes.smeltable.inverted": "UNLOCALIZED: cannot be Smelted", "create.item_attributes.washable": "UNLOCALIZED: can be Washed", + "create.item_attributes.washable.inverted": "UNLOCALIZED: cannot be Washed", "create.item_attributes.smokable": "UNLOCALIZED: can be Smoked", + "create.item_attributes.smokable.inverted": "UNLOCALIZED: cannot be Smoked", + "create.item_attributes.crushable": "UNLOCALIZED: can be Crushed", + "create.item_attributes.crushable.inverted": "UNLOCALIZED: cannot be Crushed", "create.item_attributes.blastable": "UNLOCALIZED: is smeltable in Blast Furnace", + "create.item_attributes.blastable.inverted": "UNLOCALIZED: is not smeltable in Blast Furnace", "create.item_attributes.enchanted": "UNLOCALIZED: is enchanted", + "create.item_attributes.enchanted.inverted": "UNLOCALIZED: is unenchanted", "create.item_attributes.damaged": "UNLOCALIZED: is damaged", + "create.item_attributes.damaged.inverted": "UNLOCALIZED: is not damaged", "create.item_attributes.badly_damaged": "UNLOCALIZED: is heavily damaged", + "create.item_attributes.badly_damaged.inverted": "UNLOCALIZED: is not heavily damaged", "create.item_attributes.not_stackable": "UNLOCALIZED: cannot stack", + "create.item_attributes.not_stackable.inverted": "UNLOCALIZED: can be stacked", "create.item_attributes.equipable": "UNLOCALIZED: can be equipped", + "create.item_attributes.equipable.inverted": "UNLOCALIZED: cannot be equipped", "create.item_attributes.furnace_fuel": "UNLOCALIZED: is furnace fuel", + "create.item_attributes.furnace_fuel.inverted": "UNLOCALIZED: is not furnace fuel", "create.item_attributes.in_tag": "UNLOCALIZED: is tagged %1$s", - "create.item_attributes.in_item_group": "UNLOCALIZED: belongs to %1$s", + "create.item_attributes.in_tag.inverted": "UNLOCALIZED: is not tagged %1$s", + "create.item_attributes.in_item_group": "UNLOCALIZED: is in group '%1$s'", + "create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'", "create.item_attributes.added_by": "UNLOCALIZED: was added by %1$s", + "create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s", "create.gui.attribute_filter.no_selected_attributes": "UNLOCALIZED: No attributes selected", "create.gui.attribute_filter.selected_attributes": "UNLOCALIZED: Selected attributes:", + "create.gui.attribute_filter.add_attribute": "UNLOCALIZED: Add attribute to List", + "create.gui.attribute_filter.add_inverted_attribute": "UNLOCALIZED: Add opposite attribute to List", "create.gui.attribute_filter.whitelist_disjunctive": "UNLOCALIZED: Whitelist (Any)", "create.gui.attribute_filter.whitelist_disjunctive.description": "UNLOCALIZED: Items pass if they have any of the selected attributes.", "create.gui.attribute_filter.whitelist_conjunctive": "UNLOCALIZED: Whitelist (All)", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index a83331be0..0c27d8261 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 814", + "_": "Missing Localizations: 844", "_": "->------------------------] Game Elements [------------------------<-", @@ -663,12 +663,9 @@ "create.gui.adjustable_crate.title": "adjustable_crate", "create.gui.adjustable_crate.storageSpace": "Espaço de Armazenamento", "create.gui.stockpile_switch.title": "Disjuntor de Armazenamento", - "create.gui.stockpile_switch.lowerLimit": "Limite Mínimo", - "create.gui.stockpile_switch.upperLimit": "Limite Máximo", - "create.gui.stockpile_switch.startAt": "Iniciar Sinal em", - "create.gui.stockpile_switch.startAbove": "Iniciar Sinal acima de", - "create.gui.stockpile_switch.stopAt": "Parar Sinal em", - "create.gui.stockpile_switch.stopBelow": "Parar Sinal abaixo de", + "create.gui.stockpile_switch.invert_signal": "UNLOCALIZED: Invert Signal", + "create.gui.stockpile_switch.move_to_lower_at": "UNLOCALIZED: Move to lower lane at %1$s%%", + "create.gui.stockpile_switch.move_to_upper_at": "UNLOCALIZED: Move to upper lane at %1$s%%", "create.gui.sequenced_gearshift.title": "UNLOCALIZED: Sequenced Gearshift", "create.gui.sequenced_gearshift.instruction": "UNLOCALIZED: Instruction", "create.gui.sequenced_gearshift.instruction.turn_angle": "UNLOCALIZED: Turn", @@ -689,7 +686,8 @@ "create.schematicAndQuill.secondPos": "Segunda posição feita.", "create.schematicAndQuill.noTarget": "Seguro [Ctrl] para selecionar Blocos de Ar.", "create.schematicAndQuill.abort": "Seleção removida.", - "create.schematicAndQuill.prompt": "Informe um nome para o Esquema:", + "create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:", + "create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately", "create.schematicAndQuill.fallbackName": "Meu Esquema", "create.schematicAndQuill.saved": "Salvo como %1$s", @@ -740,24 +738,29 @@ "create.schematics.maxAllowedSize": "O tamanho máximo permitido para o esquema é:", "create.gui.schematicTable.title": "Mesa de Desenho", + "create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files", + "create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder", "create.gui.schematicTable.availableSchematics": "UNLOCALIZED: Available Schematics", "create.gui.schematicTable.noSchematics": "UNLOCALIZED: No Schematics Saved", "create.gui.schematicTable.uploading": "Importando...", "create.gui.schematicTable.finished": "Envio Concluído!", "create.gui.schematicannon.title": "Esquemaannon", - "create.gui.schematicannon.settingsTitle": "Parâmetros de Posicionamento", "create.gui.schematicannon.listPrinter": "Impressora de Lista de Materiais", "create.gui.schematicannon.gunpowderLevel": "Pólvora em %1$s%%", "create.gui.schematicannon.shotsRemaining": "Disparos faltantes: %1$s", "create.gui.schematicannon.shotsRemainingWithBackup": "Com backup: %1$s", "create.gui.schematicannon.optionEnabled": "Habilitado Atualmente", "create.gui.schematicannon.optionDisabled": "Desabilitado Atualmente", + "create.gui.schematicannon.showOptions": "UNLOCALIZED: Show Printer Settings", "create.gui.schematicannon.option.dontReplaceSolid": "Não Substituir Blocos Sólidos", "create.gui.schematicannon.option.replaceWithSolid": "Substituir Blocos Sólidos", "create.gui.schematicannon.option.replaceWithAny": "Substituir Sólidos com Qualquer", "create.gui.schematicannon.option.replaceWithEmpty": "Substituir Sólidos com Vazio", "create.gui.schematicannon.option.skipMissing": "Pulando Blocos faltantes", "create.gui.schematicannon.option.skipTileEntities": "Proteger Entidades Entalhadas", + "create.gui.schematicannon.slot.gunpowder": "UNLOCALIZED: Add gunpowder to fuel the cannon", + "create.gui.schematicannon.slot.listPrinter": "UNLOCALIZED: Place books here to print a Checklist for your Schematic", + "create.gui.schematicannon.slot.schematic": "UNLOCALIZED: Add your Schematic here. Make sure it is deployed at a specific location.", "create.gui.schematicannon.option.skipMissing.description": "Se o Esquemaannon não encontrar o Bloco para colocar, ele irá continuar para a próx. Posição.", "create.gui.schematicannon.option.skipTileEntities.description": "O Esquemaannon vai evitar substituir blocos que contêm dados como Baus.", "create.gui.schematicannon.option.dontReplaceSolid.description": "O canhão irá nunca substituir Blocos sólidos na área em trabalho, apenas não-Sólidos e Ar.", @@ -793,23 +796,42 @@ "create.gui.filter.ignore_data.description": "UNLOCALIZED: Items match regardless of their attributes.", "create.item_attributes.placeable": "UNLOCALIZED: is placeable", + "create.item_attributes.placeable.inverted": "UNLOCALIZED: is not placeable", "create.item_attributes.consumable": "UNLOCALIZED: can be eaten", + "create.item_attributes.consumable.inverted": "UNLOCALIZED: cannot be eaten", "create.item_attributes.smeltable": "UNLOCALIZED: can be Smelted", + "create.item_attributes.smeltable.inverted": "UNLOCALIZED: cannot be Smelted", "create.item_attributes.washable": "UNLOCALIZED: can be Washed", + "create.item_attributes.washable.inverted": "UNLOCALIZED: cannot be Washed", "create.item_attributes.smokable": "UNLOCALIZED: can be Smoked", + "create.item_attributes.smokable.inverted": "UNLOCALIZED: cannot be Smoked", + "create.item_attributes.crushable": "UNLOCALIZED: can be Crushed", + "create.item_attributes.crushable.inverted": "UNLOCALIZED: cannot be Crushed", "create.item_attributes.blastable": "UNLOCALIZED: is smeltable in Blast Furnace", + "create.item_attributes.blastable.inverted": "UNLOCALIZED: is not smeltable in Blast Furnace", "create.item_attributes.enchanted": "UNLOCALIZED: is enchanted", + "create.item_attributes.enchanted.inverted": "UNLOCALIZED: is unenchanted", "create.item_attributes.damaged": "UNLOCALIZED: is damaged", + "create.item_attributes.damaged.inverted": "UNLOCALIZED: is not damaged", "create.item_attributes.badly_damaged": "UNLOCALIZED: is heavily damaged", + "create.item_attributes.badly_damaged.inverted": "UNLOCALIZED: is not heavily damaged", "create.item_attributes.not_stackable": "UNLOCALIZED: cannot stack", + "create.item_attributes.not_stackable.inverted": "UNLOCALIZED: can be stacked", "create.item_attributes.equipable": "UNLOCALIZED: can be equipped", + "create.item_attributes.equipable.inverted": "UNLOCALIZED: cannot be equipped", "create.item_attributes.furnace_fuel": "UNLOCALIZED: is furnace fuel", + "create.item_attributes.furnace_fuel.inverted": "UNLOCALIZED: is not furnace fuel", "create.item_attributes.in_tag": "UNLOCALIZED: is tagged %1$s", - "create.item_attributes.in_item_group": "UNLOCALIZED: belongs to %1$s", + "create.item_attributes.in_tag.inverted": "UNLOCALIZED: is not tagged %1$s", + "create.item_attributes.in_item_group": "UNLOCALIZED: is in group '%1$s'", + "create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'", "create.item_attributes.added_by": "UNLOCALIZED: was added by %1$s", + "create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s", "create.gui.attribute_filter.no_selected_attributes": "UNLOCALIZED: No attributes selected", "create.gui.attribute_filter.selected_attributes": "UNLOCALIZED: Selected attributes:", + "create.gui.attribute_filter.add_attribute": "UNLOCALIZED: Add attribute to List", + "create.gui.attribute_filter.add_inverted_attribute": "UNLOCALIZED: Add opposite attribute to List", "create.gui.attribute_filter.whitelist_disjunctive": "UNLOCALIZED: Whitelist (Any)", "create.gui.attribute_filter.whitelist_disjunctive.description": "UNLOCALIZED: Items pass if they have any of the selected attributes.", "create.gui.attribute_filter.whitelist_conjunctive": "UNLOCALIZED: Whitelist (All)", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index 6844d5fea..f40209113 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 808", + "_": "Missing Localizations: 838", "_": "->------------------------] Game Elements [------------------------<-", @@ -663,12 +663,9 @@ "create.gui.adjustable_crate.title": "Гибкий ящик", "create.gui.adjustable_crate.storageSpace": "Обьём хранилища", "create.gui.stockpile_switch.title": "Сенсор хранилища", - "create.gui.stockpile_switch.lowerLimit": "Нижний порог", - "create.gui.stockpile_switch.upperLimit": "Верхний порог", - "create.gui.stockpile_switch.startAt": "Включить на", - "create.gui.stockpile_switch.startAbove": "Включить выше", - "create.gui.stockpile_switch.stopAt": "Отключить на", - "create.gui.stockpile_switch.stopBelow": "Отключить ниже", + "create.gui.stockpile_switch.invert_signal": "UNLOCALIZED: Invert Signal", + "create.gui.stockpile_switch.move_to_lower_at": "UNLOCALIZED: Move to lower lane at %1$s%%", + "create.gui.stockpile_switch.move_to_upper_at": "UNLOCALIZED: Move to upper lane at %1$s%%", "create.gui.sequenced_gearshift.title": "UNLOCALIZED: Sequenced Gearshift", "create.gui.sequenced_gearshift.instruction": "UNLOCALIZED: Instruction", "create.gui.sequenced_gearshift.instruction.turn_angle": "UNLOCALIZED: Turn", @@ -689,7 +686,8 @@ "create.schematicAndQuill.secondPos": "Вторая позиция установлена.", "create.schematicAndQuill.noTarget": "Зажмите [Ctrl], чтобы выделять блоки воздуха.", "create.schematicAndQuill.abort": "Выделение удалено.", - "create.schematicAndQuill.prompt": "Введите название для новой схемы:", + "create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:", + "create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately", "create.schematicAndQuill.fallbackName": "Моя схема", "create.schematicAndQuill.saved": "Сохранено как %1$s", @@ -740,24 +738,29 @@ "create.schematics.maxAllowedSize": "Максимальный размер файла схемы:", "create.gui.schematicTable.title": "Стол для схем", + "create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files", + "create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder", "create.gui.schematicTable.availableSchematics": "Доступные схемы", "create.gui.schematicTable.noSchematics": "Нет сохранённых схем", "create.gui.schematicTable.uploading": "Загрузка...", "create.gui.schematicTable.finished": "Загрузка завершена!", "create.gui.schematicannon.title": "Схемопушка", - "create.gui.schematicannon.settingsTitle": "Параметры размещения", "create.gui.schematicannon.listPrinter": "Распечатать список материалов", "create.gui.schematicannon.gunpowderLevel": "Порох: %1$s%%", "create.gui.schematicannon.shotsRemaining": "Выстрелов осталось: %1$s", "create.gui.schematicannon.shotsRemainingWithBackup": "C запасом: %1$s", "create.gui.schematicannon.optionEnabled": "Включена", "create.gui.schematicannon.optionDisabled": "Отключена", + "create.gui.schematicannon.showOptions": "UNLOCALIZED: Show Printer Settings", "create.gui.schematicannon.option.dontReplaceSolid": "Не заменять целые блоки", "create.gui.schematicannon.option.replaceWithSolid": "Заменять целые блоки целыми блоками", "create.gui.schematicannon.option.replaceWithAny": "Заменять целые блоки чем угодно", "create.gui.schematicannon.option.replaceWithEmpty": "Заменять целые блоки пустотой", "create.gui.schematicannon.option.skipMissing": "Пропускать отсутствующие блоки", "create.gui.schematicannon.option.skipTileEntities": "Защита от сущностей", + "create.gui.schematicannon.slot.gunpowder": "UNLOCALIZED: Add gunpowder to fuel the cannon", + "create.gui.schematicannon.slot.listPrinter": "UNLOCALIZED: Place books here to print a Checklist for your Schematic", + "create.gui.schematicannon.slot.schematic": "UNLOCALIZED: Add your Schematic here. Make sure it is deployed at a specific location.", "create.gui.schematicannon.option.skipMissing.description": "Если схемопушка не найдёт нужный блок, то она продолжит в следующем месте.", "create.gui.schematicannon.option.skipTileEntities.description": "Схемопушка будет избегать замены блоков с данными, например сундуки.", "create.gui.schematicannon.option.dontReplaceSolid.description": "Схемопушка никогда не заменит целые блоки, только не целые и воздух.", @@ -793,23 +796,42 @@ "create.gui.filter.ignore_data.description": "UNLOCALIZED: Items match regardless of their attributes.", "create.item_attributes.placeable": "UNLOCALIZED: is placeable", + "create.item_attributes.placeable.inverted": "UNLOCALIZED: is not placeable", "create.item_attributes.consumable": "UNLOCALIZED: can be eaten", + "create.item_attributes.consumable.inverted": "UNLOCALIZED: cannot be eaten", "create.item_attributes.smeltable": "UNLOCALIZED: can be Smelted", + "create.item_attributes.smeltable.inverted": "UNLOCALIZED: cannot be Smelted", "create.item_attributes.washable": "UNLOCALIZED: can be Washed", + "create.item_attributes.washable.inverted": "UNLOCALIZED: cannot be Washed", "create.item_attributes.smokable": "UNLOCALIZED: can be Smoked", + "create.item_attributes.smokable.inverted": "UNLOCALIZED: cannot be Smoked", + "create.item_attributes.crushable": "UNLOCALIZED: can be Crushed", + "create.item_attributes.crushable.inverted": "UNLOCALIZED: cannot be Crushed", "create.item_attributes.blastable": "UNLOCALIZED: is smeltable in Blast Furnace", + "create.item_attributes.blastable.inverted": "UNLOCALIZED: is not smeltable in Blast Furnace", "create.item_attributes.enchanted": "UNLOCALIZED: is enchanted", + "create.item_attributes.enchanted.inverted": "UNLOCALIZED: is unenchanted", "create.item_attributes.damaged": "UNLOCALIZED: is damaged", + "create.item_attributes.damaged.inverted": "UNLOCALIZED: is not damaged", "create.item_attributes.badly_damaged": "UNLOCALIZED: is heavily damaged", + "create.item_attributes.badly_damaged.inverted": "UNLOCALIZED: is not heavily damaged", "create.item_attributes.not_stackable": "UNLOCALIZED: cannot stack", + "create.item_attributes.not_stackable.inverted": "UNLOCALIZED: can be stacked", "create.item_attributes.equipable": "UNLOCALIZED: can be equipped", + "create.item_attributes.equipable.inverted": "UNLOCALIZED: cannot be equipped", "create.item_attributes.furnace_fuel": "UNLOCALIZED: is furnace fuel", + "create.item_attributes.furnace_fuel.inverted": "UNLOCALIZED: is not furnace fuel", "create.item_attributes.in_tag": "UNLOCALIZED: is tagged %1$s", - "create.item_attributes.in_item_group": "UNLOCALIZED: belongs to %1$s", + "create.item_attributes.in_tag.inverted": "UNLOCALIZED: is not tagged %1$s", + "create.item_attributes.in_item_group": "UNLOCALIZED: is in group '%1$s'", + "create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'", "create.item_attributes.added_by": "UNLOCALIZED: was added by %1$s", + "create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s", "create.gui.attribute_filter.no_selected_attributes": "UNLOCALIZED: No attributes selected", "create.gui.attribute_filter.selected_attributes": "UNLOCALIZED: Selected attributes:", + "create.gui.attribute_filter.add_attribute": "UNLOCALIZED: Add attribute to List", + "create.gui.attribute_filter.add_inverted_attribute": "UNLOCALIZED: Add opposite attribute to List", "create.gui.attribute_filter.whitelist_disjunctive": "UNLOCALIZED: Whitelist (Any)", "create.gui.attribute_filter.whitelist_disjunctive.description": "UNLOCALIZED: Items pass if they have any of the selected attributes.", "create.gui.attribute_filter.whitelist_conjunctive": "UNLOCALIZED: Whitelist (All)", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index 863fb68e4..0a76d10fe 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 95", + "_": "Missing Localizations: 125", "_": "->------------------------] Game Elements [------------------------<-", @@ -663,12 +663,9 @@ "create.gui.adjustable_crate.title": "板条箱", "create.gui.adjustable_crate.storageSpace": "储存空间", "create.gui.stockpile_switch.title": "储存开关", - "create.gui.stockpile_switch.lowerLimit": "阈值下限", - "create.gui.stockpile_switch.upperLimit": "阈值上限", - "create.gui.stockpile_switch.startAt": "启动信号", - "create.gui.stockpile_switch.startAbove": "给予红石信号当容量大于", - "create.gui.stockpile_switch.stopAt": "停止信号", - "create.gui.stockpile_switch.stopBelow": "停止红石信号当容量小于", + "create.gui.stockpile_switch.invert_signal": "UNLOCALIZED: Invert Signal", + "create.gui.stockpile_switch.move_to_lower_at": "UNLOCALIZED: Move to lower lane at %1$s%%", + "create.gui.stockpile_switch.move_to_upper_at": "UNLOCALIZED: Move to upper lane at %1$s%%", "create.gui.sequenced_gearshift.title": "可编程齿轮箱", "create.gui.sequenced_gearshift.instruction": "指令", "create.gui.sequenced_gearshift.instruction.turn_angle": "旋转", @@ -689,7 +686,8 @@ "create.schematicAndQuill.secondPos": "第二个位置.", "create.schematicAndQuill.noTarget": "按住Ctrl选择空气方块.", "create.schematicAndQuill.abort": "删除选择.", - "create.schematicAndQuill.prompt": "输入蓝图的名称:", + "create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:", + "create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately", "create.schematicAndQuill.fallbackName": "我的蓝图", "create.schematicAndQuill.saved": "另存为 %1$s", @@ -740,24 +738,29 @@ "create.schematics.maxAllowedSize": "允许的最大蓝图文件大小为:", "create.gui.schematicTable.title": "蓝图桌", + "create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files", + "create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder", "create.gui.schematicTable.availableSchematics": "可用蓝图", "create.gui.schematicTable.noSchematics": "没有保存的蓝图", "create.gui.schematicTable.uploading": "正在上传...", "create.gui.schematicTable.finished": "上传完成!", "create.gui.schematicannon.title": "蓝图加农炮", - "create.gui.schematicannon.settingsTitle": "放置设置", "create.gui.schematicannon.listPrinter": "物品清单打印机", "create.gui.schematicannon.gunpowderLevel": "火药 %1$s%%", "create.gui.schematicannon.shotsRemaining": "发射进度: %1$s", "create.gui.schematicannon.shotsRemainingWithBackup": "备份: %1$s", "create.gui.schematicannon.optionEnabled": "当前启用", "create.gui.schematicannon.optionDisabled": "当前禁用", + "create.gui.schematicannon.showOptions": "UNLOCALIZED: Show Printer Settings", "create.gui.schematicannon.option.dontReplaceSolid": "不要替换方块", "create.gui.schematicannon.option.replaceWithSolid": "用固体方块替换工作区域内的方块", "create.gui.schematicannon.option.replaceWithAny": "用任何方块替换工作区域内的方块", "create.gui.schematicannon.option.replaceWithEmpty": "用空气替换工作区域内的方块", "create.gui.schematicannon.option.skipMissing": "绕过缺少的方块", "create.gui.schematicannon.option.skipTileEntities": "保护存储方块", + "create.gui.schematicannon.slot.gunpowder": "UNLOCALIZED: Add gunpowder to fuel the cannon", + "create.gui.schematicannon.slot.listPrinter": "UNLOCALIZED: Place books here to print a Checklist for your Schematic", + "create.gui.schematicannon.slot.schematic": "UNLOCALIZED: Add your Schematic here. Make sure it is deployed at a specific location.", "create.gui.schematicannon.option.skipMissing.description": "如果缺失材料, 蓝图大炮将忽略当前缺失材料并且使用其他已有材料继续工作", "create.gui.schematicannon.option.skipTileEntities.description": "蓝图将避免更换存储方块,如箱子.", "create.gui.schematicannon.option.dontReplaceSolid.description": "蓝图加农炮将不会替换工作范围内的任何固体方块.", @@ -793,23 +796,42 @@ "create.gui.filter.ignore_data.description": "匹配时忽视物品的耐久、附魔等其他属性", "create.item_attributes.placeable": "可放置", + "create.item_attributes.placeable.inverted": "UNLOCALIZED: is not placeable", "create.item_attributes.consumable": "可食用", + "create.item_attributes.consumable.inverted": "UNLOCALIZED: cannot be eaten", "create.item_attributes.smeltable": "可被熔炉烧制", + "create.item_attributes.smeltable.inverted": "UNLOCALIZED: cannot be Smelted", "create.item_attributes.washable": "可被筛洗", + "create.item_attributes.washable.inverted": "UNLOCALIZED: cannot be Washed", "create.item_attributes.smokable": "可被烟熏", + "create.item_attributes.smokable.inverted": "UNLOCALIZED: cannot be Smoked", + "create.item_attributes.crushable": "UNLOCALIZED: can be Crushed", + "create.item_attributes.crushable.inverted": "UNLOCALIZED: cannot be Crushed", "create.item_attributes.blastable": "可被高炉冶炼", + "create.item_attributes.blastable.inverted": "UNLOCALIZED: is not smeltable in Blast Furnace", "create.item_attributes.enchanted": "已被附魔", + "create.item_attributes.enchanted.inverted": "UNLOCALIZED: is unenchanted", "create.item_attributes.damaged": "已损坏", + "create.item_attributes.damaged.inverted": "UNLOCALIZED: is not damaged", "create.item_attributes.badly_damaged": "严重受损", + "create.item_attributes.badly_damaged.inverted": "UNLOCALIZED: is not heavily damaged", "create.item_attributes.not_stackable": "无法堆叠", + "create.item_attributes.not_stackable.inverted": "UNLOCALIZED: can be stacked", "create.item_attributes.equipable": "可装备", + "create.item_attributes.equipable.inverted": "UNLOCALIZED: cannot be equipped", "create.item_attributes.furnace_fuel": "是燃料", + "create.item_attributes.furnace_fuel.inverted": "UNLOCALIZED: is not furnace fuel", "create.item_attributes.in_tag": "标签是%1$s", + "create.item_attributes.in_tag.inverted": "UNLOCALIZED: is not tagged %1$s", "create.item_attributes.in_item_group": "属于 %1$s", + "create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'", "create.item_attributes.added_by": "由%1$s添加", + "create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s", "create.gui.attribute_filter.no_selected_attributes": "没有标记任何属性", "create.gui.attribute_filter.selected_attributes": "已选择的属性:", + "create.gui.attribute_filter.add_attribute": "UNLOCALIZED: Add attribute to List", + "create.gui.attribute_filter.add_inverted_attribute": "UNLOCALIZED: Add opposite attribute to List", "create.gui.attribute_filter.whitelist_disjunctive": "任意匹配白名单 (任何)", "create.gui.attribute_filter.whitelist_disjunctive.description": "只要有其中一项属性符合,就可以通过", "create.gui.attribute_filter.whitelist_conjunctive": "全匹配白名单 (所有)", diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java index f77d9c5a1..a92bb9181 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java @@ -13,6 +13,7 @@ import com.simibubi.create.content.logistics.InWorldProcessing.Type; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.VecHelper; @@ -305,7 +306,7 @@ public class AirCurrent { InWorldProcessing.spawnParticlesForProcessing(world, handler.getWorldPositionOf(transported), processingType); if (world.isRemote) - return null; + return TransportedResult.doNothing(); return InWorldProcessing.applyProcessing(transported, world, processingType); }); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerTileEntity.java index 2638f75bf..4e98a97be 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerTileEntity.java @@ -10,9 +10,12 @@ import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.INamedIconOptions; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollOptionBehaviour; import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.VecHelper; +import net.minecraft.state.properties.RailShape; import net.minecraft.tileentity.TileEntityType; -import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.math.Vec3d; public class CartAssemblerTileEntity extends SmartTileEntity { private static final int assemblyCooldown = 8; @@ -24,11 +27,11 @@ public class CartAssemblerTileEntity extends SmartTileEntity { super(type); ticksSinceMinecartUpdate = assemblyCooldown; } - + @Override public void tick() { super.tick(); - if(ticksSinceMinecartUpdate < assemblyCooldown) { + if (ticksSinceMinecartUpdate < assemblyCooldown) { ticksSinceMinecartUpdate++; } } @@ -36,15 +39,36 @@ public class CartAssemblerTileEntity extends SmartTileEntity { @Override public void addBehaviours(List behaviours) { movementMode = new ScrollOptionBehaviour<>(CartMovementMode.class, - Lang.translate("contraptions.cart_movement_mode"), this, getMovementModeSlot()); + Lang.translate("contraptions.cart_movement_mode"), this, getMovementModeSlot()); movementMode.requiresWrench(); behaviours.add(movementMode); } protected ValueBoxTransform getMovementModeSlot() { - return new CenteredSideValueBoxTransform((state, d) -> d == Direction.UP); + return new CartAssemblerValueBoxTransform(); } + private class CartAssemblerValueBoxTransform extends CenteredSideValueBoxTransform { + + public CartAssemblerValueBoxTransform() { + super((state, d) -> { + if (d.getAxis() + .isVertical()) + return false; + if (!state.has(CartAssemblerBlock.RAIL_SHAPE)) + return false; + RailShape railShape = state.get(CartAssemblerBlock.RAIL_SHAPE); + return (d.getAxis() == Axis.X) == (railShape == RailShape.NORTH_SOUTH); + }); + } + + @Override + protected Vec3d getSouthLocation() { + return VecHelper.voxelSpace(8, 8, 18); + } + + } + public static enum CartMovementMode implements INamedIconOptions { ROTATE(AllIcons.I_CART_ROTATE), @@ -71,11 +95,11 @@ public class CartAssemblerTileEntity extends SmartTileEntity { return translationKey; } } - + public void resetTicksSinceMinecartUpdate() { ticksSinceMinecartUpdate = 0; } - + public boolean isMinecartUpdateValid() { return ticksSinceMinecartUpdate >= assemblyCooldown; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java index 9994c52ec..6365ac1ae 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java @@ -26,6 +26,11 @@ public class PulleyRenderer extends KineticTileEntityRenderer { public PulleyRenderer(TileEntityRendererDispatcher dispatcher) { super(dispatcher); } + + @Override + public boolean isGlobalRenderer(KineticTileEntity p_188185_1_) { + return true; + } @Override protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyTileEntity.java index 04d0e1e81..7e9fd847c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyTileEntity.java @@ -39,7 +39,7 @@ public class PulleyTileEntity extends LinearActuatorTileEntity { public double getMaxRenderDistanceSquared() { return super.getMaxRenderDistanceSquared() + offset * offset; } - + @Override protected void assemble() { if (!(world.getBlockState(pos) diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankBlock.java index 0b209bbbf..f761f9d5a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankBlock.java @@ -100,6 +100,9 @@ public class FluidTankBlock extends Block implements IWrenchable, ITE tankCapability = te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, ray.getFace()); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java index 8f6fc42a3..3341651f4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java @@ -141,5 +141,15 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock implemen public Class getTileEntityClass() { return SequencedGearshiftTileEntity.class; } + + @Override + public boolean hasComparatorInputOverride(BlockState p_149740_1_) { + return true; + } + + @Override + public int getComparatorInputOverride(BlockState state, World world, BlockPos pos) { + return state.get(STATE).intValue(); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftScreen.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftScreen.java index 0932fe187..500240631 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftScreen.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftScreen.java @@ -3,11 +3,15 @@ package com.simibubi.create.content.contraptions.relays.advanced.sequencer; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.AllGuiTextures; +import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.GuiGameElement; +import com.simibubi.create.foundation.gui.widgets.IconButton; import com.simibubi.create.foundation.gui.widgets.ScrollInput; import com.simibubi.create.foundation.gui.widgets.SelectionScrollInput; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.utility.Lang; + +import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; import net.minecraft.nbt.ListNBT; import net.minecraft.util.math.BlockPos; @@ -18,6 +22,7 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen { private final ItemStack renderedItem = AllBlocks.SEQUENCED_GEARSHIFT.asStack(); private final AllGuiTextures background = AllGuiTextures.SEQUENCER; + private IconButton confirmButton; private final String title = Lang.translate("gui.sequenced_gearshift.title"); private ListNBT compareTag; @@ -47,9 +52,9 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen { } public void initInputsOfRow(int row) { - int x = guiLeft + 28; - int y = guiTop + 29; - int rowHeight = 18; + int x = guiLeft + 30; + int y = guiTop + 18; + int rowHeight = 22; Vector rowInputs = inputs.get(row); rowInputs.forEach(widgets::remove); @@ -58,16 +63,16 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen { Instruction instruction = instructions.get(row); ScrollInput type = - new SelectionScrollInput(x, y + rowHeight * row, 50, 14).forOptions(SequencerInstructions.getOptions()) - .calling(state -> instructionUpdated(index, state)) - .setState(instruction.instruction.ordinal()) - .titled(Lang.translate("gui.sequenced_gearshift.instruction")); + new SelectionScrollInput(x, y + rowHeight * row, 50, 18).forOptions(SequencerInstructions.getOptions()) + .calling(state -> instructionUpdated(index, state)) + .setState(instruction.instruction.ordinal()) + .titled(Lang.translate("gui.sequenced_gearshift.instruction")); ScrollInput value = - new ScrollInput(x + 54, y + rowHeight * row, 30, 14).calling(state -> instruction.value = state); - ScrollInput direction = new SelectionScrollInput(x + 88, y + rowHeight * row, 18, 14) - .forOptions(InstructionSpeedModifiers.getOptions()) - .calling(state -> instruction.speedModifier = InstructionSpeedModifiers.values()[state]) - .titled(Lang.translate("gui.sequenced_gearshift.speed")); + new ScrollInput(x + 58, y + rowHeight * row, 28, 18).calling(state -> instruction.value = state); + ScrollInput direction = new SelectionScrollInput(x + 88, y + rowHeight * row, 28, 18) + .forOptions(InstructionSpeedModifiers.getOptions()) + .calling(state -> instruction.speedModifier = InstructionSpeedModifiers.values()[state]) + .titled(Lang.translate("gui.sequenced_gearshift.speed")); rowInputs.add(type); rowInputs.add(value); @@ -75,6 +80,10 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen { widgets.addAll(rowInputs); updateParamsOfRow(row); + + confirmButton = + new IconButton(guiLeft + background.width - 33, guiTop + background.height - 24, AllIcons.I_CONFIRM); + widgets.add(confirmButton); } public void updateParamsOfRow(int row) { @@ -88,10 +97,10 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen { value.active = value.visible = hasValue; if (hasValue) value.withRange(1, def.maxValue + 1) - .titled(Lang.translate(def.parameterKey)) - .withShiftStep(def.shiftStep) - .setState(instruction.value) - .onChanged(); + .titled(Lang.translate(def.parameterKey)) + .withShiftStep(def.shiftStep) + .setState(instruction.value) + .onChanged(); if (def == SequencerInstructions.WAIT) { value.withStepFunction(context -> { int v = context.currentValue; @@ -112,40 +121,37 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen { @Override protected void renderWindow(int mouseX, int mouseY, float partialTicks) { - int hFontColor = 0xD3CBBE; background.draw(this, guiLeft, guiTop); for (int row = 0; row < instructions.capacity(); row++) { AllGuiTextures toDraw = AllGuiTextures.SEQUENCER_EMPTY; int yOffset = toDraw.height * row; - if (row < instructions.size()) { - Instruction instruction = instructions.get(row); - SequencerInstructions def = instruction.instruction; - def.background.draw(guiLeft + 14, guiTop + 29 + yOffset); - - label(32, 6 + yOffset, Lang.translate(def.translationKey)); - if (def.hasValueParameter) { - String text = def.formatValue(instruction.value); - int stringWidth = font.getStringWidth(text); - label(85 + (12 - stringWidth / 2), 6 + yOffset, text); - } - if (def.hasSpeedParameter) - label(120, 6 + yOffset, instruction.speedModifier.label); - + if (row >= instructions.size()) { + toDraw.draw(guiLeft, guiTop + 14 + yOffset); continue; } - toDraw.draw(guiLeft + 14, guiTop + 29 + yOffset); + Instruction instruction = instructions.get(row); + SequencerInstructions def = instruction.instruction; + def.background.draw(guiLeft, guiTop + 14 + yOffset); + + label(36, yOffset - 3, Lang.translate(def.translationKey)); + if (def.hasValueParameter) { + String text = def.formatValue(instruction.value); + int stringWidth = font.getStringWidth(text); + label(90 + (12 - stringWidth / 2), yOffset - 3, text); + } + if (def.hasSpeedParameter) + label(127, yOffset - 3, instruction.speedModifier.label); } - font.drawStringWithShadow(title, guiLeft - 3 + (background.width - font.getStringWidth(title)) / 2, guiTop + 10, - hFontColor); + font.drawStringWithShadow(title, guiLeft - 3 + (background.width - font.getStringWidth(title)) / 2, guiTop + 3, 0xffffff); GuiGameElement.of(renderedItem) - .at(guiLeft + background.width + 20, guiTop + 50) - .scale(5) - .render(); + .at(guiLeft + background.width + 20, guiTop + 50) + .scale(5) + .render(); } private void label(int x, int y, String text) { @@ -184,4 +190,14 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen { } } + @Override + public boolean mouseClicked(double x, double y, int button) { + if (confirmButton.isHovered()) { + Minecraft.getInstance().player.closeScreen(); + return true; + } + + return super.mouseClicked(x, y, button); + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencerInstructions.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencerInstructions.java index e4b397bc7..3bb06ba8e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencerInstructions.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencerInstructions.java @@ -9,7 +9,7 @@ import com.simibubi.create.foundation.utility.Lang; public enum SequencerInstructions { TURN_ANGLE("angle", AllGuiTextures.SEQUENCER_INSTRUCTION, true, true, 360, 45, 90), - TURN_DISTANCE("distance", AllGuiTextures.SEQUENCER_INSTRUCTION, true, true, 50, 5, 5), + TURN_DISTANCE("distance", AllGuiTextures.SEQUENCER_INSTRUCTION, true, true, 128, 5, 5), WAIT("duration", AllGuiTextures.SEQUENCER_WAIT, true, false, 600, 20, 10), END("", AllGuiTextures.SEQUENCER_END), diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java index c5c9cd256..8d4188d50 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java @@ -40,6 +40,11 @@ public class BeltRenderer extends SafeTileEntityRenderer { public BeltRenderer(TileEntityRendererDispatcher dispatcher) { super(dispatcher); } + + @Override + public boolean isGlobalRenderer(BeltTileEntity te) { + return BeltBlock.canTransportObjects(te.getBlockState()); + } @Override protected void renderSafe(BeltTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java index 2fb39ce91..bde2e2483 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java @@ -76,7 +76,7 @@ public class BeltTileEntity extends KineticTileEntity { casing = CasingType.NONE; color = -1; } - + @Override public void addBehaviours(List behaviours) { super.addBehaviours(behaviours); diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryHandler.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryHandler.java index f3efe5f37..76d66499a 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryHandler.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryHandler.java @@ -13,7 +13,6 @@ import net.minecraft.block.Blocks; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.client.renderer.ActiveRenderInfo; -import net.minecraft.client.renderer.Atlases; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.model.IBakedModel; @@ -103,7 +102,7 @@ public class SymmetryHandler { double speed = 1 / 16d; yShift = MathHelper.sin((float) (AnimationTickHolder.getRenderTick() * speed)) / 5f; - IRenderTypeBuffer buffer = Minecraft.getInstance() + IRenderTypeBuffer.Impl buffer = Minecraft.getInstance() .getBufferBuilders() .getEntityVertexConsumers(); ActiveRenderInfo info = mc.gameRenderer.getActiveRenderInfo(); @@ -117,7 +116,7 @@ public class SymmetryHandler { mirror.applyModelTransform(ms); IBakedModel model = mirror.getModel() .get(); - IVertexBuilder builder = buffer.getBuffer(RenderType.getTranslucent()); + IVertexBuilder builder = buffer.getBuffer(RenderType.getSolid()); mc.getBlockRendererDispatcher() .getBlockModelRenderer() @@ -125,11 +124,7 @@ public class SymmetryHandler { player.world.getRandom(), MathHelper.getPositionRandom(pos), OverlayTexture.DEFAULT_UV, EmptyModelData.INSTANCE); - Minecraft.getInstance() - .getBufferBuilders() - .getEntityVertexConsumers() - .draw(Atlases.getEntityTranslucent()); - + buffer.draw(); ms.pop(); } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandScreen.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandScreen.java index cba957ade..cface0dc2 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandScreen.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandScreen.java @@ -2,16 +2,24 @@ package com.simibubi.create.content.curiosities.symmetry; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; -import com.simibubi.create.content.curiosities.symmetry.mirror.*; +import com.simibubi.create.content.curiosities.symmetry.mirror.CrossPlaneMirror; +import com.simibubi.create.content.curiosities.symmetry.mirror.EmptyMirror; +import com.simibubi.create.content.curiosities.symmetry.mirror.PlaneMirror; +import com.simibubi.create.content.curiosities.symmetry.mirror.SymmetryMirror; +import com.simibubi.create.content.curiosities.symmetry.mirror.TriplePlaneMirror; import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.AllGuiTextures; +import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.GuiGameElement; +import com.simibubi.create.foundation.gui.widgets.IconButton; import com.simibubi.create.foundation.gui.widgets.Label; import com.simibubi.create.foundation.gui.widgets.ScrollInput; import com.simibubi.create.foundation.gui.widgets.SelectionScrollInput; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.NbtPacket; import com.simibubi.create.foundation.utility.Lang; + +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Vector3f; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; @@ -25,6 +33,7 @@ public class SymmetryWandScreen extends AbstractSimiScreen { private Label labelType; private ScrollInput areaAlign; private Label labelAlign; + private IconButton confirmButton; private final String mirrorType = Lang.translate("gui.symmetryWand.mirrorType"); private final String orientation = Lang.translate("gui.symmetryWand.orientation"); @@ -37,9 +46,9 @@ public class SymmetryWandScreen extends AbstractSimiScreen { super(); currentElement = SymmetryWandItem.getMirror(wand); - if (currentElement instanceof EmptyMirror) { + if (currentElement instanceof EmptyMirror) currentElement = new PlaneMirror(Vec3d.ZERO); - } + this.hand = hand; this.wand = wand; } @@ -47,16 +56,17 @@ public class SymmetryWandScreen extends AbstractSimiScreen { @Override public void init() { super.init(); - this.setWindowSize(AllGuiTextures.WAND_SYMMETRY.width + 50, AllGuiTextures.WAND_SYMMETRY.height + 50); + AllGuiTextures background = AllGuiTextures.WAND_OF_SYMMETRY; + this.setWindowSize(background.width + 50, background.height + 50); - labelType = new Label(guiLeft + 122, guiTop + 15, "").colored(0xFFFFFFFF) + labelType = new Label(guiLeft + 49, guiTop + 26, "").colored(0xFFFFFFFF) .withShadow(); - labelAlign = new Label(guiLeft + 122, guiTop + 35, "").colored(0xFFFFFFFF) + labelAlign = new Label(guiLeft + 49, guiTop + 48, "").colored(0xFFFFFFFF) .withShadow(); int state = currentElement instanceof TriplePlaneMirror ? 2 : currentElement instanceof CrossPlaneMirror ? 1 : 0; - areaType = new SelectionScrollInput(guiLeft + 119, guiTop + 12, 70, 14).forOptions(SymmetryMirror.getMirrors()) + areaType = new SelectionScrollInput(guiLeft + 45, guiTop + 21, 109, 18).forOptions(SymmetryMirror.getMirrors()) .titled(mirrorType) .writingTo(labelType) .setState(state); @@ -85,15 +95,17 @@ public class SymmetryWandScreen extends AbstractSimiScreen { widgets.add(labelAlign); widgets.add(areaType); widgets.add(labelType); + + confirmButton = new IconButton(guiLeft + background.width - 33, guiTop + background.height - 24, AllIcons.I_CONFIRM); + widgets.add(confirmButton); } private void initAlign(SymmetryMirror element) { - if (areaAlign != null) { + if (areaAlign != null) widgets.remove(areaAlign); - } - areaAlign = new SelectionScrollInput(guiLeft + 119, guiTop + 32, 70, 14).forOptions(element.getAlignToolTips()) + areaAlign = new SelectionScrollInput(guiLeft + 45, guiTop + 43, 109, 18).forOptions(element.getAlignToolTips()) .titled(orientation) .writingTo(labelAlign) .setState(element.getOrientationIndex()) @@ -104,30 +116,26 @@ public class SymmetryWandScreen extends AbstractSimiScreen { @Override protected void renderWindow(int mouseX, int mouseY, float partialTicks) { - AllGuiTextures.WAND_SYMMETRY.draw(this, guiLeft, guiTop); + AllGuiTextures.WAND_OF_SYMMETRY.draw(this, guiLeft, guiTop); - int x = guiLeft + 63; - int y = guiTop + 15; - - font.drawString(mirrorType, x - 5, y, AllGuiTextures.FONT_COLOR); - font.drawString(orientation, x - 5, y + 20, AllGuiTextures.FONT_COLOR); + font.drawStringWithShadow(wand.getDisplayName() + .getFormattedText(), guiLeft + 11, guiTop + 3, 0xffffff); renderBlock(); - GuiGameElement.of(wand) - .at(guiLeft + 200, guiTop + 170) - .scale(4) - .rotate(-70, 20, 20) - .render(); + .at(guiLeft + 170, guiTop + 200) + .scale(4) + .rotate(-70, 20, 20) + .render(); } protected void renderBlock() { RenderSystem.pushMatrix(); MatrixStack ms = new MatrixStack(); - ms.translate(guiLeft + 18, guiTop + 11, 20); + ms.translate(guiLeft + 25.5f, guiTop + 21, 20); ms.multiply(new Vector3f(.3f, 1f, 0f).getDegreesQuaternion(-22.5f)); - ms.scale(32, -32, 32); + ms.scale(16, -16, 16); currentElement.applyModelTransform(ms); RenderSystem.multMatrix(ms.peek() .getModel()); @@ -147,5 +155,15 @@ public class SymmetryWandScreen extends AbstractSimiScreen { minecraft.player.setHeldItem(hand, heldItem); super.removed(); } + + @Override + public boolean mouseClicked(double x, double y, int button) { + if (confirmButton.isHovered()) { + Minecraft.getInstance().player.closeScreen(); + return true; + } + + return super.mouseClicked(x, y, button); + } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperScreen.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperScreen.java index 2beb5a4e7..6354da3e4 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperScreen.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperScreen.java @@ -5,6 +5,7 @@ import java.util.Vector; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.AllGuiTextures; +import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.widgets.IconButton; import com.simibubi.create.foundation.networking.AllPackets; @@ -14,20 +15,19 @@ import com.simibubi.create.foundation.utility.Lang; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.texture.AtlasTexture; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.NBTUtil; import net.minecraft.util.Hand; -@SuppressWarnings("deprecation") public class ZapperScreen extends AbstractSimiScreen { protected ItemStack zapper; protected boolean offhand; protected float animationProgress; protected AllGuiTextures background; - + private IconButton confirmButton; + protected final String patternSection = Lang.translate("gui.blockzapper.patternSection"); protected String title; @@ -41,7 +41,7 @@ public class ZapperScreen extends AbstractSimiScreen { this.zapper = zapper; this.offhand = offhand; title = ""; - brightColor = 0xCCDDFF; + brightColor = 0xfefefe; fontColor = AllGuiTextures.FONT_COLOR; } @@ -51,6 +51,9 @@ public class ZapperScreen extends AbstractSimiScreen { setWindowSize(background.width + 40, background.height); super.init(); widgets.clear(); + + confirmButton = new IconButton(guiLeft + background.width - 53, guiTop + background.height - 24, AllIcons.I_CONFIRM); + widgets.add(confirmButton); int i = guiLeft - 20; int j = guiTop; @@ -61,7 +64,7 @@ public class ZapperScreen extends AbstractSimiScreen { for (int col = 0; col <= 2; col++) { int id = patternButtons.size(); PlacementPatterns pattern = PlacementPatterns.values()[id]; - patternButtons.add(new IconButton(i + 147 + col * 18, j + 23 + row * 18, pattern.icon)); + patternButtons.add(new IconButton(i + background.width - 76 + col * 18, j + 19 + row * 18, pattern.icon)); patternButtons.get(id) .setToolTip(Lang.translate("gui.blockzapper.pattern." + pattern.translationKey)); } @@ -82,17 +85,12 @@ public class ZapperScreen extends AbstractSimiScreen { background.draw(this, i, j); drawOnBackground(i, j); - minecraft.getTextureManager() - .bindTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE); - RenderSystem.enableBlend(); - renderBlock(); renderZapper(); } protected void drawOnBackground(int i, int j) { - font.drawStringWithShadow(title, i + 8, j + 10, brightColor); - font.drawString(patternSection, i + 148, j + 11, fontColor); + font.drawStringWithShadow(title, i + 11, j + 3, brightColor); } @Override @@ -122,20 +120,25 @@ public class ZapperScreen extends AbstractSimiScreen { nbt.putString("Pattern", PlacementPatterns.values()[patternButtons.indexOf(patternButton)].name()); } } + + if (confirmButton.isHovered()) { + Minecraft.getInstance().player.closeScreen(); + return true; + } return super.mouseClicked(x, y, button); } protected void renderZapper() { GuiGameElement.of(zapper) - .at((this.width - this.sWidth) / 2 + 210, this.height / 2 - this.sHeight / 4) + .at((this.width - this.sWidth) / 2 + 220, this.height / 2 - this.sHeight / 4 + 30) .scale(4) .render(); } protected void renderBlock() { RenderSystem.pushMatrix(); - RenderSystem.translated(guiLeft + 1.7f, guiTop + 48, 120); + RenderSystem.translated(guiLeft + 7f, guiTop + 43.5f, 120); RenderSystem.rotatef(-30f, .5f, .9f, -.1f); RenderSystem.scaled(20, 20, 20); diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperScreen.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperScreen.java index d0e5794f9..ad92257d2 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperScreen.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperScreen.java @@ -43,26 +43,26 @@ public class BlockzapperScreen extends ZapperScreen { int j = guiTop; CompoundNBT nbt = zapper.getOrCreateTag(); - replaceModeIndicator = new Indicator(i + 51, j + 36, ""); - replaceModeButton = new IconButton(i + 51, j + 41, AllIcons.I_REPLACE_SOLID); + replaceModeIndicator = new Indicator(i + 49, j + 67, ""); + replaceModeButton = new IconButton(i + 49, j + 73, AllIcons.I_REPLACE_SOLID); if (nbt.contains("Replace") && nbt.getBoolean("Replace")) replaceModeIndicator.state = State.ON; replaceModeButton.setToolTip(Lang.translate("gui.blockzapper.replaceMode")); - spreadDiagonallyIndicator = new Indicator(i + 74, j + 36, ""); - spreadDiagonallyButton = new IconButton(i + 74, j + 41, AllIcons.I_FOLLOW_DIAGONAL); + spreadDiagonallyIndicator = new Indicator(i + 8, j + 67, ""); + spreadDiagonallyButton = new IconButton(i + 8, j + 73, AllIcons.I_FOLLOW_DIAGONAL); if (nbt.contains("SearchDiagonal") && nbt.getBoolean("SearchDiagonal")) spreadDiagonallyIndicator.state = State.ON; spreadDiagonallyButton.setToolTip(Lang.translate("gui.blockzapper.searchDiagonal")); - spreadMaterialIndicator = new Indicator(i + 92, j + 36, ""); - spreadMaterialButton = new IconButton(i + 92, j + 41, AllIcons.I_FOLLOW_MATERIAL); + spreadMaterialIndicator = new Indicator(i + 26, j + 67, ""); + spreadMaterialButton = new IconButton(i + 26, j + 73, AllIcons.I_FOLLOW_MATERIAL); if (nbt.contains("SearchFuzzy") && nbt.getBoolean("SearchFuzzy")) spreadMaterialIndicator.state = State.ON; spreadMaterialButton.setToolTip(Lang.translate("gui.blockzapper.searchFuzzy")); - spreadRangeLabel = new Label(i + 119, j + 46, "").withShadow().withSuffix("m"); - spreadRangeInput = new ScrollInput(i + 115, j + 43, 22, 14).withRange(1, BlockzapperItem.getMaxAoe(zapper)) + spreadRangeLabel = new Label(i + 79, j + 78, "").withShadow().withSuffix("m"); + spreadRangeInput = new ScrollInput(i + 73, j + 73, 26, 18).withRange(1, BlockzapperItem.getMaxAoe(zapper)) .setState(1).titled(Lang.translate("gui.blockzapper.range")).writingTo(spreadRangeLabel); if (nbt.contains("SearchDistance")) diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperScreen.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperScreen.java index f9d6ec474..0e6b7bca4 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperScreen.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperScreen.java @@ -38,8 +38,7 @@ public class WorldshaperScreen extends ZapperScreen { public WorldshaperScreen(ItemStack zapper, boolean offhand) { super(AllGuiTextures.TERRAINZAPPER, zapper, offhand); - brightColor = 0xDFF6FF; - fontColor = 0x436B77; + fontColor = 0x767676; title = Lang.translate("gui.terrainzapper.title"); nbt = zapper.getOrCreateTag(); } @@ -51,8 +50,8 @@ public class WorldshaperScreen extends ZapperScreen { i = guiLeft - 20; j = guiTop; - brushLabel = new Label(i + 58, j + 28, "").withShadow(); - brushInput = new SelectionScrollInput(i + 55, j + 25, 78, 14).forOptions(brushOptions) + brushLabel = new Label(i + 61, j + 23, "").withShadow(); + brushInput = new SelectionScrollInput(i + 56, j + 18, 77, 18).forOptions(brushOptions) .titled(Lang.translate("gui.terrainzapper.brush")) .writingTo(brushLabel) .calling(this::brushChanged); @@ -68,7 +67,7 @@ public class WorldshaperScreen extends ZapperScreen { TerrainTools[] toolValues = TerrainTools.values(); for (int id = 0; id < toolValues.length; id++) { TerrainTools tool = toolValues[id]; - toolButtons.add(new IconButton(i + 8 + id * 18, j + 76, tool.icon)); + toolButtons.add(new IconButton(i + 7 + id * 18, j + 77, tool.icon)); toolButtons.get(id) .setToolTip(Lang.translate("gui.terrainzapper.tool." + tool.translationKey)); } @@ -82,7 +81,7 @@ public class WorldshaperScreen extends ZapperScreen { PlacementOptions[] placementValues = PlacementOptions.values(); for (int id = 0; id < placementValues.length; id++) { PlacementOptions option = placementValues[id]; - placementButtons.add(new IconButton(i + 147 + id * 18, j + 76, option.icon)); + placementButtons.add(new IconButton(i + 136 + id * 18, j + 77, option.icon)); placementButtons.get(id) .setToolTip(Lang.translate("gui.terrainzapper.placement." + option.translationKey)); } @@ -114,15 +113,15 @@ public class WorldshaperScreen extends ZapperScreen { Brush currentBrush = TerrainBrushes.values()[brushInput.getState()].get(); for (int index = 0; index < 3; index++) { - Label label = new Label(i + 62 + 18 * index, j + 46, "").withShadow(); + Label label = new Label(i + 65 + 20 * index, j + 43, "").withShadow(); brushParamLabels.add(label); int indexFinal = index; - ScrollInput input = new ScrollInput(i + 55 + 18 * index, j + 43, 14, 14) + ScrollInput input = new ScrollInput(i + 56 + 20 * index, j + 38, 18, 18) .withRange(currentBrush.getMin(index), currentBrush.getMax(index) + 1) .writingTo(label) .titled(currentBrush.getParamLabel(index)) .calling(state -> { - label.x = i + 62 + 18 * indexFinal - font.getStringWidth(label.text) / 2; + label.x = i + 65 + 20 * indexFinal - font.getStringWidth(label.text) / 2; }); input.setState(params[index]); input.onChanged(); @@ -175,12 +174,11 @@ public class WorldshaperScreen extends ZapperScreen { super.drawOnBackground(i, j); Brush currentBrush = TerrainBrushes.values()[brushInput.getState()].get(); - for (int index = 2; index >= currentBrush.amtParams; index--) { - AllGuiTextures.TERRAINZAPPER_INACTIVE_PARAM.draw(i + 55 + index * 18, j + 43); - } + for (int index = 2; index >= currentBrush.amtParams; index--) + AllGuiTextures.TERRAINZAPPER_INACTIVE_PARAM.draw(i + 56 + 20 * index, j + 38); - font.drawString(toolSection, i + 8, j + 64, fontColor); - font.drawString(placementSection, i + 148, j + 64, fontColor); + font.drawString(toolSection, i + 7, j + 66, fontColor); + font.drawString(placementSection, i + 136, j + 66, fontColor); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/block/inventories/AdjustableCrateContainer.java b/src/main/java/com/simibubi/create/content/logistics/block/inventories/AdjustableCrateContainer.java index 68c13d22a..d67062c1f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/inventories/AdjustableCrateContainer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/inventories/AdjustableCrateContainer.java @@ -40,17 +40,17 @@ public class AdjustableCrateContainer extends Container { private void init() { doubleCrate = te.isDoubleCrate(); - int x = doubleCrate ? 52 : 124; + int x = doubleCrate ? 51 : 123; int maxCol = doubleCrate ? 8 : 4; for (int row = 0; row < 4; ++row) { for (int col = 0; col < maxCol; ++col) { - this.addSlot(new SlotItemHandler(te.inventory, col + row * maxCol, x + col * 18, 25 + row * 18)); + this.addSlot(new SlotItemHandler(te.inventory, col + row * maxCol, x + col * 18, 20 + row * 18)); } } // player Slots int xOffset = 58; - int yOffset = 157; + int yOffset = 155; for (int row = 0; row < 3; ++row) { for (int col = 0; col < 9; ++col) { this.addSlot(new Slot(playerInventory, col + row * 9 + 9, xOffset + col * 18, yOffset + row * 18)); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/inventories/AdjustableCrateScreen.java b/src/main/java/com/simibubi/create/content/logistics/block/inventories/AdjustableCrateScreen.java index 2a58b5e08..6a312a59c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/inventories/AdjustableCrateScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/inventories/AdjustableCrateScreen.java @@ -1,7 +1,7 @@ package com.simibubi.create.content.logistics.block.inventories; -import static com.simibubi.create.foundation.gui.AllGuiTextures.FLEXCRATE; -import static com.simibubi.create.foundation.gui.AllGuiTextures.FLEXCRATE_DOUBLE; +import static com.simibubi.create.foundation.gui.AllGuiTextures.ADJUSTABLE_CRATE; +import static com.simibubi.create.foundation.gui.AllGuiTextures.ADJUSTABLE_DOUBLE_CRATE; import static com.simibubi.create.foundation.gui.AllGuiTextures.PLAYER_INVENTORY; import java.util.ArrayList; @@ -43,11 +43,11 @@ public class AdjustableCrateScreen extends AbstractSimiContainerScreen(); - extraAreas.add(new Rectangle2d(guiLeft + FLEXCRATE.width + 110, guiTop + 46, 71, 70)); + extraAreas.add(new Rectangle2d(guiLeft + ADJUSTABLE_CRATE.width + 110, guiTop + 46, 71, 70)); } @Override @@ -68,18 +68,17 @@ public class AdjustableCrateScreen extends AbstractSimiContainerScreen slot * 64) continue; int slotsPerRow = (container.doubleCrate ? 8 : 4); - int x = crateLeft + 23 + (slot % slotsPerRow) * 18; - int y = crateTop + 24 + (slot / slotsPerRow) * 18; - AllGuiTextures.FLEXCRATE_LOCKED_SLOT.draw(this, x, y); + int x = crateLeft + 22 + (slot % slotsPerRow) * 18; + int y = crateTop + 19 + (slot / slotsPerRow) * 18; + AllGuiTextures.ADJUSTABLE_CRATE_LOCKED_SLOT.draw(this, x, y); } GuiGameElement.of(renderedItem) - .at(guiLeft + FLEXCRATE.width + 110, guiTop + 40) + .at(guiLeft + ADJUSTABLE_CRATE.width + 110, guiTop + 40) .scale(5) .render(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchBlock.java index 1dff71e17..a701a2b07 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchBlock.java @@ -80,7 +80,7 @@ public class StockpileSwitchBlock extends HorizontalBlock implements ITE { - offBelowLabel.text = state + "%"; - lastModification = 0; - if (onAbove.getState() - 4 <= state) { - onAbove.setState(state + 5); - onAbove.onChanged(); - } - }) - .setState((int) (te.offWhenBelow * 100)); + cursor = LerpedFloat.linear() + .startWithValue(te.getLevelForDisplay()); + cursorLane = LerpedFloat.linear() + .startWithValue(te.getState() ? 1 : 0); - onAboveLabel = new Label(guiLeft + 116, guiTop + 55, "").colored(0xD3CBBE) - .withShadow(); - onAbove = new ScrollInput(guiLeft + 113, guiTop + 52, 33, 14).withRange(5, 101) - .titled(upperLimit) - .calling(state -> { - onAboveLabel.text = state + "%"; - lastModification = 0; - if (offBelow.getState() + 4 >= state) { - offBelow.setState(state - 5); - offBelow.onChanged(); - } - }) - .setState((int) (te.onWhenAbove * 100)); + offBelow = new ScrollInput(guiLeft + 36, guiTop + 40, 102, 18).withRange(0, 100) + .titled("") + .calling(state -> { + lastModification = 0; + offBelow.titled(Lang.translate("gui.stockpile_switch.move_to_upper_at", state)); + if (onAbove.getState() <= state) { + onAbove.setState(state + 1); + onAbove.onChanged(); + } + }) + .setState((int) (te.offWhenBelow * 100)); + + onAbove = new ScrollInput(guiLeft + 36, guiTop + 18, 102, 18).withRange(1, 101) + .titled("") + .calling(state -> { + lastModification = 0; + onAbove.titled(Lang.translate("gui.stockpile_switch.move_to_lower_at", state)); + if (offBelow.getState() >= state) { + offBelow.setState(state - 1); + offBelow.onChanged(); + } + }) + .setState((int) (te.onWhenAbove * 100)); onAbove.onChanged(); offBelow.onChanged(); - widgets.addAll(Arrays.asList(offBelowLabel, offBelow, onAbove, onAboveLabel)); + + widgets.add(onAbove); + widgets.add(offBelow); + + confirmButton = + new IconButton(guiLeft + background.width - 33, guiTop + background.height - 24, AllIcons.I_CONFIRM); + widgets.add(confirmButton); + + flipSignals = new IconButton(guiLeft + 14, guiTop + 40, AllIcons.I_FLIP); + flipSignals.setToolTip(invertSignal); + widgets.add(flipSignals); } @Override protected void renderWindow(int mouseX, int mouseY, float partialTicks) { - int hFontColor = 0xD3CBBE; - int fontColor = 0x4B3A22; STOCKSWITCH.draw(this, guiLeft, guiTop); - font.drawStringWithShadow(title, guiLeft - 3 + (STOCKSWITCH.width - font.getStringWidth(title)) / 2, - guiTop + 10, hFontColor); - font.drawString(onAbove.getState() == 100 ? startAt : startAbove, guiLeft + 13, guiTop + 55, fontColor); - font.drawString(offBelow.getState() == 0 ? stopAt : stopBelow, guiLeft + 13, guiTop + 72, fontColor); + + AllGuiTextures.STOCKSWITCH_POWERED_LANE.draw(this, guiLeft + 36, guiTop + (te.isInverted() ? 18 : 40)); + AllGuiTextures.STOCKSWITCH_UNPOWERED_LANE.draw(this, guiLeft + 36, guiTop + (te.isInverted() ? 40 : 18)); + + font.drawStringWithShadow(title, guiLeft - 3 + (STOCKSWITCH.width - font.getStringWidth(title)) / 2, guiTop + 3, + 0xffffff); AllGuiTextures sprite = AllGuiTextures.STOCKSWITCH_INTERVAL; - float lowerBound = offBelow.getState() / 100f * (sprite.width - 20) + 10; - float upperBound = onAbove.getState() / 100f * (sprite.width - 20) + 10; + float lowerBound = offBelow.getState(); + float upperBound = onAbove.getState(); sprite.bind(); - blit((int) (guiLeft + lowerBound), guiTop + 26, (int) (sprite.startX + lowerBound), sprite.startY, - (int) (upperBound - lowerBound), sprite.height); + blit((int) (guiLeft + upperBound) + 37, guiTop + 18, (int) (sprite.startX + upperBound), sprite.startY, + (int) (sprite.width - upperBound), sprite.height); + blit(guiLeft + 37, guiTop + 40, sprite.startX, sprite.startY, (int) (lowerBound), sprite.height); - sprite = AllGuiTextures.STOCKSWITCH_INTERVAL_END; - sprite.bind(); - blit((int) (guiLeft + upperBound), guiTop + 26, (int) (sprite.startX + upperBound), sprite.startY, - (int) (sprite.width - upperBound), sprite.height); + AllGuiTextures.STOCKSWITCH_ARROW_UP.draw(this, (int) (guiLeft + lowerBound + 36) - 2, guiTop + 35); + AllGuiTextures.STOCKSWITCH_ARROW_DOWN.draw(this, (int) (guiLeft + upperBound + 36) - 3, guiTop + 17); - AllGuiTextures.STOCKSWITCH_BOUND_LEFT.draw(this, (int) (guiLeft + lowerBound) - 1, guiTop + 24); - AllGuiTextures.STOCKSWITCH_BOUND_RIGHT.draw(this, (int) (guiLeft + upperBound) - 5, guiTop + 24); - - AllGuiTextures cursor = - te.powered ? AllGuiTextures.STOCKSWITCH_CURSOR_ON : AllGuiTextures.STOCKSWITCH_CURSOR_OFF; - RenderSystem.pushMatrix(); - RenderSystem.translatef((cursorPos * (sprite.width - 20) + 10), 0, 0); - cursor.draw(this, guiLeft - 4, guiTop + 24); - RenderSystem.popMatrix(); + if (te.currentLevel != -1) { + AllGuiTextures cursor = AllGuiTextures.STOCKSWITCH_CURSOR; + RenderSystem.pushMatrix(); + RenderSystem.translatef(Math.min(99, this.cursor.getValue(partialTicks) * sprite.width), + cursorLane.getValue(partialTicks) * 22, 0); + cursor.draw(this, guiLeft + 34, guiTop + 19); + RenderSystem.popMatrix(); + } RenderSystem.pushMatrix(); GuiGameElement.of(renderedItem) - .at(guiLeft + STOCKSWITCH.width + 15, guiTop + 20) - .scale(5) - .render(); + .at(guiLeft + STOCKSWITCH.width + 15, guiTop + 20) + .scale(5) + .render(); RenderSystem.popMatrix(); } @@ -127,25 +135,39 @@ public class StockpileSwitchScreen extends AbstractSimiScreen { public void tick() { super.tick(); - if (te.currentLevel == -1) - cursorPos = 0; - else - cursorPos += (te.currentLevel - cursorPos) / 4; + cursor.chase(te.getLevelForDisplay(), 1 / 4f, Chaser.EXP); + cursor.tickChaser(); + cursorLane.chase(te.getState() ? 1 : 0, 1 / 4f, Chaser.EXP); + cursorLane.tickChaser(); if (lastModification >= 0) lastModification++; if (lastModification >= 20) { lastModification = -1; - AllPackets.channel.sendToServer( - new ConfigureStockswitchPacket(te.getPos(), offBelow.getState() / 100f, onAbove.getState() / 100f)); + send(te.isInverted()); } } @Override public void removed() { - AllPackets.channel.sendToServer( - new ConfigureStockswitchPacket(te.getPos(), offBelow.getState() / 100f, onAbove.getState() / 100f)); + send(te.isInverted()); + } + + protected void send(boolean invert) { + AllPackets.channel.sendToServer(new ConfigureStockswitchPacket(te.getPos(), offBelow.getState() / 100f, + onAbove.getState() / 100f, invert)); + } + + @Override + public boolean mouseClicked(double x, double y, int button) { + if (flipSignals.isHovered()) + send(!te.isInverted()); + if (confirmButton.isHovered()) { + Minecraft.getInstance().player.closeScreen(); + return true; + } + return super.mouseClicked(x, y, button); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchTileEntity.java index 863070eb1..4f44d92d8 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchTileEntity.java @@ -20,7 +20,8 @@ public class StockpileSwitchTileEntity extends SmartTileEntity { public float onWhenAbove; public float offWhenBelow; public float currentLevel; - public boolean powered; + private boolean state; + private boolean inverted; private FilteringBehaviour filtering; private InvManipulationBehaviour observedInventory; @@ -30,7 +31,8 @@ public class StockpileSwitchTileEntity extends SmartTileEntity { onWhenAbove = .75f; offWhenBelow = .25f; currentLevel = -1; - powered = false; + state = false; + inverted = false; setLazyTickRate(10); } @@ -39,7 +41,8 @@ public class StockpileSwitchTileEntity extends SmartTileEntity { onWhenAbove = compound.getFloat("OnAbove"); offWhenBelow = compound.getFloat("OffBelow"); currentLevel = compound.getFloat("Current"); - powered = compound.getBoolean("Powered"); + state = compound.getBoolean("Powered"); + inverted = compound.getBoolean("Inverted"); super.read(compound, clientPacket); } @@ -48,7 +51,8 @@ public class StockpileSwitchTileEntity extends SmartTileEntity { compound.putFloat("OnAbove", onWhenAbove); compound.putFloat("OffBelow", offWhenBelow); compound.putFloat("Current", currentLevel); - compound.putBoolean("Powered", powered); + compound.putBoolean("Powered", state); + compound.putBoolean("Inverted", inverted); super.write(compound, clientPacket); } @@ -57,13 +61,15 @@ public class StockpileSwitchTileEntity extends SmartTileEntity { } public void updateCurrentLevel() { + boolean changed = false; if (!observedInventory.hasInventory()) { if (currentLevel == -1) return; world.setBlockState(pos, getBlockState().with(StockpileSwitchBlock.INDICATOR, 0), 3); currentLevel = -1; - powered = false; + state = false; world.notifyNeighbors(pos, getBlockState().getBlock()); + sendData(); return; } @@ -85,15 +91,18 @@ public class StockpileSwitchTileEntity extends SmartTileEntity { occupied += count * (1f / space); } - currentLevel = (float) occupied / totalSpace; + float level = (float) occupied / totalSpace; + if (currentLevel != level) + changed = true; + currentLevel = level; currentLevel = MathHelper.clamp(currentLevel, 0, 1); - boolean previouslyPowered = powered; - if (powered && currentLevel <= offWhenBelow) - powered = false; - else if (!powered && currentLevel >= onWhenAbove) - powered = true; - boolean update = previouslyPowered != powered; + boolean previouslyPowered = state; + if (state && currentLevel <= offWhenBelow) + state = false; + else if (!state && currentLevel >= onWhenAbove) + state = true; + boolean update = previouslyPowered != state; int displayLevel = 0; if (currentLevel > 0) @@ -101,6 +110,8 @@ public class StockpileSwitchTileEntity extends SmartTileEntity { world.setBlockState(pos, getBlockState().with(StockpileSwitchBlock.INDICATOR, displayLevel), update ? 3 : 2); if (update) world.notifyNeighbors(pos, getBlockState().getBlock()); + if (changed || update) + sendData(); } @Override @@ -120,4 +131,27 @@ public class StockpileSwitchTileEntity extends SmartTileEntity { observedInventory = new InvManipulationBehaviour(this, InterfaceProvider.towardBlockFacing()).bypassSidedness(); behaviours.add(observedInventory); } + + public float getLevelForDisplay() { + return currentLevel == -1 ? 0 : currentLevel; + } + + public boolean getState() { + return state; + } + + public boolean isPowered() { + return inverted != state; + } + + public boolean isInverted() { + return inverted; + } + + public void setInverted(boolean inverted) { + if (inverted == this.inverted) + return; + this.inverted = inverted; + world.notifyNeighbors(pos, getBlockState().getBlock()); + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterScreen.java index 73e532dc4..ae138ce3d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterScreen.java @@ -41,8 +41,8 @@ public abstract class AbstractFilterScreen ex super.init(); widgets.clear(); - resetButton = new IconButton(guiLeft + 15, guiTop + background.height - 30, AllIcons.I_TRASH); - confirmButton = new IconButton(guiLeft + 159, guiTop + background.height - 30, AllIcons.I_CONFIRM); + resetButton = new IconButton(guiLeft + background.width - 62, guiTop + background.height - 24, AllIcons.I_TRASH); + confirmButton = new IconButton(guiLeft + background.width - 33, guiTop + background.height - 24, AllIcons.I_CONFIRM); widgets.add(resetButton); widgets.add(confirmButton); @@ -59,14 +59,7 @@ public abstract class AbstractFilterScreen ex PLAYER_INVENTORY.draw(this, invX, invY); font.drawString(playerInventory.getDisplayName().getFormattedText(), invX + 7, invY + 6, 0x666666); - font.drawString(I18n.format(container.filterItem.getTranslationKey()), x + 15, y + 9, 0x5B5037); - - /*RenderHelper.enableGuiDepthLighting(); - RenderSystem.pushMatrix(); - RenderSystem.translated(guiLeft + background.width + 0, guiTop + background.height - 60, 0); - RenderSystem.scaled(5, 5, 5); - itemRenderer.renderItemIntoGUI(container.filterItem, 0, 0); - RenderSystem.popMatrix();*/ + font.drawStringWithShadow(I18n.format(container.filterItem.getTranslationKey()), x + 15, y + 3, 0xdedede); GuiGameElement.of(container.filterItem) .at(guiLeft + background.width, guiTop +background.height -60) diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterContainer.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterContainer.java index 45595fd97..54e945ca9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterContainer.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterContainer.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import com.simibubi.create.AllContainerTypes; +import com.simibubi.create.foundation.utility.Pair; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; @@ -27,7 +28,7 @@ public class AttributeFilterContainer extends AbstractFilterContainer { } WhitelistMode whitelistMode; - List selectedAttributes; + List> selectedAttributes; public AttributeFilterContainer(int id, PlayerInventory inv, PacketBuffer extraData) { super(AllContainerTypes.ATTRIBUTE_FILTER.type, id, inv, extraData); @@ -37,21 +38,21 @@ public class AttributeFilterContainer extends AbstractFilterContainer { super(AllContainerTypes.ATTRIBUTE_FILTER.type, id, inv, stack); } - public void appendSelectedAttribute(ItemAttribute itemAttribute) { - selectedAttributes.add(itemAttribute); + public void appendSelectedAttribute(ItemAttribute itemAttribute, boolean inverted) { + selectedAttributes.add(Pair.of(itemAttribute, inverted)); } @Override protected void clearContents() { selectedAttributes.clear(); } - + @Override protected void init() { super.init(); ItemStack stack = new ItemStack(Items.NAME_TAG); stack.setDisplayName( - new StringTextComponent("Selected Tags").applyTextStyles(TextFormatting.RESET, TextFormatting.BLUE)); + new StringTextComponent("Selected Tags").applyTextStyles(TextFormatting.RESET, TextFormatting.BLUE)); filterInventory.setStackInSlot(1, stack); } @@ -61,8 +62,8 @@ public class AttributeFilterContainer extends AbstractFilterContainer { } protected void addFilterSlots() { - this.addSlot(new SlotItemHandler(filterInventory, 0, 16, 23)); - this.addSlot(new SlotItemHandler(filterInventory, 1, 59, 56) { + this.addSlot(new SlotItemHandler(filterInventory, 0, 16, 22)); + this.addSlot(new SlotItemHandler(filterInventory, 1, 22, 57) { @Override public boolean canTakeStack(PlayerEntity playerIn) { return false; @@ -110,29 +111,37 @@ public class AttributeFilterContainer extends AbstractFilterContainer { @Override protected int getInventoryOffset() { - return 86; + return 83; } @Override protected void readData(ItemStack filterItem) { selectedAttributes = new ArrayList<>(); - whitelistMode = WhitelistMode.values()[filterItem.getOrCreateTag().getInt("WhitelistMode")]; - ListNBT attributes = filterItem.getOrCreateTag().getList("MatchedAttributes", NBT.TAG_COMPOUND); - attributes.forEach(inbt -> selectedAttributes.add(ItemAttribute.fromNBT((CompoundNBT) inbt))); + whitelistMode = WhitelistMode.values()[filterItem.getOrCreateTag() + .getInt("WhitelistMode")]; + ListNBT attributes = filterItem.getOrCreateTag() + .getList("MatchedAttributes", NBT.TAG_COMPOUND); + attributes.forEach(inbt -> { + CompoundNBT compound = (CompoundNBT) inbt; + selectedAttributes.add(Pair.of(ItemAttribute.fromNBT(compound), compound.getBoolean("Inverted"))); + }); } @Override protected void saveData(ItemStack filterItem) { - filterItem.getOrCreateTag().putInt("WhitelistMode", whitelistMode.ordinal()); + filterItem.getOrCreateTag() + .putInt("WhitelistMode", whitelistMode.ordinal()); ListNBT attributes = new ListNBT(); selectedAttributes.forEach(at -> { if (at == null) return; CompoundNBT compoundNBT = new CompoundNBT(); - at.serializeNBT(compoundNBT); + at.getFirst().serializeNBT(compoundNBT); + compoundNBT.putBoolean("Inverted", at.getSecond()); attributes.add(compoundNBT); }); - filterItem.getOrCreateTag().put("MatchedAttributes", attributes); + filterItem.getOrCreateTag() + .put("MatchedAttributes", attributes); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterScreen.java index d31e29cf9..aec61f789 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterScreen.java @@ -16,6 +16,7 @@ import com.simibubi.create.foundation.gui.widgets.Label; import com.simibubi.create.foundation.gui.widgets.SelectionScrollInput; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.Pair; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.item.ItemStack; @@ -30,6 +31,10 @@ public class AttributeFilterScreen extends AbstractFilterScreen { - }); + attributeSelector.removeCallback(); referenceItemChanged(container.filterInventory.getStackInSlot(0)); widgets.add(attributeSelector); @@ -88,8 +96,9 @@ public class AttributeFilterScreen extends AbstractFilterScreen selectedAttributes.add(TextFormatting.GRAY + "- " + at.format())); + .add(TextFormatting.YELLOW + (container.selectedAttributes.isEmpty() ? noSelectedT : selectedT)); + container.selectedAttributes.forEach(at -> selectedAttributes.add(TextFormatting.GRAY + "- " + at.getFirst() + .format(at.getSecond()))); } @@ -101,17 +110,22 @@ public class AttributeFilterScreen extends AbstractFilterScreen { }); return; } add.active = true; - attributeSelector.titled(stack.getDisplayName().getFormattedText() + "..."); + addInverted.active = true; + attributeSelector.titled(stack.getDisplayName() + .getFormattedText() + "..."); attributesOfItem.clear(); for (ItemAttribute itemAttribute : ItemAttribute.types) attributesOfItem.addAll(itemAttribute.listAttributesOf(stack, this.minecraft.world)); - List options = attributesOfItem.stream().map(ItemAttribute::format).collect(Collectors.toList()); + List options = attributesOfItem.stream() + .map(ia -> ia.format(false)) + .collect(Collectors.toList()); attributeSelector.forOptions(options); attributeSelector.active = true; attributeSelector.visible = true; @@ -119,17 +133,20 @@ public class AttributeFilterScreen extends AbstractFilterScreen { attributeSelectorLabel.setTextAndTrim(options.get(i), true, 112); ItemAttribute selected = attributesOfItem.get(i); - for (ItemAttribute existing : container.selectedAttributes) { + for (Pair existing : container.selectedAttributes) { CompoundNBT testTag = new CompoundNBT(); CompoundNBT testTag2 = new CompoundNBT(); - existing.serializeNBT(testTag); + existing.getFirst() + .serializeNBT(testTag); selected.serializeNBT(testTag2); if (testTag.equals(testTag2)) { add.active = false; + addInverted.active = false; return; } } add.active = true; + addInverted.active = true; }); attributeSelector.onChanged(); } @@ -141,8 +158,8 @@ public class AttributeFilterScreen extends AbstractFilterScreen= attributesOfItem.size()) + return false; + add.active = false; + addInverted.active = false; + CompoundNBT tag = new CompoundNBT(); + ItemAttribute itemAttribute = attributesOfItem.get(index); + itemAttribute.serializeNBT(tag); + AllPackets.channel + .sendToServer(new FilterScreenPacket(inverted ? Option.ADD_INVERTED_TAG : Option.ADD_TAG, tag)); + container.appendSelectedAttribute(itemAttribute, inverted); + if (container.selectedAttributes.size() == 1) + selectedAttributes.set(0, TextFormatting.YELLOW + selectedT); + selectedAttributes.add(TextFormatting.GRAY + "- " + itemAttribute.format(inverted)); + return true; + } + @Override protected void contentsCleared() { selectedAttributes.clear(); selectedAttributes.add(TextFormatting.YELLOW + noSelectedT); - if (!lastItemScanned.isEmpty()) + if (!lastItemScanned.isEmpty()) { add.active = true; + addInverted.active = true; + } } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterContainer.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterContainer.java index 6356878cd..483ac1190 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterContainer.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterContainer.java @@ -24,8 +24,8 @@ public class FilterContainer extends AbstractFilterContainer { @Override protected void addFilterSlots() { - int x = 16; - int y = 21; + int x = 23; + int y = 20; for (int row = 0; row < 2; ++row) for (int col = 0; col < 9; ++col) @@ -39,7 +39,7 @@ public class FilterContainer extends AbstractFilterContainer { @Override protected int getInventoryOffset() { - return 100; + return 97; } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterItem.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterItem.java index feb43b008..67f6a9ac1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterItem.java @@ -4,6 +4,8 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import javax.annotation.Nonnull; + import com.simibubi.create.AllItems; import com.simibubi.create.AllKeys; import com.simibubi.create.content.logistics.item.filter.AttributeFilterContainer.WhitelistMode; @@ -36,8 +38,6 @@ import net.minecraftforge.fml.network.NetworkHooks; import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemStackHandler; -import javax.annotation.Nonnull; - public class FilterItem extends Item implements INamedContainerProvider { private FilterType type; @@ -121,12 +121,14 @@ public class FilterItem extends Item implements INamedContainerProvider { ListNBT attributes = filter.getOrCreateTag() .getList("MatchedAttributes", NBT.TAG_COMPOUND); for (INBT inbt : attributes) { - ItemAttribute attribute = ItemAttribute.fromNBT((CompoundNBT) inbt); + CompoundNBT compound = (CompoundNBT) inbt; + ItemAttribute attribute = ItemAttribute.fromNBT(compound); + boolean inverted = compound.getBoolean("Inverted"); if (count > 3) { list.add(TextFormatting.DARK_GRAY + "- ..."); break; } - list.add(TextFormatting.GRAY + "- " + attribute.format()); + list.add(TextFormatting.GRAY + "- " + attribute.format(inverted)); count++; } @@ -211,8 +213,9 @@ public class FilterItem extends Item implements INamedContainerProvider { ListNBT attributes = filter.getOrCreateTag() .getList("MatchedAttributes", NBT.TAG_COMPOUND); for (INBT inbt : attributes) { - ItemAttribute attribute = ItemAttribute.fromNBT((CompoundNBT) inbt); - boolean matches = attribute.appliesTo(stack, world); + CompoundNBT compound = (CompoundNBT) inbt; + ItemAttribute attribute = ItemAttribute.fromNBT(compound); + boolean matches = attribute.appliesTo(stack, world) != compound.getBoolean("Inverted"); if (matches) { switch (whitelistMode) { diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreen.java index 9a1defe51..2144bbda1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreen.java @@ -42,20 +42,20 @@ public class FilterScreen extends AbstractFilterScreen { int x = guiLeft; int y = guiTop; - blacklist = new IconButton(x + 58, y + 72, AllIcons.I_BLACKLIST); + blacklist = new IconButton(x + 18, y + 73, AllIcons.I_BLACKLIST); blacklist.setToolTip(blacklistN); - whitelist = new IconButton(x + 76, y + 72, AllIcons.I_WHITELIST); + whitelist = new IconButton(x + 36, y + 73, AllIcons.I_WHITELIST); whitelist.setToolTip(whitelistN); - blacklistIndicator = new Indicator(x + 58, y + 67, ""); - whitelistIndicator = new Indicator(x + 76, y + 67, ""); + blacklistIndicator = new Indicator(x + 18, y + 67, ""); + whitelistIndicator = new Indicator(x + 36, y + 67, ""); widgets.addAll(Arrays.asList(blacklist, whitelist, blacklistIndicator, whitelistIndicator)); - respectNBT = new IconButton(x + 98, y + 72, AllIcons.I_RESPECT_NBT); + respectNBT = new IconButton(x + 60, y + 73, AllIcons.I_RESPECT_NBT); respectNBT.setToolTip(respectDataN); - ignoreNBT = new IconButton(x + 116, y + 72, AllIcons.I_IGNORE_NBT); + ignoreNBT = new IconButton(x + 78, y + 73, AllIcons.I_IGNORE_NBT); ignoreNBT.setToolTip(ignoreDataN); - respectNBTIndicator = new Indicator(x + 98, y + 67, ""); - ignoreNBTIndicator = new Indicator(x + 116, y + 67, ""); + respectNBTIndicator = new Indicator(x + 60, y + 67, ""); + ignoreNBTIndicator = new Indicator(x + 78, y + 67, ""); widgets.addAll(Arrays.asList(respectNBT, ignoreNBT, respectNBTIndicator, ignoreNBTIndicator)); handleIndicators(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreenPacket.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreenPacket.java index 8d49abeb4..984f455ec 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreenPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreenPacket.java @@ -13,7 +13,7 @@ import net.minecraftforge.fml.network.NetworkEvent.Context; public class FilterScreenPacket extends SimplePacketBase { enum Option { - CLEAR, WHITELIST, WHITELIST2, BLACKLIST, RESPECT_DATA, IGNORE_DATA, ADD_TAG; + CLEAR, WHITELIST, WHITELIST2, BLACKLIST, RESPECT_DATA, IGNORE_DATA, ADD_TAG, ADD_INVERTED_TAG; } private Option option; @@ -75,7 +75,9 @@ public class FilterScreenPacket extends SimplePacketBase { if (option == Option.BLACKLIST) c.whitelistMode = WhitelistMode.BLACKLIST; if (option == Option.ADD_TAG) - c.appendSelectedAttribute(ItemAttribute.fromNBT(data)); + c.appendSelectedAttribute(ItemAttribute.fromNBT(data), false); + if (option == Option.ADD_INVERTED_TAG) + c.appendSelectedAttribute(ItemAttribute.fromNBT(data), true); } }); diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java index 3759744aa..1be6edd4b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java @@ -12,6 +12,7 @@ import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; import com.google.common.base.Predicates; +import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.content.logistics.InWorldProcessing; import com.simibubi.create.foundation.utility.Lang; @@ -95,8 +96,9 @@ public interface ItemAttribute { } @OnlyIn(value = Dist.CLIENT) - default String format() { - return Lang.translate("item_attributes." + getTranslationKey(), getTranslationParameters()); + default String format(boolean inverted) { + return Lang.translate("item_attributes." + getTranslationKey() + (inverted ? ".inverted" : ""), + getTranslationParameters()); } public static enum StandardTraits implements ItemAttribute { @@ -111,6 +113,8 @@ public interface ItemAttribute { EQUIPABLE(s -> s.getEquipmentSlot() != null), FURNACE_FUEL(AbstractFurnaceTileEntity::isFuel), WASHABLE(InWorldProcessing::isWashable), + CRUSHABLE((s, w) -> testRecipe(s, w, AllRecipeTypes.CRUSHING.getType()) + || testRecipe(s, w, AllRecipeTypes.MILLING.getType())), SMELTABLE((s, w) -> testRecipe(s, w, IRecipeType.SMELTING)), SMOKABLE((s, w) -> testRecipe(s, w, IRecipeType.SMOKING)), BLASTABLE((s, w) -> testRecipe(s, w, IRecipeType.BLASTING)); @@ -125,9 +129,11 @@ public interface ItemAttribute { private static boolean testRecipe(ItemStack s, World w, IRecipeType> smelting) { RECIPE_WRAPPER.setInventorySlotContents(0, s.copy()); - return w.getRecipeManager().getRecipe(smelting, RECIPE_WRAPPER, w).isPresent(); + return w.getRecipeManager() + .getRecipe(smelting, RECIPE_WRAPPER, w) + .isPresent(); } - + private StandardTraits(BiPredicate test) { this.testWithWorld = test; } @@ -193,12 +199,18 @@ public interface ItemAttribute { @Override public boolean appliesTo(ItemStack stack) { - return stack.getItem().getTags().contains(tagName); + return stack.getItem() + .getTags() + .contains(tagName); } @Override public List listAttributesOf(ItemStack stack) { - return stack.getItem().getTags().stream().map(InTag::new).collect(Collectors.toList()); + return stack.getItem() + .getTags() + .stream() + .map(InTag::new) + .collect(Collectors.toList()); } @Override @@ -240,7 +252,8 @@ public interface ItemAttribute { @Override public List listAttributesOf(ItemStack stack) { - ItemGroup group = stack.getItem().getGroup(); + ItemGroup group = stack.getItem() + .getGroup(); return group == null ? Collections.emptyList() : Arrays.asList(new InItemGroup(group)); } @@ -249,9 +262,11 @@ public interface ItemAttribute { return "in_item_group"; } + @Override @OnlyIn(value = Dist.CLIENT) - public String format() { - return Lang.translate("item_attributes." + getTranslationKey(), I18n.format(group.getTranslationKey())); + public String format(boolean inverted) { + return Lang.translate("item_attributes." + getTranslationKey() + (inverted ? ".inverted" : ""), + I18n.format(group.getTranslationKey())); } @Override @@ -263,7 +278,8 @@ public interface ItemAttribute { public ItemAttribute readNBT(CompoundNBT nbt) { String readPath = nbt.getString("path"); for (ItemGroup group : ItemGroup.GROUPS) - if (group.getPath().equals(readPath)) + if (group.getPath() + .equals(readPath)) return new InItemGroup(group); return null; } @@ -280,12 +296,14 @@ public interface ItemAttribute { @Override public boolean appliesTo(ItemStack stack) { - return modId.equals(stack.getItem().getCreatorModId(stack)); + return modId.equals(stack.getItem() + .getCreatorModId(stack)); } @Override public List listAttributesOf(ItemStack stack) { - String id = stack.getItem().getCreatorModId(stack); + String id = stack.getItem() + .getCreatorModId(stack); return id == null ? Collections.emptyList() : Arrays.asList(new AddedBy(id)); } @@ -296,9 +314,11 @@ public interface ItemAttribute { @Override public Object[] getTranslationParameters() { - Optional modContainerById = ModList.get().getModContainerById(modId); - String name = modContainerById.map(ModContainer::getModInfo).map(IModInfo::getDisplayName) - .orElse(StringUtils.capitalize(modId)); + Optional modContainerById = ModList.get() + .getModContainerById(modId); + String name = modContainerById.map(ModContainer::getModInfo) + .map(IModInfo::getDisplayName) + .orElse(StringUtils.capitalize(modId)); return new Object[] { name }; } diff --git a/src/main/java/com/simibubi/create/content/logistics/packet/ConfigureStockswitchPacket.java b/src/main/java/com/simibubi/create/content/logistics/packet/ConfigureStockswitchPacket.java index 3f6febd1f..7822cc9f9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packet/ConfigureStockswitchPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/packet/ConfigureStockswitchPacket.java @@ -10,11 +10,13 @@ public class ConfigureStockswitchPacket extends TileEntityConfigurationPacket maxSize * 1000) { - Minecraft.getInstance().player.sendMessage(new StringTextComponent( - Lang.translate("schematics.uploadTooLarge") + " (" + size / 1000 + " KB).")); - Minecraft.getInstance().player.sendMessage( - new StringTextComponent(Lang.translate("schematics.maxAllowedSize") + " " + maxSize + " KB")); + if (!validateSizeLimitation(size)) return; - } in = Files.newInputStream(path, StandardOpenOption.READ); activeUploads.put(schematic, in); @@ -83,6 +77,20 @@ public class ClientSchematicLoader { } } + public static boolean validateSizeLimitation(long size) { + if (Minecraft.getInstance().isSingleplayer()) + return true; + Integer maxSize = AllConfigs.SERVER.schematics.maxTotalSchematicSize.get(); + if (size > maxSize * 1000) { + Minecraft.getInstance().player.sendMessage(new StringTextComponent( + Lang.translate("schematics.uploadTooLarge") + " (" + size / 1000 + " KB).")); + Minecraft.getInstance().player.sendMessage( + new StringTextComponent(Lang.translate("schematics.maxAllowedSize") + " " + maxSize + " KB")); + return false; + } + return true; + } + private void continueUpload(String schematic) { if (activeUploads.containsKey(schematic)) { Integer maxPacketSize = AllConfigs.SERVER.schematics.maxSchematicPacketSize.get(); diff --git a/src/main/java/com/simibubi/create/content/schematics/ServerSchematicLoader.java b/src/main/java/com/simibubi/create/content/schematics/ServerSchematicLoader.java index 3755dff63..8c8e117fa 100644 --- a/src/main/java/com/simibubi/create/content/schematics/ServerSchematicLoader.java +++ b/src/main/java/com/simibubi/create/content/schematics/ServerSchematicLoader.java @@ -14,7 +14,10 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Stream; +import org.apache.commons.io.IOUtils; + import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; import com.simibubi.create.Create; import com.simibubi.create.content.schematics.block.SchematicTableTileEntity; import com.simibubi.create.content.schematics.item.SchematicItem; @@ -23,12 +26,17 @@ import com.simibubi.create.foundation.config.CSchematics; import com.simibubi.create.foundation.utility.FilesHelper; import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; +import net.minecraft.world.gen.feature.template.Template; public class ServerSchematicLoader { @@ -92,17 +100,12 @@ public class ServerSchematicLoader { // Unsupported Format if (!schematic.endsWith(".nbt")) { Create.logger.warn("Attempted Schematic Upload with non-supported Format: " + playerSchematicId); + return; } // Too big - Integer maxFileSize = getConfig().maxTotalSchematicSize.get(); - if (size > maxFileSize * 1000) { - player.sendMessage(new TranslationTextComponent("create.schematics.uploadTooLarge") - .appendSibling(new StringTextComponent(" (" + size / 1000 + " KB)."))); - player.sendMessage(new TranslationTextComponent("create.schematics.maxAllowedSize") - .appendSibling(new StringTextComponent(" " + maxFileSize + " KB"))); + if (!validateSchematicSizeOnServer(player, size)) return; - } // Skip existing Uploads if (activeUploads.containsKey(playerSchematicId)) @@ -134,8 +137,7 @@ public class ServerSchematicLoader { // Open Stream OutputStream writer = Files.newOutputStream(Paths.get(getSchematicPath(), playerSchematicId), StandardOpenOption.CREATE_NEW); - activeUploads.put(playerSchematicId, - new SchematicUploadEntry(writer, size, player.getServerWorld(), pos)); + activeUploads.put(playerSchematicId, new SchematicUploadEntry(writer, size, player.getServerWorld(), pos)); // Notify Tile Entity table.startUpload(schematic); @@ -146,6 +148,18 @@ public class ServerSchematicLoader { } } + protected boolean validateSchematicSizeOnServer(ServerPlayerEntity player, long size) { + Integer maxFileSize = getConfig().maxTotalSchematicSize.get(); + if (size > maxFileSize * 1000) { + player.sendMessage(new TranslationTextComponent("create.schematics.uploadTooLarge") + .appendSibling(new StringTextComponent(" (" + size / 1000 + " KB)."))); + player.sendMessage(new TranslationTextComponent("create.schematics.maxAllowedSize") + .appendSibling(new StringTextComponent(" " + maxFileSize + " KB"))); + return false; + } + return true; + } + public CSchematics getConfig() { return AllConfigs.SERVER.schematics; } @@ -231,7 +245,7 @@ public class ServerSchematicLoader { SchematicUploadEntry removed = activeUploads.remove(playerSchematicId); World world = removed.world; BlockPos pos = removed.tablePos; - + Create.logger.info("New Schematic Uploaded: " + playerSchematicId); if (pos == null) return; @@ -252,6 +266,65 @@ public class ServerSchematicLoader { e.printStackTrace(); } } - } + + public void handleInstantSchematic(ServerPlayerEntity player, String schematic, World world, BlockPos pos, + BlockPos bounds) { + String playerPath = getSchematicPath() + "/" + player.getName() + .getFormattedText(); + String playerSchematicId = player.getName() + .getFormattedText() + "/" + schematic; + FilesHelper.createFolderIfMissing(playerPath); + + // Unsupported Format + if (!schematic.endsWith(".nbt")) { + Create.logger.warn("Attempted Schematic Upload with non-supported Format: " + playerSchematicId); + return; + } + + // Not holding S&Q + if (!AllItems.SCHEMATIC_AND_QUILL.isIn(player.getHeldItemMainhand())) + return; + + try { + // Delete schematic with same name + Path path = Paths.get(getSchematicPath(), playerSchematicId); + Files.deleteIfExists(path); + + // Too many Schematics + Stream list = Files.list(Paths.get(playerPath)); + if (list.count() >= getConfig().maxSchematics.get()) { + Stream list2 = Files.list(Paths.get(playerPath)); + Optional lastFilePath = list2.filter(f -> !Files.isDirectory(f)) + .min(Comparator.comparingLong(f -> f.toFile() + .lastModified())); + list2.close(); + if (lastFilePath.isPresent()) + Files.deleteIfExists(lastFilePath.get()); + } + list.close(); + + Template t = new Template(); + t.takeBlocksFromWorld(world, pos, bounds, true, Blocks.AIR); + + OutputStream outputStream = null; + try { + outputStream = Files.newOutputStream(path, StandardOpenOption.CREATE); + CompoundNBT nbttagcompound = t.writeToNBT(new CompoundNBT()); + CompressedStreamTools.writeCompressed(nbttagcompound, outputStream); + player.setHeldItem(Hand.MAIN_HAND, SchematicItem.create(schematic, player.getName() + .getFormattedText())); + + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (outputStream != null) + IOUtils.closeQuietly(outputStream); + } + } catch (IOException e) { + Create.logger.error("Exception Thrown in direct Schematic Upload: " + playerSchematicId); + e.printStackTrace(); + } + } + } diff --git a/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableContainer.java b/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableContainer.java index 00192180d..b1ae26663 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableContainer.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableContainer.java @@ -41,7 +41,7 @@ public class SchematicTableContainer extends Container { } protected void init() { - inputSlot = new SlotItemHandler(te.inventory, 0, -9, 40) { + inputSlot = new SlotItemHandler(te.inventory, 0, -35, 41) { @Override public boolean isItemValid(ItemStack stack) { return AllItems.EMPTY_SCHEMATIC.isIn(stack) || AllItems.SCHEMATIC_AND_QUILL.isIn(stack) @@ -49,7 +49,7 @@ public class SchematicTableContainer extends Container { } }; - outputSlot = new SlotItemHandler(te.inventory, 1, 75, 40) { + outputSlot = new SlotItemHandler(te.inventory, 1, 110, 41) { @Override public boolean isItemValid(ItemStack stack) { return false; diff --git a/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableScreen.java b/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableScreen.java index b063dfc60..14a8052f9 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableScreen.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableScreen.java @@ -38,6 +38,8 @@ public class SchematicTableScreen extends AbstractSimiContainerScreen availableSchematics = CreateClient.schematicSender.getAvailableSchematics(); - schematicsLabel = new Label(mainLeft + 36, mainTop + 26, "").withShadow(); + schematicsLabel = new Label(mainLeft + 49, mainTop + 26, "").withShadow(); schematicsLabel.text = ""; if (!availableSchematics.isEmpty()) { schematicsArea = - new SelectionScrollInput(mainLeft + 33, mainTop + 23, 134, 14).forOptions(availableSchematics) + new SelectionScrollInput(mainLeft + 45, mainTop + 21, 139, 18).forOptions(availableSchematics) .titled(availableSchematicsTitle) .writingTo(schematicsLabel); widgets.add(schematicsArea); widgets.add(schematicsLabel); } - confirmButton = new IconButton(mainLeft + 69, mainTop + 55, AllIcons.I_CONFIRM); - folderButton = new IconButton(mainLeft + 204, mainTop + 6, AllIcons.I_OPEN_FOLDER); - refreshButton = new IconButton(mainLeft + 204, mainTop + 26, AllIcons.I_REFRESH); + confirmButton = new IconButton(mainLeft + 44, mainTop + 56, AllIcons.I_CONFIRM); + + folderButton = new IconButton(mainLeft + 21, mainTop + 21, AllIcons.I_OPEN_FOLDER); + folderButton.setToolTip(folder); + refreshButton = new IconButton(mainLeft + 207, mainTop + 21, AllIcons.I_REFRESH); + refreshButton.setToolTip(refresh); + widgets.add(confirmButton); widgets.add(folderButton); widgets.add(refreshButton); @@ -104,13 +110,13 @@ public class SchematicTableScreen extends AbstractSimiContainerScreen { public SchematicannonRenderer(TileEntityRendererDispatcher dispatcher) { super(dispatcher); } + + @Override + public boolean isGlobalRenderer(SchematicannonTileEntity p_188185_1_) { + return true; + } @Override protected void renderSafe(SchematicannonTileEntity tileEntityIn, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { - Minecraft.getInstance().getTextureManager().bindTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE); - double yaw = 0; double pitch = 40; double recoil = 0; @@ -96,8 +96,8 @@ public class SchematicannonRenderer extends SafeTileEntityRenderer launched.totalTicks - 10) { + if ((launched.ticksRemaining + 1 - partialTicks) > launched.totalTicks - 10) recoil = Math.max(recoil, (launched.ticksRemaining + 1 - partialTicks) - launched.totalTicks + 10); - } // Render particles for launch if (launched.ticksRemaining == launched.totalTicks && tileEntityIn.firstRenderTick) { diff --git a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonScreen.java b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonScreen.java index 42fabac2a..ddcad6026 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonScreen.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonScreen.java @@ -15,12 +15,15 @@ import com.simibubi.create.foundation.item.ItemDescription.Palette; import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.utility.Lang; + +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.widget.Widget; import net.minecraft.client.renderer.Rectangle2d; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.item.ItemStack; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextFormatting; +import net.minecraft.util.text.TranslationTextComponent; import java.util.ArrayList; import java.util.Collections; @@ -31,6 +34,9 @@ import static net.minecraft.util.text.TextFormatting.GRAY; public class SchematicannonScreen extends AbstractSimiContainerScreen { + private static final AllGuiTextures BG_BOTTOM = AllGuiTextures.SCHEMATICANNON_BOTTOM; + private static final AllGuiTextures BG_TOP = AllGuiTextures.SCHEMATICANNON_TOP; + protected Vector replaceLevelIndicators; protected Vector replaceLevelButtons; @@ -47,27 +53,37 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen extraAreas; + protected List placementSettingWidgets; private final String title = Lang.translate("gui.schematicannon.title"); - private final String settingsTitle = Lang.translate("gui.schematicannon.settingsTitle"); private final String listPrinter = Lang.translate("gui.schematicannon.listPrinter"); private final String _gunpowderLevel = "gui.schematicannon.gunpowderLevel"; private final String _shotsRemaining = "gui.schematicannon.shotsRemaining"; + private final String _showSettings = "gui.schematicannon.showOptions"; private final String _shotsRemainingWithBackup = "gui.schematicannon.shotsRemainingWithBackup"; + private final String _slotGunpowder = "gui.schematicannon.slot.gunpowder"; + private final String _slotListPrinter = "gui.schematicannon.slot.listPrinter"; + private final String _slotSchematic = "gui.schematicannon.slot.schematic"; + private final String optionEnabled = Lang.translate("gui.schematicannon.optionEnabled"); private final String optionDisabled = Lang.translate("gui.schematicannon.optionDisabled"); private final ItemStack renderedItem = AllBlocks.SCHEMATICANNON.asStack(); + private IconButton confirmButton; + private IconButton showSettingsButton; + private Indicator showSettingsIndicator; + public SchematicannonScreen(SchematicannonContainer container, PlayerInventory inventory, - ITextComponent p_i51105_3_) { + ITextComponent p_i51105_3_) { super(container, inventory, p_i51105_3_); + placementSettingWidgets = new ArrayList<>(); } @Override protected void init() { - setWindowSize(AllGuiTextures.SCHEMATICANNON_BG.width + 50, AllGuiTextures.SCHEMATICANNON_BG.height + 80); + setWindowSize(BG_TOP.width + 50, BG_BOTTOM.height + BG_TOP.height + 80); super.init(); int x = guiLeft + 20; @@ -76,63 +92,87 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen(4); - replaceLevelIndicators = new Vector<>(4); - List icons = ImmutableList - .of(AllIcons.I_DONT_REPLACE, AllIcons.I_REPLACE_SOLID, AllIcons.I_REPLACE_ANY, - AllIcons.I_REPLACE_EMPTY); - List toolTips = ImmutableList - .of(Lang.translate("gui.schematicannon.option.dontReplaceSolid"), - Lang.translate("gui.schematicannon.option.replaceWithSolid"), - Lang.translate("gui.schematicannon.option.replaceWithAny"), - Lang.translate("gui.schematicannon.option.replaceWithEmpty")); - - for (int i = 0; i < 4; i++) { - replaceLevelIndicators.add(new Indicator(x + 16 + i * 18, y + 96, "")); - replaceLevelButtons.add(new IconButton(x + 16 + i * 18, y + 101, icons.get(i))); - replaceLevelButtons.get(i).setToolTip(toolTips.get(i)); - } - widgets.addAll(replaceLevelButtons); - widgets.addAll(replaceLevelIndicators); - - // Other Settings - skipMissingButton = new IconButton(x + 106, y + 101, AllIcons.I_SKIP_MISSING); - skipMissingButton.setToolTip(Lang.translate("gui.schematicannon.option.skipMissing")); - skipMissingIndicator = new Indicator(x + 106, y + 96, ""); - Collections.addAll(widgets, skipMissingButton, skipMissingIndicator); - - skipTilesButton = new IconButton(x + 124, y + 101, AllIcons.I_SKIP_TILES); - skipTilesButton.setToolTip(Lang.translate("gui.schematicannon.option.skipTileEntities")); - skipTilesIndicator = new Indicator(x + 124, y + 96, ""); - Collections.addAll(widgets, skipTilesButton, skipTilesIndicator); + Collections.addAll(widgets, playButton, playIndicator, pauseButton, pauseIndicator, resetButton, + resetIndicator); extraAreas = new ArrayList<>(); extraAreas.add(new Rectangle2d(guiLeft + 240, guiTop + 88, 84, 113)); + confirmButton = new IconButton(x + 180, guiTop + 117, AllIcons.I_CONFIRM); + widgets.add(confirmButton); + showSettingsButton = new IconButton(guiLeft + 29, guiTop + 117, AllIcons.I_PLACEMENT_SETTINGS); + showSettingsButton.setToolTip(Lang.translate(_showSettings)); + widgets.add(showSettingsButton); + showSettingsIndicator = new Indicator(guiLeft + 29, guiTop + 111, ""); + widgets.add(showSettingsIndicator); + tick(); } + private void initPlacementSettings() { + widgets.removeAll(placementSettingWidgets); + placementSettingWidgets.clear(); + + if (placementSettingsHidden()) + return; + + int x = guiLeft + 20; + int y = guiTop; + + // Replace settings + replaceLevelButtons = new Vector<>(4); + replaceLevelIndicators = new Vector<>(4); + List icons = ImmutableList.of(AllIcons.I_DONT_REPLACE, AllIcons.I_REPLACE_SOLID, + AllIcons.I_REPLACE_ANY, AllIcons.I_REPLACE_EMPTY); + List toolTips = ImmutableList.of(Lang.translate("gui.schematicannon.option.dontReplaceSolid"), + Lang.translate("gui.schematicannon.option.replaceWithSolid"), + Lang.translate("gui.schematicannon.option.replaceWithAny"), + Lang.translate("gui.schematicannon.option.replaceWithEmpty")); + + for (int i = 0; i < 4; i++) { + replaceLevelIndicators.add(new Indicator(x + 33 + i * 18, y + 111, "")); + replaceLevelButtons.add(new IconButton(x + 33 + i * 18, y + 117, icons.get(i))); + replaceLevelButtons.get(i) + .setToolTip(toolTips.get(i)); + } + placementSettingWidgets.addAll(replaceLevelButtons); + placementSettingWidgets.addAll(replaceLevelIndicators); + + // Other Settings + skipMissingButton = new IconButton(x + 111, y + 117, AllIcons.I_SKIP_MISSING); + skipMissingButton.setToolTip(Lang.translate("gui.schematicannon.option.skipMissing")); + skipMissingIndicator = new Indicator(x + 111, y + 111, ""); + Collections.addAll(placementSettingWidgets, skipMissingButton, skipMissingIndicator); + + skipTilesButton = new IconButton(x + 129, y + 117, AllIcons.I_SKIP_TILES); + skipTilesButton.setToolTip(Lang.translate("gui.schematicannon.option.skipTileEntities")); + skipTilesIndicator = new Indicator(x + 129, y + 111, ""); + Collections.addAll(placementSettingWidgets, skipTilesButton, skipTilesIndicator); + + widgets.addAll(placementSettingWidgets); + } + + protected boolean placementSettingsHidden() { + return showSettingsIndicator.state == State.OFF; + } + @Override public void tick() { - SchematicannonTileEntity te = container.getTileEntity(); - replaceLevelIndicators.get(0).state = te.replaceMode == 0 ? State.ON : State.OFF; - for (int replaceMode = 1; replaceMode < replaceLevelButtons.size(); replaceMode++) - replaceLevelIndicators.get(replaceMode).state = replaceMode <= te.replaceMode ? State.ON : State.OFF; - skipMissingIndicator.state = te.skipMissing ? State.ON : State.OFF; - skipTilesIndicator.state = !te.replaceTileEntities ? State.ON : State.OFF; + if (!placementSettingsHidden()) { + for (int replaceMode = 0; replaceMode < replaceLevelButtons.size(); replaceMode++) + replaceLevelIndicators.get(replaceMode).state = replaceMode == te.replaceMode ? State.ON : State.OFF; + skipMissingIndicator.state = te.skipMissing ? State.ON : State.OFF; + skipTilesIndicator.state = !te.replaceTileEntities ? State.ON : State.OFF; + } playIndicator.state = State.OFF; pauseIndicator.state = State.OFF; @@ -167,12 +207,18 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen tip = button.getToolTip(); tip.add(TextFormatting.BLUE + (enabled ? optionEnabled : optionDisabled)); - tip - .addAll(TooltipHelper - .cutString(Lang.translate("gui.schematicannon.option." + tooltipKey + ".description"), GRAY, - GRAY)); + tip.addAll(TooltipHelper.cutString(Lang.translate("gui.schematicannon.option." + tooltipKey + ".description"), + GRAY, GRAY)); } @Override protected void renderWindow(int mouseX, int mouseY, float partialTicks) { AllGuiTextures.PLAYER_INVENTORY.draw(this, guiLeft - 10, guiTop + 145); - AllGuiTextures.SCHEMATICANNON_BG.draw(this, guiLeft + 20, guiTop); + BG_TOP.draw(this, guiLeft + 20, guiTop); + BG_BOTTOM.draw(this, guiLeft + 20, guiTop + BG_TOP.height); SchematicannonTileEntity te = container.getTileEntity(); renderPrintingProgress(te.schematicProgress); renderFuelBar(te.fuelLevel); renderChecklistPrinterProgress(te.bookPrintingProgress); - if (!te.inventory.getStackInSlot(0).isEmpty()) + if (!te.inventory.getStackInSlot(0) + .isEmpty()) renderBlueprintHighlight(); GuiGameElement.of(renderedItem) - .at(guiLeft + 240, guiTop + 120) - .scale(5) - .render(); + .at(guiLeft + 230, guiTop + 110) + .scale(5) + .render(); - - font.drawString(title, guiLeft + 80, guiTop + 10, AllGuiTextures.FONT_COLOR); + font.drawStringWithShadow(title, guiLeft + 80, guiTop + 3, 0xfefefe); String msg = Lang.translate("schematicannon.status." + te.statusMsg); int stringWidth = font.getStringWidth(msg); if (te.missingItem != null) { stringWidth += 15; - itemRenderer.renderItemIntoGUI(te.missingItem, guiLeft + 145, guiTop + 25); + itemRenderer.renderItemIntoGUI(te.missingItem, guiLeft + 150, guiTop + 46); } - font.drawStringWithShadow(msg, guiLeft + 20 + 96 - stringWidth / 2, guiTop + 30, 0xCCDDFF); - - font.drawString(settingsTitle, guiLeft + 20 + 13, guiTop + 84, AllGuiTextures.FONT_COLOR); - font - .drawString(playerInventory.getDisplayName().getFormattedText(), guiLeft - 10 + 7, guiTop + 145 + 6, - 0x666666); + font.drawStringWithShadow(msg, guiLeft + 20 + 102 - stringWidth / 2, guiTop + 50, 0xCCDDFF); + font.drawString(playerInventory.getDisplayName() + .getFormattedText(), guiLeft - 10 + 7, guiTop + 145 + 6, 0x666666); // to see or debug the bounds of the extra area uncomment the following lines // Rectangle2d r = extraAreas.get(0); @@ -241,92 +283,128 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen= fuelX && mouseY >= fuelY && mouseX <= fuelX + AllGuiTextures.SCHEMATICANNON_FUEL.width - && mouseY <= fuelY + AllGuiTextures.SCHEMATICANNON_FUEL.height) { - container.getTileEntity(); - - double fuelUsageRate = te.getFuelUsageRate(); - int shotsLeft = (int) (te.fuelLevel / fuelUsageRate); - int shotsLeftWithItems = (int) (shotsLeft - + te.inventory.getStackInSlot(4).getCount() * (te.getFuelAddedByGunPowder() / fuelUsageRate)); - - List tooltip = new ArrayList<>(); - float f = te.hasCreativeCrate ? 100 : te.fuelLevel * 100; - tooltip.add(Lang.translate(_gunpowderLevel, "" + (int) f)); - if (!te.hasCreativeCrate) - tooltip.add(GRAY + Lang.translate(_shotsRemaining, "" + TextFormatting.BLUE + shotsLeft)); - if (shotsLeftWithItems != shotsLeft) - tooltip - .add(GRAY + Lang - .translate(_shotsRemainingWithBackup, "" + TextFormatting.BLUE + shotsLeftWithItems)); - + && mouseY <= fuelY + AllGuiTextures.SCHEMATICANNON_FUEL.height) { + List tooltip = getFuelLevelTooltip(te); renderTooltip(tooltip, mouseX, mouseY); } + if (hoveredSlot != null && !hoveredSlot.getHasStack()) { + if (hoveredSlot.getSlotIndex() == 0) + renderTooltip( + TooltipHelper.cutString(Lang.translate(_slotSchematic), TextFormatting.GRAY, TextFormatting.BLUE), + mouseX, mouseY); + if (hoveredSlot.getSlotIndex() == 2) + renderTooltip( + TooltipHelper.cutString(Lang.translate(_slotListPrinter), TextFormatting.GRAY, TextFormatting.BLUE), + mouseX, mouseY); + if (hoveredSlot.getSlotIndex() == 4) + renderTooltip( + TooltipHelper.cutString(Lang.translate(_slotGunpowder), TextFormatting.GRAY, TextFormatting.BLUE), + mouseX, mouseY); + } + if (te.missingItem != null) { - int missingBlockX = guiLeft + 145, missingBlockY = guiTop + 25; + int missingBlockX = guiLeft + 150, missingBlockY = guiTop + 46; if (mouseX >= missingBlockX && mouseY >= missingBlockY && mouseX <= missingBlockX + 16 - && mouseY <= missingBlockY + 16) { + && mouseY <= missingBlockY + 16) { renderTooltip(te.missingItem, mouseX, mouseY); } } - int paperX = guiLeft + 20 + 202, paperY = guiTop + 20; - if (mouseX >= paperX && mouseY >= paperY && mouseX <= paperX + 16 && mouseY <= paperY + 16) { + int paperX = guiLeft + 132, paperY = guiTop + 19; + if (mouseX >= paperX && mouseY >= paperY && mouseX <= paperX + 16 && mouseY <= paperY + 16) renderTooltip(listPrinter, mouseX, mouseY); - } super.renderWindowForeground(mouseX, mouseY, partialTicks); } - @Override - public boolean mouseClicked(double x, double y, int button) { + protected List getFuelLevelTooltip(SchematicannonTileEntity te) { + double fuelUsageRate = te.getFuelUsageRate(); + int shotsLeft = (int) (te.fuelLevel / fuelUsageRate); + int shotsLeftWithItems = (int) (shotsLeft + te.inventory.getStackInSlot(4) + .getCount() * (te.getFuelAddedByGunPowder() / fuelUsageRate)); + List tooltip = new ArrayList<>(); - for (int replaceMode = 0; replaceMode < replaceLevelButtons.size(); replaceMode++) { - if (!replaceLevelButtons.get(replaceMode).isHovered()) - continue; - if (container.getTileEntity().replaceMode == replaceMode) - continue; - sendOptionUpdate(Option.values()[replaceMode], true); + if (te.hasCreativeCrate) { + tooltip.add(Lang.translate(_gunpowderLevel, "" + 100)); + tooltip.add(TextFormatting.DARK_PURPLE + "(" + new TranslationTextComponent(AllBlocks.CREATIVE_CRATE.get() + .getTranslationKey()).getFormattedText() + ")"); + return tooltip; } - if (skipMissingButton.isHovered()) - sendOptionUpdate(Option.SKIP_MISSING, !container.getTileEntity().skipMissing); - if (skipTilesButton.isHovered()) - sendOptionUpdate(Option.SKIP_TILES, !container.getTileEntity().replaceTileEntities); + float f = te.fuelLevel * 100; + tooltip.add(Lang.translate(_gunpowderLevel, "" + (int) f)); + tooltip.add(GRAY + Lang.translate(_shotsRemaining, "" + TextFormatting.BLUE + shotsLeft)); + if (shotsLeftWithItems != shotsLeft) + tooltip + .add(GRAY + Lang.translate(_shotsRemainingWithBackup, "" + TextFormatting.BLUE + shotsLeftWithItems)); + return tooltip; + } + + @Override + public boolean mouseClicked(double x, double y, int button) { + if (showSettingsButton.isHovered()) { + showSettingsIndicator.state = placementSettingsHidden() ? State.GREEN : State.OFF; + initPlacementSettings(); + } + + if (confirmButton.isHovered()) { + Minecraft.getInstance().player.closeScreen(); + return true; + } + + if (!placementSettingsHidden()) { + for (int replaceMode = 0; replaceMode < replaceLevelButtons.size(); replaceMode++) { + if (!replaceLevelButtons.get(replaceMode) + .isHovered()) + continue; + if (container.getTileEntity().replaceMode == replaceMode) + continue; + sendOptionUpdate(Option.values()[replaceMode], true); + } + if (skipMissingButton.isHovered()) + sendOptionUpdate(Option.SKIP_MISSING, !container.getTileEntity().skipMissing); + if (skipTilesButton.isHovered()) + sendOptionUpdate(Option.SKIP_TILES, !container.getTileEntity().replaceTileEntities); + } if (playButton.isHovered() && playButton.active) sendOptionUpdate(Option.PLAY, true); @@ -344,8 +422,8 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen { - }); - guiScreenIn.setTitle(Lang.translate("schematicAndQuill.prompt")); - guiScreenIn.setButtonTextConfirm(Lang.translate("action.saveToFile")); - guiScreenIn.setButtonTextAbort(Lang.translate("action.discard")); - ScreenOpener.open(guiScreenIn); + ScreenOpener.open(new SchematicPromptScreen()); return; } @@ -128,6 +125,13 @@ public class SchematicAndQuillHandler { firstPos = selectedPos; Lang.sendStatus(player, "schematicAndQuill.firstPos"); } + + public void discard() { + ClientPlayerEntity player = Minecraft.getInstance().player; + firstPos = null; + secondPos = null; + Lang.sendStatus(player, "schematicAndQuill.abort"); + } public void tick() { if (!isActive()) @@ -200,11 +204,13 @@ public class SchematicAndQuillHandler { && Minecraft.getInstance().currentScreen == null; } - public void saveSchematic(String string) { + public void saveSchematic(String string, boolean convertImmediately) { Template t = new Template(); MutableBoundingBox bb = new MutableBoundingBox(firstPos, secondPos); - t.takeBlocksFromWorld(Minecraft.getInstance().world, new BlockPos(bb.minX, bb.minY, bb.minZ), - new BlockPos(bb.getXSize(), bb.getYSize(), bb.getZSize()), true, Blocks.AIR); + BlockPos origin = new BlockPos(bb.minX, bb.minY, bb.minZ); + BlockPos bounds = new BlockPos(bb.getXSize(), bb.getYSize(), bb.getZSize()); + + t.takeBlocksFromWorld(Minecraft.getInstance().world, origin, bounds, true, Blocks.AIR); if (string.isEmpty()) string = Lang.translate("schematicAndQuill.fallbackName"); @@ -214,9 +220,10 @@ public class SchematicAndQuillHandler { String filename = FilesHelper.findFirstValidFilename(string, folderPath, "nbt"); String filepath = folderPath + "/" + filename; + Path path = Paths.get(filepath); OutputStream outputStream = null; try { - outputStream = Files.newOutputStream(Paths.get(filepath), StandardOpenOption.CREATE); + outputStream = Files.newOutputStream(path, StandardOpenOption.CREATE); CompoundNBT nbttagcompound = t.writeToNBT(new CompoundNBT()); CompressedStreamTools.writeCompressed(nbttagcompound, outputStream); } catch (IOException e) { @@ -228,6 +235,23 @@ public class SchematicAndQuillHandler { firstPos = null; secondPos = null; Lang.sendStatus(Minecraft.getInstance().player, "schematicAndQuill.saved", filepath); + + if (!convertImmediately) + return; + if (!Files.exists(path)) { + Create.logger.fatal("Missing Schematic file: " + path.toString()); + return; + } + try { + if (!ClientSchematicLoader.validateSizeLimitation(Files.size(path))) + return; + AllPackets.channel.sendToServer(new InstantSchematicPacket(filename, origin, bounds)); + + } catch (IOException e) { + Create.logger.fatal("Error finding Schematic file: " + path.toString()); + e.printStackTrace(); + return; + } } private Outliner outliner() { diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicEditScreen.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicEditScreen.java index 1f1c91ea4..401aff0c9 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicEditScreen.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicEditScreen.java @@ -8,11 +8,14 @@ import com.simibubi.create.AllItems; import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.AllGuiTextures; +import com.simibubi.create.foundation.gui.AllIcons; +import com.simibubi.create.foundation.gui.widgets.IconButton; import com.simibubi.create.foundation.gui.widgets.Label; 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; @@ -26,12 +29,12 @@ public class SchematicEditScreen extends AbstractSimiScreen { private TextFieldWidget xInput; private TextFieldWidget yInput; private TextFieldWidget zInput; + private IconButton confirmButton; private final List rotationOptions = Lang.translatedOptions("schematic.rotation", "none", "cw90", "cw180", "cw270"); private final List mirrorOptions = Lang.translatedOptions("schematic.mirror", "none", "leftRight", "frontBack"); - private final String positionLabel = Lang.translate("schematic.position"); private final String rotationLabel = Lang.translate("schematic.rotation"); private final String mirrorLabel = Lang.translate("schematic.mirror"); @@ -41,16 +44,18 @@ public class SchematicEditScreen extends AbstractSimiScreen { @Override protected void init() { - setWindowSize(AllGuiTextures.SCHEMATIC.width + 50, AllGuiTextures.SCHEMATIC.height); + AllGuiTextures background = AllGuiTextures.SCHEMATIC; + setWindowSize(background.width + 50, background.height); int x = guiLeft; int y = guiTop; handler = CreateClient.schematicHandler; - xInput = new TextFieldWidget(font, x + 75, y + 32, 32, 10, ""); - yInput = new TextFieldWidget(font, x + 115, y + 32, 32, 10, ""); - zInput = new TextFieldWidget(font, x + 155, y + 32, 32, 10, ""); + xInput = new TextFieldWidget(font, x + 50, y + 26, 34, 10, ""); + yInput = new TextFieldWidget(font, x + 90, y + 26, 34, 10, ""); + zInput = new TextFieldWidget(font, x + 130, y + 26, 34, 10, ""); - BlockPos anchor = handler.getTransformation().getAnchor(); + BlockPos anchor = handler.getTransformation() + .getAnchor(); if (handler.isDeployed()) { xInput.setText("" + anchor.getX()); yInput.setText("" + anchor.getY()); @@ -80,18 +85,29 @@ public class SchematicEditScreen extends AbstractSimiScreen { }); } - PlacementSettings settings = handler.getTransformation().toSettings(); - Label labelR = new Label(x + 99, y + 52, "").withShadow(); - rotationArea = new SelectionScrollInput(x + 96, y + 49, 94, 14).forOptions(rotationOptions).titled("Rotation") - .setState(settings.getRotation().ordinal()).writingTo(labelR); + PlacementSettings settings = handler.getTransformation() + .toSettings(); + Label labelR = new Label(x + 50, y + 48, "").withShadow(); + rotationArea = new SelectionScrollInput(x + 45, y + 43, 118, 18).forOptions(rotationOptions) + .titled(rotationLabel) + .setState(settings.getRotation() + .ordinal()) + .writingTo(labelR); - Label labelM = new Label(x + 99, y + 72, "").withShadow(); - mirrorArea = new SelectionScrollInput(x + 96, y + 69, 94, 14).forOptions(mirrorOptions).titled("Mirror") - .setState(settings.getMirror().ordinal()).writingTo(labelM); + Label labelM = new Label(x + 50, y + 70, "").withShadow(); + mirrorArea = new SelectionScrollInput(x + 45, y + 65, 118, 18).forOptions(mirrorOptions) + .titled(mirrorLabel) + .setState(settings.getMirror() + .ordinal()) + .writingTo(labelM); Collections.addAll(widgets, xInput, yInput, zInput); Collections.addAll(widgets, labelR, labelM, rotationArea, mirrorArea); + confirmButton = + new IconButton(guiLeft + background.width - 33, guiTop + background.height - 24, AllIcons.I_CONFIRM); + widgets.add(confirmButton); + super.init(); } @@ -132,14 +148,10 @@ public class SchematicEditScreen extends AbstractSimiScreen { AllGuiTextures.SCHEMATIC.draw(this, x, y); font.drawStringWithShadow(handler.getCurrentSchematicName(), - x + 103 - font.getStringWidth(handler.getCurrentSchematicName()) / 2, y + 10, 0xDDEEFF); - - font.drawString(positionLabel, x + 10, y + 32, AllGuiTextures.FONT_COLOR); - font.drawString(rotationLabel, x + 10, y + 52, AllGuiTextures.FONT_COLOR); - font.drawString(mirrorLabel, x + 10, y + 72, AllGuiTextures.FONT_COLOR); + x + 93 - font.getStringWidth(handler.getCurrentSchematicName()) / 2, y + 3, 0xffffff); RenderSystem.pushMatrix(); - RenderSystem.translated(guiLeft + 220, guiTop + 20, 0); + RenderSystem.translated(guiLeft + 200, guiTop + 80, 0); RenderSystem.scaled(3, 3, 3); itemRenderer.renderItemIntoGUI(new ItemStack(AllItems.SCHEMATIC.get()), 0, 0); RenderSystem.popMatrix(); @@ -151,7 +163,7 @@ public class SchematicEditScreen extends AbstractSimiScreen { BlockPos newLocation = null; try { newLocation = new BlockPos(Integer.parseInt(xInput.getText()), Integer.parseInt(yInput.getText()), - Integer.parseInt(zInput.getText())); + Integer.parseInt(zInput.getText())); } catch (NumberFormatException e) { validCoords = false; } @@ -159,19 +171,31 @@ public class SchematicEditScreen extends AbstractSimiScreen { PlacementSettings settings = new PlacementSettings(); settings.setRotation(Rotation.values()[rotationArea.getState()]); settings.setMirror(Mirror.values()[mirrorArea.getState()]); - + if (validCoords && newLocation != null) { ItemStack item = handler.getActiveSchematicItem(); if (item != null) { - item.getTag().putBoolean("Deployed", true); - item.getTag().put("Anchor", NBTUtil.writeBlockPos(newLocation)); + item.getTag() + .putBoolean("Deployed", true); + item.getTag() + .put("Anchor", NBTUtil.writeBlockPos(newLocation)); } - handler.getTransformation().init(newLocation, settings, handler.getBounds()); + handler.getTransformation() + .init(newLocation, settings, handler.getBounds()); handler.markDirty(); handler.deploy(); } + } + @Override + public boolean mouseClicked(double x, double y, int button) { + if (confirmButton.isHovered()) { + Minecraft.getInstance().player.closeScreen(); + return true; + } + + return super.mouseClicked(x, y, button); } } diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHotbarSlotOverlay.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHotbarSlotOverlay.java index 0190de43a..e303daf14 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHotbarSlotOverlay.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHotbarSlotOverlay.java @@ -11,10 +11,10 @@ public class SchematicHotbarSlotOverlay extends AbstractGui { public void renderOn(int slot) { MainWindow mainWindow = Minecraft.getInstance().getWindow(); - int x = mainWindow.getScaledWidth() / 2 - 92; - int y = mainWindow.getScaledHeight() - 23; + int x = mainWindow.getScaledWidth() / 2 - 88; + int y = mainWindow.getScaledHeight() - 19; RenderSystem.enableAlphaTest(); - AllGuiTextures.BLUEPRINT_SLOT.draw(this, x + 20 * slot, y); + AllGuiTextures.SCHEMATIC_SLOT.draw(this, x + 20 * slot, y); RenderSystem.disableAlphaTest(); } diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicPromptScreen.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicPromptScreen.java new file mode 100644 index 000000000..df3617635 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicPromptScreen.java @@ -0,0 +1,103 @@ +package com.simibubi.create.content.schematics.client; + +import org.lwjgl.glfw.GLFW; + +import com.simibubi.create.AllItems; +import com.simibubi.create.CreateClient; +import com.simibubi.create.foundation.gui.AbstractSimiScreen; +import com.simibubi.create.foundation.gui.AllGuiTextures; +import com.simibubi.create.foundation.gui.AllIcons; +import com.simibubi.create.foundation.gui.widgets.IconButton; +import com.simibubi.create.foundation.utility.Lang; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.widget.TextFieldWidget; + +public class SchematicPromptScreen extends AbstractSimiScreen { + + private final String title = Lang.translate("schematicAndQuill.title"); + private final String convertLabel = Lang.translate("schematicAndQuill.convert"); + private final String abortLabel = Lang.translate("action.discard"); + private final String confirmLabel = Lang.translate("action.saveToFile"); + + private TextFieldWidget nameField; + private IconButton confirm; + private IconButton abort; + private IconButton convert; + + @Override + public void init() { + super.init(); + AllGuiTextures background = AllGuiTextures.SCHEMATIC_PROMPT; + setWindowSize(background.width, background.height + 30); + + nameField = new TextFieldWidget(font, guiLeft + 49, guiTop + 26, 131, 10, ""); + nameField.setTextColor(-1); + nameField.setDisabledTextColour(-1); + nameField.setEnableBackgroundDrawing(false); + nameField.setMaxStringLength(35); + nameField.changeFocus(true); + + abort = new IconButton(guiLeft + 7, guiTop + 53, AllIcons.I_TRASH); + abort.setToolTip(abortLabel); + widgets.add(abort); + + confirm = new IconButton(guiLeft + 158, guiTop + 53, AllIcons.I_CONFIRM); + confirm.setToolTip(confirmLabel); + widgets.add(confirm); + + convert = new IconButton(guiLeft + 180, guiTop + 53, AllIcons.I_SCHEMATIC); + convert.setToolTip(convertLabel); + widgets.add(convert); + + widgets.add(confirm); + widgets.add(convert); + widgets.add(abort); + widgets.add(nameField); + } + + @Override + public void renderWindow(int mouseX, int mouseY, float partialTicks) { + AllGuiTextures.SCHEMATIC_PROMPT.draw(this, guiLeft, guiTop); + font.drawStringWithShadow(title, guiLeft + (sWidth / 2) - (font.getStringWidth(title) / 2), guiTop + 3, + 0xffffff); + itemRenderer.renderItemIntoGUI(AllItems.SCHEMATIC.asStack(), guiLeft + 22, guiTop + 23); + } + + @Override + public boolean keyPressed(int keyCode, int p_keyPressed_2_, int p_keyPressed_3_) { + if (keyCode == GLFW.GLFW_KEY_ENTER) { + confirm(false); + return true; + } + if (keyCode == 256 && this.shouldCloseOnEsc()) { + this.onClose(); + return true; + } + return nameField.keyPressed(keyCode, p_keyPressed_2_, p_keyPressed_3_); + } + + @Override + public boolean mouseClicked(double x, double y, int button) { + if (confirm.isHovered()) { + confirm(false); + return true; + } + if (abort.isHovered()) { + CreateClient.schematicAndQuillHandler.discard(); + Minecraft.getInstance().player.closeScreen(); + return true; + } + if (convert.isHovered()) { + confirm(true); + return true; + } + return super.mouseClicked(x, y, button); + } + + private void confirm(boolean convertImmediately) { + CreateClient.schematicAndQuillHandler.saveSchematic(nameField.getText(), convertImmediately); + Minecraft.getInstance().player.closeScreen(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/schematics/packet/InstantSchematicPacket.java b/src/main/java/com/simibubi/create/content/schematics/packet/InstantSchematicPacket.java new file mode 100644 index 000000000..30a4fdcba --- /dev/null +++ b/src/main/java/com/simibubi/create/content/schematics/packet/InstantSchematicPacket.java @@ -0,0 +1,52 @@ +package com.simibubi.create.content.schematics.packet; + +import java.util.function.Supplier; + +import com.simibubi.create.Create; +import com.simibubi.create.foundation.networking.SimplePacketBase; + +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.fml.network.NetworkEvent.Context; + +public class InstantSchematicPacket extends SimplePacketBase { + + private String name; + private BlockPos origin; + private BlockPos bounds; + + public InstantSchematicPacket(String name, BlockPos origin, BlockPos bounds) { + this.name = name; + this.origin = origin; + this.bounds = bounds; + } + + public InstantSchematicPacket(PacketBuffer buffer) { + name = buffer.readString(32767); + origin = buffer.readBlockPos(); + bounds = buffer.readBlockPos(); + } + + @Override + public void write(PacketBuffer buffer) { + buffer.writeString(name); + buffer.writeBlockPos(origin); + buffer.writeBlockPos(bounds); + } + + @Override + public void handle(Supplier context) { + context.get() + .enqueueWork(() -> { + ServerPlayerEntity player = context.get() + .getSender(); + if (player == null) + return; + Create.schematicReceiver.handleInstantSchematic(player, name, player.world, origin, bounds); + }); + context.get() + .setPacketHandled(true); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index 49d7882b6..dc0ddd181 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -13,43 +13,47 @@ public enum AllGuiTextures { // Inventories PLAYER_INVENTORY("player_inventory.png", 176, 108), - WAND_SYMMETRY("wand_symmetry.png", 207, 58), - BLOCKZAPPER("zapper.png", 217, 70), - TERRAINZAPPER("zapper.png", 0, 70, 217, 105), - TERRAINZAPPER_INACTIVE_PARAM("zapper.png", 0, 175, 14, 14), + WAND_OF_SYMMETRY("curiosities.png", 188, 99), + BLOCKZAPPER("curiosities.png", 0, 99, 214, 97), + TERRAINZAPPER("curiosities_2.png", 0, 0, 234, 101), + TERRAINZAPPER_INACTIVE_PARAM("curiosities_2.png", 238, 0, 18, 18), - SCHEMATIC_TABLE("schematic_table.png", 207, 89), - SCHEMATIC_TABLE_PROGRESS("schematic_table.png", 209, 0, 24, 17), - SCHEMATIC("schematic.png", 207, 95), + SCHEMATIC("schematics.png", 192, 121), + SCHEMATIC_SLOT("widgets.png", 54, 0, 16, 16), + SCHEMATIC_PROMPT("schematics_2.png", 213, 77), + HUD_BACKGROUND("overlay.png", 0, 0, 16, 16), - SCHEMATICANNON_BG("schematicannon.png", 247, 161), - SCHEMATICANNON_BG_FUEL("schematicannon.png", 247, 161), - SCHEMATICANNON_PROGRESS("schematicannon.png", 0, 161, 121, 16), - SCHEMATICANNON_PROGRESS_2("schematicannon.png", 122, 161, 16, 15), - SCHEMATICANNON_HIGHLIGHT("schematicannon.png", 0, 182, 28, 28), - SCHEMATICANNON_FUEL("schematicannon.png", 0, 215, 82, 4), - SCHEMATICANNON_FUEL_CREATIVE("schematicannon.png", 0, 219, 82, 4), + SCHEMATIC_TABLE("schematics.png", 0, 121, 214, 83), + SCHEMATIC_TABLE_PROGRESS("schematics.png", 0, 204, 84, 16), - FLEXCRATE("flex_crate_and_stockpile_switch.png", 125, 129), - FLEXCRATE_DOUBLE("double_flexcrate.png", 197, 129), - FLEXCRATE_LOCKED_SLOT("flex_crate_and_stockpile_switch.png", 138, 0, 18, 18), + SCHEMATICANNON_TOP("schematics_2.png", 0, 77, 213, 42), + SCHEMATICANNON_BOTTOM("schematics_2.png", 0, 119, 213, 99), + SCHEMATICANNON_PROGRESS("schematics_2.png", 76, 239, 114, 16), + SCHEMATICANNON_CHECKLIST_PROGRESS("schematics_2.png", 191, 240, 16, 14), + SCHEMATICANNON_HIGHLIGHT("schematics_2.png", 1, 229, 26, 26), + SCHEMATICANNON_FUEL("schematics_2.png", 28, 222, 47, 16), + SCHEMATICANNON_FUEL_CREATIVE("schematics_2.png", 28, 239, 47, 16), - STOCKSWITCH("flex_crate_and_stockpile_switch.png", 0, 129, 205, 93), - STOCKSWITCH_INTERVAL("flex_crate_and_stockpile_switch.png", 0, 222, 198, 17), - STOCKSWITCH_INTERVAL_END("flex_crate_and_stockpile_switch.png", 0, 239, 198, 17), - STOCKSWITCH_CURSOR_ON("flex_crate_and_stockpile_switch.png", 218, 129, 8, 21), - STOCKSWITCH_CURSOR_OFF("flex_crate_and_stockpile_switch.png", 226, 129, 8, 21), - STOCKSWITCH_BOUND_LEFT("flex_crate_and_stockpile_switch.png", 234, 129, 7, 21), - STOCKSWITCH_BOUND_RIGHT("flex_crate_and_stockpile_switch.png", 241, 129, 7, 21), + STOCKSWITCH("logistics.png", 182, 93), + STOCKSWITCH_ARROW_UP("logistics.png", 191, 0, 7, 24), + STOCKSWITCH_ARROW_DOWN("logistics.png", 198, 0, 7, 24), + STOCKSWITCH_CURSOR("logistics.png", 206, 0, 7, 16), + STOCKSWITCH_INTERVAL("logistics.png", 0, 93, 100, 18), + STOCKSWITCH_UNPOWERED_LANE("logistics.png", 36, 18, 102, 18), + STOCKSWITCH_POWERED_LANE("logistics.png", 36, 40, 102, 18), - FILTER("filter.png", 200, 100), - ATTRIBUTE_FILTER("filter.png", 0, 100, 200, 86), + ADJUSTABLE_CRATE("logistics_2.png", 124, 127), + ADJUSTABLE_DOUBLE_CRATE("logistics_2.png", 0, 127, 196, 127), + ADJUSTABLE_CRATE_LOCKED_SLOT("logistics_2.png", 125, 109, 18, 18), - SEQUENCER("sequencer.png", 156, 128), - SEQUENCER_INSTRUCTION("sequencer.png", 14, 47, 131, 18), - SEQUENCER_WAIT("sequencer.png", 14, 65, 131, 18), - SEQUENCER_END("sequencer.png", 14, 83, 131, 18), - SEQUENCER_EMPTY("sequencer.png", 14, 101, 131, 18), + FILTER("filters.png", 214, 97), + ATTRIBUTE_FILTER("filters.png", 0, 97, 241, 83), + + SEQUENCER("sequencer.png", 173, 159), + SEQUENCER_INSTRUCTION("sequencer.png", 0, 14, 162, 22), + SEQUENCER_WAIT("sequencer.png", 0, 58, 162, 22), + SEQUENCER_END("sequencer.png", 0, 80, 162, 22), + SEQUENCER_EMPTY("sequencer.png", 0, 102, 162, 22), // JEI JEI_SLOT("jei/widgets.png", 18, 18), @@ -64,19 +68,14 @@ public enum AllGuiTextures { BLOCKZAPPER_UPGRADE_RECIPE("jei/widgets.png", 0, 75, 144, 66), // Widgets - PALETTE_BUTTON("palette_picker.png", 0, 236, 20, 20), - TEXT_INPUT("widgets.png", 0, 28, 194, 47), BUTTON("widgets.png", 18, 18), BUTTON_HOVER("widgets.png", 18, 0, 18, 18), BUTTON_DOWN("widgets.png", 36, 0, 18, 18), - INDICATOR("widgets.png", 0, 18, 18, 5), - INDICATOR_WHITE("widgets.png", 18, 18, 18, 5), - INDICATOR_GREEN("widgets.png", 0, 23, 18, 5), - INDICATOR_YELLOW("widgets.png", 18, 23, 18, 5), - INDICATOR_RED("widgets.png", 36, 23, 18, 5), - GRAY("background.png", 0, 0, 16, 16), - - BLUEPRINT_SLOT("widgets.png", 90, 0, 24, 24), + INDICATOR("widgets.png", 0, 18, 18, 6), + INDICATOR_WHITE("widgets.png", 18, 18, 18, 6), + INDICATOR_GREEN("widgets.png", 36, 18, 18, 6), + INDICATOR_YELLOW("widgets.png", 54, 18, 18, 6), + INDICATOR_RED("widgets.png", 72, 18, 18, 6), ; diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java index af547236b..d542bfb31 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java @@ -92,10 +92,14 @@ public class AllIcons { I_ARM_ROUND_ROBIN = next(), I_ARM_FORCED_ROUND_ROBIN = next(), I_ARM_PREFER_FIRST = next(), + + I_ADD_INVERTED_ATTRIBUTE = next(), + I_FLIP = next(), I_PLAY = newRow(), I_PAUSE = next(), I_STOP = next(), + I_PLACEMENT_SETTINGS = next(), I_PATTERN_SOLID = newRow(), I_PATTERN_CHECKERED = next(), @@ -105,7 +109,9 @@ public class AllIcons { I_PATTERN_CHANCE_50 = newRow(), I_PATTERN_CHANCE_75 = next(), I_FOLLOW_DIAGONAL = next(), - I_FOLLOW_MATERIAL = next(); + I_FOLLOW_MATERIAL = next(), + + I_SCHEMATIC = newRow(); public AllIcons(int x, int y) { iconX = x * 16; diff --git a/src/main/java/com/simibubi/create/foundation/gui/TextInputPromptScreen.java b/src/main/java/com/simibubi/create/foundation/gui/TextInputPromptScreen.java deleted file mode 100644 index 27a52be14..000000000 --- a/src/main/java/com/simibubi/create/foundation/gui/TextInputPromptScreen.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.simibubi.create.foundation.gui; - -import java.util.function.Consumer; - -import org.lwjgl.glfw.GLFW; - -import com.simibubi.create.foundation.utility.Lang; - -import net.minecraft.client.gui.widget.TextFieldWidget; -import net.minecraft.client.gui.widget.button.Button; - -public class TextInputPromptScreen extends AbstractSimiScreen { - - private final String defaultConfirm = Lang.translate("action.confirm"); - private final String defaultAbort = Lang.translate("action.abort"); - - private Consumer callback; - private Consumer abortCallback; - - private TextFieldWidget nameField; - private Button confirm; - private Button abort; - - private String buttonTextConfirm; - private String buttonTextAbort; - private String title; - - private boolean confirmed; - - public TextInputPromptScreen(Consumer callBack, Consumer abortCallback) { - super(); - this.callback = callBack; - this.abortCallback = abortCallback; - - buttonTextConfirm = defaultConfirm; - buttonTextAbort = defaultAbort; - confirmed = false; - } - - @Override - public void init() { - super.init(); - setWindowSize(AllGuiTextures.TEXT_INPUT.width, AllGuiTextures.TEXT_INPUT.height + 30); - - this.nameField = new TextFieldWidget(font, guiLeft + 33, guiTop + 26, 128, 8, ""); - this.nameField.setTextColor(-1); - this.nameField.setDisabledTextColour(-1); - this.nameField.setEnableBackgroundDrawing(false); - this.nameField.setMaxStringLength(35); - this.nameField.changeFocus(true); - - confirm = new Button(guiLeft - 5, guiTop + 50, 100, 20, buttonTextConfirm, button -> { - callback.accept(nameField.getText()); - confirmed = true; - minecraft.displayGuiScreen(null); - }); - - abort = new Button(guiLeft + 100, guiTop + 50, 100, 20, buttonTextAbort, button -> { - minecraft.displayGuiScreen(null); - }); - - widgets.add(confirm); - widgets.add(abort); - widgets.add(nameField); - } - - @Override - public void renderWindow(int mouseX, int mouseY, float partialTicks) { - AllGuiTextures.TEXT_INPUT.draw(this, guiLeft, guiTop); - font.drawString(title, guiLeft + (sWidth / 2) - (font.getStringWidth(title) / 2), guiTop + 11, - AllGuiTextures.FONT_COLOR); - } - - @Override - public void removed() { - if (!confirmed) - abortCallback.accept(nameField.getText()); - super.removed(); - } - - public void setButtonTextConfirm(String buttonTextConfirm) { - this.buttonTextConfirm = buttonTextConfirm; - } - - public void setButtonTextAbort(String buttonTextAbort) { - this.buttonTextAbort = buttonTextAbort; - } - - public void setTitle(String title) { - this.title = title; - } - - @Override - public boolean keyPressed(int keyCode, int p_keyPressed_2_, int p_keyPressed_3_) { - if (keyCode == GLFW.GLFW_KEY_ENTER) { - confirm.onPress(); - return true; - } - if (keyCode == 256 && this.shouldCloseOnEsc()) { - this.onClose(); - return true; - } - return nameField.keyPressed(keyCode, p_keyPressed_2_, p_keyPressed_3_); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/gui/ToolSelectionScreen.java b/src/main/java/com/simibubi/create/foundation/gui/ToolSelectionScreen.java index 8ec08b02c..d49a94861 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/ToolSelectionScreen.java +++ b/src/main/java/com/simibubi/create/foundation/gui/ToolSelectionScreen.java @@ -63,7 +63,7 @@ public class ToolSelectionScreen extends Screen { RenderSystem.pushMatrix(); RenderSystem.translatef(0, -yOffset, focused ? 100 : 0); - AllGuiTextures gray = AllGuiTextures.GRAY; + AllGuiTextures gray = AllGuiTextures.HUD_BACKGROUND; RenderSystem.enableBlend(); RenderSystem.color4f(1, 1, 1, focused ? 7 / 8f : 1 / 2f); diff --git a/src/main/java/com/simibubi/create/foundation/gui/widgets/ScrollInput.java b/src/main/java/com/simibubi/create/foundation/gui/widgets/ScrollInput.java index 415fae287..69fda4a82 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widgets/ScrollInput.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widgets/ScrollInput.java @@ -45,6 +45,11 @@ public class ScrollInput extends AbstractSimiWidget { this.onScroll = onScroll; return this; } + + public ScrollInput removeCallback() { + this.onScroll = null; + return this; + } public ScrollInput titled(String title) { this.title = title; diff --git a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java index 5200f3255..ed8de400c 100644 --- a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java +++ b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java @@ -23,6 +23,7 @@ import com.simibubi.create.content.logistics.item.filter.FilterScreenPacket; import com.simibubi.create.content.logistics.packet.ConfigureFlexcratePacket; import com.simibubi.create.content.logistics.packet.ConfigureStockswitchPacket; import com.simibubi.create.content.schematics.packet.ConfigureSchematicannonPacket; +import com.simibubi.create.content.schematics.packet.InstantSchematicPacket; import com.simibubi.create.content.schematics.packet.SchematicPlacePacket; import com.simibubi.create.content.schematics.packet.SchematicUploadPacket; import com.simibubi.create.foundation.command.ConfigureConfigPacket; @@ -55,6 +56,7 @@ public enum AllPackets { PLACE_ARM(ArmPlacementPacket.class, ArmPlacementPacket::new), MINECART_COUPLING_CREATION(MinecartCouplingCreationPacket.class, MinecartCouplingCreationPacket::new), PERSISTANT_DATA_REQUEST(PersistantDataPacketRequest.class, PersistantDataPacketRequest::new), + INSTANT_SCHEMATIC(InstantSchematicPacket.class, InstantSchematicPacket::new), // Server to Client SYMMETRY_EFFECT(SymmetryEffectPacket.class, SymmetryEffectPacket::new), diff --git a/src/main/resources/assets/create/lang/default/messages.json b/src/main/resources/assets/create/lang/default/messages.json index 0c2536fc2..7ef4f7db8 100644 --- a/src/main/resources/assets/create/lang/default/messages.json +++ b/src/main/resources/assets/create/lang/default/messages.json @@ -158,13 +158,10 @@ "create.gui.adjustable_crate.storageSpace": "Storage Space", "create.gui.stockpile_switch.title": "Stockpile Switch", - "create.gui.stockpile_switch.lowerLimit": "Lower Threshold", - "create.gui.stockpile_switch.upperLimit": "Upper Threshold", - "create.gui.stockpile_switch.startAt": "Start Signal at", - "create.gui.stockpile_switch.startAbove": "Start Signal above", - "create.gui.stockpile_switch.stopAt": "Stop Signal at", - "create.gui.stockpile_switch.stopBelow": "Stop Signal below", - + "create.gui.stockpile_switch.invert_signal": "Invert Signal", + "create.gui.stockpile_switch.move_to_lower_at": "Move to lower lane at %1$s%%", + "create.gui.stockpile_switch.move_to_upper_at": "Move to upper lane at %1$s%%", + "create.gui.sequenced_gearshift.title": "Sequenced Gearshift", "create.gui.sequenced_gearshift.instruction": "Instruction", "create.gui.sequenced_gearshift.instruction.turn_angle": "Turn", @@ -185,7 +182,8 @@ "create.schematicAndQuill.secondPos": "Second position set.", "create.schematicAndQuill.noTarget": "Hold [Ctrl] to select Air blocks.", "create.schematicAndQuill.abort": "Removed selection.", - "create.schematicAndQuill.prompt": "Enter a name for the Schematic:", + "create.schematicAndQuill.title": "Schematic Name:", + "create.schematicAndQuill.convert": "Save and Deploy Immediately", "create.schematicAndQuill.fallbackName": "My Schematic", "create.schematicAndQuill.saved": "Saved as %1$s", @@ -234,9 +232,12 @@ "create.schematic.tool.flip.description.3": "", "create.schematics.synchronizing": "Syncing...", - "create.schematics.uploadTooLarge": "Your schematic is too big.", + "create.schematics.uploadTooLarge": "Your schematic exceeds limitations specified by the server.", "create.schematics.maxAllowedSize": "The maximum allowed schematic file size is:", + "create.gui.schematicTable.title": "Schematic Table", + "create.gui.schematicTable.refresh": "Refresh Files", + "create.gui.schematicTable.open_folder": "Open Folder", "create.gui.schematicTable.title": "Schematic Table", "create.gui.schematicTable.availableSchematics": "Available Schematics", "create.gui.schematicTable.noSchematics": "No Schematics Saved", @@ -244,19 +245,23 @@ "create.gui.schematicTable.finished": "Upload Finished!", "create.gui.schematicannon.title": "Schematicannon", - "create.gui.schematicannon.settingsTitle": "Placement Settings", - "create.gui.schematicannon.listPrinter": "Material List Printer", + "create.gui.schematicannon.listPrinter": "Checklist Printer", "create.gui.schematicannon.gunpowderLevel": "Gunpowder at %1$s%%", "create.gui.schematicannon.shotsRemaining": "Shots left: %1$s", "create.gui.schematicannon.shotsRemainingWithBackup": "With backup: %1$s", "create.gui.schematicannon.optionEnabled": "Currently Enabled", "create.gui.schematicannon.optionDisabled": "Currently Disabled", + "create.gui.schematicannon.showOptions": "Show Printer Settings", "create.gui.schematicannon.option.dontReplaceSolid": "Don't Replace Solid Blocks", "create.gui.schematicannon.option.replaceWithSolid": "Replace Solid with Solid", "create.gui.schematicannon.option.replaceWithAny": "Replace Solid with Any", "create.gui.schematicannon.option.replaceWithEmpty": "Replace Solid with Empty", "create.gui.schematicannon.option.skipMissing": "Skip missing Blocks", "create.gui.schematicannon.option.skipTileEntities": "Protect Tile Entities", + + "create.gui.schematicannon.slot.gunpowder": "Add gunpowder to fuel the cannon", + "create.gui.schematicannon.slot.listPrinter": "Place books here to print a Checklist for your Schematic", + "create.gui.schematicannon.slot.schematic": "Add your Schematic here. Make sure it is deployed at a specific location.", "create.gui.schematicannon.option.skipMissing.description": "If the cannon cannot find a required Block for placement, it will continue at the next Location.", "create.gui.schematicannon.option.skipTileEntities.description": "The cannon will avoid replacing data holding blocks such as Chests.", @@ -293,23 +298,42 @@ "create.gui.filter.ignore_data.description": "Items match regardless of their attributes.", "create.item_attributes.placeable": "is placeable", + "create.item_attributes.placeable.inverted": "is not placeable", "create.item_attributes.consumable": "can be eaten", + "create.item_attributes.consumable.inverted": "cannot be eaten", "create.item_attributes.smeltable": "can be Smelted", + "create.item_attributes.smeltable.inverted": "cannot be Smelted", "create.item_attributes.washable": "can be Washed", + "create.item_attributes.washable.inverted": "cannot be Washed", "create.item_attributes.smokable": "can be Smoked", + "create.item_attributes.smokable.inverted": "cannot be Smoked", + "create.item_attributes.crushable": "can be Crushed", + "create.item_attributes.crushable.inverted": "cannot be Crushed", "create.item_attributes.blastable": "is smeltable in Blast Furnace", + "create.item_attributes.blastable.inverted": "is not smeltable in Blast Furnace", "create.item_attributes.enchanted": "is enchanted", + "create.item_attributes.enchanted.inverted": "is unenchanted", "create.item_attributes.damaged": "is damaged", + "create.item_attributes.damaged.inverted": "is not damaged", "create.item_attributes.badly_damaged": "is heavily damaged", + "create.item_attributes.badly_damaged.inverted": "is not heavily damaged", "create.item_attributes.not_stackable": "cannot stack", + "create.item_attributes.not_stackable.inverted": "can be stacked", "create.item_attributes.equipable": "can be equipped", + "create.item_attributes.equipable.inverted": "cannot be equipped", "create.item_attributes.furnace_fuel": "is furnace fuel", + "create.item_attributes.furnace_fuel.inverted": "is not furnace fuel", "create.item_attributes.in_tag": "is tagged %1$s", - "create.item_attributes.in_item_group": "belongs to %1$s", + "create.item_attributes.in_tag.inverted": "is not tagged %1$s", + "create.item_attributes.in_item_group": "is in group '%1$s'", + "create.item_attributes.in_item_group.inverted": "is not in group '%1$s'", "create.item_attributes.added_by": "was added by %1$s", + "create.item_attributes.added_by.inverted": "was not added by %1$s", "create.gui.attribute_filter.no_selected_attributes": "No attributes selected", "create.gui.attribute_filter.selected_attributes": "Selected attributes:", + "create.gui.attribute_filter.add_attribute": "Add attribute to List", + "create.gui.attribute_filter.add_inverted_attribute": "Add opposite attribute to List", "create.gui.attribute_filter.whitelist_disjunctive": "Whitelist (Any)", "create.gui.attribute_filter.whitelist_disjunctive.description": "Items pass if they have any of the selected attributes.", "create.gui.attribute_filter.whitelist_conjunctive": "Whitelist (All)", diff --git a/src/main/resources/assets/create/models/block/symmetry_effect/crossplane.json b/src/main/resources/assets/create/models/block/symmetry_effect/crossplane.json index fede15ab1..0fdbb9668 100644 --- a/src/main/resources/assets/create/models/block/symmetry_effect/crossplane.json +++ b/src/main/resources/assets/create/models/block/symmetry_effect/crossplane.json @@ -1,144 +1,143 @@ { - "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", - "textures": { - "0": "block/white_stained_glass", - "1": "block/obsidian", - "2": "block/packed_ice" - }, - "elements": [ - { - "name": "Mirror", - "from": [ 4.0, 1.0, 7.500000007450581 ], - "to": [ 7.0, 12.0, 8.50000000745058 ], - "faces": { - "north": { "texture": "#0", "uv": [ 4.0, 1.0, 7.0, 12.0 ] }, - "east": { "texture": "#0", "uv": [ 3.0, 1.0, 4.0, 12.0 ] }, - "south": { "texture": "#0", "uv": [ 4.0, 1.0, 7.0, 12.0 ] }, - "west": { "texture": "#0", "uv": [ 12.0, 1.0, 13.0, 12.0 ] }, - "up": { "texture": "#0", "uv": [ 4.0, 1.0, 7.0, 2.0 ] }, - "down": { "texture": "#0", "uv": [ 4.0, 14.0, 7.0, 15.0 ] } - } - }, - { - "name": "rod_left_bottom", - "from": [ 1.2000000029802322, 3.0, 7.0 ], - "to": [ 3.2000000029802322, 4.0, 9.0 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -22.5 }, - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "up": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, - "down": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] } - } - }, - { - "name": "rod_left_top", - "from": [ 1.2000000029802322, 12.0, 7.0 ], - "to": [ 3.2000000029802322, 13.0, 9.0 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -22.5 }, - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "up": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, - "down": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] } - } - }, - { - "name": "rod_left", - "from": [ 2.0, 4.0, 7.499999992549419 ], - "to": [ 3.0, 12.0, 8.49999999254942 ], - "shade": false, - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -22.5 }, - "faces": { - "north": { "texture": "#2", "uv": [ 3.0, 1.0, 4.0, 9.0 ] }, - "east": { "texture": "#2", "uv": [ 3.0, 0.0, 4.0, 8.0 ] }, - "south": { "texture": "#2", "uv": [ 3.0, 1.0, 4.0, 9.0 ] }, - "west": { "texture": "#2", "uv": [ 5.0, 1.0, 6.0, 9.0 ] } - } - }, - { - "name": "rod_right_bottom", - "from": [ 12.799999997019768, 3.0, 7.0 ], - "to": [ 14.799999997019768, 4.0, 9.0 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -22.5 }, - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "up": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, - "down": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] } - } - }, - { - "name": "rod_right", - "from": [ 13.0, 4.0, 7.499999992549419 ], - "to": [ 14.0, 12.0, 8.49999999254942 ], - "shade": false, - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -22.5 }, - "faces": { - "north": { "texture": "#2", "uv": [ 3.0, 2.0, 4.0, 10.0 ] }, - "east": { "texture": "#2", "uv": [ 3.0, 3.0, 4.0, 11.0 ] }, - "south": { "texture": "#2", "uv": [ 4.0, 3.0, 5.0, 11.0 ] }, - "west": { "texture": "#2", "uv": [ 5.0, 0.0, 6.0, 8.0 ] } - } - }, - { - "name": "rod_right_top", - "from": [ 12.799999997019768, 12.0, 7.0 ], - "to": [ 14.799999997019768, 13.0, 9.0 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -22.5 }, - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "up": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, - "down": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] } - } - }, - { - "name": "CrossMirror", - "from": [ 7.499999992549419, 4.0, 9.50000000745058 ], - "to": [ 8.49999999254942, 15.0, 12.50000000745058 ], - "faces": { - "north": { "texture": "#0", "uv": [ 4.0, 1.0, 5.0, 12.0 ] }, - "east": { "texture": "#0", "uv": [ 3.0, 1.0, 6.0, 12.0 ] }, - "south": { "texture": "#0", "uv": [ 4.0, 1.0, 5.0, 12.0 ] }, - "west": { "texture": "#0", "uv": [ 9.0, 1.0, 12.0, 12.0 ] }, - "up": { "texture": "#0", "uv": [ 3.0, 3.0, 4.0, 6.0 ] }, - "down": { "texture": "#0", "uv": [ 5.0, 9.0, 6.0, 12.0 ] } - } - }, - { - "name": "Mirror II", - "from": [ 9.0, 3.0, 7.500000007450581 ], - "to": [ 12.0, 14.0, 8.50000000745058 ], - "faces": { - "north": { "texture": "#0", "uv": [ 4.0, 1.0, 7.0, 12.0 ] }, - "east": { "texture": "#0", "uv": [ 3.0, 1.0, 4.0, 12.0 ] }, - "south": { "texture": "#0", "uv": [ 4.0, 1.0, 7.0, 12.0 ] }, - "west": { "texture": "#0", "uv": [ 12.0, 1.0, 13.0, 12.0 ] }, - "up": { "texture": "#0", "uv": [ 4.0, 1.0, 7.0, 2.0 ] }, - "down": { "texture": "#0", "uv": [ 4.0, 14.0, 7.0, 15.0 ] } - } - }, - { - "name": "CrossMirror II", - "from": [ 7.499999992549419, 2.0, 3.5000000074505806 ], - "to": [ 8.49999999254942, 13.0, 6.500000007450581 ], - "faces": { - "north": { "texture": "#0", "uv": [ 4.0, 1.0, 5.0, 12.0 ] }, - "east": { "texture": "#0", "uv": [ 3.0, 1.0, 6.0, 12.0 ] }, - "south": { "texture": "#0", "uv": [ 4.0, 3.0, 5.0, 14.0 ] }, - "west": { "texture": "#0", "uv": [ 9.0, 2.0, 12.0, 13.0 ] }, - "up": { "texture": "#0", "uv": [ 4.0, 3.0, 5.0, 6.0 ] }, - "down": { "texture": "#0", "uv": [ 4.0, 8.0, 5.0, 11.0 ] } - } - } - ] + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/symmetry_mirror", + "2": "create:block/brass_block" + }, + "elements": [ + { + "name": "Mirror", + "from": [4, 1, 7.5], + "to": [7, 12, 8.5], + "faces": { + "north": {"uv": [4, 1, 7, 12], "texture": "#0"}, + "east": {"uv": [3, 1, 4, 12], "texture": "#0"}, + "south": {"uv": [4, 1, 7, 12], "texture": "#0"}, + "west": {"uv": [12, 1, 13, 12], "texture": "#0"}, + "up": {"uv": [4, 1, 7, 2], "texture": "#0"}, + "down": {"uv": [4, 14, 7, 15], "texture": "#0"} + } + }, + { + "name": "rod_left_bottom", + "from": [1, 3, 7], + "to": [3, 4, 9], + "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "south": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "up": {"uv": [13, 13, 15, 15], "texture": "#2"}, + "down": {"uv": [13, 13, 15, 15], "texture": "#2"} + } + }, + { + "name": "rod_left_bottom", + "from": [13, 3, 7], + "to": [15, 4, 9], + "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "south": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "up": {"uv": [13, 13, 15, 15], "rotation": 180, "texture": "#2"}, + "down": {"uv": [13, 13, 15, 15], "rotation": 180, "texture": "#2"} + } + }, + { + "name": "rod_left_top", + "from": [1, 12, 7], + "to": [3, 13, 9], + "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "south": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "up": {"uv": [13, 13, 15, 15], "texture": "#2"}, + "down": {"uv": [13, 13, 15, 15], "texture": "#2"} + } + }, + { + "name": "rod_left_top", + "from": [13, 12, 7], + "to": [15, 13, 9], + "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "south": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "up": {"uv": [13, 13, 15, 15], "rotation": 180, "texture": "#2"}, + "down": {"uv": [13, 13, 15, 15], "rotation": 180, "texture": "#2"} + } + }, + { + "name": "rod_left", + "from": [1, 4, 7.5], + "to": [3, 12, 8.5], + "shade": false, + "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [3, 5, 1, 13], "texture": "#2"}, + "east": {"uv": [8, 4, 9, 12], "texture": "#2"}, + "south": {"uv": [1, 3, 3, 11], "texture": "#2"}, + "west": {"uv": [1, 6, 2, 14], "texture": "#2"} + } + }, + { + "name": "rod_left", + "from": [13, 4, 7.5], + "to": [15, 12, 8.5], + "shade": false, + "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 3, 3, 11], "texture": "#2"}, + "east": {"uv": [1, 6, 2, 14], "texture": "#2"}, + "south": {"uv": [3, 5, 1, 13], "texture": "#2"}, + "west": {"uv": [8, 4, 9, 12], "texture": "#2"} + } + }, + { + "name": "CrossMirror", + "from": [7.5, 4, 9.5], + "to": [8.5, 15, 12.5], + "faces": { + "north": {"uv": [4, 1, 5, 12], "texture": "#0"}, + "east": {"uv": [3, 1, 6, 12], "texture": "#0"}, + "south": {"uv": [4, 1, 5, 12], "texture": "#0"}, + "west": {"uv": [9, 1, 12, 12], "texture": "#0"}, + "up": {"uv": [3, 3, 4, 6], "texture": "#0"}, + "down": {"uv": [5, 9, 6, 12], "texture": "#0"} + } + }, + { + "name": "Mirror II", + "from": [9, 3, 7.5], + "to": [12, 14, 8.5], + "faces": { + "north": {"uv": [4, 1, 7, 12], "texture": "#0"}, + "east": {"uv": [3, 1, 4, 12], "texture": "#0"}, + "south": {"uv": [4, 1, 7, 12], "texture": "#0"}, + "west": {"uv": [12, 1, 13, 12], "texture": "#0"}, + "up": {"uv": [4, 1, 7, 2], "texture": "#0"}, + "down": {"uv": [4, 14, 7, 15], "texture": "#0"} + } + }, + { + "name": "CrossMirror II", + "from": [7.5, 2, 3.5], + "to": [8.5, 13, 6.5], + "faces": { + "north": {"uv": [4, 1, 5, 12], "texture": "#0"}, + "east": {"uv": [3, 1, 6, 12], "texture": "#0"}, + "south": {"uv": [4, 3, 5, 14], "texture": "#0"}, + "west": {"uv": [9, 2, 12, 13], "texture": "#0"}, + "up": {"uv": [4, 3, 5, 6], "texture": "#0"}, + "down": {"uv": [4, 8, 5, 11], "texture": "#0"} + } + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/symmetry_effect/plane.json b/src/main/resources/assets/create/models/block/symmetry_effect/plane.json index 5d36206de..5717ed96f 100644 --- a/src/main/resources/assets/create/models/block/symmetry_effect/plane.json +++ b/src/main/resources/assets/create/models/block/symmetry_effect/plane.json @@ -1,99 +1,105 @@ { - "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", - "textures": { - "0": "block/white_stained_glass", - "1": "block/obsidian", - "2": "block/packed_ice" - }, - "elements": [ - { - "name": "Mirror", - "from": [ 4.0, 1.0, 7.500000007450581 ], - "to": [ 12.0, 15.0, 8.50000000745058 ], - "faces": { - "north": { "texture": "#0", "uv": [ 4.0, 1.0, 12.0, 15.0 ] }, - "east": { "texture": "#0", "uv": [ 3.0, 1.0, 4.0, 15.0 ] }, - "south": { "texture": "#0", "uv": [ 4.0, 1.0, 12.0, 15.0 ] }, - "west": { "texture": "#0", "uv": [ 12.0, 1.0, 13.0, 15.0 ] }, - "up": { "texture": "#0", "uv": [ 4.0, 1.0, 12.0, 2.0 ] }, - "down": { "texture": "#0", "uv": [ 4.0, 14.0, 12.0, 15.0 ] } - } - }, - { - "name": "rod_left_bottom", - "from": [ 1.2000000029802322, 3.0, 7.0 ], - "to": [ 3.2000000029802322, 4.0, 9.0 ], - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "up": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, - "down": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] } - } - }, - { - "name": "rod_left_top", - "from": [ 1.2000000029802322, 12.0, 7.0 ], - "to": [ 3.2000000029802322, 13.0, 9.0 ], - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "up": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, - "down": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] } - } - }, - { - "name": "rod_left", - "from": [ 2.0, 4.0, 7.499999992549419 ], - "to": [ 3.0, 12.0, 8.49999999254942 ], - "shade": false, - "faces": { - "north": { "texture": "#2", "uv": [ 3.0, 1.0, 4.0, 9.0 ] }, - "east": { "texture": "#2", "uv": [ 3.0, 0.0, 4.0, 8.0 ] }, - "south": { "texture": "#2", "uv": [ 3.0, 1.0, 4.0, 9.0 ] }, - "west": { "texture": "#2", "uv": [ 5.0, 1.0, 6.0, 9.0 ] } - } - }, - { - "name": "rod_right_bottom", - "from": [ 12.799999997019768, 3.0, 7.0 ], - "to": [ 14.799999997019768, 4.0, 9.0 ], - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "up": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, - "down": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] } - } - }, - { - "name": "rod_right", - "from": [ 13.0, 4.0, 7.499999992549419 ], - "to": [ 14.0, 12.0, 8.49999999254942 ], - "shade": false, - "faces": { - "north": { "texture": "#2", "uv": [ 3.0, 2.0, 4.0, 10.0 ] }, - "east": { "texture": "#2", "uv": [ 3.0, 3.0, 4.0, 11.0 ] }, - "south": { "texture": "#2", "uv": [ 4.0, 3.0, 5.0, 11.0 ] }, - "west": { "texture": "#2", "uv": [ 5.0, 0.0, 6.0, 8.0 ] } - } - }, - { - "name": "rod_right_top", - "from": [ 12.799999997019768, 12.0, 7.0 ], - "to": [ 14.799999997019768, 13.0, 9.0 ], - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "up": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, - "down": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] } - } - } - ] + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/symmetry_mirror", + "1_2": "create:block/brass_block" + }, + "elements": [ + { + "name": "Mirror", + "from": [4, 1, 7.5], + "to": [12, 15, 8.5], + "faces": { + "north": {"uv": [4, 1, 12, 15], "texture": "#0"}, + "east": {"uv": [3, 1, 4, 15], "texture": "#0"}, + "south": {"uv": [4, 1, 12, 15], "texture": "#0"}, + "west": {"uv": [12, 1, 13, 15], "texture": "#0"}, + "up": {"uv": [4, 1, 12, 2], "texture": "#0"}, + "down": {"uv": [4, 14, 12, 15], "texture": "#0"} + } + }, + { + "name": "rod_left_bottom", + "from": [1, 3, 7], + "to": [3, 4, 9], + "faces": { + "north": {"uv": [0, 0, 2, 1], "texture": "#1_2"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#1_2"}, + "south": {"uv": [0, 0, 2, 1], "texture": "#1_2"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#1_2"}, + "up": {"uv": [13, 13, 15, 15], "texture": "#1_2"}, + "down": {"uv": [13, 13, 15, 15], "texture": "#1_2"} + } + }, + { + "name": "rod_left_bottom", + "from": [13, 3, 7], + "to": [15, 4, 9], + "faces": { + "north": {"uv": [0, 0, 2, 1], "texture": "#1_2"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#1_2"}, + "south": {"uv": [0, 0, 2, 1], "texture": "#1_2"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#1_2"}, + "up": {"uv": [13, 13, 15, 15], "rotation": 180, "texture": "#1_2"}, + "down": {"uv": [13, 13, 15, 15], "rotation": 180, "texture": "#1_2"} + } + }, + { + "name": "rod_left_top", + "from": [1, 12, 7], + "to": [3, 13, 9], + "faces": { + "north": {"uv": [0, 0, 2, 1], "texture": "#1_2"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#1_2"}, + "south": {"uv": [0, 0, 2, 1], "texture": "#1_2"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#1_2"}, + "up": {"uv": [13, 13, 15, 15], "texture": "#1_2"}, + "down": {"uv": [13, 13, 15, 15], "texture": "#1_2"} + } + }, + { + "name": "rod_left_top", + "from": [13, 12, 7], + "to": [15, 13, 9], + "faces": { + "north": {"uv": [0, 0, 2, 1], "texture": "#1_2"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#1_2"}, + "south": {"uv": [0, 0, 2, 1], "texture": "#1_2"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#1_2"}, + "up": {"uv": [13, 13, 15, 15], "rotation": 180, "texture": "#1_2"}, + "down": {"uv": [13, 13, 15, 15], "rotation": 180, "texture": "#1_2"} + } + }, + { + "name": "rod_left", + "from": [1, 4, 7.5], + "to": [3, 12, 8.5], + "shade": false, + "faces": { + "north": {"uv": [3, 5, 1, 13], "texture": "#1_2"}, + "east": {"uv": [8, 4, 9, 12], "texture": "#1_2"}, + "south": {"uv": [1, 3, 3, 11], "texture": "#1_2"}, + "west": {"uv": [1, 6, 2, 14], "texture": "#1_2"} + } + }, + { + "name": "rod_left", + "from": [13, 4, 7.5], + "to": [15, 12, 8.5], + "shade": false, + "faces": { + "north": {"uv": [1, 3, 3, 11], "texture": "#1_2"}, + "east": {"uv": [1, 6, 2, 14], "texture": "#1_2"}, + "south": {"uv": [3, 5, 1, 13], "texture": "#1_2"}, + "west": {"uv": [8, 4, 9, 12], "texture": "#1_2"} + } + } + ], + "groups": [0, + { + "name": "crossplane", + "origin": [8, 8, 8], + "children": [1, 2, 3, 4, 5, 6] + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/symmetry_effect/tripleplane.json b/src/main/resources/assets/create/models/block/symmetry_effect/tripleplane.json index 2af7a097f..99450d7ca 100644 --- a/src/main/resources/assets/create/models/block/symmetry_effect/tripleplane.json +++ b/src/main/resources/assets/create/models/block/symmetry_effect/tripleplane.json @@ -1,172 +1,178 @@ { - "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", - "textures": { - "0": "block/white_stained_glass", - "1": "block/obsidian", - "2": "block/packed_ice" - }, - "elements": [ - { - "name": "Mirror", - "from": [ 6.499999992549419, 1.0, 10.50000000745058 ], - "to": [ 9.49999999254942, 12.0, 11.50000000745058 ], - "faces": { - "north": { "texture": "#0", "uv": [ 4.0, 1.0, 7.0, 12.0 ] }, - "east": { "texture": "#0", "uv": [ 3.0, 1.0, 4.0, 12.0 ] }, - "south": { "texture": "#0", "uv": [ 4.0, 1.0, 7.0, 12.0 ] }, - "west": { "texture": "#0", "uv": [ 12.0, 1.0, 13.0, 12.0 ] }, - "up": { "texture": "#0", "uv": [ 4.0, 1.0, 7.0, 2.0 ] }, - "down": { "texture": "#0", "uv": [ 4.0, 14.0, 7.0, 15.0 ] } - } - }, - { - "name": "rod_left_bottom", - "from": [ 1.2000000029802322, 3.0, 7.0 ], - "to": [ 3.2000000029802322, 4.0, 9.0 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -45.0 }, - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "up": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, - "down": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] } - } - }, - { - "name": "rod_left_top", - "from": [ 1.2000000029802322, 12.0, 7.0 ], - "to": [ 3.2000000029802322, 13.0, 9.0 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -45.0 }, - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "up": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, - "down": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] } - } - }, - { - "name": "rod_left", - "from": [ 2.0, 4.0, 7.499999992549419 ], - "to": [ 3.0, 12.0, 8.49999999254942 ], - "shade": false, - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -45.0 }, - "faces": { - "north": { "texture": "#2", "uv": [ 3.0, 1.0, 4.0, 9.0 ] }, - "east": { "texture": "#2", "uv": [ 3.0, 0.0, 4.0, 8.0 ] }, - "south": { "texture": "#2", "uv": [ 3.0, 1.0, 4.0, 9.0 ] }, - "west": { "texture": "#2", "uv": [ 5.0, 1.0, 6.0, 9.0 ] } - } - }, - { - "name": "rod_right_bottom", - "from": [ 12.799999997019768, 3.0, 7.0 ], - "to": [ 14.799999997019768, 4.0, 9.0 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -45.0 }, - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "up": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, - "down": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] } - } - }, - { - "name": "rod_right", - "from": [ 13.0, 4.0, 7.499999992549419 ], - "to": [ 14.0, 12.0, 8.49999999254942 ], - "shade": false, - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -45.0 }, - "faces": { - "north": { "texture": "#2", "uv": [ 3.0, 2.0, 4.0, 10.0 ] }, - "east": { "texture": "#2", "uv": [ 3.0, 3.0, 4.0, 11.0 ] }, - "south": { "texture": "#2", "uv": [ 4.0, 3.0, 5.0, 11.0 ] }, - "west": { "texture": "#2", "uv": [ 5.0, 0.0, 6.0, 8.0 ] } - } - }, - { - "name": "rod_right_top", - "from": [ 12.799999997019768, 12.0, 7.0 ], - "to": [ 14.799999997019768, 13.0, 9.0 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -45.0 }, - "faces": { - "north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, - "up": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, - "down": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] } - } - }, - { - "name": "CrossMirror", - "from": [ 4.499999977648258, 2.0, 6.500000007450581 ], - "to": [ 5.499999977648258, 13.0, 9.50000000745058 ], - "faces": { - "north": { "texture": "#0", "uv": [ 4.0, 1.0, 5.0, 12.0 ] }, - "east": { "texture": "#0", "uv": [ 3.0, 1.0, 6.0, 12.0 ] }, - "south": { "texture": "#0", "uv": [ 4.0, 1.0, 5.0, 12.0 ] }, - "west": { "texture": "#0", "uv": [ 9.0, 1.0, 12.0, 12.0 ] }, - "up": { "texture": "#0", "uv": [ 3.0, 3.0, 4.0, 6.0 ] }, - "down": { "texture": "#0", "uv": [ 5.0, 9.0, 6.0, 12.0 ] } - } - }, - { - "name": "Mirror II", - "from": [ 6.499999992549419, 3.0, 4.500000007450581 ], - "to": [ 9.49999999254942, 14.0, 5.500000007450581 ], - "faces": { - "north": { "texture": "#0", "uv": [ 4.0, 1.0, 7.0, 12.0 ] }, - "east": { "texture": "#0", "uv": [ 3.0, 1.0, 4.0, 12.0 ] }, - "south": { "texture": "#0", "uv": [ 4.0, 1.0, 7.0, 12.0 ] }, - "west": { "texture": "#0", "uv": [ 12.0, 1.0, 13.0, 12.0 ] }, - "up": { "texture": "#0", "uv": [ 4.0, 1.0, 7.0, 2.0 ] }, - "down": { "texture": "#0", "uv": [ 4.0, 14.0, 7.0, 15.0 ] } - } - }, - { - "name": "CrossMirror II", - "from": [ 10.50000000745058, 4.0, 6.500000007450581 ], - "to": [ 11.50000000745058, 15.0, 9.50000000745058 ], - "faces": { - "north": { "texture": "#0", "uv": [ 4.0, 1.0, 5.0, 12.0 ] }, - "east": { "texture": "#0", "uv": [ 3.0, 1.0, 6.0, 12.0 ] }, - "south": { "texture": "#0", "uv": [ 4.0, 3.0, 5.0, 14.0 ] }, - "west": { "texture": "#0", "uv": [ 9.0, 2.0, 12.0, 13.0 ] }, - "up": { "texture": "#0", "uv": [ 4.0, 3.0, 5.0, 6.0 ] }, - "down": { "texture": "#0", "uv": [ 4.0, 8.0, 5.0, 11.0 ] } - } - }, - { - "name": "Cube", - "from": [ 7.499999992549419, 6.0, -0.4999999925494194 ], - "to": [ 8.49999999254942, 10.0, 3.5000000074505806 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -45.0 }, - "faces": { - "north": { "texture": "#0", "uv": [ 4.0, 1.0, 5.0, 5.0 ] }, - "east": { "texture": "#0", "uv": [ 3.0, 1.0, 7.0, 5.0 ] }, - "south": { "texture": "#0", "uv": [ 4.0, 3.0, 5.0, 7.0 ] }, - "west": { "texture": "#0", "uv": [ 9.0, 2.0, 13.0, 6.0 ] }, - "up": { "texture": "#0", "uv": [ 4.0, 3.0, 5.0, 7.0 ] }, - "down": { "texture": "#0", "uv": [ 4.0, 8.0, 5.0, 12.0 ] } - } - }, - { - "name": "Cube", - "from": [ 7.499999992549419, 6.0, 12.50000000745058 ], - "to": [ 8.49999999254942, 10.0, 16.50000000745058 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -45.0 }, - "faces": { - "north": { "texture": "#0", "uv": [ 4.0, 1.0, 5.0, 5.0 ] }, - "east": { "texture": "#0", "uv": [ 3.0, 1.0, 7.0, 5.0 ] }, - "south": { "texture": "#0", "uv": [ 4.0, 3.0, 5.0, 7.0 ] }, - "west": { "texture": "#0", "uv": [ 9.0, 2.0, 13.0, 6.0 ] }, - "up": { "texture": "#0", "uv": [ 4.0, 3.0, 5.0, 7.0 ] }, - "down": { "texture": "#0", "uv": [ 4.0, 8.0, 5.0, 12.0 ] } - } - } - ] + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/symmetry_mirror", + "2": "create:block/brass_block" + }, + "elements": [ + { + "name": "Mirror", + "from": [6.5, 1, 10.5], + "to": [9.5, 12, 11.5], + "faces": { + "north": {"uv": [4, 1, 7, 12], "texture": "#0"}, + "east": {"uv": [3, 1, 4, 12], "texture": "#0"}, + "south": {"uv": [4, 1, 7, 12], "texture": "#0"}, + "west": {"uv": [12, 1, 13, 12], "texture": "#0"}, + "up": {"uv": [4, 1, 7, 2], "texture": "#0"}, + "down": {"uv": [4, 14, 7, 15], "texture": "#0"} + } + }, + { + "name": "CrossMirror", + "from": [4.5, 2, 6.5], + "to": [5.5, 13, 9.5], + "faces": { + "north": {"uv": [4, 1, 5, 12], "texture": "#0"}, + "east": {"uv": [3, 1, 6, 12], "texture": "#0"}, + "south": {"uv": [4, 1, 5, 12], "texture": "#0"}, + "west": {"uv": [9, 1, 12, 12], "texture": "#0"}, + "up": {"uv": [3, 3, 4, 6], "texture": "#0"}, + "down": {"uv": [5, 9, 6, 12], "texture": "#0"} + } + }, + { + "name": "Mirror II", + "from": [6.5, 3, 4.5], + "to": [9.5, 14, 5.5], + "faces": { + "north": {"uv": [4, 1, 7, 12], "texture": "#0"}, + "east": {"uv": [3, 1, 4, 12], "texture": "#0"}, + "south": {"uv": [4, 1, 7, 12], "texture": "#0"}, + "west": {"uv": [12, 1, 13, 12], "texture": "#0"}, + "up": {"uv": [4, 1, 7, 2], "texture": "#0"}, + "down": {"uv": [4, 14, 7, 15], "texture": "#0"} + } + }, + { + "name": "CrossMirror II", + "from": [10.5, 4, 6.5], + "to": [11.5, 15, 9.5], + "faces": { + "north": {"uv": [4, 1, 5, 12], "texture": "#0"}, + "east": {"uv": [3, 1, 6, 12], "texture": "#0"}, + "south": {"uv": [4, 3, 5, 14], "texture": "#0"}, + "west": {"uv": [9, 2, 12, 13], "texture": "#0"}, + "up": {"uv": [4, 3, 5, 6], "texture": "#0"}, + "down": {"uv": [4, 8, 5, 11], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7.5, 6, -0.5], + "to": [8.5, 10, 3.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [4, 1, 5, 5], "texture": "#0"}, + "east": {"uv": [3, 1, 7, 5], "texture": "#0"}, + "south": {"uv": [4, 3, 5, 7], "texture": "#0"}, + "west": {"uv": [9, 2, 13, 6], "texture": "#0"}, + "up": {"uv": [4, 3, 5, 7], "texture": "#0"}, + "down": {"uv": [4, 8, 5, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7.5, 6, 12.5], + "to": [8.5, 10, 16.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [4, 1, 5, 5], "texture": "#0"}, + "east": {"uv": [3, 1, 7, 5], "texture": "#0"}, + "south": {"uv": [4, 3, 5, 7], "texture": "#0"}, + "west": {"uv": [9, 2, 13, 6], "texture": "#0"}, + "up": {"uv": [4, 3, 5, 7], "texture": "#0"}, + "down": {"uv": [4, 8, 5, 12], "texture": "#0"} + } + }, + { + "name": "rod_left_bottom", + "from": [1, 3, 7], + "to": [3, 4, 9], + "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "south": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "up": {"uv": [13, 13, 15, 15], "texture": "#2"}, + "down": {"uv": [13, 13, 15, 15], "texture": "#2"} + } + }, + { + "name": "rod_left_bottom", + "from": [13, 3, 7], + "to": [15, 4, 9], + "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "south": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "up": {"uv": [13, 13, 15, 15], "rotation": 180, "texture": "#2"}, + "down": {"uv": [13, 13, 15, 15], "rotation": 180, "texture": "#2"} + } + }, + { + "name": "rod_left_top", + "from": [1, 12, 7], + "to": [3, 13, 9], + "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "south": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "up": {"uv": [13, 13, 15, 15], "texture": "#2"}, + "down": {"uv": [13, 13, 15, 15], "texture": "#2"} + } + }, + { + "name": "rod_left_top", + "from": [13, 12, 7], + "to": [15, 13, 9], + "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "south": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#2"}, + "up": {"uv": [13, 13, 15, 15], "rotation": 180, "texture": "#2"}, + "down": {"uv": [13, 13, 15, 15], "rotation": 180, "texture": "#2"} + } + }, + { + "name": "rod_left", + "from": [1, 4, 7.5], + "to": [3, 12, 8.5], + "shade": false, + "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [3, 5, 1, 13], "texture": "#2"}, + "east": {"uv": [8, 4, 9, 12], "texture": "#2"}, + "south": {"uv": [1, 3, 3, 11], "texture": "#2"}, + "west": {"uv": [1, 6, 2, 14], "texture": "#2"} + } + }, + { + "name": "rod_left", + "from": [13, 4, 7.5], + "to": [15, 12, 8.5], + "shade": false, + "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 3, 3, 11], "texture": "#2"}, + "east": {"uv": [1, 6, 2, 14], "texture": "#2"}, + "south": {"uv": [3, 5, 1, 13], "texture": "#2"}, + "west": {"uv": [8, 4, 9, 12], "texture": "#2"} + } + } + ], + "groups": [0, 1, 2, 3, 4, 5, + { + "name": "crossplane", + "origin": [8, 8, 8], + "children": [6, 7, 8, 9, 10, 11] + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/symmetry_mirror.png b/src/main/resources/assets/create/textures/block/symmetry_mirror.png new file mode 100644 index 0000000000000000000000000000000000000000..b29da0866f05c8512c1d5f225241aa26b55a4e1e GIT binary patch literal 262 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 D8wHPm literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/gui/double_flexcrate.png b/src/main/resources/assets/create/textures/gui/double_flexcrate.png deleted file mode 100644 index 57df53fe6ad2427d51b17be05ba2c5dde23124d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2133 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5D>38$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&di49pAxJ|V6^aXoESb93`(FQd=^bsu+!=n&78Fqf=&|Gdax7fs+9Jo z>hA9DTi3V0diCo6|NlTOqhK@yhDQi|sM>uIlxs?Y{DOgLdn5yf;P33Jz*yxh@Q5sC zVBk9p!i>lBSEK+7i%Xs^jv*CsZ|AUQ*33Xw!>kpIAZl;JeaR?i=OLb$5b+XQCDBo`dU%Y zHa+fc$=cn_NvUF7*PWHB&TVp2Ymhy_vZ7P!2BQyybpvMt`}WR=f0B{L8k24^)iWl1M{^zj2n%(A@)Qn3m@Q1 zV7lVM`-TB*#RleQam%}91++H@>;SoTnyC>ZP|Csg%7+a0Blm8L+#6pM&=ug+3y-6X0{&sI-vt-@kF2-WuzruR51A+FJ@+zecy0+VQb?&^#vz+ zO7<`x+kMaBzVL+vwq5raAID}d_|CavUgNp)0|oY1|2D7q&AH;u{@=0zx9i^v2i*OC zSXQ7qKe%G@;yr>k>5-2Mu7Ceu!Bn&;zvv6lCgb(*UT0mXziz$2^}p@=2DQKT$lgny z{O|X?1~;Y(^$dH)Hw``qG6vy*TZ|jOo4v06 zw7>ko>wmiq*XQlJ#ra_WB`LO5&NCQT6o8@7z`#-?&v^cP{XXMuDi7ZN+I;29pK~`R zG;H6vJLvS!T6QKg(#YIgl7Uc^p*uu)_6+Ij&lcz;Ld4Jh` VX?JJ6vld%F6$taD0e0sx%2<7)r_ diff --git a/src/main/resources/assets/create/textures/gui/filter.png b/src/main/resources/assets/create/textures/gui/filter.png deleted file mode 100644 index 00a65a06f9c0295584f25c41a42357272fd79ac3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15775 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 E2NTHBpa1{> diff --git a/src/main/resources/assets/create/textures/gui/filters.png b/src/main/resources/assets/create/textures/gui/filters.png new file mode 100644 index 0000000000000000000000000000000000000000..e1f39a915619a2a1c47702fe3a5326541b5e7090 GIT binary patch literal 1855 zcmcgsX;hO}8veeIBoHFV))^y=B9ascIw)YQ2t;JH5mSsTMQKncQ4pmPmCBN@wM8v- z0wX&}Ly1MACjpUVnAn6xpfVbkVxnP71VLmGL=rFC>FT-g`WHLEBJKJb9c6N3i zIdX)_WUAF_Hk++bJX0tXa=Dz(=cCbR2!a+{lkVRLjB*7erGarf!K$h%I-O1;kro#h zwOXxCr(0TDnwgntY;3HotgNZ25s5@%vACzFM=F(ecX#*o^^J~>PEAcMFE0-a3_N=D zXmD^)rBWFT2BlKj(b0i;OPfqTfCwLUMEGIErT=jOl^s5t5E^W9XiN$KShlVmusJVr z768z_VS)STsd2M6ak0u^tDq(?%Fs6!s=TZSn||W%^^4PGMq|6%>FxdZK6i}^5{NxD zGgrIr{^iq@^Ld76_tfk!i*iy%YvNff9z0(_0qrQ@lpAQy1CTxBpO$5==xcWb=kmlk z7ypq~B3GLpBaF=rt)3vvte=wD)oN8Ce>$;)4r?~Va9bg9SNCNP@CCu~ib4I0c8Z!U#z*Km-onT2u6)9JcRoOkz%>zNKnMEEC#;J%>!!p0E7d1fdx7#b9hb zhO@Zd|DC&-6XJ693SU24u;Vzi=&+UOC~HN?Pq}>;057ypT=-gOlWZxw(tQD7b7 z8=IC+{m+!(Two}f0HGDuZ=A>ZzAPdS|&DCq44V+Gu?nlfUVY9K=qE3(TUE0(^%h0ggWf}5;zM(aGo(hqW3~qOiL)OQ-8J^fpIO@B!UOdpQ*M6f2c)=V_8 z&YlxB2exl{a!kP^Ih@s~)hxr&xMi$1$lm}l!aP3|g{QJ2O4Fh5{}@oqFX`zy=H(D! z*4)zK-t5*Jc_(r3oG&(&Kj|N>xRIE-O{i)L2fzPiNB@3JQJ7c8X#tDPxfwc8^z-Fl z3BU=v^`Y43a6}lJS`3tnYE`u-GKt|QeeP84PfwO!GcC-o`wDtqoiJ7Wur$b!?UkO55aqfi|i!%(0GeJrwk?t z&w+7}Ad@tQwrhz0EknAzVM=LwZQXl38H_#2sK}t4$t3D*Xim@ps>IR-?*pc~?ji4k z5)!~4Y+@oh&9G9;KM&@@rD>qWu4T~M8obBPd2HM3ml7}6Q@bxVatqJOy8pIw*CDtc z2{PXjNdiT(4e4+g>yZh6i|xo?orOg@Q}Vn{9JRPL7sn8h}RH_*nICGnKLM zM@XjSV!R75=xzrm{K1^!jYIQFzk_Ix1HjwNN`PKZ0|YVuZ}st`(&1rFI_8tP`Cp%3 QLk2z&78D*R3}AfoJCr+aivR!s literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/gui/flex_crate_and_stockpile_switch.png b/src/main/resources/assets/create/textures/gui/flex_crate_and_stockpile_switch.png deleted file mode 100644 index b6da1409e1eff6617cd2af4a32252846d85f836c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13655 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 YQwwh!z_&IyfbrAUG1M;Bw0ZUa0Pf@Dl(u73`6O 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 literal 4434 zcmdTni8tG6*FQC_n!aVayi^sPE_7=9lnN@+mA1CFT1!H-cB0ZK6-DTDI(8Y1B}H_q zwg#ysC|R^`$W%&diM0|43UP{`9qe@nVIm){DpMLMi zQ8Br2G&oA|l30SmCEnV)h}bUB zW#@0U_yq~qmjcPd@tX=u@APj5iEA56LaWM6;S03{Ysp&7%FCg!aoO0J!z_w;_!V`c zZ3Fk#oL}|$Wt3ldxmxe5TekmZHuc6q1wnk{{F2ON-llXMNeifkE5MbO6Vu%Mn$R>b zsuaQ+{Hw?D+I=BO-^Z5OU-9DcHWc> zs!ag8&$t1uoI=okCi}p>imbdVoX9XYm6mg)q}nu6xlL4Q+hSpq?->1h_Rs8nZXY(M zoKKWJ@*90#S1@o}WATu$h~1a2nR&sKs=<^lAf~DwpPA_X{H-t3?&*3aUhCJgY2z3t+I9IX1D)D+ z^DsC6#pYm6GPK73tX*?^ze+)#aYA#MFf`WfUU*IAaQ0AA=R+M>bCOb8@iCJJ$ zY=rDj%sE)HoLIJSu44IFZuk-`VaqIUE`r?M*-R&j6i$YmwR%0A5yz~T2hpr3qUKs#5cLYqV@Vqw;G%8a2SO=65i7; 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 K<+_V^fBj$EwD#}- diff --git a/src/main/resources/assets/create/textures/gui/logistics.png b/src/main/resources/assets/create/textures/gui/logistics.png new file mode 100644 index 0000000000000000000000000000000000000000..9aeee18e924afcf47ae7b696eea52248368e71e9 GIT binary patch literal 4761 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/gui/background.png b/src/main/resources/assets/create/textures/gui/overlay.png similarity index 100% rename from src/main/resources/assets/create/textures/gui/background.png rename to src/main/resources/assets/create/textures/gui/overlay.png diff --git a/src/main/resources/assets/create/textures/gui/schematic.png b/src/main/resources/assets/create/textures/gui/schematic.png deleted file mode 100644 index a46e2686bb2c49a4bb6a7660d4802b5785104d8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1809 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5Fo{p?&#~tz_78O`%fY(0|PTd zfKP}kP~6%vC^R%Qt8zv6%p;rk-Z*yb*#H0kf#RcJGz5ly2;8zd`~{RzN`m}?fysU( z1BT%5?5e;B=PdAuEM{QfI|Ravq8eTeKtYKT*NBqf{Irtt#G+J&g2c?c61}|C5(N`I zLp`&+PvnwdHdC0)ZJ(O@cI+$2JQ!T&ejZSou6~wecNLzXD|N#b@q=xj4T2U42&!X zUdL=>VB%-O3wpS2p+IWWkiSI0Io>|$apVZEnc?3bPY>%{ZWaD|3`HjDjm=liio{QhC} zs#5%bI`f*nZ38$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&di49pAxJ|V6^adUHXYsa9_(9o>P72QBE^T_7CH;x@U_W%EXpzJ6Z4S``C z0!#UXmVanMprAyFYeY$Kep*R+ zVo@qXL1JcJiC$i6iGqoqp`O`aKh77x0!72q#WAEJ?(LmkzuN{3t`FBaSl|2KxI53X z@#^2eTpy>J^AlHfPvLvmzwFYCV|i2jirY`$yU9HLblL9jj8&C8`3<-WcD~U+@c!&~ z0R~3B>Ad^}b69u8l(AJvF8sZ|A+q6g>Ymmd`*X#Q#TAA9V0kBO;9|3JS#P~!uOubc`8-c|f#iGJU`zF}?o2Qh($$5+%F7??OV zC>>Z|z4v3w@>@m+ZqNOZFLz$GfuWnRpuH}vbbZ`*TZVo6`d96{@VbgoW;W|I)*ZiI zrpY%P{;BV>mWi8r3e#MMeF_^)9275bFNjSjZ18T(V>runnmLB!3v-5O1mlDH#y*B# zru)1GvO7DnpI0$$;atP?LGyy>f|u=!nfEf?snKS+#Z+y!5 zqhOV^!)Nvr-Ki^RL|tgvIz zC%!$lxoZ0VV4zS#uP=j{8RLx`ED6cNBb;-=Z@K+%KAuJQv+Y5djlt8^&t;ucLK6TD COq5dq diff --git a/src/main/resources/assets/create/textures/gui/schematicannon.png b/src/main/resources/assets/create/textures/gui/schematicannon.png deleted file mode 100644 index cb838679c815ea20f8dff3b09b71d1d340a2452f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13735 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�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 C)vJX7 diff --git a/src/main/resources/assets/create/textures/gui/schematics.png b/src/main/resources/assets/create/textures/gui/schematics.png new file mode 100644 index 0000000000000000000000000000000000000000..a3cc2615a770e7a881f49dff52dc02371977d037 GIT binary patch literal 1987 zcma)7eK?e97eCMQ3^NToJ~EcDCaGAGR6eU6-l@@wEF!XuZ3wMpv24EPLAGfn6iMFJ zgp!ZOR9il4CM)YBTkRG@so4+_6)naZ^FG@5&-ah_zOMWFopasi-1j-ZbME^-?&-n) zh`Ndj03YpkWqAQ0gopqIBj9lDexGG6&Wr5=!ru&E5en&$v%53E)m*j35EVjq^W5XJ zlfc~ETmu7xLx&EvwzgJRSC5a6bEA&3-Gl7x?Be6&v$M06N@aO@`HL4X+S}Xr?b{a? z7ABSUOQq7jzP^fzitD$ePR_*XaH?VZY6A4*y*#`Lm;X5c*+Q)+j8??B`o{s#?krEF zA^-3sfa=rTEN7qZgC@`C_zs(CW^EQu)DAQcF5NrvMpe@vc94DpRj& zqn+s;{%N07t%!4Jlt;f{=D4_RH(~}V_>%D%)Dx&ogj1KnQj z_S;X5M8h`4B0FH)LzF*jY05`f$-3I(@EtVq0tsMtAteVg*?!6v_Qv;dpBBK z=$V+F9$J5k{Q@8F+hMQ@Ayx`!{h$r7VGQj$V(@dFeCDv+g-Dfj$e+=9tQN_0F z<1gRPt3#Ja51yZ;x*YlC0*h5Cv9o`5hHxZV1dImX-n0Kgb7(31QJ1w&OS?+xIBeV z9_81RlBbM_L{5&=#m$3(mq0gOU4{EJ%wDnNEYij<6rzKko8=RaYk2kNZ z&@I9iGdZ(=Fs^!xswL6Oaxg=f>%Z}5r?O@3gI+`zuNvv%xe1PAFWc5Y+=gy=o3x3# zJ#Lu?MF+AiuB>zPjxS9VU?_2cO3Ck=KfclqMdCy-PXBIcQi%G78AP46${gFrUq^dO zdcAHybRu)XQkG0F%g0QP5Olj=ypP`YTV3rWlM)f8)VcU1GT#tYx^>KvX@pN1`wbwD z7AI<+oA8Wr3vcgN=LK)}QI_lEelanFaQtBvHXoKXIvO$)Qp*3*;HSmLuq*{P5935O zPLCGTZR=cvobXVPmCzH8AE3raIM-WO^VU2GtMw0g10|mc(aav|uPz3cx*0_BS(q@( z)^bR&Lv21Ni=cPmko%<$XD*~Wg0TW1IIfwL>@Avf~*vu9P54pK}SPsuQ0 z=t$&4nS9&_xFi;0Ev}h{%M@3XBSa8l;dBPh09z$RBA=O=u}2&raA^~0qbM}A@cqH7Er+<)Hzys!Kah|jFuoxI!!4%vTn1y2E47r*Lvxqkb zLDp)YaK*dM5aRD%%hyYwJhs(coYr%&+FlFQ{Pew2Bx+99y4IB^=Vi{7mGN5F&lp=> zx(GTr%JkL$;9>?T;_nMliP+{gnT|AAtgcb-O!2e7Qf9{wy=_%`vMjOV1AYY$cd$Ox zvm&;Fpsm7?6WqzqQt1)3_>+^I_YN`QC9{dwgg+fxU0k5e^YR#n;alOce_2kDO$+Bw zPp_j%a!37A$frt4izRnM zj)uZgjU${iSFWQqpw@lUmX~I8>B38Gz;FEi|p7Ns{6XG$cPta1gHGg4zD?>xQ_z(0>E?krFVofbi>jc%$kg zOmn4FL%_|y>qWH3k6?o81C^qK#>mMK&NhGTpuyac9tc+74hPdEE(|s1tV@X;7Aprp zG#Utv-Fw1H(YR^1B}ERh>j-K3SKN%)L=;t^#)!@-&LG+*SOaXY*dSctRc~N;Z2)O( z7naxD?pXvPBoyfgI#|U9vs9EP literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/gui/schematics_2.png b/src/main/resources/assets/create/textures/gui/schematics_2.png new file mode 100644 index 0000000000000000000000000000000000000000..3d2dffdef0a2021073aef3c1b8a717fb4ce053e8 GIT binary patch literal 4015 zcmd5ATx&~*bv)m@SQxpKO z&5BH-000S82nZtu5M1T#xM@XFEKNbp2gON&ArxR@YXU%Bf!LZ4O0dSUw{bKV_zMaO z6ciK!0s@+vnkp+Rr>3U-Leea4J@I&aPEJl#R1}}jzj^cKn>TNqoSaUdK0P!v)YH@3 z)6?_m)2GqV(Zs~WqM{-j8=JbiI%#QXJ3BiLhXcc~yu5sQd3j-BVQg${LqmhM_96S@ z))#W(;P?;%fuOFgPV;lIbv&J&ceR9Z&)nM0(b17VhU3rR`2XPeOGo&>34A_@&$s3C zZTNf({<<-L1!9acjMT0DbAzpJaOpPwI{P7etQF)=YYfByWL zGiQ>MlN}r!e0_b>($d`B-NVDf&z(CL7#J8C8JU%p<>uz*?CcyA6!fC0z5e0zva&KN zm3rdD2?~Xhk&$uy`0>)fr%%#5uKG8IkS-N^J@GNTtcUfz-`HbdBB%twC=xp>fNN0{ zJF4LL{@)JJzV_Tk@S-AgvP&cY8209bg1%&l0I;>eie%y#>p9~gV%Fa#6KzH(^R{F( z6JcBOp+^I}(AnT#-Dd-j`hSP|=80Io_b^b9BAeoOmGurhcoq_9wlnF>cx;iyrwMtN zBHYh}0_`D}osF}9R|NPdP}^kkM;+7>R1fKe@2&)iE3hn4jEMpioh}3odH`HOG4U)( zmP-niu!RjF@>?d|U9XoRUYgs)5VkiwQkbJ=Aqz9i2Q#&RaZXd25>pA3mNNyQ62T7K z{~>mSY9?}UbhjP4)M%L4yN9v!o&5p1I(-oBi&%_Vz3&1kN*YOp1D;W0`6yV{{+}F% zd2`2Gp&dhvY-D|lu?+gM&(ZDVTWCM46vsGXku>==w5qRSmUvhb%}%GSlG`EH?}f5> z;P}qG6r)FtZc=CLWKy(-qTq{?70An5XTS{L?nQ0F42(@aN2&qke)ekYD^6GmC-}Zg z3p2{)O13N@za?4;vi$JT3_-72`B((6M>%{BoVm(J-pgRn;dUaxNM?QOrl2Vfp9qa4~p_Jfw;D+6y zdE#D_2$|#n%fXA=MRoRH((-OHicqg&wr4#`kK8|7%fI4gd zhQoe=z>OfBNsh5*jtANsWwHN_T5_pBqV1m;Q8s(bM(#OKq`7DqWKHUB%$(XY_gIX* z=NY2-rI-yOvGkU@wXzSfeu8-=$R|y%Cuv z$D;GGQn2s)0?!Co-WAS7xHrK40Y?9=PVlHh1irkrEg*A5Xw}Sdvwl_fAvOO~)Ub$S zhO9~@n6vUbO2k1wg;e&PYYHD6vcZRI*DdX~+&KKun(;e9ZkSTGoPJ1E>cV%;q^w%} zA{#O16s>(jjLlJqr=iuxz%o;Hdw{cNrGsbM6PlhPcPewgm2C9s!Q6)^WqK_tsnJ=H zyHVm&^m5@=Z*MQF`SzV=$UIiNU8s@M=oTzyl)%Y(4gDan*7oh97Wf!cC}QYh#QGlt zu5NRK&pcz4RQ#s2n+&+_YG}hSt(6*%KRUBGF4r5)j+bb&6&5%Ta-UrfB5)P+>@kOB z<~(XkFopU^(*-aE-Wiu7`$U&(IOb@w5}!pNzJr+XY}`O3{B>TO2Q7q=#nhVep!@B4$D(shTDVtd`=US`e!Gm-WMMitNpzgJ9RFEF=M2a`s zeyT&{-~v#j1eg>e)xx8v$APZR#^h0zFVi3c?46GHyH8h=n4U%O90Xg>?EC)f=`;{z zDai!}O?qtipB}aC7zyoP@(_l#CkbSS zf?kp9ti(JOH3b;s=9JltvY_d1=ry%s%a)csXA7hU^U6XKURPFA(bA|6pYm_}vTHak zeQItG&+=gCxE~v0bJ8PnG3-{?Oe&Hv1csvZ?rS_Jen`cJ1EcQLWNmYe!ske>$acMp z(~v1dnSid&i0`~NUeSuG7HUqu9^uBEC3BqOB7!O&k&70$TOmTx6rJ5DIp$S zmjK=!lQ{G8Uz3o%Qv|#|g)O{-Ep+c$nVyEL7T}Sl4_+6r67!7~P2>H%HJM51wcNGh zM3Ldq+N7E3@5^J4U#wr7O`08@eTi6dE|#eb9ft9@vC_F3b(4t{AWxc24zm|Ixm z%A4uhMtwYf+;e~K)3?81Ij(JwEKAdL5gy99kCFC#8ZkN(lQj23Jb7VwDe32ru39?Jt$nn~k;>@m(J%0InUHRL}O?!}pDIg2h3oXRyqzD4h&{Ute zj#cq1u+&4766Ht6=Q4*F%so#e8OSxyq@dYm{OVxmD~$(yVn?dV-<_RKKX{`PN**qghC6xuea^npb_i zNFXWSZnrvy%ieLl?xBBA+w4tn-hVmz)4K;3`Yj?llrRHQ(X0UK^5qI18MqyEc4 z0s^Lqf!fb5#r`WcWhICPuZO+@P06U(Dzj6DMz@yjxOUR(HR8^$H`zykx4-(IB7_%exoXULy{pbTq-Pu%F|{u8hv^0_KlU zOwlfV?GDPVm7I8B_6EhuzwA_Ln4AIr@bdr|`yio>CsHb+d_xh5EaUy~@ATlJPU&JW zMAwzxuT+C} zk>Pt=Dm%T*KBI2t2jw`W6-l^mMEd%Fb~c;dVmd98_GRk>2mG-TR+g)?u!k8I$pFq0NGQS!kw#6LO$2825OV>-$aT5q|NJf`Kpta!ao6lnARzh70)U z_wi4n*q;>=mwUeTJ?nowP*wJf_98l&59wfUT$@QuJDBH`)|tKYgwN|c;|}no|JPrC zwO1bt-a>d@M`xvt@fT^yWl`HgnBvpof0azUvb=Jw@5{|2YxgS=rK`*Ha4Z)Sn_T^+ z;akv+*XxO2r(-IWPZ@JtQ!2w*sbo3#-nfP{xUPj&PqSXEiZ^CBcKa^gkBlWZ+8d(S zLnB-woE)lEmYx?Jj6O2_;rqNV!lfeZk7=?K+7Js1=p`vqjL@_-{OY}JHwbBNMy_A) zRe$}<;(du&wbQU&AV+Q2g7}T52bG9~HF;Sj=8Eltgz`T~--0+F4$&>x;NcNJM}>Aq zM?%^+(nOfxZFrrIOFd%AJn>K`Z$S8x^oV@6~Be%Qz2FkX%FNIjZMW!5@0Rms_-_>(vS>mf#5WFM*iS9AMQ@5EARF;INAij~I;nt%YW_ar@ z{>$HvrpB=clNpA8N`)$Ze1FlT_ZHF7O5iJl@3xXpfc-v?_YO*QBQYo&!W-&S7oBB> zHMHsKK?>OrEN)=v2e?Ih6%lc8%Z@_2I9)2*S_-p4APy~G!V+`H5%%N#+w13MAe~mm z0*KeP+B%isW-9xFz$JHd`+B2$awa!o$8ZC>YDR`@@$hAYWoxGta!>ALQ>PwM#6`#* z-KJJJcNQL|TN-RY1Yl;GQeKPXMcq{5!&rFUk=^aPH$jQZRG3*t{{lP!Q422c4sgpA zE*Q^1sR1pMDoe^Df(r==MgN%B##jWq;tku@EiEmNH)HgDbTW@|@|bd#k@>^Jd?f36 WX_!ByM^^A-1FX#LNHwP3ss9GfsDr!! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/gui/sequencer.png b/src/main/resources/assets/create/textures/gui/sequencer.png index 13a8cbd33a1331fd77dd7c526e93ee82f20c9748..5dcbea527b17911cdc72bbf8be0f96e607950def 100644 GIT binary patch literal 1696 zcmdT^do+}37=OR{W}2`KhjCmoYFF7vR1)FvjYJ~NG7}{t9h1;bX4KH)E0uLuY1>eT zT-w|#BfB+blx9vBc9v?UNWwA<>oP({&3;pR`fJbrzwbHEd4A9HKJRmW=efKYG=J}9 z+NRn7fMq`0Jp%xMFbILAFs5Q^g6SHI9pLQ&>N?CuFayt|?xX^6Gf!tRf`HkfG(Y+_ zOcMwM91gc+$&%^TI0%9oFL(x70YRZ>*hUDC$LHtgbGh8+=4P6k71e&FqoX5-!^z6Z zQmfTvWn~WEl0_mBgTaW3it6w0m&snrWHPB#T3%j`Wj63wYm2EBoB;noEdDx9OGB&<4L7+!^W@V?Cy5bJHywB-LZ9V%8n8wQ7x`9dt+%a zu$}kQqip-RBDQgNRm{kOS3qTYSDos*>W;#;Gq1q^ihEdryQ(L2U%C5iowqb};rdpl zgS^hxPOWS|T(M4Q^hT}&D)=5m3B&=;)euFm7mBvPSMYD`4K2NGx(ceR56V!qJyOn} zU)(ZCsUpo6dcFbY?WtK2p_ zPCxaIeMZpR<%|2#enqJr$~C1R#6ePX+&~?d$#c*RB=+<=PSNh&epQ%W3#V-Q48>ZM zhTc`sX2plZq(J#|zlG!3545Uk6N@EK(QDDxq>^_QpPq=VhS9K-WA+kjWIQnJNc)3$ z(jhbThYxX69S5p!z@0Yv?Lgk;b29;1*vN6RHxcmQBd1|=Nk!KIS7PkoZ3XZk!Jq1xb`$QS^;;Se(m|b zV{eRkC23MmBOE|MTdHVBfi;gE!Dw!huDvr9p#Wq4Q30f-e0O<#7%(Jw9z(=$L}4OD|3B3JokmjYN##n z7HbI1BwF%emQ!m7G;Ou9hLZmr&U9(gf6l)eLOf_#N={;woF4>KsdD;^=ELY)yTbMq(vLwgVhh2pTI>Dg*^NB zMO*reTg*xrhF;^5`tKLr{3v~2YeWv5K{BJXA3Qrc98jz35C42AX)&-_$KkzjjisRc zCw^5Y_`s!AcR(iY1Bu&2FURn|KZK0`@aqskIRpD^V3EL1;{5TUbNGx3*FLcS7Oa1Q z*eLb9E3Iu^%__i~|TAF^Z)0&bFJ8l1bq zNyAbSX6Tg=dH&zJI#ltpV4{XM6fuh4k7pdX)48JJ)41kN$aZX~nVHVa#>PZM%4eo7 zf5#8|)j`)8B_aD6n&x0gZ&#THAjKDZ=~i-d)TI(`OEmvzCb>VEoA+H@`-2xy&Ohma zZp0|irDDq{uh#ZK`_z99eS={8>b%IVWHu6HuatCoo6??u`APs;cn-LWd)@_EXt5lx zDeB$a1#7Gu0Muk>SD&P9Lq*3G)mL#@dPpE7z?ECE?9gktBLuk=O#|Ih$JK;;+6~JE zdf}?s*~)8ZAar)h7iuI=S_;>*vfT~(MnIt=iqPLL4*k;Q_g&?d0}57EUFzNibmRd?*wCJl^U0|+HRUb7^0P7zcX um0Y$~sE_fNEZ#MO2nb2%e=Ltxs_#82gW%mo{8{V=2R_^UJ?lKePyG%4>(g5R literal 2241 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5D>38$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&di49pAxJ|V6^aXoF-XfLDC0QHn`m*i;wta$&t)QIY`yj$0|zk2lws9+R~ zhQM$QftX_~{h(Y^666>Be`EuO;P33JzlBSEK;T4m(d5$B>G+ zw{tJ%EjAEvoxCjf*5CjC&ob>3ab`Q=b$8>^>OPZQS3fj7*HAbvov9!D>BQrrpO>Y# zM{jF*zt6#8TSIjD6RsD6x_Zs0AAkB<`o8nEX>lEk0s|w50|QgZYdat*uwd)b1_l;| z191nQKd<&zSnyT(!@qU*QjI_{hiq>~Mh**+58uA!hjy$x6WXy`nB#@VfwGzFL+-52 zUa$R$^@{buM8-U(uq*Tbb!Mz|hpBqW^ks94U^wHi@}KW-s~mVI=+IC%)!@NTjw=>i z65koQ4>SGw#`sNIaoZt|3v0Qx8F`^DIp8h8$j-Fwbj{L7d9l^86ZIQ}7qcjSYOz*2rK%v*vL0ZxidbtOGu1pxNmo$PWecf1mmvKMAZdg zPj1;JBDI&r-tJmxW5YEjtwoIIwBB9&YV*&_abLsP&I`3aSzJ!ruigH3~u3425_L!V0&qd;T$;YZmv0 zYW5uemR0@^HgL`FAE>_g#s~50s-KGy)^aoM`YL?!(|MpXuI^^o$F1N{Z^8t0YQwc@ zhw3Xi^WqCjMIXImVX_hu=&cAle>fK$%zwV+w=DYj>elP797b(3rbmMPs|0v0!WG~7 zE#bb9d7)!9!`${i*Zfnqfz_|OzTSuVFXs;a`=^9?S=61n8!C=0)^cG!2aG_as}1++ z7V$H#WLs8y;84N$XZ;5bY?!3O{5Q8n?Gw+J?V@^1BwvI&%xYZQFkiMXd!48BqUHV# zH~*yfJ7`~e#?SJ_;ohHgrfvGGH*2|sKhrvLcjl3wyG15g{@>W})+m1Ej_B)g z0uOvMcjCV21oG$B>!Le9v&XlExp>>IawDy9QNZ7&5wB_uWUKP^%;#5rQ4(rB-bu1>J zbPWtgCMJOgdJDX_?BEGwSE@Cr(Z2e~XvKMED@MjY=P&PMs&eT*t?)T6wuxb>E=Rzv f;YmGXlI!2U<~*Cn#D=L)LDh(-tDnm{r-UW|cw-Hm diff --git a/src/main/resources/assets/create/textures/gui/wand_symmetry.png b/src/main/resources/assets/create/textures/gui/wand_symmetry.png deleted file mode 100644 index 49405bd245515ac8a17ebec7576452117137d4d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1781 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 literal 2992 zcmeHJX;c$d7JdmvVkm@KSp)=>ifaT516C3fsR)XSAbWs-3RH-sniN?jXb>I1pcohy z1Gs@8OAN@O35#W`(10VdX@cy;u*3*q$uijKkG9k4%>17p@4WZD``vr)`QE+fzH7&i z*{dV;5C8!6LkZ^=}!ieD_~Xd{-gT=VA0iN0k9Rk z<~s*3G5{L2pB6-`&gvxqYIcVX?01dun|j+pa_w2)BDNS_&(kHsHy2hUT(wd!!TGw5 zIu&LiULAJ3k&$1#>+ZqEr$tvQOE$44ijuY#Z`$H)x9Vt-ySvVf%?Iv>H#j;tLNaZ4 zlNv}ChP-MXdEBoKPT$D1VXjwlbA=;0!)iSzM3SdG%<%f)={GfO-7LzysBdFQ`oDC@4bD9OSzH0neC2pL6d37Tn}2^ z87wr0Hn+AqluKwAunWeD)@Iq*?F)?x`Es^K+Bb~v3i{z{YLF&4n|kXbx0UT) zTSl}|MRet!Gux|SnFPLNn?3k(V|HZ|=gw5WS2EpdACm^}{0y3>{wzkoDK=v!%#I|z zBqz!2TH-BNq6{TP@TSj-chc;g#+dk#_lChpu+13s*T0Z5iB=HZ;y!c{Ke8Al zUFVF|W42UYD|>e@R$lxfNv0V2Sad4oI$M=$*;}>NDm!Dw3*WS3fLk_om40Pbpj_NU zQ0_@x4b3}hI*nl`aAFwJ`F`tkoyDYIe6+0aE?hxPXcGFA$AZ>WJ=fz7cG!<%@U1qa zGpNdxd4)*~a*LK%`ii@nTl!RRdLx9-D!kk|x)W)5Y+q)kjdHQ1MQm>yFF|k9L zhxU#R6l&?76oK0e_{$4p^pHv+m7Z20xp|b6aXYa|h$g{b_MKL#FI(UarX|dfkx-A~ z?mMu$$I#h}0Rj6>fpp_&^CG8CD5x2&67~L(->pb3pXed{V7pm3Ucw-v z7wMY&WQrRTyq#hW*36qcpOU%5TY`+x8qEEvsMq^z8VtX{2!UIDM&1|`wVUQ!S4T_> z zv6C$DL2OeF$~=^>BgrpIr8jqnpxXO{+cS!s3ENS5#Q`CkXju8I!@{^gI6ldO z4UjHW50uQ!lm{vgzlJtwpUs8ECtQ_}mhU;CVR2$(`;kQRxe7j^%623=j%(07^NKed z?j1&CkCA8=of+x_(aW}R`ML>RqL^(*7$S7~7WQkV7jt1@>AB`X?Y%odUV%Q;zuO7A z2xX>(i!%J8!#pywe9v**rVP2>C3H?nlZx?skF)rSugjn^l`gFxvtZY5*H14_ z4Uv+%5myTdj%Ap=aYK35!Q-qGBOP#qb);+*Zwv4MX7?X5)oMpHTIgtJZZgY zWHSfzWPgdTnTRzp6Y77NQzm_eiXnUmN1RfM*KKs3`$Y>1Lvs$Z`3)UX?kYu=ZF z?G&9{d+^DEe0T2@EjZO0TOtL1eq+HpjYB@N=Ru1xrX$3rQAuAE+p%0)>hiFU(Vr!K ztu4BVf4H-(nvijwcCDIX);nYt#tw3;b9-$Sp1P!&YN`*y z#CPlb=&N@S!VyHbIN5X3UB%y7NRDHy*k&F8iX{|i9t5Bf4sg0FbI$~TfK|Xa835Yn zfNK74jg=UnAct-WSu@s8Chpn}aGnGFwL1^VNrt^TbM2W=PxC{bZT8%t1&kj}kq}w) zjLVT1c-CrKxKCHf7%=86I3sbt3oX101vHjwJz8iJ$n`1&!ormVL=bcO(y{C+yv9Y zZTA#&P?v7?(4-a0uLOA%Y7L3c=q^<0p$&&8nS-K zzI5`13D6rpgZo*S;f%{rR3i#dum5ZLJbFhyGZlfjTrgkGn6)(iBg!9C*bE{WMZW+G z+i9^fv5+1%ksnT@`_U#QCSte)ue0+wy5Gll1E_c34=kGv|BD*^(*pjTu}*gt-mp&h z9&29q0zely0PNNKAKKw}(f;rGo96k0xBd?bwIbdreV1X&O-4^}E5B@T$nMyIQd|E^ F{{RP?^eX@W diff --git a/src/main/resources/assets/create/textures/gui/zapper.png b/src/main/resources/assets/create/textures/gui/zapper.png deleted file mode 100644 index 771941d43398272902f49043a982a8f554a25af2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10750 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