Directed Funneling and Chute Funnels

- Added a funnel block variant that interacts with chutes horizontally (same item)
- Belt and Chute Funnels now have a push/pull property
- Removed Chute Ports
This commit is contained in:
simibubi 2020-06-25 21:38:23 +02:00
parent 457050ab2f
commit f79d168bc7
41 changed files with 762 additions and 220 deletions

View file

@ -17,7 +17,7 @@ a579c40c43dc2174afb66f42d00d0c4a0efaaeee assets\create\blockstates\andesite_bric
398922758a6219544e5b85c91c9cf8a543b437e5 assets\create\blockstates\andesite_pillar.json 398922758a6219544e5b85c91c9cf8a543b437e5 assets\create\blockstates\andesite_pillar.json
f9fa6aa530eb0891a74eadfbebc663172a57147a assets\create\blockstates\basin.json f9fa6aa530eb0891a74eadfbebc663172a57147a assets\create\blockstates\basin.json
96a4fae5883eda130f8ec1a57d34534f6d0793c4 assets\create\blockstates\belt.json 96a4fae5883eda130f8ec1a57d34534f6d0793c4 assets\create\blockstates\belt.json
fe0278550e4795cc9757e726b88db12b599ec9ef assets\create\blockstates\belt_funnel.json 9bbc9a2dc2428175ae0cadf7537ed6815e3e241d assets\create\blockstates\belt_funnel.json
40d10934934ea142d71fc6ce598b1455c3ad47b4 assets\create\blockstates\belt_observer.json 40d10934934ea142d71fc6ce598b1455c3ad47b4 assets\create\blockstates\belt_observer.json
4325605fbdea60d5f54286c309c825bebcd74b95 assets\create\blockstates\belt_tunnel.json 4325605fbdea60d5f54286c309c825bebcd74b95 assets\create\blockstates\belt_tunnel.json
cf9045eb16e5299a1d917c4cb536289f49411276 assets\create\blockstates\birch_window.json cf9045eb16e5299a1d917c4cb536289f49411276 assets\create\blockstates\birch_window.json
@ -32,7 +32,7 @@ b8dd6e505943e06706d0718ece620ab3cf943650 assets\create\blockstates\brass_casing.
cbcdab42d01f8085db9e5f8db884f8adf7f17625 assets\create\blockstates\chiseled_scoria.json cbcdab42d01f8085db9e5f8db884f8adf7f17625 assets\create\blockstates\chiseled_scoria.json
291952556c52fba2af5bbd793c71af81abd27e71 assets\create\blockstates\chiseled_weathered_limestone.json 291952556c52fba2af5bbd793c71af81abd27e71 assets\create\blockstates\chiseled_weathered_limestone.json
99def0a786714a337e2b1b17db844e4d1aee6234 assets\create\blockstates\chute.json 99def0a786714a337e2b1b17db844e4d1aee6234 assets\create\blockstates\chute.json
9ca4713c8efed79da6ab11354a25e5f8fbd6341c assets\create\blockstates\chute_port.json dabf21c320b6d33486478cb0e4b4bbd62a753c7a assets\create\blockstates\chute_funnel.json
4947c261310445fa55b92038326ac82967d192dd assets\create\blockstates\clockwork_bearing.json 4947c261310445fa55b92038326ac82967d192dd assets\create\blockstates\clockwork_bearing.json
1f33834c685e3243882acfe20183fe64dfa872be assets\create\blockstates\clutch.json 1f33834c685e3243882acfe20183fe64dfa872be assets\create\blockstates\clutch.json
e5e3757e99c139d67b2a70288466d8a74d818841 assets\create\blockstates\cogwheel.json e5e3757e99c139d67b2a70288466d8a74d818841 assets\create\blockstates\cogwheel.json
@ -335,8 +335,8 @@ c60c3115fd6eeaa3a696428a87a74d184ab7d62d assets\create\blockstates\weathered_lim
c77b46d8b459e5c7cc495393546f3fcca8a1fa1d assets\create\blockstates\weathered_limestone_pillar.json c77b46d8b459e5c7cc495393546f3fcca8a1fa1d assets\create\blockstates\weathered_limestone_pillar.json
7f39521b211441f5c3e06d60c5978cebe16cacfb assets\create\blockstates\zinc_block.json 7f39521b211441f5c3e06d60c5978cebe16cacfb assets\create\blockstates\zinc_block.json
b7181bcd8182b2f17088e5aa881f374c9c65470c assets\create\blockstates\zinc_ore.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets\create\blockstates\zinc_ore.json
5753bc985f4c202fe16387c32fb8ad80c631c933 assets\create\lang\en_ud.json d6d4eaadc6f2c86dd69b8a818ca7352b85be52cd assets\create\lang\en_ud.json
0640b1b64ac1a1e337178f932f22b0b2aea61d46 assets\create\lang\en_us.json 0cc26662a5c436a5703926fe3509f0a9536ee737 assets\create\lang\en_us.json
846200eb548d3bfa2e77b41039de159b4b6cfb45 assets\create\models\block\acacia_window.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets\create\models\block\acacia_window.json
1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets\create\models\block\acacia_window_pane_noside.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets\create\models\block\acacia_window_pane_noside.json
1763ea2c9b981d187f5031ba608f3d5d3be3986a assets\create\models\block\acacia_window_pane_noside_alt.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets\create\models\block\acacia_window_pane_noside_alt.json
@ -377,6 +377,12 @@ a033fbac3129bba9211c6c4a0e16c905643afa39 assets\create\models\block\andesite_cob
1c574ee47aeb6fcb305bfc95dd131e153b795a0e assets\create\models\block\andesite_cobblestone_wall_post.json 1c574ee47aeb6fcb305bfc95dd131e153b795a0e assets\create\models\block\andesite_cobblestone_wall_post.json
0ed983628e8868f77301bea1111570d3631f24fb assets\create\models\block\andesite_cobblestone_wall_side.json 0ed983628e8868f77301bea1111570d3631f24fb assets\create\models\block\andesite_cobblestone_wall_side.json
b1d0bb538fc8285b7d3fd77a977d78a104b83b62 assets\create\models\block\andesite_pillar.json b1d0bb538fc8285b7d3fd77a977d78a104b83b62 assets\create\models\block\andesite_pillar.json
3928a75e18fc9fe02e3d72696e5dfddd40ef164c assets\create\models\block\belt_funnel_pull_off_extended.json
024fdab5f6bb0559bb18d2c3cffa1d5a7baf76e9 assets\create\models\block\belt_funnel_pull_off_retracted.json
eecd774d431bd9c30649e824421ead350b5333cd assets\create\models\block\belt_funnel_pull_on_extended.json
8e6e5caf8befa95d68280ecfaca9a07313570524 assets\create\models\block\belt_funnel_pull_on_retracted.json
5e93193368ebdf0fa4d53b19a306431e6d3ab099 assets\create\models\block\belt_funnel_push_on_extended.json
08f8ffc241e9a49a0981026602deb0230dd8258a assets\create\models\block\belt_funnel_push_on_retracted.json
e8bfb63e0a4426f9d95cd111640169b218dead1b assets\create\models\block\belt_observer\detect.json e8bfb63e0a4426f9d95cd111640169b218dead1b assets\create\models\block\belt_observer\detect.json
a2e63810eceb028484b193ddf4315e1811950dc8 assets\create\models\block\belt_observer\detect_belt.json a2e63810eceb028484b193ddf4315e1811950dc8 assets\create\models\block\belt_observer\detect_belt.json
034c308d46def892e6638ac0b3374849a6a88a26 assets\create\models\block\belt_observer\detect_belt_powered.json 034c308d46def892e6638ac0b3374849a6a88a26 assets\create\models\block\belt_observer\detect_belt_powered.json
@ -407,6 +413,9 @@ cd7751090cf3d55296b8e415d0af9b6f18d69770 assets\create\models\block\chiseled_gab
d2e195aa2e90c712e51d855a9a4a334b52f62a69 assets\create\models\block\chiseled_limestone.json d2e195aa2e90c712e51d855a9a4a334b52f62a69 assets\create\models\block\chiseled_limestone.json
ac07568fa7b2d3fa84d0fe89a498514d30514291 assets\create\models\block\chiseled_scoria.json ac07568fa7b2d3fa84d0fe89a498514d30514291 assets\create\models\block\chiseled_scoria.json
ecb2b85ee210dce329d2be66b98d0f0d4e6fc223 assets\create\models\block\chiseled_weathered_limestone.json ecb2b85ee210dce329d2be66b98d0f0d4e6fc223 assets\create\models\block\chiseled_weathered_limestone.json
d3a156e746f890b8a0b92caa70b8eb6e690f0fb6 assets\create\models\block\chute_funnel_pull_off.json
5e4424fb63041a449ddffe143ee766018d064c8f assets\create\models\block\chute_funnel_pull_on.json
ac32d22841b5d37ef182869f605b9a97075f3d33 assets\create\models\block\chute_funnel_push_on.json
f9a3f0939ea43b404eb2826b94211a25fca5ebc2 assets\create\models\block\clockwork_bearing.json f9a3f0939ea43b404eb2826b94211a25fca5ebc2 assets\create\models\block\clockwork_bearing.json
70406933cc4fa5471af6e562fd84a397347dba17 assets\create\models\block\copper_casing.json 70406933cc4fa5471af6e562fd84a397347dba17 assets\create\models\block\copper_casing.json
1ef7060b0ca7e9c0bfc8151f98ca08da31862cda assets\create\models\block\crate\brass\bottom.json 1ef7060b0ca7e9c0bfc8151f98ca08da31862cda assets\create\models\block\crate\brass\bottom.json
@ -964,7 +973,6 @@ afd697168c9786eb80e54eccdc6a23afa6c7fb0e assets\create\models\item\chiseled_gabb
a47fbe5f2da79080d99ef0975bfa8da4d08f8be4 assets\create\models\item\chiseled_scoria.json a47fbe5f2da79080d99ef0975bfa8da4d08f8be4 assets\create\models\item\chiseled_scoria.json
70232ce9b88119fb383717e2c1ad113f7aad6a99 assets\create\models\item\chiseled_weathered_limestone.json 70232ce9b88119fb383717e2c1ad113f7aad6a99 assets\create\models\item\chiseled_weathered_limestone.json
fe67c3f380d17735a9436a4579a8be1a02b8e4a0 assets\create\models\item\chute.json fe67c3f380d17735a9436a4579a8be1a02b8e4a0 assets\create\models\item\chute.json
3b91cda68b823bf8d49a2e0cccd1b7f7c090e103 assets\create\models\item\chute_port.json
b1531a7bd3f7f27b9587d13e818a93dc2d088bc8 assets\create\models\item\clockwork_bearing.json b1531a7bd3f7f27b9587d13e818a93dc2d088bc8 assets\create\models\item\clockwork_bearing.json
0a2a0f0aafeab0088172f77afd40c1fa2cc1f2b8 assets\create\models\item\clutch.json 0a2a0f0aafeab0088172f77afd40c1fa2cc1f2b8 assets\create\models\item\clutch.json
dcb09deae110077bcddf090996b51cc66e9a7de3 assets\create\models\item\cogwheel.json dcb09deae110077bcddf090996b51cc66e9a7de3 assets\create\models\item\cogwheel.json
@ -1748,7 +1756,7 @@ ab820bbaaf67c6697dfbab33c05fb73b18c70bfb data\create\loot_tables\blocks\chiseled
43f446abd3c1c184a08645979edf620e59955a30 data\create\loot_tables\blocks\chiseled_scoria.json 43f446abd3c1c184a08645979edf620e59955a30 data\create\loot_tables\blocks\chiseled_scoria.json
adde89e46b12de1eee6fd0c5cb98c5f45feefc15 data\create\loot_tables\blocks\chiseled_weathered_limestone.json adde89e46b12de1eee6fd0c5cb98c5f45feefc15 data\create\loot_tables\blocks\chiseled_weathered_limestone.json
07ccc1576a71338cb73c4e06f8c28a2c86843877 data\create\loot_tables\blocks\chute.json 07ccc1576a71338cb73c4e06f8c28a2c86843877 data\create\loot_tables\blocks\chute.json
dcd45562a3459e5fd620727090d9c3c01c8ce0a4 data\create\loot_tables\blocks\chute_port.json 617f27876863dda6a16d6818231bc52de104fc70 data\create\loot_tables\blocks\chute_funnel.json
778b53c36d73b6e9c78fd6c091c9c3535c3c18f7 data\create\loot_tables\blocks\clockwork_bearing.json 778b53c36d73b6e9c78fd6c091c9c3535c3c18f7 data\create\loot_tables\blocks\clockwork_bearing.json
d76113310fc56eca6382d44df174096f2210d416 data\create\loot_tables\blocks\clutch.json d76113310fc56eca6382d44df174096f2210d416 data\create\loot_tables\blocks\clutch.json
673ba3a5deae9133b917d16c9eb87fe4c2873c8a data\create\loot_tables\blocks\cogwheel.json 673ba3a5deae9133b917d16c9eb87fe4c2873c8a data\create\loot_tables\blocks\cogwheel.json

