Down the Refactor rabbit hole

- Reworked tileentity behaviours for inventory interaction
- Deployers no longer actively pull items from other inventories
- Some more work on basins
- Added a new inventory type wrapping an itemstack handler that automatically syncs the tile entity. It also implements IInventory for recipe shenanigans
- Held items of a deployer can now only be extracted by other blocks if it does not match the filter
- Fixed excess items not able to be extracted from deployers
- Removed some things
- Funnels no longer actively transpose items between chutes and inventories unless they are vertical
- Chutes can now active pull and insert items from/to inventories above/below them
This commit is contained in:
simibubi 2020-09-13 00:59:14 +02:00
parent bf00406cad
commit 651e06a70a
129 changed files with 828 additions and 5822 deletions

View file

@ -11,7 +11,6 @@ aaad1fc11aae17e209b0c3fbc9977c724c50c1ef assets/create/blockstates/andesite_belt
da63a8be3191d6d72afef6c79e3aea3f607631f9 assets/create/blockstates/andesite_bricks_stairs.json
a579c40c43dc2174afb66f42d00d0c4a0efaaeee assets/create/blockstates/andesite_bricks_wall.json
9999a75c7766781eadb12510a09264600bc846e4 assets/create/blockstates/andesite_casing.json
7074f8af642b74edc26464bb627d919516c2de0a assets/create/blockstates/andesite_chute_funnel.json
3af4ea3c44b5ebc7e1e3fb73fb8356faf067a613 assets/create/blockstates/andesite_cobblestone.json
97adf53a7cb99d7652fb39adc957e9e34cbaca47 assets/create/blockstates/andesite_cobblestone_slab.json
96b5284693da168ab8e0809d86515b5f1a7e763f assets/create/blockstates/andesite_cobblestone_stairs.json
@ -30,7 +29,6 @@ cf9045eb16e5299a1d917c4cb536289f49411276 assets/create/blockstates/birch_window.
fba967b1f6e44b34a9d9662e2fedfc13aad7f36c assets/create/blockstates/brass_belt_funnel.json
8b1dd00adcc7e74c5a9feed069e2610b15a338cb assets/create/blockstates/brass_block.json
b8dd6e505943e06706d0718ece620ab3cf943650 assets/create/blockstates/brass_casing.json
e8583247cc7108c80320b739d7af121a890d79a8 assets/create/blockstates/brass_chute_funnel.json
3057e1121117c0cd651c288cd8e2d46bdf64afb1 assets/create/blockstates/brass_funnel.json
672eedcd3520c6d39603449165a23be9c612c620 assets/create/blockstates/brass_tunnel.json
e81608346d43406ee72cae0f78b8bcfb37ba2d75 assets/create/blockstates/brown_seat.json
@ -93,7 +91,6 @@ f179202e59e449157f89efc37229b03bbfd391d7 assets/create/blockstates/dolomite_pill
7b2b836649e729feafa60972bf95e3afb2143131 assets/create/blockstates/encased_fan.json
656813b75dd3b901bf34f24df785e4b0fbe11aa6 assets/create/blockstates/encased_fluid_pipe.json
e157d7f67b08493b71d7ffea8d622f4a64dbc155 assets/create/blockstates/encased_shaft.json
1442ff1a0e404f99263ba99d734da1dfed03d4e3 assets/create/blockstates/extractor.json
a774e815376a67e2a2de44e39af0a1a0b4406932 assets/create/blockstates/fancy_andesite_bricks.json
180be26a75834cf9cdb881f969f77906e91cc36a assets/create/blockstates/fancy_andesite_bricks_slab.json
d5d7762b80952052d0a7adf3081967cac3f3ba6c assets/create/blockstates/fancy_andesite_bricks_stairs.json
@ -190,8 +187,6 @@ e7c7b952137c4cb615988ea59b9f14303c9a4dfe assets/create/blockstates/limestone_bri
17c5a6c1dd094c9201ed90fdcebde620a8a39900 assets/create/blockstates/limestone_cobblestone_wall.json
b7506b862d13b3f915c60d38bb7a20afc935f70a assets/create/blockstates/limestone_pillar.json
69790737767e06f000c7824749c46664a123160e assets/create/blockstates/linear_chassis.json
c793ab3aa6cf09d8d6d4136757629689f0365771 assets/create/blockstates/linked_extractor.json
c5422866667331f1d5cf6753c0889747ee02762b assets/create/blockstates/linked_transposer.json
84c494d24cc58af274fdd054896c680e8095d2d0 assets/create/blockstates/magenta_seat.json
3b3250d6e209403a93d025604a8081087965016e assets/create/blockstates/mechanical_arm.json
ddcf4bb281e046fbb1026b8f46a2cf12448598df assets/create/blockstates/mechanical_bearing.json
@ -234,7 +229,6 @@ c46f0b62967cf483ec0720a9297c8ccc97f5547d assets/create/blockstates/overgrown_and
2398939c8be07cac0dcb7ea710eb98e74b408e0c assets/create/blockstates/overgrown_limestone.json
fbb651b8e4a72bf0a17a6bfdbf4eef680e9d4a5c assets/create/blockstates/overgrown_scoria.json
9c8e210bdb29b2ab1535a25762498d7c03156444 assets/create/blockstates/overgrown_weathered_limestone.json
5ab323fefdbfff04aa5c224bf5f0237f0598b3b2 assets/create/blockstates/packager.json
ab93ff18b747607dbc1d8d7311a2737e302b92d1 assets/create/blockstates/paved_andesite.json
89e88a0d2e7df66bac7ab11ac2c7b14812d8675f assets/create/blockstates/paved_andesite_slab.json
f43d947077b3f4a11a9729c58709c56f09859da0 assets/create/blockstates/paved_andesite_stairs.json
@ -337,14 +331,9 @@ f385988cb6fa9c48b5d59a6942ec50ed2b60c8bf assets/create/blockstates/stockpile_swi
e815bfd854c2653f10828bb11950f7fb991d7efc assets/create/blockstates/stressometer.json
8b0c2c7ac72529565b3339aa8df7565858100afa assets/create/blockstates/tiled_glass.json
a2454400b1cf9889f70aebdc89c52a1be25f543c assets/create/blockstates/tiled_glass_pane.json
e122bf687d991dd2d7a05670039da7937f96ca05 assets/create/blockstates/transposer.json
a8094531617e27a545c4815ab2062bf0ffca3633 assets/create/blockstates/turntable.json
d45450255fd7a64cfd2bd8856fd4cff01a49cc8d assets/create/blockstates/vertical_extractor.json
69dfe8afaa8eb6105dae9f76ab8b7847bf90b8c6 assets/create/blockstates/vertical_framed_glass.json
c4db76b9d36cfb098df0d158cb6f8b82768ebe14 assets/create/blockstates/vertical_framed_glass_pane.json
0ecc57db2487ed6b370b9cc43d2a873c61d7c37e assets/create/blockstates/vertical_linked_extractor.json
751b99625aca1b4122a0333bfaf93325d37eb003 assets/create/blockstates/vertical_linked_transposer.json
02199afb5b6ebcbc8e11567df05f39eface39e39 assets/create/blockstates/vertical_transposer.json
d995547bcd71603ba7378d8998098e462030bfd0 assets/create/blockstates/water_wheel.json
f182669f7547964f9f2ef67916568556870def7b assets/create/blockstates/weathered_limestone.json
27e6740834c0f673acc3531371512daa6dcab025 assets/create/blockstates/weathered_limestone_bricks.json
@ -360,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
1fe3d6fb515b8951750daf6ff274006e14c96b32 assets/create/lang/en_ud.json
e4c4fa83b8549dec363bbda95fa9fda7b285de5c assets/create/lang/en_us.json
e1a6b606458028f5c3b4afdc0a9e0cbd22d9e779 assets/create/lang/unfinished/de_de.json
46c139da98fdee00d70a5fd893fc3eb4f03b8a0d assets/create/lang/unfinished/fr_fr.json
ac0103512dff6e125cfa0df5c9a55cceef33a1f9 assets/create/lang/unfinished/it_it.json
b22f04831c88799fcb69857ba16dbfa9df74aded assets/create/lang/unfinished/ja_jp.json
8f72c330dbb5eb2b4631ffdb169e2b4a5bd98695 assets/create/lang/unfinished/ko_kr.json
f7a3b075daf79ae600435c779a91c91a182771cd assets/create/lang/unfinished/nl_nl.json
e65a45f531b6ae7a0818503c335366abb7a9ce20 assets/create/lang/unfinished/pt_br.json
4251b8d5c5c45a162148776ccada3d7abeeb5bf1 assets/create/lang/unfinished/ru_ru.json
c8c10a94bca76ee411246e29dbebba530a7f995c assets/create/lang/unfinished/zh_cn.json
c87674f2935327f78657f1bb44b3b10b6697a548 assets/create/lang/en_ud.json
ec8fc3f55847ad667752fdc06fc8b5de75253cf4 assets/create/lang/en_us.json
bab998d2bbb0e24147e8dd34006bf94a4ad857e7 assets/create/lang/unfinished/de_de.json
e3e51ea8e3e540a4f363610195050b0bbe8b452d assets/create/lang/unfinished/fr_fr.json
b2bc925b69b276f03dbb30aa996e3b8677c9eb16 assets/create/lang/unfinished/it_it.json
272aa6f6567b451a5204283f580f642990c04ce0 assets/create/lang/unfinished/ja_jp.json
1e3115cbbdcb55dfa871ae31fc88cea78544fc5a assets/create/lang/unfinished/ko_kr.json
e470b095bfc10d3fa7141a4d8860eaf093be9e62 assets/create/lang/unfinished/nl_nl.json
1c3f2f8cf9d7d5280d7495da3b8c89481fd5dcee assets/create/lang/unfinished/pt_br.json
a49430d7b66c52cde1880ccb7fd6123fb5ab2b2b assets/create/lang/unfinished/ru_ru.json
5d569d86a3d8af114bb6b99a6410c3823d2191f8 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
@ -406,8 +395,6 @@ f1ba5c40d5e580d3c46d2eeab37b59263d0b0904 assets/create/models/block/andesite_bel
f0a955282f7abd5ce0b412ec7b59024113ca970a assets/create/models/block/andesite_bricks_wall_post.json
0ed2fa65af49b5c92c4e5c688c155e37d3d6b118 assets/create/models/block/andesite_bricks_wall_side.json
b9943c5585fc081385ea49a4199efeb6c7c22423 assets/create/models/block/andesite_casing.json
d89f1a04622290303729479ce5e19768f296a297 assets/create/models/block/andesite_chute_funnel_pull.json
911cd82e8716a076a7760534de845f60db3534fb assets/create/models/block/andesite_chute_funnel_push.json
77a045e855eb37d2da7ed8f7d27a85b9546c0ab8 assets/create/models/block/andesite_cobblestone.json
7d816d54c85bc7d0cc8db9c68abcba960daa7b43 assets/create/models/block/andesite_cobblestone_slab.json
5179ecd1f926bf3211a1a3f033dfd1d2368eeb20 assets/create/models/block/andesite_cobblestone_slab_top.json
@ -457,10 +444,6 @@ ee79efc65b05d953784b00e573d37602629eb9e8 assets/create/models/block/brass_belt_f
253e88f2c11006abdc87156dd409ed3944bb7295 assets/create/models/block/brass_belt_funnel_push_retracted.json
0934933df6bfbb19a1b14cd0e3cab2c18d5a3ebc assets/create/models/block/brass_block.json
166a5c053a81e6aadc24509ed24dc144a7255969 assets/create/models/block/brass_casing.json
8c42d09a18fb17fe846365138d0f0d58c6a3c05e assets/create/models/block/brass_chute_funnel_pull.json
7b3d2865ee7611940af017161aaabc7cb107225d assets/create/models/block/brass_chute_funnel_pull_powered.json
78122dd0f7b65bd071974030682fa484c31d7ba2 assets/create/models/block/brass_chute_funnel_push.json
7edf6b5c95f61071d8a9243a63e786765d6104a3 assets/create/models/block/brass_chute_funnel_push_powered.json
6c617fc504cb2259263d24fc56c4735e455aac6d assets/create/models/block/brass_funnel.json
2f152b82291b7fc994191b1ffb8ec6d65aec748b assets/create/models/block/brass_funnel_powered.json
520087db8d479c66f85f3483af813fb668f27503 assets/create/models/block/brass_tunnel/cross.json
@ -1126,7 +1109,6 @@ e974cd23a5456baef8b634f2d21fd8c3822931ab assets/create/models/item/dolomite_pill
f2d6b88c3174de01e16da555236727efc33b490c assets/create/models/item/encased_belt.json
250bd0716cc1f04b03892ab74eb0b3a0f32a6158 assets/create/models/item/encased_fan.json
68833e2a7836c73776551565783a1d175b715c66 assets/create/models/item/extendo_grip.json
956646df2a75ed651eabb403a3f9e1024538cd56 assets/create/models/item/extractor.json
efcbd30ad7a7658c02a3dc3de5fa0f21d7f49b54 assets/create/models/item/fancy_andesite_bricks.json
7ccd312084128c356307c7ca6e52c65d0a18907b assets/create/models/item/fancy_andesite_bricks_slab.json
c8eee9d8df7af227eba051e4b9a7e48a79e682df assets/create/models/item/fancy_andesite_bricks_stairs.json
@ -1230,8 +1212,6 @@ ebdf23b99b7895e347c29057c8070a6e16e56beb assets/create/models/item/limestone_cob
8cd46904fd9709377d514e0faf9150ca317f6a9f assets/create/models/item/limestone_cobblestone_wall.json
8065de871ad2fbaed711735561b8ed91a2ce0004 assets/create/models/item/limestone_pillar.json
d245aa4994ff197b1ffeb7980d05f96bd20cdeb3 assets/create/models/item/linear_chassis.json
eb0053df13e362e0a05be65252944f0c94eab3db assets/create/models/item/linked_extractor.json
0242f25a8eb02b25f8b03344a1dfaf9ad0ab192c assets/create/models/item/linked_transposer.json
d912be3e87f2beaa8e22747f867739139667241b assets/create/models/item/magenta_seat.json
932facf4bf93b471e8630f4132a4284a9f4d0d39 assets/create/models/item/mechanical_arm.json
49dcc373c33f6fc3760add10eb51bd96cd4fd028 assets/create/models/item/mechanical_bearing.json
@ -1274,7 +1254,6 @@ e34c7bbdd4fcaa3a73c61584418bb159db49758b assets/create/models/item/overgrown_gra
e73e4be7e7eafdf9635a3d72eb7fa05c2bc1e54b assets/create/models/item/overgrown_limestone.json
a64a649428a2e130059f3f1f8de81b907621589f assets/create/models/item/overgrown_scoria.json
3354b93677c87bfc82807503c8d658fc6ab114e2 assets/create/models/item/overgrown_weathered_limestone.json
15baa926f7208040c437c920ae0c159a06057073 assets/create/models/item/packager.json
014530344c8b7e53531e3c09095b6ed4839d5ab8 assets/create/models/item/paved_andesite.json
bd81aa53b83c2f9683c024989d0305807cf28f5a assets/create/models/item/paved_andesite_slab.json
c61f409eb1a24cf76017b677579cb0423a1951c6 assets/create/models/item/paved_andesite_stairs.json
@ -1386,7 +1365,6 @@ bab8f78c319b2a79ed55c5d2a94b521ddaa44996 assets/create/models/item/stressometer.
29d571a061e3addf92ee51bfc55d96edc3a517a5 assets/create/models/item/super_glue.json
b1d3d00ff05908feacad06a86800da96cc9bc65d assets/create/models/item/tiled_glass.json
8a2a81a8cbc52b6021e57107d79a32f73b82d8fe assets/create/models/item/tiled_glass_pane.json
a9f6592275a4c8592e3c88a95fbe88bd93de67c6 assets/create/models/item/transposer.json
c081317f106a2b04700aafde12c57445844c20ab assets/create/models/item/tree_fertilizer.json
fb24881c4e92bbb7ffa54a71e0af6b1c66d84829 assets/create/models/item/turntable.json
32f49b724af10c8d7e2ed5a3c82280e83b75f789 assets/create/models/item/vertical_framed_glass.json
@ -2018,7 +1996,6 @@ b67ea51eaed1e847317829636cbf5967522e73d1 data/create/loot_tables/blocks/andesite
0ba4528089294c5229e1904dc3191f604138cf8e data/create/loot_tables/blocks/andesite_bricks_stairs.json
db2d27969cb53d9489e7c7e4bf60864fa89b29f4 data/create/loot_tables/blocks/andesite_bricks_wall.json
cb36b039a511aca643fe674a63de8d6ad8478256 data/create/loot_tables/blocks/andesite_casing.json
d3202a337c15c8b8ec41fa5879bb94327bb75057 data/create/loot_tables/blocks/andesite_chute_funnel.json
906155b0d00438e695d34dd14b374d94e691460d data/create/loot_tables/blocks/andesite_cobblestone.json
6d2f1bd619b131803d5bc9e393a2c67e03c39ff6 data/create/loot_tables/blocks/andesite_cobblestone_slab.json
6b5393dab7d443da6d54debccbc8b060c6c9bdc7 data/create/loot_tables/blocks/andesite_cobblestone_stairs.json
@ -2037,7 +2014,6 @@ a2313c9b7d114396fca3c86a740d23fce3873679 data/create/loot_tables/blocks/blaze_bu
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_chute_funnel.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
@ -2100,7 +2076,6 @@ d5fc5b3dc612cd748117e9d8b0ecda76e73f4514 data/create/loot_tables/blocks/dolomite
9055d82b983b673e1638d17b712b9fcd1f5a52e6 data/create/loot_tables/blocks/encased_fan.json
c8aa9bbed8fd703eb1853de0b7c9e04dffb7a511 data/create/loot_tables/blocks/encased_fluid_pipe.json
b127cb6920e6d7d9c8b2402cb186402a9a8dd3fc data/create/loot_tables/blocks/encased_shaft.json
5a47c1535c866184b4ffca65763f5676f319e0aa data/create/loot_tables/blocks/extractor.json
ddfc4764a6039d771e03af815ac4493da80d2e6b data/create/loot_tables/blocks/fancy_andesite_bricks.json
31f2e6932505c68b28e92221a37144f69161c376 data/create/loot_tables/blocks/fancy_andesite_bricks_slab.json
413c8bb80954679796cd9d18f808c28a7bdbe681 data/create/loot_tables/blocks/fancy_andesite_bricks_stairs.json
@ -2197,8 +2172,6 @@ cb315814960850b5080598b89ee94c833b5048f7 data/create/loot_tables/blocks/limeston
92fb16606f289ad33860270d098fad2522b24e09 data/create/loot_tables/blocks/limestone_cobblestone_wall.json
371115e5ceb08c07a9ab2371509960c31e0baa8a data/create/loot_tables/blocks/limestone_pillar.json
aa751d2e8a7889907c08c4bec6f6ca266230b6d7 data/create/loot_tables/blocks/linear_chassis.json
dac789cf53b00eed34308848b5e267b7ccec090c data/create/loot_tables/blocks/linked_extractor.json
7af5a13c9e10903b11732fbc01ae3299328216f0 data/create/loot_tables/blocks/linked_transposer.json
9e5e017cd3b4f544f487a5ca22ef610a4addc8ec data/create/loot_tables/blocks/magenta_seat.json
e64c32da44b7e92dbef36fcb448c42b9bd9ae47c data/create/loot_tables/blocks/mechanical_arm.json
90ddf7b5c3b61758a4ad12a1e6ef16fe6ebf7794 data/create/loot_tables/blocks/mechanical_bearing.json
@ -2241,7 +2214,6 @@ bab9f6fb35f2ba4aa45fd726a8e94f90ef155bfb data/create/loot_tables/blocks/overgrow
4b4acf9026d68de21b5804903556a505f913a778 data/create/loot_tables/blocks/overgrown_limestone.json
e0fc59a8645dae8f87e62b34c08014077e14de66 data/create/loot_tables/blocks/overgrown_scoria.json
8af10a6b2d07ed1b84ce617502ad68044262e701 data/create/loot_tables/blocks/overgrown_weathered_limestone.json
131cb27de9d0b44d2ec335055558b8039d6d5fb9 data/create/loot_tables/blocks/packager.json
fc529ec8d55abf361ba1b8c38875839530b082c6 data/create/loot_tables/blocks/paved_andesite.json
3658337cb8a5a6cdd7dd19dd8ac399b1397350d5 data/create/loot_tables/blocks/paved_andesite_slab.json
4dbc7c7537e680e4e7c8a5ba4e4ed394d788b10d data/create/loot_tables/blocks/paved_andesite_stairs.json
@ -2344,14 +2316,9 @@ ec2889e712702644092197a4b41a682fb953817d data/create/loot_tables/blocks/stockpil
3479775008a256bc35f98b31655975f7d5c836b2 data/create/loot_tables/blocks/stressometer.json
05e843ca6eb5e299bf41de123977a1045c120ad4 data/create/loot_tables/blocks/tiled_glass.json
e999969f05d2625e61757aa82092d232b99f6e0a data/create/loot_tables/blocks/tiled_glass_pane.json
b201436ae6d2ad5a7d47dca0ee8c7016b4c28fa5 data/create/loot_tables/blocks/transposer.json
7b66ad2c48449bafd0cdbd086ac41218cb73a814 data/create/loot_tables/blocks/turntable.json
5a47c1535c866184b4ffca65763f5676f319e0aa data/create/loot_tables/blocks/vertical_extractor.json
028e293b5cd694017962f67dc80dba719f904e28 data/create/loot_tables/blocks/vertical_framed_glass.json
d0156602dd5f4a274c293df67e19374820c72890 data/create/loot_tables/blocks/vertical_framed_glass_pane.json
dac789cf53b00eed34308848b5e267b7ccec090c data/create/loot_tables/blocks/vertical_linked_extractor.json
7af5a13c9e10903b11732fbc01ae3299328216f0 data/create/loot_tables/blocks/vertical_linked_transposer.json
b201436ae6d2ad5a7d47dca0ee8c7016b4c28fa5 data/create/loot_tables/blocks/vertical_transposer.json
2883c63ceb1273009dbf91cb0693756cadf79a1a data/create/loot_tables/blocks/water_wheel.json
611d6195db52c074de484ec52d7ac9eb96b4ff10 data/create/loot_tables/blocks/weathered_limestone.json
c1f379baad36a20fc767be094db10480a0378184 data/create/loot_tables/blocks/weathered_limestone_bricks.json
@ -3064,7 +3031,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
4ace4302e3f0ee8ca063c150a046deab06c52710 data/create/tags/blocks/brittle.json
10bed57f3eb989a643eb3609f177e30536f07965 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

View file

@ -1,34 +0,0 @@
{
"variants": {
"facing=north,pushing=false": {
"model": "create:block/andesite_chute_funnel_pull"
},
"facing=south,pushing=false": {
"model": "create:block/andesite_chute_funnel_pull",
"y": 180
},
"facing=west,pushing=false": {
"model": "create:block/andesite_chute_funnel_pull",
"y": 270
},
"facing=east,pushing=false": {
"model": "create:block/andesite_chute_funnel_pull",
"y": 90
},
"facing=north,pushing=true": {
"model": "create:block/andesite_chute_funnel_push"
},
"facing=south,pushing=true": {
"model": "create:block/andesite_chute_funnel_push",
"y": 180
},
"facing=west,pushing=true": {
"model": "create:block/andesite_chute_funnel_push",
"y": 270
},
"facing=east,pushing=true": {
"model": "create:block/andesite_chute_funnel_push",
"y": 90
}
}
}

View file

@ -1,64 +0,0 @@
{
"variants": {
"facing=north,powered=false,pushing=false": {
"model": "create:block/brass_chute_funnel_pull"
},
"facing=south,powered=false,pushing=false": {
"model": "create:block/brass_chute_funnel_pull",
"y": 180
},
"facing=west,powered=false,pushing=false": {
"model": "create:block/brass_chute_funnel_pull",
"y": 270
},
"facing=east,powered=false,pushing=false": {
"model": "create:block/brass_chute_funnel_pull",
"y": 90
},
"facing=north,powered=true,pushing=false": {
"model": "create:block/brass_chute_funnel_pull_powered"
},
"facing=south,powered=true,pushing=false": {
"model": "create:block/brass_chute_funnel_pull_powered",
"y": 180
},
"facing=west,powered=true,pushing=false": {
"model": "create:block/brass_chute_funnel_pull_powered",
"y": 270
},
"facing=east,powered=true,pushing=false": {
"model": "create:block/brass_chute_funnel_pull_powered",
"y": 90
},
"facing=north,powered=false,pushing=true": {
"model": "create:block/brass_chute_funnel_push"
},
"facing=south,powered=false,pushing=true": {
"model": "create:block/brass_chute_funnel_push",
"y": 180
},
"facing=west,powered=false,pushing=true": {
"model": "create:block/brass_chute_funnel_push",
"y": 270
},
"facing=east,powered=false,pushing=true": {
"model": "create:block/brass_chute_funnel_push",
"y": 90
},
"facing=north,powered=true,pushing=true": {
"model": "create:block/brass_chute_funnel_push_powered"
},
"facing=south,powered=true,pushing=true": {
"model": "create:block/brass_chute_funnel_push_powered",
"y": 180
},
"facing=west,powered=true,pushing=true": {
"model": "create:block/brass_chute_funnel_push_powered",
"y": 270
},
"facing=east,powered=true,pushing=true": {
"model": "create:block/brass_chute_funnel_push_powered",
"y": 90
}
}
}

View file

@ -1,34 +0,0 @@
{
"variants": {
"facing=north,powered=false": {
"model": "create:block/extractor/horizontal"
},
"facing=south,powered=false": {
"model": "create:block/extractor/horizontal",
"y": 180
},
"facing=west,powered=false": {
"model": "create:block/extractor/horizontal",
"y": 270
},
"facing=east,powered=false": {
"model": "create:block/extractor/horizontal",
"y": 90
},
"facing=north,powered=true": {
"model": "create:block/extractor/horizontal_powered"
},
"facing=south,powered=true": {
"model": "create:block/extractor/horizontal_powered",
"y": 180
},
"facing=west,powered=true": {
"model": "create:block/extractor/horizontal_powered",
"y": 270
},
"facing=east,powered=true": {
"model": "create:block/extractor/horizontal_powered",
"y": 90
}
}
}

View file

@ -1,34 +0,0 @@
{
"variants": {
"facing=north,powered=false": {
"model": "create:block/extractor/horizontal_linked"
},
"facing=south,powered=false": {
"model": "create:block/extractor/horizontal_linked",
"y": 180
},
"facing=west,powered=false": {
"model": "create:block/extractor/horizontal_linked",
"y": 270
},
"facing=east,powered=false": {
"model": "create:block/extractor/horizontal_linked",
"y": 90
},
"facing=north,powered=true": {
"model": "create:block/extractor/horizontal_linked_powered"
},
"facing=south,powered=true": {
"model": "create:block/extractor/horizontal_linked_powered",
"y": 180
},
"facing=west,powered=true": {
"model": "create:block/extractor/horizontal_linked_powered",
"y": 270
},
"facing=east,powered=true": {
"model": "create:block/extractor/horizontal_linked_powered",
"y": 90
}
}
}

View file

@ -1,34 +0,0 @@
{
"variants": {
"facing=north,powered=false": {
"model": "create:block/transposer/horizontal_linked"
},
"facing=south,powered=false": {
"model": "create:block/transposer/horizontal_linked",
"y": 180
},
"facing=west,powered=false": {
"model": "create:block/transposer/horizontal_linked",
"y": 270
},
"facing=east,powered=false": {
"model": "create:block/transposer/horizontal_linked",
"y": 90
},
"facing=north,powered=true": {
"model": "create:block/transposer/horizontal_linked_powered"
},
"facing=south,powered=true": {
"model": "create:block/transposer/horizontal_linked_powered",
"y": 180
},
"facing=west,powered=true": {
"model": "create:block/transposer/horizontal_linked_powered",
"y": 270
},
"facing=east,powered=true": {
"model": "create:block/transposer/horizontal_linked_powered",
"y": 90
}
}
}

View file

@ -1,11 +0,0 @@
{
"variants": {
"axis=x": {
"model": "create:block/packager/block",
"y": 90
},
"axis=z": {
"model": "create:block/packager/block"
}
}
}

View file

@ -1,34 +0,0 @@
{
"variants": {
"facing=north,powered=false": {
"model": "create:block/transposer/block"
},
"facing=south,powered=false": {
"model": "create:block/transposer/block",
"y": 180
},
"facing=west,powered=false": {
"model": "create:block/transposer/block",
"y": 270
},
"facing=east,powered=false": {
"model": "create:block/transposer/block",
"y": 90
},
"facing=north,powered=true": {
"model": "create:block/transposer/block_powered"
},
"facing=south,powered=true": {
"model": "create:block/transposer/block_powered",
"y": 180
},
"facing=west,powered=true": {
"model": "create:block/transposer/block_powered",
"y": 270
},
"facing=east,powered=true": {
"model": "create:block/transposer/block_powered",
"y": 90
}
}
}

View file

@ -1,72 +0,0 @@
{
"variants": {
"facing=north,powered=false,upward=false": {
"model": "create:block/extractor/vertical"
},
"facing=south,powered=false,upward=false": {
"model": "create:block/extractor/vertical",
"y": 180
},
"facing=west,powered=false,upward=false": {
"model": "create:block/extractor/vertical",
"y": 270
},
"facing=east,powered=false,upward=false": {
"model": "create:block/extractor/vertical",
"y": 90
},
"facing=north,powered=true,upward=false": {
"model": "create:block/extractor/vertical_powered"
},
"facing=south,powered=true,upward=false": {
"model": "create:block/extractor/vertical_powered",
"y": 180
},
"facing=west,powered=true,upward=false": {
"model": "create:block/extractor/vertical_powered",
"y": 270
},
"facing=east,powered=true,upward=false": {
"model": "create:block/extractor/vertical_powered",
"y": 90
},
"facing=north,powered=false,upward=true": {
"model": "create:block/extractor/vertical",
"x": 180,
"y": 180
},
"facing=south,powered=false,upward=true": {
"model": "create:block/extractor/vertical",
"x": 180
},
"facing=west,powered=false,upward=true": {
"model": "create:block/extractor/vertical",
"x": 180,
"y": 90
},
"facing=east,powered=false,upward=true": {
"model": "create:block/extractor/vertical",
"x": 180,
"y": 270
},
"facing=north,powered=true,upward=true": {
"model": "create:block/extractor/vertical_powered",
"x": 180,
"y": 180
},
"facing=south,powered=true,upward=true": {
"model": "create:block/extractor/vertical_powered",
"x": 180
},
"facing=west,powered=true,upward=true": {
"model": "create:block/extractor/vertical_powered",
"x": 180,
"y": 90
},
"facing=east,powered=true,upward=true": {
"model": "create:block/extractor/vertical_powered",
"x": 180,
"y": 270
}
}
}

View file

@ -1,72 +0,0 @@
{
"variants": {
"facing=north,powered=false,upward=false": {
"model": "create:block/extractor/vertical_linked"
},
"facing=south,powered=false,upward=false": {
"model": "create:block/extractor/vertical_linked",
"y": 180
},
"facing=west,powered=false,upward=false": {
"model": "create:block/extractor/vertical_linked",
"y": 270
},
"facing=east,powered=false,upward=false": {
"model": "create:block/extractor/vertical_linked",
"y": 90
},
"facing=north,powered=true,upward=false": {
"model": "create:block/extractor/vertical_linked_powered"
},
"facing=south,powered=true,upward=false": {
"model": "create:block/extractor/vertical_linked_powered",
"y": 180
},
"facing=west,powered=true,upward=false": {
"model": "create:block/extractor/vertical_linked_powered",
"y": 270
},
"facing=east,powered=true,upward=false": {
"model": "create:block/extractor/vertical_linked_powered",
"y": 90
},
"facing=north,powered=false,upward=true": {
"model": "create:block/extractor/vertical_linked",
"x": 180,
"y": 180
},
"facing=south,powered=false,upward=true": {
"model": "create:block/extractor/vertical_linked",
"x": 180
},
"facing=west,powered=false,upward=true": {
"model": "create:block/extractor/vertical_linked",
"x": 180,
"y": 90
},
"facing=east,powered=false,upward=true": {
"model": "create:block/extractor/vertical_linked",
"x": 180,
"y": 270
},
"facing=north,powered=true,upward=true": {
"model": "create:block/extractor/vertical_linked_powered",
"x": 180,
"y": 180
},
"facing=south,powered=true,upward=true": {
"model": "create:block/extractor/vertical_linked_powered",
"x": 180
},
"facing=west,powered=true,upward=true": {
"model": "create:block/extractor/vertical_linked_powered",
"x": 180,
"y": 90
},
"facing=east,powered=true,upward=true": {
"model": "create:block/extractor/vertical_linked_powered",
"x": 180,
"y": 270
}
}
}

View file

