Logistics' final stretch, Part II

- Belt observer -> Content observer
- Content observers can now monitor any inventory and funnel transactions
- Stockpile switches no longer only access slots exposed to a specific side of an inventory
- Stockpile switches can now take a filter
This commit is contained in:
simibubi 2020-09-20 21:34:36 +02:00
parent 990d80412e
commit aef451e3bf
80 changed files with 545 additions and 1188 deletions

View file

@ -20,7 +20,6 @@ a579c40c43dc2174afb66f42d00d0c4a0efaaeee assets/create/blockstates/andesite_bric
1d2d8081581e07d9be4b382aede4f2de4401cc6b assets/create/blockstates/andesite_tunnel.json
f9fa6aa530eb0891a74eadfbebc663172a57147a assets/create/blockstates/basin.json
f25693a9429f6337149ff24f27900dc4eb82a7c2 assets/create/blockstates/belt.json
40d10934934ea142d71fc6ce598b1455c3ad47b4 assets/create/blockstates/belt_observer.json
cf9045eb16e5299a1d917c4cb536289f49411276 assets/create/blockstates/birch_window.json
94a1a91403eb4b035fec48071e7fcae57a8a6abd assets/create/blockstates/birch_window_pane.json
58b07d2af6030342f0354f6d3fd0ee128d2d74b4 assets/create/blockstates/black_seat.json
@ -43,6 +42,7 @@ b59324f051f21d8ce1a48a08f4721a61a3c414d6 assets/create/blockstates/chute.json
4947c261310445fa55b92038326ac82967d192dd assets/create/blockstates/clockwork_bearing.json
1f33834c685e3243882acfe20183fe64dfa872be assets/create/blockstates/clutch.json
e5e3757e99c139d67b2a70288466d8a74d818841 assets/create/blockstates/cogwheel.json
36f54136a7756c97f71bc6b47ef4e8e575e72879 assets/create/blockstates/content_observer.json
f8eff64c75fc599e9a44a003f54ae9931cd8ce7c assets/create/blockstates/copper_block.json
cabf6b8c59eb0e3d56a0a5a856ca058bb3200882 assets/create/blockstates/copper_casing.json
3355a852cdc717e257ca19b3db836068964733e3 assets/create/blockstates/copper_ore.json
@ -349,17 +349,17 @@ c77b46d8b459e5c7cc495393546f3fcca8a1fa1d assets/create/blockstates/weathered_lim
a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.json
7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json
b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json
c87674f2935327f78657f1bb44b3b10b6697a548 assets/create/lang/en_ud.json
62a4c9e5454fd6e899495c95d6fddd020d472bc7 assets/create/lang/en_us.json
42081320880e3248cc1e7e667d38bb3be682790a assets/create/lang/unfinished/de_de.json
8fc3d8467436b5dd9221b0ed72b1a64bf83d0767 assets/create/lang/unfinished/fr_fr.json
a5125e0ca8bb93c7c4f11d49a80a155a7ea14b16 assets/create/lang/unfinished/it_it.json
b173b6500f8a675e266864310ab8e205721dbe12 assets/create/lang/unfinished/ja_jp.json
1af8e96a3129f8aac458b75eff69378a0cc9dd7d assets/create/lang/unfinished/ko_kr.json
343a4455ca0f29b2ae6ac439030c0dfde0e4c59b assets/create/lang/unfinished/nl_nl.json
d7bd8d85e3b8def1b4fe72da0a43845d1bb61c1c assets/create/lang/unfinished/pt_br.json
6e7fdb53ae3121e5575021bb224d1bfbe257c38b assets/create/lang/unfinished/ru_ru.json
1a3e1309d92024445dae821d25168dab74ff5cdd assets/create/lang/unfinished/zh_cn.json
5e8bf32d45aae9207aa4063803d073dda12fefc9 assets/create/lang/en_ud.json
a623a699b4b15b1793846f2981f5ddfcf5f70eaa assets/create/lang/en_us.json
20b98763fcc45b49d4f08c0567de1305ae2ca08b assets/create/lang/unfinished/de_de.json
49356dba136af4ba87c61adcec8a5e86ffed0d19 assets/create/lang/unfinished/fr_fr.json
7aeadfee8cf3f5037a892d20dc5ed5a73015822d assets/create/lang/unfinished/it_it.json
da24efa68279d5bd95c55210cc5ecb46f7b28550 assets/create/lang/unfinished/ja_jp.json
e391370d913d9ea71b061ead791e335c5fd5abe1 assets/create/lang/unfinished/ko_kr.json
920688bd6cfdbb4a3f3a35700868b5639f10bf2a assets/create/lang/unfinished/nl_nl.json
d57b0279090380d35f6f56a34864114b210d815c assets/create/lang/unfinished/pt_br.json
4f957b1130d5f2ae953d687d754417de0f62fd61 assets/create/lang/unfinished/ru_ru.json
c2198b6cee5fdba4049fd2166f6382e5bbaf6581 assets/create/lang/unfinished/zh_cn.json
846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json
1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json
1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json
@ -415,22 +415,6 @@ aaf2e4259bcfcedd3400e9acb2d64c0cf06f7fb1 assets/create/models/block/andesite_tun
c9aec5c30e6821c8f125202cad236afa48f6c358 assets/create/models/block/andesite_tunnel/t_left.json
1dcb8fe81a275ef8a49c04db021ad29abe8b38ae assets/create/models/block/andesite_tunnel/t_right.json
e2801a0c3fe8e1c2485291485b977f581fdc8b7c assets/create/models/block/andesite_tunnel/window.json
e8bfb63e0a4426f9d95cd111640169b218dead1b assets/create/models/block/belt_observer/detect.json
a2e63810eceb028484b193ddf4315e1811950dc8 assets/create/models/block/belt_observer/detect_belt.json
034c308d46def892e6638ac0b3374849a6a88a26 assets/create/models/block/belt_observer/detect_belt_powered.json
0bddcf5449e18abbc11e984f4b125141b14baaf7 assets/create/models/block/belt_observer/detect_powered.json
c521e51b557f4643027fe7a8ec9d4f6a4ade1279 assets/create/models/block/belt_observer/eject.json
79863633fc1fec21241650a5eb3203cf4d3fd210 assets/create/models/block/belt_observer/eject_belt.json
a6d8262629371113147f8b13986a6f72c51fc100 assets/create/models/block/belt_observer/eject_belt_powered.json
2dad3c6bd49c4b608ad7c30567bb3e5845c46cf8 assets/create/models/block/belt_observer/eject_powered.json
e1b801f2f37a78f18a787f4484f7b8ec57671c4f assets/create/models/block/belt_observer/pulse.json
fc6dd3e43af11ede6ef5d402d30715ebf69dac2e assets/create/models/block/belt_observer/pulse_belt.json
7d2490e4228ce4f0ee8875d5ac5fef92eea68015 assets/create/models/block/belt_observer/pulse_belt_powered.json
fa79580db6187c864bc8148a41987ecdd1eb03b7 assets/create/models/block/belt_observer/pulse_powered.json
4f14a279e486242a65b4d6dbcdfc33db9b71942b assets/create/models/block/belt_observer/split.json
670adf5eee3f7a4b99267bd837334be6a8173e4e assets/create/models/block/belt_observer/split_belt.json
819d3107908ce21220ad45b0ae3e1c92c13c601d assets/create/models/block/belt_observer/split_belt_powered.json
76078947044ca9fc7860708ae9717a0ae47ebb1e assets/create/models/block/belt_observer/split_powered.json
87f90e8256060683b834d57d3c11248d5ea84e34 assets/create/models/block/birch_window.json
94317904054cbf651846716d8af3bca618d3130f assets/create/models/block/birch_window_pane_noside.json
7a4cae5b075c4ac96a3113afafa391d024fc117f assets/create/models/block/birch_window_pane_noside_alt.json
@ -1028,7 +1012,6 @@ b0f664dd6de3d0ee9afcb6223fbcd53b97fa0d65 assets/create/models/item/andesite_cobb
c0e35daccfb398947532e9499d6bda963387cd9c assets/create/models/item/andesite_tunnel.json
bf1fc6bdf7fca6f1958a2d3e96202c1cecb50669 assets/create/models/item/basin.json
1da382e7e58eaa9788f5b1d92221ccac573e068f assets/create/models/item/belt_connector.json
695a69d5854e2eb134b55d855bd2b7b18808a01d assets/create/models/item/belt_observer.json
9044243882cfd49a2827e1b910a4c9b0e46daa47 assets/create/models/item/birch_window.json
6ed49f59ea91068ef68720f43e67a9237594bdf0 assets/create/models/item/birch_window_pane.json
22632bd681c8a605f0845f7549770389a741156a assets/create/models/item/black_seat.json
@ -1054,6 +1037,7 @@ fe67c3f380d17735a9436a4579a8be1a02b8e4a0 assets/create/models/item/chute.json
b1531a7bd3f7f27b9587d13e818a93dc2d088bc8 assets/create/models/item/clockwork_bearing.json
0a2a0f0aafeab0088172f77afd40c1fa2cc1f2b8 assets/create/models/item/clutch.json
dcb09deae110077bcddf090996b51cc66e9a7de3 assets/create/models/item/cogwheel.json
7717e3b21cff39f497f07687c70c1fa40eaa756d assets/create/models/item/content_observer.json
965a90a882d85dba93b30af9bce7ecf8e68ce747 assets/create/models/item/copper_block.json
759bcb5fe7dfdd628716f9b4ff19a5ab00393381 assets/create/models/item/copper_casing.json
c5bcfba46f5824654dedaa2c5d5f42deb29e3baf assets/create/models/item/copper_ingot.json
@ -1540,9 +1524,9 @@ afc74c4dda92c4976703a1c488182188c3482839 data/create/advancements/recipes/create
4793d335955c9d6c293e1358dc227eac93a5fe61 data/create/advancements/recipes/create.base/crafting/logistics/adjustable_repeater.json
bbcf2a888e12c41aedf7b44a1b0d92b7b9fe853b data/create/advancements/recipes/create.base/crafting/logistics/andesite_funnel.json
b53ed0a286512d2695caf0430433483bdeeeef95 data/create/advancements/recipes/create.base/crafting/logistics/andesite_tunnel.json
678bdd68437274edf4630af1440525764be35dc6 data/create/advancements/recipes/create.base/crafting/logistics/belt_observer.json
66dbb3486c5d38d309dd480e3f2ab0eb5ff9e559 data/create/advancements/recipes/create.base/crafting/logistics/brass_funnel.json
2127c0f1d822cc88a24d98ebb9eead9de5837ffe data/create/advancements/recipes/create.base/crafting/logistics/brass_tunnel.json
ca9ad1e9129745c3d21af86bc795b5a65ba086a2 data/create/advancements/recipes/create.base/crafting/logistics/content_observer.json
b9b0a8bfff61a89149d4fcadf679f753385212d0 data/create/advancements/recipes/create.base/crafting/logistics/powered_latch.json
9951f2d35f7444c98c022142119b18b1289ca734 data/create/advancements/recipes/create.base/crafting/logistics/powered_toggle_latch.json
76d4c5f04d0a3e6817127a828594388b18f210c4 data/create/advancements/recipes/create.base/crafting/logistics/pulse_repeater.json
@ -2010,7 +1994,6 @@ d3202a337c15c8b8ec41fa5879bb94327bb75057 data/create/loot_tables/blocks/andesite
317aa99086127c649981b7b2fc85e66774a30f58 data/create/loot_tables/blocks/andesite_tunnel.json
14bf1764b9313893b6a6f57094f9506ac9fa71a8 data/create/loot_tables/blocks/basin.json
c7f81e30c31837a287d6d6040cdb02c7dec11441 data/create/loot_tables/blocks/belt.json
1104e323abb2a8c25769c47dc5d1154965113cc9 data/create/loot_tables/blocks/belt_observer.json
67a8e2513c3cb09e6fe80279fda94f79d5018c37 data/create/loot_tables/blocks/birch_window.json
bf1d5843f93533f84bc4adec5b77da2114fa2025 data/create/loot_tables/blocks/birch_window_pane.json
cccc209d172cc7bac76f1b4ac79085ee90742ab2 data/create/loot_tables/blocks/black_seat.json
@ -2033,6 +2016,7 @@ adde89e46b12de1eee6fd0c5cb98c5f45feefc15 data/create/loot_tables/blocks/chiseled
778b53c36d73b6e9c78fd6c091c9c3535c3c18f7 data/create/loot_tables/blocks/clockwork_bearing.json
d76113310fc56eca6382d44df174096f2210d416 data/create/loot_tables/blocks/clutch.json
673ba3a5deae9133b917d16c9eb87fe4c2873c8a data/create/loot_tables/blocks/cogwheel.json
096af6b5df6e87d36cb936eea9b00982a554f4af data/create/loot_tables/blocks/content_observer.json
f38802b919c49f162f102d6e5d94113f05bf4ab1 data/create/loot_tables/blocks/copper_block.json
5a65a18ea787130ac7b8f5652bfa5ed187446649 data/create/loot_tables/blocks/copper_casing.json
31a51237763c374b7cdf39b9b62c14e965871047 data/create/loot_tables/blocks/copper_ore.json
@ -2480,9 +2464,9 @@ c465151b64381e2222203bf069b717435fdc2b26 data/create/recipes/crafting/logistics/
34bcdffae0b104829161c86b7d161068f890daa2 data/create/recipes/crafting/logistics/adjustable_repeater.json
fc75c87159569cb6ee978e6d51b0c3b0f504b5de data/create/recipes/crafting/logistics/andesite_funnel.json
660e824ab6042c145f02ffcfe95a34c38f113e19 data/create/recipes/crafting/logistics/andesite_tunnel.json
95cc99c90cb146eb85023748c4230840a4e6568e data/create/recipes/crafting/logistics/belt_observer.json
9b4e74f9a950191134d978bf45c3339212677b0d data/create/recipes/crafting/logistics/brass_funnel.json
2ae06df0357c494b53db0ddf9655c60ef2022d0b data/create/recipes/crafting/logistics/brass_tunnel.json
8559045b42abd99490fb9a3cf5d06b08fd014b38 data/create/recipes/crafting/logistics/content_observer.json
a32ac53848862837f3044ff9c81ed62c1134fe4f data/create/recipes/crafting/logistics/powered_latch.json
660eb73bcc66c1528cbd4d4204ad6b771f4bd721 data/create/recipes/crafting/logistics/powered_toggle_latch.json
74b8a38d252cce564cc63db2ade41ed2d656d025 data/create/recipes/crafting/logistics/pulse_repeater.json