View file

@ -1,63 +1,123 @@
{ {
"variants": { "variants": {
"facing=north,powered=false,shape=retracted": { "facing=north,powered=false,pushing=false,shape=retracted": {
"model": "create:block/belt_funnel_pull_off_retracted"
},
"facing=south,powered=false,pushing=false,shape=retracted": {
"model": "create:block/belt_funnel_pull_off_retracted",
"y": 180
},
"facing=west,powered=false,pushing=false,shape=retracted": {
"model": "create:block/belt_funnel_pull_off_retracted",
"y": 270
},
"facing=east,powered=false,pushing=false,shape=retracted": {
"model": "create:block/belt_funnel_pull_off_retracted",
"y": 90
},
"facing=north,powered=true,pushing=false,shape=retracted": {
"model": "create:block/belt_funnel_pull_on_retracted"
},
"facing=south,powered=true,pushing=false,shape=retracted": {
"model": "create:block/belt_funnel_pull_on_retracted",
"y": 180
},
"facing=west,powered=true,pushing=false,shape=retracted": {
"model": "create:block/belt_funnel_pull_on_retracted",
"y": 270
},
"facing=east,powered=true,pushing=false,shape=retracted": {
"model": "create:block/belt_funnel_pull_on_retracted",
"y": 90
},
"facing=north,powered=false,pushing=true,shape=retracted": {
"model": "create:block/belt_funnel/block_retracted" "model": "create:block/belt_funnel/block_retracted"
}, },
"facing=south,powered=false,shape=retracted": { "facing=south,powered=false,pushing=true,shape=retracted": {
"model": "create:block/belt_funnel/block_retracted", "model": "create:block/belt_funnel/block_retracted",
"y": 180 "y": 180
}, },
"facing=west,powered=false,shape=retracted": { "facing=west,powered=false,pushing=true,shape=retracted": {
"model": "create:block/belt_funnel/block_retracted", "model": "create:block/belt_funnel/block_retracted",
"y": 270 "y": 270
}, },
"facing=east,powered=false,shape=retracted": { "facing=east,powered=false,pushing=true,shape=retracted": {
"model": "create:block/belt_funnel/block_retracted", "model": "create:block/belt_funnel/block_retracted",
"y": 90 "y": 90
}, },
"facing=north,powered=true,shape=retracted": { "facing=north,powered=true,pushing=true,shape=retracted": {
"model": "create:block/belt_funnel/block_retracted_powered" "model": "create:block/belt_funnel_push_on_retracted"
}, },
"facing=south,powered=true,shape=retracted": { "facing=south,powered=true,pushing=true,shape=retracted": {
"model": "create:block/belt_funnel/block_retracted_powered", "model": "create:block/belt_funnel_push_on_retracted",
"y": 180 "y": 180
}, },
"facing=west,powered=true,shape=retracted": { "facing=west,powered=true,pushing=true,shape=retracted": {
"model": "create:block/belt_funnel/block_retracted_powered", "model": "create:block/belt_funnel_push_on_retracted",
"y": 270 "y": 270
}, },
"facing=east,powered=true,shape=retracted": { "facing=east,powered=true,pushing=true,shape=retracted": {
"model": "create:block/belt_funnel/block_retracted_powered", "model": "create:block/belt_funnel_push_on_retracted",
"y": 90 "y": 90
}, },
"facing=north,powered=false,shape=extended": { "facing=north,powered=false,pushing=false,shape=extended": {
"model": "create:block/belt_funnel_pull_off_extended"
},
"facing=south,powered=false,pushing=false,shape=extended": {
"model": "create:block/belt_funnel_pull_off_extended",
"y": 180
},
"facing=west,powered=false,pushing=false,shape=extended": {
"model": "create:block/belt_funnel_pull_off_extended",
"y": 270
},
"facing=east,powered=false,pushing=false,shape=extended": {
"model": "create:block/belt_funnel_pull_off_extended",
"y": 90
},
"facing=north,powered=true,pushing=false,shape=extended": {
"model": "create:block/belt_funnel_pull_on_extended"
},
"facing=south,powered=true,pushing=false,shape=extended": {
"model": "create:block/belt_funnel_pull_on_extended",
"y": 180
},
"facing=west,powered=true,pushing=false,shape=extended": {
"model": "create:block/belt_funnel_pull_on_extended",
"y": 270
},
"facing=east,powered=true,pushing=false,shape=extended": {
"model": "create:block/belt_funnel_pull_on_extended",
"y": 90
},
"facing=north,powered=false,pushing=true,shape=extended": {
"model": "create:block/belt_funnel/block_extended" "model": "create:block/belt_funnel/block_extended"
}, },
"facing=south,powered=false,shape=extended": { "facing=south,powered=false,pushing=true,shape=extended": {
"model": "create:block/belt_funnel/block_extended", "model": "create:block/belt_funnel/block_extended",
"y": 180 "y": 180
}, },
"facing=west,powered=false,shape=extended": { "facing=west,powered=false,pushing=true,shape=extended": {
"model": "create:block/belt_funnel/block_extended", "model": "create:block/belt_funnel/block_extended",
"y": 270 "y": 270
}, },
"facing=east,powered=false,shape=extended": { "facing=east,powered=false,pushing=true,shape=extended": {
"model": "create:block/belt_funnel/block_extended", "model": "create:block/belt_funnel/block_extended",
"y": 90 "y": 90
}, },
"facing=north,powered=true,shape=extended": { "facing=north,powered=true,pushing=true,shape=extended": {
"model": "create:block/belt_funnel/block_extended_powered" "model": "create:block/belt_funnel_push_on_extended"
}, },
"facing=south,powered=true,shape=extended": { "facing=south,powered=true,pushing=true,shape=extended": {
"model": "create:block/belt_funnel/block_extended_powered", "model": "create:block/belt_funnel_push_on_extended",
"y": 180 "y": 180
}, },
"facing=west,powered=true,shape=extended": { "facing=west,powered=true,pushing=true,shape=extended": {
"model": "create:block/belt_funnel/block_extended_powered", "model": "create:block/belt_funnel_push_on_extended",
"y": 270 "y": 270
}, },
"facing=east,powered=true,shape=extended": { "facing=east,powered=true,pushing=true,shape=extended": {
"model": "create:block/belt_funnel/block_extended_powered", "model": "create:block/belt_funnel_push_on_extended",
"y": 90 "y": 90
} }
} }

View file

@ -0,0 +1,64 @@
{
"variants": {
"facing=north,powered=false,pushing=false": {
"model": "create:block/chute_funnel_pull_off"
},
"facing=south,powered=false,pushing=false": {
"model": "create:block/chute_funnel_pull_off",
"y": 180
},
"facing=west,powered=false,pushing=false": {
"model": "create:block/chute_funnel_pull_off",
"y": 270
},
"facing=east,powered=false,pushing=false": {
"model": "create:block/chute_funnel_pull_off",
"y": 90
},
"facing=north,powered=true,pushing=false": {
"model": "create:block/chute_funnel_pull_on"
},
"facing=south,powered=true,pushing=false": {
"model": "create:block/chute_funnel_pull_on",
"y": 180
},
"facing=west,powered=true,pushing=false": {
"model": "create:block/chute_funnel_pull_on",
"y": 270
},
"facing=east,powered=true,pushing=false": {
"model": "create:block/chute_funnel_pull_on",
"y": 90
},
"facing=north,powered=false,pushing=true": {
"model": "create:block/chute_funnel/block"
},
"facing=south,powered=false,pushing=true": {
"model": "create:block/chute_funnel/block",
"y": 180
},
"facing=west,powered=false,pushing=true": {
"model": "create:block/chute_funnel/block",
"y": 270
},
"facing=east,powered=false,pushing=true": {
"model": "create:block/chute_funnel/block",
"y": 90
},
"facing=north,powered=true,pushing=true": {
"model": "create:block/chute_funnel_push_on"
},
"facing=south,powered=true,pushing=true": {
"model": "create:block/chute_funnel_push_on",
"y": 180
},
"facing=west,powered=true,pushing=true": {
"model": "create:block/chute_funnel_push_on",
"y": 270
},
"facing=east,powered=true,pushing=true": {
"model": "create:block/chute_funnel_push_on",
"y": 90
}
}
}

View file

@ -1,19 +0,0 @@
{
"variants": {
"facing=north": {
"model": "create:block/chute_port"
},
"facing=south": {
"model": "create:block/chute_port",
"y": 180
},
"facing=west": {
"model": "create:block/chute_port",
"y": 270
},
"facing=east": {
"model": "create:block/chute_port",
"y": 90
}
}
}

View file

@ -33,7 +33,7 @@
"block.create.chiseled_scoria": "\u0250\u0131\u0279o\u0254S p\u01DD\u05DF\u01DDs\u0131\u0265\u0186", "block.create.chiseled_scoria": "\u0250\u0131\u0279o\u0254S p\u01DD\u05DF\u01DDs\u0131\u0265\u0186",
"block.create.chiseled_weathered_limestone": "\u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM p\u01DD\u05DF\u01DDs\u0131\u0265\u0186", "block.create.chiseled_weathered_limestone": "\u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM p\u01DD\u05DF\u01DDs\u0131\u0265\u0186",
"block.create.chute": "\u01DD\u0287n\u0265\u0186", "block.create.chute": "\u01DD\u0287n\u0265\u0186",
"block.create.chute_port": "\u0287\u0279o\u0500 \u01DD\u0287n\u0265\u0186", "block.create.chute_funnel": "\u05DF\u01DDuun\u2132 \u01DD\u0287n\u0265\u0186",
"block.create.clockwork_bearing": "bu\u0131\u0279\u0250\u01DD\u15FA \u029E\u0279o\u028D\u029E\u0254o\u05DF\u0186", "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.clutch": "\u0265\u0254\u0287n\u05DF\u0186",
"block.create.cogwheel": "\u05DF\u01DD\u01DD\u0265\u028Dbo\u0186", "block.create.cogwheel": "\u05DF\u01DD\u01DD\u0265\u028Dbo\u0186",

View file

@ -36,7 +36,7 @@
"block.create.chiseled_scoria": "Chiseled Scoria", "block.create.chiseled_scoria": "Chiseled Scoria",
"block.create.chiseled_weathered_limestone": "Chiseled Weathered Limestone", "block.create.chiseled_weathered_limestone": "Chiseled Weathered Limestone",
"block.create.chute": "Chute", "block.create.chute": "Chute",
"block.create.chute_port": "Chute Port", "block.create.chute_funnel": "Chute Funnel",
"block.create.clockwork_bearing": "Clockwork Bearing", "block.create.clockwork_bearing": "Clockwork Bearing",
"block.create.clutch": "Clutch", "block.create.clutch": "Clutch",
"block.create.cogwheel": "Cogwheel", "block.create.cogwheel": "Cogwheel",

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/belt_funnel/block_extended",
"textures": {
"2": "create:block/belt_funnel_pull_off"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/belt_funnel/block_retracted",
"textures": {
"2": "create:block/belt_funnel_pull_off"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/belt_funnel/block_extended",
"textures": {
"2": "create:block/belt_funnel_pull_on"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/belt_funnel/block_retracted",
"textures": {
"2": "create:block/belt_funnel_pull_on"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/belt_funnel/block_extended",
"textures": {
"2": "create:block/belt_funnel_push_on"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/belt_funnel/block_retracted",
"textures": {
"2": "create:block/belt_funnel_push_on"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/chute_funnel/block",
"textures": {
"3": "create:block/belt_funnel_pull_off"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/chute_funnel/block",
"textures": {
"3": "create:block/belt_funnel_pull_on"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/chute_funnel/block",
"textures": {
"3": "create:block/belt_funnel_push_on"
}
}

View file

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

View file

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

View file

@ -78,7 +78,6 @@ import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock;
import com.simibubi.create.content.logistics.block.chute.ChuteBlock; import com.simibubi.create.content.logistics.block.chute.ChuteBlock;
import com.simibubi.create.content.logistics.block.chute.ChuteGenerator; import com.simibubi.create.content.logistics.block.chute.ChuteGenerator;
import com.simibubi.create.content.logistics.block.chute.ChuteItem; import com.simibubi.create.content.logistics.block.chute.ChuteItem;
import com.simibubi.create.content.logistics.block.chute.ChutePortBlock;
import com.simibubi.create.content.logistics.block.depot.DepotBlock; import com.simibubi.create.content.logistics.block.depot.DepotBlock;
import com.simibubi.create.content.logistics.block.diodes.AbstractDiodeGenerator; import com.simibubi.create.content.logistics.block.diodes.AbstractDiodeGenerator;
import com.simibubi.create.content.logistics.block.diodes.AdjustableRepeaterBlock; import com.simibubi.create.content.logistics.block.diodes.AdjustableRepeaterBlock;
@ -99,6 +98,9 @@ import com.simibubi.create.content.logistics.block.inventories.CreativeCrateBloc
import com.simibubi.create.content.logistics.block.mechanicalArm.ArmBlock; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmBlock;
import com.simibubi.create.content.logistics.block.packager.PackagerBlock; import com.simibubi.create.content.logistics.block.packager.PackagerBlock;
import com.simibubi.create.content.logistics.block.realityFunnel.BeltFunnelBlock; import com.simibubi.create.content.logistics.block.realityFunnel.BeltFunnelBlock;
import com.simibubi.create.content.logistics.block.realityFunnel.BeltFunnelGenerator;
import com.simibubi.create.content.logistics.block.realityFunnel.ChuteFunnelBlock;
import com.simibubi.create.content.logistics.block.realityFunnel.ChuteFunnelGenerator;
import com.simibubi.create.content.logistics.block.realityFunnel.FunnelItem; import com.simibubi.create.content.logistics.block.realityFunnel.FunnelItem;
import com.simibubi.create.content.logistics.block.realityFunnel.RealityFunnelBlock; import com.simibubi.create.content.logistics.block.realityFunnel.RealityFunnelBlock;
import com.simibubi.create.content.logistics.block.redstone.AnalogLeverBlock; import com.simibubi.create.content.logistics.block.redstone.AnalogLeverBlock;
@ -720,12 +722,6 @@ public class AllBlocks {
.transform(customItemModel("_", "block")) .transform(customItemModel("_", "block"))
.register(); .register();
public static final BlockEntry<ChutePortBlock> CHUTE_PORT = REGISTRATE.block("chute_port", ChutePortBlock::new)
.initialProperties(SharedProperties::softMetal)
.blockstate((c, p) -> p.horizontalBlock(c.get(), AssetLookup.standardModel(c, p)))
.simpleItem()
.register();
public static final BlockEntry<PackagerBlock> PACKAGER = REGISTRATE.block("packager", PackagerBlock::new) public static final BlockEntry<PackagerBlock> PACKAGER = REGISTRATE.block("packager", PackagerBlock::new)
.initialProperties(SharedProperties::softMetal) .initialProperties(SharedProperties::softMetal)
.transform(StressConfigDefaults.setImpact(4.0)) .transform(StressConfigDefaults.setImpact(4.0))
@ -749,12 +745,13 @@ public class AllBlocks {
public static final BlockEntry<BeltFunnelBlock> BELT_FUNNEL = REGISTRATE.block("belt_funnel", BeltFunnelBlock::new) public static final BlockEntry<BeltFunnelBlock> BELT_FUNNEL = REGISTRATE.block("belt_funnel", BeltFunnelBlock::new)
.initialProperties(SharedProperties::softMetal) .initialProperties(SharedProperties::softMetal)
.blockstate((c, p) -> p.horizontalBlock(c.get(), s -> { .blockstate(new BeltFunnelGenerator()::generate)
String shape = s.get(BeltFunnelBlock.SHAPE) .loot((p, b) -> p.registerDropping(b, REALITY_FUNNEL.get()))
.getName(); .register();
return s.get(BeltFunnelBlock.POWERED) ? AssetLookup.partialBaseModel(c, p, shape, "powered")
: AssetLookup.partialBaseModel(c, p, shape); public static final BlockEntry<ChuteFunnelBlock> CHUTE_FUNNEL = REGISTRATE.block("chute_funnel", ChuteFunnelBlock::new)
})) .initialProperties(SharedProperties::softMetal)
.blockstate(new ChuteFunnelGenerator()::generate)
.loot((p, b) -> p.registerDropping(b, REALITY_FUNNEL.get())) .loot((p, b) -> p.registerDropping(b, REALITY_FUNNEL.get()))
.register(); .register();

View file

@ -69,6 +69,10 @@ public class AllShapes {
.add(1, 6, 1, 15, 10, 15) .add(1, 6, 1, 15, 10, 15)
.add(0, 10, 0, 16, 16, 16) .add(0, 10, 0, 16, 16, 16)
.forDirectional(UP), .forDirectional(UP),
CHUTE_FUNNEL = shape(3, -2, 3, 13, 2, 13).add(2, 2, 2, 14, 6, 14)
.add(1, 5, 1, 15, 16, 15)
.add(0, 8, 0, 16, 14, 16)
.forDirectional(UP),
BELT_FUNNEL_RETRACTED = shape(3, -5, 14, 13, 13, 19).add(0, -5, 8, 16, 16, 14) BELT_FUNNEL_RETRACTED = shape(3, -5, 14, 13, 13, 19).add(0, -5, 8, 16, 16, 14)
.forHorizontal(NORTH), .forHorizontal(NORTH),
BELT_FUNNEL_DEFAULT = shape(3, -5, 12, 13, 13, 17).add(0, -5, 6, 16, 16, 12) BELT_FUNNEL_DEFAULT = shape(3, -5, 12, 13, 13, 17).add(0, -5, 6, 16, 16, 12)

View file

@ -1,25 +0,0 @@
package com.simibubi.create.content.logistics.block.chute;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.HorizontalBlock;
import net.minecraft.item.BlockItemUseContext;
import net.minecraft.state.StateContainer.Builder;
public class ChutePortBlock extends HorizontalBlock {
public ChutePortBlock(Properties p_i48377_1_) {
super(p_i48377_1_);
}
@Override
protected void fillStateContainer(Builder<Block, BlockState> p_206840_1_) {
super.fillStateContainer(p_206840_1_.add(HORIZONTAL_FACING));
}
@Override
public BlockState getStateForPlacement(BlockItemUseContext p_196258_1_) {
return getDefaultState().with(HORIZONTAL_FACING, p_196258_1_.getPlacementHorizontalFacing());
}
}

View file

@ -1,10 +1,8 @@
package com.simibubi.create.content.logistics.block.realityFunnel; package com.simibubi.create.content.logistics.block.realityFunnel;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllShapes; import com.simibubi.create.AllShapes;
import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; import com.simibubi.create.content.contraptions.relays.belt.BeltBlock;
import com.simibubi.create.content.contraptions.relays.belt.BeltBlock.Slope; import com.simibubi.create.content.contraptions.relays.belt.BeltBlock.Slope;
import com.simibubi.create.content.contraptions.wrench.IWrenchable;
import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock;
import com.simibubi.create.content.logistics.block.depot.DepotBlock; import com.simibubi.create.content.logistics.block.depot.DepotBlock;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
@ -12,33 +10,22 @@ import com.simibubi.create.foundation.utility.VoxelShaper;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.HorizontalBlock;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.BlockItemUseContext;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemUseContext;
import net.minecraft.state.BooleanProperty;
import net.minecraft.state.EnumProperty; import net.minecraft.state.EnumProperty;
import net.minecraft.state.IProperty; import net.minecraft.state.IProperty;
import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.StateContainer.Builder;
import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.util.ActionResultType;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.IStringSerializable; import net.minecraft.util.IStringSerializable;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.ILightReader; import net.minecraft.world.ILightReader;
import net.minecraft.world.IWorld; import net.minecraft.world.IWorld;
import net.minecraft.world.IWorldReader; import net.minecraft.world.IWorldReader;
import net.minecraft.world.World;
public class BeltFunnelBlock extends HorizontalBlock implements IWrenchable { public class BeltFunnelBlock extends HorizontalInteractionFunnelBlock {
public static final IProperty<Shape> SHAPE = EnumProperty.create("shape", Shape.class); public static final IProperty<Shape> SHAPE = EnumProperty.create("shape", Shape.class);
public static final BooleanProperty POWERED = BlockStateProperties.POWERED;
public enum Shape implements IStringSerializable { public enum Shape implements IStringSerializable {
RETRACTED(AllShapes.BELT_FUNNEL_RETRACTED), EXTENDED(AllShapes.BELT_FUNNEL_EXTENDED); RETRACTED(AllShapes.BELT_FUNNEL_RETRACTED), EXTENDED(AllShapes.BELT_FUNNEL_EXTENDED);
@ -57,13 +44,12 @@ public class BeltFunnelBlock extends HorizontalBlock implements IWrenchable {
public BeltFunnelBlock(Properties p_i48377_1_) { public BeltFunnelBlock(Properties p_i48377_1_) {
super(p_i48377_1_); super(p_i48377_1_);
setDefaultState(getDefaultState().with(SHAPE, Shape.RETRACTED) setDefaultState(getDefaultState().with(SHAPE, Shape.RETRACTED));
.with(POWERED, false));
} }
@Override @Override
protected void fillStateContainer(Builder<Block, BlockState> p_206840_1_) { protected void fillStateContainer(Builder<Block, BlockState> p_206840_1_) {
super.fillStateContainer(p_206840_1_.add(HORIZONTAL_FACING, SHAPE, POWERED)); super.fillStateContainer(p_206840_1_.add(SHAPE));
} }
@Override @Override
@ -72,35 +58,13 @@ public class BeltFunnelBlock extends HorizontalBlock implements IWrenchable {
return state.get(SHAPE).shaper.get(state.get(HORIZONTAL_FACING)); return state.get(SHAPE).shaper.get(state.get(HORIZONTAL_FACING));
} }
@Override
public BlockState getStateForPlacement(BlockItemUseContext ctx) {
return updateShape(super.getStateForPlacement(ctx), ctx.getWorld(), ctx.getPos()).with(POWERED, ctx.getWorld()
.isBlockPowered(ctx.getPos()));
}
@Override
public ItemStack getPickBlock(BlockState state, RayTraceResult target, IBlockReader world, BlockPos pos,
PlayerEntity player) {
return AllBlocks.REALITY_FUNNEL.asStack();
}
@Override @Override
public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbour, IWorld world, public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbour, IWorld world,
BlockPos pos, BlockPos p_196271_6_) { BlockPos pos, BlockPos p_196271_6_) {
if (direction == Direction.DOWN && !isOnValidBelt(state, world, pos))
return AllBlocks.REALITY_FUNNEL.getDefaultState()
.with(RealityFunnelBlock.FACING, state.get(HORIZONTAL_FACING));
if (direction == state.get(HORIZONTAL_FACING)) if (direction == state.get(HORIZONTAL_FACING))
return updateShape(state, world, pos); return updateShape(state, world, pos);
return state; else
} return super.updatePostPlacement(state, direction, neighbour, world, pos, p_196271_6_);
@Override
public boolean isValidPosition(BlockState state, IWorldReader world, BlockPos pos) {
return !world.getBlockState(pos.offset(state.get(HORIZONTAL_FACING)
.getOpposite()))
.getShape(world, pos)
.isEmpty();
} }
public static boolean isOnValidBelt(BlockState state, IWorldReader world, BlockPos pos) { public static boolean isOnValidBelt(BlockState state, IWorldReader world, BlockPos pos) {
@ -118,24 +82,7 @@ public class BeltFunnelBlock extends HorizontalBlock implements IWrenchable {
return true; return true;
} }
@Override public static BlockState updateShape(BlockState state, ILightReader world, BlockPos pos) {
public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos,
boolean isMoving) {
if (worldIn.isRemote)
return;
Direction blockFacing = state.get(HORIZONTAL_FACING)
.getOpposite();
if (fromPos.equals(pos.offset(blockFacing)))
if (!isValidPosition(state, worldIn, pos))
worldIn.destroyBlock(pos, true);
boolean previouslyPowered = state.get(POWERED);
if (previouslyPowered != worldIn.isBlockPowered(pos))
worldIn.setBlockState(pos, state.cycle(POWERED), 2);
}
private BlockState updateShape(BlockState state, ILightReader world, BlockPos pos) {
state = state.with(SHAPE, Shape.RETRACTED); state = state.with(SHAPE, Shape.RETRACTED);
BlockState neighbour = world.getBlockState(pos.offset(state.get(HORIZONTAL_FACING))); BlockState neighbour = world.getBlockState(pos.offset(state.get(HORIZONTAL_FACING)));
if (canConnectTo(state, neighbour)) if (canConnectTo(state, neighbour))
@ -143,21 +90,19 @@ public class BeltFunnelBlock extends HorizontalBlock implements IWrenchable {
return state; return state;
} }
private boolean canConnectTo(BlockState state, BlockState neighbour) { private static boolean canConnectTo(BlockState state, BlockState neighbour) {
if (neighbour.getBlock() instanceof BeltTunnelBlock) if (neighbour.getBlock() instanceof BeltTunnelBlock)
return true; return true;
if (neighbour.getBlock() == this && neighbour.get(HORIZONTAL_FACING) == state.get(HORIZONTAL_FACING) if (neighbour.getBlock() instanceof BeltFunnelBlock
.getOpposite()) && neighbour.get(HORIZONTAL_FACING) == state.get(HORIZONTAL_FACING)
.getOpposite())
return true; return true;
return false; return false;
} }
@Override @Override
public ActionResultType onWrenched(BlockState state, ItemUseContext context) { protected boolean canStillInteract(BlockState state, IWorldReader world, BlockPos pos) {
if (!context.getWorld().isRemote) return isOnValidBelt(state, world, pos);
context.getWorld()
.setBlockState(context.getPos(), state.cycle(SHAPE));
return ActionResultType.SUCCESS;
} }
} }

View file

@ -0,0 +1,39 @@
package com.simibubi.create.content.logistics.block.realityFunnel;
import com.simibubi.create.foundation.data.AssetLookup;
import com.simibubi.create.foundation.data.SpecialBlockStateGen;
import com.tterrag.registrate.providers.DataGenContext;
import com.tterrag.registrate.providers.RegistrateBlockstateProvider;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraftforge.client.model.generators.ModelFile;
public class BeltFunnelGenerator extends SpecialBlockStateGen {
@Override
protected int getXRotation(BlockState state) {
return 0;
}
@Override
protected int getYRotation(BlockState state) {
return horizontalAngle(state.get(BeltFunnelBlock.HORIZONTAL_FACING)) + 180;
}
@Override
public <T extends Block> ModelFile getModel(DataGenContext<Block, T> ctx, RegistrateBlockstateProvider prov,
BlockState state) {
boolean pushing = state.get(BeltFunnelBlock.PUSHING);
boolean powered = state.get(BeltFunnelBlock.POWERED);
String shapeName = state.get(BeltFunnelBlock.SHAPE)
.getName();
if (pushing && !powered)
return AssetLookup.partialBaseModel(ctx, prov, shapeName);
String name = ctx.getName() + "_" + (pushing ? "push_" : "pull_") + (powered ? "on" : "off");
return prov.models()
.withExistingParent(name + "_" + shapeName, prov.modLoc("block/" + ctx.getName() + "/block_" + shapeName))
.texture("2", prov.modLoc("block/" + name));
}
}

View file

@ -0,0 +1,39 @@
package com.simibubi.create.content.logistics.block.realityFunnel;
import com.simibubi.create.AllShapes;
import com.simibubi.create.content.logistics.block.chute.ChuteBlock;
import net.minecraft.block.BlockState;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorldReader;
public class ChuteFunnelBlock extends HorizontalInteractionFunnelBlock {
public ChuteFunnelBlock(Properties p_i48377_1_) {
super(p_i48377_1_);
}
public static boolean isOnValidChute(BlockState state, IWorldReader world, BlockPos pos) {
Direction direction = state.get(HORIZONTAL_FACING);
if (world.getBlockState(pos.offset(direction))
.getBlock() instanceof ChuteBlock)
return true;
return false;
}
@Override
public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_,
ISelectionContext p_220053_4_) {
return AllShapes.CHUTE_FUNNEL.get(state.get(HORIZONTAL_FACING));
}
@Override
protected boolean canStillInteract(BlockState state, IWorldReader world, BlockPos pos) {
return isOnValidChute(state, world, pos);
}
}

View file

@ -0,0 +1,39 @@
package com.simibubi.create.content.logistics.block.realityFunnel;
import com.simibubi.create.foundation.data.AssetLookup;
import com.simibubi.create.foundation.data.SpecialBlockStateGen;
import com.tterrag.registrate.providers.DataGenContext;
import com.tterrag.registrate.providers.RegistrateBlockstateProvider;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraftforge.client.model.generators.ModelFile;
public class ChuteFunnelGenerator extends SpecialBlockStateGen {
@Override
protected int getXRotation(BlockState state) {
return 0;
}
@Override
protected int getYRotation(BlockState state) {
return horizontalAngle(state.get(BeltFunnelBlock.HORIZONTAL_FACING)) + 180;
}
@Override
public <T extends Block> ModelFile getModel(DataGenContext<Block, T> ctx, RegistrateBlockstateProvider prov,
BlockState state) {
boolean pushing = state.get(ChuteFunnelBlock.PUSHING);
boolean powered = state.get(ChuteFunnelBlock.POWERED);
if (pushing && !powered)
return AssetLookup.partialBaseModel(ctx, prov);
String suffix = (pushing ? "push_" : "pull_") + (powered ? "on" : "off");
String textureName = "belt_funnel_" + suffix;
String modelName = ctx.getName() + "_" + suffix;
return prov.models()
.withExistingParent(modelName, prov.modLoc("block/" + ctx.getName() + "/block"))
.texture("3", prov.modLoc("block/" + textureName));
}
}

View file

@ -7,6 +7,9 @@ import net.minecraft.block.BlockState;
import net.minecraft.item.BlockItem; import net.minecraft.item.BlockItem;
import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.BlockItemUseContext;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.Rotation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
public class FunnelItem extends BlockItem { public class FunnelItem extends BlockItem {
@ -25,11 +28,25 @@ public class FunnelItem extends BlockItem {
if (!direction.getAxis() if (!direction.getAxis()
.isHorizontal()) .isHorizontal())
return state; return state;
BlockState equivalentBeltFunnel = AllBlocks.BELT_FUNNEL.get() BlockState equivalentBeltFunnel = AllBlocks.BELT_FUNNEL.get()
.getStateForPlacement(ctx) .getStateForPlacement(ctx)
.with(BeltFunnelBlock.HORIZONTAL_FACING, direction); .with(BeltFunnelBlock.HORIZONTAL_FACING, direction);
if (BeltFunnelBlock.isOnValidBelt(equivalentBeltFunnel, ctx.getWorld(), ctx.getPos())) BlockState equivalentChuteFunnel = AllBlocks.CHUTE_FUNNEL.get()
return equivalentBeltFunnel; .getStateForPlacement(ctx)
.with(ChuteFunnelBlock.HORIZONTAL_FACING, direction);
BlockState reversedChuteFunnel = equivalentChuteFunnel.rotate(Rotation.CLOCKWISE_180)
.cycle(ChuteFunnelBlock.PUSHING);
World world = ctx.getWorld();
BlockPos pos = ctx.getPos();
if (BeltFunnelBlock.isOnValidBelt(equivalentBeltFunnel, world, pos))
return BeltFunnelBlock.updateShape(equivalentBeltFunnel, world, pos);
if (ChuteFunnelBlock.isOnValidChute(equivalentChuteFunnel, world, pos))
return equivalentChuteFunnel;
if (ChuteFunnelBlock.isOnValidChute(reversedChuteFunnel, world, pos))
return reversedChuteFunnel;
return state; return state;
} }

View file

@ -0,0 +1,90 @@
package com.simibubi.create.content.logistics.block.realityFunnel;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.wrench.IWrenchable;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.HorizontalBlock;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.BlockItemUseContext;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemUseContext;
import net.minecraft.state.BooleanProperty;
import net.minecraft.state.StateContainer.Builder;
import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.util.ActionResultType;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorld;
import net.minecraft.world.IWorldReader;
import net.minecraft.world.World;
public abstract class HorizontalInteractionFunnelBlock extends HorizontalBlock implements IWrenchable {
public static final BooleanProperty POWERED = BlockStateProperties.POWERED;
public static final BooleanProperty PUSHING = BooleanProperty.create("pushing");
public HorizontalInteractionFunnelBlock(Properties p_i48377_1_) {
super(p_i48377_1_);
setDefaultState(getDefaultState().with(PUSHING, true)
.with(POWERED, false));
}
@Override
protected void fillStateContainer(Builder<Block, BlockState> p_206840_1_) {
super.fillStateContainer(p_206840_1_.add(HORIZONTAL_FACING, POWERED, PUSHING));
}
@Override
public BlockState getStateForPlacement(BlockItemUseContext ctx) {
return super.getStateForPlacement(ctx).with(POWERED, ctx.getWorld()
.isBlockPowered(ctx.getPos()));
}
@Override
public ItemStack getPickBlock(BlockState state, RayTraceResult target, IBlockReader world, BlockPos pos,
PlayerEntity player) {
return AllBlocks.REALITY_FUNNEL.asStack();
}
@Override
public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbour, IWorld world,
BlockPos pos, BlockPos p_196271_6_) {
if (!canStillInteract(state, world, pos))
return AllBlocks.REALITY_FUNNEL.getDefaultState()
.with(RealityFunnelBlock.FACING, state.get(HORIZONTAL_FACING));
return state;
}
@Override
public boolean isValidPosition(BlockState state, IWorldReader world, BlockPos pos) {
return !world.getBlockState(pos.offset(state.get(HORIZONTAL_FACING)
.getOpposite()))
.getShape(world, pos)
.isEmpty();
}
protected abstract boolean canStillInteract(BlockState state, IWorldReader world, BlockPos pos);
@Override
public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos,
boolean isMoving) {
if (worldIn.isRemote)
return;
boolean previouslyPowered = state.get(POWERED);
if (previouslyPowered != worldIn.isBlockPowered(pos))
worldIn.setBlockState(pos, state.cycle(POWERED), 2);
}
@Override
public ActionResultType onWrenched(BlockState state, ItemUseContext context) {
if (!context.getWorld().isRemote)
context.getWorld()
.setBlockState(context.getPos(), state.cycle(PUSHING));
return ActionResultType.SUCCESS;
}
}

View file

@ -2,6 +2,7 @@ package com.simibubi.create.content.logistics.block.realityFunnel;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllShapes; import com.simibubi.create.AllShapes;
import com.simibubi.create.content.logistics.block.chute.ChuteBlock;
import com.simibubi.create.foundation.block.ProperDirectionalBlock; import com.simibubi.create.foundation.block.ProperDirectionalBlock;
import net.minecraft.block.Block; import net.minecraft.block.Block;
@ -22,7 +23,7 @@ import net.minecraft.world.World;
public class RealityFunnelBlock extends ProperDirectionalBlock { public class RealityFunnelBlock extends ProperDirectionalBlock {
public static final BooleanProperty POWERED = BlockStateProperties.POWERED; public static final BooleanProperty POWERED = BlockStateProperties.POWERED;
public RealityFunnelBlock(Properties p_i48415_1_) { public RealityFunnelBlock(Properties p_i48415_1_) {
super(p_i48415_1_); super(p_i48415_1_);
setDefaultState(getDefaultState().with(POWERED, false)); setDefaultState(getDefaultState().with(POWERED, false));
@ -30,16 +31,24 @@ public class RealityFunnelBlock extends ProperDirectionalBlock {
@Override @Override
public BlockState getStateForPlacement(BlockItemUseContext context) { public BlockState getStateForPlacement(BlockItemUseContext context) {
return getDefaultState().with(FACING, context.getFace()) Direction facing = context.getFace();
if (facing.getAxis()
.isVertical()
&& context.getWorld()
.getBlockState(context.getPos()
.offset(facing.getOpposite()))
.getBlock() instanceof ChuteBlock)
facing = facing.getOpposite();
return getDefaultState().with(FACING, facing)
.with(POWERED, context.getWorld() .with(POWERED, context.getWorld()
.isBlockPowered(context.getPos())); .isBlockPowered(context.getPos()));
} }
@Override @Override
protected void fillStateContainer(Builder<Block, BlockState> builder) { protected void fillStateContainer(Builder<Block, BlockState> builder) {
super.fillStateContainer(builder.add(POWERED)); super.fillStateContainer(builder.add(POWERED));
} }
@Override @Override
public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_, public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_,
ISelectionContext p_220053_4_) { ISelectionContext p_220053_4_) {
@ -49,13 +58,31 @@ public class RealityFunnelBlock extends ProperDirectionalBlock {
@Override @Override
public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState p_196271_3_, IWorld world, public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState p_196271_3_, IWorld world,
BlockPos pos, BlockPos p_196271_6_) { BlockPos pos, BlockPos p_196271_6_) {
if (state.get(FACING) Direction facing = state.get(FACING);
.getAxis() if (facing.getAxis()
.isHorizontal() && direction == Direction.DOWN) { .isHorizontal()) {
BlockState equivalentFunnel = AllBlocks.BELT_FUNNEL.getDefaultState() if (direction == Direction.DOWN) {
.with(BeltFunnelBlock.HORIZONTAL_FACING, state.get(FACING)); BlockState equivalentFunnel = AllBlocks.BELT_FUNNEL.getDefaultState()
if (BeltFunnelBlock.isOnValidBelt(equivalentFunnel, world, pos)) .with(BeltFunnelBlock.HORIZONTAL_FACING, facing)
return equivalentFunnel; .with(BeltFunnelBlock.POWERED, state.get(POWERED));
if (BeltFunnelBlock.isOnValidBelt(equivalentFunnel, world, pos))
return equivalentFunnel;
}
if (direction == facing) {
BlockState equivalentFunnel = AllBlocks.CHUTE_FUNNEL.getDefaultState()
.with(ChuteFunnelBlock.HORIZONTAL_FACING, facing)
.with(ChuteFunnelBlock.POWERED, state.get(POWERED));
if (ChuteFunnelBlock.isOnValidChute(equivalentFunnel, world, pos))
return equivalentFunnel;
}
if (direction == facing.getOpposite()) {
BlockState equivalentFunnel = AllBlocks.CHUTE_FUNNEL.getDefaultState()
.with(ChuteFunnelBlock.HORIZONTAL_FACING, facing.getOpposite())
.cycle(ChuteFunnelBlock.PUSHING)
.with(ChuteFunnelBlock.POWERED, state.get(POWERED));
if (ChuteFunnelBlock.isOnValidChute(equivalentFunnel, world, pos))
return equivalentFunnel;
}
} }
return state; return state;
} }
@ -65,13 +92,6 @@ public class RealityFunnelBlock extends ProperDirectionalBlock {
boolean isMoving) { boolean isMoving) {
if (worldIn.isRemote) if (worldIn.isRemote)
return; return;
Direction blockFacing = state.get(FACING)
.getOpposite();
if (fromPos.equals(pos.offset(blockFacing)))
if (!isValidPosition(state, worldIn, pos))
worldIn.destroyBlock(pos, true);
boolean previouslyPowered = state.get(POWERED); boolean previouslyPowered = state.get(POWERED);
if (previouslyPowered != worldIn.isBlockPowered(pos)) if (previouslyPowered != worldIn.isBlockPowered(pos))
worldIn.setBlockState(pos, state.cycle(POWERED), 2); worldIn.setBlockState(pos, state.cycle(POWERED), 2);
@ -79,10 +99,10 @@ public class RealityFunnelBlock extends ProperDirectionalBlock {
@Override @Override
public boolean isValidPosition(BlockState state, IWorldReader world, BlockPos pos) { public boolean isValidPosition(BlockState state, IWorldReader world, BlockPos pos) {
return !world.getBlockState(pos.offset(state.get(FACING) Block block = world.getBlockState(pos.offset(state.get(FACING)
.getOpposite())) .getOpposite()))
.getShape(world, pos) .getBlock();
.isEmpty(); return !(block instanceof RealityFunnelBlock) && !(block instanceof HorizontalInteractionFunnelBlock);
} }
} }

View file

@ -2,7 +2,7 @@
"credit": "Made with Blockbench", "credit": "Made with Blockbench",
"parent": "block/block", "parent": "block/block",
"textures": { "textures": {
"2": "create:block/funnel_off", "2": "create:block/belt_funnel_push_off",
"3": "create:block/funnel_back", "3": "create:block/funnel_back",
"4": "create:block/funnel_plating", "4": "create:block/funnel_plating",
"particle": "create:block/brass_block" "particle": "create:block/brass_block"

View file

@ -1,6 +0,0 @@
{
"parent": "create:block/belt_funnel/block_extended",
"textures": {
"2": "create:block/funnel_on"
}
}

View file

@ -2,7 +2,7 @@
"credit": "Made with Blockbench", "credit": "Made with Blockbench",
"parent": "block/block", "parent": "block/block",
"textures": { "textures": {
"2": "create:block/funnel_off", "2": "create:block/belt_funnel_push_off",
"3": "create:block/funnel_back", "3": "create:block/funnel_back",
"4": "create:block/funnel_plating", "4": "create:block/funnel_plating",
"particle": "create:block/brass_block" "particle": "create:block/brass_block"

View file

@ -1,6 +0,0 @@
{
"parent": "create:block/belt_funnel/block_retracted",
"textures": {
"2": "create:block/funnel_on"
}
}

View file

@ -0,0 +1,248 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"3": "create:block/belt_funnel_push_off",
"4": "create:block/funnel_plating",
"13": "create:block/chute",
"3_particle": "create:block/brass_block",
"particle": "create:block/brass_block",
"1_2": "create:block/funnel_back"
},
"elements": [
{
"name": "RightWall",
"from": [0, 0, 2],
"to": [2, 16, 8],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 10]},
"faces": {
"north": {"uv": [14, 0, 16, 16], "texture": "#3_particle"},
"east": {"uv": [0, 0, 16, 6], "rotation": 90, "texture": "#3"},
"south": {"uv": [0, 0, 2, 16], "texture": "#3_particle"},
"west": {"uv": [0, 0, 16, 6], "rotation": 270, "texture": "#3"},
"up": {"uv": [0, 0, 2, 6], "texture": "#3"},
"down": {"uv": [14, 0, 16, 6], "rotation": 180, "texture": "#3"}
}
},
{
"name": "LeftWall",
"from": [14, 0, 2],
"to": [16, 16, 8],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 10]},
"faces": {
"north": {"uv": [0, 0, 2, 16], "texture": "#3_particle"},
"east": {"uv": [0, 0, 16, 6], "rotation": 90, "texture": "#3"},
"south": {"uv": [14, 0, 16, 16], "texture": "#3_particle"},
"west": {"uv": [0, 0, 16, 6], "rotation": 270, "texture": "#3"},
"up": {"uv": [14, 0, 16, 6], "texture": "#3"},
"down": {"uv": [0, 0, 2, 6], "rotation": 180, "texture": "#3"}
}
},
{
"name": "Top",
"from": [2, 14, 2],
"to": [14, 16, 8],
"rotation": {"angle": 0, "axis": "y", "origin": [6, 8, 10]},
"faces": {
"north": {"uv": [2, 0, 14, 2], "texture": "#3_particle"},
"south": {"uv": [2, 0, 14, 2], "texture": "#3_particle"},
"up": {"uv": [2, 0, 14, 6], "texture": "#3"},
"down": {"uv": [2, 0, 14, 6], "rotation": 180, "texture": "#3"}
}
},
{
"name": "Top",
"from": [2, 0, 2],
"to": [14, 2, 8],
"rotation": {"angle": 0, "axis": "y", "origin": [6, 8, 10]},
"faces": {
"north": {"uv": [2, 14, 14, 16], "texture": "#3_particle"},
"south": {"uv": [2, 14, 14, 16], "texture": "#3_particle"},
"up": {"uv": [2, 0, 14, 6], "texture": "#3"},
"down": {"uv": [2, 0, 14, 6], "rotation": 180, "texture": "#3"}
}
},
{
"name": "F5",
"from": [11, 1.5, 3],
"to": [14, 14.5, 4],
"rotation": {"angle": 0, "axis": "y", "origin": [14, 8, 9.5]},
"faces": {
"north": {"uv": [6.5, 0, 8, 6.5], "texture": "#4"}
}
},
{
"name": "F6",
"from": [5, 1.5, 3],
"to": [8, 14.5, 4],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 9.5]},
"faces": {
"north": {"uv": [6.5, 0, 8, 6.5], "texture": "#4"}
}
},
{
"name": "F6",
"from": [8, 1.5, 3],
"to": [11, 14.5, 4],
"rotation": {"angle": 0, "axis": "y", "origin": [14, 8, 9.5]},
"faces": {
"north": {"uv": [6.5, 0, 8, 6.5], "texture": "#4"}
}
},
{
"name": "F7",
"from": [2, 1.5, 3],
"to": [5, 14.5, 4],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 9.5]},
"faces": {
"north": {"uv": [6.5, 0, 8, 6.5], "texture": "#4"}
}
},
{
"name": "BackExtension",
"from": [2, 2, 10],
"to": [14, 14, 14],
"faces": {
"east": {"uv": [13, 10, 15, 16], "texture": "#1_2"},
"south": {"uv": [9, 0.5, 15, 6.5], "texture": "#1_2"},
"west": {"uv": [13, 10, 15, 16], "rotation": 180, "texture": "#1_2"},
"up": {"uv": [13, 10, 15, 16], "rotation": 270, "texture": "#1_2"},
"down": {"uv": [13, 10, 15, 16], "rotation": 90, "texture": "#1_2"}
}
},
{
"name": "MidExtension",
"from": [1, 1, 7],
"to": [15, 15, 11],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 7]},
"faces": {
"north": {"uv": [0, 9, 7, 16], "texture": "#1_2"},
"east": {"uv": [11, 9, 13, 16], "rotation": 180, "texture": "#1_2"},
"south": {"uv": [8.5, 0, 15.5, 7], "texture": "#1_2"},
"west": {"uv": [11, 9, 13, 16], "texture": "#1_2"},
"up": {"uv": [11, 9, 13, 16], "rotation": 90, "texture": "#1_2"},
"down": {"uv": [11, 9, 13, 16], "rotation": 270, "texture": "#1_2"}
}
},
{
"name": "Back",
"from": [3, 3, 14],
"to": [13, 13, 18],
"faces": {
"east": {"uv": [9.5, 9, 14.5, 11], "rotation": 90, "texture": "#4"},
"south": {"uv": [9.5, 11, 14.5, 16], "texture": "#4"},
"west": {"uv": [9.5, 9, 14.5, 11], "rotation": 270, "texture": "#4"},
"up": {"uv": [9.5, 9, 14.5, 11], "texture": "#4"},
"down": {"uv": [9.5, 9, 14.5, 11], "rotation": 180, "texture": "#4"}
}
},
{
"name": "Back",
"from": [1.1, 1.1, -2.9],
"to": [14.9, 14.9, 2.1],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 6]},
"faces": {
"north": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#13"},
"east": {"uv": [0, 13.5, 7, 16], "rotation": 90, "texture": "#13"},
"west": {"uv": [0, 13.5, 7, 16], "rotation": 270, "texture": "#13"},
"up": {"uv": [0, 13.5, 7, 16], "texture": "#13"},
"down": {"uv": [0, 13.5, 7, 16], "rotation": 180, "texture": "#13"}
}
},
{
"name": "Back",
"from": [2.1, 1.1, -6.7],
"to": [13.9, 4.9, -2.9],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -54]},
"faces": {
"north": {"uv": [9, 6, 15, 8], "texture": "#13"},
"east": {"uv": [11, 6, 13, 8], "texture": "#13"},
"south": {"uv": [0, 0, 7, 7], "texture": "#13"},
"west": {"uv": [11, 6, 13, 8], "texture": "#13"},
"up": {"uv": [8.5, 1, 15.5, 3], "rotation": 180, "texture": "#13"},
"down": {"uv": [9, 4.5, 15, 6.5], "texture": "#13"}
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"thirdperson_lefthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"firstperson_righthand": {
"rotation": [0, 45, 0],
"scale": [0.4, 0.4, 0.4]
},
"firstperson_lefthand": {
"rotation": [0, 225, 0],
"scale": [0.4, 0.4, 0.4]
},
"ground": {
"translation": [0, 3.25, 0],
"scale": [0.25, 0.25, 0.25]
},
"gui": {
"rotation": [30, 225, 0],
"translation": [0, 1, 0],
"scale": [0.5, 0.5, 0.5]
},
"head": {
"rotation": [0, 90, 0]
},
"fixed": {
"rotation": [0, 90, 0],
"translation": [0, 1.5, 0],
"scale": [0.5, 0.5, 0.5]
}
},
"groups": [
{
"name": "block",
"origin": [8, 8, 8],
"children": [
{
"name": "BeltFunnel",
"origin": [9, -4, 8],
"children": [
{
"name": "FrontSection",
"origin": [9, -4, 8],
"children": [0, 1, 2, 3,
{
"name": "Flap",
"origin": [8, 8, 8],
"children": [4, 5, 6, 7]
}
]
},
{
"name": "Extension",
"origin": [9, -4, 8],
"children": [8, 9]
},
{
"name": "DELETABLEEXTENSION",
"origin": [9, -4, 8],
"children": []
},
{
"name": "DELETABLEEXTESNIONMID",
"origin": [35, 12, 4],
"children": []
},
{
"name": "Base",
"origin": [9, -4, 8],
"children": [10, 11]
}
]
}, 12]
}
]
}

View file

@ -1,23 +0,0 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"14": "create:block/chute_port",
"particle": "create:block/zinc_block"
},
"elements": [
{
"name": "Port",
"from": [0, 0, 0],
"to": [16, 16, 16],
"faces": {
"north": {"uv": [12, 0, 16, 4], "texture": "#14"},
"east": {"uv": [0, 0, 4, 4], "texture": "#14"},
"south": {"uv": [0, 0, 4, 4], "texture": "#14"},
"west": {"uv": [0, 0, 4, 4], "texture": "#14"},
"up": {"uv": [4, 4, 8, 8], "texture": "#14"},
"down": {"uv": [0, 4, 4, 8], "texture": "#14"}
}
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 438 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 433 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 423 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 426 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 370 B

After

Width:  |  Height:  |  Size: 372 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 378 B

After

Width:  |  Height:  |  Size: 370 B