@ -1,80 +0,0 @@
{
"variants": {
"facing=north,powered=false,upward=false": {
"model": "create:block/transposer/vertical_linked",
"x": 90,
"y": 180
},
"facing=south,powered=false,upward=false": {
"model": "create:block/transposer/vertical_linked",
"x": 90
},
"facing=west,powered=false,upward=false": {
"model": "create:block/transposer/vertical_linked",
"x": 90,
"y": 90
},
"facing=east,powered=false,upward=false": {
"model": "create:block/transposer/vertical_linked",
"x": 90,
"y": 270
},
"facing=north,powered=true,upward=false": {
"model": "create:block/transposer/vertical_linked_powered",
"x": 90,
"y": 180
},
"facing=south,powered=true,upward=false": {
"model": "create:block/transposer/vertical_linked_powered",
"x": 90
},
"facing=west,powered=true,upward=false": {
"model": "create:block/transposer/vertical_linked_powered",
"x": 90,
"y": 90
},
"facing=east,powered=true,upward=false": {
"model": "create:block/transposer/vertical_linked_powered",
"x": 90,
"y": 270
},
"facing=north,powered=false,upward=true": {
"model": "create:block/transposer/vertical_linked",
"x": 270
},
"facing=south,powered=false,upward=true": {
"model": "create:block/transposer/vertical_linked",
"x": 270,
"y": 180
},
"facing=west,powered=false,upward=true": {
"model": "create:block/transposer/vertical_linked",
"x": 270,
"y": 270
},
"facing=east,powered=false,upward=true": {
"model": "create:block/transposer/vertical_linked",
"x": 270,
"y": 90
},
"facing=north,powered=true,upward=true": {
"model": "create:block/transposer/vertical_linked_powered",
"x": 270
},
"facing=south,powered=true,upward=true": {
"model": "create:block/transposer/vertical_linked_powered",
"x": 270,
"y": 180
},
"facing=west,powered=true,upward=true": {
"model": "create:block/transposer/vertical_linked_powered",
"x": 270,
"y": 270
},
"facing=east,powered=true,upward=true": {
"model": "create:block/transposer/vertical_linked_powered",
"x": 270,
"y": 90
}
}
}

View file

@ -1,80 +0,0 @@
{
"variants": {
"facing=north,powered=false,upward=false": {
"model": "create:block/transposer/block",
"x": 90,
"y": 180
},
"facing=south,powered=false,upward=false": {
"model": "create:block/transposer/block",
"x": 90
},
"facing=west,powered=false,upward=false": {
"model": "create:block/transposer/block",
"x": 90,
"y": 90
},
"facing=east,powered=false,upward=false": {
"model": "create:block/transposer/block",
"x": 90,
"y": 270
},
"facing=north,powered=true,upward=false": {
"model": "create:block/transposer/block_powered",
"x": 90,
"y": 180
},
"facing=south,powered=true,upward=false": {
"model": "create:block/transposer/block_powered",
"x": 90
},
"facing=west,powered=true,upward=false": {
"model": "create:block/transposer/block_powered",
"x": 90,
"y": 90
},
"facing=east,powered=true,upward=false": {
"model": "create:block/transposer/block_powered",
"x": 90,
"y": 270
},
"facing=north,powered=false,upward=true": {
"model": "create:block/transposer/block",
"x": 270
},
"facing=south,powered=false,upward=true": {
"model": "create:block/transposer/block",
"x": 270,
"y": 180
},
"facing=west,powered=false,upward=true": {
"model": "create:block/transposer/block",
"x": 270,
"y": 270
},
"facing=east,powered=false,upward=true": {
"model": "create:block/transposer/block",
"x": 270,
"y": 90
},
"facing=north,powered=true,upward=true": {
"model": "create:block/transposer/block_powered",
"x": 270
},
"facing=south,powered=true,upward=true": {
"model": "create:block/transposer/block_powered",
"x": 270,
"y": 180
},
"facing=west,powered=true,upward=true": {
"model": "create:block/transposer/block_powered",
"x": 270,
"y": 270
},
"facing=east,powered=true,upward=true": {
"model": "create:block/transposer/block_powered",
"x": 270,
"y": 90
}
}
}

View file

@ -12,7 +12,6 @@
"block.create.andesite_bricks_stairs": "s\u0279\u0131\u0250\u0287S s\u029E\u0254\u0131\u0279\u15FA \u01DD\u0287\u0131s\u01DDpu\u2C6F",
"block.create.andesite_bricks_wall": "\u05DF\u05DF\u0250M s\u029E\u0254\u0131\u0279\u15FA \u01DD\u0287\u0131s\u01DDpu\u2C6F",
"block.create.andesite_casing": "bu\u0131s\u0250\u0186 \u01DD\u0287\u0131s\u01DDpu\u2C6F",
"block.create.andesite_chute_funnel": "\u05DF\u01DDuun\u2132 \u01DD\u0287n\u0265\u0186 \u01DD\u0287\u0131s\u01DDpu\u2C6F",
"block.create.andesite_cobblestone": "\u01DDuo\u0287s\u01DD\u05DFqqo\u0186 \u01DD\u0287\u0131s\u01DDpu\u2C6F",
"block.create.andesite_cobblestone_slab": "q\u0250\u05DFS \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 \u01DD\u0287\u0131s\u01DDpu\u2C6F",
"block.create.andesite_cobblestone_stairs": "s\u0279\u0131\u0250\u0287S \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 \u01DD\u0287\u0131s\u01DDpu\u2C6F",
@ -31,7 +30,6 @@
"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_chute_funnel": "\u05DF\u01DDuun\u2132 \u01DD\u0287n\u0265\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",
@ -94,7 +92,6 @@
"block.create.encased_fan": "u\u0250\u2132 p\u01DDs\u0250\u0254u\u018E",
"block.create.encased_fluid_pipe": "\u01DDd\u0131\u0500 p\u0131n\u05DF\u2132 p\u01DDs\u0250\u0254u\u018E",
"block.create.encased_shaft": "\u0287\u025F\u0250\u0265S p\u01DDs\u0250\u0254u\u018E",
"block.create.extractor": "\u0279o\u0287\u0254\u0250\u0279\u0287x\u018E",
"block.create.fancy_andesite_bricks": "s\u029E\u0254\u0131\u0279\u15FA \u01DD\u0287\u0131s\u01DDpu\u2C6F \u028E\u0254u\u0250\u2132",
"block.create.fancy_andesite_bricks_slab": "q\u0250\u05DFS s\u029E\u0254\u0131\u0279\u15FA \u01DD\u0287\u0131s\u01DDpu\u2C6F \u028E\u0254u\u0250\u2132",
"block.create.fancy_andesite_bricks_stairs": "s\u0279\u0131\u0250\u0287S s\u029E\u0254\u0131\u0279\u15FA \u01DD\u0287\u0131s\u01DDpu\u2C6F \u028E\u0254u\u0250\u2132",
@ -191,8 +188,6 @@
"block.create.limestone_cobblestone_wall": "\u05DF\u05DF\u0250M \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 \u01DDuo\u0287s\u01DD\u026F\u0131\uA780",
"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.linked_extractor": "\u0279o\u0287\u0254\u0250\u0279\u0287x\u018E p\u01DD\u029Eu\u0131\uA780",
"block.create.linked_transposer": "\u0279\u01DDsodsu\u0250\u0279\u27D8 p\u01DD\u029Eu\u0131\uA780",
"block.create.magenta_seat": "\u0287\u0250\u01DDS \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",
@ -235,7 +230,6 @@
"block.create.overgrown_limestone": "\u01DDuo\u0287s\u01DD\u026F\u0131\uA780 u\u028Do\u0279b\u0279\u01DD\u028CO",
"block.create.overgrown_scoria": "\u0250\u0131\u0279o\u0254S u\u028Do\u0279b\u0279\u01DD\u028CO",
"block.create.overgrown_weathered_limestone": "\u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM u\u028Do\u0279b\u0279\u01DD\u028CO",
"block.create.packager": "\u0279\u01DDb\u0250\u029E\u0254\u0250\u0500",
"block.create.paved_andesite": "\u01DD\u0287\u0131s\u01DDpu\u2C6F p\u01DD\u028C\u0250\u0500",
"block.create.paved_andesite_slab": "q\u0250\u05DFS \u01DD\u0287\u0131s\u01DDpu\u2C6F p\u01DD\u028C\u0250\u0500",
"block.create.paved_andesite_stairs": "s\u0279\u0131\u0250\u0287S \u01DD\u0287\u0131s\u01DDpu\u2C6F p\u01DD\u028C\u0250\u0500",
@ -338,14 +332,9 @@
"block.create.stressometer": "\u0279\u01DD\u0287\u01DD\u026Foss\u01DD\u0279\u0287S",
"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.transposer": "\u0279\u01DDsodsu\u0250\u0279\u27D8",
"block.create.turntable": "\u01DD\u05DFq\u0250\u0287u\u0279n\u27D8",
"block.create.vertical_extractor": "\u0279o\u0287\u0254\u0250\u0279\u0287x\u018E \u05DF\u0250\u0254\u0131\u0287\u0279\u01DD\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.vertical_linked_extractor": "\u0279o\u0287\u0254\u0250\u0279\u0287x\u018E p\u01DD\u029Eu\u0131\uA780 \u05DF\u0250\u0254\u0131\u0287\u0279\u01DD\u039B",
"block.create.vertical_linked_transposer": "\u0279\u01DDsodsu\u0250\u0279\u27D8 p\u01DD\u029Eu\u0131\uA780 \u05DF\u0250\u0254\u0131\u0287\u0279\u01DD\u039B",
"block.create.vertical_transposer": "\u0279\u01DDsodsu\u0250\u0279\u27D8 \u05DF\u0250\u0254\u0131\u0287\u0279\u01DD\u039B",
"block.create.water_wheel": "\u05DF\u01DD\u01DD\u0265M \u0279\u01DD\u0287\u0250M",
"block.create.weathered_limestone": "\u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM",
"block.create.weathered_limestone_bricks": "s\u029E\u0254\u0131\u0279\u15FA \u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM",

View file