View file

@ -1,244 +0,0 @@
{
"variants": {
"belt=false,facing=north,mode=detect,powered=false": {
"model": "create:block/belt_observer/detect",
"y": 180
},
"belt=true,facing=north,mode=detect,powered=false": {
"model": "create:block/belt_observer/detect_belt",
"y": 180
},
"belt=false,facing=south,mode=detect,powered=false": {
"model": "create:block/belt_observer/detect"
},
"belt=true,facing=south,mode=detect,powered=false": {
"model": "create:block/belt_observer/detect_belt"
},
"belt=false,facing=west,mode=detect,powered=false": {
"model": "create:block/belt_observer/detect",
"y": 90
},
"belt=true,facing=west,mode=detect,powered=false": {
"model": "create:block/belt_observer/detect_belt",
"y": 90
},
"belt=false,facing=east,mode=detect,powered=false": {
"model": "create:block/belt_observer/detect",
"y": 270
},
"belt=true,facing=east,mode=detect,powered=false": {
"model": "create:block/belt_observer/detect_belt",
"y": 270
},
"belt=false,facing=north,mode=pulse,powered=false": {
"model": "create:block/belt_observer/pulse",
"y": 180
},
"belt=true,facing=north,mode=pulse,powered=false": {
"model": "create:block/belt_observer/pulse_belt",
"y": 180
},
"belt=false,facing=south,mode=pulse,powered=false": {
"model": "create:block/belt_observer/pulse"
},
"belt=true,facing=south,mode=pulse,powered=false": {
"model": "create:block/belt_observer/pulse_belt"
},
"belt=false,facing=west,mode=pulse,powered=false": {
"model": "create:block/belt_observer/pulse",
"y": 90
},
"belt=true,facing=west,mode=pulse,powered=false": {
"model": "create:block/belt_observer/pulse_belt",
"y": 90
},
"belt=false,facing=east,mode=pulse,powered=false": {
"model": "create:block/belt_observer/pulse",
"y": 270
},
"belt=true,facing=east,mode=pulse,powered=false": {
"model": "create:block/belt_observer/pulse_belt",
"y": 270
},
"belt=false,facing=north,mode=eject,powered=false": {
"model": "create:block/belt_observer/eject",
"y": 180
},
"belt=true,facing=north,mode=eject,powered=false": {
"model": "create:block/belt_observer/eject_belt",
"y": 180
},
"belt=false,facing=south,mode=eject,powered=false": {
"model": "create:block/belt_observer/eject"
},
"belt=true,facing=south,mode=eject,powered=false": {
"model": "create:block/belt_observer/eject_belt"
},
"belt=false,facing=west,mode=eject,powered=false": {
"model": "create:block/belt_observer/eject",
"y": 90
},
"belt=true,facing=west,mode=eject,powered=false": {
"model": "create:block/belt_observer/eject_belt",
"y": 90
},
"belt=false,facing=east,mode=eject,powered=false": {
"model": "create:block/belt_observer/eject",
"y": 270
},
"belt=true,facing=east,mode=eject,powered=false": {
"model": "create:block/belt_observer/eject_belt",
"y": 270
},
"belt=false,facing=north,mode=split,powered=false": {
"model": "create:block/belt_observer/split",
"y": 180
},
"belt=true,facing=north,mode=split,powered=false": {
"model": "create:block/belt_observer/split_belt",
"y": 180
},
"belt=false,facing=south,mode=split,powered=false": {
"model": "create:block/belt_observer/split"
},
"belt=true,facing=south,mode=split,powered=false": {
"model": "create:block/belt_observer/split_belt"
},
"belt=false,facing=west,mode=split,powered=false": {
"model": "create:block/belt_observer/split",
"y": 90
},
"belt=true,facing=west,mode=split,powered=false": {
"model": "create:block/belt_observer/split_belt",
"y": 90
},
"belt=false,facing=east,mode=split,powered=false": {
"model": "create:block/belt_observer/split",
"y": 270
},
"belt=true,facing=east,mode=split,powered=false": {
"model": "create:block/belt_observer/split_belt",
"y": 270
},
"belt=false,facing=north,mode=detect,powered=true": {
"model": "create:block/belt_observer/detect_powered",
"y": 180
},
"belt=true,facing=north,mode=detect,powered=true": {
"model": "create:block/belt_observer/detect_belt_powered",
"y": 180
},
"belt=false,facing=south,mode=detect,powered=true": {
"model": "create:block/belt_observer/detect_powered"
},
"belt=true,facing=south,mode=detect,powered=true": {
"model": "create:block/belt_observer/detect_belt_powered"
},
"belt=false,facing=west,mode=detect,powered=true": {
"model": "create:block/belt_observer/detect_powered",
"y": 90
},
"belt=true,facing=west,mode=detect,powered=true": {
"model": "create:block/belt_observer/detect_belt_powered",
"y": 90
},
"belt=false,facing=east,mode=detect,powered=true": {
"model": "create:block/belt_observer/detect_powered",
"y": 270
},
"belt=true,facing=east,mode=detect,powered=true": {
"model": "create:block/belt_observer/detect_belt_powered",
"y": 270
},
"belt=false,facing=north,mode=pulse,powered=true": {
"model": "create:block/belt_observer/pulse_powered",
"y": 180
},
"belt=true,facing=north,mode=pulse,powered=true": {
"model": "create:block/belt_observer/pulse_belt_powered",
"y": 180
},
"belt=false,facing=south,mode=pulse,powered=true": {
"model": "create:block/belt_observer/pulse_powered"
},
"belt=true,facing=south,mode=pulse,powered=true": {
"model": "create:block/belt_observer/pulse_belt_powered"
},
"belt=false,facing=west,mode=pulse,powered=true": {
"model": "create:block/belt_observer/pulse_powered",
"y": 90
},
"belt=true,facing=west,mode=pulse,powered=true": {
"model": "create:block/belt_observer/pulse_belt_powered",
"y": 90
},
"belt=false,facing=east,mode=pulse,powered=true": {
"model": "create:block/belt_observer/pulse_powered",
"y": 270
},
"belt=true,facing=east,mode=pulse,powered=true": {
"model": "create:block/belt_observer/pulse_belt_powered",
"y": 270
},
"belt=false,facing=north,mode=eject,powered=true": {
"model": "create:block/belt_observer/eject_powered",
"y": 180
},
"belt=true,facing=north,mode=eject,powered=true": {
"model": "create:block/belt_observer/eject_belt_powered",
"y": 180
},
"belt=false,facing=south,mode=eject,powered=true": {
"model": "create:block/belt_observer/eject_powered"
},
"belt=true,facing=south,mode=eject,powered=true": {
"model": "create:block/belt_observer/eject_belt_powered"
},
"belt=false,facing=west,mode=eject,powered=true": {
"model": "create:block/belt_observer/eject_powered",
"y": 90
},
"belt=true,facing=west,mode=eject,powered=true": {
"model": "create:block/belt_observer/eject_belt_powered",
"y": 90
},
"belt=false,facing=east,mode=eject,powered=true": {
"model": "create:block/belt_observer/eject_powered",
"y": 270
},
"belt=true,facing=east,mode=eject,powered=true": {
"model": "create:block/belt_observer/eject_belt_powered",
"y": 270
},
"belt=false,facing=north,mode=split,powered=true": {
"model": "create:block/belt_observer/split_powered",
"y": 180
},
"belt=true,facing=north,mode=split,powered=true": {
"model": "create:block/belt_observer/split_belt_powered",
"y": 180
},
"belt=false,facing=south,mode=split,powered=true": {
"model": "create:block/belt_observer/split_powered"
},
"belt=true,facing=south,mode=split,powered=true": {
"model": "create:block/belt_observer/split_belt_powered"
},
"belt=false,facing=west,mode=split,powered=true": {
"model": "create:block/belt_observer/split_powered",
"y": 90
},
"belt=true,facing=west,mode=split,powered=true": {
"model": "create:block/belt_observer/split_belt_powered",
"y": 90
},
"belt=false,facing=east,mode=split,powered=true": {
"model": "create:block/belt_observer/split_powered",
"y": 270
},
"belt=true,facing=east,mode=split,powered=true": {
"model": "create:block/belt_observer/split_belt_powered",
"y": 270
}
}
}

View file

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

View file

@ -21,7 +21,6 @@
"block.create.andesite_tunnel": "\u05DF\u01DDuun\u27D8 \u01DD\u0287\u0131s\u01DDpu\u2C6F",
"block.create.basin": "u\u0131s\u0250\u15FA",
"block.create.belt": "\u0287\u05DF\u01DD\u15FA",
"block.create.belt_observer": "\u0279\u01DD\u028C\u0279\u01DDsqO \u0287\u05DF\u01DD\u15FA",
"block.create.birch_window": "\u028Dopu\u0131M \u0265\u0254\u0279\u0131\u15FA",
"block.create.birch_window_pane": "\u01DDu\u0250\u0500 \u028Dopu\u0131M \u0265\u0254\u0279\u0131\u15FA",
"block.create.black_seat": "\u0287\u0250\u01DDS \u029E\u0254\u0250\u05DF\u15FA",
@ -44,6 +43,7 @@
"block.create.clockwork_bearing": "bu\u0131\u0279\u0250\u01DD\u15FA \u029E\u0279o\u028D\u029E\u0254o\u05DF\u0186",
"block.create.clutch": "\u0265\u0254\u0287n\u05DF\u0186",
"block.create.cogwheel": "\u05DF\u01DD\u01DD\u0265\u028Dbo\u0186",
"block.create.content_observer": "\u0279\u01DD\u028C\u0279\u01DDsqO \u0287u\u01DD\u0287uo\u0186",
"block.create.copper_block": "\u029E\u0254o\u05DF\u15FA \u0279\u01DDddo\u0186",
"block.create.copper_casing": "bu\u0131s\u0250\u0186 \u0279\u01DDddo\u0186",
"block.create.copper_ore": "\u01DD\u0279O \u0279\u01DDddo\u0186",

View file