@ -15,7 +15,6 @@
"block.create.andesite_bricks_stairs": "Andesite Bricks Stairs",
"block.create.andesite_bricks_wall": "Andesite Bricks Wall",
"block.create.andesite_casing": "Andesite Casing",
"block.create.andesite_chute_funnel": "Andesite Chute Funnel",
"block.create.andesite_cobblestone": "Andesite Cobblestone",
"block.create.andesite_cobblestone_slab": "Andesite Cobblestone Slab",
"block.create.andesite_cobblestone_stairs": "Andesite Cobblestone Stairs",
@ -34,7 +33,6 @@
"block.create.brass_belt_funnel": "Brass Belt Funnel",
"block.create.brass_block": "Brass Block",
"block.create.brass_casing": "Brass Casing",
"block.create.brass_chute_funnel": "Brass Chute Funnel",
"block.create.brass_funnel": "Brass Funnel",
"block.create.brass_tunnel": "Brass Tunnel",
"block.create.brown_seat": "Brown Seat",
@ -97,7 +95,6 @@
"block.create.encased_fan": "Encased Fan",
"block.create.encased_fluid_pipe": "Encased Fluid Pipe",
"block.create.encased_shaft": "Encased Shaft",
"block.create.extractor": "Extractor",
"block.create.fancy_andesite_bricks": "Fancy Andesite Bricks",
"block.create.fancy_andesite_bricks_slab": "Fancy Andesite Bricks Slab",
"block.create.fancy_andesite_bricks_stairs": "Fancy Andesite Bricks Stairs",
@ -194,8 +191,6 @@
"block.create.limestone_cobblestone_wall": "Limestone Cobblestone Wall",
"block.create.limestone_pillar": "Limestone Pillar",
"block.create.linear_chassis": "Linear Chassis",
"block.create.linked_extractor": "Linked Extractor",
"block.create.linked_transposer": "Linked Transposer",
"block.create.magenta_seat": "Magenta Seat",
"block.create.mechanical_arm": "Mechanical Arm",
"block.create.mechanical_bearing": "Mechanical Bearing",
@ -238,7 +233,6 @@
"block.create.overgrown_limestone": "Overgrown Limestone",
"block.create.overgrown_scoria": "Overgrown Scoria",
"block.create.overgrown_weathered_limestone": "Overgrown Weathered Limestone",
"block.create.packager": "Packager",
"block.create.paved_andesite": "Paved Andesite",
"block.create.paved_andesite_slab": "Paved Andesite Slab",
"block.create.paved_andesite_stairs": "Paved Andesite Stairs",
@ -341,14 +335,9 @@
"block.create.stressometer": "Stressometer",
"block.create.tiled_glass": "Tiled Glass",
"block.create.tiled_glass_pane": "Tiled Glass Pane",
"block.create.transposer": "Transposer",
"block.create.turntable": "Turntable",
"block.create.vertical_extractor": "Vertical Extractor",
"block.create.vertical_framed_glass": "Vertical Framed Glass",
"block.create.vertical_framed_glass_pane": "Vertical Framed Glass Pane",
"block.create.vertical_linked_extractor": "Vertical Linked Extractor",
"block.create.vertical_linked_transposer": "Vertical Linked Transposer",
"block.create.vertical_transposer": "Vertical Transposer",
"block.create.water_wheel": "Water Wheel",
"block.create.weathered_limestone": "Weathered Limestone",
"block.create.weathered_limestone_bricks": "Weathered Limestone Bricks",
@ -1279,24 +1268,6 @@
"block.create.creative_crate.tooltip.condition1": "When Item in Filter Slot",
"block.create.creative_crate.tooltip.behaviour1": "Anything _extracting_ from this container will provide an _endless_ _supply_ of the item specified. Items _inserted_ into this crate will be _voided._",
"block.create.extractor.tooltip": "EXTRACTOR",
"block.create.extractor.tooltip.summary": "_Takes_ _Items_ from an attached _Inventory_ and drops them onto the ground. Will not drop Items unless the space is clear. Can be assigned an item-stack as a _filter_.",
"block.create.extractor.tooltip.condition1": "When Powered by Redstone",
"block.create.extractor.tooltip.behaviour1": "_Pauses_ the Extractor.",
"block.create.extractor.tooltip.condition2": "Active Belt pulling",
"block.create.extractor.tooltip.behaviour2": "Extractors can pull items _from_ _belts_ reinforced with _brass_ _casing_. When the extractor is blocked, the _belt_ _will_ _stall_.",
"block.create.extractor.tooltip.control1": "R-Click on Filter Space",
"block.create.extractor.tooltip.action1": "Assigns currently _held_ _stack_ as the _Filter_. The Extractor will pull the item _type_ and _count_ of the filter stack exclusively.",
"block.create.transposer.tooltip": "TRANSPOSER",
"block.create.transposer.tooltip.summary": "_Takes_ _items_ from an attached _Inventory_ and immediately puts them into the target _Inventory_. Can be assigned an item-stack as a _filter_.",
"block.create.transposer.tooltip.condition1": "When Powered by Redstone",
"block.create.transposer.tooltip.behaviour1": "_Pauses_ the Transposer.",
"block.create.transposer.tooltip.condition2": "Active Belt pulling",
"block.create.transposer.tooltip.behaviour2": "Transposers can pull items _from_ _belts_ reinforced with _brass_ _casing_. When the transposer is backed up, the _belt_ _will_ _stall_.",
"block.create.transposer.tooltip.control1": "R-Click on Filter Space",
"block.create.transposer.tooltip.action1": "Assigns currently _held_ _stack_ as the _Filter_. The Transposer will pull the item _type_ and _count_ of the filter stack exclusively.",
"block.create.deployer.tooltip": "DEPLOYER",
"block.create.deployer.tooltip.summary": "_Punches_, _Uses_, and _Activates_. This machine will try to _imitate_ a _player_ as a much as possible. Can _Take_ and _Deposit_ _items_ in adjacent _Inventory_. Can be assigned an item-stack as a _filter_.",
"block.create.deployer.tooltip.condition1": "When Rotated",
@ -1304,24 +1275,6 @@
"block.create.deployer.tooltip.condition2": "R-Clicked with Wrench",
"block.create.deployer.tooltip.behaviour2": "Toggles punch mode. In _punch_ _mode_, the Deployer will attempt to use its item to _break_ _blocks_ or _hurt_ _entities_.",
"block.create.linked_extractor.tooltip": "LINKED EXTRACTOR",
"block.create.linked_extractor.tooltip.summary": "_Takes_ _items_ from an attached _Inventory_ and drops them onto the ground. Will not drop Items unless the space is clear. Can be assigned an item-stack as a _filter_. Can be controlled remotely via a _Redstone_ _Link_.",
"block.create.linked_extractor.tooltip.condition1": "When Redstone Link Active",
"block.create.linked_extractor.tooltip.behaviour1": "_Pauses_ the Extractor.",
"block.create.linked_extractor.tooltip.control1": "R-Click on Filter Space",
"block.create.linked_extractor.tooltip.action1": "Assigns currently _held_ _stack_ as the _Filter_. The Extractor will pull the item _type_ and _count_ of the filter stack exclusively.",
"block.create.linked_extractor.tooltip.control2": "R-Click on Frequency Space",
"block.create.linked_extractor.tooltip.action2": "Assigns currently _held_ _item_ as part of the Frequency listened on. Whenever a transmitting _Redstone_ _Link_ of the same frequency is powered, this Extractor will pause.",
"block.create.linked_transposer.tooltip": "LINKED TRANSPOSER",
"block.create.linked_transposer.tooltip.summary": "_Takes_ _items_ from an attached _Inventory_ and immediately puts them into the target _Inventory_. Can be assigned an item-stack as a _filter_. Can be controlled remotely via a _Redstone_ _Link_.",
"block.create.linked_transposer.tooltip.condition1": "When Redstone Link Active",
"block.create.linked_transposer.tooltip.behaviour1": "_Pauses_ the Transposer.",
"block.create.linked_transposer.tooltip.control1": "R-Click on Filter Space",
"block.create.linked_transposer.tooltip.action1": "Assigns currently _held_ _stack_ as the _Filter_. The Transposer will only pull items that match the item _type_ and _count_ of the filter stack.",
"block.create.linked_transposer.tooltip.control2": "R-Click on Frequency Space",
"block.create.linked_transposer.tooltip.action2": "Assigns the currently _held_ _item_ as part of the Frequency listened on. Whenever a transmitting _Redstone_ _Link_ of the same frequency is powered, this Transposer will pause.",
"block.create.funnel.tooltip": "FUNNEL",
"block.create.funnel.tooltip.summary": "_Collects_ _incoming_ _items_ and inserts them into the attached _Inventory_ if possible. Can collect items in the _world_ and items on a _belt_.",
"block.create.funnel.tooltip.condition1": "Passive Belt pulling",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 821",
"_": "Missing Localizations: 794",
"_": "->------------------------] Game Elements [------------------------<-",
@ -16,7 +16,6 @@
"block.create.andesite_bricks_stairs": "UNLOCALIZED: Andesite Bricks Stairs",
"block.create.andesite_bricks_wall": "UNLOCALIZED: Andesite Bricks Wall",
"block.create.andesite_casing": "UNLOCALIZED: Andesite Casing",
"block.create.andesite_chute_funnel": "UNLOCALIZED: Andesite Chute Funnel",
"block.create.andesite_cobblestone": "UNLOCALIZED: Andesite Cobblestone",
"block.create.andesite_cobblestone_slab": "UNLOCALIZED: Andesite Cobblestone Slab",
"block.create.andesite_cobblestone_stairs": "UNLOCALIZED: Andesite Cobblestone Stairs",
@ -35,7 +34,6 @@
"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_chute_funnel": "UNLOCALIZED: Brass Chute Funnel",
"block.create.brass_funnel": "UNLOCALIZED: Brass Funnel",
"block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel",
"block.create.brown_seat": "UNLOCALIZED: Brown Seat",
@ -98,7 +96,6 @@
"block.create.encased_fan": "Eingeschlossener Propeller",
"block.create.encased_fluid_pipe": "UNLOCALIZED: Encased Fluid Pipe",
"block.create.encased_shaft": "Eingeschlossene Welle",
"block.create.extractor": "Auswerfer",
"block.create.fancy_andesite_bricks": "UNLOCALIZED: Fancy Andesite Bricks",
"block.create.fancy_andesite_bricks_slab": "UNLOCALIZED: Fancy Andesite Bricks Slab",
"block.create.fancy_andesite_bricks_stairs": "UNLOCALIZED: Fancy Andesite Bricks Stairs",
@ -195,8 +192,6 @@
"block.create.limestone_cobblestone_wall": "UNLOCALIZED: Limestone Cobblestone Wall",
"block.create.limestone_pillar": "Kalksteinsäule",
"block.create.linear_chassis": "Schubgerüst",
"block.create.linked_extractor": "Verknüpfter Auswerfer",
"block.create.linked_transposer": "UNLOCALIZED: Linked Transposer",
"block.create.magenta_seat": "UNLOCALIZED: Magenta Seat",
"block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm",
"block.create.mechanical_bearing": "Mechanisches Lager",
@ -239,7 +234,6 @@
"block.create.overgrown_limestone": "UNLOCALIZED: Overgrown Limestone",
"block.create.overgrown_scoria": "UNLOCALIZED: Overgrown Scoria",
"block.create.overgrown_weathered_limestone": "UNLOCALIZED: Overgrown Weathered Limestone",
"block.create.packager": "UNLOCALIZED: Packager",
"block.create.paved_andesite": "UNLOCALIZED: Paved Andesite",
"block.create.paved_andesite_slab": "UNLOCALIZED: Paved Andesite Slab",
"block.create.paved_andesite_stairs": "UNLOCALIZED: Paved Andesite Stairs",
@ -342,14 +336,9 @@
"block.create.stressometer": "UNLOCALIZED: Stressometer",
"block.create.tiled_glass": "Glasfliesen",
"block.create.tiled_glass_pane": "Glasfliesenscheibe",
"block.create.transposer": "UNLOCALIZED: Transposer",
"block.create.turntable": "Drehtisch",
"block.create.vertical_extractor": "UNLOCALIZED: Vertical Extractor",
"block.create.vertical_framed_glass": "UNLOCALIZED: Vertical Framed Glass",
"block.create.vertical_framed_glass_pane": "UNLOCALIZED: Vertical Framed Glass Pane",
"block.create.vertical_linked_extractor": "UNLOCALIZED: Vertical Linked Extractor",
"block.create.vertical_linked_transposer": "UNLOCALIZED: Vertical Linked Transposer",
"block.create.vertical_transposer": "UNLOCALIZED: Vertical Transposer",
"block.create.water_wheel": "Wasserrad",
"block.create.weathered_limestone": "Verwitterter Kalkstein",
"block.create.weathered_limestone_bricks": "Verwitterte Kalksteinziegel",
@ -1280,24 +1269,6 @@
"block.create.creative_crate.tooltip.condition1": "UNLOCALIZED: When Item in Filter Slot",
"block.create.creative_crate.tooltip.behaviour1": "UNLOCALIZED: Anything _extracting_ from this container will provide an _endless_ _supply_ of the item specified. Items _inserted_ into this crate will be _voided._",
"block.create.extractor.tooltip": "AUSWERFER",
"block.create.extractor.tooltip.summary": "_Nimmt_ _Gegenstände_ von einem verbundenen _Behälter_ und wirft diese auf den Boden. Wird keine Gegenstände auswerfen, bis der Platz dafür frei ist. Kann einen Stack von Gegenständen als _Filter_ zugewiesen bekommen.",
"block.create.extractor.tooltip.condition1": "Wenn durch Redstone aktiviert",
"block.create.extractor.tooltip.behaviour1": "_Pausiert_ den Auswerfer",
"block.create.extractor.tooltip.condition2": "UNLOCALIZED: Active Belt pulling",
"block.create.extractor.tooltip.behaviour2": "UNLOCALIZED: Extractors can pull items _from_ _belts_ reinforced with _brass_ _casing_. When the extractor is blocked, the _belt_ _will_ _stall_.",
"block.create.extractor.tooltip.control1": "R-Klick auf Filterplatz",
"block.create.extractor.tooltip.action1": "Weist den momentan _gehaltenen_ _Stack_ als _Filter_ zu. Der Auswerfer zieht nur diesen _Gegenstandstyp_ und die _Anzahl_ des Stacks aus dem Behälter. ",
"block.create.transposer.tooltip": "UNLOCALIZED: TRANSPOSER",
"block.create.transposer.tooltip.summary": "UNLOCALIZED: _Takes_ _items_ from an attached _Inventory_ and immediately puts them into the target _Inventory_. Can be assigned an item-stack as a _filter_.",
"block.create.transposer.tooltip.condition1": "UNLOCALIZED: When Powered by Redstone",
"block.create.transposer.tooltip.behaviour1": "UNLOCALIZED: _Pauses_ the Transposer.",
"block.create.transposer.tooltip.condition2": "UNLOCALIZED: Active Belt pulling",
"block.create.transposer.tooltip.behaviour2": "UNLOCALIZED: Transposers can pull items _from_ _belts_ reinforced with _brass_ _casing_. When the transposer is backed up, the _belt_ _will_ _stall_.",
"block.create.transposer.tooltip.control1": "UNLOCALIZED: R-Click on Filter Space",
"block.create.transposer.tooltip.action1": "UNLOCALIZED: Assigns currently _held_ _stack_ as the _Filter_. The Transposer will pull the item _type_ and _count_ of the filter stack exclusively.",
"block.create.deployer.tooltip": "UNLOCALIZED: DEPLOYER",
"block.create.deployer.tooltip.summary": "UNLOCALIZED: _Punches_, _Uses_, and _Activates_. This machine will try to _imitate_ a _player_ as a much as possible. Can _Take_ and _Deposit_ _items_ in adjacent _Inventory_. Can be assigned an item-stack as a _filter_.",
"block.create.deployer.tooltip.condition1": "UNLOCALIZED: When Rotated",
@ -1305,24 +1276,6 @@
"block.create.deployer.tooltip.condition2": "UNLOCALIZED: R-Clicked with Wrench",
"block.create.deployer.tooltip.behaviour2": "UNLOCALIZED: Toggles punch mode. In _punch_ _mode_, the Deployer will attempt to use its item to _break_ _blocks_ or _hurt_ _entities_.",
"block.create.linked_extractor.tooltip": "VERKÜPFTER AUSWERFER",
"block.create.linked_extractor.tooltip.summary": "_Nimmt_ _Gegenstände_ von einem verbundenen _Behälter_ und wirft diese auf den Boden. Wird Gegenstände nicht auswerfen, bis der Platz frei ist. Kann einen Stack von Gegenständen zugewiesen bekommen. Kann aus Distanz mit einer _Redstone-Verbindung_ kontrolliert werden.",
"block.create.linked_extractor.tooltip.condition1": "Wenn die Restone-Verbindung aktiv ist",
"block.create.linked_extractor.tooltip.behaviour1": "Wird der Auswerfer _pausiert._",
"block.create.linked_extractor.tooltip.control1": "R-Klick auf den Filterplatz",
"block.create.linked_extractor.tooltip.action1": "Weist den momentan _gehaltenen_ _Stack_ als _Filter_ zu. Der Auswerfer zieht nur diesen _Gegenstandstyp_ und die _Anzahl_ des Stacks aus dem Behälter.",
"block.create.linked_extractor.tooltip.control2": "R-Klick auf den Frequenzplatz",
"block.create.linked_extractor.tooltip.action2": "Weist den momentan _gehaltenen_ _Gegenstand_ als Teil der gelisteten Frequenz zu. Wann auch immer eine übertragende _Redstone-Verbindung_ derselben Frequenz aktiv ist, pausiert dieser Auswerfer.",
"block.create.linked_transposer.tooltip": "UNLOCALIZED: LINKED TRANSPOSER",
"block.create.linked_transposer.tooltip.summary": "UNLOCALIZED: _Takes_ _items_ from an attached _Inventory_ and immediately puts them into the target _Inventory_. Can be assigned an item-stack as a _filter_. Can be controlled remotely via a _Redstone_ _Link_.",
"block.create.linked_transposer.tooltip.condition1": "UNLOCALIZED: When Redstone Link Active",
"block.create.linked_transposer.tooltip.behaviour1": "UNLOCALIZED: _Pauses_ the Transposer.",
"block.create.linked_transposer.tooltip.control1": "UNLOCALIZED: R-Click on Filter Space",
"block.create.linked_transposer.tooltip.action1": "UNLOCALIZED: Assigns currently _held_ _stack_ as the _Filter_. The Transposer will only pull items that match the item _type_ and _count_ of the filter stack.",
"block.create.linked_transposer.tooltip.control2": "UNLOCALIZED: R-Click on Frequency Space",
"block.create.linked_transposer.tooltip.action2": "UNLOCALIZED: Assigns the currently _held_ _item_ as part of the Frequency listened on. Whenever a transmitting _Redstone_ _Link_ of the same frequency is powered, this Transposer will pause.",
"block.create.funnel.tooltip": "FLIEẞBANDTRICHTER",
"block.create.funnel.tooltip.summary": "Sammelt eingehende Gegenstände auf einem _Mechanischen_ _Riemen_ und fügt diese in einen verbundenen _Behälter_ ein, wenn möglich. Muss direkt _auf_ dem Riemen sein, mit der Öffnung entgegen der Bewegungsrichtung des Riemens zeigend. Der Behälter muss auf der gleichen Höhe wie der Trichter sein.",
"block.create.funnel.tooltip.condition1": "UNLOCALIZED: Passive Belt pulling",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 425",
"_": "Missing Localizations: 418",
"_": "->------------------------] Game Elements [------------------------<-",
@ -16,7 +16,6 @@
"block.create.andesite_bricks_stairs": "UNLOCALIZED: Andesite Bricks Stairs",
"block.create.andesite_bricks_wall": "UNLOCALIZED: Andesite Bricks Wall",
"block.create.andesite_casing": "Boîtier en andésite",
"block.create.andesite_chute_funnel": "UNLOCALIZED: Andesite Chute Funnel",
"block.create.andesite_cobblestone": "UNLOCALIZED: Andesite Cobblestone",
"block.create.andesite_cobblestone_slab": "UNLOCALIZED: Andesite Cobblestone Slab",
"block.create.andesite_cobblestone_stairs": "UNLOCALIZED: Andesite Cobblestone Stairs",
@ -35,7 +34,6 @@
"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_chute_funnel": "UNLOCALIZED: Brass Chute Funnel",
"block.create.brass_funnel": "UNLOCALIZED: Brass Funnel",
"block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel",
"block.create.brown_seat": "UNLOCALIZED: Brown Seat",
@ -98,7 +96,6 @@
"block.create.encased_fan": "Ventilateur enfermé",
"block.create.encased_fluid_pipe": "UNLOCALIZED: Encased Fluid Pipe",
"block.create.encased_shaft": "Arbre mécanique enfermé",
"block.create.extractor": "Extracteur",
"block.create.fancy_andesite_bricks": "UNLOCALIZED: Fancy Andesite Bricks",
"block.create.fancy_andesite_bricks_slab": "UNLOCALIZED: Fancy Andesite Bricks Slab",
"block.create.fancy_andesite_bricks_stairs": "UNLOCALIZED: Fancy Andesite Bricks Stairs",
@ -195,8 +192,6 @@
"block.create.limestone_cobblestone_wall": "UNLOCALIZED: Limestone Cobblestone Wall",
"block.create.limestone_pillar": "Pillier de calcaire",
"block.create.linear_chassis": "Châssis linéaire",
"block.create.linked_extractor": "Extracteur lié",
"block.create.linked_transposer": "Transposeur lié",
"block.create.magenta_seat": "UNLOCALIZED: Magenta Seat",
"block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm",
"block.create.mechanical_bearing": "Roulement mécanique",
@ -239,7 +234,6 @@
"block.create.overgrown_limestone": "UNLOCALIZED: Overgrown Limestone",
"block.create.overgrown_scoria": "UNLOCALIZED: Overgrown Scoria",
"block.create.overgrown_weathered_limestone": "UNLOCALIZED: Overgrown Weathered Limestone",
"block.create.packager": "UNLOCALIZED: Packager",
"block.create.paved_andesite": "UNLOCALIZED: Paved Andesite",
"block.create.paved_andesite_slab": "UNLOCALIZED: Paved Andesite Slab",
"block.create.paved_andesite_stairs": "UNLOCALIZED: Paved Andesite Stairs",
@ -342,14 +336,9 @@
"block.create.stressometer": "Stressomètre",
"block.create.tiled_glass": "Verre carrelé",
"block.create.tiled_glass_pane": "Vitre carrelé",
"block.create.transposer": "Transposeur",
"block.create.turntable": "Plaque tournante",
"block.create.vertical_extractor": "UNLOCALIZED: Vertical Extractor",
"block.create.vertical_framed_glass": "Fenêtre en verre verticale",
"block.create.vertical_framed_glass_pane": "Vitre encadrée verticale",
"block.create.vertical_linked_extractor": "UNLOCALIZED: Vertical Linked Extractor",
"block.create.vertical_linked_transposer": "UNLOCALIZED: Vertical Linked Transposer",
"block.create.vertical_transposer": "UNLOCALIZED: Vertical Transposer",
"block.create.water_wheel": "Roue à eau",
"block.create.weathered_limestone": "Calcaire patinées",
"block.create.weathered_limestone_bricks": "Briques de calcaire patinées",
@ -1280,24 +1269,6 @@
"block.create.creative_crate.tooltip.condition1": "UNLOCALIZED: When Item in Filter Slot",
"block.create.creative_crate.tooltip.behaviour1": "UNLOCALIZED: Anything _extracting_ from this container will provide an _endless_ _supply_ of the item specified. Items _inserted_ into this crate will be _voided._",
"block.create.extractor.tooltip": "EXTRACTEUR",
"block.create.extractor.tooltip.summary": "_Prend_ des _objets_ d'un _inventaire_ attaché et les laisse tomber sur le sol. Ne laissera pas tomber les objets à moins que l'espace ne soit dégagé. Peut être affecté à une pile d'objets en tant que _filtre_.",
"block.create.extractor.tooltip.condition1": "Lorsqu'alimenté par de la redstone",
"block.create.extractor.tooltip.behaviour1": "Met l'extracteur en _pause_.",
"block.create.extractor.tooltip.condition2": "Tirage actif du tapis roulant",
"block.create.extractor.tooltip.behaviour2": "Les extracteurs peuvent extraire les objets _de_ _tapis_ renforcés de _boîtiers_ _en_ _laiton_. Lorsque l'extracteur est bloqué, le _tapis_ _roulant_ _va_ _caler_.",
"block.create.extractor.tooltip.control1": "Clic droit sur l'espace du filtre",
"block.create.extractor.tooltip.action1": "Assigne la _pile_ actuellement _tenue_ _en_ _main_ comme _filtre_. L'extracteur extrait exclusivement les _types_ et _comptes_ des objets de la pile du filtre.",
"block.create.transposer.tooltip": "TRANSPOSEUR",
"block.create.transposer.tooltip.summary": "_Prend_ les _objets_ d'un _inventaire_ attaché et les place immédiatement dans _l'inventaire_ cible. Peut être affecté à une pile d'objets en tant que _filtre_.",
"block.create.transposer.tooltip.condition1": "Lorsqu'alimenté par de la redstone",
"block.create.transposer.tooltip.behaviour1": "Met le transposeur en _pause_.",
"block.create.transposer.tooltip.condition2": "Tirage actif du tapis roulant",
"block.create.transposer.tooltip.behaviour2": "Les transposeurs peuvent extraire des éléments _de_ _tapis_ _roulants_ renforcés de _boîtiers_ _en_ _laiton_. Lorsque le transposeur est sauvegardé, le _tapis_ _roulant_ _va_ _caler_.",
"block.create.transposer.tooltip.control1": "Clic droit sur l'espace du filtre",
"block.create.transposer.tooltip.action1": "Assigne la _pile_ actuellement _tenue_ _en_ _main_ comme _filtre_. L'extracteur tire exclusivement les _types_ et _comptes_ des objets de la pile du filtre.",
"block.create.deployer.tooltip": "DÉPLOYEUR",
"block.create.deployer.tooltip.summary": "_Frappe_, _utilise_ et _active_. Cette machine essaiera _d'imiter_ un _joueur_ autant que possible. Peut _prendre_ et _déposer_ des _objets_ dans _l'inventaire_ adjacent. Peut être affecté à une pile d'éléments en tant que _filtre_.",
"block.create.deployer.tooltip.condition1": "Lorsque tourné",
@ -1305,24 +1276,6 @@
"block.create.deployer.tooltip.condition2": "Clic droit avec une clé",
"block.create.deployer.tooltip.behaviour2": "Bascule le mode frappe. Dans le _mode_ _frappe_, le déployeur tentera d'utiliser son élément pour _casser_ les _blocs_ ou infliger des _dégats_ aux _entités_.",
"block.create.linked_extractor.tooltip": "EXTRACTEUR LIÉ",
"block.create.linked_extractor.tooltip.summary": "_Prend_ les _objets_ d'un _inventaire_ attaché et les laisse tomber sur le sol. Ne laissera pas tomber les objets à moins que l'espace ne soit dégagé. Peut être assigné une pile d'éléments en tant que _filtre_. Peut être contrôlé à distance via une _liaison_ _redstone_.",
"block.create.linked_extractor.tooltip.condition1": "Lorsque la liaison redstone est active",
"block.create.linked_extractor.tooltip.behaviour1": "Met l'extracteur en _pause_.",
"block.create.linked_extractor.tooltip.control1": "Clic droit sur l'espace du filtre",
"block.create.linked_extractor.tooltip.action1": "Assigne la _pile_ actuellement _tenue_ _en_ _main_ comme _filtre_. L'extracteur extrait exclusivement les _types_ et _comptes_ des objets de la pile du filtre.",
"block.create.linked_extractor.tooltip.control2": "Clic droit sur l'espace des fréquences",
"block.create.linked_extractor.tooltip.action2": "Assigne la _pile_ actuellement _tenue_ _en_ _main_ dans le cadre de la fréquence écoutée. Chaque fois qu'une _liaison_ _redstone_ de la même fréquence est alimenté, cet extracteur s'arrête.",
"block.create.linked_transposer.tooltip": "TRANSPOSEUR LIÉ",
"block.create.linked_transposer.tooltip.summary": "_Prend_ les _objets_ d'un _inventaire_ attaché et les place immédiatement dans _l'inventaire_ cible. Peut être affecté à une pile d'objets en tant que _filtre_. Peut être contrôlé à distance via une _liaison_ _redstone_.",
"block.create.linked_transposer.tooltip.condition1": "Lorsque la liaison redstone est active",
"block.create.linked_transposer.tooltip.behaviour1": "Met le transposeur en _pause_.",
"block.create.linked_transposer.tooltip.control1": "Clic droit sur l'espace du filtre",
"block.create.linked_transposer.tooltip.action1": "Assigne la _pile_ actuellement _tenue_ _en_ _main_ comme _filtre_. L'extracteur tire exclusivement les _types_ et _comptes_ des objets de la pile du filtre.",
"block.create.linked_transposer.tooltip.control2": "Clic droit sur l'espace des fréquences",
"block.create.linked_transposer.tooltip.action2": "Assigne la _pile_ actuellement _tenue_ _en_ _main_ dans le cadre de la fréquence écoutée. Chaque fois qu'une _liaison_ _redstone_ de la même fréquence est alimenté, ce transposeur s'arrête.",
"block.create.funnel.tooltip": "ENTONNOIR AMÉLIORÉ",
"block.create.funnel.tooltip.summary": "_Collecte_ les _objets_ en _approche_ et les insère dans _l'inventaire_ attaché si possible. Peut collecter des objets dans le _monde_ et des objets sur un _tapis_ _roulant_.",
"block.create.funnel.tooltip.condition1": "Passage de tapis roulant passif",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 409",
"_": "Missing Localizations: 402",
"_": "->------------------------] Game Elements [------------------------<-",
@ -16,7 +16,6 @@
"block.create.andesite_bricks_stairs": "UNLOCALIZED: Andesite Bricks Stairs",
"block.create.andesite_bricks_wall": "UNLOCALIZED: Andesite Bricks Wall",
"block.create.andesite_casing": "Involucro di Andesite",
"block.create.andesite_chute_funnel": "UNLOCALIZED: Andesite Chute Funnel",
"block.create.andesite_cobblestone": "UNLOCALIZED: Andesite Cobblestone",
"block.create.andesite_cobblestone_slab": "UNLOCALIZED: Andesite Cobblestone Slab",
"block.create.andesite_cobblestone_stairs": "UNLOCALIZED: Andesite Cobblestone Stairs",
@ -35,7 +34,6 @@
"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_chute_funnel": "UNLOCALIZED: Brass Chute Funnel",
"block.create.brass_funnel": "UNLOCALIZED: Brass Funnel",
"block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel",
"block.create.brown_seat": "UNLOCALIZED: Brown Seat",
@ -98,7 +96,6 @@
"block.create.encased_fan": "Ventilatore incassato",
"block.create.encased_fluid_pipe": "UNLOCALIZED: Encased Fluid Pipe",
"block.create.encased_shaft": "Albero Incassato",
"block.create.extractor": "Estrattore",
"block.create.fancy_andesite_bricks": "UNLOCALIZED: Fancy Andesite Bricks",
"block.create.fancy_andesite_bricks_slab": "UNLOCALIZED: Fancy Andesite Bricks Slab",
"block.create.fancy_andesite_bricks_stairs": "UNLOCALIZED: Fancy Andesite Bricks Stairs",
@ -195,8 +192,6 @@
"block.create.limestone_cobblestone_wall": "UNLOCALIZED: Limestone Cobblestone Wall",
"block.create.limestone_pillar": "Pilastro di Calcare",
"block.create.linear_chassis": "Telaio Lineare",
"block.create.linked_extractor": "Estrattore Connesso",
"block.create.linked_transposer": "Traspositore Connesso",
"block.create.magenta_seat": "UNLOCALIZED: Magenta Seat",
"block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm",
"block.create.mechanical_bearing": "Supporto Meccanico",
@ -239,7 +234,6 @@
"block.create.overgrown_limestone": "UNLOCALIZED: Overgrown Limestone",
"block.create.overgrown_scoria": "UNLOCALIZED: Overgrown Scoria",
"block.create.overgrown_weathered_limestone": "UNLOCALIZED: Overgrown Weathered Limestone",
"block.create.packager": "UNLOCALIZED: Packager",
"block.create.paved_andesite": "UNLOCALIZED: Paved Andesite",
"block.create.paved_andesite_slab": "UNLOCALIZED: Paved Andesite Slab",
"block.create.paved_andesite_stairs": "UNLOCALIZED: Paved Andesite Stairs",
@ -342,14 +336,9 @@
"block.create.stressometer": "Stressometro",
"block.create.tiled_glass": "Vetro Piastrellato",
"block.create.tiled_glass_pane": "Pannello di Vetro Piastrellato",
"block.create.transposer": "Traspositore",
"block.create.turntable": "Piatto",
"block.create.vertical_extractor": "UNLOCALIZED: Vertical Extractor",
"block.create.vertical_framed_glass": "Finestra Verticale Vetro",
"block.create.vertical_framed_glass_pane": "Pannello di Finestra Verticale Vetro",
"block.create.vertical_linked_extractor": "UNLOCALIZED: Vertical Linked Extractor",
"block.create.vertical_linked_transposer": "UNLOCALIZED: Vertical Linked Transposer",
"block.create.vertical_transposer": "UNLOCALIZED: Vertical Transposer",
"block.create.water_wheel": "Ruota d'Acqua",
"block.create.weathered_limestone": "Calcare Consumato",
"block.create.weathered_limestone_bricks": "Mattoni di Calcare Consumato",
@ -1280,24 +1269,6 @@
"block.create.creative_crate.tooltip.condition1": "UNLOCALIZED: When Item in Filter Slot",
"block.create.creative_crate.tooltip.behaviour1": "UNLOCALIZED: Anything _extracting_ from this container will provide an _endless_ _supply_ of the item specified. Items _inserted_ into this crate will be _voided._",
"block.create.extractor.tooltip": "ESTRATTORE",
"block.create.extractor.tooltip.summary": "_Prende_ _Oggetti_ da un _Inventario _ allegato e li lascia cadere a terra. Non lascerà cadere gli oggetti a meno che lo spazio non sia libero. Può essere assegnata una pila di oggetti come _filtro_.",
"block.create.extractor.tooltip.condition1": "Quando alimentato da Redstone",
"block.create.extractor.tooltip.behaviour1": "_Ferma_ l'Estrattore.",
"block.create.extractor.tooltip.condition2": "Attiva Tiraggio del Nastro",
"block.create.extractor.tooltip.behaviour2": "Gli estrattori possono estrarre oggetti _da_ _nastri_ rinforzati con un _involucro_ _di_ _ottone_. Quando l'estrattore è bloccato, il _nastro_ _si_ _arresterà_.",
"block.create.extractor.tooltip.control1": "Clic-Destro sullo Spazio del Filtro",
"block.create.extractor.tooltip.action1": "Assegna la _pila_ attualmente _trattenuta_ come _Filtro_. L'estrattore estrarrà esclusivamente il _tipo_ di oggetto e il _conteggio_ della pila come filtro.",
"block.create.transposer.tooltip": "TRASPOSITORE",
"block.create.transposer.tooltip.summary": "_Prende_ _oggetti_ da un _inventario_ allegato e li inserisce immediatamente nell'_inventario_ di destinazione. Può essere assegnata una pila di oggetti come _filtro_.",
"block.create.transposer.tooltip.condition1": "Quando Alimentato da Redstone",
"block.create.transposer.tooltip.behaviour1": "_Ferma_ il Traspositore.",
"block.create.transposer.tooltip.condition2": "Attiva Tiraggio del Nastro",
"block.create.transposer.tooltip.behaviour2": "I Traspositori possono estrarre oggetti _dai_ _nastri_ rinforzati con un _involucro_ _di_ _ottone_. Quando viene eseguito il backup del traspositore, il _nastro_ _si_ _arresterà_.",
"block.create.transposer.tooltip.control1": "Clic-Destro sullo Spazio del Filtro",
"block.create.transposer.tooltip.action1": "Assegna la _pila_ attualmente _trattenuta_ come _Filtro_. L'estrattore estrarrà esclusivamente il _tipo_ di oggetto e il _conteggio_ della pila come filtro.",
"block.create.deployer.tooltip": "INSTALLATORE",
"block.create.deployer.tooltip.summary": "_Punzoni_, _Usi_ e _Attivazioni_. Questa macchina proverà a _imitare_ un _giocatore_ il più possibile. Può _Prendere_ e _depositare_ _oggetti_ nell'_Inventario_ adiacente. Può essere assegnata una pila di oggetti come _filtro_.",
"block.create.deployer.tooltip.condition1": "Quando Ruotato",
@ -1305,24 +1276,6 @@
"block.create.deployer.tooltip.condition2": "Clic-Destro con la Chiave Inglese",
"block.create.deployer.tooltip.behaviour2": "Attiva / disattiva la modalità di perforazione. In _modalità_ _pugno_, l'Installatore tenterà di usare il suo oggetto per _rompere_ _blocchi_ o _ferire_ _entità_.",
"block.create.linked_extractor.tooltip": "ESTRATTORE CONNESSO",
"block.create.linked_extractor.tooltip.summary": "_Prende_ _gli_ _oggetti_ da un _Inventario_ attaccato e li lascia cadere a terra. Non lascerà cadere gli oggetti a meno che lo spazio non sia libero. Può essere assegnata una pila di oggetti come _filtro_. Può essere controllato a distanza tramite un _Collegamento_ _Redstone_.",
"block.create.linked_extractor.tooltip.condition1": "Quando il Collegamento Redstone è attivo",
"block.create.linked_extractor.tooltip.behaviour1": "_Ferma_ l'Estrattore.",
"block.create.linked_extractor.tooltip.control1": "Clic-Destro sullo Spazio del Filtro",
"block.create.linked_extractor.tooltip.action1": "Assegna la _pila_ attualmente _trattenuta_ come _Filtro_. L'estrattore estrarrà esclusivamente il _tipo_ di oggetto e il _conteggio_ della pila come filtro.",
"block.create.linked_extractor.tooltip.control2": "Clic-Destro sullo Spazio di Frequenza",
"block.create.linked_extractor.tooltip.action2": "Assegna l'_oggetto_ attualmente _trattenuto_ come parte della Frequenza ascoltata. Ogni volta che viene alimentato un _Collegamento_ _Redstone_ della stessa frequenza di trasmissione, questo estrattore si mette in pausa.",
"block.create.linked_transposer.tooltip": "TRASPOSITORE CONNESSO",
"block.create.linked_transposer.tooltip.summary": "_Prende_ _oggetti_ da un _Inventario_ allegato e li inserisce immediatamente nell'_Inventario_ di destinazione. Può essere assegnata una pila di oggetti come _filtro_. Può essere controllato a distanza tramite un _Collegamento_ _Redstone_.",
"block.create.linked_transposer.tooltip.condition1": "Quando il Collegamento Redstone è Attivo",
"block.create.linked_transposer.tooltip.behaviour1": "_Ferma_ il Traspositore.",
"block.create.linked_transposer.tooltip.control1": "Clic-Destro sullo Spazio del Filtro",
"block.create.linked_transposer.tooltip.action1": "Assegna la _pila_ attualmente _tenuta_ come _Filtro_. Il Traspositore estrae solo gli oggetti che corrispondono al tipo di oggetto e al conteggio della pila di filtri.",
"block.create.linked_transposer.tooltip.control2": "Clic-Destro sullo Spazio di Frequenza",
"block.create.linked_transposer.tooltip.action2": "Assegna l'_oggetto_ attualmente _tenuto_ come parte della Frequenza ascoltata. Ogni volta che viene alimentato un _Collegamento_ _Redstone_ della stessa frequenza di trasmissione, questo Traspositore si ferma.",
"block.create.funnel.tooltip": "IMBUTO",
"block.create.funnel.tooltip.summary": "_Raccoglie_ _gli_ _oggetti_ _in_ _arrivo_ e li inserisce nell'_inventario_ allegato, se possibile. Può raccogliere oggetti nel _mondo_ e oggetti su un _nastro_.",
"block.create.funnel.tooltip.condition1": "Tirare il Nastro passivamente",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 404",
"_": "Missing Localizations: 397",
"_": "->------------------------] Game Elements [------------------------<-",
@ -16,7 +16,6 @@
"block.create.andesite_bricks_stairs": "UNLOCALIZED: Andesite Bricks Stairs",
"block.create.andesite_bricks_wall": "UNLOCALIZED: Andesite Bricks Wall",
"block.create.andesite_casing": "安山岩ケーシング",
"block.create.andesite_chute_funnel": "UNLOCALIZED: Andesite Chute Funnel",
"block.create.andesite_cobblestone": "UNLOCALIZED: Andesite Cobblestone",
"block.create.andesite_cobblestone_slab": "UNLOCALIZED: Andesite Cobblestone Slab",
"block.create.andesite_cobblestone_stairs": "UNLOCALIZED: Andesite Cobblestone Stairs",
@ -35,7 +34,6 @@
"block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel",
"block.create.brass_block": "真鍮ブロック",
"block.create.brass_casing": "真鍮ケーシング",
"block.create.brass_chute_funnel": "UNLOCALIZED: Brass Chute Funnel",
"block.create.brass_funnel": "UNLOCALIZED: Brass Funnel",
"block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel",
"block.create.brown_seat": "UNLOCALIZED: Brown Seat",
@ -98,7 +96,6 @@
"block.create.encased_fan": "ケース入りファン",
"block.create.encased_fluid_pipe": "UNLOCALIZED: Encased Fluid Pipe",
"block.create.encased_shaft": "ケース入りシャフト",
"block.create.extractor": "エクストラクター",
"block.create.fancy_andesite_bricks": "UNLOCALIZED: Fancy Andesite Bricks",
"block.create.fancy_andesite_bricks_slab": "UNLOCALIZED: Fancy Andesite Bricks Slab",
"block.create.fancy_andesite_bricks_stairs": "UNLOCALIZED: Fancy Andesite Bricks Stairs",
@ -195,8 +192,6 @@
"block.create.limestone_cobblestone_wall": "UNLOCALIZED: Limestone Cobblestone Wall",
"block.create.limestone_pillar": "石灰岩の柱",
"block.create.linear_chassis": "リニアシャーシ",
"block.create.linked_extractor": "リンクされたエクストラクター",
"block.create.linked_transposer": "リンクされたトランスポーザー",
"block.create.magenta_seat": "UNLOCALIZED: Magenta Seat",
"block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm",
"block.create.mechanical_bearing": "メカニカルベアリング",
@ -239,7 +234,6 @@
"block.create.overgrown_limestone": "UNLOCALIZED: Overgrown Limestone",
"block.create.overgrown_scoria": "UNLOCALIZED: Overgrown Scoria",
"block.create.overgrown_weathered_limestone": "UNLOCALIZED: Overgrown Weathered Limestone",
"block.create.packager": "UNLOCALIZED: Packager",
"block.create.paved_andesite": "UNLOCALIZED: Paved Andesite",
"block.create.paved_andesite_slab": "UNLOCALIZED: Paved Andesite Slab",
"block.create.paved_andesite_stairs": "UNLOCALIZED: Paved Andesite Stairs",
@ -342,14 +336,9 @@
"block.create.stressometer": "ストレスメーター",
"block.create.tiled_glass": "タイルガラス",
"block.create.tiled_glass_pane": "タイルガラス板",
"block.create.transposer": "トランスポーザー",
"block.create.turntable": "ターンテーブル",
"block.create.vertical_extractor": "UNLOCALIZED: Vertical Extractor",
"block.create.vertical_framed_glass": "垂直ガラス窓",
"block.create.vertical_framed_glass_pane": "垂直ガラス窓板",
"block.create.vertical_linked_extractor": "UNLOCALIZED: Vertical Linked Extractor",
"block.create.vertical_linked_transposer": "UNLOCALIZED: Vertical Linked Transposer",
"block.create.vertical_transposer": "UNLOCALIZED: Vertical Transposer",
"block.create.water_wheel": "水車",
"block.create.weathered_limestone": "風化した石灰岩",
"block.create.weathered_limestone_bricks": "風化した石灰岩レンガ",
@ -1280,24 +1269,6 @@
"block.create.creative_crate.tooltip.condition1": "UNLOCALIZED: When Item in Filter Slot",
"block.create.creative_crate.tooltip.behaviour1": "UNLOCALIZED: Anything _extracting_ from this container will provide an _endless_ _supply_ of the item specified. Items _inserted_ into this crate will be _voided._",
"block.create.extractor.tooltip": "抽出器",
"block.create.extractor.tooltip.summary": "付属のインベントリから_アイテムを取り_、地面にドロップします。 スペースが空いていない限り、アイテムはドロップされません。 _フィルター_としてアイテムスタックを割り当てることができます。",
"block.create.extractor.tooltip.condition1": "レッドストーン信号があるとき",
"block.create.extractor.tooltip.behaviour1": "エクストラクタを_一時停止_します。",
"block.create.extractor.tooltip.condition2": "アクティブベルト牽引されたとき",
"block.create.extractor.tooltip.behaviour2": "エクストラクタは、_真ちゅう製のケーシング_で補強された_ベルトから_アイテムを引き出すことができます。 エクストラクタが詰まると、_ベルトが停止_します。",
"block.create.extractor.tooltip.control1": "フィルタースペースを右クリック",
"block.create.extractor.tooltip.action1": "現在_保持されているスタック_を_フィルター_として割り当てます。 エクストラクターは、アイテム_タイプ_とフィルタースタックの_数_を排他的に取得します。",
"block.create.transposer.tooltip": "トランスポーザー",
"block.create.transposer.tooltip.summary": "取り付けされたインベントリから_アイテムを取得_し、すぐにターゲット_インベントリ_に入れます。 _フィルター_としてアイテムスタックを割り当てることができます。",
"block.create.transposer.tooltip.condition1": "レッドストーン信号があるとき",
"block.create.transposer.tooltip.behaviour1": "トランスポーザを_一時停止_します。",
"block.create.transposer.tooltip.condition2": "アクティブベルト牽引されたとき",
"block.create.transposer.tooltip.behaviour2": "トランスポーザーは、_真鍮のケーシングで補強_された_ベルトからアイテム_を引っ張ることができます。 トランスポーザがバックアップされると、_ベルトが停止_します。",
"block.create.transposer.tooltip.control1": "フィルタースペースを右クリック",
"block.create.transposer.tooltip.action1": "現在_保持されているスタック_を_フィルター_として割り当てます。トランスポーザーは、フィルタースタックのアイテムタイプと_カウント_を排他的にプルします。",
"block.create.deployer.tooltip": "デプロイヤ",
"block.create.deployer.tooltip.summary": "_パンチ_、_使用_、_有効化_。 このマシンは、_プレイヤー_をできるだけ_真似_しようとします。 隣接するインベントリの_アイテムを受け取り_、_預ける_ことができます。 _フィルター_としてアイテムスタックを割り当てることができます。",
"block.create.deployer.tooltip.condition1": "回転したとき",
@ -1305,24 +1276,6 @@
"block.create.deployer.tooltip.condition2": "レンチで右クリックしたとき",
"block.create.deployer.tooltip.behaviour2": "パンチモードを切り替えます。 _パンチモード_では、デプロイヤはそのアイテムを使用して_ブロックを壊したりエンティティを傷つけ_たりしようとします。",
"block.create.linked_extractor.tooltip": "リンクエクストラクター",
"block.create.linked_extractor.tooltip.summary": "取り付けてる_インベントリ_から_アイテムを取り_、それらを地面に落とします。 スペースが空いていない限り、アイテムはドロップされません。 _フィルター_としてアイテムスタックを割り当てることができます。 _レッドストーンリンク_を介してリモートで制御できます。",
"block.create.linked_extractor.tooltip.condition1": "レッドストーンリンクがアクティブな場合",
"block.create.linked_extractor.tooltip.behaviour1": "エクストラクタを_一時停止_します。",
"block.create.linked_extractor.tooltip.control1": "フィルタースペースを右クリックしたとき",
"block.create.linked_extractor.tooltip.action1": "現在_保持されているスタック_を_フィルター_として割り当てます。 エクストラクターは、_アイテムタイプ_とフィルタースタックの_数_を排他的に取得します。",
"block.create.linked_extractor.tooltip.control2": "周波数スペースを右クリックしたとき",
"block.create.linked_extractor.tooltip.action2": "リッスンされている周波数の一部として_現在保持_されているアイテムを割り当てます。 同じ周波数の送信_レッドストーンリンク_に動力が供給されると、このエクストラクターは一時停止します。",
"block.create.linked_transposer.tooltip": "リンクされたトランスポーザー",
"block.create.linked_transposer.tooltip.summary": "取り付けてる_インベントリ_から_アイテムを取得_し、すぐにターゲット_インベントリ_に入れます。 フィルターとしてアイテムスタックを割り当てることができます。 _レッドストーンリンク_を介してリモートで制御できます。",
"block.create.linked_transposer.tooltip.condition1": "レッドストーンリンクがアクティブのとき",
"block.create.linked_transposer.tooltip.behaviour1": "トランスポーザを_一時停止_します。",
"block.create.linked_transposer.tooltip.control1": "フィルタースペースを右クリックしたとき",
"block.create.linked_transposer.tooltip.action1": "現在_保持されているスタック_を_フィルター_として割り当てます。 トランスポーザーは、アイテム_タイプ_とフィルター_スタック_の数に一致するアイテムのみをプルします。",
"block.create.linked_transposer.tooltip.control2": "周波数スペースを右クリックしたとき",
"block.create.linked_transposer.tooltip.action2": "聴いてる周波数の一部として現在_保持されているアイテム_を割り当てます。 同じ周波数の送信レッドストーンリンクに動力が供給されると、このトランスポーザーは一時停止します。",
"block.create.funnel.tooltip": "漏斗",
"block.create.funnel.tooltip.summary": "_入力アイテムを収集_し、可能な場合はそれらを取り付けた_インベントリ_に挿入します。 _世界_のアイテムや_ベルト_のアイテムを集めることができます。",
"block.create.funnel.tooltip.condition1": "パッシブベルト引っ張り",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 409",
"_": "Missing Localizations: 402",
"_": "->------------------------] Game Elements [------------------------<-",
@ -16,7 +16,6 @@
"block.create.andesite_bricks_stairs": "UNLOCALIZED: Andesite Bricks Stairs",
"block.create.andesite_bricks_wall": "UNLOCALIZED: Andesite Bricks Wall",
"block.create.andesite_casing": "안산암 케이스",
"block.create.andesite_chute_funnel": "UNLOCALIZED: Andesite Chute Funnel",
"block.create.andesite_cobblestone": "UNLOCALIZED: Andesite Cobblestone",
"block.create.andesite_cobblestone_slab": "UNLOCALIZED: Andesite Cobblestone Slab",
"block.create.andesite_cobblestone_stairs": "UNLOCALIZED: Andesite Cobblestone Stairs",
@ -35,7 +34,6 @@
"block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel",
"block.create.brass_block": "황동 블럭",
"block.create.brass_casing": "황동 케이스",
"block.create.brass_chute_funnel": "UNLOCALIZED: Brass Chute Funnel",
"block.create.brass_funnel": "UNLOCALIZED: Brass Funnel",
"block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel",
"block.create.brown_seat": "UNLOCALIZED: Brown Seat",
@ -98,7 +96,6 @@
"block.create.encased_fan": "덮힌 환풍기",
"block.create.encased_fluid_pipe": "UNLOCALIZED: Encased Fluid Pipe",
"block.create.encased_shaft": "덮힌 축",
"block.create.extractor": "추출기",
"block.create.fancy_andesite_bricks": "UNLOCALIZED: Fancy Andesite Bricks",
"block.create.fancy_andesite_bricks_slab": "UNLOCALIZED: Fancy Andesite Bricks Slab",
"block.create.fancy_andesite_bricks_stairs": "UNLOCALIZED: Fancy Andesite Bricks Stairs",
@ -195,8 +192,6 @@
"block.create.limestone_cobblestone_wall": "UNLOCALIZED: Limestone Cobblestone Wall",
"block.create.limestone_pillar": "석회암 기둥",
"block.create.linear_chassis": "직선 섀시",
"block.create.linked_extractor": "무선 추출기",
"block.create.linked_transposer": "무선 트랜스포저",
"block.create.magenta_seat": "UNLOCALIZED: Magenta Seat",
"block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm",
"block.create.mechanical_bearing": "베어링",
@ -239,7 +234,6 @@
"block.create.overgrown_limestone": "UNLOCALIZED: Overgrown Limestone",
"block.create.overgrown_scoria": "UNLOCALIZED: Overgrown Scoria",
"block.create.overgrown_weathered_limestone": "UNLOCALIZED: Overgrown Weathered Limestone",
"block.create.packager": "UNLOCALIZED: Packager",
"block.create.paved_andesite": "UNLOCALIZED: Paved Andesite",
"block.create.paved_andesite_slab": "UNLOCALIZED: Paved Andesite Slab",
"block.create.paved_andesite_stairs": "UNLOCALIZED: Paved Andesite Stairs",
@ -342,14 +336,9 @@
"block.create.stressometer": "피로도 계측기",
"block.create.tiled_glass": "타일 유리",
"block.create.tiled_glass_pane": "타일 유리판",
"block.create.transposer": "트랜스포저",
"block.create.turntable": "돌림판",
"block.create.vertical_extractor": "UNLOCALIZED: Vertical Extractor",
"block.create.vertical_framed_glass": "수직 유리",
"block.create.vertical_framed_glass_pane": "수직 유리판",
"block.create.vertical_linked_extractor": "UNLOCALIZED: Vertical Linked Extractor",
"block.create.vertical_linked_transposer": "UNLOCALIZED: Vertical Linked Transposer",
"block.create.vertical_transposer": "UNLOCALIZED: Vertical Transposer",
"block.create.water_wheel": "물레방아",
"block.create.weathered_limestone": "풍화된 석회암",
"block.create.weathered_limestone_bricks": "풍화된 석회암 벽돌",
@ -1280,24 +1269,6 @@
"block.create.creative_crate.tooltip.condition1": "UNLOCALIZED: When Item in Filter Slot",
"block.create.creative_crate.tooltip.behaviour1": "UNLOCALIZED: Anything _extracting_ from this container will provide an _endless_ _supply_ of the item specified. Items _inserted_ into this crate will be _voided._",
"block.create.extractor.tooltip": "EXTRACTOR",
"block.create.extractor.tooltip.summary": "_연결된_ _인벤토리_로부터 아이템을 꺼내 땅에 떨어뜨립니다. 공간이 비지 않았다면 아이템을 떨어뜨리지 않습니다. 개수/필터를 설정 가능합니다.",
"block.create.extractor.tooltip.condition1": "레드스톤 신호를 받았을 때",
"block.create.extractor.tooltip.behaviour1": "추출기를 _멈춥니다_.",
"block.create.extractor.tooltip.condition2": "움직이는 벨트에 연결되었을 때",
"block.create.extractor.tooltip.behaviour2": "추출기는 _황동_ _케이스_가 장착된 _벨트_에서 아이템을 빼낼 수 있습니다. 추출기가 막혔을 때는, 벨트가 _멈춥니다_.",
"block.create.extractor.tooltip.control1": "필터 슬롯을 우클릭할 때",
"block.create.extractor.tooltip.action1": "현재 들고있는 아이템의 개수 혹은 필터 틀로 필터를 정합니다. 추출기는 필터 설정에 맞춰 아이템을 빼낼 것입니다.",
"block.create.transposer.tooltip": "TRANSPOSER",
"block.create.transposer.tooltip.summary": "연결된 인벤토리로부터 대상 인벤토리로 아이템을 _바로_ _이동_시킵니다. 개수/필터를 설정 가능합니다.",
"block.create.transposer.tooltip.condition1": "레드스톤 신호를 받았을 때",
"block.create.transposer.tooltip.behaviour1": "트랜스포저를 _멈춥니다_.",
"block.create.transposer.tooltip.condition2": "움직이는 벨트에 연결되었을 때",
"block.create.transposer.tooltip.behaviour2": "트랜스포저는 _황동_ _케이스_가 장착된 _벨트_에서 아이템을 빼낼 수 있습니다. 추출기가 막혔을 때는, 벨트가 _멈춥니다_.",
"block.create.transposer.tooltip.control1": "필터 슬롯을 우클릭할 때",
"block.create.transposer.tooltip.action1": "현재 들고있는 아이템의 개수 혹은 필터 틀로 필터를 정합니다. 트랜스포저는 필터 설정에 맞춰 아이템을 빼낼 것입니다.",
"block.create.deployer.tooltip": "DEPLOYER",
"block.create.deployer.tooltip.summary": " _때리고_, _사용하고_ _작동시킵니다_. 이 장치는 _플레이어_를 가능한 한 _흉내내려할_ _것입니다_. 주변 인벤토리에서 아이템을 쓰거나 넣을 수 있습니다. 필터로 사용하는 아이템을 설정할 수 있습니다.",
"block.create.deployer.tooltip.condition1": "회전될 때",
@ -1305,24 +1276,6 @@
"block.create.deployer.tooltip.condition2": "렌치로 우클릭",
"block.create.deployer.tooltip.behaviour2": "_펀치_ _모드_로 바꿉니다. 이 상태에서는 배포기가 아이템을 가지고 _부수거나_ _때리려고_ 할 것입니다.",
"block.create.linked_extractor.tooltip": "LINKED EXTRACTOR",
"block.create.linked_extractor.tooltip.summary": "_연결된_ _인벤토리_로부터 아이템을 꺼내 땅에 떨어뜨립니다. 공간이 비지 않았다면 아이템을 떨어뜨리지 않습니다. 개수/필터를 설정 가능합니다. 레드스톤 링크를 통해 _무선으로_ 컨트롤 될 수 있습니다.",
"block.create.linked_extractor.tooltip.condition1": "레드스톤 링크 신호를 받았을 때",
"block.create.linked_extractor.tooltip.behaviour1": "추출기를 _멈춥니다_.",
"block.create.linked_extractor.tooltip.control1": "필터 슬롯을 우클릭할 때",
"block.create.linked_extractor.tooltip.action1": "현재 들고있는 아이템의 개수 혹은 필터 틀로 필터를 정합니다. 추출기는 필터 설정에 맞춰 아이템을 빼낼 것입니다.",
"block.create.linked_extractor.tooltip.control2": "아이템을 들고 주파수 슬롯을 우클릭",
"block.create.linked_extractor.tooltip.action2": "그 아이템으로 주파수를 설정합니다. _같은_ _주파수_의 레드스톤 링크가 신호를 보낸다면, 추출기는 멈출 것입니다.",
"block.create.linked_transposer.tooltip": "LINKED TRANSPOSER",
"block.create.linked_transposer.tooltip.summary": "연결된 인벤토리로부터 대상 인벤토리로 아이템을 _바로_ _이동_시킵니다. 개수/필터를 설정 가능합니다. 레드스톤 링크를 통해 _무선으로_ 컨트롤 될 수 있습니다.",
"block.create.linked_transposer.tooltip.condition1": "레드스톤 링크 신호를 받았을 때",
"block.create.linked_transposer.tooltip.behaviour1": "트랜스포저를 _멈춥니다_.",
"block.create.linked_transposer.tooltip.control1": "필터 슬롯을 우클릭할 때",
"block.create.linked_transposer.tooltip.action1": "현재 들고있는 아이템의 개수 혹은 필터 틀로 필터를 정합니다. 트랜스포저는 필터 설정에 맞춰 아이템을 빼낼 것입니다.",
"block.create.linked_transposer.tooltip.control2": "아이템을 들고 주파수 슬롯을 우클릭",
"block.create.linked_transposer.tooltip.action2": "그 아이템으로 주파수를 설정합니다. _같은_ _주파수_의 레드스톤 링크가 신호를 보낸다면, 트랜스포저는 멈출 것입니다.",
"block.create.funnel.tooltip": "FUNNEL",
"block.create.funnel.tooltip.summary": "들어오는 아이템을 가능하면 _연결된_ _인벤토리_에 넣습니다. _벨트_ _위_의 아이템도 끌어올 수 있습니다.",
"block.create.funnel.tooltip.condition1": "움직이는 벨트위에 있을 때",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 759",
"_": "Missing Localizations: 732",
"_": "->------------------------] Game Elements [------------------------<-",
@ -16,7 +16,6 @@
"block.create.andesite_bricks_stairs": "UNLOCALIZED: Andesite Bricks Stairs",
"block.create.andesite_bricks_wall": "UNLOCALIZED: Andesite Bricks Wall",
"block.create.andesite_casing": "UNLOCALIZED: Andesite Casing",
"block.create.andesite_chute_funnel": "UNLOCALIZED: Andesite Chute Funnel",
"block.create.andesite_cobblestone": "UNLOCALIZED: Andesite Cobblestone",
"block.create.andesite_cobblestone_slab": "UNLOCALIZED: Andesite Cobblestone Slab",
"block.create.andesite_cobblestone_stairs": "UNLOCALIZED: Andesite Cobblestone Stairs",
@ -35,7 +34,6 @@
"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_chute_funnel": "UNLOCALIZED: Brass Chute Funnel",
"block.create.brass_funnel": "UNLOCALIZED: Brass Funnel",
"block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel",
"block.create.brown_seat": "UNLOCALIZED: Brown Seat",
@ -98,7 +96,6 @@
"block.create.encased_fan": "Omhulsde Ventilator",
"block.create.encased_fluid_pipe": "UNLOCALIZED: Encased Fluid Pipe",
"block.create.encased_shaft": "Omhulsde Drijfas",
"block.create.extractor": "Extractor",
"block.create.fancy_andesite_bricks": "UNLOCALIZED: Fancy Andesite Bricks",
"block.create.fancy_andesite_bricks_slab": "UNLOCALIZED: Fancy Andesite Bricks Slab",
"block.create.fancy_andesite_bricks_stairs": "UNLOCALIZED: Fancy Andesite Bricks Stairs",
@ -195,8 +192,6 @@
"block.create.limestone_cobblestone_wall": "UNLOCALIZED: Limestone Cobblestone Wall",
"block.create.limestone_pillar": "Kalksteen Pillar",
"block.create.linear_chassis": "Lineaar Frame",
"block.create.linked_extractor": "Gelinkte Extractor",
"block.create.linked_transposer": "UNLOCALIZED: Linked Transposer",
"block.create.magenta_seat": "UNLOCALIZED: Magenta Seat",
"block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm",
"block.create.mechanical_bearing": "Mechanische Lager",
@ -239,7 +234,6 @@
"block.create.overgrown_limestone": "UNLOCALIZED: Overgrown Limestone",
"block.create.overgrown_scoria": "UNLOCALIZED: Overgrown Scoria",
"block.create.overgrown_weathered_limestone": "UNLOCALIZED: Overgrown Weathered Limestone",
"block.create.packager": "UNLOCALIZED: Packager",
"block.create.paved_andesite": "UNLOCALIZED: Paved Andesite",
"block.create.paved_andesite_slab": "UNLOCALIZED: Paved Andesite Slab",
"block.create.paved_andesite_stairs": "UNLOCALIZED: Paved Andesite Stairs",
@ -342,14 +336,9 @@
"block.create.stressometer": "Stressmeter",
"block.create.tiled_glass": "Getegeld Glas",
"block.create.tiled_glass_pane": "Getegeld Glazen Paneel",
"block.create.transposer": "UNLOCALIZED: Transposer",
"block.create.turntable": "Draaischijf",
"block.create.vertical_extractor": "UNLOCALIZED: Vertical Extractor",
"block.create.vertical_framed_glass": "UNLOCALIZED: Vertical Framed Glass",
"block.create.vertical_framed_glass_pane": "UNLOCALIZED: Vertical Framed Glass Pane",
"block.create.vertical_linked_extractor": "UNLOCALIZED: Vertical Linked Extractor",
"block.create.vertical_linked_transposer": "UNLOCALIZED: Vertical Linked Transposer",
"block.create.vertical_transposer": "UNLOCALIZED: Vertical Transposer",
"block.create.water_wheel": "Waterrad",
"block.create.weathered_limestone": "Verweerde Kalksteen",
"block.create.weathered_limestone_bricks": "Verweerde Kalksteenstenen",
@ -1280,24 +1269,6 @@
"block.create.creative_crate.tooltip.condition1": "UNLOCALIZED: When Item in Filter Slot",
"block.create.creative_crate.tooltip.behaviour1": "UNLOCALIZED: Anything _extracting_ from this container will provide an _endless_ _supply_ of the item specified. Items _inserted_ into this crate will be _voided._",
"block.create.extractor.tooltip": "EXTRACTOR",
"block.create.extractor.tooltip.summary": "_Haalt_ _objecten_ uit een aangesloten _inventaris_ en laat ze op de grond vallen. Laat items niet vallen totdat de ruimte is leeggemaakt. Kan een item-stapel worden toegewezen als een _filter._",
"block.create.extractor.tooltip.condition1": "Wanneer aangestuurd door redstone",
"block.create.extractor.tooltip.behaviour1": "_Pauzeerd_ de Extractor",
"block.create.extractor.tooltip.condition2": "UNLOCALIZED: Active Belt pulling",
"block.create.extractor.tooltip.behaviour2": "UNLOCALIZED: Extractors can pull items _from_ _belts_ reinforced with _brass_ _casing_. When the extractor is blocked, the _belt_ _will_ _stall_.",
"block.create.extractor.tooltip.control1": "R-Klik op Filter Plek",
"block.create.extractor.tooltip.action1": "Wijst momenteel _vastgehouden_ _stapel_ toe als de _Filter._ Extractor zal uitsluitend het object _type_ en _hoevelheid_ van de stapel op de grond gooien.",
"block.create.transposer.tooltip": "UNLOCALIZED: TRANSPOSER",
"block.create.transposer.tooltip.summary": "UNLOCALIZED: _Takes_ _items_ from an attached _Inventory_ and immediately puts them into the target _Inventory_. Can be assigned an item-stack as a _filter_.",
"block.create.transposer.tooltip.condition1": "UNLOCALIZED: When Powered by Redstone",
"block.create.transposer.tooltip.behaviour1": "UNLOCALIZED: _Pauses_ the Transposer.",
"block.create.transposer.tooltip.condition2": "UNLOCALIZED: Active Belt pulling",
"block.create.transposer.tooltip.behaviour2": "UNLOCALIZED: Transposers can pull items _from_ _belts_ reinforced with _brass_ _casing_. When the transposer is backed up, the _belt_ _will_ _stall_.",
"block.create.transposer.tooltip.control1": "UNLOCALIZED: R-Click on Filter Space",
"block.create.transposer.tooltip.action1": "UNLOCALIZED: Assigns currently _held_ _stack_ as the _Filter_. The Transposer will pull the item _type_ and _count_ of the filter stack exclusively.",
"block.create.deployer.tooltip": "UNLOCALIZED: DEPLOYER",
"block.create.deployer.tooltip.summary": "UNLOCALIZED: _Punches_, _Uses_, and _Activates_. This machine will try to _imitate_ a _player_ as a much as possible. Can _Take_ and _Deposit_ _items_ in adjacent _Inventory_. Can be assigned an item-stack as a _filter_.",
"block.create.deployer.tooltip.condition1": "UNLOCALIZED: When Rotated",
@ -1305,24 +1276,6 @@
"block.create.deployer.tooltip.condition2": "UNLOCALIZED: R-Clicked with Wrench",
"block.create.deployer.tooltip.behaviour2": "UNLOCALIZED: Toggles punch mode. In _punch_ _mode_, the Deployer will attempt to use its item to _break_ _blocks_ or _hurt_ _entities_.",
"block.create.linked_extractor.tooltip": "LINKED EXTRACTOR",
"block.create.linked_extractor.tooltip.summary": "_Haalt_ _objecten_ uit een aangesloten _inventaris_ en laat ze op de grond vallen. Laat items niet vallen totdat de ruimte is leeggemaakt. Kan een item-stapel worden toegewezen als een _filter._ Kan op afstand worden bediend via een _Redstone_ _Brug._",
"block.create.linked_extractor.tooltip.condition1": "Wanneer Redstone verbinding actief is",
"block.create.linked_extractor.tooltip.behaviour1": "_Pauzeerd_ de Extractor",
"block.create.linked_extractor.tooltip.control1": "R-Klik op Filter Plek",
"block.create.linked_extractor.tooltip.action1": "Wijst momenteel _vastgehouden_ _stapel_ toe als de _Filter._ Extractor zal uitsluitend het object _type_ en _hoevelheid_ van de stapel op de grond gooien.",
"block.create.linked_extractor.tooltip.control2": "R-Klik op Frequency Plek",
"block.create.linked_extractor.tooltip.action2": "Wijst momenteel _vastgehouden_ _object_ toe als onderdeel van de geluisterde frequentie. Wanneer een zendende _Redstone_ _Brug_ van dezelfde frequentie wordt ingeschakeld, pauzeert deze Extractor.",
"block.create.linked_transposer.tooltip": "UNLOCALIZED: LINKED TRANSPOSER",
"block.create.linked_transposer.tooltip.summary": "UNLOCALIZED: _Takes_ _items_ from an attached _Inventory_ and immediately puts them into the target _Inventory_. Can be assigned an item-stack as a _filter_. Can be controlled remotely via a _Redstone_ _Link_.",
"block.create.linked_transposer.tooltip.condition1": "UNLOCALIZED: When Redstone Link Active",
"block.create.linked_transposer.tooltip.behaviour1": "UNLOCALIZED: _Pauses_ the Transposer.",
"block.create.linked_transposer.tooltip.control1": "UNLOCALIZED: R-Click on Filter Space",
"block.create.linked_transposer.tooltip.action1": "UNLOCALIZED: Assigns currently _held_ _stack_ as the _Filter_. The Transposer will only pull items that match the item _type_ and _count_ of the filter stack.",
"block.create.linked_transposer.tooltip.control2": "UNLOCALIZED: R-Click on Frequency Space",
"block.create.linked_transposer.tooltip.action2": "UNLOCALIZED: Assigns the currently _held_ _item_ as part of the Frequency listened on. Whenever a transmitting _Redstone_ _Link_ of the same frequency is powered, this Transposer will pause.",
"block.create.funnel.tooltip": "TRANSPORTBAND TRECHTER",
"block.create.funnel.tooltip.summary": "Verzamelt inkomende items op een _Mechanische_ _Transportband_ en plaatst deze indien mogelijk in de bijgevoegde _Inventaris._ Moet zich direct op een transportband bevinden, met de opening tegenover de bewegingsrichting van de transportband. Het inventaris moet op dezelfde hoogte zijn als de trechter.",
"block.create.funnel.tooltip.condition1": "UNLOCALIZED: Passive Belt pulling",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 828",
"_": "Missing Localizations: 801",
"_": "->------------------------] Game Elements [------------------------<-",
@ -16,7 +16,6 @@
"block.create.andesite_bricks_stairs": "UNLOCALIZED: Andesite Bricks Stairs",
"block.create.andesite_bricks_wall": "UNLOCALIZED: Andesite Bricks Wall",
"block.create.andesite_casing": "UNLOCALIZED: Andesite Casing",
"block.create.andesite_chute_funnel": "UNLOCALIZED: Andesite Chute Funnel",
"block.create.andesite_cobblestone": "UNLOCALIZED: Andesite Cobblestone",
"block.create.andesite_cobblestone_slab": "UNLOCALIZED: Andesite Cobblestone Slab",
"block.create.andesite_cobblestone_stairs": "UNLOCALIZED: Andesite Cobblestone Stairs",
@ -35,7 +34,6 @@
"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_chute_funnel": "UNLOCALIZED: Brass Chute Funnel",
"block.create.brass_funnel": "UNLOCALIZED: Brass Funnel",
"block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel",
"block.create.brown_seat": "UNLOCALIZED: Brown Seat",
@ -98,7 +96,6 @@
"block.create.encased_fan": "Ventilador Revestida",
"block.create.encased_fluid_pipe": "UNLOCALIZED: Encased Fluid Pipe",
"block.create.encased_shaft": "Eixo Revestido",
"block.create.extractor": "Extrator",
"block.create.fancy_andesite_bricks": "UNLOCALIZED: Fancy Andesite Bricks",
"block.create.fancy_andesite_bricks_slab": "UNLOCALIZED: Fancy Andesite Bricks Slab",
"block.create.fancy_andesite_bricks_stairs": "UNLOCALIZED: Fancy Andesite Bricks Stairs",
@ -195,8 +192,6 @@
"block.create.limestone_cobblestone_wall": "UNLOCALIZED: Limestone Cobblestone Wall",
"block.create.limestone_pillar": "Pilar de Calcário",
"block.create.linear_chassis": "Chassis de Translado",
"block.create.linked_extractor": "Extrator Conectado",
"block.create.linked_transposer": "UNLOCALIZED: Linked Transposer",
"block.create.magenta_seat": "UNLOCALIZED: Magenta Seat",
"block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm",
"block.create.mechanical_bearing": "Rolamento Mecânico",
@ -239,7 +234,6 @@
"block.create.overgrown_limestone": "UNLOCALIZED: Overgrown Limestone",
"block.create.overgrown_scoria": "UNLOCALIZED: Overgrown Scoria",
"block.create.overgrown_weathered_limestone": "UNLOCALIZED: Overgrown Weathered Limestone",
"block.create.packager": "UNLOCALIZED: Packager",
"block.create.paved_andesite": "UNLOCALIZED: Paved Andesite",
"block.create.paved_andesite_slab": "UNLOCALIZED: Paved Andesite Slab",
"block.create.paved_andesite_stairs": "UNLOCALIZED: Paved Andesite Stairs",
@ -342,14 +336,9 @@
"block.create.stressometer": "UNLOCALIZED: Stressometer",
"block.create.tiled_glass": "Vidro Entalhado",
"block.create.tiled_glass_pane": "Vidraça Entalhada",
"block.create.transposer": "UNLOCALIZED: Transposer",
"block.create.turntable": "Mesa giratória",
"block.create.vertical_extractor": "UNLOCALIZED: Vertical Extractor",
"block.create.vertical_framed_glass": "UNLOCALIZED: Vertical Framed Glass",
"block.create.vertical_framed_glass_pane": "UNLOCALIZED: Vertical Framed Glass Pane",
"block.create.vertical_linked_extractor": "UNLOCALIZED: Vertical Linked Extractor",
"block.create.vertical_linked_transposer": "UNLOCALIZED: Vertical Linked Transposer",
"block.create.vertical_transposer": "UNLOCALIZED: Vertical Transposer",
"block.create.water_wheel": "Roda de Água",
"block.create.weathered_limestone": "Calcário Resistido",
"block.create.weathered_limestone_bricks": "Tijolos de Calcário Resistido",
@ -1280,24 +1269,6 @@
"block.create.creative_crate.tooltip.condition1": "UNLOCALIZED: When Item in Filter Slot",
"block.create.creative_crate.tooltip.behaviour1": "UNLOCALIZED: Anything _extracting_ from this container will provide an _endless_ _supply_ of the item specified. Items _inserted_ into this crate will be _voided._",
"block.create.extractor.tooltip": "EXTRATOR",
"block.create.extractor.tooltip.summary": "_Pega_ _itens_ de um _Inventário_ conectado e os joga no chão. Não irá jogar Itens até o espaço ser limpo. Pode ser configurado como para ser um _filtro._",
"block.create.extractor.tooltip.condition1": "Quando Ligado por Redstone",
"block.create.extractor.tooltip.behaviour1": "_Para_ o Extractor",
"block.create.extractor.tooltip.condition2": "UNLOCALIZED: Active Belt pulling",
"block.create.extractor.tooltip.behaviour2": "UNLOCALIZED: Extractors can pull items _from_ _belts_ reinforced with _brass_ _casing_. When the extractor is blocked, the _belt_ _will_ _stall_.",
"block.create.extractor.tooltip.control1": "B-Direito no Espaço de Filtro",
"block.create.extractor.tooltip.action1": "Configura a _pilha_ atualmente _presente_ como um _Filtro._ Extrator irá apenas puxar apenas _tipo_ e _quantidade_ do item filtro.",
"block.create.transposer.tooltip": "UNLOCALIZED: TRANSPOSER",
"block.create.transposer.tooltip.summary": "UNLOCALIZED: _Takes_ _items_ from an attached _Inventory_ and immediately puts them into the target _Inventory_. Can be assigned an item-stack as a _filter_.",
"block.create.transposer.tooltip.condition1": "UNLOCALIZED: When Powered by Redstone",
"block.create.transposer.tooltip.behaviour1": "UNLOCALIZED: _Pauses_ the Transposer.",
"block.create.transposer.tooltip.condition2": "UNLOCALIZED: Active Belt pulling",
"block.create.transposer.tooltip.behaviour2": "UNLOCALIZED: Transposers can pull items _from_ _belts_ reinforced with _brass_ _casing_. When the transposer is backed up, the _belt_ _will_ _stall_.",
"block.create.transposer.tooltip.control1": "UNLOCALIZED: R-Click on Filter Space",
"block.create.transposer.tooltip.action1": "UNLOCALIZED: Assigns currently _held_ _stack_ as the _Filter_. The Transposer will pull the item _type_ and _count_ of the filter stack exclusively.",
"block.create.deployer.tooltip": "UNLOCALIZED: DEPLOYER",
"block.create.deployer.tooltip.summary": "UNLOCALIZED: _Punches_, _Uses_, and _Activates_. This machine will try to _imitate_ a _player_ as a much as possible. Can _Take_ and _Deposit_ _items_ in adjacent _Inventory_. Can be assigned an item-stack as a _filter_.",
"block.create.deployer.tooltip.condition1": "UNLOCALIZED: When Rotated",
@ -1305,24 +1276,6 @@
"block.create.deployer.tooltip.condition2": "UNLOCALIZED: R-Clicked with Wrench",
"block.create.deployer.tooltip.behaviour2": "UNLOCALIZED: Toggles punch mode. In _punch_ _mode_, the Deployer will attempt to use its item to _break_ _blocks_ or _hurt_ _entities_.",
"block.create.linked_extractor.tooltip": "EXTRATOR CONECTADO",
"block.create.linked_extractor.tooltip.summary": "_Pega_ _itens_ de um _Inventário_ e os joga no chão. Não vai jogar Itens até que o espaço ser limpo. Pode ser configurado como para ser um _filtro._ Pode ser controlado remotamente via _Conexão_ de _Redstone._",
"block.create.linked_extractor.tooltip.condition1": "Quando Conexão de Redstone Ativa",
"block.create.linked_extractor.tooltip.behaviour1": "_Para_ o Extrator",
"block.create.linked_extractor.tooltip.control1": "B-Direito no Espaço de Filtro",
"block.create.linked_extractor.tooltip.action1": "Configura a _pilha_ atualmente _presente_ como um _Filtro._ Extrator irá apenas puxar apenas _tipo_ e _quantidade_ do item filtro.",
"block.create.linked_extractor.tooltip.control2": "B-Direito no Espaço de Frequência",
"block.create.linked_extractor.tooltip.action2": "Configura a _pilha_ atualmente _presente_ como parte da Frequência a ouvir. Quando um _Conexão_ de _Redstone_ transmissor da mesma frequência é ligado, esse Extrator irá parar.",
"block.create.linked_transposer.tooltip": "UNLOCALIZED: LINKED TRANSPOSER",
"block.create.linked_transposer.tooltip.summary": "UNLOCALIZED: _Takes_ _items_ from an attached _Inventory_ and immediately puts them into the target _Inventory_. Can be assigned an item-stack as a _filter_. Can be controlled remotely via a _Redstone_ _Link_.",
"block.create.linked_transposer.tooltip.condition1": "UNLOCALIZED: When Redstone Link Active",
"block.create.linked_transposer.tooltip.behaviour1": "UNLOCALIZED: _Pauses_ the Transposer.",
"block.create.linked_transposer.tooltip.control1": "UNLOCALIZED: R-Click on Filter Space",
"block.create.linked_transposer.tooltip.action1": "UNLOCALIZED: Assigns currently _held_ _stack_ as the _Filter_. The Transposer will only pull items that match the item _type_ and _count_ of the filter stack.",
"block.create.linked_transposer.tooltip.control2": "UNLOCALIZED: R-Click on Frequency Space",
"block.create.linked_transposer.tooltip.action2": "UNLOCALIZED: Assigns the currently _held_ _item_ as part of the Frequency listened on. Whenever a transmitting _Redstone_ _Link_ of the same frequency is powered, this Transposer will pause.",
"block.create.funnel.tooltip": "FUNIL DE ESTEIRA",
"block.create.funnel.tooltip.summary": "Coleta itens passando numa _Esteira_ _Mecânica_ e os insere no _Inventário_ conetado, se possível. Precisa estar diretamente _sobre_ uma Esteira, com a abertura virada contra o movimento da Esteira. O inventário precisa estar na mesma altura que o funil.",
"block.create.funnel.tooltip.condition1": "UNLOCALIZED: Passive Belt pulling",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 822",
"_": "Missing Localizations: 795",
"_": "->------------------------] Game Elements [------------------------<-",
@ -16,7 +16,6 @@
"block.create.andesite_bricks_stairs": "UNLOCALIZED: Andesite Bricks Stairs",
"block.create.andesite_bricks_wall": "UNLOCALIZED: Andesite Bricks Wall",
"block.create.andesite_casing": "UNLOCALIZED: Andesite Casing",
"block.create.andesite_chute_funnel": "UNLOCALIZED: Andesite Chute Funnel",
"block.create.andesite_cobblestone": "UNLOCALIZED: Andesite Cobblestone",
"block.create.andesite_cobblestone_slab": "UNLOCALIZED: Andesite Cobblestone Slab",
"block.create.andesite_cobblestone_stairs": "UNLOCALIZED: Andesite Cobblestone Stairs",
@ -35,7 +34,6 @@
"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_chute_funnel": "UNLOCALIZED: Brass Chute Funnel",
"block.create.brass_funnel": "UNLOCALIZED: Brass Funnel",
"block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel",
"block.create.brown_seat": "UNLOCALIZED: Brown Seat",
@ -98,7 +96,6 @@
"block.create.encased_fan": "Вентилятор",
"block.create.encased_fluid_pipe": "UNLOCALIZED: Encased Fluid Pipe",
"block.create.encased_shaft": "Вальный привод",
"block.create.extractor": "Экстрактор",
"block.create.fancy_andesite_bricks": "UNLOCALIZED: Fancy Andesite Bricks",
"block.create.fancy_andesite_bricks_slab": "UNLOCALIZED: Fancy Andesite Bricks Slab",
"block.create.fancy_andesite_bricks_stairs": "UNLOCALIZED: Fancy Andesite Bricks Stairs",
@ -195,8 +192,6 @@
"block.create.limestone_cobblestone_wall": "UNLOCALIZED: Limestone Cobblestone Wall",
"block.create.limestone_pillar": "Известняковая колонна",
"block.create.linear_chassis": "Поступательная рама",
"block.create.linked_extractor": "Сигнальный экстрактор",
"block.create.linked_transposer": "UNLOCALIZED: Linked Transposer",
"block.create.magenta_seat": "UNLOCALIZED: Magenta Seat",
"block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm",
"block.create.mechanical_bearing": "Механический подшипник",
@ -239,7 +234,6 @@
"block.create.overgrown_limestone": "UNLOCALIZED: Overgrown Limestone",
"block.create.overgrown_scoria": "UNLOCALIZED: Overgrown Scoria",
"block.create.overgrown_weathered_limestone": "UNLOCALIZED: Overgrown Weathered Limestone",
"block.create.packager": "UNLOCALIZED: Packager",
"block.create.paved_andesite": "UNLOCALIZED: Paved Andesite",
"block.create.paved_andesite_slab": "UNLOCALIZED: Paved Andesite Slab",
"block.create.paved_andesite_stairs": "UNLOCALIZED: Paved Andesite Stairs",
@ -342,14 +336,9 @@
"block.create.stressometer": "UNLOCALIZED: Stressometer",
"block.create.tiled_glass": "Плиточное стекло",
"block.create.tiled_glass_pane": "Плиточная стеклянная панель",
"block.create.transposer": "UNLOCALIZED: Transposer",
"block.create.turntable": "Поворотный стол",
"block.create.vertical_extractor": "UNLOCALIZED: Vertical Extractor",
"block.create.vertical_framed_glass": "UNLOCALIZED: Vertical Framed Glass",
"block.create.vertical_framed_glass_pane": "UNLOCALIZED: Vertical Framed Glass Pane",
"block.create.vertical_linked_extractor": "UNLOCALIZED: Vertical Linked Extractor",
"block.create.vertical_linked_transposer": "UNLOCALIZED: Vertical Linked Transposer",
"block.create.vertical_transposer": "UNLOCALIZED: Vertical Transposer",
"block.create.water_wheel": "Водяное колесо",
"block.create.weathered_limestone": "Обветренный известняк",
"block.create.weathered_limestone_bricks": "Кирпичи из обветренного известняка",
@ -1280,24 +1269,6 @@
"block.create.creative_crate.tooltip.condition1": "UNLOCALIZED: When Item in Filter Slot",
"block.create.creative_crate.tooltip.behaviour1": "UNLOCALIZED: Anything _extracting_ from this container will provide an _endless_ _supply_ of the item specified. Items _inserted_ into this crate will be _voided._",
"block.create.extractor.tooltip": "EXTRACTOR",
"block.create.extractor.tooltip.summary": "_Извлекает_ _предметы_ из прилагаемого _инвентаря_ и бросает на землю. Не будет бросать предметы до тех пор, пока пространство не освободится. Может быть назначен _фильтр_ в виде стака предметов.",
"block.create.extractor.tooltip.condition1": "Когда запитан",
"block.create.extractor.tooltip.behaviour1": "_Приостанавливает_ экстрактор",
"block.create.extractor.tooltip.condition2": "UNLOCALIZED: Active Belt pulling",
"block.create.extractor.tooltip.behaviour2": "UNLOCALIZED: Extractors can pull items _from_ _belts_ reinforced with _brass_ _casing_. When the extractor is blocked, the _belt_ _will_ _stall_.",
"block.create.extractor.tooltip.control1": "ПКМ по фильтру",
"block.create.extractor.tooltip.action1": "Устанавливает _стак_ _в_ _руке_ в качестве _фильтра._ Экстрактор будет извлекать _определённый_ _предмет_ в _определённом_ _количестве_ по фильтру.",
"block.create.transposer.tooltip": "UNLOCALIZED: TRANSPOSER",
"block.create.transposer.tooltip.summary": "UNLOCALIZED: _Takes_ _items_ from an attached _Inventory_ and immediately puts them into the target _Inventory_. Can be assigned an item-stack as a _filter_.",
"block.create.transposer.tooltip.condition1": "UNLOCALIZED: When Powered by Redstone",
"block.create.transposer.tooltip.behaviour1": "UNLOCALIZED: _Pauses_ the Transposer.",
"block.create.transposer.tooltip.condition2": "UNLOCALIZED: Active Belt pulling",
"block.create.transposer.tooltip.behaviour2": "UNLOCALIZED: Transposers can pull items _from_ _belts_ reinforced with _brass_ _casing_. When the transposer is backed up, the _belt_ _will_ _stall_.",
"block.create.transposer.tooltip.control1": "UNLOCALIZED: R-Click on Filter Space",
"block.create.transposer.tooltip.action1": "UNLOCALIZED: Assigns currently _held_ _stack_ as the _Filter_. The Transposer will pull the item _type_ and _count_ of the filter stack exclusively.",
"block.create.deployer.tooltip": "UNLOCALIZED: DEPLOYER",
"block.create.deployer.tooltip.summary": "UNLOCALIZED: _Punches_, _Uses_, and _Activates_. This machine will try to _imitate_ a _player_ as a much as possible. Can _Take_ and _Deposit_ _items_ in adjacent _Inventory_. Can be assigned an item-stack as a _filter_.",
"block.create.deployer.tooltip.condition1": "UNLOCALIZED: When Rotated",
@ -1305,24 +1276,6 @@
"block.create.deployer.tooltip.condition2": "UNLOCALIZED: R-Clicked with Wrench",
"block.create.deployer.tooltip.behaviour2": "UNLOCALIZED: Toggles punch mode. In _punch_ _mode_, the Deployer will attempt to use its item to _break_ _blocks_ or _hurt_ _entities_.",
"block.create.linked_extractor.tooltip": "LINKED EXTRACTOR",
"block.create.linked_extractor.tooltip.summary": "_Извлекает_ _предметы_ из прилагаемого _инвентаря_ и бросает на землю. Не будет бросать предметы до тех пор, пока пространство не освободится. Может быть назначен _фильтр_ в виде стака предметов. Может управляться дистанционно через _Передатчик_ _сигнала._",
"block.create.linked_extractor.tooltip.condition1": "Когда соединение активно",
"block.create.linked_extractor.tooltip.behaviour1": "_Приостанавливает_ экстрактор",
"block.create.linked_extractor.tooltip.control1": "ПКМ по фильтру",
"block.create.linked_extractor.tooltip.action1": "Устанавливает _стак_ _в_ _руке_ в качестве _фильтра._ Экстрактор будет извлекать _определённый_ _предмет_ в _определённом_ _количестве_ по фильтру.",
"block.create.linked_extractor.tooltip.control2": "ПКМ по частоте",
"block.create.linked_extractor.tooltip.action2": "Устанавливает _частоту_ для этого экстрактора. При передаче сигнала с передающего _Сигнального_ _соединения_ экстрактор будет приостановлен.",
"block.create.linked_transposer.tooltip": "UNLOCALIZED: LINKED TRANSPOSER",
"block.create.linked_transposer.tooltip.summary": "UNLOCALIZED: _Takes_ _items_ from an attached _Inventory_ and immediately puts them into the target _Inventory_. Can be assigned an item-stack as a _filter_. Can be controlled remotely via a _Redstone_ _Link_.",
"block.create.linked_transposer.tooltip.condition1": "UNLOCALIZED: When Redstone Link Active",
"block.create.linked_transposer.tooltip.behaviour1": "UNLOCALIZED: _Pauses_ the Transposer.",
"block.create.linked_transposer.tooltip.control1": "UNLOCALIZED: R-Click on Filter Space",
"block.create.linked_transposer.tooltip.action1": "UNLOCALIZED: Assigns currently _held_ _stack_ as the _Filter_. The Transposer will only pull items that match the item _type_ and _count_ of the filter stack.",
"block.create.linked_transposer.tooltip.control2": "UNLOCALIZED: R-Click on Frequency Space",
"block.create.linked_transposer.tooltip.action2": "UNLOCALIZED: Assigns the currently _held_ _item_ as part of the Frequency listened on. Whenever a transmitting _Redstone_ _Link_ of the same frequency is powered, this Transposer will pause.",
"block.create.funnel.tooltip": "BELT FUNNEL",
"block.create.funnel.tooltip.summary": "Собирает входящие предметы на _Механической_ _ленте_ и по возможности кладет их в прилагаемый _инвентарь._ Должен быть непосредственно _над_ лентой, с проёмом, смотрящим против направления ленты. Инвентарь должен быть на той же высоте, что и воронка.",
"block.create.funnel.tooltip.condition1": "UNLOCALIZED: Passive Belt pulling",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 85",
"_": "Missing Localizations: 82",
"_": "->------------------------] Game Elements [------------------------<-",
@ -16,7 +16,6 @@
"block.create.andesite_bricks_stairs": "安山岩砖楼梯",
"block.create.andesite_bricks_wall": "安山岩砖墙",
"block.create.andesite_casing": "安山机壳",
"block.create.andesite_chute_funnel": "UNLOCALIZED: Andesite Chute Funnel",
"block.create.andesite_cobblestone": "安山岩圆石",
"block.create.andesite_cobblestone_slab": "安山岩圆石台阶",
"block.create.andesite_cobblestone_stairs": "安山岩圆石楼梯",
@ -35,7 +34,6 @@
"block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel",
"block.create.brass_block": "黄铜块",
"block.create.brass_casing": "黄铜机壳",
"block.create.brass_chute_funnel": "UNLOCALIZED: Brass Chute Funnel",
"block.create.brass_funnel": "UNLOCALIZED: Brass Funnel",
"block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel",
"block.create.brown_seat": "UNLOCALIZED: Brown Seat",
@ -98,7 +96,6 @@
"block.create.encased_fan": "鼓风机",
"block.create.encased_fluid_pipe": "UNLOCALIZED: Encased Fluid Pipe",
"block.create.encased_shaft": "齿轮箱",
"block.create.extractor": "提取器",
"block.create.fancy_andesite_bricks": "方纹安山岩砖",
"block.create.fancy_andesite_bricks_slab": "方纹安山岩砖台阶",
"block.create.fancy_andesite_bricks_stairs": "方纹安山岩砖楼梯",
@ -195,8 +192,6 @@
"block.create.limestone_cobblestone_wall": "石灰岩圆石墙",
"block.create.limestone_pillar": "竖纹石灰岩",
"block.create.linear_chassis": "机壳底盘",
"block.create.linked_extractor": "无线提取器",
"block.create.linked_transposer": "无线传输器",
"block.create.magenta_seat": "UNLOCALIZED: Magenta Seat",
"block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm",
"block.create.mechanical_bearing": "动力轴承",
@ -239,7 +234,6 @@
"block.create.overgrown_limestone": "生草石灰岩",
"block.create.overgrown_scoria": "生草熔渣",
"block.create.overgrown_weathered_limestone": "生草风化石灰岩",
"block.create.packager": "UNLOCALIZED: Packager",
"block.create.paved_andesite": "安山岩铺路石",
"block.create.paved_andesite_slab": "安山岩铺路石台阶",
"block.create.paved_andesite_stairs": "安山岩铺路石楼梯",
@ -342,14 +336,9 @@
"block.create.stressometer": "应力表",
"block.create.tiled_glass": "十字玻璃窗",
"block.create.tiled_glass_pane": "十字玻璃窗板",
"block.create.transposer": "传输器",
"block.create.turntable": "转盘",
"block.create.vertical_extractor": "竖直提取器",
"block.create.vertical_framed_glass": "竖直边框玻璃",
"block.create.vertical_framed_glass_pane": "竖直边框玻璃板",
"block.create.vertical_linked_extractor": "竖直无限提取器",
"block.create.vertical_linked_transposer": "竖直无线传输器",
"block.create.vertical_transposer": "竖直传输器",
"block.create.water_wheel": "水车",
"block.create.weathered_limestone": "风化石灰岩",
"block.create.weathered_limestone_bricks": "风化石灰岩砖",
@ -1280,24 +1269,6 @@
"block.create.creative_crate.tooltip.condition1": "当标记了物品时",
"block.create.creative_crate.tooltip.behaviour1": "容器将会从虚空中提供_无限量_的标记物品并且任何放置到容器中的物品都会被_送入虚空_",
"block.create.extractor.tooltip": "EXTRACTOR",
"block.create.extractor.tooltip.summary": "从连接的_容器_里自动将物品_输出_到外面,如果前方已经有物品,则在物品被移动前不会继续输出. 可以设置_白名单过滤_.",
"block.create.extractor.tooltip.condition1": "当提供红石信号时",
"block.create.extractor.tooltip.behaviour1": "_暂停_自动输出",
"block.create.extractor.tooltip.condition2": "放置在传送带上时",
"block.create.extractor.tooltip.behaviour2": "当传送带被_黄铜机壳_加固时,使用提取器可以将传送带上的物品_提取_出来. 当提取器堵塞时,传送带将会停下.",
"block.create.extractor.tooltip.control1": "当右键过滤框时",
"block.create.extractor.tooltip.action1": "将当前持有的_物品数量_的物品设置为物品_过滤白名单_,且输出此_数量_的物品.",
"block.create.transposer.tooltip": "TRANSPOSER",
"block.create.transposer.tooltip.summary": "将过滤框_白名单_中的物品_传输_到指定的容器.",
"block.create.transposer.tooltip.condition1": "当给予红石信号时",
"block.create.transposer.tooltip.behaviour1": "_暂停_传输.",
"block.create.transposer.tooltip.condition2": "放置在传送带上时",
"block.create.transposer.tooltip.behaviour2": "当传送带被_黄铜机壳_加固时,使用_传输器_可以将传送带上的物品_提取_出来. 当传输器堵塞时,传送带将会停下.",
"block.create.transposer.tooltip.control1": "当右键过滤框时",
"block.create.transposer.tooltip.action1": "将当前持有的_物品数量_的物品设置为物品_过滤白名单_,且输出此_数量_的物品.",
"block.create.deployer.tooltip": "DEPLOYER",
"block.create.deployer.tooltip.summary": "它是一个_机械手_,将尽可能_模仿玩家_的行为,也能将方块从容器中取出并_放置_. 可以设置_白名单_.",
"block.create.deployer.tooltip.condition1": "被供能时",
@ -1305,24 +1276,6 @@
"block.create.deployer.tooltip.condition2": "当使用扳手时",
"block.create.deployer.tooltip.behaviour2": "将会启用拳头模式,在拳头模式之下,机械臂将会试图使用手中的物品_破坏方块_,或者_攻击实体_.",
"block.create.linked_extractor.tooltip": "LINKED EXTRACTOR",
"block.create.linked_extractor.tooltip.summary": "从连接的_容器_里自动将物品_输出_到外面,如果前方已经有物品,则在物品被移动前不会继续输出. 可以设置_白名单过滤_.可以使用_无线红石信号终端_控制.",
"block.create.linked_extractor.tooltip.condition1": "当无线红石信号激活时",
"block.create.linked_extractor.tooltip.behaviour1": "_暂停_输出物品",
"block.create.linked_extractor.tooltip.control1": "右键过滤框时",
"block.create.linked_extractor.tooltip.action1": "将当前持有的_物品数量_的物品设置为物品_过滤白名单_,且输出此_数量_的物品.",
"block.create.linked_extractor.tooltip.control2": "当右键提取器侧面的频道框时",
"block.create.linked_extractor.tooltip.action2": "手持任意物品为其设置_频道_,将接收_无线红石终端_相应频道,可以用两个物品来组合标记频道.",
"block.create.linked_transposer.tooltip": "LINKED TRANSPOSER",
"block.create.linked_transposer.tooltip.summary": "将过滤框_白名单_中的物品_传输_到指定的容器.能够使用_无线红石信号终端_控制",
"block.create.linked_transposer.tooltip.condition1": "当无线红石信号触发时",
"block.create.linked_transposer.tooltip.behaviour1": "暂停传输",
"block.create.linked_transposer.tooltip.control1": "当右键过滤框时",
"block.create.linked_transposer.tooltip.action1": "将当前持有的_物品数量_的物品设置为物品_过滤白名单_,且输出此_数量_的物品.",
"block.create.linked_transposer.tooltip.control2": "当右键传输器侧面的频道框时",
"block.create.linked_transposer.tooltip.action2": "手持任意物品为其设置_频道_,将接收_无线红石终端_相应频道,可以用两个物品来组合标记频道.",
"block.create.funnel.tooltip": "FUNNEL",
"block.create.funnel.tooltip.summary": "接收传送带上的物品到_连接的容器_,必须放置在_正对_传送带的_方向_及_高度_.",
"block.create.funnel.tooltip.condition1": "提取传送带物品",

View file

@ -1,9 +0,0 @@
{
"parent": "create:block/chute_funnel/block",
"textures": {
"particle": "create:block/andesite_casing",
"3": "create:block/andesite_funnel_pull",
"1_2": "create:block/andesite_funnel_back",
"4": "create:block/andesite_funnel_plating"
}
}

View file

@ -1,9 +0,0 @@
{
"parent": "create:block/chute_funnel/block",
"textures": {
"particle": "create:block/andesite_casing",
"3": "create:block/andesite_funnel_push",
"1_2": "create:block/andesite_funnel_back",
"4": "create:block/andesite_funnel_plating"
}
}

View file

@ -1,9 +0,0 @@
{
"parent": "create:block/chute_funnel/block",
"textures": {
"particle": "create:block/brass_casing",
"3": "create:block/brass_funnel_pull",
"1_2": "create:block/brass_funnel_back",
"4": "create:block/brass_funnel_plating"
}
}

View file

@ -1,9 +0,0 @@
{
"parent": "create:block/chute_funnel/block",
"textures": {
"particle": "create:block/brass_casing",
"3": "create:block/brass_funnel_pull_powered",
"1_2": "create:block/brass_funnel_back",
"4": "create:block/brass_funnel_plating"
}
}

View file

@ -1,9 +0,0 @@
{
"parent": "create:block/chute_funnel/block",
"textures": {
"particle": "create:block/brass_casing",
"3": "create:block/brass_funnel_push",
"1_2": "create:block/brass_funnel_back",
"4": "create:block/brass_funnel_plating"
}
}