@ -24,7 +24,6 @@
"block.create.andesite_tunnel": "Andesite Tunnel",
"block.create.basin": "Basin",
"block.create.belt": "Belt",
"block.create.belt_observer": "Belt Observer",
"block.create.birch_window": "Birch Window",
"block.create.birch_window_pane": "Birch Window Pane",
"block.create.black_seat": "Black Seat",
@ -47,6 +46,7 @@
"block.create.clockwork_bearing": "Clockwork Bearing",
"block.create.clutch": "Clutch",
"block.create.cogwheel": "Cogwheel",
"block.create.content_observer": "Content Observer",
"block.create.copper_block": "Copper Block",
"block.create.copper_casing": "Copper Casing",
"block.create.copper_ore": "Copper Ore",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 804",
"_": "Missing Localizations: 805",
"_": "->------------------------] Game Elements [------------------------<-",
@ -25,7 +25,6 @@
"block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel",
"block.create.basin": "UNLOCALIZED: Basin",
"block.create.belt": "Mechanischer Riemen",
"block.create.belt_observer": "Fließband-Beobachter",
"block.create.birch_window": "UNLOCALIZED: Birch Window",
"block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane",
"block.create.black_seat": "UNLOCALIZED: Black Seat",
@ -48,6 +47,7 @@
"block.create.clockwork_bearing": "UNLOCALIZED: Clockwork Bearing",
"block.create.clutch": "Kupplung",
"block.create.cogwheel": "Zahnrad",
"block.create.content_observer": "UNLOCALIZED: Content Observer",
"block.create.copper_block": "UNLOCALIZED: Copper Block",
"block.create.copper_casing": "UNLOCALIZED: Copper Casing",
"block.create.copper_ore": "UNLOCALIZED: Copper Ore",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 428",
"_": "Missing Localizations: 429",
"_": "->------------------------] Game Elements [------------------------<-",
@ -25,7 +25,6 @@
"block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel",
"block.create.basin": "Bassin",
"block.create.belt": "Tapis roulant",
"block.create.belt_observer": "Observateur d'entité",
"block.create.birch_window": "UNLOCALIZED: Birch Window",
"block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane",
"block.create.black_seat": "UNLOCALIZED: Black Seat",
@ -48,6 +47,7 @@
"block.create.clockwork_bearing": "Roulement mécanique horloger",
"block.create.clutch": "Embrayage",
"block.create.cogwheel": "Roue dentée",
"block.create.content_observer": "UNLOCALIZED: Content Observer",
"block.create.copper_block": "Bloc de cuivre",
"block.create.copper_casing": "Boîtier en cuivre",
"block.create.copper_ore": "Minerai de cuivre",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 412",
"_": "Missing Localizations: 413",
"_": "->------------------------] Game Elements [------------------------<-",
@ -25,7 +25,6 @@
"block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel",
"block.create.basin": "Bacinella",
"block.create.belt": "Nastro Meccanico",
"block.create.belt_observer": "Osservatore a Cinghia",
"block.create.birch_window": "UNLOCALIZED: Birch Window",
"block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane",
"block.create.black_seat": "UNLOCALIZED: Black Seat",
@ -48,6 +47,7 @@
"block.create.clockwork_bearing": "Supporto del Orologio",
"block.create.clutch": "Frizione",
"block.create.cogwheel": "Ruota Dentata",
"block.create.content_observer": "UNLOCALIZED: Content Observer",
"block.create.copper_block": "Blocco di Rame",
"block.create.copper_casing": "Involucro di Rame",
"block.create.copper_ore": "Rame Grezzo",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 407",
"_": "Missing Localizations: 408",
"_": "->------------------------] Game Elements [------------------------<-",
@ -25,7 +25,6 @@
"block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel",
"block.create.basin": "鉢",
"block.create.belt": "メカニカルベルト",
"block.create.belt_observer": "ベルトオブザーバー",
"block.create.birch_window": "UNLOCALIZED: Birch Window",
"block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane",
"block.create.black_seat": "UNLOCALIZED: Black Seat",
@ -48,6 +47,7 @@
"block.create.clockwork_bearing": "時計仕掛けのベアリング",
"block.create.clutch": "クラッチ",
"block.create.cogwheel": "歯車",
"block.create.content_observer": "UNLOCALIZED: Content Observer",
"block.create.copper_block": "銅ブロック",
"block.create.copper_casing": "銅ケーシング",
"block.create.copper_ore": "銅鉱石",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 412",
"_": "Missing Localizations: 413",
"_": "->------------------------] Game Elements [------------------------<-",
@ -25,7 +25,6 @@
"block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel",
"block.create.basin": "대야",
"block.create.belt": "컨베이어 벨트",
"block.create.belt_observer": "벨트 감지기",
"block.create.birch_window": "UNLOCALIZED: Birch Window",
"block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane",
"block.create.black_seat": "UNLOCALIZED: Black Seat",
@ -48,6 +47,7 @@
"block.create.clockwork_bearing": "시계 베어링",
"block.create.clutch": "클러치",
"block.create.cogwheel": "톱나버퀴",
"block.create.content_observer": "UNLOCALIZED: Content Observer",
"block.create.copper_block": "구리 블럭",
"block.create.copper_casing": "구리 케이스",
"block.create.copper_ore": "구리 광석",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 742",
"_": "Missing Localizations: 743",
"_": "->------------------------] Game Elements [------------------------<-",
@ -25,7 +25,6 @@
"block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel",
"block.create.basin": "Bekken",
"block.create.belt": "Mechanische Transportband",
"block.create.belt_observer": "Transportband Observeerder",
"block.create.birch_window": "UNLOCALIZED: Birch Window",
"block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane",
"block.create.black_seat": "UNLOCALIZED: Black Seat",
@ -48,6 +47,7 @@
"block.create.clockwork_bearing": "UNLOCALIZED: Clockwork Bearing",
"block.create.clutch": "Koppeling",
"block.create.cogwheel": "Tandwiel",
"block.create.content_observer": "UNLOCALIZED: Content Observer",
"block.create.copper_block": "UNLOCALIZED: Copper Block",
"block.create.copper_casing": "UNLOCALIZED: Copper Casing",
"block.create.copper_ore": "UNLOCALIZED: Copper Ore",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 811",
"_": "Missing Localizations: 812",
"_": "->------------------------] Game Elements [------------------------<-",
@ -25,7 +25,6 @@
"block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel",
"block.create.basin": "UNLOCALIZED: Basin",
"block.create.belt": "Esteira Mecânica",
"block.create.belt_observer": "Observador de Esteira",
"block.create.birch_window": "UNLOCALIZED: Birch Window",
"block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane",
"block.create.black_seat": "UNLOCALIZED: Black Seat",
@ -48,6 +47,7 @@
"block.create.clockwork_bearing": "UNLOCALIZED: Clockwork Bearing",
"block.create.clutch": "Embreagem",
"block.create.cogwheel": "Roda Dentada",
"block.create.content_observer": "UNLOCALIZED: Content Observer",
"block.create.copper_block": "UNLOCALIZED: Copper Block",
"block.create.copper_casing": "UNLOCALIZED: Copper Casing",
"block.create.copper_ore": "UNLOCALIZED: Copper Ore",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 805",
"_": "Missing Localizations: 806",
"_": "->------------------------] Game Elements [------------------------<-",
@ -25,7 +25,6 @@
"block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel",
"block.create.basin": "UNLOCALIZED: Basin",
"block.create.belt": "Механическая лента",
"block.create.belt_observer": "Ленточный сканер",
"block.create.birch_window": "UNLOCALIZED: Birch Window",
"block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane",
"block.create.black_seat": "UNLOCALIZED: Black Seat",
@ -48,6 +47,7 @@
"block.create.clockwork_bearing": "UNLOCALIZED: Clockwork Bearing",
"block.create.clutch": "Переключаемая муфта",
"block.create.cogwheel": "Шестерня",
"block.create.content_observer": "UNLOCALIZED: Content Observer",
"block.create.copper_block": "UNLOCALIZED: Copper Block",
"block.create.copper_casing": "UNLOCALIZED: Copper Casing",
"block.create.copper_ore": "UNLOCALIZED: Copper Ore",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 92",
"_": "Missing Localizations: 93",
"_": "->------------------------] Game Elements [------------------------<-",
@ -25,7 +25,6 @@
"block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel",
"block.create.basin": "工作盆",
"block.create.belt": "传送带",
"block.create.belt_observer": "传送带侦测器",
"block.create.birch_window": "白桦窗户",
"block.create.birch_window_pane": "白桦窗户板",
"block.create.black_seat": "UNLOCALIZED: Black Seat",
@ -48,6 +47,7 @@
"block.create.clockwork_bearing": "时钟轴承",
"block.create.clutch": "离合器",
"block.create.cogwheel": "齿轮",
"block.create.content_observer": "UNLOCALIZED: Content Observer",
"block.create.copper_block": "铜块",
"block.create.copper_casing": "铜机壳",
"block.create.copper_ore": "铜矿石",

View file

@ -1,6 +0,0 @@
{
"parent": "create:block/belt_observer/base",
"textures": {
"texture": "create:block/belt_observer_detect"
}
}

View file

@ -1,6 +0,0 @@
{
"parent": "create:block/belt_observer/base_belt",
"textures": {
"texture": "create:block/belt_observer_detect"
}
}

View file

@ -1,6 +0,0 @@
{
"parent": "create:block/belt_observer/base_belt_powered",
"textures": {
"texture": "create:block/belt_observer_detect_powered"
}
}

View file

@ -1,6 +0,0 @@
{
"parent": "create:block/belt_observer/base_powered",
"textures": {
"texture": "create:block/belt_observer_detect_powered"
}
}

View file

@ -1,6 +0,0 @@
{
"parent": "create:block/belt_observer/base",
"textures": {
"texture": "create:block/belt_observer_eject"
}
}

View file

@ -1,6 +0,0 @@
{
"parent": "create:block/belt_observer/base_belt",
"textures": {
"texture": "create:block/belt_observer_eject"
}
}

View file

@ -1,6 +0,0 @@
{
"parent": "create:block/belt_observer/base_belt_powered",
"textures": {
"texture": "create:block/belt_observer_eject_powered"
}
}

View file

@ -1,6 +0,0 @@
{
"parent": "create:block/belt_observer/base_powered",
"textures": {
"texture": "create:block/belt_observer_eject_powered"
}
}

View file

@ -1,6 +0,0 @@
{
"parent": "create:block/belt_observer/base",
"textures": {
"texture": "create:block/belt_observer_pulse"
}
}

View file

@ -1,6 +0,0 @@
{
"parent": "create:block/belt_observer/base_belt",
"textures": {
"texture": "create:block/belt_observer_pulse"
}
}

View file

@ -1,6 +0,0 @@
{
"parent": "create:block/belt_observer/base_belt_powered",
"textures": {
"texture": "create:block/belt_observer_pulse_powered"
}
}

View file

@ -1,6 +0,0 @@
{
"parent": "create:block/belt_observer/base_powered",
"textures": {
"texture": "create:block/belt_observer_pulse_powered"
}
}

View file

@ -1,6 +0,0 @@
{
"parent": "create:block/belt_observer/base",
"textures": {
"texture": "create:block/belt_observer_split"
}
}

View file

@ -1,6 +0,0 @@
{
"parent": "create:block/belt_observer/base_belt",
"textures": {
"texture": "create:block/belt_observer_split"
}
}

View file

@ -1,6 +0,0 @@
{
"parent": "create:block/belt_observer/base_belt_powered",
"textures": {
"texture": "create:block/belt_observer_split_powered"
}
}

View file

@ -1,6 +0,0 @@
{
"parent": "create:block/belt_observer/base_powered",
"textures": {
"texture": "create:block/belt_observer_split_powered"
}
}

View file

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

View file

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

View file

@ -2,7 +2,7 @@
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"create:crafting/logistics/belt_observer"
"create:crafting/logistics/content_observer"
]
},
"criteria": {
@ -19,7 +19,7 @@
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "create:crafting/logistics/belt_observer"
"recipe": "create:crafting/logistics/content_observer"
}
}
},

View file

@ -6,7 +6,7 @@
"entries": [
{
"type": "minecraft:item",
"name": "create:belt_observer"
"name": "create:content_observer"
}
],
"conditions": [

View file

@ -19,6 +19,6 @@
}
},
"result": {
"item": "create:belt_observer"
"item": "create:content_observer"
}
}

View file