View file

@ -1,9 +0,0 @@
{
"parent": "create:block/chute_funnel/block",
"textures": {
"particle": "create:block/brass_casing",
"3": "create:block/brass_funnel_push_powered",
"1_2": "create:block/brass_funnel_back",
"4": "create:block/brass_funnel_plating"
}
}

View file

@ -1,3 +0,0 @@
{
"parent": "create:block/extractor/horizontal"
}

View file

@ -1,3 +0,0 @@
{
"parent": "create:block/extractor/horizontal_linked"
}

View file

@ -1,3 +0,0 @@
{
"parent": "create:block/transposer/horizontal_linked"
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -7,10 +7,6 @@
"create:pulley_magnet",
"create:furnace_engine",
"create:redstone_link",
"create:extractor",
"create:vertical_extractor",
"create:linked_extractor",
"create:vertical_linked_extractor",
"#minecraft:doors",
"minecraft:flower_pot",
"minecraft:bell"

View file

@ -23,7 +23,6 @@ import com.simibubi.create.content.contraptions.components.actors.PortableStorag
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;
import com.simibubi.create.content.contraptions.components.actors.StorageInterfaceMovement;
import com.simibubi.create.content.contraptions.components.clock.CuckooClockBlock;
import com.simibubi.create.content.contraptions.components.crafter.CrafterCTBehaviour;
import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterBlock;
@ -109,24 +108,16 @@ import com.simibubi.create.content.logistics.block.diodes.PulseRepeaterBlock;
import com.simibubi.create.content.logistics.block.diodes.PulseRepeaterGenerator;
import com.simibubi.create.content.logistics.block.diodes.ToggleLatchBlock;
import com.simibubi.create.content.logistics.block.diodes.ToggleLatchGenerator;
import com.simibubi.create.content.logistics.block.extractor.ExtractorBlock;
import com.simibubi.create.content.logistics.block.extractor.ExtractorMovementBehaviour;
import com.simibubi.create.content.logistics.block.extractor.LinkedExtractorBlock;
import com.simibubi.create.content.logistics.block.extractor.VerticalExtractorGenerator;
import com.simibubi.create.content.logistics.block.funnel.AndesiteBeltFunnelBlock;
import com.simibubi.create.content.logistics.block.funnel.AndesiteChuteFunnelBlock;
import com.simibubi.create.content.logistics.block.funnel.AndesiteFunnelBlock;
import com.simibubi.create.content.logistics.block.funnel.BeltFunnelGenerator;
import com.simibubi.create.content.logistics.block.funnel.BrassBeltFunnelBlock;
import com.simibubi.create.content.logistics.block.funnel.BrassChuteFunnelBlock;
import com.simibubi.create.content.logistics.block.funnel.BrassFunnelBlock;
import com.simibubi.create.content.logistics.block.funnel.ChuteFunnelGenerator;
import com.simibubi.create.content.logistics.block.funnel.FunnelMovementBehaviour;
import com.simibubi.create.content.logistics.block.inventories.AdjustableCrateBlock;
import com.simibubi.create.content.logistics.block.inventories.CreativeCrateBlock;
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.packager.PackagerBlock;
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.NixieTubeBlock;
@ -135,9 +126,6 @@ import com.simibubi.create.content.logistics.block.redstone.RedstoneContactBlock
import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkBlock;
import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkGenerator;
import com.simibubi.create.content.logistics.block.redstone.StockpileSwitchBlock;
import com.simibubi.create.content.logistics.block.transposer.LinkedTransposerBlock;
import com.simibubi.create.content.logistics.block.transposer.TransposerBlock;
import com.simibubi.create.content.logistics.block.transposer.VerticalTransposerGenerator;
import com.simibubi.create.content.palettes.MetalBlock;
import com.simibubi.create.content.schematics.block.SchematicTableBlock;
import com.simibubi.create.content.schematics.block.SchematicannonBlock;
@ -165,7 +153,6 @@ import net.minecraft.item.DyeColor;
import net.minecraft.state.properties.PistonType;
import net.minecraft.tags.BlockTags;
import net.minecraft.tags.ItemTags;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.model.generators.ConfiguredModel;
import net.minecraftforge.common.ToolType;
@ -683,7 +670,7 @@ public class AllBlocks {
public static final BlockEntry<PortableStorageInterfaceBlock> PORTABLE_STORAGE_INTERFACE =
REGISTRATE.block("portable_storage_interface", PortableStorageInterfaceBlock::new)
.initialProperties(SharedProperties::stone)
.onRegister(addMovementBehaviour(new StorageInterfaceMovement()))
// .onRegister(addMovementBehaviour(new StorageInterfaceMovement()))
.blockstate(BlockStateGen.directionalBlockProvider(false))
.simpleItem()
.register();
@ -860,13 +847,6 @@ public class AllBlocks {
.loot((p, b) -> p.registerDropping(b, ANDESITE_FUNNEL.get()))
.register();
public static final BlockEntry<AndesiteChuteFunnelBlock> ANDESITE_CHUTE_FUNNEL =
REGISTRATE.block("andesite_chute_funnel", AndesiteChuteFunnelBlock::new)
.initialProperties(SharedProperties::stone)
.blockstate(new ChuteFunnelGenerator("andesite")::generate)
.loot((p, b) -> p.registerDropping(b, ANDESITE_FUNNEL.get()))
.register();
public static final BlockEntry<BrassFunnelBlock> BRASS_FUNNEL =
REGISTRATE.block("brass_funnel", BrassFunnelBlock::new)
.initialProperties(SharedProperties::softMetal)
@ -881,13 +861,6 @@ public class AllBlocks {
.loot((p, b) -> p.registerDropping(b, BRASS_FUNNEL.get()))
.register();
public static final BlockEntry<BrassChuteFunnelBlock> BRASS_CHUTE_FUNNEL =
REGISTRATE.block("brass_chute_funnel", BrassChuteFunnelBlock::new)
.initialProperties(SharedProperties::softMetal)
.blockstate(new ChuteFunnelGenerator("brass")::generate)
.loot((p, b) -> p.registerDropping(b, BRASS_FUNNEL.get()))
.register();
public static final BlockEntry<BeltTunnelBlock> ANDESITE_TUNNEL =
REGISTRATE.block("andesite_tunnel", BeltTunnelBlock::new)
.transform(BuilderTransformers.beltTunnel("andesite", new ResourceLocation("block/polished_andesite")))
@ -908,25 +881,14 @@ public class AllBlocks {
.transform(customItemModel("_", "block"))
.register();
public static final BlockEntry<RedstoneLinkBlock> REDSTONE_LINK =
REGISTRATE.block("redstone_link", RedstoneLinkBlock::new)
.initialProperties(SharedProperties::wooden)
.tag(AllBlockTags.BRITTLE.tag)
.blockstate(new RedstoneLinkGenerator()::generate)
.addLayer(() -> RenderType::getCutoutMipped)
public static final BlockEntry<BeltObserverBlock> BELT_OBSERVER =
REGISTRATE.block("belt_observer", BeltObserverBlock::new)
.initialProperties(SharedProperties::stone)
.blockstate(BlockStateGen.beltObserver())
.item()
.transform(customItemModel("_", "transmitter"))
.transform(customItemModel())
.register();
public static final BlockEntry<NixieTubeBlock> NIXIE_TUBE = REGISTRATE.block("nixie_tube", NixieTubeBlock::new)
.initialProperties(SharedProperties::softMetal)
.properties(p -> p.lightValue(5))
.blockstate(new NixieTubeGenerator()::generate)
.addLayer(() -> RenderType::getTranslucent)
.item()
.transform(customItemModel())
.register();
public static final BlockEntry<StockpileSwitchBlock> STOCKPILE_SWITCH =
REGISTRATE.block("stockpile_switch", StockpileSwitchBlock::new)
.initialProperties(SharedProperties::stone)
@ -945,93 +907,23 @@ public class AllBlocks {
.transform(BuilderTransformers.crate("creative"))
.register();
public static final BlockEntry<BeltObserverBlock> BELT_OBSERVER =
REGISTRATE.block("belt_observer", BeltObserverBlock::new)
.initialProperties(SharedProperties::stone)
.blockstate(BlockStateGen.beltObserver())
.item()
.transform(customItemModel())
.register();
public static final BlockEntry<PackagerBlock> PACKAGER = REGISTRATE.block("packager", PackagerBlock::new)
public static final BlockEntry<NixieTubeBlock> NIXIE_TUBE = REGISTRATE.block("nixie_tube", NixieTubeBlock::new)
.initialProperties(SharedProperties::softMetal)
.transform(StressConfigDefaults.setImpact(4.0))
.properties(Block.Properties::nonOpaque)
.blockstate((c, p) -> p.getVariantBuilder(c.get())
.forAllStates(s -> ConfiguredModel.builder()
.modelFile(AssetLookup.partialBaseModel(c, p))
.rotationY(s.get(PackagerBlock.HORIZONTAL_AXIS) == Axis.X ? 90 : 0)
.build()))
.properties(p -> p.lightValue(5))
.blockstate(new NixieTubeGenerator()::generate)
.addLayer(() -> RenderType::getTranslucent)
.item()
.transform(customItemModel())
.register();
public static final BlockEntry<ExtractorBlock> EXTRACTOR = REGISTRATE.block("extractor", ExtractorBlock::new)
.initialProperties(SharedProperties::softMetal)
.tag(AllBlockTags.BRITTLE.tag)
.onRegister(addMovementBehaviour(new ExtractorMovementBehaviour()))
.blockstate((c, p) -> p.horizontalBlock(c.get(), AssetLookup.forPowered(c, p, c.getName() + "/horizontal")))
.item()
.transform(customItemModel("_", "horizontal"))
.register();
public static final BlockEntry<ExtractorBlock.Vertical> VERTICAL_EXTRACTOR =
REGISTRATE.block("vertical_extractor", ExtractorBlock.Vertical::new)
.initialProperties(SharedProperties::softMetal)
public static final BlockEntry<RedstoneLinkBlock> REDSTONE_LINK =
REGISTRATE.block("redstone_link", RedstoneLinkBlock::new)
.initialProperties(SharedProperties::wooden)
.tag(AllBlockTags.BRITTLE.tag)
.blockstate(new VerticalExtractorGenerator(false)::generate)
.loot((p, b) -> p.registerDropping(b, EXTRACTOR.get()))
.register();
public static final BlockEntry<LinkedExtractorBlock> LINKED_EXTRACTOR = REGISTRATE
.block("linked_extractor", LinkedExtractorBlock::new)
.tag(AllBlockTags.BRITTLE.tag)
.initialProperties(SharedProperties::softMetal)
.addLayer(() -> RenderType::getCutoutMipped)
.blockstate((c, p) -> p.horizontalBlock(c.get(), AssetLookup.forPowered(c, p, "extractor/horizontal_linked")))
.item()
.transform(customItemModel("extractor", "horizontal_linked"))
.register();
public static final BlockEntry<LinkedExtractorBlock.Vertical> VERTICAL_LINKED_EXTRACTOR =
REGISTRATE.block("vertical_linked_extractor", LinkedExtractorBlock.Vertical::new)
.initialProperties(SharedProperties::softMetal)
.tag(AllBlockTags.BRITTLE.tag)
.blockstate(new VerticalExtractorGenerator(true)::generate)
.loot((p, b) -> p.registerDropping(b, LINKED_EXTRACTOR.get()))
.blockstate(new RedstoneLinkGenerator()::generate)
.addLayer(() -> RenderType::getCutoutMipped)
.register();
public static final BlockEntry<TransposerBlock> TRANSPOSER = REGISTRATE.block("transposer", TransposerBlock::new)
.initialProperties(SharedProperties::softMetal)
.blockstate((c, p) -> p.horizontalBlock(c.get(), AssetLookup.forPowered(c, p, c.getName() + "/block"), 180))
.item()
.transform(customItemModel("_", "block"))
.register();
public static final BlockEntry<TransposerBlock.Vertical> VERTICAL_TRANSPOSER =
REGISTRATE.block("vertical_transposer", TransposerBlock.Vertical::new)
.initialProperties(SharedProperties::softMetal)
.blockstate(new VerticalTransposerGenerator(false)::generate)
.loot((p, b) -> p.registerDropping(b, TRANSPOSER.get()))
.register();
public static final BlockEntry<LinkedTransposerBlock> LINKED_TRANSPOSER =
REGISTRATE.block("linked_transposer", LinkedTransposerBlock::new)
.initialProperties(SharedProperties::softMetal)
.addLayer(() -> RenderType::getCutoutMipped)
.blockstate(
(c, p) -> p.horizontalBlock(c.get(), AssetLookup.forPowered(c, p, "transposer/horizontal_linked"), 180))
.item()
.transform(customItemModel("transposer", "horizontal_linked"))
.register();
public static final BlockEntry<LinkedTransposerBlock.Vertical> VERTICAL_LINKED_TRANSPOSER =
REGISTRATE.block("vertical_linked_transposer", LinkedTransposerBlock.Vertical::new)
.initialProperties(SharedProperties::softMetal)
.blockstate(new VerticalTransposerGenerator(true)::generate)
.loot((p, b) -> p.registerDropping(b, LINKED_TRANSPOSER.get()))
.addLayer(() -> RenderType::getCutoutMipped)
.transform(customItemModel("_", "transmitter"))
.register();
public static final BlockEntry<AnalogLeverBlock> ANALOG_LEVER =

View file

@ -30,11 +30,6 @@ public class AllShapes {
MOTOR_BLOCK = shape(3, 0, 3, 13, 14, 13).forDirectional(),
FOUR_VOXEL_POLE = shape(6, 0, 6, 10, 16, 10).forAxis(), SIX_VOXEL_POLE = shape(5, 0, 5, 11, 16, 11).forAxis(),
EIGHT_VOXEL_POLE = shape(4, 0, 4, 12, 16, 12).forAxis(),
EXTRACTOR = shape(4, 2, 11, 12, 10, 17).forDirectional(SOUTH)
.withVerticalShapes(cuboid(4, 11, 4, 12, 17, 12)),
TRANSPOSER = shape(4, 4, -1, 12, 12, 1).add(5, 5, 0, 11, 11, 16)
.add(4, 4, 11, 12, 12, 17)
.forDirectional(SOUTH),
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)
@ -73,10 +68,6 @@ public class AllShapes {
.add(1, 6, 1, 15, 10, 15)
.add(0, 10, 0, 16, 13, 16)
.forDirectional(UP),
CHUTE_FUNNEL = shape(3, -2, 3, 13, 2, 13).add(2, 2, 2, 14, 6, 14)
.add(0, 8, 0, 16, 14, 16)
.add(1, 5, 1, 15, 18, 15)
.forDirectional(UP),
BELT_FUNNEL_RETRACTED = shape(3, -5, 14, 13, 13, 19).add(0, -5, 8, 16, 16, 14)
.forHorizontal(NORTH),
BELT_FUNNEL_EXTENDED = shape(3, -4, 6, 13, 13, 17).add(2, -4, 10, 14, 14, 14)

View file

@ -62,7 +62,11 @@ import com.simibubi.create.content.contraptions.relays.advanced.sequencer.Sequen
import com.simibubi.create.content.contraptions.relays.belt.BeltRenderer;
import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity;
import com.simibubi.create.content.contraptions.relays.elementary.SimpleKineticTileEntity;
import com.simibubi.create.content.contraptions.relays.encased.*;
import com.simibubi.create.content.contraptions.relays.encased.AdjustablePulleyTileEntity;
import com.simibubi.create.content.contraptions.relays.encased.ClutchTileEntity;
import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftRenderer;
import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftTileEntity;
import com.simibubi.create.content.contraptions.relays.encased.SplitShaftRenderer;
import com.simibubi.create.content.contraptions.relays.gauge.GaugeRenderer;
import com.simibubi.create.content.contraptions.relays.gauge.SpeedGaugeTileEntity;
import com.simibubi.create.content.contraptions.relays.gauge.StressGaugeTileEntity;
@ -81,19 +85,18 @@ import com.simibubi.create.content.logistics.block.depot.DepotTileEntity;
import com.simibubi.create.content.logistics.block.diodes.AdjustablePulseRepeaterTileEntity;
import com.simibubi.create.content.logistics.block.diodes.AdjustableRepeaterRenderer;
import com.simibubi.create.content.logistics.block.diodes.AdjustableRepeaterTileEntity;
import com.simibubi.create.content.logistics.block.extractor.ExtractorTileEntity;
import com.simibubi.create.content.logistics.block.extractor.LinkedExtractorTileEntity;
import com.simibubi.create.content.logistics.block.funnel.FunnelRenderer;
import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity;
import com.simibubi.create.content.logistics.block.inventories.AdjustableCrateTileEntity;
import com.simibubi.create.content.logistics.block.inventories.CreativeCrateTileEntity;
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.packager.PackagerRenderer;
import com.simibubi.create.content.logistics.block.packager.PackagerTileEntity;
import com.simibubi.create.content.logistics.block.redstone.*;
import com.simibubi.create.content.logistics.block.transposer.LinkedTransposerTileEntity;
import com.simibubi.create.content.logistics.block.transposer.TransposerTileEntity;
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.NixieTubeRenderer;
import com.simibubi.create.content.logistics.block.redstone.NixieTubeTileEntity;
import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkTileEntity;
import com.simibubi.create.content.logistics.block.redstone.StockpileSwitchTileEntity;
import com.simibubi.create.content.schematics.block.SchematicTableTileEntity;
import com.simibubi.create.content.schematics.block.SchematicannonRenderer;
import com.simibubi.create.content.schematics.block.SchematicannonTileEntity;
@ -447,40 +450,10 @@ public class AllTileEntities {
public static final TileEntityEntry<FunnelTileEntity> FUNNEL = Create.registrate()
.tileEntity("funnel", FunnelTileEntity::new)
.validBlocks(AllBlocks.BRASS_FUNNEL, AllBlocks.BRASS_BELT_FUNNEL, AllBlocks.BRASS_CHUTE_FUNNEL, AllBlocks.ANDESITE_FUNNEL, AllBlocks.ANDESITE_BELT_FUNNEL, AllBlocks.ANDESITE_CHUTE_FUNNEL)
.validBlocks(AllBlocks.BRASS_FUNNEL, AllBlocks.BRASS_BELT_FUNNEL, AllBlocks.ANDESITE_FUNNEL, AllBlocks.ANDESITE_BELT_FUNNEL)
.renderer(() -> FunnelRenderer::new)
.register();
public static final TileEntityEntry<PackagerTileEntity> PACKAGER = Create.registrate()
.tileEntity("packager", PackagerTileEntity::new)
.validBlocks(AllBlocks.PACKAGER)
.renderer(() -> PackagerRenderer::new)
.register();
public static final TileEntityEntry<ExtractorTileEntity> EXTRACTOR = Create.registrate()
.tileEntity("extractor", ExtractorTileEntity::new)
.validBlocks(AllBlocks.EXTRACTOR, AllBlocks.VERTICAL_EXTRACTOR)
.renderer(() -> SmartTileEntityRenderer::new)
.register();
public static final TileEntityEntry<LinkedExtractorTileEntity> LINKED_EXTRACTOR = Create.registrate()
.tileEntity("linked_extractor", LinkedExtractorTileEntity::new)
.validBlocks(AllBlocks.LINKED_EXTRACTOR, AllBlocks.VERTICAL_LINKED_EXTRACTOR)
.renderer(() -> SmartTileEntityRenderer::new)
.register();
public static final TileEntityEntry<TransposerTileEntity> TRANSPOSER = Create.registrate()
.tileEntity("transposer", TransposerTileEntity::new)
.validBlocks(AllBlocks.TRANSPOSER, AllBlocks.VERTICAL_TRANSPOSER)
.renderer(() -> SmartTileEntityRenderer::new)
.register();
public static final TileEntityEntry<LinkedTransposerTileEntity> LINKED_TRANSPOSER = Create.registrate()
.tileEntity("linked_transposer", LinkedTransposerTileEntity::new)
.validBlocks(AllBlocks.LINKED_TRANSPOSER, AllBlocks.VERTICAL_LINKED_TRANSPOSER)
.renderer(() -> SmartTileEntityRenderer::new)
.register();
public static final TileEntityEntry<BeltObserverTileEntity> BELT_OBSERVER = Create.registrate()
.tileEntity("belt_observer", BeltObserverTileEntity::new)
.validBlocks(AllBlocks.BELT_OBSERVER)

View file

@ -1,157 +1,157 @@
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<ItemStack> test = extracting.getFilterTest();
int exactAmount = extracting.getAmountToExtract();
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);
}
}
//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<ItemStack> 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);
// }
//
//}

View file

@ -17,8 +17,8 @@ import com.simibubi.create.content.contraptions.components.crafter.RecipeGridHan
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.edgeInteraction.EdgeInteractionBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InsertingBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InventoryManagementBehaviour.Attachments;
import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour;
import com.simibubi.create.foundation.utility.BlockFace;
import com.simibubi.create.foundation.utility.Pointing;
import com.simibubi.create.foundation.utility.VecHelper;
@ -33,6 +33,7 @@ import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.CapabilityItemHandler;
@ -83,7 +84,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
protected boolean wasPoweredBefore;
protected GroupedItems groupedItemsBeforeCraft; // for rendering on client
private InsertingBehaviour inserting;
private InvManipulationBehaviour inserting;
private EdgeInteractionBehaviour connectivity;
public MechanicalCrafterTileEntity(TileEntityType<? extends MechanicalCrafterTileEntity> type) {
@ -99,7 +100,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
@Override
public void addBehaviours(List<TileEntityBehaviour> behaviours) {
super.addBehaviours(behaviours);
inserting = new InsertingBehaviour(this, Attachments.toward(this::getTargetFacing));
inserting = new InvManipulationBehaviour(this, this::getTargetFace);
connectivity = new EdgeInteractionBehaviour(this, ConnectedInputHandler::toggleConnection)
.connectivity(ConnectedInputHandler::shouldConnect)
.require(AllItems.WRENCH.get());
@ -108,13 +109,17 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
}
public void blockChanged() {
removeBehaviour(InsertingBehaviour.TYPE);
inserting = new InsertingBehaviour(this, Attachments.toward(this::getTargetFacing));
removeBehaviour(InvManipulationBehaviour.TYPE);
inserting = new InvManipulationBehaviour(this, this::getTargetFace);
putBehaviour(inserting);
}
public Direction getTargetFacing() {
return MechanicalCrafterBlock.getTargetDirection(world.getBlockState(pos));
public BlockFace getTargetFace(World world, BlockPos pos, BlockState state) {
return new BlockFace(pos, MechanicalCrafterBlock.getTargetDirection(state));
}
public Direction getTargetDirection() {
return MechanicalCrafterBlock.getTargetDirection(getBlockState());
}
@Override
@ -329,16 +334,16 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
protected boolean isTargetingBelt() {
DirectBeltInputBehaviour behaviour = getTargetingBelt();
return behaviour != null && behaviour.canInsertFromSide(getTargetFacing());
return behaviour != null && behaviour.canInsertFromSide(getTargetDirection());
}
protected DirectBeltInputBehaviour getTargetingBelt() {
BlockPos targetPos = pos.offset(getTargetFacing());
BlockPos targetPos = pos.offset(getTargetDirection());
return TileEntityBehaviour.get(world, targetPos, DirectBeltInputBehaviour.TYPE);
}
public void tryInsert() {
if (inserting.getInventory() == null && !isTargetingBelt()) {
if (!inserting.hasInventory() && !isTargetingBelt()) {
ejectWholeGrid();
return;
}
@ -350,10 +355,10 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
for (Entry<Pair<Integer, Integer>, ItemStack> entry : groupedItems.grid.entrySet()) {
Pair<Integer, Integer> pair = entry.getKey();
ItemStack stack = entry.getValue();
Direction facing = getTargetFacing();
BlockFace face = getTargetFace(world, pos, getBlockState());
ItemStack remainder = behaviour == null ? inserting.insert(stack.copy(), false)
: behaviour.handleInsertion(stack, facing, false);
ItemStack remainder = behaviour == null ? inserting.insert(stack.copy())
: behaviour.handleInsertion(stack, face.getFace(), false);
if (!remainder.isEmpty()) {
stack.setCount(remainder.getCount());
continue;

View file

@ -1,5 +1,7 @@
package com.simibubi.create.content.contraptions.components.deployer;
import java.util.Iterator;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
@ -74,11 +76,48 @@ public class DeployerItemHandler implements IItemHandlerModifiable {
@Override
public ItemStack extractItem(int slot, int amount, boolean simulate) {
if (amount == 0)
return ItemStack.EMPTY;
ItemStack extractedFromOverflow = ItemStack.EMPTY;
ItemStack returnToOverflow = ItemStack.EMPTY;
for (Iterator<ItemStack> iterator = te.overflowItems.iterator(); iterator.hasNext();) {
ItemStack existing = iterator.next();
if (existing.isEmpty()) {
iterator.remove();
continue;
}
int toExtract = Math.min(amount, existing.getMaxStackSize());
if (existing.getCount() <= toExtract) {
if (!simulate)
iterator.remove();
extractedFromOverflow = existing;
break;
}
if (!simulate) {
iterator.remove();
returnToOverflow = ItemHandlerHelper.copyStackWithSize(existing, existing.getCount() - toExtract);
}
extractedFromOverflow = ItemHandlerHelper.copyStackWithSize(existing, toExtract);
break;
}
if (!returnToOverflow.isEmpty())
te.overflowItems.add(returnToOverflow);
if (!extractedFromOverflow.isEmpty())
return extractedFromOverflow;
ItemStack held = getHeld();
if (amount == 0 || held.isEmpty())
return ItemStack.EMPTY;
if (!te.filtering.getFilter()
.isEmpty() && te.filtering.test(held))
return ItemStack.EMPTY;
if (simulate)
return held.copy().split(amount);
return held.copy()
.split(amount);
ItemStack toReturn = held.split(amount);
te.markDirty();

View file

@ -3,27 +3,18 @@ package com.simibubi.create.content.contraptions.components.deployer;
import static com.simibubi.create.content.contraptions.base.DirectionalKineticBlock.FACING;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.commons.lang3.tuple.Pair;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.curiosities.tools.SandPaperItem;
import com.simibubi.create.foundation.advancement.AllTriggers;
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.ExtractingBehaviour;
import com.simibubi.create.foundation.utility.NBTHelper;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
@ -45,19 +36,10 @@ import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.Constants.NBT;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.IItemHandlerModifiable;
import net.minecraftforge.items.ItemHandlerHelper;
public class DeployerTileEntity extends KineticTileEntity {
private static final List<Pair<BlockPos, Direction>> EXTRACTING_LOCATIONS = Arrays.asList(Direction.values())
.stream()
.map(d -> Pair.of(BlockPos.ZERO.offset(d), d.getOpposite()))
.collect(Collectors.toList());
private FilteringBehaviour filtering;
private ExtractingBehaviour extracting;
protected State state;
protected Mode mode;
protected ItemStack heldItem = ItemStack.EMPTY;
@ -66,8 +48,9 @@ public class DeployerTileEntity extends KineticTileEntity {
protected float reach;
protected boolean boop = false;
protected List<ItemStack> overflowItems = new ArrayList<>();
private ListNBT deferredInventoryList;
protected FilteringBehaviour filtering;
private LazyOptional<IItemHandlerModifiable> invHandler;
private ListNBT deferredInventoryList;
enum State {
WAITING, EXPANDING, RETRACTING, DUMPING;
@ -88,10 +71,7 @@ public class DeployerTileEntity extends KineticTileEntity {
public void addBehaviours(List<TileEntityBehaviour> behaviours) {
super.addBehaviours(behaviours);
filtering = new FilteringBehaviour(this, new DeployerFilterSlot());
extracting = new ExtractingBehaviour(this, this::getExtractingLocations, this::onExtract);
behaviours.add(filtering);
behaviours.add(extracting);
}
@Override
@ -117,10 +97,6 @@ public class DeployerTileEntity extends KineticTileEntity {
markDirty();
}
protected List<Pair<BlockPos, Direction>> getExtractingLocations() {
return EXTRACTING_LOCATIONS;
}
protected int getTimerSpeed() {
return (int) (getSpeed() == 0 ? 0 : MathHelper.clamp(Math.abs(getSpeed() * 2), 8, 512));
}
@ -147,9 +123,7 @@ public class DeployerTileEntity extends KineticTileEntity {
ItemStack stack = player.getHeldItemMainhand();
if (state == State.WAITING) {
if (!overflowItems.isEmpty()) {
tryDisposeOfItems();
if (!overflowItems.isEmpty())
timer = getTimerSpeed() * 10;
timer = getTimerSpeed() * 10;
return;
}
@ -160,16 +134,10 @@ public class DeployerTileEntity extends KineticTileEntity {
sendData();
return;
}
extracting.extract(1);
if (!filtering.test(stack))
timer = getTimerSpeed() * 10;
timer = getTimerSpeed() * 10;
return;
}
if (filtering.getFilter()
.isEmpty() && stack.isEmpty())
extracting.extract(1);
Direction facing = getBlockState().get(FACING);
if (mode == Mode.USE && !DeployerHandler.shouldActivate(stack, world, pos.offset(facing, 2))) {
timer = getTimerSpeed() * 10;
@ -213,7 +181,6 @@ public class DeployerTileEntity extends KineticTileEntity {
if (state == State.RETRACTING) {
state = State.WAITING;
timer = 500;
returnAndDeposit();
sendData();
return;
}
@ -280,59 +247,6 @@ public class DeployerTileEntity extends KineticTileEntity {
heldItem = player.getHeldItemMainhand();
}
protected void returnAndDeposit() {
PlayerInventory inv = player.inventory;
for (List<ItemStack> list : Arrays.asList(inv.armorInventory, inv.offHandInventory, inv.mainInventory)) {
for (int i = 0; i < list.size(); ++i) {
ItemStack itemstack = list.get(i);
if (itemstack.isEmpty())
continue;
if (list == inv.mainInventory && i == inv.currentItem && filtering.test(itemstack))
continue;
itemstack = insert(itemstack, false);
if (!itemstack.isEmpty())
ItemHelper.addToList(itemstack, overflowItems);
list.set(i, ItemStack.EMPTY);
}
}
heldItem = player.getHeldItemMainhand();
}
protected void tryDisposeOfItems() {
boolean noInv = extracting.getInventories()
.isEmpty();
for (Iterator<ItemStack> iterator = overflowItems.iterator(); iterator.hasNext();) {
ItemStack itemStack = iterator.next();
if (noInv) {
Vec3d offset = getMovementVector();
Vec3d outPos = VecHelper.getCenterOf(pos)
.add(offset.scale(-.65f));
Vec3d motion = offset.scale(-.25f);
ItemEntity e = new ItemEntity(world, outPos.x, outPos.y, outPos.z, itemStack.copy());
e.setMotion(motion);
world.addEntity(e);
iterator.remove();
continue;
}
itemStack = insert(itemStack, false);
if (itemStack.isEmpty())
iterator.remove();
}
}
protected ItemStack insert(ItemStack stack, boolean simulate) {
for (IItemHandler inv : extracting.getInventories()) {
stack = ItemHandlerHelper.insertItemStacked(inv, stack, simulate);
if (stack.isEmpty())
break;
}
return stack;
}
protected Vec3d getMovementVector() {
if (!AllBlocks.DEPLOYER.has(getBlockState()))
return Vec3d.ZERO;

View file

@ -4,14 +4,16 @@ import java.util.ArrayList;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.Optional;
import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.AllTags;
import com.simibubi.create.content.contraptions.components.press.MechanicalPressTileEntity;
import com.simibubi.create.content.contraptions.processing.BasinOperatingTileEntity;
import com.simibubi.create.content.contraptions.processing.BasinTileEntity.BasinInventory;
import com.simibubi.create.content.contraptions.processing.BasinTileEntity;
import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock;
import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel;
import com.simibubi.create.foundation.item.SmartInventory;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.block.BlockState;
@ -30,7 +32,6 @@ import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.items.IItemHandler;
public class MechanicalMixerTileEntity extends BasinOperatingTileEntity {
@ -141,14 +142,14 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity {
}
public void renderParticles() {
IItemHandler itemHandler = basinItemInv.orElse(null);
BasinInventory inv = (BasinInventory) itemHandler;
if (inv == null || world == null)
Optional<BasinTileEntity> basin = getBasin();
if (!basin.isPresent() || world == null)
return;
for (int slot = 0; slot < inv.getInputHandler()
.getSlots(); slot++) {
ItemStack stackInSlot = itemHandler.getStackInSlot(slot);
SmartInventory inputs = basin.get()
.getInputInventory();
for (int slot = 0; slot < inputs.getSlots(); slot++) {
ItemStack stackInSlot = inputs.getStackInSlot(slot);
if (stackInSlot.isEmpty())
continue;

View file

@ -8,10 +8,10 @@ import java.util.List;
import javax.annotation.Nonnull;
import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.content.contraptions.processing.BasinTileEntity.BasinInputInventory;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipe;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder.ProcessingRecipeParams;
import com.simibubi.create.foundation.item.SmartInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
@ -19,7 +19,7 @@ import net.minecraft.item.crafting.Ingredient;
import net.minecraft.util.NonNullList;
import net.minecraft.world.World;
public class MixingRecipe extends ProcessingRecipe<BasinInputInventory> {
public class MixingRecipe extends ProcessingRecipe<SmartInventory> {
/**
* For JEI purposes only
@ -61,7 +61,7 @@ public class MixingRecipe extends ProcessingRecipe<BasinInputInventory> {
}
@Override
public boolean matches(BasinInputInventory inv, @Nonnull World worldIn) {
public boolean matches(SmartInventory inv, @Nonnull World worldIn) {
if (inv.isEmpty())
return false;

View file

@ -7,10 +7,11 @@ import java.util.Optional;
import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.AllSoundEvents;
import com.simibubi.create.content.contraptions.processing.BasinOperatingTileEntity;
import com.simibubi.create.content.contraptions.processing.BasinTileEntity.BasinInventory;
import com.simibubi.create.content.contraptions.processing.BasinTileEntity;
import com.simibubi.create.content.logistics.InWorldProcessing;
import com.simibubi.create.foundation.advancement.AllTriggers;
import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.item.SmartInventory;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour;
import com.simibubi.create.foundation.utility.NBTHelper;
@ -33,7 +34,6 @@ import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import net.minecraftforge.common.util.Constants.NBT;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemStackHandler;
import net.minecraftforge.items.wrapper.RecipeWrapper;
@ -177,13 +177,13 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity {
if (!world.isRemote) {
pressedItems.clear();
applyBasinRecipe();
IItemHandler orElse = basinItemInv.orElse(null);
if (basinItemInv.isPresent() && orElse instanceof BasinInventory) {
BasinInventory inv = (BasinInventory) orElse;
for (int slot = 0; slot < inv.getInputHandler()
.getSlots(); slot++) {
ItemStack stackInSlot = inv.getStackInSlot(slot);
Optional<BasinTileEntity> basin = getBasin();
SmartInventory inputs = basin.get()
.getInputInventory();
if (basin.isPresent()) {
for (int slot = 0; slot < inputs.getSlots(); slot++) {
ItemStack stackInSlot = inputs.getStackInSlot(slot);
if (stackInSlot.isEmpty())
continue;
pressedItems.add(stackInSlot);

View file

@ -18,10 +18,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.pis
import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.PistonState;
import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyTileEntity;
import com.simibubi.create.content.logistics.block.AttachedLogisticalBlock;
import com.simibubi.create.content.logistics.block.extractor.ExtractorBlock;
import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkBlock;
import com.simibubi.create.content.logistics.block.transposer.TransposerBlock;
import net.minecraft.block.AbstractPressurePlateBlock;
import net.minecraft.block.AbstractRailBlock;
@ -95,8 +92,6 @@ public class BlockMovementTraits {
if (AllBlocks.BELT.has(blockState))
return true;
if (block instanceof ExtractorBlock)
return true;
return blockState.getPushReaction() != PushReaction.BLOCK;
}
@ -143,8 +138,6 @@ public class BlockMovementTraits {
return direction == Direction.DOWN;
if (block instanceof DoorBlock)
return direction == Direction.DOWN;
if (block instanceof AttachedLogisticalBlock && !(block instanceof TransposerBlock))
return direction == AttachedLogisticalBlock.getBlockFacing(state);
if (block instanceof RedstoneLinkBlock)
return direction.getOpposite() == state.get(RedstoneLinkBlock.FACING);
if (block instanceof FlowerPotBlock)

View file

@ -147,7 +147,7 @@ public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable, IWren
TileEntityBehaviour.get(world, pos, FluidPipeAttachmentBehaviour.TYPE);
if (attachmentBehaviour == null)
return false;
return attachmentBehaviour.isPipeConnectedTowards(neighbour, blockFace.getOpposite());
return attachmentBehaviour.isPipeConnectedTowards(neighbour, blockFace);
}
public static boolean shouldDrawRim(ILightReader world, BlockPos pos, BlockState state, Direction direction) {
@ -219,7 +219,7 @@ public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable, IWren
for (Direction d : Iterate.directions)
if (d != ignore)
state = state.with(FACING_TO_PROPERTY_MAP.get(d),
canConnectTo(world, pos.offset(d), world.getBlockState(pos.offset(d)), d.getOpposite()));
canConnectTo(world, pos.offset(d), world.getBlockState(pos.offset(d)), d));
// See if it has enough connections
Direction connectedDirection = null;

View file

@ -60,7 +60,7 @@ public class BasinBlock extends Block implements ITE<BasinTileEntity>, IWrenchab
try {
BasinTileEntity te = getTileEntity(worldIn, pos);
IItemHandlerModifiable inv = te.inventory.orElse(new ItemStackHandler(1));
IItemHandlerModifiable inv = te.itemCapability.orElse(new ItemStackHandler(1));
for (int slot = 0; slot < inv.getSlots(); slot++) {
player.inventory.placeItemBackInInventory(worldIn, inv.getStackInSlot(slot));
inv.setStackInSlot(slot, ItemStack.EMPTY);
@ -83,7 +83,7 @@ public class BasinBlock extends Block implements ITE<BasinTileEntity>, IWrenchab
return;
ItemEntity itemEntity = (ItemEntity) entityIn;
withTileEntityDo(worldIn, entityIn.getPosition(), te -> {
ItemStack insertItem = ItemHandlerHelper.insertItem(te.inputItemInventory, itemEntity.getItem()
ItemStack insertItem = ItemHandlerHelper.insertItem(te.inputInventory, itemEntity.getItem()
.copy(), false);
if (insertItem.isEmpty()) {
itemEntity.remove();
@ -115,8 +115,8 @@ public class BasinBlock extends Block implements ITE<BasinTileEntity>, IWrenchab
return;
TileEntityBehaviour.destroy(worldIn, pos, FilteringBehaviour.TYPE);
withTileEntityDo(worldIn, pos, te -> {
ItemHelper.dropContents(worldIn, pos, te.inputItemInventory);
ItemHelper.dropContents(worldIn, pos, te.outputItemInventory);
ItemHelper.dropContents(worldIn, pos, te.inputInventory);
ItemHelper.dropContents(worldIn, pos, te.outputInventory);
});
worldIn.removeTileEntity(pos);
}
@ -129,7 +129,7 @@ public class BasinBlock extends Block implements ITE<BasinTileEntity>, IWrenchab
@Override
public int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) {
try {
return ItemHelper.calcRedstoneFromInventory(getTileEntity(worldIn, pos).inputItemInventory);
return ItemHelper.calcRedstoneFromInventory(getTileEntity(worldIn, pos).inputInventory);
} catch (TileEntityException e) {
}
return 0;

View file

@ -0,0 +1,27 @@
package com.simibubi.create.content.contraptions.processing;
import com.simibubi.create.foundation.item.SmartInventory;
import net.minecraft.item.ItemStack;
import net.minecraftforge.items.ItemHandlerHelper;
public class BasinInputInventory extends SmartInventory {
public BasinInputInventory(int slots, BasinTileEntity te) {
super(slots, te);
}
@Override
public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) {
// Only insert if no other slot already has a 'full' stack of this item
for (int i = 0; i < getSlots(); i++) {
ItemStack stackInSlot = getStackInSlot(i);
if (ItemHandlerHelper.canItemStacksStack(stack, stackInSlot)
&& stackInSlot.getCount() == getStackLimit(i, stackInSlot))
return stack;
}
return super.insertItem(slot, stack, simulate);
}
}

View file

@ -7,9 +7,9 @@ import java.util.stream.Collectors;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.processing.BasinTileEntity.BasinInventory;
import com.simibubi.create.foundation.advancement.AllTriggers;
import com.simibubi.create.foundation.advancement.SimpleTrigger;
import com.simibubi.create.foundation.item.SmartInventory;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.simple.DeferralBehaviour;
import com.simibubi.create.foundation.utility.recipe.RecipeFinder;
@ -27,7 +27,6 @@ import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandler;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.IItemHandlerModifiable;
import net.minecraftforge.items.ItemHandlerHelper;
public abstract class BasinOperatingTileEntity extends KineticTileEntity {
@ -142,9 +141,11 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity {
if (!basinItemInv.isPresent() || !basinFluidInv.isPresent())
return;
BasinInventory inv = (BasinInventory) basinItemInv.orElse(null);
IItemHandlerModifiable inputs = inv.getInputHandler();
IItemHandlerModifiable outputs = inv.getOutputHandler();
Optional<BasinTileEntity> basin = getBasin();
if (!basin.isPresent())
return;
SmartInventory inputs = basin.get().getInputInventory();
SmartInventory outputs = basin.get().getOutputInventory();
List<ItemStack> containers = new ArrayList<>();
NonNullList<Ingredient> ingredients = lastRecipe.getIngredients();
@ -172,9 +173,11 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity {
AllTriggers.triggerForNearbyPlayers(trigger, world, pos, 4);
}
outputs.allowInsertion();
ItemHandlerHelper.insertItemStacked(outputs, lastRecipe.getRecipeOutput()
.copy(), false); // TODO only works for single item output
containers.forEach(stack -> ItemHandlerHelper.insertItemStacked(outputs, stack, false));
outputs.forbidInsertion();
// Continue mixing
gatherInputs();
@ -183,7 +186,7 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity {
sendData();
}
getBasin().ifPresent(te -> te.contentsChanged = true);
getBasin().ifPresent(BasinTileEntity::notifyChangeOfContents);
}
protected List<IRecipe<?>> getMatchingRecipes() {

View file

@ -33,7 +33,7 @@ public class BasinRenderer extends SmartTileEntityRenderer<BasinTileEntity> {
ms.translate(.5, .2f, .5);
Random r = new Random(pos.hashCode());
IItemHandlerModifiable inv = basin.inventory.orElse(new ItemStackHandler());
IItemHandlerModifiable inv = basin.itemCapability.orElse(new ItemStackHandler());
for (int slot = 0; slot < inv.getSlots(); slot++) {
ItemStack stack = inv.getStackInSlot(slot);
if (stack.isEmpty())

View file

@ -6,6 +6,7 @@ import java.util.Optional;
import javax.annotation.Nonnull;
import com.simibubi.create.content.contraptions.fluids.CombinedFluidHandler;
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;
@ -14,7 +15,6 @@ import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBe
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.block.BlockState;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.ListNBT;
import net.minecraft.tileentity.ITickableTileEntity;
@ -29,101 +29,26 @@ import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandlerModifiable;
import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.items.ItemStackHandler;
import net.minecraftforge.items.wrapper.CombinedInvWrapper;
import net.minecraftforge.items.wrapper.RecipeWrapper;
public class BasinTileEntity extends SmartTileEntity implements ITickableTileEntity {
public boolean contentsChanged;
public BasinInputInventory inputInventory;
protected SmartInventory outputInventory;
protected LazyOptional<IItemHandlerModifiable> itemCapability;
protected LazyOptional<CombinedFluidHandler> fluidCapability;
private boolean contentsChanged;
private FilteringBehaviour filtering;
protected ItemStackHandler outputItemInventory = new ItemStackHandler(9) {
protected void onContentsChanged(int slot) {
sendData();
markDirty();
}
};
public class BasinInputInventory extends RecipeWrapper {
public BasinInputInventory() {
super(inputItemInventory);
}
}
protected ItemStackHandler inputItemInventory = new ItemStackHandler(9) {
protected void onContentsChanged(int slot) {
contentsChanged = true;
sendData();
markDirty();
}
@Nonnull
public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) {
for (int i = 0; i < getSlots(); i++) {
ItemStack stackInSlot = getStackInSlot(i);
if (ItemHandlerHelper.canItemStacksStack(stack, stackInSlot))
if (stackInSlot.getCount() == getStackLimit(i, stackInSlot))
return stack;
}
return super.insertItem(slot, stack, simulate);
}
};
public static class BasinInventory extends CombinedInvWrapper {
public BasinInventory(ItemStackHandler input, ItemStackHandler output) {
super(input, output);
}
@Nonnull
@Override
public ItemStack extractItem(int slot, int amount, boolean simulate) {
if (isInput(slot))
return ItemStack.EMPTY;
return super.extractItem(slot, amount, simulate);
}
@Nonnull
@Override
public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) {
if (!isInput(slot))
return stack;
return super.insertItem(slot, stack, simulate);
}
public boolean isInput(int slot) {
return getIndexForSlot(slot) == 0;
}
public IItemHandlerModifiable getInputHandler() {
return itemHandler[0];
}
public IItemHandlerModifiable getOutputHandler() {
return itemHandler[1];
}
}
@Override
@OnlyIn(Dist.CLIENT)
public double getMaxRenderDistanceSquared() {
return 256;
}
protected LazyOptional<IItemHandlerModifiable> inventory =
LazyOptional.of(() -> new BasinInventory(inputItemInventory, outputItemInventory));
protected LazyOptional<CombinedFluidHandler> fluidInventory =
LazyOptional.of(() -> new CombinedFluidHandler(9, 1000));
public BasinInputInventory recipeInventory;
public BasinTileEntity(TileEntityType<? extends BasinTileEntity> type) {
super(type);
inputInventory = new BasinInputInventory(9, this);
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;
recipeInventory = new BasinInputInventory();
}
@Override
@ -138,19 +63,19 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt
@Override
protected void read(CompoundNBT compound, boolean clientPacket) {
super.read(compound, clientPacket);
inputItemInventory.deserializeNBT(compound.getCompound("InputItems"));
outputItemInventory.deserializeNBT(compound.getCompound("OutputItems"));
inputInventory.deserializeNBT(compound.getCompound("InputItems"));
outputInventory.deserializeNBT(compound.getCompound("OutputItems"));
if (compound.contains("fluids"))
fluidInventory
fluidCapability
.ifPresent(combinedFluidHandler -> combinedFluidHandler.readFromNBT(compound.getList("fluids", 10)));
}
@Override
public void write(CompoundNBT compound, boolean clientPacket) {
super.write(compound, clientPacket);
compound.put("InputItems", inputItemInventory.serializeNBT());
compound.put("OutputItems", outputItemInventory.serializeNBT());
fluidInventory.ifPresent(combinedFuidHandler -> {
compound.put("InputItems", inputInventory.serializeNBT());
compound.put("OutputItems", outputInventory.serializeNBT());
fluidCapability.ifPresent(combinedFuidHandler -> {
ListNBT nbt = combinedFuidHandler.getListNBT();
compound.put("fluids", nbt);
});
@ -163,8 +88,8 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt
@Override
public void remove() {
onEmptied();
inventory.invalidate();
fluidInventory.invalidate();
itemCapability.invalidate();
fluidCapability.invalidate();
super.remove();
}
@ -172,9 +97,9 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt
@Override
public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, Direction side) {
if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY)
return inventory.cast();
return itemCapability.cast();
if (cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY)
return fluidInventory.cast();
return fluidCapability.cast();
return super.getCapability(cap, side);
}
@ -199,6 +124,24 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt
return filtering;
}
public void notifyChangeOfContents() {
contentsChanged = true;
}
public SmartInventory getInputInventory() {
return inputInventory;
}
public SmartInventory getOutputInventory() {
return outputInventory;
}
@Override
@OnlyIn(Dist.CLIENT)
public double getMaxRenderDistanceSquared() {
return 256;
}
class BasinValueBox extends ValueBoxTransform.Sided {
@Override

View file

@ -5,7 +5,7 @@ import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock;
import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InsertingBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour;
import net.minecraft.block.BlockState;
import net.minecraft.item.ItemStack;
@ -49,7 +49,7 @@ public class BeltFunnelInteractionHandler {
return true;
FunnelTileEntity funnelTE = (FunnelTileEntity) te;
InsertingBehaviour inserting = TileEntityBehaviour.get(funnelTE, InsertingBehaviour.TYPE);
InvManipulationBehaviour inserting = TileEntityBehaviour.get(funnelTE, InvManipulationBehaviour.TYPE);
FilteringBehaviour filtering = TileEntityBehaviour.get(funnelTE, FilteringBehaviour.TYPE);
if (inserting == null)
@ -58,7 +58,7 @@ public class BeltFunnelInteractionHandler {
return true;
ItemStack before = currentItem.stack.copy();
ItemStack remainder = inserting.insert(before, false);
ItemStack remainder = inserting.insert(before);
if (before.equals(remainder, false))
return true;

View file

@ -1,124 +0,0 @@
package com.simibubi.create.content.logistics.block;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.relays.belt.BeltBlock;
import com.simibubi.create.content.contraptions.wrench.IWrenchable;
import com.simibubi.create.content.logistics.block.transposer.TransposerBlock;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.HorizontalBlock;
import net.minecraft.block.material.PushReaction;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.BlockItemUseContext;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemUseContext;
import net.minecraft.state.BooleanProperty;
import net.minecraft.state.StateContainer.Builder;
import net.minecraft.util.ActionResultType;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorldReader;
import net.minecraft.world.World;
public abstract class AttachedLogisticalBlock extends HorizontalBlock implements IWrenchable {
public static final BooleanProperty UPWARD = BooleanProperty.create("upward");
public AttachedLogisticalBlock(Properties properties) {
super(properties);
}
@Override
public ActionResultType onWrenched(BlockState state, ItemUseContext context) {
return ActionResultType.FAIL;
}
protected abstract boolean isVertical();
protected abstract BlockState getVerticalDefaultState();
protected abstract BlockState getHorizontalDefaultState();
@Override
public BlockState getStateForPlacement(BlockItemUseContext context) {
BlockState state = getDefaultState();
if (context.getFace().getAxis().isHorizontal()) {
state = state.with(HORIZONTAL_FACING, context.getFace().getOpposite());
} else {
state = getVerticalDefaultState();
state = state.with(UPWARD, context.getFace() != Direction.UP);
state = state.with(HORIZONTAL_FACING, context.getPlacementHorizontalFacing());
}
return state;
}
@Override
public ItemStack getPickBlock(BlockState state, RayTraceResult target, IBlockReader world, BlockPos pos,
PlayerEntity player) {
if (isVertical())
return getHorizontalDefaultState().getBlock().getPickBlock(state, target, world, pos, player);
return super.getPickBlock(state, target, world, pos, player);
}
@Override
public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) {
Direction facing = getBlockFacing(state);
return canAttachToSide(worldIn, pos, facing);
}
protected boolean canAttachToSide(IWorldReader worldIn, BlockPos pos, Direction facing) {
BlockPos neighbourPos = pos.offset(facing);
BlockState neighbour = worldIn.getBlockState(neighbourPos);
if (neighbour.getBlock() instanceof TransposerBlock)
return false;
if (AllBlocks.BELT.has(neighbour))
return BeltBlock.canAccessFromSide(facing, neighbour);
return !neighbour.getShape(worldIn, pos).isEmpty();
}
@Override
public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos,
boolean isMoving) {
if (worldIn.isRemote)
return;
Direction blockFacing = getBlockFacing(state);
if (fromPos.equals(pos.offset(blockFacing))) {
if (!isValidPosition(state, worldIn, pos)) {
worldIn.destroyBlock(pos, true);
return;
}
}
}
public static Direction getBlockFacing(BlockState state) {
if (isVertical(state))
return state.get(UPWARD) ? Direction.UP : Direction.DOWN;
return state.get(HORIZONTAL_FACING);
}
@Override
protected void fillStateContainer(Builder<Block, BlockState> builder) {
if (isVertical())
builder.add(UPWARD);
super.fillStateContainer(builder.add(HORIZONTAL_FACING));
}
public static boolean isVertical(BlockState state) {
Block block = state.getBlock();
return ((block instanceof AttachedLogisticalBlock)
&& (((AttachedLogisticalBlock) state.getBlock())).isVertical());
}
@Override
public PushReaction getPushReaction(BlockState state) {
return PushReaction.BLOCK;
}
}

View file

@ -1,25 +0,0 @@
package com.simibubi.create.content.logistics.block.belts;
import com.simibubi.create.content.logistics.block.AttachedLogisticalBlock;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
public abstract class BeltAttachableLogisticalBlock extends AttachedLogisticalBlock {
public BeltAttachableLogisticalBlock(Properties properties) {
super(properties);
}
@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);
}
}
}

View file

@ -5,15 +5,17 @@ import java.util.List;
import javax.annotation.Nullable;
import com.google.common.base.Predicates;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.components.fan.EncasedFanBlock;
import com.simibubi.create.content.contraptions.components.fan.EncasedFanTileEntity;
import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation;
import com.simibubi.create.content.logistics.block.chute.ChuteBlock.Shape;
import com.simibubi.create.content.logistics.block.funnel.BrassFunnelBlock;
import com.simibubi.create.content.logistics.block.funnel.ChuteFunnelBlock;
import com.simibubi.create.content.logistics.block.funnel.FunnelBlock;
import com.simibubi.create.foundation.gui.widgets.InterpolatedValue;
import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.item.ItemHelper.ExtractionCountMode;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour;
@ -39,6 +41,7 @@ import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemHandlerHelper;
public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInformation {
@ -51,6 +54,9 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor
LazyOptional<IItemHandler> lazyHandler;
boolean canPickUpItems;
LazyOptional<IItemHandler> capAbove;
LazyOptional<IItemHandler> capBelow;
public ChuteTileEntity(TileEntityType<?> tileEntityTypeIn) {
super(tileEntityTypeIn);
item = ItemStack.EMPTY;
@ -58,6 +64,8 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor
itemHandler = new ChuteItemHandler(this);
lazyHandler = LazyOptional.of(() -> itemHandler);
canPickUpItems = false;
capAbove = LazyOptional.empty();
capBelow = LazyOptional.empty();
}
@Override
@ -79,7 +87,8 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor
return false;
if (getItemMotion() > 0 && getInputChutes().isEmpty())
return false;
return blockState.get(ChuteBlock.FACING) == Direction.DOWN || blockState.get(ChuteBlock.SHAPE) == Shape.INTERSECTION;
return blockState.get(ChuteBlock.FACING) == Direction.DOWN
|| blockState.get(ChuteBlock.SHAPE) == Shape.INTERSECTION;
}
@Override
@ -91,17 +100,22 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor
public void tick() {
super.tick();
canPickUpItems = canDirectlyInsert();
if (item.isEmpty())
return;
float itemMotion = getItemMotion();
if (item.isEmpty()) {
if (itemMotion < 0)
handleInputFromAbove();
if (itemMotion > 0)
handleInputFromBelow();
return;
}
float nextOffset = itemPosition.value + itemMotion;
if (itemMotion < 0) {
if (nextOffset < .5f) {
if (handleSideOutput())
return;
boolean success = handleDownwardOutput(true);
if (!success)
if (!handleDownwardOutput(true))
nextOffset = .5f;
else if (nextOffset < 0) {
handleDownwardOutput(world.isRemote);
@ -112,10 +126,7 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor
if (itemMotion > 0) {
if (nextOffset > .5f) {
if (handleSideOutput())
return;
boolean success = handleUpwardOutput(true);
if (!success)
if (!handleUpwardOutput(true))
nextOffset = .5f;
else if (nextOffset > 1) {
handleUpwardOutput(world.isRemote);
@ -127,6 +138,22 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor
itemPosition.set(nextOffset);
}
private void handleInputFromAbove() {
if (!capAbove.isPresent())
capAbove = grabCapability(Direction.UP);
if (capAbove.isPresent())
item =
ItemHelper.extract(capAbove.orElse(null), Predicates.alwaysTrue(), ExtractionCountMode.UPTO, 16, false);
}
private void handleInputFromBelow() {
if (!capBelow.isPresent())
capBelow = grabCapability(Direction.DOWN);
if (capBelow.isPresent())
item =
ItemHelper.extract(capBelow.orElse(null), Predicates.alwaysTrue(), ExtractionCountMode.UPTO, 16, false);
}
private boolean handleDownwardOutput(boolean simulate) {
BlockState blockState = getBlockState();
ChuteTileEntity targetChute = getTargetChute(blockState);
@ -169,6 +196,15 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor
return remainder.isEmpty();
}
if (!capBelow.isPresent())
capBelow = grabCapability(Direction.DOWN);
if (capBelow.isPresent()) {
ItemStack remainder = ItemHandlerHelper.insertItemStacked(capBelow.orElse(null), item, simulate);
if (!simulate)
setItem(ItemStack.EMPTY);
return remainder.isEmpty();
}
if (Block.hasSolidSideOnTop(world, pos.down()))
return false;
@ -220,6 +256,15 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor
return true;
}
if (!capAbove.isPresent())
capAbove = grabCapability(Direction.UP);
if (capAbove.isPresent()) {
ItemStack remainder = ItemHandlerHelper.insertItemStacked(capAbove.orElse(null), item, simulate);
if (!simulate)
setItem(ItemStack.EMPTY);
return remainder.isEmpty();
}
if (Block.hasSolidSide(stateAbove, world, pos.up(), Direction.DOWN))
return false;
if (!inputChutes.isEmpty())
@ -237,25 +282,12 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor
return true;
}
private boolean handleSideOutput() {
if (world.isRemote)
return false;
for (Direction direction : Iterate.horizontalDirections) {
BlockPos funnelPos = pos.offset(direction);
BlockState funnelState = world.getBlockState(funnelPos);
if (AllBlocks.BRASS_CHUTE_FUNNEL.has(funnelState)) {
if (funnelState.get(ChuteFunnelBlock.POWERED))
continue;
if (funnelState.get(ChuteFunnelBlock.HORIZONTAL_FACING) != direction.getOpposite())
continue;
if (funnelState.get(ChuteFunnelBlock.PUSHING))
continue;
ItemStack remainder = FunnelBlock.tryInsert(world, funnelPos, item.copy(), world.isRemote);
if (remainder.getCount() != item.getCount() && !world.isRemote)
setItem(remainder);
}
}
return item.isEmpty();
private LazyOptional<IItemHandler> grabCapability(Direction side) {
BlockPos pos = this.pos.offset(side);
TileEntity te = world.getTileEntity(pos);
if (te == null || te instanceof ChuteTileEntity)
return LazyOptional.empty();
return te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side.getOpposite());
}
public void setItem(ItemStack stack) {
@ -319,7 +351,7 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor
List<ChuteTileEntity> inputChutes = getInputChutes();
if (!item.isEmpty())
InventoryHelper.spawnItemStack(world, pos.getX(), pos.getY(), pos.getZ(), item);
super.remove();
remove();
if (targetChute != null) {
targetChute.updatePull();
targetChute.propagatePush();

View file

@ -1,127 +0,0 @@
package com.simibubi.create.content.logistics.block.extractor;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllShapes;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.logistics.block.AttachedLogisticalBlock;
import com.simibubi.create.content.logistics.block.belts.BeltAttachableLogisticalBlock;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.item.BlockItemUseContext;
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.Axis;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.World;
public class ExtractorBlock extends BeltAttachableLogisticalBlock {
public static BooleanProperty POWERED = BlockStateProperties.POWERED;
public ExtractorBlock(Properties properties) {
super(properties);
setDefaultState(getDefaultState().with(POWERED, false));
}
@Override
protected boolean isVertical() {
return false;
}
@Override
protected BlockState getVerticalDefaultState() {
return AllBlocks.VERTICAL_EXTRACTOR.getDefaultState();
}
@Override
protected BlockState getHorizontalDefaultState() {
return AllBlocks.EXTRACTOR.getDefaultState();
}
@Override
protected void fillStateContainer(Builder<Block, BlockState> builder) {
super.fillStateContainer(builder.add(POWERED));
}
@Override
public boolean hasTileEntity(BlockState state) {
return true;
}
@Override
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
return AllTileEntities.EXTRACTOR.create();
}
@Override
public BlockState getStateForPlacement(BlockItemUseContext context) {
return super.getStateForPlacement(context).with(POWERED, reactsToRedstone() && context.getWorld()
.isBlockPowered(context.getPos()));
}
@Override
public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos,
boolean isMoving) {
super.neighborChanged(state, worldIn, pos, blockIn, fromPos, isMoving);
if (worldIn.isRemote)
return;
if (!reactsToRedstone())
return;
boolean previouslyPowered = state.get(POWERED);
if (previouslyPowered != worldIn.isBlockPowered(pos))
worldIn.setBlockState(pos, state.cycle(POWERED), 2);
}
protected boolean reactsToRedstone() {
return true;
}
@Override
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
return AllShapes.EXTRACTOR.get(getBlockFacing(state));
}
public static Vec3d getFilterSlotPosition(BlockState state) {
float verticalOffset = (state.getBlock() instanceof ExtractorBlock) ? 10.5f : 12.5f;
Vec3d offsetForHorizontal = VecHelper.voxelSpace(8f, verticalOffset, 14f);
Vec3d offsetForUpward = VecHelper.voxelSpace(8f, 14.15f, 3.5f);
Vec3d offsetForDownward = VecHelper.voxelSpace(8f, 1.85f, 3.5f);
Vec3d vec = offsetForHorizontal;
float yRot = AngleHelper.horizontalAngle(state.get(ExtractorBlock.HORIZONTAL_FACING));
if (AttachedLogisticalBlock.isVertical(state))
vec = state.get(AttachedLogisticalBlock.UPWARD) ? offsetForUpward : offsetForDownward;
return VecHelper.rotateCentered(vec, yRot, Axis.Y);
}
public static Vec3d getFilterSlotOrientation(BlockState state) {
float yRot = AngleHelper.horizontalAngle(state.get(ExtractorBlock.HORIZONTAL_FACING));
float zRot = (AttachedLogisticalBlock.isVertical(state)) ? 0 : 90;
return new Vec3d(0, yRot, zRot);
}
public static class Vertical extends ExtractorBlock {
public Vertical(Properties properties) {
super(properties);
}
@Override
protected boolean isVertical() {
return true;
}
}
}

View file

@ -1,65 +0,0 @@
package com.simibubi.create.content.logistics.block.extractor;
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.AttachedLogisticalBlock;
import com.simibubi.create.content.logistics.item.filter.FilterItem;
import com.simibubi.create.foundation.item.ItemHelper;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Direction;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvents;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.World;
public class ExtractorMovementBehaviour extends MovementBehaviour {
@Override
public void visitNewPosition(MovementContext context, BlockPos pos) {
super.visitNewPosition(context, pos);
World world = context.world;
VoxelShape collisionShape = world.getBlockState(pos).getCollisionShape(world, pos);
if (!collisionShape.isEmpty())
return;
if (!world.getEntitiesWithinAABB(ItemEntity.class, new AxisAlignedBB(pos)).isEmpty())
return;
ItemStack filter = getFilter(context);
int amount = getFilterAmount(context);
ItemStack dropped = ItemHelper.extract(context.contraption.inventory,
stack -> FilterItem.test(context.world, stack, filter), amount == 0 ? 64 : amount, false);
if (dropped.isEmpty())
return;
if (world.isRemote)
return;
Vec3d entityPos = context.position;
Entity entityIn = null;
Direction facing = AttachedLogisticalBlock.getBlockFacing(context.state);
if (facing != Direction.DOWN)
entityPos = entityPos.add(0, -0.5f, 0);
entityIn = new ItemEntity(world, entityPos.x, entityPos.y, entityPos.z, dropped);
entityIn.setMotion(Vec3d.ZERO);
((ItemEntity) entityIn).setPickupDelay(5);
world.playSound(null, pos, SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.BLOCKS, 1/16f, .1f);
world.addEntity(entityIn);
}
private ItemStack getFilter(MovementContext context) {
return ItemStack.read(context.tileData.getCompound("Filter"));
}
private int getFilterAmount(MovementContext context) {
return context.tileData.getInt("FilterAmount");
}
}

View file

@ -1,88 +0,0 @@
package com.simibubi.create.content.logistics.block.extractor;
import static net.minecraft.block.HorizontalBlock.HORIZONTAL_FACING;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.content.logistics.block.AttachedLogisticalBlock;
import com.simibubi.create.content.logistics.block.transposer.TransposerBlock;
import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.MatrixStacker;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.block.BlockState;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.Vec3d;
public class ExtractorSlots {
static class Filter extends ValueBoxTransform {
Vec3d offsetForHorizontal = VecHelper.voxelSpace(8f, 10.5f, 14f);
Vec3d offsetForUpward = VecHelper.voxelSpace(8f, 14.15f, 3.5f);
Vec3d offsetForDownward = VecHelper.voxelSpace(8f, 1.85f, 3.5f);
@Override
protected Vec3d getLocalOffset(BlockState state) {
Vec3d location = offsetForHorizontal;
if (state.getBlock() instanceof TransposerBlock)
location = location.add(0, 2 / 16f, 0);
if (AttachedLogisticalBlock.isVertical(state))
location = state.get(AttachedLogisticalBlock.UPWARD) ? offsetForUpward : offsetForDownward;
return rotateHorizontally(state, location);
}
@Override
protected void rotate(BlockState state, MatrixStack ms) {
float yRot = AngleHelper.horizontalAngle(state.get(HORIZONTAL_FACING));
float xRot = (AttachedLogisticalBlock.isVertical(state)) ? 0 : 90;
MatrixStacker.of(ms)
.rotateY(yRot)
.rotateX(xRot);
}
}
public static class Link extends ValueBoxTransform.Dual {
public Link(boolean first) {
super(first);
}
Vec3d offsetForHorizontal = VecHelper.voxelSpace(11.5f, 4f, 14f);
Vec3d offsetForUpward = VecHelper.voxelSpace(10f, 14f, 11.5f);
Vec3d offsetForDownward = VecHelper.voxelSpace(10f, 2f, 11.5f);
@Override
protected Vec3d getLocalOffset(BlockState state) {
Vec3d location = offsetForHorizontal;
if (state.getBlock() instanceof TransposerBlock)
location = location.add(0, 2 / 16f, 0);
if (!isFirst())
location = location.add(0, 4 / 16f, 0);
if (AttachedLogisticalBlock.isVertical(state)) {
location = state.get(AttachedLogisticalBlock.UPWARD) ? offsetForUpward : offsetForDownward;
if (!isFirst())
location = location.add(-4 / 16f, 0, 0);
}
float yRot = AngleHelper.horizontalAngle(state.get(HORIZONTAL_FACING));
location = VecHelper.rotateCentered(location, yRot, Axis.Y);
return location;
}
@Override
protected void rotate(BlockState state, MatrixStack ms) {
float horizontalAngle = AngleHelper.horizontalAngle(state.get(HORIZONTAL_FACING));
boolean vertical = AttachedLogisticalBlock.isVertical(state);
float yRot = vertical ? horizontalAngle + 180 : horizontalAngle + 270;
float zRot = vertical ? (state.get(AttachedLogisticalBlock.UPWARD) ? 90 : 270) : 0;
MatrixStacker.of(ms)
.rotateY(yRot)
.rotateZ(zRot);
}
}
}

View file

@ -1,133 +0,0 @@
package com.simibubi.create.content.logistics.block.extractor;
import java.util.List;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity;
import com.simibubi.create.content.contraptions.relays.belt.transport.BeltInventory;
import com.simibubi.create.content.logistics.block.AttachedLogisticalBlock;
import com.simibubi.create.foundation.config.AllConfigs;
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.AutoExtractingBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.inventory.ExtractingBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.inventory.SingleTargetAutoExtractingBehaviour;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvents;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.Vec3d;
public class ExtractorTileEntity extends SmartTileEntity {
protected ExtractingBehaviour extracting;
protected FilteringBehaviour filtering;
protected boolean extractingToBelt;
public ExtractorTileEntity(TileEntityType<?> tileEntityTypeIn) {
super(tileEntityTypeIn);
}
@Override
public void addBehaviours(List<TileEntityBehaviour> behaviours) {
int delay = AllConfigs.SERVER.logistics.extractorDelay.get();
extracting =
new SingleTargetAutoExtractingBehaviour(this, () -> AttachedLogisticalBlock.getBlockFacing(getBlockState()),
this::onExtract, delay).pauseWhen(this::isPowered).waitUntil(this::canExtract);
behaviours.add(extracting);
filtering = new FilteringBehaviour(this, new ExtractorSlots.Filter()).withCallback(this::filterChanged);
filtering.showCount();
behaviours.add(filtering);
}
protected void onExtract(ItemStack stack) {
if (AllBlocks.BELT.has(world.getBlockState(pos.down()))) {
TileEntity te = world.getTileEntity(pos.down());
if (te instanceof BeltTileEntity) {
if (((BeltTileEntity) te).tryInsertingFromSide(Direction.UP, stack, false))
return;
}
}
Vec3d entityPos = VecHelper.getCenterOf(getPos()).add(0, -0.5f, 0);
Entity entityIn = null;
Direction facing = AttachedLogisticalBlock.getBlockFacing(getBlockState());
if (facing == Direction.DOWN)
entityPos = entityPos.add(0, .5, 0);
entityIn = new ItemEntity(world, entityPos.x, entityPos.y, entityPos.z, stack);
entityIn.setMotion(Vec3d.ZERO);
((ItemEntity) entityIn).setPickupDelay(5);
world.playSound(null, getPos(), SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.BLOCKS, .125f, .1f);
world.addEntity(entityIn);
}
protected boolean isAttachedToBelt() {
Direction blockFacing = AttachedLogisticalBlock.getBlockFacing(getBlockState());
return AllBlocks.BELT.has(world.getBlockState(pos.offset(blockFacing)));
}
protected boolean isTargetingBelt() {
if (!AllBlocks.BELT.has(world.getBlockState(pos.down())))
return false;
TileEntity te = world.getTileEntity(pos.down());
if (te == null || !(te instanceof BeltTileEntity))
return false;
return ((KineticTileEntity) te).getSpeed() != 0;
}
protected boolean isPowered() {
return getBlockState().get(ExtractorBlock.POWERED);
}
private void filterChanged(ItemStack stack) {
}
protected boolean canExtract() {
if (AllBlocks.BELT.has(world.getBlockState(pos.down()))) {
TileEntity te = world.getTileEntity(pos.down());
if (te instanceof BeltTileEntity) {
BeltTileEntity belt = (BeltTileEntity) te;
if (belt.getSpeed() == 0)
return false;
BeltTileEntity controller = belt.getControllerTE();
if (controller != null) {
BeltInventory inventory = controller.getInventory();
if (inventory == null)
return false;
if (!inventory.canInsertAtFromSide(belt.index, Direction.UP))
return false;
}
}
return true;
}
List<Entity> entitiesWithinAABBExcludingEntity =
world.getEntitiesWithinAABB(ItemEntity.class, new AxisAlignedBB(getPos()));
return entitiesWithinAABBExcludingEntity.isEmpty();
}
@Override
public void tick() {
((AutoExtractingBehaviour) extracting).setTicking(!isAttachedToBelt());
super.tick();
boolean onBelt = isTargetingBelt();
if (extractingToBelt != onBelt) {
extractingToBelt = onBelt;
((AutoExtractingBehaviour) extracting)
.setDelay(onBelt ? 0 : AllConfigs.SERVER.logistics.extractorDelay.get());
}
}
}

View file

@ -1,88 +0,0 @@
package com.simibubi.create.content.logistics.block.extractor;
import org.apache.commons.lang3.tuple.Pair;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.logistics.block.AttachedLogisticalBlock;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.block.BlockState;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.IBlockReader;
public class LinkedExtractorBlock extends ExtractorBlock {
public LinkedExtractorBlock(Properties properties) {
super(properties);
}
@Override
protected BlockState getVerticalDefaultState() {
return AllBlocks.VERTICAL_LINKED_EXTRACTOR.getDefaultState();
}
@Override
protected BlockState getHorizontalDefaultState() {
return AllBlocks.LINKED_EXTRACTOR.getDefaultState();
}
@Override
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
return AllTileEntities.LINKED_EXTRACTOR.create();
}
@Override
protected boolean reactsToRedstone() {
return false;
}
public static Pair<Vec3d, Vec3d> getFrequencySlotPosition(BlockState state) {
float verticalOffset = (state.getBlock() instanceof ExtractorBlock) ? 4f : 6f;
Vec3d first = VecHelper.voxelSpace(11.5f, verticalOffset, 14f);
Vec3d second = VecHelper.voxelSpace(11.5f, 4f + verticalOffset, 14f);
Vec3d firstUpward = VecHelper.voxelSpace(10f, 14f, 11.5f);
Vec3d secondUpward = VecHelper.voxelSpace(6f, 14f, 11.5f);
Vec3d firstDownward = VecHelper.voxelSpace(10f, 2f, 11.5f);
Vec3d secondDownward = VecHelper.voxelSpace(6f, 2f, 11.5f);
float yRot = AngleHelper.horizontalAngle(state.get(ExtractorBlock.HORIZONTAL_FACING));
if (AttachedLogisticalBlock.isVertical(state)) {
Boolean up = state.get(AttachedLogisticalBlock.UPWARD);
first = up ? firstUpward : firstDownward;
second = up ? secondUpward : secondDownward;
}
first = VecHelper.rotateCentered(first, yRot, Axis.Y);
second = VecHelper.rotateCentered(second, yRot, Axis.Y);
return Pair.of(first, second);
}
public static Vec3d getFrequencySlotOrientation(BlockState state) {
boolean vertical = AttachedLogisticalBlock.isVertical(state);
float horizontalAngle = AngleHelper.horizontalAngle(state.get(ExtractorBlock.HORIZONTAL_FACING));
float xRot = vertical ? (state.get(UPWARD) ? 90 : 270) : 0;
float yRot = vertical ? horizontalAngle + 180 : horizontalAngle + 270;
float zRot = vertical ? 0 : 0;
return new Vec3d(xRot, yRot, zRot);
}
public static class Vertical extends LinkedExtractorBlock {
public Vertical(Properties properties) {
super(properties);
}
@Override
protected boolean isVertical() {
return true;
}
}
}

View file

@ -1,45 +0,0 @@
package com.simibubi.create.content.logistics.block.extractor;
import static net.minecraft.state.properties.BlockStateProperties.POWERED;
import java.util.List;
import org.apache.commons.lang3.tuple.Pair;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform;
import com.simibubi.create.foundation.tileEntity.behaviour.linked.LinkBehaviour;
import net.minecraft.tileentity.TileEntityType;
public class LinkedExtractorTileEntity extends ExtractorTileEntity {
public boolean receivedSignal;
public LinkBehaviour receiver;
public LinkedExtractorTileEntity(TileEntityType<? extends LinkedExtractorTileEntity> type) {
super(type);
}
@Override
public void addBehaviours(List<TileEntityBehaviour> behaviours) {
Pair<ValueBoxTransform, ValueBoxTransform> slots = ValueBoxTransform.Dual.makeSlots(ExtractorSlots.Link::new);
receiver = LinkBehaviour.receiver(this, slots, this::setSignal);
behaviours.add(receiver);
super.addBehaviours(behaviours);
}
public void setSignal(int powered) {
receivedSignal = powered > 0;
}
@Override
public void tick() {
super.tick();
if (world.isRemote)
return;
if (receivedSignal != getBlockState().get(POWERED))
world.setBlockState(pos, getBlockState().cycle(POWERED));
}
}

View file

@ -1,37 +0,0 @@
package com.simibubi.create.content.logistics.block.extractor;
import com.simibubi.create.foundation.data.AssetLookup;
import com.simibubi.create.foundation.data.SpecialBlockStateGen;
import com.tterrag.registrate.providers.DataGenContext;
import com.tterrag.registrate.providers.RegistrateBlockstateProvider;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraftforge.client.model.generators.ModelFile;
public class VerticalExtractorGenerator extends SpecialBlockStateGen {
private boolean linked;
public VerticalExtractorGenerator(boolean linked) {
this.linked = linked;
}
@Override
protected int getXRotation(BlockState state) {
return state.get(ExtractorBlock.Vertical.UPWARD) ? 180 : 0;
}
@Override
protected int getYRotation(BlockState state) {
return (state.get(ExtractorBlock.UPWARD) ? 0 : 180) + horizontalAngle(state.get(ExtractorBlock.HORIZONTAL_FACING));
}
@Override
public <T extends Block> ModelFile getModel(DataGenContext<Block, T> ctx, RegistrateBlockstateProvider prov,
BlockState state) {
return AssetLookup.forPowered(ctx, prov, "extractor/vertical" + (linked ? "_linked" : ""))
.apply(state);
}
}

View file

@ -1,16 +0,0 @@
package com.simibubi.create.content.logistics.block.funnel;
import com.simibubi.create.AllBlocks;
public class AndesiteChuteFunnelBlock extends ChuteFunnelBlock {
public AndesiteChuteFunnelBlock(Properties p_i48377_1_) {
super(AllBlocks.ANDESITE_FUNNEL, p_i48377_1_);
}
@Override
public boolean hasPoweredProperty() {
return false;
}
}

View file

@ -20,11 +20,4 @@ public class AndesiteFunnelBlock extends FunnelBlock {
.with(BeltFunnelBlock.HORIZONTAL_FACING, facing);
}
@Override
public BlockState getEquivalentChuteFunnel(IBlockReader world, BlockPos pos, BlockState state) {
Direction facing = state.get(FACING);
return AllBlocks.ANDESITE_CHUTE_FUNNEL.getDefaultState()
.with(ChuteFunnelBlock.HORIZONTAL_FACING, facing);
}
}

View file

@ -1,16 +0,0 @@
package com.simibubi.create.content.logistics.block.funnel;
import com.simibubi.create.AllBlocks;
public class BrassChuteFunnelBlock extends ChuteFunnelBlock {
public BrassChuteFunnelBlock(Properties p_i48377_1_) {
super(AllBlocks.BRASS_FUNNEL, p_i48377_1_);
}
@Override
public boolean hasPoweredProperty() {
return true;
}
}

View file

@ -56,12 +56,4 @@ public class BrassFunnelBlock extends FunnelBlock {
.with(POWERED, state.get(POWERED));
}
@Override
public BlockState getEquivalentChuteFunnel(IBlockReader world, BlockPos pos, BlockState state) {
Direction facing = state.get(FACING);
return AllBlocks.BRASS_CHUTE_FUNNEL.getDefaultState()
.with(ChuteFunnelBlock.HORIZONTAL_FACING, facing)
.with(POWERED, state.get(POWERED));
}
}

View file

@ -1,40 +0,0 @@
package com.simibubi.create.content.logistics.block.funnel;
import com.simibubi.create.AllShapes;
import com.simibubi.create.content.logistics.block.chute.ChuteBlock;
import com.tterrag.registrate.util.entry.BlockEntry;
import net.minecraft.block.BlockState;
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.IWorldReader;
public abstract class ChuteFunnelBlock extends HorizontalInteractionFunnelBlock {
public ChuteFunnelBlock(BlockEntry<? extends FunnelBlock> parent, Properties p_i48377_1_) {
super(parent, p_i48377_1_);
}
public static boolean isOnValidChute(BlockState state, IWorldReader world, BlockPos pos) {
Direction direction = state.get(HORIZONTAL_FACING);
if (world.getBlockState(pos.offset(direction))
.getBlock() instanceof ChuteBlock)
return true;
return false;
}
@Override
public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_,
ISelectionContext p_220053_4_) {
return AllShapes.CHUTE_FUNNEL.get(state.get(HORIZONTAL_FACING));
}
@Override
protected boolean canStillInteract(BlockState state, IWorldReader world, BlockPos pos) {
return isOnValidChute(state, world, pos);
}
}

View file

@ -1,45 +0,0 @@
package com.simibubi.create.content.logistics.block.funnel;
import com.simibubi.create.foundation.data.SpecialBlockStateGen;
import com.tterrag.registrate.providers.DataGenContext;
import com.tterrag.registrate.providers.RegistrateBlockstateProvider;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraftforge.client.model.generators.ModelFile;
public class ChuteFunnelGenerator extends SpecialBlockStateGen {
private String type;
public ChuteFunnelGenerator(String type) {
this.type = type;
}
@Override
protected int getXRotation(BlockState state) {
return 0;
}
@Override
protected int getYRotation(BlockState state) {
return horizontalAngle(state.get(BeltFunnelBlock.HORIZONTAL_FACING)) + 180;
}
@Override
public <T extends Block> ModelFile getModel(DataGenContext<Block, T> ctx, RegistrateBlockstateProvider prov,
BlockState state) {
boolean pushing = state.get(ChuteFunnelBlock.PUSHING);
boolean powered = state.has(ChuteFunnelBlock.POWERED) && state.get(ChuteFunnelBlock.POWERED);
String suffix = (pushing ? "push" : "pull") + (powered ? "_powered" : "");
String textureName = type + "_funnel_" + suffix;
String modelName = ctx.getName() + "_" + suffix;
return prov.models()
.withExistingParent(modelName, prov.modLoc("block/chute_funnel/block"))
.texture("particle", prov.modLoc("block/" + type + "_casing"))
.texture("3", prov.modLoc("block/" + textureName))
.texture("1_2", prov.modLoc("block/" + type + "_funnel_back"))
.texture("4", prov.modLoc("block/" + type + "_funnel_plating"));
}
}

View file

@ -10,7 +10,7 @@ import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.block.ProperDirectionalBlock;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InsertingBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.block.Block;
@ -106,13 +106,14 @@ public abstract class FunnelBlock extends ProperDirectionalBlock implements ITE<
public static ItemStack tryInsert(World worldIn, BlockPos pos, ItemStack toInsert, boolean simulate) {
FilteringBehaviour filter = TileEntityBehaviour.get(worldIn, pos, FilteringBehaviour.TYPE);
InsertingBehaviour inserter = TileEntityBehaviour.get(worldIn, pos, InsertingBehaviour.TYPE);
InvManipulationBehaviour inserter = TileEntityBehaviour.get(worldIn, pos, InvManipulationBehaviour.TYPE);
if (inserter == null)
return toInsert;
if (filter != null && !filter.test(toInsert))
return toInsert;
ItemStack remainder = inserter.insert(toInsert, simulate);
return remainder;
if (simulate)
inserter.simulate();
return inserter.insert(toInsert);
}
@Override
@ -148,22 +149,10 @@ public abstract class FunnelBlock extends ProperDirectionalBlock implements ITE<
if (BeltFunnelBlock.isOnValidBelt(equivalentFunnel, world, pos))
return BeltFunnelBlock.updateShape(equivalentFunnel, world, pos);
}
if (direction == facing) {
BlockState equivalentFunnel = getEquivalentChuteFunnel(null, null, state);
if (ChuteFunnelBlock.isOnValidChute(equivalentFunnel, world, pos))
return equivalentFunnel;
}
if (direction == facing.getOpposite()) {
BlockState equivalentFunnel = getEquivalentChuteFunnel(null, null, state);
if (ChuteFunnelBlock.isOnValidChute(equivalentFunnel, world, pos))
return equivalentFunnel;
}
}
return state;
}
public abstract BlockState getEquivalentChuteFunnel(IBlockReader world, BlockPos pos, BlockState state);
public abstract BlockState getEquivalentBeltFunnel(IBlockReader world, BlockPos pos, BlockState state);
@Override

View file

@ -33,11 +33,6 @@ public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided {
localOffset = VecHelper.rotateCentered(southLocation, AngleHelper.horizontalAngle(getSide()), Axis.Y);
}
if (AllBlocks.BRASS_CHUTE_FUNNEL.has(state)) {
Direction facing = state.get(ChuteFunnelBlock.HORIZONTAL_FACING);
localOffset = localOffset.subtract(new Vec3d(facing.getDirectionVec()).scale(2 / 16f));
}
return localOffset;
}

View file

@ -5,7 +5,6 @@ import net.minecraft.block.BlockState;
import net.minecraft.item.BlockItem;
import net.minecraft.item.BlockItemUseContext;
import net.minecraft.util.Direction;
import net.minecraft.util.Rotation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
@ -44,22 +43,10 @@ public class FunnelItem extends BlockItem {
FunnelBlock block = (FunnelBlock) getBlock();
Block beltFunnelBlock = block.getEquivalentBeltFunnel(world, pos, state)
.getBlock();
Block chuteFunnelBlock = block.getEquivalentChuteFunnel(world, pos, state)
.getBlock();
BlockState equivalentBeltFunnel = beltFunnelBlock.getStateForPlacement(ctx)
.with(BeltFunnelBlock.HORIZONTAL_FACING, direction);
BlockState equivalentChuteFunnel = chuteFunnelBlock.getStateForPlacement(ctx)
.with(ChuteFunnelBlock.HORIZONTAL_FACING, direction);
BlockState reversedChuteFunnel = equivalentChuteFunnel.rotate(Rotation.CLOCKWISE_180)
.cycle(ChuteFunnelBlock.PUSHING);
if (BeltFunnelBlock.isOnValidBelt(equivalentBeltFunnel, world, pos))
return BeltFunnelBlock.updateShape(equivalentBeltFunnel, world, pos);
if (ChuteFunnelBlock.isOnValidChute(equivalentChuteFunnel, world, pos))
return equivalentChuteFunnel;
if (ChuteFunnelBlock.isOnValidChute(reversedChuteFunnel, world, pos))
return reversedChuteFunnel;
return state;
}

View file

@ -1,13 +1,9 @@
package com.simibubi.create.content.logistics.block.funnel;
import java.util.List;
import java.util.function.Supplier;
import org.apache.commons.lang3.tuple.Pair;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack;
import com.simibubi.create.content.logistics.block.chute.ChuteTileEntity;
import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock.Shape;
import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
@ -16,31 +12,26 @@ import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputB
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.ExtractingBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InsertingBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InventoryManagementBehaviour.Attachments;
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.Direction;
import net.minecraft.util.math.BlockPos;
public class FunnelTileEntity extends SmartTileEntity {
private FilteringBehaviour filtering;
private InsertingBehaviour inserting;
private ExtractingBehaviour extracting;
private DirectBeltInputBehaviour beltInputBehaviour;
private InvManipulationBehaviour invManipulation;
int sendFlap;
InterpolatedChasingValue flap;
static enum Mode {
INVALID, PAUSED, COLLECT, BELT, CHUTE_SIDE, CHUTE_END
INVALID, PAUSED, COLLECT, BELT
}
public FunnelTileEntity(TileEntityType<?> tileEntityTypeIn) {
@ -58,14 +49,6 @@ public class FunnelTileEntity extends SmartTileEntity {
return Mode.PAUSED;
if (state.getBlock() instanceof BeltFunnelBlock)
return Mode.BELT;
if (state.getBlock() instanceof ChuteFunnelBlock)
return Mode.CHUTE_SIDE;
Direction facing = FunnelBlock.getFunnelFacing(state);
BlockState input = world.getBlockState(pos.offset(facing));
if (AllBlocks.CHUTE.has(input))
return Mode.CHUTE_END;
return Mode.COLLECT;
}
@ -77,39 +60,6 @@ public class FunnelTileEntity extends SmartTileEntity {
tickAsBeltFunnel();
if (world.isRemote)
return;
if (mode == Mode.CHUTE_SIDE)
tickAsHorizontalChuteFunnel();
if (mode == Mode.CHUTE_END)
tickAsVerticalChuteFunnel();
}
public void tickAsHorizontalChuteFunnel() {
if (!getBlockState().get(ChuteFunnelBlock.PUSHING))
return;
BlockPos chutePos = pos.offset(FunnelBlock.getFunnelFacing(getBlockState()));
TileEntity te = world.getTileEntity(chutePos);
if (!(te instanceof ChuteTileEntity))
return;
ChuteTileEntity chute = (ChuteTileEntity) te;
extracting.setCallback(stack -> chute.setItem(stack, .5f));
extracting.withAdditionalFilter(stack -> chute.getItem()
.isEmpty());
extracting.extract();
}
public void tickAsVerticalChuteFunnel() {
Direction funnelFacing = FunnelBlock.getFunnelFacing(getBlockState());
BlockPos chutePos = pos.offset(funnelFacing);
TileEntity te = world.getTileEntity(chutePos);
if (!(te instanceof ChuteTileEntity))
return;
ChuteTileEntity chute = (ChuteTileEntity) te;
if (chute.getItemMotion() > 0 != (funnelFacing == Direction.UP))
return;
extracting.setCallback(stack -> chute.setItem(stack));
extracting.withAdditionalFilter(stack -> chute.getItem()
.isEmpty());
extracting.extract();
}
public void tickAsBeltFunnel() {
@ -119,7 +69,8 @@ public class FunnelTileEntity extends SmartTileEntity {
if (world.isRemote)
return;
if (!blockState.get(BeltFunnelBlock.PUSHING)) {
Boolean pushing = blockState.get(BeltFunnelBlock.PUSHING);
if (!pushing) {
// Belts handle insertion from their side
if (AllBlocks.BELT.has(world.getBlockState(pos.down())))
return;
@ -138,14 +89,12 @@ public class FunnelTileEntity extends SmartTileEntity {
if (!inputBehaviour.canInsertFromSide(facing))
return;
extracting.setCallback(stack -> {
flap(false);
inputBehaviour.handleInsertion(stack, facing, false);
});
extracting.withAdditionalFilter(stack -> inputBehaviour.handleInsertion(stack, facing, true)
ItemStack stack = invManipulation.extract(-1, s -> inputBehaviour.handleInsertion(s, facing, true)
.isEmpty());
extracting.extract();
if (stack.isEmpty())
return;
flap(false);
inputBehaviour.handleInsertion(stack, facing, false);
}
private TransportedResult collectFromHandler(TransportedItemStack stack) {
@ -153,7 +102,7 @@ public class FunnelTileEntity extends SmartTileEntity {
ItemStack toInsert = stack.stack.copy();
if (!filtering.test(toInsert))
return ignore;
ItemStack remainder = inserting.insert(toInsert, false);
ItemStack remainder = invManipulation.insert(toInsert);
if (remainder.equals(stack.stack, false))
return ignore;
@ -168,26 +117,19 @@ public class FunnelTileEntity extends SmartTileEntity {
@Override
public void addBehaviours(List<TileEntityBehaviour> behaviours) {
Supplier<List<Pair<BlockPos, Direction>>> direction =
Attachments.toward(() -> FunnelBlock.getFunnelFacing(getBlockState())
.getOpposite());
inserting = new InsertingBehaviour(this, direction);
extracting = new ExtractingBehaviour(this, direction);
behaviours.add(inserting);
behaviours.add(extracting);
invManipulation = new InvManipulationBehaviour(this, InterfaceProvider.oppositeOfBlockFacing());
behaviours.add(invManipulation);
filtering = new FilteringBehaviour(this, new FunnelFilterSlotPositioning()).showCountWhen(() -> {
BlockState blockState = getBlockState();
return blockState.getBlock() instanceof HorizontalInteractionFunnelBlock
&& blockState.get(HorizontalInteractionFunnelBlock.PUSHING) || determineCurrentMode() == Mode.CHUTE_END;
&& blockState.get(HorizontalInteractionFunnelBlock.PUSHING);
});
filtering.onlyActiveWhen(this::supportsFiltering);
behaviours.add(filtering);
beltInputBehaviour = new DirectBeltInputBehaviour(this).onlyInsertWhen(this::supportsDirectBeltInput)
.setInsertionHandler(this::handleDirectBeltInput);
behaviours.add(beltInputBehaviour);
behaviours.add(new DirectBeltInputBehaviour(this).onlyInsertWhen(this::supportsDirectBeltInput)
.setInsertionHandler(this::handleDirectBeltInput));
}
private boolean supportsDirectBeltInput(Direction side) {
@ -207,7 +149,9 @@ public class FunnelTileEntity extends SmartTileEntity {
return inserted;
if (determineCurrentMode() == Mode.PAUSED)
return inserted;
return inserting.insert(inserted, simulate);
if (simulate)
invManipulation.simulate();
return invManipulation.insert(inserted);
}
public void flap(boolean inward) {

View file

@ -14,7 +14,7 @@ import com.simibubi.create.content.logistics.block.funnel.FunnelBlock;
import com.simibubi.create.foundation.advancement.AllTriggers;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InsertingBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour;
import com.simibubi.create.foundation.utility.NBTHelper;
import com.simibubi.create.foundation.utility.VecHelper;
@ -336,7 +336,7 @@ public abstract class ArmInteractionPoint {
@Override
ItemStack insert(World world, ItemStack stack, boolean simulate) {
FilteringBehaviour filtering = TileEntityBehaviour.get(world, pos, FilteringBehaviour.TYPE);
InsertingBehaviour inserter = TileEntityBehaviour.get(world, pos, InsertingBehaviour.TYPE);
InvManipulationBehaviour inserter = TileEntityBehaviour.get(world, pos, InvManipulationBehaviour.TYPE);
BlockState state = world.getBlockState(pos);
if (state.has(BlockStateProperties.POWERED) && state.get(BlockStateProperties.POWERED))
return stack;
@ -344,7 +344,9 @@ public abstract class ArmInteractionPoint {
return stack;
if (filtering != null && !filtering.test(stack))
return stack;
return inserter.insert(stack, simulate);
if (simulate)
inserter.simulate();
return inserter.insert(stack);
}
@Override

View file

@ -1,21 +0,0 @@
package com.simibubi.create.content.logistics.block.packager;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.base.HorizontalAxisKineticBlock;
import net.minecraft.block.BlockState;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.IBlockReader;
public class PackagerBlock extends HorizontalAxisKineticBlock {
public PackagerBlock(Properties properties) {
super(properties);
}
@Override
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
return AllTileEntities.PACKAGER.create();
}
}

View file

@ -1,33 +0,0 @@
package com.simibubi.create.content.logistics.block.packager;
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 net.minecraft.block.BlockState;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
public class PackagerRenderer extends KineticTileEntityRenderer {
public PackagerRenderer(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);
AllBlockPartials.PACKAGER_SEALER.renderOn(te.getBlockState())
.renderInto(ms, buffer.getBuffer(RenderType.getSolid()));
}
@Override
protected BlockState getRenderedBlockState(KineticTileEntity te) {
return shaft(te.getBlockState()
.get(PackagerBlock.HORIZONTAL_AXIS));
}
}

View file

@ -1,13 +0,0 @@
package com.simibubi.create.content.logistics.block.packager;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import net.minecraft.tileentity.TileEntityType;
public class PackagerTileEntity extends KineticTileEntity {
public PackagerTileEntity(TileEntityType<?> typeIn) {
super(typeIn);
}
}

View file

@ -1,47 +0,0 @@
package com.simibubi.create.content.logistics.block.transposer;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllTileEntities;
import net.minecraft.block.BlockState;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.IBlockReader;
public class LinkedTransposerBlock extends TransposerBlock {
public LinkedTransposerBlock(Properties properties) {
super(properties);
}
@Override
protected BlockState getVerticalDefaultState() {
return AllBlocks.VERTICAL_LINKED_TRANSPOSER.getDefaultState();
}
@Override
protected BlockState getHorizontalDefaultState() {
return AllBlocks.LINKED_TRANSPOSER.getDefaultState();
}
@Override
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
return AllTileEntities.LINKED_TRANSPOSER.create();
}
@Override
protected boolean reactsToRedstone() {
return false;
}
public static class Vertical extends LinkedTransposerBlock {
public Vertical(Properties properties) {
super(properties);
}
@Override
protected boolean isVertical() {
return true;
}
}
}

View file

@ -1,48 +0,0 @@
package com.simibubi.create.content.logistics.block.transposer;
import static net.minecraft.state.properties.BlockStateProperties.POWERED;
import java.util.List;
import org.apache.commons.lang3.tuple.Pair;
import com.simibubi.create.content.logistics.block.extractor.ExtractorSlots;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform;
import com.simibubi.create.foundation.tileEntity.behaviour.linked.LinkBehaviour;
import net.minecraft.tileentity.TileEntityType;
public class LinkedTransposerTileEntity extends TransposerTileEntity {
public boolean receivedSignal;
public LinkBehaviour receiver;
public LinkedTransposerTileEntity(TileEntityType<? extends LinkedTransposerTileEntity> type) {
super(type);
}
@Override
public void addBehaviours(List<TileEntityBehaviour> behaviours) {
Pair<ValueBoxTransform, ValueBoxTransform> slots = ValueBoxTransform.Dual.makeSlots(ExtractorSlots.Link::new);
receiver = LinkBehaviour.receiver(this, slots, this::setSignal);
behaviours.add(receiver);
super.addBehaviours(behaviours);
}
public void setSignal(int powered) {
receivedSignal = powered > 0;
}
@Override
public void tick() {
super.tick();
if (world.isRemote)
return;
if (receivedSignal != getBlockState().get(POWERED)) {
world.setBlockState(pos, getBlockState().cycle(POWERED));
return;
}
}
}

View file

@ -1,145 +0,0 @@
package com.simibubi.create.content.logistics.block.transposer;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllShapes;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.logistics.block.belts.BeltAttachableLogisticalBlock;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.item.BlockItemUseContext;
import net.minecraft.item.ItemUseContext;
import net.minecraft.nbt.CompoundNBT;
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.ActionResultType;
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.IWorldReader;
import net.minecraft.world.World;
public class TransposerBlock extends BeltAttachableLogisticalBlock {
public static BooleanProperty POWERED = BlockStateProperties.POWERED;
public TransposerBlock(Properties properties) {
super(properties);
setDefaultState(getDefaultState().with(POWERED, false));
}
@Override
public boolean hasTileEntity(BlockState state) {
return true;
}
@Override
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
return AllTileEntities.TRANSPOSER.create();
}
@Override
protected void fillStateContainer(Builder<Block, BlockState> builder) {
super.fillStateContainer(builder.add(POWERED));
}
@Override
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
return AllShapes.TRANSPOSER.get(getBlockFacing(state));
}
@Override
protected boolean isVertical() {
return false;
}
@Override
protected BlockState getVerticalDefaultState() {
return AllBlocks.VERTICAL_TRANSPOSER.getDefaultState();
}
@Override
protected BlockState getHorizontalDefaultState() {
return AllBlocks.TRANSPOSER.getDefaultState();
}
@Override
public ActionResultType onWrenched(BlockState state, ItemUseContext context) {
World world = context.getWorld();
if (world.isRemote)
return ActionResultType.SUCCESS;
Direction blockFacing = getBlockFacing(state);
BlockState newState = state;
if (blockFacing.getAxis()
.isHorizontal())
newState = state.with(HORIZONTAL_FACING, blockFacing.getOpposite());
else
newState = state.cycle(UPWARD);
BlockPos pos = context.getPos();
world.setBlockState(pos, newState);
TileEntity te = world.getTileEntity(pos);
if (te instanceof TransposerTileEntity) {
TransposerTileEntity transposer = (TransposerTileEntity) te;
CompoundNBT compound = new CompoundNBT();
transposer.write(compound);
world.removeTileEntity(pos);
world.setTileEntity(pos, TileEntity.create(compound));
}
return ActionResultType.SUCCESS;
}
@Override
public BlockState getStateForPlacement(BlockItemUseContext context) {
BlockState stateForPlacement = super.getStateForPlacement(context);
return stateForPlacement.with(POWERED, Boolean.valueOf(context.getWorld()
.isBlockPowered(context.getPos())));
}
@Override
public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos,
boolean isMoving) {
if (worldIn.isRemote)
return;
Direction blockFacing = getBlockFacing(state);
if (fromPos.equals(pos.offset(blockFacing)) || fromPos.equals(pos.offset(blockFacing.getOpposite()))) {
if (!isValidPosition(state, worldIn, pos)) {
worldIn.destroyBlock(pos, true);
return;
}
}
if (!reactsToRedstone())
return;
boolean previouslyPowered = state.get(POWERED);
if (previouslyPowered != worldIn.isBlockPowered(pos)) {
worldIn.setBlockState(pos, state.cycle(POWERED), 2);
}
}
@Override
public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) {
return true;
}
protected boolean reactsToRedstone() {
return true;
}
public static class Vertical extends TransposerBlock {
public Vertical(Properties properties) {
super(properties);
}
@Override
protected boolean isVertical() {
return true;
}
}
}

View file

@ -1,97 +0,0 @@
package com.simibubi.create.content.logistics.block.transposer;
import java.util.List;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity;
import com.simibubi.create.content.logistics.block.AttachedLogisticalBlock;
import com.simibubi.create.content.logistics.block.extractor.ExtractorTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InsertingBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InventoryManagementBehaviour.Attachments;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.items.ItemHandlerHelper;
public class TransposerTileEntity extends ExtractorTileEntity {
private InsertingBehaviour inserting;
public TransposerTileEntity(TileEntityType<?> tileEntityTypeIn) {
super(tileEntityTypeIn);
}
@Override
public void addBehaviours(List<TileEntityBehaviour> behaviours) {
super.addBehaviours(behaviours);
inserting = new InsertingBehaviour(this,
Attachments.toward(() -> AttachedLogisticalBlock.getBlockFacing(getBlockState()).getOpposite()));
behaviours.add(inserting);
applyFilteringCallbacks();
}
public void applyFilteringCallbacks() {
extracting.withAmountThreshold(this::amountToExtract).withAdditionalFilter(this::shouldExtract);
}
public void filterChanged(ItemStack stack) {
}
public int amountToExtract(ItemStack stack) {
ItemStack tester = stack.copy();
tester.setCount(64);
return 64 - inserting.insert(tester, true).getCount();
}
public boolean shouldExtract(ItemStack stack) {
if (isTargetingBelt()) {
Direction facing = AttachedLogisticalBlock.getBlockFacing(getBlockState()).getOpposite();
BlockPos targetPos = pos.offset(facing);
BeltTileEntity te = (BeltTileEntity) world.getTileEntity(targetPos);
return te.tryInsertingFromSide(facing, stack, true);
}
if (filtering.anyAmount())
return true;
return inserting.insert(stack, true).isEmpty();
}
@Override
protected boolean isTargetingBelt() {
BlockPos targetPos = pos.offset(AttachedLogisticalBlock.getBlockFacing(getBlockState()).getOpposite());
if (!AllBlocks.BELT.has(world.getBlockState(targetPos)))
return false;
TileEntity te = world.getTileEntity(targetPos);
if (te == null || !(te instanceof BeltTileEntity))
return false;
return ((KineticTileEntity) te).getSpeed() != 0;
}
@Override
protected boolean canExtract() {
return inserting.getInventory() != null;
}
@Override
public void onExtract(ItemStack stack) {
if (isTargetingBelt()) {
Direction facing = AttachedLogisticalBlock.getBlockFacing(getBlockState()).getOpposite();
BlockPos targetPos = pos.offset(facing);
BeltTileEntity te = (BeltTileEntity) world.getTileEntity(targetPos);
if (te.tryInsertingFromSide(facing, stack, false))
return;
}
ItemStack remainder = inserting.insert(stack, false);
if (!remainder.isEmpty())
remainder = ItemHandlerHelper.insertItemStacked(extracting.getInventory(), remainder, false);
if (!remainder.isEmpty())
super.onExtract(remainder);
}
}

View file

@ -1,38 +0,0 @@
package com.simibubi.create.content.logistics.block.transposer;
import com.simibubi.create.foundation.data.AssetLookup;
import com.simibubi.create.foundation.data.SpecialBlockStateGen;
import com.tterrag.registrate.providers.DataGenContext;
import com.tterrag.registrate.providers.RegistrateBlockstateProvider;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraftforge.client.model.generators.ModelFile;
public class VerticalTransposerGenerator extends SpecialBlockStateGen {
private boolean linked;
public VerticalTransposerGenerator(boolean linked) {
this.linked = linked;
}
@Override
protected int getXRotation(BlockState state) {
return state.get(TransposerBlock.Vertical.UPWARD) ? 270 : 90;
}
@Override
protected int getYRotation(BlockState state) {
return (state.get(TransposerBlock.Vertical.UPWARD) ? 180 : 0)
+ horizontalAngle(state.get(TransposerBlock.Vertical.HORIZONTAL_FACING));
}
@Override
public <T extends Block> ModelFile getModel(DataGenContext<Block, T> ctx, RegistrateBlockstateProvider prov,
BlockState state) {
return AssetLookup.forPowered(ctx, prov, "transposer/" + (linked ? "vertical_linked" : "block"))
.apply(state);
}
}

View file

@ -0,0 +1,121 @@
package com.simibubi.create.foundation.item;
import javax.annotation.Nonnull;
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<CompoundNBT> {
private boolean extractionAllowed;
private boolean insertionAllowed;
private int stackSize;
public SmartInventory(int slots, SyncedTileEntity te) {
super(new SyncedStackHandler(slots, te));
insertionAllowed = true;
extractionAllowed = true;
stackSize = 64;
}
public SmartInventory allowInsertion() {
insertionAllowed = true;
return this;
}
public SmartInventory allowExtraction() {
extractionAllowed = true;
return this;
}
public SmartInventory forbidInsertion() {
insertionAllowed = false;
return this;
}
public SmartInventory forbidExtraction() {
extractionAllowed = false;
return this;
}
public SmartInventory withMaxStackSize(int stackSize) {
this.stackSize = stackSize;
return this;
}
@Override
public int getSlots() {
return inv.getSlots();
}
@Override
public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) {
if (!insertionAllowed)
return stack;
return inv.insertItem(slot, stack, simulate);
}
@Override
public ItemStack extractItem(int slot, int amount, boolean simulate) {
if (!extractionAllowed)
return ItemStack.EMPTY;
return inv.extractItem(slot, amount, simulate);
}
@Override
public int getSlotLimit(int slot) {
return Math.min(inv.getSlotLimit(slot), stackSize);
}
@Override
public boolean isItemValid(int slot, ItemStack stack) {
return inv.isItemValid(slot, stack);
}
@Override
public void setStackInSlot(int slot, ItemStack stack) {
inv.setStackInSlot(slot, stack);
}
public int getStackLimit(int slot, @Nonnull ItemStack stack) {
return Math.min(getSlotLimit(slot), stack.getMaxStackSize());
}
@Override
public CompoundNBT serializeNBT() {
return getInv().serializeNBT();
}
@Override
public void deserializeNBT(CompoundNBT nbt) {
getInv().deserializeNBT(nbt);
}
private SyncedStackHandler getInv() {
return (SyncedStackHandler) inv;
}
private static class SyncedStackHandler extends ItemStackHandler {
private SyncedTileEntity te;
public SyncedStackHandler(int slots, SyncedTileEntity te) {
super(slots);
this.te = te;
}
@Override
protected void onContentsChanged(int slot) {
super.onContentsChanged(slot);
te.notifyUpdate();
}
}
}

View file

@ -55,4 +55,9 @@ public abstract class SyncedTileEntity extends TileEntity {
return write(tag);
}
public void notifyUpdate() {
markDirty();
sendData();
}
}

View file

@ -1,99 +0,0 @@
package com.simibubi.create.foundation.tileEntity.behaviour.inventory;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Supplier;
import org.apache.commons.lang3.tuple.Pair;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
public class AutoExtractingBehaviour extends ExtractingBehaviour {
public static BehaviourType<AutoExtractingBehaviour> TYPE = new BehaviourType<>();
private int delay;
private int timer;
Supplier<Boolean> shouldExtract;
Supplier<Boolean> shouldPause;
private boolean ticking;
public AutoExtractingBehaviour(SmartTileEntity te, Supplier<List<Pair<BlockPos, Direction>>> attachments,
Consumer<ItemStack> onExtract, int delay) {
super(te, attachments, onExtract);
shouldPause = () -> false;
shouldExtract = () -> true;
ticking = true;
this.delay = delay;
}
public AutoExtractingBehaviour pauseWhen(Supplier<Boolean> condition) {
shouldPause = condition;
return this;
}
public ExtractingBehaviour waitUntil(Supplier<Boolean> condition) {
this.shouldExtract = condition;
return this;
}
public void setDelay(int delay) {
this.delay = delay;
this.timer = delay;
}
@Override
public boolean extract(int amount) {
timer = delay;
return super.extract(amount);
}
@Override
public void tick() {
super.tick();
if (!ticking)
return;
if (getWorld().isRemote)
return;
if (getShouldPause().get()) {
timer = 0;
return;
}
if (timer > 0) {
timer--;
return;
}
if (!getShouldExtract().get())
return;
extract();
}
public void setTicking(boolean ticking) {
this.ticking = ticking;
}
@Override
public BehaviourType<?> getType() {
return TYPE;
}
public Supplier<Boolean> getShouldExtract() {
return shouldExtract;
}
public Supplier<Boolean> getShouldPause() {
return shouldPause;
}
}

View file

@ -1,105 +0,0 @@
package com.simibubi.create.foundation.tileEntity.behaviour.inventory;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
import org.apache.commons.lang3.tuple.Pair;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.items.IItemHandler;
public class ExtractingBehaviour extends InventoryManagementBehaviour {
public static BehaviourType<ExtractingBehaviour> TYPE = new BehaviourType<>();
private Function<ItemStack, Integer> customAmountFilter;
private Predicate<ItemStack> customFilter;
private Consumer<ItemStack> callback;
public ExtractingBehaviour(SmartTileEntity te, Supplier<List<Pair<BlockPos, Direction>>> attachments) {
this(te, attachments, item -> {
});
}
public ExtractingBehaviour(SmartTileEntity te, Supplier<List<Pair<BlockPos, Direction>>> attachments,
Consumer<ItemStack> onExtract) {
super(te, attachments);
customAmountFilter = stack -> 64;
customFilter = stack -> true;
setCallback(onExtract);
}
public ExtractingBehaviour withAmountThreshold(Function<ItemStack, Integer> filter) {
this.customAmountFilter = filter;
return this;
}
public ExtractingBehaviour withAdditionalFilter(Predicate<ItemStack> filter) {
this.customFilter = filter;
return this;
}
public boolean extract() {
return extract(getAmountToExtract());
}
public int getAmountToExtract() {
int amount = -1;
FilteringBehaviour filter = get(tileEntity, FilteringBehaviour.TYPE);
if (filter != null && !filter.anyAmount())
amount = filter.getAmount();
return amount;
}
public boolean extract(int exactAmount) {
if (getWorld().isRemote)
return false;
if (AllConfigs.SERVER.control.freezeExtractors.get())
return false;
Predicate<ItemStack> test = getFilterTest();
for (IItemHandler inv : getInventories()) {
ItemStack extract = ItemStack.EMPTY;
if (exactAmount != -1)
extract = ItemHelper.extract(inv, test, exactAmount, false);
else
extract = ItemHelper.extract(inv, test, customAmountFilter, false);
if (!extract.isEmpty()) {
callback.accept(extract);
return true;
}
}
return false;
}
public Predicate<ItemStack> getFilterTest() {
Predicate<ItemStack> test = customFilter;
FilteringBehaviour filter = get(tileEntity, FilteringBehaviour.TYPE);
if (filter != null)
test = customFilter.and(filter::test);
return test;
}
@Override
public BehaviourType<?> getType() {
return TYPE;
}
public void setCallback(Consumer<ItemStack> callback) {
this.callback = callback;
}
}

View file

@ -1,39 +0,0 @@
package com.simibubi.create.foundation.tileEntity.behaviour.inventory;
import java.util.List;
import java.util.function.Supplier;
import org.apache.commons.lang3.tuple.Pair;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemHandlerHelper;
public class InsertingBehaviour extends InventoryManagementBehaviour {
public static BehaviourType<InsertingBehaviour> TYPE = new BehaviourType<>();
public InsertingBehaviour(SmartTileEntity te, Supplier<List<Pair<BlockPos, Direction>>> attachments) {
super(te, attachments);
}
public ItemStack insert(ItemStack stack, boolean simulate) {
for (IItemHandler inv : getInventories()) {
stack = ItemHandlerHelper.insertItemStacked(inv, stack, simulate);
if (stack.isEmpty())
break;
}
return stack;
}
@Override
public BehaviourType<?> getType() {
return TYPE;
}
}

View file

@ -0,0 +1,169 @@
package com.simibubi.create.foundation.tileEntity.behaviour.inventory;
import java.util.function.Function;
import java.util.function.Predicate;
import com.google.common.base.Predicates;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.item.ItemHelper;
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.tileEntity.behaviour.filtering.FilteringBehaviour;
import com.simibubi.create.foundation.utility.BlockFace;
import net.minecraft.block.BlockState;
import net.minecraft.item.ItemStack;
import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemHandlerHelper;
public class InvManipulationBehaviour extends TileEntityBehaviour {
public static BehaviourType<InvManipulationBehaviour> TYPE = new BehaviourType<>();
private InterfaceProvider target;
private LazyOptional<IItemHandler> targetCapability;
private boolean simulateNext;
public InvManipulationBehaviour(SmartTileEntity te, InterfaceProvider target) {
super(te);
setLazyTickRate(40);
this.target = target;
this.targetCapability = LazyOptional.empty();
simulateNext = false;
}
/**
* Only simulate the upcoming operation
*/
public InvManipulationBehaviour simulate() {
simulateNext = true;
return this;
}
public boolean hasInventory() {
return targetCapability.isPresent();
}
public ItemStack extract() {
return extract(getAmountFromFilter());
}
public ItemStack extract(int amount) {
return extract(amount, Predicates.alwaysTrue());
}
public ItemStack extract(int amount, Predicate<ItemStack> filter) {
return extract(amount, filter, ItemStack::getMaxStackSize);
}
public ItemStack extract(int amount, Predicate<ItemStack> filter, Function<ItemStack, Integer> amountThreshold) {
boolean shouldSimulate = simulateNext;
simulateNext = false;
if (getWorld().isRemote)
return ItemStack.EMPTY;
if (AllConfigs.SERVER.control.freezeExtractors.get())
return ItemStack.EMPTY;
IItemHandler inventory = targetCapability.orElse(null);
if (inventory == null)
return ItemStack.EMPTY;
Predicate<ItemStack> test = getFilterTest(filter);
ItemStack extract = ItemStack.EMPTY;
if (amount != -1)
extract = ItemHelper.extract(inventory, test, amount, shouldSimulate);
else
extract = ItemHelper.extract(inventory, test, amountThreshold, shouldSimulate);
return extract;
}
public ItemStack insert(ItemStack stack) {
boolean shouldSimulate = simulateNext;
simulateNext = false;
IItemHandler inventory = targetCapability.orElse(null);
if (inventory == null)
return stack;
return ItemHandlerHelper.insertItemStacked(inventory, stack, shouldSimulate);
}
protected Predicate<ItemStack> getFilterTest(Predicate<ItemStack> customFilter) {
Predicate<ItemStack> test = customFilter;
FilteringBehaviour filter = get(tileEntity, FilteringBehaviour.TYPE);
if (filter != null)
test = customFilter.and(filter::test);
return test;
}
@Override
public void initialize() {
super.initialize();
findNewCapability();
}
protected void onHandlerInvalidated(LazyOptional<IItemHandler> handler) {
findNewCapability();
}
@Override
public void lazyTick() {
super.lazyTick();
if (!targetCapability.isPresent())
findNewCapability();
}
protected int getAmountFromFilter() {
int amount = -1;
FilteringBehaviour filter = get(tileEntity, FilteringBehaviour.TYPE);
if (filter != null && !filter.anyAmount())
amount = filter.getAmount();
return amount;
}
protected void findNewCapability() {
BlockFace targetBlockFace = target.getTarget(getWorld(), tileEntity.getPos(), tileEntity.getBlockState())
.getOpposite();
BlockPos pos = targetBlockFace.getPos();
World world = getWorld();
targetCapability = LazyOptional.empty();
if (!world.isBlockPresent(pos))
return;
TileEntity invTE = world.getTileEntity(pos);
if (invTE == null)
return;
targetCapability =
invTE.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, targetBlockFace.getFace());
if (targetCapability.isPresent())
targetCapability.addListener(this::onHandlerInvalidated);
}
@Override
public BehaviourType<?> getType() {
return TYPE;
}
@FunctionalInterface
public interface InterfaceProvider {
public static InterfaceProvider towardBlockFacing() {
return (w, p, s) -> new BlockFace(p, s.has(BlockStateProperties.FACING) ? s.get(BlockStateProperties.FACING)
: s.get(BlockStateProperties.HORIZONTAL_FACING));
}
public static InterfaceProvider oppositeOfBlockFacing() {
return (w, p, s) -> new BlockFace(p,
(s.has(BlockStateProperties.FACING) ? s.get(BlockStateProperties.FACING)
: s.get(BlockStateProperties.HORIZONTAL_FACING)).getOpposite());
}
public BlockFace getTarget(World world, BlockPos pos, BlockState blockState);
}
}

View file

@ -1,111 +0,0 @@
package com.simibubi.create.foundation.tileEntity.behaviour.inventory;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;
import org.apache.commons.lang3.tuple.Pair;
import com.google.common.collect.ImmutableList;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType;
import net.minecraft.block.BlockState;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler;
public class InventoryManagementBehaviour extends TileEntityBehaviour {
Map<Pair<BlockPos, Direction>, LazyOptional<IItemHandler>> inventories;
private Supplier<List<Pair<BlockPos, Direction>>> attachments;
private List<IItemHandler> activeHandlers;
public static BehaviourType<InventoryManagementBehaviour> TYPE = new BehaviourType<>();
public InventoryManagementBehaviour(SmartTileEntity te, Supplier<List<Pair<BlockPos, Direction>>> attachments) {
super(te);
this.attachments = attachments;
setLazyTickRate(20);
activeHandlers = new ArrayList<>();
inventories = new HashMap<>();
}
@Override
public void initialize() {
super.initialize();
attachments.get().forEach(offset -> inventories.put(offset, findInventory(offset)));
lazyTick();
}
@Override
public void lazyTick() {
super.lazyTick();
activeHandlers.clear();
for (Pair<BlockPos, Direction> pair : inventories.keySet()) {
LazyOptional<IItemHandler> lazyOptional = inventories.get(pair);
if (lazyOptional.isPresent()) {
activeHandlers.add(lazyOptional.orElse(null));
continue;
}
lazyOptional = findInventory(pair);
if (lazyOptional.isPresent())
activeHandlers.add(lazyOptional.orElse(null));
inventories.put(pair, lazyOptional);
}
}
public List<IItemHandler> getInventories() {
return activeHandlers;
}
public IItemHandler getInventory() {
if (activeHandlers.isEmpty())
return null;
return activeHandlers.get(0);
}
protected LazyOptional<IItemHandler> findInventory(Pair<BlockPos, Direction> offset) {
BlockPos invPos = tileEntity.getPos().add(offset.getKey());
World world = getWorld();
if (!world.isBlockPresent(invPos))
return LazyOptional.empty();
BlockState invState = world.getBlockState(invPos);
if (!invState.hasTileEntity())
return LazyOptional.empty();
TileEntity invTE = world.getTileEntity(invPos);
if (invTE == null)
return LazyOptional.empty();
LazyOptional<IItemHandler> inventory = invTE.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY,
offset.getValue());
if (inventory == null) {
return LazyOptional.empty();
}
return inventory;
}
@Override
public BehaviourType<?> getType() {
return TYPE;
}
public static class Attachments {
public static final Supplier<List<Pair<BlockPos, Direction>>> toward(Supplier<Direction> facing) {
return () -> ImmutableList
.of(Pair.of(new BlockPos(facing.get().getDirectionVec()), facing.get().getOpposite()));
};
}
}

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