@ -91,7 +91,6 @@ import com.simibubi.create.content.contraptions.relays.encased.GearshiftBlock;
import com.simibubi.create.content.contraptions.relays.gauge.GaugeBlock;
import com.simibubi.create.content.contraptions.relays.gauge.GaugeGenerator;
import com.simibubi.create.content.contraptions.relays.gearbox.GearboxBlock;
import com.simibubi.create.content.logistics.block.belts.observer.BeltObserverBlock;
import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock;
import com.simibubi.create.content.logistics.block.belts.tunnel.BrassTunnelBlock;
import com.simibubi.create.content.logistics.block.belts.tunnel.BrassTunnelCTBehaviour;
@ -120,6 +119,7 @@ import com.simibubi.create.content.logistics.block.mechanicalArm.ArmBlock;
import com.simibubi.create.content.logistics.block.mechanicalArm.ArmItem;
import com.simibubi.create.content.logistics.block.redstone.AnalogLeverBlock;
import com.simibubi.create.content.logistics.block.redstone.ContactMovementBehaviour;
import com.simibubi.create.content.logistics.block.redstone.ContentObserverBlock;
import com.simibubi.create.content.logistics.block.redstone.NixieTubeBlock;
import com.simibubi.create.content.logistics.block.redstone.NixieTubeGenerator;
import com.simibubi.create.content.logistics.block.redstone.RedstoneContactBlock;
@ -140,9 +140,6 @@ import com.simibubi.create.foundation.utility.DyeHelper;
import com.simibubi.create.foundation.worldgen.OxidizingBlock;
import com.tterrag.registrate.util.entry.BlockEntry;
import net.minecraft.advancements.criterion.InventoryChangeTrigger;
import net.minecraft.advancements.criterion.ItemPredicate;
import net.minecraft.advancements.criterion.MinMaxBounds;
import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
import net.minecraft.block.SoundType;
@ -712,24 +709,14 @@ public class AllBlocks {
.patternLine("-")
.key('#', DyeHelper.getWoolOfDye(colour))
.key('-', ItemTags.WOODEN_SLABS)
.addCriterion("has_wool",
new InventoryChangeTrigger.Instance(MinMaxBounds.IntBound.UNBOUNDED,
MinMaxBounds.IntBound.UNBOUNDED, MinMaxBounds.IntBound.UNBOUNDED,
new ItemPredicate[] { ItemPredicate.Builder.create()
.tag(ItemTags.WOOL)
.build() }))
.addCriterion("has_wool", p.hasItem(ItemTags.WOOL))
.build(p, Create.asResource("crafting/kinetics/" + c.getName()));
ShapedRecipeBuilder.shapedRecipe(c.get())
.patternLine("#")
.patternLine("-")
.key('#', DyeHelper.getTagOfDye(colour))
.key('-', AllItemTags.SEATS.tag)
.addCriterion("has_seat",
new InventoryChangeTrigger.Instance(MinMaxBounds.IntBound.UNBOUNDED,
MinMaxBounds.IntBound.UNBOUNDED, MinMaxBounds.IntBound.UNBOUNDED,
new ItemPredicate[] { ItemPredicate.Builder.create()
.tag(AllItemTags.SEATS.tag)
.build() }))
.addCriterion("has_seat", p.hasItem(AllItemTags.SEATS.tag))
.build(p, Create.asResource("crafting/kinetics/" + c.getName() + "_from_other_seat"));
})
.tag(AllBlockTags.SEATS.tag)
@ -881,12 +868,12 @@ public class AllBlocks {
.transform(customItemModel("_", "block"))
.register();
public static final BlockEntry<BeltObserverBlock> BELT_OBSERVER =
REGISTRATE.block("belt_observer", BeltObserverBlock::new)
public static final BlockEntry<ContentObserverBlock> CONTENT_OBSERVER =
REGISTRATE.block("content_observer", ContentObserverBlock::new)
.initialProperties(SharedProperties::stone)
.blockstate(BlockStateGen.beltObserver())
.blockstate((c, p) -> p.horizontalBlock(c.get(), AssetLookup.forPowered(c, p)))
.item()
.transform(customItemModel())
.transform(customItemModel("_", "block"))
.register();
public static final BlockEntry<StockpileSwitchBlock> STOCKPILE_SWITCH =

View file

@ -52,7 +52,11 @@ public class AllShapes {
.forHorizontalAxis(),
STOCKPILE_SWITCH = shape(0, 0, 0, 16, 2, 16).add(1, 0, 1, 15, 16, 15)
.add(0, 14, 0, 16, 16, 16)
.add(3, 3, -1, 13, 13, 2)
.add(3, 3, -2, 13, 13, 2)
.forHorizontal(NORTH),
CONTENT_OBSERVER = shape(0, 0, 0, 16, 6, 16).add(1, 0, 1, 15, 16, 15)
.add(0, 14, 0, 16, 16, 16)
.add(3, 3, -2, 13, 13, 2)
.forHorizontal(NORTH),
NIXIE_TUBE = shape(0, 0, 0, 16, 4, 16).add(9, 0, 5, 15, 15, 11)
.add(1, 0, 5, 7, 15, 11)
@ -68,13 +72,9 @@ public class AllShapes {
.add(2, 6, 2, 14, 10, 14)
.add(0, 10, 0, 16, 13, 16)
.forDirectional(UP),
BELT_FUNNEL_RETRACTED =
shape(2, -5, 14, 12, 14, 18)
.add(0, -5, 8, 16, 16, 14)
BELT_FUNNEL_RETRACTED = shape(2, -5, 14, 12, 14, 18).add(0, -5, 8, 16, 16, 14)
.forHorizontal(NORTH),
BELT_FUNNEL_EXTENDED =
shape(2, -4, 14, 14, 14, 18)
.add(3, -4, 10, 13, 13, 14)
BELT_FUNNEL_EXTENDED = shape(2, -4, 14, 14, 14, 18).add(3, -4, 10, 13, 13, 14)
.add(2, -4, 6, 14, 14, 10)
.add(0, -5, 0, 16, 16, 6)
.forHorizontal(NORTH),

View file

@ -73,8 +73,6 @@ import com.simibubi.create.content.contraptions.relays.gauge.StressGaugeTileEnti
import com.simibubi.create.content.contraptions.relays.gearbox.GearboxRenderer;
import com.simibubi.create.content.contraptions.relays.gearbox.GearboxTileEntity;
import com.simibubi.create.content.contraptions.relays.gearbox.GearshiftTileEntity;
import com.simibubi.create.content.logistics.block.belts.observer.BeltObserverRenderer;
import com.simibubi.create.content.logistics.block.belts.observer.BeltObserverTileEntity;
import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelRenderer;
import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelTileEntity;
import com.simibubi.create.content.logistics.block.belts.tunnel.BrassTunnelTileEntity;
@ -93,6 +91,7 @@ import com.simibubi.create.content.logistics.block.mechanicalArm.ArmRenderer;
import com.simibubi.create.content.logistics.block.mechanicalArm.ArmTileEntity;
import com.simibubi.create.content.logistics.block.redstone.AnalogLeverRenderer;
import com.simibubi.create.content.logistics.block.redstone.AnalogLeverTileEntity;
import com.simibubi.create.content.logistics.block.redstone.ContentObserverTileEntity;
import com.simibubi.create.content.logistics.block.redstone.NixieTubeRenderer;
import com.simibubi.create.content.logistics.block.redstone.NixieTubeTileEntity;
import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkTileEntity;
@ -427,7 +426,7 @@ public class AllTileEntities {
public static final TileEntityEntry<StockpileSwitchTileEntity> STOCKPILE_SWITCH = Create.registrate()
.tileEntity("stockpile_switch", StockpileSwitchTileEntity::new)
.validBlocks(AllBlocks.STOCKPILE_SWITCH)
//.renderer(() -> renderer)
.renderer(() -> SmartTileEntityRenderer::new)
.register();
public static final TileEntityEntry<AdjustableCrateTileEntity> ADJUSTABLE_CRATE = Create.registrate()
@ -454,10 +453,10 @@ public class AllTileEntities {
.renderer(() -> FunnelRenderer::new)
.register();
public static final TileEntityEntry<BeltObserverTileEntity> BELT_OBSERVER = Create.registrate()
.tileEntity("belt_observer", BeltObserverTileEntity::new)
.validBlocks(AllBlocks.BELT_OBSERVER)
.renderer(() -> BeltObserverRenderer::new)
public static final TileEntityEntry<ContentObserverTileEntity> CONTENT_OBSERVER = Create.registrate()
.tileEntity("content_observer", ContentObserverTileEntity::new)
.validBlocks(AllBlocks.CONTENT_OBSERVER)
.renderer(() -> SmartTileEntityRenderer::new)
.register();
public static final TileEntityEntry<AdjustableRepeaterTileEntity> ADJUSTABLE_REPEATER = Create.registrate()

View file

@ -2,14 +2,19 @@ package com.simibubi.create.content.contraptions.components.actors;
import java.util.List;
import javax.annotation.Nullable;
import javax.annotation.ParametersAreNonnullByDefault;
import com.simibubi.create.AllShapes;
import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.MobEntity;
import net.minecraft.entity.item.minecart.AbstractMinecartEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;
@ -25,11 +30,6 @@ import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.World;
import javax.annotation.Nullable;
import javax.annotation.ParametersAreNonnullByDefault;
import mcp.MethodsReturnNonnullByDefault;
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
public class SeatBlock extends Block {
@ -56,7 +56,7 @@ public class SeatBlock extends Block {
@Override
public void onLanded(IBlockReader reader, Entity entity) {
BlockPos pos = entity.getPosition();
if (entity instanceof PlayerEntity || !(entity instanceof LivingEntity) || isSeatOccupied(entity.world, pos)) {
if (!canBePickedUp(entity) || isSeatOccupied(entity.world, pos)) {
Blocks.PINK_BED.onLanded(reader, entity);
return;
}
@ -67,7 +67,8 @@ public class SeatBlock extends Block {
}
@Override
public PathNodeType getAiPathNodeType(BlockState state, IBlockReader world, BlockPos pos, @Nullable MobEntity entity) {
public PathNodeType getAiPathNodeType(BlockState state, IBlockReader world, BlockPos pos,
@Nullable MobEntity entity) {
return PathNodeType.RAIL;
}
@ -76,7 +77,7 @@ public class SeatBlock extends Block {
ISelectionContext p_220053_4_) {
return AllShapes.SEAT;
}
@Override
public VoxelShape getCollisionShape(BlockState p_220071_1_, IBlockReader p_220071_2_, BlockPos p_220071_3_,
ISelectionContext p_220071_4_) {
@ -113,6 +114,11 @@ public class SeatBlock extends Block {
.isEmpty();
}
public static boolean canBePickedUp(Entity passenger) {
return !(passenger instanceof PlayerEntity)
&& (passenger instanceof LivingEntity || passenger instanceof AbstractMinecartEntity);
}
public static void sitDown(World world, BlockPos pos, Entity entity) {
if (world.isRemote)
return;

View file

@ -12,8 +12,6 @@ import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.block.BlockState;
import net.minecraft.block.SlabBlock;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.state.properties.SlabType;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
@ -73,12 +71,10 @@ public class SeatMovementBehaviour extends MovementBehaviour {
if (solid)
return;
List<LivingEntity> entitiesWithinAABB = context.world.getEntitiesWithinAABB(LivingEntity.class,
new AxisAlignedBB(pos).shrink(1 / 16f), e -> !(e instanceof PlayerEntity));
if (entitiesWithinAABB.isEmpty())
return;
LivingEntity passenger = entitiesWithinAABB.get(0);
contraptionEntity.addSittingPassenger(passenger, index);
List<Entity> nearbyEntities = context.world.getEntitiesWithinAABB(Entity.class,
new AxisAlignedBB(pos).shrink(1 / 16f), SeatBlock::canBePickedUp);
if (!nearbyEntities.isEmpty())
contraptionEntity.addSittingPassenger(nearbyEntities.get(0), index);
}
}

View file

@ -159,7 +159,7 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE<BeltTileEnt
@Override
public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity entityIn) {
if (!canTransport(state))
if (!canTransportObjects(state))
return;
if (entityIn instanceof PlayerEntity) {
PlayerEntity player = (PlayerEntity) entityIn;
@ -204,7 +204,7 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE<BeltTileEnt
}
}
public static boolean canTransport(BlockState state) {
public static boolean canTransportObjects(BlockState state) {
if (!AllBlocks.BELT.has(state))
return false;
BeltSlope slope = state.get(SLOPE);
@ -413,7 +413,7 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE<BeltTileEnt
te.markDirty();
te.sendData();
if (te.isController() && !canTransport(currentState))
if (te.isController() && !canTransportObjects(currentState))
te.getInventory()
.ejectAll();
} else {

View file

@ -1,171 +0,0 @@
package com.simibubi.create.content.logistics.block.belts.observer;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.relays.belt.BeltBlock;
import com.simibubi.create.content.contraptions.relays.belt.BeltPart;
import com.simibubi.create.content.contraptions.relays.belt.BeltSlope;
import com.simibubi.create.content.contraptions.wrench.IWrenchable;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.HorizontalBlock;
import net.minecraft.block.material.PushReaction;
import net.minecraft.item.BlockItemUseContext;
import net.minecraft.item.ItemUseContext;
import net.minecraft.state.BooleanProperty;
import net.minecraft.state.EnumProperty;
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.IStringSerializable;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorld;
import net.minecraft.world.World;
public class BeltObserverBlock extends HorizontalBlock
implements ITE<BeltObserverTileEntity>, IWrenchable {
public static final BooleanProperty POWERED = BlockStateProperties.POWERED;
public static final BooleanProperty BELT = BooleanProperty.create("belt");
public static final EnumProperty<Mode> MODE = EnumProperty.create("mode", Mode.class);
public BeltObserverBlock(Properties properties) {
super(properties);
setDefaultState(getDefaultState().with(POWERED, false).with(BELT, false));
}
@Override
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
return AllTileEntities.BELT_OBSERVER.create();
}
@Override
public PushReaction getPushReaction(BlockState state) {
return PushReaction.BLOCK;
}
@Override
public boolean hasTileEntity(BlockState state) {
return true;
}
@Override
public BlockState updatePostPlacement(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn,
BlockPos currentPos, BlockPos facingPos) {
if (facing == stateIn.get(HORIZONTAL_FACING))
stateIn = stateIn.with(BELT, shouldHaveExtension(stateIn, worldIn, currentPos));
return stateIn;
}
@Override
protected void fillStateContainer(Builder<Block, BlockState> builder) {
builder.add(POWERED, HORIZONTAL_FACING, BELT, MODE);
super.fillStateContainer(builder);
}
private boolean shouldHaveExtension(BlockState state, IWorld world, BlockPos pos) {
Direction direction = state.get(HORIZONTAL_FACING);
BlockState blockState = world.getBlockState(pos.offset(direction));
if (!AllBlocks.BELT.has(blockState))
return false;
if (blockState.get(BeltBlock.SLOPE) != BeltSlope.HORIZONTAL)
return false;
if (blockState.get(BeltBlock.PART) != BeltPart.MIDDLE)
return false;
if (blockState.get(BeltBlock.HORIZONTAL_FACING).getAxis() == direction.getAxis())
return false;
return true;
}
@Override
public BlockState getStateForPlacement(BlockItemUseContext context) {
BlockState state = getDefaultState();
Direction preferredFacing = null;
for (Direction face : Direction.values()) {
if (face.getAxis().isVertical())
continue;
BlockState blockState = context.getWorld().getBlockState(context.getPos().offset(face));
if (AllBlocks.BELT.has(blockState)
&& blockState.get(BlockStateProperties.HORIZONTAL_FACING).getAxis() != face.getAxis()
&& blockState.get(BeltBlock.SLOPE) == BeltSlope.HORIZONTAL)
if (preferredFacing == null)
preferredFacing = face;
else {
preferredFacing = null;
break;
}
}
if (preferredFacing != null) {
state = state.with(HORIZONTAL_FACING, preferredFacing);
} else if (context.getFace().getAxis().isHorizontal()) {
state = state.with(HORIZONTAL_FACING, context.getFace());
} else {
state = state.with(HORIZONTAL_FACING, context.getPlacementHorizontalFacing());
}
state = state.with(BELT, shouldHaveExtension(state, context.getWorld(), context.getPos()));
return state;
}
@Override
public boolean canProvidePower(BlockState state) {
return state.get(POWERED);
}
@Override
public int getWeakPower(BlockState blockState, IBlockReader blockAccess, BlockPos pos, Direction side) {
return canProvidePower(blockState) ? 15 : 0;
}
@Override
public boolean canConnectRedstone(BlockState state, IBlockReader world, BlockPos pos, Direction side) {
return side != state.get(HORIZONTAL_FACING).getOpposite();
}
@Override
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) {
TileEntityBehaviour.destroy(worldIn, pos, FilteringBehaviour.TYPE);
worldIn.removeTileEntity(pos);
}
}
@Override
public ActionResultType onWrenched(BlockState state, ItemUseContext context) {
World world = context.getWorld();
if (!world.isRemote) {
world.setBlockState(context.getPos(), state.with(POWERED, false).cycle(MODE), 3);
world.notifyNeighborsOfStateChange(context.getPos(), this);
}
return ActionResultType.SUCCESS;
}
public enum Mode implements IStringSerializable {
DETECT, PULSE, EJECT, SPLIT;
@Override
public String getName() {
return Lang.asId(name());
}
}
@Override
public Class<BeltObserverTileEntity> getTileEntityClass() {
return BeltObserverTileEntity.class;
}
}

View file

@ -1,27 +0,0 @@
package com.simibubi.create.content.logistics.block.belts.observer;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer;
import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
import net.minecraft.state.properties.BlockStateProperties;
public class BeltObserverRenderer extends SafeTileEntityRenderer<BeltObserverTileEntity> {
public BeltObserverRenderer(TileEntityRendererDispatcher dispatcher) {
super(dispatcher);
}
@Override
protected void renderSafe(BeltObserverTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
int light, int overlay) {
light = WorldRenderer.getLightmapCoordinates(te.getWorld(),
te.getPos().up().offset(te.getBlockState().get(BlockStateProperties.HORIZONTAL_FACING)));
FilteringRenderer.renderOnTileEntity(te, partialTicks, ms, buffer, light, overlay);
}
}

View file

@ -1,87 +0,0 @@
package com.simibubi.create.content.logistics.block.belts.observer;
import java.util.List;
import com.simibubi.create.content.contraptions.relays.belt.BeltHelper;
import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity;
import com.simibubi.create.content.logistics.block.belts.observer.BeltObserverBlock.Mode;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
public class BeltObserverTileEntity extends SmartTileEntity {
private FilteringBehaviour filtering;
public int turnOffTicks = 0;
public BeltObserverTileEntity(TileEntityType<? extends BeltObserverTileEntity> type) {
super(type);
setLazyTickRate(20);
}
@Override
public void addBehaviours(List<TileEntityBehaviour> behaviours) {
filtering = new FilteringBehaviour(this, new BeltObserverFilterSlot()).moveText(new Vec3d(0, 5, 0));
behaviours.add(filtering);
}
@Override
public void tick() {
super.tick();
if (turnOffTicks > 0) {
turnOffTicks--;
if (turnOffTicks == 0)
world.getPendingBlockTicks().scheduleTick(pos, getBlockState().getBlock(), 1);
}
if (!isActive())
return;
if (getBlockState().get(BeltObserverBlock.MODE) != Mode.DETECT)
return;
BlockPos targetPos = pos.offset(getBlockState().get(BeltObserverBlock.HORIZONTAL_FACING));
BeltTileEntity beltTE = BeltHelper.getSegmentTE(world, targetPos);
if (beltTE == null)
return;
BeltTileEntity controllerTE = beltTE.getControllerTE();
if (controllerTE == null)
return;
controllerTE.getInventory().applyToEachWithin(beltTE.index + .5f, .45f, stack -> {
if (filtering.test(stack.stack) && turnOffTicks != 6) {
world.setBlockState(pos, getBlockState().with(BeltObserverBlock.POWERED, true));
world.notifyNeighborsOfStateChange(pos, getBlockState().getBlock());
resetTurnOffCooldown();
}
return null;
});
}
private boolean isActive() {
return getBlockState().get(BeltObserverBlock.BELT);
}
public void resetTurnOffCooldown() {
turnOffTicks = 6;
}
@Override
public void write(CompoundNBT compound, boolean clientPacket) {
compound.putInt("TurnOff", turnOffTicks);
super.write(compound, clientPacket);
}
@Override
protected void read(CompoundNBT compound, boolean clientPacket) {
turnOffTicks = compound.getInt("TurnOff");
super.read(compound, clientPacket);
}
}

View file

@ -306,19 +306,19 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor
private boolean handleDownwardOutput(boolean simulate) {
BlockState blockState = getBlockState();
ChuteTileEntity targetChute = getTargetChute(blockState);
Direction direction = blockState.get(ChuteBlock.FACING);
if (targetChute != null) {
boolean canInsert = targetChute.item.isEmpty();
if (!simulate && canInsert) {
targetChute.setItem(item, 1);
targetChute.setItem(item, direction == Direction.DOWN ? 1 : .51f);
setItem(ItemStack.EMPTY);
}
return canInsert;
}
// Diagonal chutes can only insert into other chutes
if (blockState.get(ChuteBlock.FACING)
.getAxis()
if (direction.getAxis()
.isHorizontal())
return false;

View file

@ -99,7 +99,7 @@ public abstract class BeltFunnelBlock extends HorizontalInteractionFunnelBlock {
return true;
if (!(stateBelow.getBlock() instanceof BeltBlock))
return false;
if (!BeltBlock.canTransport(stateBelow))
if (!BeltBlock.canTransportObjects(stateBelow))
return false;
return true;
}

View file

@ -125,6 +125,11 @@ public abstract class FunnelBlock extends ProperDirectionalBlock implements ITE<
return toInsert;
if (simulate)
inserter.simulate();
if (!simulate) {
TileEntity tileEntity = worldIn.getTileEntity(pos);
if (tileEntity instanceof FunnelTileEntity)
((FunnelTileEntity) tileEntity).onTransfer(toInsert);
}
return inserter.insert(toInsert);
}

View file

@ -108,6 +108,8 @@ public class FunnelTileEntity extends SmartTileEntity {
ItemStack stack = autoExtractor.extract(amountToExtract, filter, amountThreshold);
if (stack.isEmpty())
return;
onTransfer(stack);
invManipulation.insert(stack);
startCooldown();
}
@ -142,6 +144,7 @@ public class FunnelTileEntity extends SmartTileEntity {
if (stack.isEmpty())
return;
flap(false);
onTransfer(stack);
inputBehaviour.handleInsertion(stack, facing, false);
startCooldown();
}
@ -160,6 +163,7 @@ public class FunnelTileEntity extends SmartTileEntity {
return ignore;
flap(true);
onTransfer(toInsert);
if (remainder.isEmpty())
return TransportedResult.removeItem();
@ -216,6 +220,8 @@ public class FunnelTileEntity extends SmartTileEntity {
return inserted;
if (simulate)
invManipulation.simulate();
if (!simulate)
onTransfer(inserted);
return invManipulation.insert(inserted);
}
@ -253,5 +259,9 @@ public class FunnelTileEntity extends SmartTileEntity {
public double getMaxRenderDistanceSquared() {
return hasFlap() ? super.getMaxRenderDistanceSquared() : 64;
}
public void onTransfer(ItemStack stack) {
AllBlocks.CONTENT_OBSERVER.get().onFunnelTransfer(world, pos, stack);
}
}

View file

@ -11,6 +11,7 @@ import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.components.saw.SawBlock;
import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock;
import com.simibubi.create.content.logistics.block.funnel.FunnelBlock;
import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity;
import com.simibubi.create.foundation.advancement.AllTriggers;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
@ -346,6 +347,11 @@ public abstract class ArmInteractionPoint {
return stack;
if (simulate)
inserter.simulate();
if (!simulate) {
TileEntity tileEntity = world.getTileEntity(pos);
if (tileEntity instanceof FunnelTileEntity)
((FunnelTileEntity) tileEntity).onTransfer(stack);
}
return inserter.insert(stack);
}

View file

@ -0,0 +1,156 @@
package com.simibubi.create.content.logistics.block.redstone;
import java.util.Random;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllShapes;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.wrench.IWrenchable;
import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
import com.simibubi.create.foundation.utility.Iterate;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.HorizontalBlock;
import net.minecraft.item.BlockItemUseContext;
import net.minecraft.item.ItemStack;
import net.minecraft.state.BooleanProperty;
import net.minecraft.state.StateContainer.Builder;
import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;
import net.minecraftforge.items.CapabilityItemHandler;
public class ContentObserverBlock extends HorizontalBlock implements ITE<ContentObserverTileEntity>, IWrenchable {
public static final BooleanProperty POWERED = BlockStateProperties.POWERED;
public ContentObserverBlock(Properties properties) {
super(properties);
setDefaultState(getDefaultState().with(POWERED, false));
}
@Override
public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_,
ISelectionContext p_220053_4_) {
return AllShapes.CONTENT_OBSERVER.get(state.get(HORIZONTAL_FACING));
}
@Override
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
return AllTileEntities.CONTENT_OBSERVER.create();
}
@Override
public boolean hasTileEntity(BlockState state) {
return true;
}
@Override
protected void fillStateContainer(Builder<Block, BlockState> builder) {
builder.add(POWERED, HORIZONTAL_FACING);
super.fillStateContainer(builder);
}
@Override
public BlockState getStateForPlacement(BlockItemUseContext context) {
BlockState state = getDefaultState();
Direction preferredFacing = null;
for (Direction face : Iterate.horizontalDirections) {
BlockPos offsetPos = context.getPos()
.offset(face);
World world = context.getWorld();
boolean canDetect = false;
TileEntity tileEntity = world.getTileEntity(offsetPos);
if (TileEntityBehaviour.get(tileEntity, TransportedItemStackHandlerBehaviour.TYPE) != null)
canDetect = true;
else if (tileEntity != null && tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY)
.isPresent())
canDetect = true;
else if (tileEntity instanceof FunnelTileEntity)
canDetect = true;
if (canDetect) {
if (preferredFacing != null) {
preferredFacing = null;
break;
}
preferredFacing = face;
}
}
if (preferredFacing != null)
return state.with(HORIZONTAL_FACING, preferredFacing);
return state.with(HORIZONTAL_FACING, context.getPlacementHorizontalFacing()
.getOpposite());
}
@Override
public boolean canProvidePower(BlockState state) {
return state.get(POWERED);
}
@Override
public int getWeakPower(BlockState blockState, IBlockReader blockAccess, BlockPos pos, Direction side) {
return canProvidePower(blockState) && (side == null || side != blockState.get(HORIZONTAL_FACING)
.getOpposite()) ? 15 : 0;
}
@Override
public void scheduledTick(BlockState state, ServerWorld worldIn, BlockPos pos, Random random) {
worldIn.setBlockState(pos, state.with(POWERED, false), 2);
worldIn.notifyNeighborsOfStateChange(pos, this);
}
@Override
public boolean canConnectRedstone(BlockState state, IBlockReader world, BlockPos pos, Direction side) {
return side != state.get(HORIZONTAL_FACING)
.getOpposite();
}
@Override
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) {
TileEntityBehaviour.destroy(worldIn, pos, FilteringBehaviour.TYPE);
worldIn.removeTileEntity(pos);
}
}
public void onFunnelTransfer(World world, BlockPos funnelPos, ItemStack transferred) {
for (Direction direction : Iterate.horizontalDirections) {
BlockPos detectorPos = funnelPos.offset(direction);
BlockState detectorState = world.getBlockState(detectorPos);
if (!AllBlocks.CONTENT_OBSERVER.has(detectorState))
continue;
if (detectorState.get(HORIZONTAL_FACING) != direction.getOpposite())
continue;
withTileEntityDo(world, detectorPos, te -> {
FilteringBehaviour filteringBehaviour = TileEntityBehaviour.get(te, FilteringBehaviour.TYPE);
if (filteringBehaviour == null)
return;
if (!filteringBehaviour.test(transferred))
return;
te.activate(4);
});
}
}
@Override
public Class<ContentObserverTileEntity> getTileEntityClass() {
return ContentObserverTileEntity.class;
}
}

View file

@ -0,0 +1,108 @@
package com.simibubi.create.content.logistics.block.redstone;
import java.util.List;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour.InterfaceProvider;
import net.minecraft.block.BlockState;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
public class ContentObserverTileEntity extends SmartTileEntity {
private static final int DEFAULT_DELAY = 6;
private FilteringBehaviour filtering;
private InvManipulationBehaviour observedInventory;
public int turnOffTicks = 0;
public ContentObserverTileEntity(TileEntityType<? extends ContentObserverTileEntity> type) {
super(type);
setLazyTickRate(20);
}
@Override
public void addBehaviours(List<TileEntityBehaviour> behaviours) {
filtering = new FilteringBehaviour(this, new FilteredDetectorFilterSlot()).moveText(new Vec3d(0, 5, 0));
behaviours.add(filtering);
observedInventory = new InvManipulationBehaviour(this, InterfaceProvider.towardBlockFacing()).bypassSidedness();
behaviours.add(observedInventory);
}
@Override
public void tick() {
super.tick();
BlockState state = getBlockState();
if (turnOffTicks > 0) {
turnOffTicks--;
if (turnOffTicks == 0)
world.getPendingBlockTicks()
.scheduleTick(pos, state.getBlock(), 1);
}
if (!isActive())
return;
Direction facing = state.get(ContentObserverBlock.HORIZONTAL_FACING);
BlockPos targetPos = pos.offset(facing);
TransportedItemStackHandlerBehaviour behaviour =
TileEntityBehaviour.get(world, targetPos, TransportedItemStackHandlerBehaviour.TYPE);
if (behaviour != null) {
behaviour.handleCenteredProcessingOnAllItems(.45f, stack -> {
if (!filtering.test(stack.stack) || turnOffTicks == 6)
return TransportedResult.doNothing();
activate();
return TransportedResult.doNothing();
});
return;
}
if (!observedInventory.simulate()
.extract()
.isEmpty()) {
activate();
return;
}
}
public void activate() {
activate(DEFAULT_DELAY);
}
public void activate(int ticks) {
BlockState state = getBlockState();
turnOffTicks = ticks;
if (state.get(ContentObserverBlock.POWERED))
return;
world.setBlockState(pos, state.with(ContentObserverBlock.POWERED, true));
world.notifyNeighborsOfStateChange(pos, state.getBlock());
}
private boolean isActive() {
return true;
}
@Override
public void write(CompoundNBT compound, boolean clientPacket) {
compound.putInt("TurnOff", turnOffTicks);
super.write(compound, clientPacket);
}
@Override
protected void read(CompoundNBT compound, boolean clientPacket) {
turnOffTicks = compound.getInt("TurnOff");
super.read(compound, clientPacket);
}
}

View file

@ -1,4 +1,4 @@
package com.simibubi.create.content.logistics.block.belts.observer;
package com.simibubi.create.content.logistics.block.redstone;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform;
@ -10,9 +10,9 @@ import net.minecraft.block.BlockState;
import net.minecraft.block.HorizontalBlock;
import net.minecraft.util.math.Vec3d;
public class BeltObserverFilterSlot extends ValueBoxTransform {
public class FilteredDetectorFilterSlot extends ValueBoxTransform {
Vec3d position = VecHelper.voxelSpace(8f, 14.5f, 16f);
Vec3d position = VecHelper.voxelSpace(8f, 15.5f, 11f);
@Override
protected Vec3d getLocalOffset(BlockState state) {

View file

@ -4,17 +4,15 @@ import java.util.List;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour.InterfaceProvider;
import net.minecraft.block.BlockState;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraft.util.math.Vec3d;
import net.minecraftforge.items.IItemHandler;
public class StockpileSwitchTileEntity extends SmartTileEntity {
@ -23,7 +21,9 @@ public class StockpileSwitchTileEntity extends SmartTileEntity {
public float offWhenBelow;
public float currentLevel;
public boolean powered;
private LazyOptional<IItemHandler> observedInventory;
private FilteringBehaviour filtering;
private InvManipulationBehaviour observedInventory;
public StockpileSwitchTileEntity(TileEntityType<?> typeIn) {
super(typeIn);
@ -31,7 +31,6 @@ public class StockpileSwitchTileEntity extends SmartTileEntity {
offWhenBelow = .25f;
currentLevel = -1;
powered = false;
observedInventory = LazyOptional.empty();
setLazyTickRate(10);
}
@ -41,7 +40,6 @@ public class StockpileSwitchTileEntity extends SmartTileEntity {
offWhenBelow = compound.getFloat("OffBelow");
currentLevel = compound.getFloat("Current");
powered = compound.getBoolean("Powered");
super.read(compound, clientPacket);
}
@ -51,7 +49,6 @@ public class StockpileSwitchTileEntity extends SmartTileEntity {
compound.putFloat("OffBelow", offWhenBelow);
compound.putFloat("Current", currentLevel);
compound.putBoolean("Powered", powered);
super.write(compound, clientPacket);
}
@ -60,19 +57,19 @@ public class StockpileSwitchTileEntity extends SmartTileEntity {
}
public void updateCurrentLevel() {
if (!observedInventory.isPresent()) {
if (!findNewInventory() && currentLevel != -1) {
world.setBlockState(pos, getBlockState().with(StockpileSwitchBlock.INDICATOR, 0), 3);
currentLevel = -1;
powered = false;
world.notifyNeighbors(pos, getBlockState().getBlock());
}
if (!observedInventory.hasInventory()) {
if (currentLevel == -1)
return;
world.setBlockState(pos, getBlockState().with(StockpileSwitchBlock.INDICATOR, 0), 3);
currentLevel = -1;
powered = false;
world.notifyNeighbors(pos, getBlockState().getBlock());
return;
}
float occupied = 0;
float totalSpace = 0;
IItemHandler inv = observedInventory.orElse(null);
IItemHandler inv = observedInventory.getInventory();
for (int slot = 0; slot < inv.getSlots(); slot++) {
ItemStack stackInSlot = inv.getStackInSlot(slot);
@ -83,7 +80,9 @@ public class StockpileSwitchTileEntity extends SmartTileEntity {
continue;
totalSpace += 1;
occupied += count * (1f / space);
if (filtering.test(stackInSlot))
occupied += count * (1f / space);
}
currentLevel = (float) occupied / totalSpace;
@ -109,36 +108,16 @@ public class StockpileSwitchTileEntity extends SmartTileEntity {
super.lazyTick();
if (world.isRemote)
return;
findNewInventory();
updateCurrentLevel();
}
private boolean findNewInventory() {
observedInventory = LazyOptional.empty();
BlockPos invPos = getPos().offset(getBlockState().get(BlockStateProperties.HORIZONTAL_FACING));
if (!world.isBlockPresent(invPos))
return false;
BlockState invState = world.getBlockState(invPos);
if (!invState.hasTileEntity())
return false;
TileEntity invTE = world.getTileEntity(invPos);
if (invTE == null)
return false;
observedInventory = invTE.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY);
if (observedInventory.isPresent()) {
updateCurrentLevel();
return true;
}
return false;
}
@Override
public void addBehaviours(List<TileEntityBehaviour> behaviours) {
filtering = new FilteringBehaviour(this, new FilteredDetectorFilterSlot()).moveText(new Vec3d(0, 5, 0))
.withCallback($ -> updateCurrentLevel());
behaviours.add(filtering);
observedInventory = new InvManipulationBehaviour(this, InterfaceProvider.towardBlockFacing()).bypassSidedness();
behaviours.add(observedInventory);
}
}

View file

@ -21,7 +21,6 @@ import com.simibubi.create.content.contraptions.components.structureMovement.mou
import com.simibubi.create.content.contraptions.components.tracks.ReinforcedRailBlock;
import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeBlock;
import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock;
import com.simibubi.create.content.logistics.block.belts.observer.BeltObserverBlock;
import com.simibubi.create.content.palettes.PavedBlock;
import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.Pointing;
@ -233,48 +232,6 @@ public class BlockStateGen {
});
}
public static NonNullBiConsumer<DataGenContext<Block, BeltObserverBlock>, RegistrateBlockstateProvider> beltObserver() {
return (c, p) -> {
Map<BeltObserverBlock.Mode, Map<String, ModelFile>> models = new IdentityHashMap<>();
Map<String, ResourceLocation> baseModels = new HashMap<>();
for (boolean powered : Iterate.trueAndFalse) {
for (boolean belt : Iterate.trueAndFalse) {
String suffix = (belt ? "_belt" : "") + (powered ? "_powered" : "");
baseModels.put(suffix, p.modLoc("block/belt_observer/base" + suffix));
}
}
for (BeltObserverBlock.Mode mode : BeltObserverBlock.Mode.values()) {
String modeName = mode.getName();
HashMap<String, ModelFile> map = new HashMap<>();
for (boolean powered : Iterate.trueAndFalse) {
for (boolean belt : Iterate.trueAndFalse) {
String suffix = (belt ? "_belt" : "") + (powered ? "_powered" : "");
map.put(suffix, p.models()
.withExistingParent("block/belt_observer/" + modeName + suffix, baseModels.get(suffix))
.texture("texture",
p.modLoc("block/belt_observer_" + modeName + (powered ? "_powered" : ""))));
}
}
models.put(mode, map);
}
p.getVariantBuilder(c.get())
.forAllStates(state -> {
String suffix = (state.get(BeltObserverBlock.BELT) ? "_belt" : "")
+ (state.get(BeltObserverBlock.POWERED) ? "_powered" : "");
return ConfiguredModel.builder()
.modelFile(models.get(state.get(BeltObserverBlock.MODE))
.get(suffix))
.rotationY((int) state.get(BeltObserverBlock.HORIZONTAL_FACING)
.getHorizontalAngle())
.build();
});
};
}
public static <B extends LinearChassisBlock> NonNullBiConsumer<DataGenContext<Block, B>, RegistrateBlockstateProvider> linearChassis() {
return (c, p) -> {
ResourceLocation side = p.modLoc("block/" + c.getName() + "_side");

View file

@ -655,7 +655,7 @@ public class StandardRecipeGen extends CreateRecipeProvider {
.patternLine("B B")
.patternLine("BBB")),
BELT_OBSERVER = create(AllBlocks.BELT_OBSERVER).unlockedBy(AllItems.BELT_CONNECTOR::get)
BELT_OBSERVER = create(AllBlocks.CONTENT_OBSERVER).unlockedBy(AllItems.BELT_CONNECTOR::get)
.viaShaped(b -> b.key('B', I.brassCasing())
.key('R', I.redstone())
.key('I', I.iron())

View file

@ -3,6 +3,8 @@ package com.simibubi.create.foundation.tileEntity.behaviour.inventory;
import java.util.function.Function;
import java.util.function.Predicate;
import javax.annotation.Nullable;
import com.google.common.base.Predicates;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.item.ItemHelper;
@ -33,17 +35,18 @@ public class InvManipulationBehaviour extends TileEntityBehaviour {
protected InterfaceProvider target;
protected LazyOptional<IItemHandler> targetCapability;
protected boolean simulateNext;
protected boolean bypassSided;
private BehaviourType<InvManipulationBehaviour> behaviourType;
public static InvManipulationBehaviour forExtraction(SmartTileEntity te, InterfaceProvider target) {
return new InvManipulationBehaviour(EXTRACT, te, target);
}
public static InvManipulationBehaviour forInsertion(SmartTileEntity te, InterfaceProvider target) {
return new InvManipulationBehaviour(INSERT, te, target);
}
public InvManipulationBehaviour(SmartTileEntity te, InterfaceProvider target) {
this(TYPE, te, target);
}
@ -56,6 +59,12 @@ public class InvManipulationBehaviour extends TileEntityBehaviour {
this.target = target;
this.targetCapability = LazyOptional.empty();
simulateNext = false;
bypassSided = false;
}
public InvManipulationBehaviour bypassSidedness() {
bypassSided = true;
return this;
}
/**
@ -70,6 +79,11 @@ public class InvManipulationBehaviour extends TileEntityBehaviour {
return targetCapability.isPresent();
}
@Nullable
public IItemHandler getInventory() {
return targetCapability.orElse(null);
}
public ItemStack extract() {
return extract(getAmountFromFilter());
}
@ -158,8 +172,8 @@ public class InvManipulationBehaviour extends TileEntityBehaviour {
TileEntity invTE = world.getTileEntity(pos);
if (invTE == null)
return;
targetCapability =
invTE.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, targetBlockFace.getFace());
targetCapability = bypassSided ? invTE.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY)
: invTE.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, targetBlockFace.getFace());
if (targetCapability.isPresent())
targetCapability.addListener(this::onHandlerInvalidated);
}

View file

@ -1,116 +0,0 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"brass_casing": "create:block/brass_casing",
"extractor": "create:block/extractor",
"particle": "#texture",
"entity_detector_off": "#texture",
"entity_detector_front": "create:block/belt_observer_front"
},
"elements": [
{
"name": "Bottom",
"from": [0, 0, 0],
"to": [16, 2, 16],
"faces": {
"north": {"uv": [0, 14, 16, 16], "texture": "#brass_casing"},
"east": {"uv": [0, 0, 2, 16], "rotation": 270, "texture": "#entity_detector_off"},
"south": {"uv": [0, 14, 16, 16], "texture": "#brass_casing"},
"west": {"uv": [14, 0, 16, 16], "rotation": 90, "texture": "#entity_detector_off"},
"up": {"uv": [0, 0, 16, 16], "texture": "#brass_casing"},
"down": {"uv": [0, 0, 16, 16], "texture": "#entity_detector_off"}
}
},
{
"name": "Top",
"from": [0, 14, 0],
"to": [5, 16, 16],
"faces": {
"north": {"uv": [11, 0, 16, 2], "texture": "#brass_casing"},
"east": {"uv": [14, 0, 16, 16], "rotation": 270, "texture": "#entity_detector_off"},
"south": {"uv": [0, 0, 5, 2], "texture": "#brass_casing"},
"west": {"uv": [0, 0, 2, 16], "rotation": 90, "texture": "#entity_detector_off"},
"up": {"uv": [11, 0, 16, 16], "rotation": 180, "texture": "#entity_detector_off"},
"down": {"uv": [0, 0, 5, 16], "texture": "#brass_casing"}
}
},
{
"name": "Top",
"from": [11, 14, 0],
"to": [16, 16, 16],
"faces": {
"north": {"uv": [0, 0, 5, 2], "texture": "#brass_casing"},
"east": {"uv": [14, 0, 16, 16], "rotation": 270, "texture": "#entity_detector_off"},
"south": {"uv": [11, 0, 16, 2], "texture": "#brass_casing"},
"west": {"uv": [0, 0, 2, 16], "rotation": 90, "texture": "#entity_detector_off"},
"up": {"uv": [0, 0, 5, 16], "rotation": 180, "texture": "#entity_detector_off"},
"down": {"uv": [0, 0, 5, 16], "texture": "#brass_casing"}
}
},
{
"name": "Top",
"from": [5, 14, 0],
"to": [11, 16, 14],
"faces": {
"north": {"uv": [5, 0, 11, 2], "texture": "#brass_casing"},
"east": {"uv": [14, 0, 16, 14], "rotation": 270, "texture": "#entity_detector_off"},
"south": {"uv": [5, 1, 11, 3], "rotation": 180, "texture": "#entity_detector_off"},
"west": {"uv": [0, 0, 2, 14], "rotation": 90, "texture": "#entity_detector_off"},
"up": {"uv": [5, 2, 11, 16], "rotation": 180, "texture": "#entity_detector_off"},
"down": {"uv": [5, 2, 11, 16], "texture": "#brass_casing"}
}
},
{
"name": "Side",
"from": [0, 2, 0],
"to": [2, 14, 16],
"faces": {
"north": {"uv": [14, 2, 16, 14], "texture": "#brass_casing"},
"east": {"uv": [2, 0, 14, 16], "rotation": 90, "texture": "#brass_casing"},
"south": {"uv": [0, 2, 2, 14], "texture": "#brass_casing"},
"west": {"uv": [2, 0, 14, 16], "rotation": 90, "texture": "#entity_detector_off"},
"down": {"uv": [0, 0, 2, 16], "texture": "#entity_detector_off"}
}
},
{
"name": "Side",
"from": [14, 2, 0],
"to": [16, 14, 16],
"faces": {
"north": {"uv": [0, 2, 2, 14], "texture": "#brass_casing"},
"east": {"uv": [2, 0, 14, 16], "rotation": 270, "texture": "#entity_detector_off"},
"south": {"uv": [14, 2, 16, 14], "texture": "#brass_casing"},
"west": {"uv": [2, 0, 14, 16], "rotation": 90, "texture": "#brass_casing"},
"down": {"uv": [0, 0, 2, 16], "texture": "#entity_detector_off"}
}
},
{
"name": "Center",
"from": [2, 2, 1],
"to": [14, 14, 17],
"faces": {
"north": {"uv": [2, 2, 14, 14], "texture": "#brass_casing"},
"east": {"uv": [0, 2, 16, 14], "texture": "#entity_detector_front"},
"south": {"uv": [2, 2, 14, 14], "texture": "#entity_detector_front"},
"west": {"uv": [0, 2, 16, 14], "texture": "#entity_detector_front"},
"up": {"uv": [0, 0, 12, 16], "texture": "#brass_casing"},
"down": {"uv": [0, 0, 12, 16], "texture": "#brass_casing"}
}
},
{
"name": "Filter",
"from": [5, 13, 13],
"to": [11, 15, 18],
"rotation": {"angle": 0, "axis": "x", "origin": [9, 15, 16]},
"faces": {
"north": {"uv": [4, 1, 6, 7], "rotation": 270, "texture": "#extractor"},
"east": {"uv": [4, 2, 6, 7], "rotation": 270, "texture": "#extractor"},
"south": {"uv": [4, 1, 6, 7], "rotation": 270, "texture": "#extractor"},
"west": {"uv": [4, 2, 6, 7], "rotation": 270, "texture": "#extractor"},
"up": {"uv": [0, 9, 5, 15], "rotation": 90, "texture": "#extractor"},
"down": {"uv": [5, 5, 11, 10], "texture": "#entity_detector_off"}
}
}
]
}

View file

@ -1,131 +0,0 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"3": "create:block/extractor",
"brass_casing": "create:block/brass_casing",
"particle": "#texture",
"entity_detector_off": "#texture",
"entity_detector_front": "create:block/belt_observer_front"
},
"elements": [
{
"name": "Bottom",
"from": [0, 0, 0],
"to": [16, 2, 16],
"faces": {
"north": {"uv": [0, 14, 16, 16], "texture": "#brass_casing"},
"east": {"uv": [0, 0, 2, 16], "rotation": 270, "texture": "#entity_detector_off"},
"south": {"uv": [0, 14, 16, 16], "texture": "#brass_casing"},
"west": {"uv": [14, 0, 16, 16], "rotation": 90, "texture": "#entity_detector_off"},
"up": {"uv": [0, 0, 16, 16], "texture": "#brass_casing"},
"down": {"uv": [0, 0, 16, 16], "texture": "#entity_detector_off"}
}
},
{
"name": "Side",
"from": [0, 2, 0],
"to": [2, 14, 16],
"faces": {
"north": {"uv": [14, 2, 16, 14], "texture": "#brass_casing"},
"east": {"uv": [2, 0, 14, 16], "rotation": 90, "texture": "#brass_casing"},
"south": {"uv": [0, 2, 2, 14], "texture": "#brass_casing"},
"west": {"uv": [2, 0, 14, 16], "rotation": 90, "texture": "#entity_detector_off"},
"up": {"uv": [0, 0, 2, 16], "texture": "#entity_detector_off"},
"down": {"uv": [0, 0, 2, 16], "texture": "#entity_detector_off"}
}
},
{
"name": "Side",
"from": [14, 2, 0],
"to": [16, 14, 16],
"faces": {
"north": {"uv": [0, 2, 2, 14], "texture": "#brass_casing"},
"east": {"uv": [2, 0, 14, 16], "rotation": 270, "texture": "#entity_detector_off"},
"south": {"uv": [14, 2, 16, 14], "texture": "#brass_casing"},
"west": {"uv": [2, 0, 14, 16], "rotation": 90, "texture": "#brass_casing"},
"up": {"uv": [0, 0, 2, 16], "texture": "#entity_detector_off"},
"down": {"uv": [0, 0, 2, 16], "texture": "#entity_detector_off"}
}
},
{
"name": "Center",
"from": [2, 2, 1],
"to": [14, 14, 17],
"faces": {
"north": {"uv": [2, 2, 14, 14], "texture": "#brass_casing"},
"east": {"uv": [0, 2, 16, 14], "texture": "#entity_detector_front"},
"south": {"uv": [2, 2, 14, 14], "texture": "#entity_detector_front"},
"west": {"uv": [0, 2, 16, 14], "texture": "#entity_detector_front"},
"up": {"uv": [0, 0, 12, 16], "texture": "#brass_casing"},
"down": {"uv": [0, 0, 12, 16], "texture": "#brass_casing"}
}
},
{
"name": "Belt Thing",
"from": [1, 5, 16],
"to": [15, 11, 30],
"faces": {
"north": {"uv": [1, 0, 15, 6], "texture": "#entity_detector_off"},
"east": {"uv": [1, 0, 15, 6], "texture": "#entity_detector_off"},
"south": {"uv": [1, 0, 15, 6], "texture": "#entity_detector_off"},
"west": {"uv": [2, 0, 16, 6], "texture": "#entity_detector_off"},
"up": {"uv": [1, 1, 15, 15], "texture": "#brass_casing"},
"down": {"uv": [1, 1, 15, 15], "texture": "#brass_casing"}
}
},
{
"name": "Top",
"from": [0, 14, 0],
"to": [5, 16, 16],
"faces": {
"north": {"uv": [11, 0, 16, 2], "texture": "#brass_casing"},
"east": {"uv": [14, 0, 16, 16], "rotation": 270, "texture": "#entity_detector_off"},
"south": {"uv": [0, 0, 5, 2], "texture": "#brass_casing"},
"west": {"uv": [0, 0, 2, 16], "rotation": 90, "texture": "#entity_detector_off"},
"up": {"uv": [11, 0, 16, 16], "rotation": 180, "texture": "#entity_detector_off"},
"down": {"uv": [0, 0, 5, 16], "texture": "#entity_detector_off"}
}
},
{
"name": "Top",
"from": [5, 14, 0],
"to": [11, 16, 14],
"faces": {
"north": {"uv": [5, 0, 11, 2], "texture": "#brass_casing"},
"east": {"uv": [14, 0, 16, 14], "rotation": 270, "texture": "#entity_detector_off"},
"south": {"uv": [5, 1, 11, 3], "rotation": 180, "texture": "#entity_detector_off"},
"west": {"uv": [0, 0, 2, 14], "rotation": 90, "texture": "#entity_detector_off"},
"up": {"uv": [5, 2, 11, 16], "rotation": 180, "texture": "#entity_detector_off"},
"down": {"uv": [5, 2, 11, 16], "texture": "#entity_detector_off"}
}
},
{
"name": "Top",
"from": [11, 14, 0],
"to": [16, 16, 16],
"faces": {
"north": {"uv": [0, 0, 5, 2], "texture": "#brass_casing"},
"east": {"uv": [14, 0, 16, 16], "rotation": 270, "texture": "#entity_detector_off"},
"south": {"uv": [11, 0, 16, 2], "texture": "#brass_casing"},
"west": {"uv": [0, 0, 2, 16], "rotation": 90, "texture": "#entity_detector_off"},
"up": {"uv": [0, 0, 5, 16], "rotation": 180, "texture": "#entity_detector_off"},
"down": {"uv": [0, 0, 5, 16], "texture": "#entity_detector_off"}
}
},
{
"name": "Filter",
"from": [5, 13, 13],
"to": [11, 15, 18],
"rotation": {"angle": 0, "axis": "y", "origin": [9, 15, 16]},
"faces": {
"north": {"uv": [4, 1, 6, 7], "rotation": 270, "texture": "#3"},
"east": {"uv": [4, 2, 6, 7], "rotation": 270, "texture": "#3"},
"south": {"uv": [4, 1, 6, 7], "rotation": 270, "texture": "#3"},
"west": {"uv": [4, 2, 6, 7], "rotation": 270, "texture": "#3"},
"up": {"uv": [0, 9, 5, 15], "rotation": 90, "texture": "#3"},
"down": {"uv": [5, 5, 11, 10], "texture": "#3"}
}
}
]
}

View file

@ -1,6 +0,0 @@
{
"parent": "create:block/belt_observer/base_belt",
"textures": {
"3": "create:block/extractor_powered"
}
}

View file

@ -1,6 +0,0 @@
{
"parent": "create:block/belt_observer/base",
"textures": {
"extractor": "create:block/extractor_powered"
}
}

View file

@ -1,88 +0,0 @@
{
"__comment": "Model generated using MrCrayfish's Model Creator (https://mrcrayfish.com/tools?id=mc)",
"parent": "block/block",
"display": {
"gui": {
"rotation": [ 30, 45, 0 ],
"translation": [ 0, 0, 0],
"scale":[ 0.625, 0.625, 0.625 ]
},
"fixed": {
"rotation": [ 0, 180, 0 ],
"translation": [ 0, 0, 0],
"scale":[ 0.5, 0.5, 0.5 ]
}
},
"textures": {
"brass_casing": "create:block/brass_casing",
"entity_detector_off": "create:block/belt_observer_detect",
"entity_detector_front": "create:block/belt_observer_front"
},
"elements": [
{
"name": "Bottom",
"from": [ 0, 0, 0 ],
"to": [ 16, 2, 16 ],
"faces": {
"north": { "texture": "#brass_casing", "uv": [ 0, 14, 16, 16 ] },
"east": { "texture": "#entity_detector_off", "uv": [ 0, 0, 2, 16 ], "rotation": 270 },
"south": { "texture": "#brass_casing", "uv": [ 0, 14, 16, 16 ] },
"west": { "texture": "#entity_detector_off", "uv": [ 14, 0, 16, 16 ], "rotation": 90 },
"up": { "texture": "#brass_casing", "uv": [ 0, 0, 16, 16 ] },
"down": { "texture": "#entity_detector_off", "uv": [ 0, 0, 16, 16 ] }
}
},
{
"name": "Top",
"from": [ 0, 14, 0 ],
"to": [ 16, 16, 16 ],
"faces": {
"north": { "texture": "#brass_casing", "uv": [ 0, 0, 16, 2 ] },
"east": { "texture": "#entity_detector_off", "uv": [ 14, 0, 16, 16 ], "rotation": 270 },
"south": { "texture": "#brass_casing", "uv": [ 0, 0, 16, 2 ] },
"west": { "texture": "#entity_detector_off", "uv": [ 0, 0, 2, 16 ], "rotation": 90 },
"up": { "texture": "#entity_detector_off", "uv": [ 0, 0, 16, 16 ], "rotation": 180 },
"down": { "texture": "#brass_casing", "uv": [ 0, 0, 16, 16 ] }
}
},
{
"name": "Side",
"from": [ 0, 2, 0 ],
"to": [ 2, 14, 16 ],
"faces": {
"north": { "texture": "#brass_casing", "uv": [ 14, 2, 16, 14 ] },
"east": { "texture": "#brass_casing", "uv": [ 2, 0, 14, 16 ], "rotation": 90 },
"south": { "texture": "#brass_casing", "uv": [ 0, 2, 2, 14 ] },
"west": { "texture": "#entity_detector_off", "uv": [ 2, 0, 14, 16 ], "rotation": 90 },
"up": { "texture": "#entity_detector_off", "uv": [ 0, 0, 2, 16 ] },
"down": { "texture": "#entity_detector_off", "uv": [ 0, 0, 2, 16 ] }
}
},
{
"name": "Side",
"from": [ 14, 2, 0 ],
"to": [ 16, 14, 16 ],
"faces": {
"north": { "texture": "#brass_casing", "uv": [ 0, 2, 2, 14 ] },
"east": { "texture": "#entity_detector_off", "uv": [ 2, 0, 14, 16 ], "rotation": 270 },
"south": { "texture": "#brass_casing", "uv": [ 14, 2, 16, 14 ] },
"west": { "texture": "#brass_casing", "uv": [ 2, 0, 14, 16 ], "rotation": 90 },
"up": { "texture": "#entity_detector_off", "uv": [ 0, 0, 2, 16 ] },
"down": { "texture": "#entity_detector_off", "uv": [ 0, 0, 2, 16 ] }
}
},
{
"name": "Center",
"from": [ 2, 2, 1 ],
"to": [ 14, 14, 17 ],
"faces": {
"north": { "texture": "#brass_casing", "uv": [ 2, 2, 14, 14 ] },
"east": { "texture": "#entity_detector_front", "uv": [ 0, 2, 16, 14 ] },
"south": { "texture": "#entity_detector_front", "uv": [ 2, 2, 14, 14 ] },
"west": { "texture": "#entity_detector_front", "uv": [ 0, 2, 16, 14 ] },
"up": { "texture": "#brass_casing", "uv": [ 0, 0, 12, 16 ] },
"down": { "texture": "#brass_casing", "uv": [ 0, 0, 12, 16 ] }
}
}
]
}

View file

@ -0,0 +1,80 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"5": "create:block/brass_casing_inner",
"8": "create:block/content_observer",
"9": "create:block/content_observer_inner",
"10": "create:block/filtered_detector_top",
"brass_casing": "create:block/brass_casing",
"particle": "create:block/brass_casing_side",
"1_brass_casing": "create:block/brass_casing_side",
"end": "create:block/filtered_detector_front"
},
"elements": [
{
"name": "Bottom Plate",
"from": [0, 0, 0],
"to": [16, 6, 16],
"faces": {
"north": {"uv": [0, 10, 16, 16], "texture": "#8"},
"east": {"uv": [0, 10, 16, 16], "texture": "#8"},
"south": {"uv": [0, 10, 16, 16], "texture": "#8"},
"west": {"uv": [0, 10, 16, 16], "texture": "#8"},
"up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#9"},
"down": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#brass_casing"}
}
},
{
"name": "Center",
"from": [0.9, 2, 0.9],
"to": [15.1, 14, 15.1],
"faces": {
"north": {"uv": [0, 1, 12, 15], "rotation": 90, "texture": "#5"},
"east": {"uv": [0, 1, 12, 15], "rotation": 90, "texture": "#5"},
"south": {"uv": [0, 1, 12, 15], "rotation": 90, "texture": "#5"},
"west": {"uv": [0, 1, 12, 15], "rotation": 90, "texture": "#5"},
"up": {"uv": [0, 0, 14, 14], "rotation": 90, "texture": "#5"},
"down": {"uv": [0, 0, 14, 14], "rotation": 270, "texture": "#5"}
}
},
{
"name": "Indicator",
"from": [3.1, 3.1, -1.9],
"to": [12.9, 12.9, 1.1],
"faces": {
"north": {"uv": [0, 0, 10, 10], "texture": "#end"},
"east": {"uv": [10, 0, 13, 10], "texture": "#end"},
"west": {"uv": [10, 0, 13, 10], "texture": "#end"},
"up": {"uv": [10, 0, 13, 10], "rotation": 90, "texture": "#end"},
"down": {"uv": [10, 0, 13, 10], "rotation": 270, "texture": "#end"}
}
},
{
"name": "Top Plate",
"from": [0, 14, 0],
"to": [16, 16, 16],
"faces": {
"north": {"uv": [0, 0, 16, 2], "texture": "#1_brass_casing"},
"east": {"uv": [0, 0, 16, 2], "texture": "#1_brass_casing"},
"south": {"uv": [0, 0, 16, 2], "texture": "#1_brass_casing"},
"west": {"uv": [0, 0, 16, 2], "texture": "#1_brass_casing"},
"up": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#10"},
"down": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#brass_casing"}
}
}
],
"display": {
"gui": {
"rotation": [30, -135, 0],
"scale": [0.625, 0.625, 0.625]
}
},
"groups": [
{
"name": "stockpile_switch",
"origin": [8, 8, 8],
"children": [0, 1, 2, 3]
}
]
}

View file

@ -0,0 +1,7 @@
{
"parent": "create:block/content_observer/block",
"textures": {
"8": "create:block/content_observer_powered",
"9": "create:block/content_observer_inner_powered"
}
}

View file

@ -4,10 +4,11 @@
"textures": {
"5": "create:block/brass_casing_inner",
"6": "create:block/brass_casing",
"7": "create:block/filtered_detector_top",
"indicator": "create:block/indicator/0",
"particle": "create:block/brass_casing_side",
"brass_casing": "create:block/brass_casing_side",
"end": "create:block/stockpile_switch_end"
"end": "create:block/filtered_detector_front"
},
"elements": [
{
@ -32,16 +33,16 @@
"east": {"uv": [0, 0, 16, 2], "texture": "#brass_casing"},
"south": {"uv": [0, 0, 16, 2], "texture": "#brass_casing"},
"west": {"uv": [0, 0, 16, 2], "texture": "#brass_casing"},
"up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#6"},
"up": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#7"},
"down": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#6"}
}
},
{
"name": "Center",
"from": [1, 2, 1],
"to": [15, 14, 15],
"from": [0.9, 2, 0.9],
"to": [15.1, 14, 15.1],
"faces": {
"north": {"uv": [0, 0, 14, 12], "texture": "#5"},
"north": {"uv": [0, 1, 12, 15], "rotation": 90, "texture": "#5"},
"east": {"uv": [0, 1, 12, 15], "rotation": 90, "texture": "#5"},
"south": {"uv": [0, 1, 12, 15], "rotation": 90, "texture": "#5"},
"west": {"uv": [0, 1, 12, 15], "rotation": 90, "texture": "#5"},

Binary file not shown.

Before

Width:  |  Height:  |  Size: 492 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 481 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 503 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 533 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 388 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 514 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 536 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 534 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 530 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 315 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 308 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 305 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 453 B