Merge branch 'heatedMixer' into mc1.15/dev

This commit is contained in:
LordGrimmauld 2020-07-12 14:54:03 +02:00
commit a44ef1733b
65 changed files with 1163 additions and 373 deletions

View file

@ -24,6 +24,7 @@ f25693a9429f6337149ff24f27900dc4eb82a7c2 assets\create\blockstates\belt.json
40d10934934ea142d71fc6ce598b1455c3ad47b4 assets\create\blockstates\belt_observer.json 40d10934934ea142d71fc6ce598b1455c3ad47b4 assets\create\blockstates\belt_observer.json
cf9045eb16e5299a1d917c4cb536289f49411276 assets\create\blockstates\birch_window.json cf9045eb16e5299a1d917c4cb536289f49411276 assets\create\blockstates\birch_window.json
94a1a91403eb4b035fec48071e7fcae57a8a6abd assets\create\blockstates\birch_window_pane.json 94a1a91403eb4b035fec48071e7fcae57a8a6abd assets\create\blockstates\birch_window_pane.json
0626725f70103a55dabcda6f87ca943279d45793 assets\create\blockstates\blaze_heater.json
fba967b1f6e44b34a9d9662e2fedfc13aad7f36c assets\create\blockstates\brass_belt_funnel.json fba967b1f6e44b34a9d9662e2fedfc13aad7f36c assets\create\blockstates\brass_belt_funnel.json
8b1dd00adcc7e74c5a9feed069e2610b15a338cb assets\create\blockstates\brass_block.json 8b1dd00adcc7e74c5a9feed069e2610b15a338cb assets\create\blockstates\brass_block.json
b8dd6e505943e06706d0718ece620ab3cf943650 assets\create\blockstates\brass_casing.json b8dd6e505943e06706d0718ece620ab3cf943650 assets\create\blockstates\brass_casing.json
@ -123,7 +124,7 @@ de8a40b7daf1497d5aecee47a43b3e0b1d030b00 assets\create\blockstates\fancy_scoria_
fc9ac0a7e7191b93516719455a17177fa6524ecc assets\create\blockstates\fancy_weathered_limestone_bricks_slab.json fc9ac0a7e7191b93516719455a17177fa6524ecc assets\create\blockstates\fancy_weathered_limestone_bricks_slab.json
b2a7c321b1795f20e7433f81a55ce4683de081b8 assets\create\blockstates\fancy_weathered_limestone_bricks_stairs.json b2a7c321b1795f20e7433f81a55ce4683de081b8 assets\create\blockstates\fancy_weathered_limestone_bricks_stairs.json
6372fe02ba0065acb0758121c45a15a1a8fdc5de assets\create\blockstates\fancy_weathered_limestone_bricks_wall.json 6372fe02ba0065acb0758121c45a15a1a8fdc5de assets\create\blockstates\fancy_weathered_limestone_bricks_wall.json
4cbd66ed3da77d1caad6ef4e657a86b1b4017a39 assets\create\blockstates\fluid_pipe.json 3aa8213ea6cd12a6964e3a70900b12d76d794d20 assets\create\blockstates\fluid_pipe.json
9d0e78a4d6d0ccac37c06d0f5810a800a04844b2 assets\create\blockstates\fluid_tank.json 9d0e78a4d6d0ccac37c06d0f5810a800a04844b2 assets\create\blockstates\fluid_tank.json
e9da1794b6ece7f9aa8bcb43d42c23a55446133b assets\create\blockstates\flywheel.json e9da1794b6ece7f9aa8bcb43d42c23a55446133b assets\create\blockstates\flywheel.json
ac00d40e1ef50a37041c0481afa1a23a14dea78e assets\create\blockstates\framed_glass.json ac00d40e1ef50a37041c0481afa1a23a14dea78e assets\create\blockstates\framed_glass.json
@ -286,7 +287,7 @@ b7829c2ef2c47188713f8cab21b2c9bc7f9c5b79 assets\create\blockstates\portable_stor
e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets\create\blockstates\powered_toggle_latch.json e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets\create\blockstates\powered_toggle_latch.json
3a739f9d4276828d83f2d2750bf3227c87bcd438 assets\create\blockstates\pulley_magnet.json 3a739f9d4276828d83f2d2750bf3227c87bcd438 assets\create\blockstates\pulley_magnet.json
469e430d96cb0a5e1aaf6b7cc5d401d488c9e600 assets\create\blockstates\pulse_repeater.json 469e430d96cb0a5e1aaf6b7cc5d401d488c9e600 assets\create\blockstates\pulse_repeater.json
6fa36883e76e9e403bb429c8f86b8c0d3bba0cff assets\create\blockstates\radial_chassis.json 4439fc83a8c7370ab44b211a3fd48abde20a4728 assets\create\blockstates\radial_chassis.json
8929677f2cc5354aa19ef182af69f9f0b41eb242 assets\create\blockstates\redstone_contact.json 8929677f2cc5354aa19ef182af69f9f0b41eb242 assets\create\blockstates\redstone_contact.json
c29213b77ac0c78d8979c5f6188d2b265696f9b9 assets\create\blockstates\redstone_link.json c29213b77ac0c78d8979c5f6188d2b265696f9b9 assets\create\blockstates\redstone_link.json
1eac804cba08aebb5f4646758ae1ef9b32e01365 assets\create\blockstates\reinforced_rail.json 1eac804cba08aebb5f4646758ae1ef9b32e01365 assets\create\blockstates\reinforced_rail.json
@ -337,17 +338,17 @@ 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
541831ab0cf2f0222f0b7e42ec6c4b0ae636168d assets\create\lang\en_ud.json 00edba8c69557058bf9fbbc4d389dc455f24b0fc assets\create\lang\en_ud.json
fd57d2d8144286e26033a087a501f45f2df9ea34 assets\create\lang\en_us.json 7ed74343ba37814af0d96cd2ae5bf1249acd9baa assets\create\lang\en_us.json
87c28254c2acb462fe6a994f688a19e31a4c7a9d assets\create\lang\unfinished\de_de.json 4c87a086693857597af78c76761ec89ba9c602ba assets\create\lang\unfinished\de_de.json
6cd93a72126063c634f49db190d4da545e5a6c43 assets\create\lang\unfinished\fr_fr.json c0fb10fa3849b9bd5b1265f6abdbf223e1de1a60 assets\create\lang\unfinished\fr_fr.json
401d0b295988cfa31af1a94f8c50d86eb54cad0d assets\create\lang\unfinished\it_it.json b15d162779596a7a4d650885bdf7e2894e7b3846 assets\create\lang\unfinished\it_it.json
30f1189e1963d0a87a9505bfdac9b663ff9d09d1 assets\create\lang\unfinished\ja_jp.json 32053016c6a0642f9b42ab109fb3cbc512346970 assets\create\lang\unfinished\ja_jp.json
a56d5b51d410821b7993bdbfd1b141e51be11b54 assets\create\lang\unfinished\ko_kr.json 827ecb467d0ede69b8d025b15321d024f186b598 assets\create\lang\unfinished\ko_kr.json
e8a39cb4afc7668f2690bcacda1f06afd9c82579 assets\create\lang\unfinished\nl_nl.json 6c730797cb1d02a2b6ec0318ec11750dc05775a0 assets\create\lang\unfinished\nl_nl.json
3876e40fbc9c6e8561cc761949a6fb9565a03fce assets\create\lang\unfinished\pt_br.json 3a7b8d02ecb08237e887be76d7ee8173068ef63d assets\create\lang\unfinished\pt_br.json
cc2c01ee69a5a394c9d6dc87f77e08f05adf38a7 assets\create\lang\unfinished\ru_ru.json 61a40852ad3024962ee8878ca105ca59aa85922b assets\create\lang\unfinished\ru_ru.json
7a8b2739021d2e1d2b563f2bed3a201bd3f1b00f assets\create\lang\unfinished\zh_cn.json 635c3cc20c533ecd1951092344fde2bc19c0a71e assets\create\lang\unfinished\zh_cn.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
@ -997,6 +998,7 @@ bf1fc6bdf7fca6f1958a2d3e96202c1cecb50669 assets\create\models\item\basin.json
695a69d5854e2eb134b55d855bd2b7b18808a01d assets\create\models\item\belt_observer.json 695a69d5854e2eb134b55d855bd2b7b18808a01d assets\create\models\item\belt_observer.json
9044243882cfd49a2827e1b910a4c9b0e46daa47 assets\create\models\item\birch_window.json 9044243882cfd49a2827e1b910a4c9b0e46daa47 assets\create\models\item\birch_window.json
6ed49f59ea91068ef68720f43e67a9237594bdf0 assets\create\models\item\birch_window_pane.json 6ed49f59ea91068ef68720f43e67a9237594bdf0 assets\create\models\item\birch_window_pane.json
fa2761dc44857eb840a94df869de66a91988f0da assets\create\models\item\blaze_heater.json
17d340c3678bd24cb085ba49490b2b4cb341a9e7 assets\create\models\item\brass_block.json 17d340c3678bd24cb085ba49490b2b4cb341a9e7 assets\create\models\item\brass_block.json
f5a18f4279c2e845a5967b1c2f9e807c2bb77afb assets\create\models\item\brass_casing.json f5a18f4279c2e845a5967b1c2f9e807c2bb77afb assets\create\models\item\brass_casing.json
ab045c951352806c3f632dda7b71573f93f60ac4 assets\create\models\item\brass_funnel.json ab045c951352806c3f632dda7b71573f93f60ac4 assets\create\models\item\brass_funnel.json
@ -1788,6 +1790,7 @@ c7f81e30c31837a287d6d6040cdb02c7dec11441 data\create\loot_tables\blocks\belt.jso
1104e323abb2a8c25769c47dc5d1154965113cc9 data\create\loot_tables\blocks\belt_observer.json 1104e323abb2a8c25769c47dc5d1154965113cc9 data\create\loot_tables\blocks\belt_observer.json
67a8e2513c3cb09e6fe80279fda94f79d5018c37 data\create\loot_tables\blocks\birch_window.json 67a8e2513c3cb09e6fe80279fda94f79d5018c37 data\create\loot_tables\blocks\birch_window.json
bf1d5843f93533f84bc4adec5b77da2114fa2025 data\create\loot_tables\blocks\birch_window_pane.json bf1d5843f93533f84bc4adec5b77da2114fa2025 data\create\loot_tables\blocks\birch_window_pane.json
798ef290b388dee758df3e779b4b1c9289955f7b data\create\loot_tables\blocks\blaze_heater.json
1dbc446abe190b2832b2ce7d52c2f2d2bdd45949 data\create\loot_tables\blocks\brass_belt_funnel.json 1dbc446abe190b2832b2ce7d52c2f2d2bdd45949 data\create\loot_tables\blocks\brass_belt_funnel.json
70d9d4def43d5b31fa7cdc5ca5002c71cf4a90b0 data\create\loot_tables\blocks\brass_block.json 70d9d4def43d5b31fa7cdc5ca5002c71cf4a90b0 data\create\loot_tables\blocks\brass_block.json
8a14258ad5d79d9e4dc5a318905644b446196420 data\create\loot_tables\blocks\brass_casing.json 8a14258ad5d79d9e4dc5a318905644b446196420 data\create\loot_tables\blocks\brass_casing.json
@ -2478,6 +2481,7 @@ d3fdb8ece6cb072a93ddb64a0baad5ac952117a4 data\create\recipes\weathered_limestone
11667414f73bc2d00bda7c5c1a7d2934bf6e9165 data\create\recipes\weathered_limestone_pillar_from_weathered_limestone_stonecutting.json 11667414f73bc2d00bda7c5c1a7d2934bf6e9165 data\create\recipes\weathered_limestone_pillar_from_weathered_limestone_stonecutting.json
266f08e604d229a9d2b46f7272c0b06ec270bf3d data\create\recipes\zinc_block.json 266f08e604d229a9d2b46f7272c0b06ec270bf3d data\create\recipes\zinc_block.json
403576ae5710d4fe731144fe623b1673093076ea data\create\tags\blocks\brittle.json 403576ae5710d4fe731144fe623b1673093076ea data\create\tags\blocks\brittle.json
06d3931993d4f61713390416f1e6fe1a0b5aaf43 data\create\tags\blocks\fan_heaters.json
081f5aa35602fc27af2ca01ea9f2fd5e7eb284dc data\create\tags\items\create_ingots.json 081f5aa35602fc27af2ca01ea9f2fd5e7eb284dc data\create\tags\items\create_ingots.json
d2dc4ff179ef7b2aa9276455c196e15d44aa95a8 data\create\tags\items\crushed_ores.json d2dc4ff179ef7b2aa9276455c196e15d44aa95a8 data\create\tags\items\crushed_ores.json
16bcb8fcbe9170c2c11f1ca8d99d8b36cd812bbd data\forge\tags\blocks\glass\colorless.json 16bcb8fcbe9170c2c11f1ca8d99d8b36cd812bbd data\forge\tags\blocks\glass\colorless.json

View file

@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "create:block/blaze_heater/block"
}
}
}

View file

@ -181,10 +181,10 @@
}, },
{ {
"when": { "when": {
"north": "false",
"south": "true",
"west": "true", "west": "true",
"east": "false" "east": "false",
"north": "false",
"south": "true"
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/lu_y" "model": "create:block/fluid_pipe/lu_y"
@ -192,10 +192,10 @@
}, },
{ {
"when": { "when": {
"north": "false",
"south": "true",
"west": "false", "west": "false",
"east": "true" "east": "true",
"north": "false",
"south": "true"
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/ru_y" "model": "create:block/fluid_pipe/ru_y"
@ -203,10 +203,10 @@
}, },
{ {
"when": { "when": {
"north": "true",
"south": "false",
"west": "true", "west": "true",
"east": "false" "east": "false",
"north": "true",
"south": "false"
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/ld_y" "model": "create:block/fluid_pipe/ld_y"
@ -214,10 +214,10 @@
}, },
{ {
"when": { "when": {
"north": "true",
"south": "false",
"west": "false", "west": "false",
"east": "true" "east": "true",
"north": "true",
"south": "false"
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/rd_y" "model": "create:block/fluid_pipe/rd_y"
@ -225,10 +225,10 @@
}, },
{ {
"when": { "when": {
"west": "false",
"east": "false",
"north": "true", "north": "true",
"south": "true", "south": "true"
"west": "false",
"east": "false"
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/ud_y" "model": "create:block/fluid_pipe/ud_y"
@ -236,10 +236,10 @@
}, },
{ {
"when": { "when": {
"west": "false",
"east": "false",
"north": "false", "north": "false",
"south": "true", "south": "true"
"west": "false",
"east": "false"
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/ud_y" "model": "create:block/fluid_pipe/ud_y"
@ -247,10 +247,10 @@
}, },
{ {
"when": { "when": {
"west": "false",
"east": "false",
"north": "true", "north": "true",
"south": "false", "south": "false"
"west": "false",
"east": "false"
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/ud_y" "model": "create:block/fluid_pipe/ud_y"
@ -258,10 +258,10 @@
}, },
{ {
"when": { "when": {
"north": "false",
"south": "false",
"west": "true", "west": "true",
"east": "true" "east": "true",
"north": "false",
"south": "false"
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/lr_y" "model": "create:block/fluid_pipe/lr_y"
@ -269,10 +269,10 @@
}, },
{ {
"when": { "when": {
"north": "false",
"south": "false",
"west": "true", "west": "true",
"east": "false" "east": "false",
"north": "false",
"south": "false"
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/lr_y" "model": "create:block/fluid_pipe/lr_y"
@ -280,10 +280,10 @@
}, },
{ {
"when": { "when": {
"north": "false",
"south": "false",
"west": "false", "west": "false",
"east": "true" "east": "true",
"north": "false",
"south": "false"
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/lr_y" "model": "create:block/fluid_pipe/lr_y"
@ -291,10 +291,10 @@
}, },
{ {
"when": { "when": {
"north": "false",
"south": "false",
"west": "false", "west": "false",
"east": "false" "east": "false",
"north": "false",
"south": "false"
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/none_y" "model": "create:block/fluid_pipe/none_y"
@ -302,10 +302,10 @@
}, },
{ {
"when": { "when": {
"up": "true",
"west": "false", "west": "false",
"down": "false", "east": "true",
"east": "true" "up": "true",
"down": "false"
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/lu_z" "model": "create:block/fluid_pipe/lu_z"
@ -313,10 +313,10 @@
}, },
{ {
"when": { "when": {
"up": "true",
"west": "true", "west": "true",
"down": "false", "east": "false",
"east": "false" "up": "true",
"down": "false"
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/ru_z" "model": "create:block/fluid_pipe/ru_z"
@ -324,10 +324,10 @@
}, },
{ {
"when": { "when": {
"up": "false",
"west": "false", "west": "false",
"down": "true", "east": "true",
"east": "true" "up": "false",
"down": "true"
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/ld_z" "model": "create:block/fluid_pipe/ld_z"
@ -335,10 +335,10 @@
}, },
{ {
"when": { "when": {
"up": "false",
"west": "true", "west": "true",
"down": "true", "east": "false",
"east": "false" "up": "false",
"down": "true"
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/rd_z" "model": "create:block/fluid_pipe/rd_z"
@ -346,10 +346,10 @@
}, },
{ {
"when": { "when": {
"west": "false",
"east": "false",
"up": "true", "up": "true",
"west": "false", "down": "true"
"down": "true",
"east": "false"
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/ud_z" "model": "create:block/fluid_pipe/ud_z"
@ -357,10 +357,10 @@
}, },
{ {
"when": { "when": {
"west": "false",
"east": "false",
"up": "true", "up": "true",
"west": "false", "down": "false"
"down": "false",
"east": "false"
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/ud_z" "model": "create:block/fluid_pipe/ud_z"
@ -368,10 +368,10 @@
}, },
{ {
"when": { "when": {
"up": "false",
"west": "false", "west": "false",
"down": "true", "east": "false",
"east": "false" "up": "false",
"down": "true"
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/ud_z" "model": "create:block/fluid_pipe/ud_z"
@ -379,10 +379,10 @@
}, },
{ {
"when": { "when": {
"up": "false",
"west": "true", "west": "true",
"down": "false", "east": "true",
"east": "true" "up": "false",
"down": "false"
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/lr_z" "model": "create:block/fluid_pipe/lr_z"
@ -390,10 +390,10 @@
}, },
{ {
"when": { "when": {
"up": "false",
"west": "false", "west": "false",
"down": "false", "east": "true",
"east": "true" "up": "false",
"down": "false"
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/lr_z" "model": "create:block/fluid_pipe/lr_z"
@ -401,10 +401,10 @@
}, },
{ {
"when": { "when": {
"up": "false",
"west": "true", "west": "true",
"down": "false", "east": "false",
"east": "false" "up": "false",
"down": "false"
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/lr_z" "model": "create:block/fluid_pipe/lr_z"
@ -412,10 +412,10 @@
}, },
{ {
"when": { "when": {
"up": "false",
"west": "false", "west": "false",
"down": "false", "east": "false",
"east": "false" "up": "false",
"down": "false"
}, },
"apply": { "apply": {
"model": "create:block/fluid_pipe/none_z" "model": "create:block/fluid_pipe/none_z"

View file

@ -89,8 +89,8 @@
}, },
{ {
"when": { "when": {
"sticky_west": "true", "axis": "x",
"axis": "x" "sticky_west": "true"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_x_sticky", "model": "create:block/radial_chassis_side_x_sticky",
@ -99,8 +99,8 @@
}, },
{ {
"when": { "when": {
"sticky_west": "true", "axis": "y",
"axis": "y" "sticky_west": "true"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_y_sticky", "model": "create:block/radial_chassis_side_y_sticky",
@ -109,8 +109,8 @@
}, },
{ {
"when": { "when": {
"sticky_west": "true", "axis": "z",
"axis": "z" "sticky_west": "true"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_z_sticky", "model": "create:block/radial_chassis_side_z_sticky",
@ -119,8 +119,8 @@
}, },
{ {
"when": { "when": {
"sticky_west": "false", "axis": "x",
"axis": "x" "sticky_west": "false"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_x", "model": "create:block/radial_chassis_side_x",
@ -129,8 +129,8 @@
}, },
{ {
"when": { "when": {
"sticky_west": "false", "axis": "y",
"axis": "y" "sticky_west": "false"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_y", "model": "create:block/radial_chassis_side_y",
@ -139,8 +139,8 @@
}, },
{ {
"when": { "when": {
"sticky_west": "false", "axis": "z",
"axis": "z" "sticky_west": "false"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_z", "model": "create:block/radial_chassis_side_z",
@ -149,8 +149,8 @@
}, },
{ {
"when": { "when": {
"sticky_north": "true", "axis": "x",
"axis": "x" "sticky_north": "true"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_x_sticky" "model": "create:block/radial_chassis_side_x_sticky"
@ -158,8 +158,8 @@
}, },
{ {
"when": { "when": {
"sticky_north": "true", "axis": "y",
"axis": "y" "sticky_north": "true"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_y_sticky", "model": "create:block/radial_chassis_side_y_sticky",
@ -168,8 +168,8 @@
}, },
{ {
"when": { "when": {
"sticky_north": "true", "axis": "z",
"axis": "z" "sticky_north": "true"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_x_sticky", "model": "create:block/radial_chassis_side_x_sticky",
@ -178,8 +178,8 @@
}, },
{ {
"when": { "when": {
"sticky_north": "false", "axis": "x",
"axis": "x" "sticky_north": "false"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_x" "model": "create:block/radial_chassis_side_x"
@ -187,8 +187,8 @@
}, },
{ {
"when": { "when": {
"sticky_north": "false", "axis": "y",
"axis": "y" "sticky_north": "false"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_y", "model": "create:block/radial_chassis_side_y",
@ -197,8 +197,8 @@
}, },
{ {
"when": { "when": {
"sticky_north": "false", "axis": "z",
"axis": "z" "sticky_north": "false"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_x", "model": "create:block/radial_chassis_side_x",
@ -207,8 +207,8 @@
}, },
{ {
"when": { "when": {
"sticky_east": "true", "axis": "x",
"axis": "x" "sticky_east": "true"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_x_sticky", "model": "create:block/radial_chassis_side_x_sticky",
@ -217,8 +217,8 @@
}, },
{ {
"when": { "when": {
"sticky_east": "true", "axis": "y",
"axis": "y" "sticky_east": "true"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_y_sticky", "model": "create:block/radial_chassis_side_y_sticky",
@ -227,8 +227,8 @@
}, },
{ {
"when": { "when": {
"sticky_east": "true", "axis": "z",
"axis": "z" "sticky_east": "true"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_z_sticky" "model": "create:block/radial_chassis_side_z_sticky"
@ -236,8 +236,8 @@
}, },
{ {
"when": { "when": {
"sticky_east": "false", "axis": "x",
"axis": "x" "sticky_east": "false"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_x", "model": "create:block/radial_chassis_side_x",
@ -246,8 +246,8 @@
}, },
{ {
"when": { "when": {
"sticky_east": "false", "axis": "y",
"axis": "y" "sticky_east": "false"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_y", "model": "create:block/radial_chassis_side_y",
@ -256,8 +256,8 @@
}, },
{ {
"when": { "when": {
"sticky_east": "false", "axis": "z",
"axis": "z" "sticky_east": "false"
}, },
"apply": { "apply": {
"model": "create:block/radial_chassis_side_z" "model": "create:block/radial_chassis_side_z"

View file

@ -25,6 +25,7 @@
"block.create.belt_observer": "\u0279\u01DD\u028C\u0279\u01DDsqO \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": "\u028Dopu\u0131M \u0265\u0254\u0279\u0131\u15FA",
"block.create.birch_window_pane": "\u01DDu\u0250\u0500 \u028Dopu\u0131M \u0265\u0254\u0279\u0131\u15FA", "block.create.birch_window_pane": "\u01DDu\u0250\u0500 \u028Dopu\u0131M \u0265\u0254\u0279\u0131\u15FA",
"block.create.blaze_heater": "\u0279\u01DD\u0287\u0250\u01DDH \u01DDz\u0250\u05DF\u15FA",
"block.create.brass_belt_funnel": "\u05DF\u01DDuun\u2132 \u0287\u05DF\u01DD\u15FA ss\u0250\u0279\u15FA", "block.create.brass_belt_funnel": "\u05DF\u01DDuun\u2132 \u0287\u05DF\u01DD\u15FA ss\u0250\u0279\u15FA",
"block.create.brass_block": "\u029E\u0254o\u05DF\u15FA ss\u0250\u0279\u15FA", "block.create.brass_block": "\u029E\u0254o\u05DF\u15FA ss\u0250\u0279\u15FA",
"block.create.brass_casing": "bu\u0131s\u0250\u0186 ss\u0250\u0279\u15FA", "block.create.brass_casing": "bu\u0131s\u0250\u0186 ss\u0250\u0279\u15FA",

View file

@ -28,6 +28,7 @@
"block.create.belt_observer": "Belt Observer", "block.create.belt_observer": "Belt Observer",
"block.create.birch_window": "Birch Window", "block.create.birch_window": "Birch Window",
"block.create.birch_window_pane": "Birch Window Pane", "block.create.birch_window_pane": "Birch Window Pane",
"block.create.blaze_heater": "Blaze Heater",
"block.create.brass_belt_funnel": "Brass Belt Funnel", "block.create.brass_belt_funnel": "Brass Belt Funnel",
"block.create.brass_block": "Brass Block", "block.create.brass_block": "Brass Block",
"block.create.brass_casing": "Brass Casing", "block.create.brass_casing": "Brass Casing",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 781", "_": "Missing Localizations: 782",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -29,6 +29,7 @@
"block.create.belt_observer": "Fließband-Beobachter", "block.create.belt_observer": "Fließband-Beobachter",
"block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window": "UNLOCALIZED: Birch Window",
"block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane",
"block.create.blaze_heater": "UNLOCALIZED: Blaze Heater",
"block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel",
"block.create.brass_block": "UNLOCALIZED: Brass Block", "block.create.brass_block": "UNLOCALIZED: Brass Block",
"block.create.brass_casing": "UNLOCALIZED: Brass Casing", "block.create.brass_casing": "UNLOCALIZED: Brass Casing",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 384", "_": "Missing Localizations: 385",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -29,6 +29,7 @@
"block.create.belt_observer": "Observateur d'entité", "block.create.belt_observer": "Observateur d'entité",
"block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window": "UNLOCALIZED: Birch Window",
"block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane",
"block.create.blaze_heater": "UNLOCALIZED: Blaze Heater",
"block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel",
"block.create.brass_block": "UNLOCALIZED: Brass Block", "block.create.brass_block": "UNLOCALIZED: Brass Block",
"block.create.brass_casing": "Boîtier en laiton", "block.create.brass_casing": "Boîtier en laiton",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 368", "_": "Missing Localizations: 369",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -29,6 +29,7 @@
"block.create.belt_observer": "Osservatore a Cinghia", "block.create.belt_observer": "Osservatore a Cinghia",
"block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window": "UNLOCALIZED: Birch Window",
"block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane",
"block.create.blaze_heater": "UNLOCALIZED: Blaze Heater",
"block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel",
"block.create.brass_block": "Blocco di Ottone", "block.create.brass_block": "Blocco di Ottone",
"block.create.brass_casing": "Involucro di Ottone", "block.create.brass_casing": "Involucro di Ottone",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 363", "_": "Missing Localizations: 364",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -29,6 +29,7 @@
"block.create.belt_observer": "ベルトオブザーバー", "block.create.belt_observer": "ベルトオブザーバー",
"block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window": "UNLOCALIZED: Birch Window",
"block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane",
"block.create.blaze_heater": "UNLOCALIZED: Blaze Heater",
"block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel",
"block.create.brass_block": "真鍮ブロック", "block.create.brass_block": "真鍮ブロック",
"block.create.brass_casing": "真鍮ケーシング", "block.create.brass_casing": "真鍮ケーシング",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 368", "_": "Missing Localizations: 369",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -29,6 +29,7 @@
"block.create.belt_observer": "벨트 감지기", "block.create.belt_observer": "벨트 감지기",
"block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window": "UNLOCALIZED: Birch Window",
"block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane",
"block.create.blaze_heater": "UNLOCALIZED: Blaze Heater",
"block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel",
"block.create.brass_block": "황동 블럭", "block.create.brass_block": "황동 블럭",
"block.create.brass_casing": "황동 케이스", "block.create.brass_casing": "황동 케이스",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 718", "_": "Missing Localizations: 719",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -29,6 +29,7 @@
"block.create.belt_observer": "Transportband Observeerder", "block.create.belt_observer": "Transportband Observeerder",
"block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window": "UNLOCALIZED: Birch Window",
"block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane",
"block.create.blaze_heater": "UNLOCALIZED: Blaze Heater",
"block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel",
"block.create.brass_block": "UNLOCALIZED: Brass Block", "block.create.brass_block": "UNLOCALIZED: Brass Block",
"block.create.brass_casing": "UNLOCALIZED: Brass Casing", "block.create.brass_casing": "UNLOCALIZED: Brass Casing",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 788", "_": "Missing Localizations: 789",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -29,6 +29,7 @@
"block.create.belt_observer": "Observador de Esteira", "block.create.belt_observer": "Observador de Esteira",
"block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window": "UNLOCALIZED: Birch Window",
"block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane",
"block.create.blaze_heater": "UNLOCALIZED: Blaze Heater",
"block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel",
"block.create.brass_block": "UNLOCALIZED: Brass Block", "block.create.brass_block": "UNLOCALIZED: Brass Block",
"block.create.brass_casing": "UNLOCALIZED: Brass Casing", "block.create.brass_casing": "UNLOCALIZED: Brass Casing",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 782", "_": "Missing Localizations: 783",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -29,6 +29,7 @@
"block.create.belt_observer": "Ленточный сканер", "block.create.belt_observer": "Ленточный сканер",
"block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window": "UNLOCALIZED: Birch Window",
"block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane",
"block.create.blaze_heater": "UNLOCALIZED: Blaze Heater",
"block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel",
"block.create.brass_block": "UNLOCALIZED: Brass Block", "block.create.brass_block": "UNLOCALIZED: Brass Block",
"block.create.brass_casing": "UNLOCALIZED: Brass Casing", "block.create.brass_casing": "UNLOCALIZED: Brass Casing",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 44", "_": "Missing Localizations: 45",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -29,6 +29,7 @@
"block.create.belt_observer": "传送带侦测器", "block.create.belt_observer": "传送带侦测器",
"block.create.birch_window": "白桦窗户", "block.create.birch_window": "白桦窗户",
"block.create.birch_window_pane": "白桦窗户板", "block.create.birch_window_pane": "白桦窗户板",
"block.create.blaze_heater": "UNLOCALIZED: Blaze Heater",
"block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel",
"block.create.brass_block": "黄铜块", "block.create.brass_block": "黄铜块",
"block.create.brass_casing": "黄铜机壳", "block.create.brass_casing": "黄铜机壳",

View file

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

View file

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

View file

@ -0,0 +1,6 @@
{
"replace": false,
"values": [
"create:blaze_heater"
]
}

View file

@ -26,13 +26,12 @@ import net.minecraftforge.client.model.ModelLoader;
public class AllBlockPartials { public class AllBlockPartials {
private static List<AllBlockPartials> all = new ArrayList<>(); private static final List<AllBlockPartials> all = new ArrayList<>();
public static final AllBlockPartials public static final AllBlockPartials SCHEMATICANNON_CONNECTOR = get("schematicannon/connector"),
SCHEMATICANNON_CONNECTOR = get("schematicannon/connector"),
SCHEMATICANNON_PIPE = get("schematicannon/pipe"), SCHEMATICANNON_PIPE = get("schematicannon/pipe"),
SHAFTLESS_COGWHEEL = get("cogwheel_shaftless"), SHAFTLESS_COGWHEEL = get("cogwheel_shaftless"),
SHAFT_HALF = get("shaft_half"), SHAFT_HALF = get("shaft_half"),
BELT_PULLEY = get("belt_pulley"), BELT_PULLEY = get("belt_pulley"),
@ -46,11 +45,12 @@ public class AllBlockPartials {
BELT_DIAGONAL_MIDDLE = get("belt/diagonal_middle"), BELT_DIAGONAL_MIDDLE = get("belt/diagonal_middle"),
BELT_DIAGONAL_END = get("belt/diagonal_end"), BELT_DIAGONAL_END = get("belt/diagonal_end"),
ENCASED_FAN_INNER = get("encased_fan/propeller"), ENCASED_FAN_INNER = get("encased_fan/propeller"), HAND_CRANK_HANDLE = get("hand_crank/handle"),
HAND_CRANK_HANDLE = get("hand_crank/handle"), MECHANICAL_PRESS_HEAD = get("mechanical_press/head"), MECHANICAL_MIXER_POLE = get("mechanical_mixer/pole"),
MECHANICAL_PRESS_HEAD = get("mechanical_press/head"), MECHANICAL_MIXER_HEAD = get("mechanical_mixer/head"), BLAZE_HEATER_BLAZE_ONE = get("blaze_heater/blaze/one"),
MECHANICAL_MIXER_POLE = get("mechanical_mixer/pole"), BLAZE_HEATER_BLAZE_TWO = get("blaze_heater/blaze/two"),
MECHANICAL_MIXER_HEAD = get("mechanical_mixer/head"), BLAZE_HEATER_BLAZE_THREE = get("blaze_heater/blaze/three"),
BLAZE_HEATER_BLAZE_FOUR = get("blaze_heater/blaze/four"),
MECHANICAL_CRAFTER_LID = get("mechanical_crafter/lid"), MECHANICAL_CRAFTER_LID = get("mechanical_crafter/lid"),
MECHANICAL_CRAFTER_ARROW = get("mechanical_crafter/arrow"), MECHANICAL_CRAFTER_ARROW = get("mechanical_crafter/arrow"),
MECHANICAL_CRAFTER_BELT_FRAME = get("mechanical_crafter/belt"), MECHANICAL_CRAFTER_BELT_FRAME = get("mechanical_crafter/belt"),
@ -73,41 +73,29 @@ public class AllBlockPartials {
FLEXPEATER_INDICATOR = get("diodes/indicator"), FLEXPEATER_INDICATOR = get("diodes/indicator"),
FLYWHEEL = get("flywheel/wheel"), FLYWHEEL = get("flywheel/wheel"),
FLYWHEEL_UPPER_ROTATING = get("flywheel/upper_rotating_connector"), FLYWHEEL_UPPER_ROTATING = get("flywheel/upper_rotating_connector"),
FLYWHEEL_LOWER_ROTATING = get("flywheel/lower_rotating_connector"), FLYWHEEL_LOWER_ROTATING = get("flywheel/lower_rotating_connector"),
FLYWHEEL_UPPER_SLIDING = get("flywheel/upper_sliding_connector"), FLYWHEEL_UPPER_SLIDING = get("flywheel/upper_sliding_connector"),
FLYWHEEL_LOWER_SLIDING = get("flywheel/lower_sliding_connector"), FLYWHEEL_LOWER_SLIDING = get("flywheel/lower_sliding_connector"),
FURNACE_GENERATOR_FRAME = get("furnace_engine/frame"), FURNACE_GENERATOR_FRAME = get("furnace_engine/frame"), CUCKOO_MINUTE_HAND = get("cuckoo_clock/minute_hand"),
CUCKOO_MINUTE_HAND = get("cuckoo_clock/minute_hand"), CUCKOO_HOUR_HAND = get("cuckoo_clock/hour_hand"), CUCKOO_LEFT_DOOR = get("cuckoo_clock/left_door"),
CUCKOO_HOUR_HAND = get("cuckoo_clock/hour_hand"), CUCKOO_RIGHT_DOOR = get("cuckoo_clock/right_door"), CUCKOO_PIG = get("cuckoo_clock/pig"),
CUCKOO_LEFT_DOOR = get("cuckoo_clock/left_door"), CUCKOO_CREEPER = get("cuckoo_clock/creeper"), ROPE_COIL = get("rope_pulley/rope_coil"),
CUCKOO_RIGHT_DOOR = get("cuckoo_clock/right_door"), ROPE_HALF = get("rope_pulley/rope_half"), ROPE_HALF_MAGNET = get("rope_pulley/rope_half_magnet"),
CUCKOO_PIG = get("cuckoo_clock/pig"), MILLSTONE_COG = get("millstone/inner"), PACKAGER_SEALER = get("packager/sealer"),
CUCKOO_CREEPER = get("cuckoo_clock/creeper"),
ROPE_COIL = get("rope_pulley/rope_coil"),
ROPE_HALF = get("rope_pulley/rope_half"),
ROPE_HALF_MAGNET = get("rope_pulley/rope_half_magnet"),
MILLSTONE_COG = get("millstone/inner"),
PACKAGER_SEALER = get("packager/sealer"),
SYMMETRY_PLANE = get("symmetry_effect/plane"), SYMMETRY_PLANE = get("symmetry_effect/plane"), SYMMETRY_CROSSPLANE = get("symmetry_effect/crossplane"),
SYMMETRY_CROSSPLANE = get("symmetry_effect/crossplane"),
SYMMETRY_TRIPLEPLANE = get("symmetry_effect/tripleplane"), SYMMETRY_TRIPLEPLANE = get("symmetry_effect/tripleplane"),
ARM_COG = get("mechanical_arm/cog"), ARM_COG = get("mechanical_arm/cog"), ARM_BASE = get("mechanical_arm/base"),
ARM_BASE = get("mechanical_arm/base"), ARM_LOWER_BODY = get("mechanical_arm/lower_body"), ARM_UPPER_BODY = get("mechanical_arm/upper_body"),
ARM_LOWER_BODY = get("mechanical_arm/lower_body"), ARM_HEAD = get("mechanical_arm/head"), ARM_CLAW_BASE = get("mechanical_arm/claw_base"),
ARM_UPPER_BODY = get("mechanical_arm/upper_body"), ARM_CLAW_GRIP = get("mechanical_arm/claw_grip"),
ARM_HEAD = get("mechanical_arm/head"),
ARM_CLAW_BASE = get("mechanical_arm/claw_base"), FLAG_SHORT_IN = get("mechanical_arm/flag/short_in"), FLAG_SHORT_OUT = get("mechanical_arm/flag/short_out"),
ARM_CLAW_GRIP = get("mechanical_arm/claw_grip"), FLAG_LONG_IN = get("mechanical_arm/flag/long_in"), FLAG_LONG_OUT = get("mechanical_arm/flag/long_out"),
FLAG_SHORT_IN = get("mechanical_arm/flag/short_in"), MECHANICAL_PUMP_ARROW = get("mechanical_pump/arrow"), MECHANICAL_PUMP_COG = get("mechanical_pump/cog"),
FLAG_SHORT_OUT = get("mechanical_arm/flag/short_out"),
FLAG_LONG_IN = get("mechanical_arm/flag/long_in"),
FLAG_LONG_OUT = get("mechanical_arm/flag/long_out"),
MECHANICAL_PUMP_ARROW = get("mechanical_pump/arrow"),
MECHANICAL_PUMP_COG = get("mechanical_pump/cog"),
FLUID_PIPE_CASING = get("fluid_pipe/casing"); FLUID_PIPE_CASING = get("fluid_pipe/casing");
public static final Map<Direction, AllBlockPartials> PIPE_RIMS = map(); public static final Map<Direction, AllBlockPartials> PIPE_RIMS = map();
@ -123,8 +111,7 @@ public class AllBlockPartials {
private ResourceLocation modelLocation; private ResourceLocation modelLocation;
private IBakedModel bakedModel; private IBakedModel bakedModel;
private AllBlockPartials() { private AllBlockPartials() {}
}
private static void populateMaps() { private static void populateMaps() {
for (Direction d : Iterate.directions) { for (Direction d : Iterate.directions) {
@ -194,9 +181,7 @@ public class AllBlockPartials {
.rotateY(AngleHelper.horizontalAngle(facing)) .rotateY(AngleHelper.horizontalAngle(facing))
.rotateX(AngleHelper.verticalAngle(facing)) .rotateX(AngleHelper.verticalAngle(facing))
.unCentre(); .unCentre();
SuperByteBuffer renderPartial = return CreateClient.bufferCache.renderDirectionalPartial(this, referenceState, facing, ms);
CreateClient.bufferCache.renderDirectionalPartial(this, referenceState, facing, ms);
return renderPartial;
} }
} }

View file

@ -56,6 +56,7 @@ import com.simibubi.create.content.contraptions.fluids.FluidTankBlock;
import com.simibubi.create.content.contraptions.fluids.FluidTankModel; import com.simibubi.create.content.contraptions.fluids.FluidTankModel;
import com.simibubi.create.content.contraptions.fluids.PumpBlock; import com.simibubi.create.content.contraptions.fluids.PumpBlock;
import com.simibubi.create.content.contraptions.processing.BasinBlock; import com.simibubi.create.content.contraptions.processing.BasinBlock;
import com.simibubi.create.content.contraptions.processing.HeaterBlock;
import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerBlock; import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerBlock;
import com.simibubi.create.content.contraptions.relays.advanced.sequencer.SequencedGearshiftBlock; import com.simibubi.create.content.contraptions.relays.advanced.sequencer.SequencedGearshiftBlock;
import com.simibubi.create.content.contraptions.relays.advanced.sequencer.SequencedGearshiftGenerator; import com.simibubi.create.content.contraptions.relays.advanced.sequencer.SequencedGearshiftGenerator;
@ -144,6 +145,7 @@ import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.model.generators.ConfiguredModel; import net.minecraftforge.client.model.generators.ConfiguredModel;
import net.minecraftforge.common.ToolType; import net.minecraftforge.common.ToolType;
@SuppressWarnings("unused")
public class AllBlocks { public class AllBlocks {
private static final CreateRegistrate REGISTRATE = Create.registrate() private static final CreateRegistrate REGISTRATE = Create.registrate()
@ -206,7 +208,7 @@ public class AllBlocks {
public static final BlockEntry<EncasedShaftBlock> ENCASED_SHAFT = public static final BlockEntry<EncasedShaftBlock> ENCASED_SHAFT =
REGISTRATE.block("encased_shaft", EncasedShaftBlock::new) REGISTRATE.block("encased_shaft", EncasedShaftBlock::new)
.initialProperties(SharedProperties::stone) .initialProperties(SharedProperties::stone)
.properties(p -> p.nonOpaque()) .properties(Block.Properties::nonOpaque)
.transform(StressConfigDefaults.setNoImpact()) .transform(StressConfigDefaults.setNoImpact())
.blockstate(BlockStateGen.axisBlockProvider(true)) .blockstate(BlockStateGen.axisBlockProvider(true))
.item() .item()
@ -215,7 +217,7 @@ public class AllBlocks {
public static final BlockEntry<GearboxBlock> GEARBOX = REGISTRATE.block("gearbox", GearboxBlock::new) public static final BlockEntry<GearboxBlock> GEARBOX = REGISTRATE.block("gearbox", GearboxBlock::new)
.initialProperties(SharedProperties::stone) .initialProperties(SharedProperties::stone)
.properties(p -> p.nonOpaque()) .properties(Block.Properties::nonOpaque)
.transform(StressConfigDefaults.setNoImpact()) .transform(StressConfigDefaults.setNoImpact())
.blockstate(BlockStateGen.axisBlockProvider(true)) .blockstate(BlockStateGen.axisBlockProvider(true))
.item() .item()
@ -224,7 +226,7 @@ public class AllBlocks {
public static final BlockEntry<ClutchBlock> CLUTCH = REGISTRATE.block("clutch", ClutchBlock::new) public static final BlockEntry<ClutchBlock> CLUTCH = REGISTRATE.block("clutch", ClutchBlock::new)
.initialProperties(SharedProperties::stone) .initialProperties(SharedProperties::stone)
.properties(p -> p.nonOpaque()) .properties(Block.Properties::nonOpaque)
.transform(StressConfigDefaults.setNoImpact()) .transform(StressConfigDefaults.setNoImpact())
.blockstate((c, p) -> BlockStateGen.axisBlock(c, p, AssetLookup.forPowered(c, p))) .blockstate((c, p) -> BlockStateGen.axisBlock(c, p, AssetLookup.forPowered(c, p)))
.item() .item()
@ -233,7 +235,7 @@ public class AllBlocks {
public static final BlockEntry<GearshiftBlock> GEARSHIFT = REGISTRATE.block("gearshift", GearshiftBlock::new) public static final BlockEntry<GearshiftBlock> GEARSHIFT = REGISTRATE.block("gearshift", GearshiftBlock::new)
.initialProperties(SharedProperties::stone) .initialProperties(SharedProperties::stone)
.properties(p -> p.nonOpaque()) .properties(Block.Properties::nonOpaque)
.transform(StressConfigDefaults.setNoImpact()) .transform(StressConfigDefaults.setNoImpact())
.blockstate((c, p) -> BlockStateGen.axisBlock(c, p, AssetLookup.forPowered(c, p))) .blockstate((c, p) -> BlockStateGen.axisBlock(c, p, AssetLookup.forPowered(c, p)))
.item() .item()
@ -243,7 +245,7 @@ public class AllBlocks {
public static final BlockEntry<EncasedBeltBlock> ENCASED_BELT = public static final BlockEntry<EncasedBeltBlock> ENCASED_BELT =
REGISTRATE.block("encased_belt", EncasedBeltBlock::new) REGISTRATE.block("encased_belt", EncasedBeltBlock::new)
.initialProperties(SharedProperties::stone) .initialProperties(SharedProperties::stone)
.properties(p -> p.nonOpaque()) .properties(Block.Properties::nonOpaque)
.transform(StressConfigDefaults.setNoImpact()) .transform(StressConfigDefaults.setNoImpact())
.blockstate((c, p) -> new EncasedBeltGenerator((state, suffix) -> p.models() .blockstate((c, p) -> new EncasedBeltGenerator((state, suffix) -> p.models()
.getExistingFile(p.modLoc("block/" + c.getName() + "/" + suffix))).generate(c, p)) .getExistingFile(p.modLoc("block/" + c.getName() + "/" + suffix))).generate(c, p))
@ -254,7 +256,7 @@ public class AllBlocks {
public static final BlockEntry<AdjustablePulleyBlock> ADJUSTABLE_PULLEY = public static final BlockEntry<AdjustablePulleyBlock> ADJUSTABLE_PULLEY =
REGISTRATE.block("adjustable_pulley", AdjustablePulleyBlock::new) REGISTRATE.block("adjustable_pulley", AdjustablePulleyBlock::new)
.initialProperties(SharedProperties::stone) .initialProperties(SharedProperties::stone)
.properties(p -> p.nonOpaque()) .properties(Block.Properties::nonOpaque)
.transform(StressConfigDefaults.setNoImpact()) .transform(StressConfigDefaults.setNoImpact())
.blockstate((c, p) -> new EncasedBeltGenerator((state, suffix) -> { .blockstate((c, p) -> new EncasedBeltGenerator((state, suffix) -> {
String powered = state.get(AdjustablePulleyBlock.POWERED) ? "_powered" : ""; String powered = state.get(AdjustablePulleyBlock.POWERED) ? "_powered" : "";
@ -289,7 +291,7 @@ public class AllBlocks {
public static final BlockEntry<WaterWheelBlock> WATER_WHEEL = REGISTRATE.block("water_wheel", WaterWheelBlock::new) public static final BlockEntry<WaterWheelBlock> WATER_WHEEL = REGISTRATE.block("water_wheel", WaterWheelBlock::new)
.initialProperties(SharedProperties::wooden) .initialProperties(SharedProperties::wooden)
.properties(p -> p.nonOpaque()) .properties(Block.Properties::nonOpaque)
.blockstate(BlockStateGen.horizontalWheelProvider(false)) .blockstate(BlockStateGen.horizontalWheelProvider(false))
.addLayer(() -> RenderType::getCutoutMipped) .addLayer(() -> RenderType::getCutoutMipped)
.transform(StressConfigDefaults.setCapacity(16.0)) .transform(StressConfigDefaults.setCapacity(16.0))
@ -353,7 +355,7 @@ public class AllBlocks {
public static final BlockEntry<CrushingWheelBlock> CRUSHING_WHEEL = public static final BlockEntry<CrushingWheelBlock> CRUSHING_WHEEL =
REGISTRATE.block("crushing_wheel", CrushingWheelBlock::new) REGISTRATE.block("crushing_wheel", CrushingWheelBlock::new)
.initialProperties(SharedProperties::stone) .initialProperties(SharedProperties::stone)
.properties(p -> p.nonOpaque()) .properties(Block.Properties::nonOpaque)
.blockstate(BlockStateGen.axisBlockProvider(false)) .blockstate(BlockStateGen.axisBlockProvider(false))
.addLayer(() -> RenderType::getCutoutMipped) .addLayer(() -> RenderType::getCutoutMipped)
.transform(StressConfigDefaults.setImpact(8.0)) .transform(StressConfigDefaults.setImpact(8.0))
@ -373,7 +375,7 @@ public class AllBlocks {
public static final BlockEntry<MechanicalPressBlock> MECHANICAL_PRESS = public static final BlockEntry<MechanicalPressBlock> MECHANICAL_PRESS =
REGISTRATE.block("mechanical_press", MechanicalPressBlock::new) REGISTRATE.block("mechanical_press", MechanicalPressBlock::new)
.initialProperties(SharedProperties::stone) .initialProperties(SharedProperties::stone)
.properties(p -> p.nonOpaque()) .properties(Block.Properties::nonOpaque)
.blockstate(BlockStateGen.horizontalBlockProvider(true)) .blockstate(BlockStateGen.horizontalBlockProvider(true))
.transform(StressConfigDefaults.setImpact(8.0)) .transform(StressConfigDefaults.setImpact(8.0))
.item(BasinOperatorBlockItem::new) .item(BasinOperatorBlockItem::new)
@ -383,7 +385,7 @@ public class AllBlocks {
public static final BlockEntry<MechanicalMixerBlock> MECHANICAL_MIXER = public static final BlockEntry<MechanicalMixerBlock> MECHANICAL_MIXER =
REGISTRATE.block("mechanical_mixer", MechanicalMixerBlock::new) REGISTRATE.block("mechanical_mixer", MechanicalMixerBlock::new)
.initialProperties(SharedProperties::stone) .initialProperties(SharedProperties::stone)
.properties(p -> p.nonOpaque()) .properties(Block.Properties::nonOpaque)
.blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p))) .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p)))
.addLayer(() -> RenderType::getCutoutMipped) .addLayer(() -> RenderType::getCutoutMipped)
.transform(StressConfigDefaults.setImpact(4.0)) .transform(StressConfigDefaults.setImpact(4.0))
@ -397,6 +399,15 @@ public class AllBlocks {
.simpleItem() .simpleItem()
.register(); .register();
public static final BlockEntry<HeaterBlock> HEATER = REGISTRATE.block("blaze_heater", HeaterBlock::new)
.initialProperties(SharedProperties::softMetal)
.properties(p -> p.lightValue(12))
.tag(AllBlockTags.FAN_HEATERS.tag)
.addLayer(() -> RenderType::getCutoutMipped)
.blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p)))
.simpleItem()
.register();
public static final BlockEntry<DepotBlock> DEPOT = REGISTRATE.block("depot", DepotBlock::new) public static final BlockEntry<DepotBlock> DEPOT = REGISTRATE.block("depot", DepotBlock::new)
.initialProperties(SharedProperties::stone) .initialProperties(SharedProperties::stone)
.blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p))) .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p)))
@ -523,7 +534,7 @@ public class AllBlocks {
public static final BlockEntry<CartAssemblerBlock> CART_ASSEMBLER = public static final BlockEntry<CartAssemblerBlock> CART_ASSEMBLER =
REGISTRATE.block("cart_assembler", CartAssemblerBlock::new) REGISTRATE.block("cart_assembler", CartAssemblerBlock::new)
.initialProperties(SharedProperties::stone) .initialProperties(SharedProperties::stone)
.properties(p -> p.nonOpaque()) .properties(Block.Properties::nonOpaque)
.blockstate(BlockStateGen.cartAssembler()) .blockstate(BlockStateGen.cartAssembler())
.addLayer(() -> RenderType::getCutoutMipped) .addLayer(() -> RenderType::getCutoutMipped)
.tag(BlockTags.RAILS) .tag(BlockTags.RAILS)
@ -534,7 +545,7 @@ public class AllBlocks {
public static final BlockEntry<ReinforcedRailBlock> REINFORCED_RAIL = public static final BlockEntry<ReinforcedRailBlock> REINFORCED_RAIL =
REGISTRATE.block("reinforced_rail", ReinforcedRailBlock::new) REGISTRATE.block("reinforced_rail", ReinforcedRailBlock::new)
.initialProperties(SharedProperties::stone) .initialProperties(SharedProperties::stone)
.properties(p -> p.nonOpaque()) .properties(Block.Properties::nonOpaque)
.blockstate(BlockStateGen.reinforcedRail()) .blockstate(BlockStateGen.reinforcedRail())
.addLayer(() -> RenderType::getCutoutMipped) .addLayer(() -> RenderType::getCutoutMipped)
.tag(BlockTags.RAILS) .tag(BlockTags.RAILS)
@ -645,7 +656,7 @@ public class AllBlocks {
public static final BlockEntry<MechanicalCrafterBlock> MECHANICAL_CRAFTER = public static final BlockEntry<MechanicalCrafterBlock> MECHANICAL_CRAFTER =
REGISTRATE.block("mechanical_crafter", MechanicalCrafterBlock::new) REGISTRATE.block("mechanical_crafter", MechanicalCrafterBlock::new)
.initialProperties(SharedProperties::softMetal) .initialProperties(SharedProperties::softMetal)
.properties(p -> p.nonOpaque()) .properties(Block.Properties::nonOpaque)
.blockstate(BlockStateGen.horizontalBlockProvider(true)) .blockstate(BlockStateGen.horizontalBlockProvider(true))
.transform(StressConfigDefaults.setImpact(2.0)) .transform(StressConfigDefaults.setImpact(2.0))
.onRegister(CreateRegistrate.connectedTextures(new CrafterCTBehaviour())) .onRegister(CreateRegistrate.connectedTextures(new CrafterCTBehaviour()))
@ -657,7 +668,7 @@ public class AllBlocks {
public static final BlockEntry<SequencedGearshiftBlock> SEQUENCED_GEARSHIFT = public static final BlockEntry<SequencedGearshiftBlock> SEQUENCED_GEARSHIFT =
REGISTRATE.block("sequenced_gearshift", SequencedGearshiftBlock::new) REGISTRATE.block("sequenced_gearshift", SequencedGearshiftBlock::new)
.initialProperties(SharedProperties::stone) .initialProperties(SharedProperties::stone)
.properties(p -> p.nonOpaque()) .properties(Block.Properties::nonOpaque)
.transform(StressConfigDefaults.setNoImpact()) .transform(StressConfigDefaults.setNoImpact())
.blockstate(new SequencedGearshiftGenerator()::generate) .blockstate(new SequencedGearshiftGenerator()::generate)
.item() .item()
@ -666,7 +677,7 @@ public class AllBlocks {
public static final BlockEntry<FlywheelBlock> FLYWHEEL = REGISTRATE.block("flywheel", FlywheelBlock::new) public static final BlockEntry<FlywheelBlock> FLYWHEEL = REGISTRATE.block("flywheel", FlywheelBlock::new)
.initialProperties(SharedProperties::softMetal) .initialProperties(SharedProperties::softMetal)
.properties(p -> p.nonOpaque()) .properties(Block.Properties::nonOpaque)
.transform(StressConfigDefaults.setNoImpact()) .transform(StressConfigDefaults.setNoImpact())
.blockstate(new FlywheelGenerator()::generate) .blockstate(new FlywheelGenerator()::generate)
.item() .item()
@ -817,7 +828,7 @@ public class AllBlocks {
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))
.properties(p -> p.nonOpaque()) .properties(Block.Properties::nonOpaque)
.blockstate((c, p) -> p.getVariantBuilder(c.get()) .blockstate((c, p) -> p.getVariantBuilder(c.get())
.forAllStates(s -> ConfiguredModel.builder() .forAllStates(s -> ConfiguredModel.builder()
.modelFile(AssetLookup.partialBaseModel(c, p)) .modelFile(AssetLookup.partialBaseModel(c, p))

View file

@ -1,7 +1,5 @@
package com.simibubi.create; package com.simibubi.create;
import java.util.function.Supplier;
import com.simibubi.create.compat.jei.ConversionRecipe; import com.simibubi.create.compat.jei.ConversionRecipe;
import com.simibubi.create.content.contraptions.components.crafter.MechanicalCraftingRecipe; import com.simibubi.create.content.contraptions.components.crafter.MechanicalCraftingRecipe;
import com.simibubi.create.content.contraptions.components.crusher.CrushingRecipe; import com.simibubi.create.content.contraptions.components.crusher.CrushingRecipe;
@ -12,11 +10,11 @@ import com.simibubi.create.content.contraptions.components.press.PressingRecipe;
import com.simibubi.create.content.contraptions.components.saw.CuttingRecipe; import com.simibubi.create.content.contraptions.components.saw.CuttingRecipe;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipeSerializer; import com.simibubi.create.content.contraptions.processing.ProcessingRecipeSerializer;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipeSerializer.IExtendedRecipeFactory;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipeSerializer.IRecipeFactory; import com.simibubi.create.content.contraptions.processing.ProcessingRecipeSerializer.IRecipeFactory;
import com.simibubi.create.content.curiosities.tools.SandPaperPolishingRecipe; import com.simibubi.create.content.curiosities.tools.SandPaperPolishingRecipe;
import com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperUpgradeRecipe; import com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperUpgradeRecipe;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.inventory.IInventory; import net.minecraft.inventory.IInventory;
import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.IRecipe;
import net.minecraft.item.crafting.IRecipeSerializer; import net.minecraft.item.crafting.IRecipeSerializer;
@ -26,18 +24,20 @@ import net.minecraft.util.ResourceLocation;
import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.Registry;
import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.event.RegistryEvent;
import java.util.function.Supplier;
public enum AllRecipeTypes { public enum AllRecipeTypes {
BLOCKZAPPER_UPGRADE(BlockzapperUpgradeRecipe.Serializer::new, IRecipeType.CRAFTING), BLOCKZAPPER_UPGRADE(BlockzapperUpgradeRecipe.Serializer::new, IRecipeType.CRAFTING),
MECHANICAL_CRAFTING(MechanicalCraftingRecipe.Serializer::new),
CRUSHING(processingSerializer(CrushingRecipe::new)),
MILLING(processingSerializer(MillingRecipe::new)),
SPLASHING(processingSerializer(SplashingRecipe::new)),
PRESSING(processingSerializer(PressingRecipe::new)),
CUTTING(processingSerializer(CuttingRecipe::new)),
MIXING(processingSerializer(MixingRecipe::new)),
SANDPAPER_POLISHING(processingSerializer(SandPaperPolishingRecipe::new)),
CONVERSION(processingSerializer(ConversionRecipe::new)), CONVERSION(processingSerializer(ConversionRecipe::new)),
CRUSHING(processingSerializer(CrushingRecipe::new)),
CUTTING(processingSerializer(CuttingRecipe::new)),
MECHANICAL_CRAFTING(MechanicalCraftingRecipe.Serializer::new),
MILLING(processingSerializer(MillingRecipe::new)),
MIXING(extendedProcessingSerializer(MixingRecipe::new)),
PRESSING(processingSerializer(PressingRecipe::new)),
SANDPAPER_POLISHING(processingSerializer(SandPaperPolishingRecipe::new)),
SPLASHING(processingSerializer(SplashingRecipe::new)),
; ;
@ -45,34 +45,30 @@ public enum AllRecipeTypes {
public Supplier<IRecipeSerializer<?>> supplier; public Supplier<IRecipeSerializer<?>> supplier;
public IRecipeType<? extends IRecipe<? extends IInventory>> type; public IRecipeType<? extends IRecipe<? extends IInventory>> type;
@SuppressWarnings("unchecked") AllRecipeTypes(Supplier<IRecipeSerializer<?>> supplier) {
public <T extends IRecipeType<?>> T getType() {
return (T) type;
}
private AllRecipeTypes(Supplier<IRecipeSerializer<?>> supplier) {
this(supplier, null); this(supplier, null);
} }
private AllRecipeTypes(Supplier<IRecipeSerializer<?>> supplier, AllRecipeTypes(Supplier<IRecipeSerializer<?>> supplier,
IRecipeType<? extends IRecipe<? extends IInventory>> existingType) { IRecipeType<? extends IRecipe<? extends IInventory>> existingType) {
this.supplier = supplier; this.supplier = supplier;
this.type = existingType; this.type = existingType;
} }
public static void register(RegistryEvent.Register<IRecipeSerializer<?>> event) { public static void register(RegistryEvent.Register<IRecipeSerializer<?>> event) {
ShapedRecipe.setCraftingSize(9, 9); ShapedRecipe.setCraftingSize(9, 9);
for (AllRecipeTypes r : AllRecipeTypes.values()) { for (AllRecipeTypes r : AllRecipeTypes.values()) {
if (r.type == null) if (r.type == null)
r.type = customType(Lang.asId(r.name())); r.type = customType(Lang.asId(r.name()));
r.serializer = r.supplier.get(); r.serializer = r.supplier.get();
ResourceLocation location = new ResourceLocation(Create.ID, Lang.asId(r.name())); ResourceLocation location = new ResourceLocation(Create.ID, Lang.asId(r.name()));
event.getRegistry().register(r.serializer.setRegistryName(location)); event.getRegistry()
.register(r.serializer.setRegistryName(location));
} }
} }
private static <T extends IRecipe<?>> IRecipeType<T> customType(String id) { private static <T extends IRecipe<?>> IRecipeType<T> customType(String id) {
return Registry.register(Registry.RECIPE_TYPE, new ResourceLocation(Create.ID, id), new IRecipeType<T>() { return Registry.register(Registry.RECIPE_TYPE, new ResourceLocation(Create.ID, id), new IRecipeType<T>() {
public String toString() { public String toString() {
@ -80,10 +76,19 @@ public enum AllRecipeTypes {
} }
}); });
} }
private static Supplier<IRecipeSerializer<?>> processingSerializer(IRecipeFactory<? extends ProcessingRecipe<?>> factory) { private static Supplier<IRecipeSerializer<?>> processingSerializer(
IRecipeFactory<? extends ProcessingRecipe<?>> factory) {
return () -> new ProcessingRecipeSerializer<>(factory); return () -> new ProcessingRecipeSerializer<>(factory);
} }
private static Supplier<IRecipeSerializer<?>> extendedProcessingSerializer(
IExtendedRecipeFactory<? extends ProcessingRecipe<?>> factory) {
return () -> new ProcessingRecipeSerializer<>(factory);
}
@SuppressWarnings("unchecked")
public <T extends IRecipeType<?>> T getType() {
return (T) type;
}
} }

View file

@ -49,8 +49,7 @@ import com.simibubi.create.content.contraptions.fluids.FluidTankRenderer;
import com.simibubi.create.content.contraptions.fluids.FluidTankTileEntity; import com.simibubi.create.content.contraptions.fluids.FluidTankTileEntity;
import com.simibubi.create.content.contraptions.fluids.PumpRenderer; import com.simibubi.create.content.contraptions.fluids.PumpRenderer;
import com.simibubi.create.content.contraptions.fluids.PumpTileEntity; import com.simibubi.create.content.contraptions.fluids.PumpTileEntity;
import com.simibubi.create.content.contraptions.processing.BasinRenderer; import com.simibubi.create.content.contraptions.processing.*;
import com.simibubi.create.content.contraptions.processing.BasinTileEntity;
import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerRenderer; import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerRenderer;
import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerTileEntity; import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerTileEntity;
import com.simibubi.create.content.contraptions.relays.advanced.sequencer.SequencedGearshiftTileEntity; import com.simibubi.create.content.contraptions.relays.advanced.sequencer.SequencedGearshiftTileEntity;
@ -201,6 +200,8 @@ public class AllTileEntities {
register("deployer", DeployerTileEntity::new, AllBlocks.DEPLOYER); register("deployer", DeployerTileEntity::new, AllBlocks.DEPLOYER);
public static final TileEntityEntry<BasinTileEntity> BASIN = public static final TileEntityEntry<BasinTileEntity> BASIN =
register("basin", BasinTileEntity::new, AllBlocks.BASIN); register("basin", BasinTileEntity::new, AllBlocks.BASIN);
public static final TileEntityEntry<HeaterTileEntity> HEATER =
register("blaze_heater", HeaterTileEntity::new, AllBlocks.HEATER);
public static final TileEntityEntry<MechanicalCrafterTileEntity> MECHANICAL_CRAFTER = public static final TileEntityEntry<MechanicalCrafterTileEntity> MECHANICAL_CRAFTER =
register("mechanical_crafter", MechanicalCrafterTileEntity::new, AllBlocks.MECHANICAL_CRAFTER); register("mechanical_crafter", MechanicalCrafterTileEntity::new, AllBlocks.MECHANICAL_CRAFTER);
public static final TileEntityEntry<SequencedGearshiftTileEntity> SEQUENCED_GEARSHIFT = public static final TileEntityEntry<SequencedGearshiftTileEntity> SEQUENCED_GEARSHIFT =
@ -300,6 +301,7 @@ public class AllTileEntities {
bind(SPEEDOMETER, GaugeRenderer::speed); bind(SPEEDOMETER, GaugeRenderer::speed);
bind(STRESSOMETER, GaugeRenderer::stress); bind(STRESSOMETER, GaugeRenderer::stress);
bind(BASIN, BasinRenderer::new); bind(BASIN, BasinRenderer::new);
bind(HEATER, HeaterRenderer::new);
bind(DEPLOYER, DeployerRenderer::new); bind(DEPLOYER, DeployerRenderer::new);
bind(FLYWHEEL, FlywheelRenderer::new); bind(FLYWHEEL, FlywheelRenderer::new);
bind(FURNACE_ENGINE, EngineRenderer::new); bind(FURNACE_ENGINE, EngineRenderer::new);

View file

@ -1,8 +1,10 @@
package com.simibubi.create.compat.jei; package com.simibubi.create.compat.jei;
import java.util.Arrays; import java.util.Collections;
import java.util.List; import java.util.List;
import javax.annotation.ParametersAreNonnullByDefault;
import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.Create; import com.simibubi.create.Create;
import com.simibubi.create.content.contraptions.processing.ProcessingIngredient; import com.simibubi.create.content.contraptions.processing.ProcessingIngredient;
@ -21,23 +23,25 @@ import net.minecraftforge.items.wrapper.RecipeWrapper;
* @author simibubi * @author simibubi
* *
*/ */
@ParametersAreNonnullByDefault
public class ConversionRecipe extends ProcessingRecipe<RecipeWrapper> { public class ConversionRecipe extends ProcessingRecipe<RecipeWrapper> {
public ConversionRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients, public ConversionRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int processingDuration) { List<ProcessingOutput> results, int processingDuration) {
super(AllRecipeTypes.CONVERSION, id, group, ingredients, results, processingDuration); super(AllRecipeTypes.CONVERSION, id, group, ingredients, results, processingDuration);
} }
static int counter = 0; static int counter = 0;
public static ConversionRecipe create(ItemStack from, ItemStack to) { public static ConversionRecipe create(ItemStack from, ItemStack to) {
List<ProcessingIngredient> ingredients = Arrays.asList(new ProcessingIngredient(Ingredient.fromStacks(from))); List<ProcessingIngredient> ingredients =
List<ProcessingOutput> outputs = Arrays.asList(new ProcessingOutput(to, 1)); Collections.singletonList(new ProcessingIngredient(Ingredient.fromStacks(from)));
List<ProcessingOutput> outputs = Collections.singletonList(new ProcessingOutput(to, 1));
return new ConversionRecipe(new ResourceLocation(Create.ID, "conversion_" + counter++), ingredients, outputs); return new ConversionRecipe(new ResourceLocation(Create.ID, "conversion_" + counter++), ingredients, outputs);
} }
public ConversionRecipe(ResourceLocation id, List<ProcessingIngredient> ingredients, public ConversionRecipe(ResourceLocation id, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results) { List<ProcessingOutput> results) {
this(id, "conversions", ingredients, results, -1); this(id, "conversions", ingredients, results, -1);
} }

View file

@ -59,10 +59,10 @@ public abstract class CreateRecipeCategory<T extends IRecipe<?>> implements IRec
if (!(recipe instanceof ProcessingRecipe)) if (!(recipe instanceof ProcessingRecipe))
return jeiSlot; return jeiSlot;
ProcessingRecipe<?> processingRecipe = (ProcessingRecipe<?>) recipe; ProcessingRecipe<?> processingRecipe = (ProcessingRecipe<?>) recipe;
List<ProcessingOutput> rollableResults = processingRecipe.getRollableResults(); List<ProcessingOutput> rollableResults = processingRecipe.getRollableItemResults();
if (rollableResults.size() <= index) if (rollableResults.size() <= index)
return jeiSlot; return jeiSlot;
if (processingRecipe.getRollableResults().get(index).getChance() == 1) if (processingRecipe.getRollableItemResults().get(index).getChance() == 1)
return jeiSlot; return jeiSlot;
return AllGuiTextures.JEI_CHANCE_SLOT; return AllGuiTextures.JEI_CHANCE_SLOT;
} }

View file

@ -41,7 +41,7 @@ public class CrushingCategory extends CreateRecipeCategory<AbstractCrushingRecip
itemStacks.init(0, true, 50, 2); itemStacks.init(0, true, 50, 2);
itemStacks.set(0, Arrays.asList(recipe.getIngredients().get(0).getMatchingStacks())); itemStacks.set(0, Arrays.asList(recipe.getIngredients().get(0).getMatchingStacks()));
List<ProcessingOutput> results = recipe.getRollableResults(); List<ProcessingOutput> results = recipe.getRollableItemResults();
int size = results.size(); int size = results.size();
int offset = -size * 19 / 2; int offset = -size * 19 / 2;
for (int outputIndex = 0; outputIndex < size; outputIndex++) { for (int outputIndex = 0; outputIndex < size; outputIndex++) {
@ -54,7 +54,7 @@ public class CrushingCategory extends CreateRecipeCategory<AbstractCrushingRecip
@Override @Override
public void draw(AbstractCrushingRecipe recipe, double mouseX, double mouseY) { public void draw(AbstractCrushingRecipe recipe, double mouseX, double mouseY) {
List<ProcessingOutput> results = recipe.getRollableResults(); List<ProcessingOutput> results = recipe.getRollableItemResults();
AllGuiTextures.JEI_SLOT.draw(50, 2); AllGuiTextures.JEI_SLOT.draw(50, 2);
AllGuiTextures.JEI_DOWN_ARROW.draw(72, 7); AllGuiTextures.JEI_DOWN_ARROW.draw(72, 7);

View file

@ -43,7 +43,7 @@ public class MillingCategory extends CreateRecipeCategory<AbstractCrushingRecipe
.get(0) .get(0)
.getMatchingStacks())); .getMatchingStacks()));
List<ProcessingOutput> results = recipe.getRollableResults(); List<ProcessingOutput> results = recipe.getRollableItemResults();
boolean single = results.size() == 1; boolean single = results.size() == 1;
for (int outputIndex = 0; outputIndex < results.size(); outputIndex++) { for (int outputIndex = 0; outputIndex < results.size(); outputIndex++) {
int xOffset = outputIndex % 2 == 0 ? 0 : 19; int xOffset = outputIndex % 2 == 0 ? 0 : 19;

View file

@ -41,7 +41,7 @@ public class MysteriousItemConversionCategory extends CreateRecipeCategory<Conve
@Override @Override
public void setRecipe(IRecipeLayout recipeLayout, ConversionRecipe recipe, IIngredients ingredients) { public void setRecipe(IRecipeLayout recipeLayout, ConversionRecipe recipe, IIngredients ingredients) {
IGuiItemStackGroup itemStacks = recipeLayout.getItemStacks(); IGuiItemStackGroup itemStacks = recipeLayout.getItemStacks();
List<ProcessingOutput> results = recipe.getRollableResults(); List<ProcessingOutput> results = recipe.getRollableItemResults();
itemStacks.init(0, true, 26, 16); itemStacks.init(0, true, 26, 16);
itemStacks.set(0, Arrays.asList(recipe.getIngredients().get(0).getMatchingStacks())); itemStacks.set(0, Arrays.asList(recipe.getIngredients().get(0).getMatchingStacks()));
itemStacks.init(1, false, 131, 16); itemStacks.init(1, false, 131, 16);

View file

@ -43,7 +43,7 @@ public class PolishingCategory extends CreateRecipeCategory<SandPaperPolishingRe
@Override @Override
public void setRecipe(IRecipeLayout recipeLayout, SandPaperPolishingRecipe recipe, IIngredients ingredients) { public void setRecipe(IRecipeLayout recipeLayout, SandPaperPolishingRecipe recipe, IIngredients ingredients) {
IGuiItemStackGroup itemStacks = recipeLayout.getItemStacks(); IGuiItemStackGroup itemStacks = recipeLayout.getItemStacks();
List<ProcessingOutput> results = recipe.getRollableResults(); List<ProcessingOutput> results = recipe.getRollableItemResults();
itemStacks.init(0, true, 26, 28); itemStacks.init(0, true, 26, 28);
itemStacks.set(0, Arrays.asList(recipe.getIngredients().get(0).getMatchingStacks())); itemStacks.set(0, Arrays.asList(recipe.getIngredients().get(0).getMatchingStacks()));

View file

@ -41,7 +41,7 @@ public class PressingCategory extends CreateRecipeCategory<PressingRecipe> {
itemStacks.init(0, true, 26, 50); itemStacks.init(0, true, 26, 50);
itemStacks.set(0, Arrays.asList(recipe.getIngredients().get(0).getMatchingStacks())); itemStacks.set(0, Arrays.asList(recipe.getIngredients().get(0).getMatchingStacks()));
List<ProcessingOutput> results = recipe.getRollableResults(); List<ProcessingOutput> results = recipe.getRollableItemResults();
for (int outputIndex = 0; outputIndex < results.size(); outputIndex++) { for (int outputIndex = 0; outputIndex < results.size(); outputIndex++) {
itemStacks.init(outputIndex + 1, false, 131 + 19 * outputIndex, 50); itemStacks.init(outputIndex + 1, false, 131 + 19 * outputIndex, 50);
itemStacks.set(outputIndex + 1, results.get(outputIndex).getStack()); itemStacks.set(outputIndex + 1, results.get(outputIndex).getStack());
@ -54,7 +54,7 @@ public class PressingCategory extends CreateRecipeCategory<PressingRecipe> {
public void draw(PressingRecipe recipe, double mouseX, double mouseY) { public void draw(PressingRecipe recipe, double mouseX, double mouseY) {
AllGuiTextures.JEI_SLOT.draw(26, 50); AllGuiTextures.JEI_SLOT.draw(26, 50);
getRenderedSlot(recipe, 0).draw(131, 50); getRenderedSlot(recipe, 0).draw(131, 50);
if (recipe.getRollableResults().size() > 1) if (recipe.getRollableItemResults().size() > 1)
getRenderedSlot(recipe, 1).draw(131 + 19, 50); getRenderedSlot(recipe, 1).draw(131 + 19, 50);
AllGuiTextures.JEI_SHADOW.draw(61, 41); AllGuiTextures.JEI_SHADOW.draw(61, 41);
AllGuiTextures.JEI_LONG_ARROW.draw(52, 54); AllGuiTextures.JEI_LONG_ARROW.draw(52, 54);

View file

@ -40,7 +40,7 @@ public class SawingCategory extends CreateRecipeCategory<CuttingRecipe> {
itemStacks.init(0, true, 43, 4); itemStacks.init(0, true, 43, 4);
itemStacks.set(0, Arrays.asList(recipe.getIngredients().get(0).getMatchingStacks())); itemStacks.set(0, Arrays.asList(recipe.getIngredients().get(0).getMatchingStacks()));
List<ProcessingOutput> results = recipe.getRollableResults(); List<ProcessingOutput> results = recipe.getRollableItemResults();
for (int outputIndex = 0; outputIndex < results.size(); outputIndex++) { for (int outputIndex = 0; outputIndex < results.size(); outputIndex++) {
int xOffset = outputIndex % 2 == 0 ? 0 : 19; int xOffset = outputIndex % 2 == 0 ? 0 : 19;
int yOffset = (outputIndex / 2) * -19; int yOffset = (outputIndex / 2) * -19;
@ -55,7 +55,7 @@ public class SawingCategory extends CreateRecipeCategory<CuttingRecipe> {
@Override @Override
public void draw(CuttingRecipe recipe, double mouseX, double mouseY) { public void draw(CuttingRecipe recipe, double mouseX, double mouseY) {
AllGuiTextures.JEI_SLOT.draw(43, 4); AllGuiTextures.JEI_SLOT.draw(43, 4);
int size = recipe.getRollableResults().size(); int size = recipe.getRollableItemResults().size();
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
int xOffset = i % 2 == 0 ? 0 : 19; int xOffset = i % 2 == 0 ? 0 : 19;
int yOffset = (i / 2) * -19; int yOffset = (i / 2) * -19;

View file

@ -42,7 +42,7 @@ public class SplashingCategory extends ProcessingViaFanCategory<SplashingRecipe>
.get(0) .get(0)
.getMatchingStacks())); .getMatchingStacks()));
List<ProcessingOutput> results = recipe.getRollableResults(); List<ProcessingOutput> results = recipe.getRollableItemResults();
boolean single = results.size() == 1; boolean single = results.size() == 1;
for (int outputIndex = 0; outputIndex < results.size(); outputIndex++) { for (int outputIndex = 0; outputIndex < results.size(); outputIndex++) {
int xOffset = outputIndex % 2 == 0 ? 0 : 19; int xOffset = outputIndex % 2 == 0 ? 0 : 19;

View file

@ -13,7 +13,7 @@ import net.minecraftforge.items.wrapper.RecipeWrapper;
public abstract class AbstractCrushingRecipe extends ProcessingRecipe<RecipeWrapper> { public abstract class AbstractCrushingRecipe extends ProcessingRecipe<RecipeWrapper> {
public AbstractCrushingRecipe(AllRecipeTypes recipeType, ResourceLocation id, String group, public AbstractCrushingRecipe(AllRecipeTypes recipeType, ResourceLocation id, String group,
List<ProcessingIngredient> ingredients, List<ProcessingOutput> results, int processingDuration) { List<ProcessingIngredient> ingredients, List<ProcessingOutput> results, int processingDuration) {
super(recipeType, id, group, ingredients, results, processingDuration); super(recipeType, id, group, ingredients, results, processingDuration);
} }

View file

@ -1,19 +1,20 @@
package com.simibubi.create.content.contraptions.components.crusher; package com.simibubi.create.content.contraptions.components.crusher;
import java.util.List;
import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.content.contraptions.processing.ProcessingIngredient; import com.simibubi.create.content.contraptions.processing.ProcessingIngredient;
import com.simibubi.create.content.contraptions.processing.ProcessingOutput; import com.simibubi.create.content.contraptions.processing.ProcessingOutput;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.items.wrapper.RecipeWrapper; import net.minecraftforge.items.wrapper.RecipeWrapper;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.List;
@ParametersAreNonnullByDefault
public class CrushingRecipe extends AbstractCrushingRecipe { public class CrushingRecipe extends AbstractCrushingRecipe {
public CrushingRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients, public CrushingRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int processingDuration) { List<ProcessingOutput> results, int processingDuration) {
super(AllRecipeTypes.CRUSHING, id, group, ingredients, results, processingDuration); super(AllRecipeTypes.CRUSHING, id, group, ingredients, results, processingDuration);
} }
@ -21,9 +22,10 @@ public class CrushingRecipe extends AbstractCrushingRecipe {
public boolean matches(RecipeWrapper inv, World worldIn) { public boolean matches(RecipeWrapper inv, World worldIn) {
if (inv.isEmpty()) if (inv.isEmpty())
return false; return false;
return ingredients.get(0).test(inv.getStackInSlot(0)); return ingredients.get(0)
.test(inv.getStackInSlot(0));
} }
@Override @Override
protected int getMaxOutputCount() { protected int getMaxOutputCount() {
return 7; return 7;

View file

@ -191,7 +191,7 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity {
inventory.clear(); inventory.clear();
for (int roll = 0; roll < rolls; roll++) { for (int roll = 0; roll < rolls; roll++) {
List<ItemStack> rolledResults = recipe.get() List<ItemStack> rolledResults = recipe.get()
.rollResults(); .rollResults().getItemStacks();
for (int i = 0; i < rolledResults.size(); i++) { for (int i = 0; i < rolledResults.size(); i++) {
ItemStack stack = rolledResults.get(i); ItemStack stack = rolledResults.get(i);
ItemHelper.addToList(stack, list); ItemHelper.addToList(stack, list);

View file

@ -1,21 +1,22 @@
package com.simibubi.create.content.contraptions.components.fan; package com.simibubi.create.content.contraptions.components.fan;
import java.util.List;
import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.content.contraptions.processing.ProcessingIngredient; import com.simibubi.create.content.contraptions.processing.ProcessingIngredient;
import com.simibubi.create.content.contraptions.processing.ProcessingOutput; import com.simibubi.create.content.contraptions.processing.ProcessingOutput;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe;
import com.simibubi.create.content.logistics.InWorldProcessing; import com.simibubi.create.content.logistics.InWorldProcessing;
import com.simibubi.create.content.logistics.InWorldProcessing.SplashingInv; import com.simibubi.create.content.logistics.InWorldProcessing.SplashingInv;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.List;
@ParametersAreNonnullByDefault
public class SplashingRecipe extends ProcessingRecipe<InWorldProcessing.SplashingInv> { public class SplashingRecipe extends ProcessingRecipe<InWorldProcessing.SplashingInv> {
public SplashingRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients, public SplashingRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int processingDuration) { List<ProcessingOutput> results, int processingDuration) {
super(AllRecipeTypes.SPLASHING, id, group, ingredients, results, processingDuration); super(AllRecipeTypes.SPLASHING, id, group, ingredients, results, processingDuration);
} }
@ -23,9 +24,10 @@ public class SplashingRecipe extends ProcessingRecipe<InWorldProcessing.Splashin
public boolean matches(SplashingInv inv, World worldIn) { public boolean matches(SplashingInv inv, World worldIn) {
if (inv.isEmpty()) if (inv.isEmpty())
return false; return false;
return ingredients.get(0).test(inv.getStackInSlot(0)); return ingredients.get(0)
.test(inv.getStackInSlot(0));
} }
@Override @Override
protected int getMaxOutputCount() { protected int getMaxOutputCount() {
return 6; return 6;

View file

@ -1,20 +1,21 @@
package com.simibubi.create.content.contraptions.components.millstone; package com.simibubi.create.content.contraptions.components.millstone;
import java.util.List;
import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.content.contraptions.components.crusher.AbstractCrushingRecipe; import com.simibubi.create.content.contraptions.components.crusher.AbstractCrushingRecipe;
import com.simibubi.create.content.contraptions.processing.ProcessingIngredient; import com.simibubi.create.content.contraptions.processing.ProcessingIngredient;
import com.simibubi.create.content.contraptions.processing.ProcessingOutput; import com.simibubi.create.content.contraptions.processing.ProcessingOutput;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.items.wrapper.RecipeWrapper; import net.minecraftforge.items.wrapper.RecipeWrapper;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.List;
@ParametersAreNonnullByDefault
public class MillingRecipe extends AbstractCrushingRecipe { public class MillingRecipe extends AbstractCrushingRecipe {
public MillingRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients, public MillingRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int processingDuration) { List<ProcessingOutput> results, int processingDuration) {
super(AllRecipeTypes.MILLING, id, group, ingredients, results, processingDuration); super(AllRecipeTypes.MILLING, id, group, ingredients, results, processingDuration);
} }
@ -22,12 +23,12 @@ public class MillingRecipe extends AbstractCrushingRecipe {
public boolean matches(RecipeWrapper inv, World worldIn) { public boolean matches(RecipeWrapper inv, World worldIn) {
if (inv.isEmpty()) if (inv.isEmpty())
return false; return false;
return ingredients.get(0).test(inv.getStackInSlot(0)); return ingredients.get(0)
.test(inv.getStackInSlot(0));
} }
@Override @Override
protected int getMaxOutputCount() { protected int getMaxOutputCount() {
return 4; return 4;
} }
} }

View file

@ -94,7 +94,7 @@ public class MillstoneTileEntity extends KineticTileEntity {
ItemStack stackInSlot = inputInv.getStackInSlot(0); ItemStack stackInSlot = inputInv.getStackInSlot(0);
stackInSlot.shrink(1); stackInSlot.shrink(1);
inputInv.setStackInSlot(0, stackInSlot); inputInv.setStackInSlot(0, stackInSlot);
lastRecipe.rollResults().forEach(stack -> ItemHandlerHelper.insertItemStacked(outputInv, stack, false)); lastRecipe.rollResults().forEachItemStack(stack -> ItemHandlerHelper.insertItemStacked(outputInv, stack, false));
sendData(); sendData();
markDirty(); markDirty();
} }

View file

@ -1,14 +1,17 @@
package com.simibubi.create.content.contraptions.components.mixer; package com.simibubi.create.content.contraptions.components.mixer;
import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.AllTags;
import com.simibubi.create.content.contraptions.components.press.MechanicalPressTileEntity; import com.simibubi.create.content.contraptions.components.press.MechanicalPressTileEntity;
import com.simibubi.create.content.contraptions.fluids.CombinedFluidHandler;
import com.simibubi.create.content.contraptions.processing.BasinOperatingTileEntity; import com.simibubi.create.content.contraptions.processing.BasinOperatingTileEntity;
import com.simibubi.create.content.contraptions.processing.BasinTileEntity.BasinInventory; import com.simibubi.create.content.contraptions.processing.BasinTileEntity.BasinInventory;
import com.simibubi.create.content.contraptions.processing.CombinedItemFluidList;
import com.simibubi.create.content.contraptions.processing.HeaterTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.CenteredSideValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.CenteredSideValueBoxTransform;
import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueBehaviour;
@ -23,6 +26,7 @@ import net.minecraft.item.crafting.Ingredient;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.particles.ItemParticleData; import net.minecraft.particles.ItemParticleData;
import net.minecraft.particles.ParticleTypes; import net.minecraft.particles.ParticleTypes;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityType; import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction.Axis; import net.minecraft.util.Direction.Axis;
import net.minecraft.util.NonNullList; import net.minecraft.util.NonNullList;
@ -65,7 +69,7 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity {
} }
public float getRenderedHeadOffset(float partialTicks) { public float getRenderedHeadOffset(float partialTicks) {
int localTick = 0; int localTick;
float offset = 0; float offset = 0;
if (running) { if (running) {
if (runningTicks < 20) { if (runningTicks < 20) {
@ -121,7 +125,7 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity {
@Override @Override
public void lazyTick() { public void lazyTick() {
super.lazyTick(); super.lazyTick();
if (world.isRemote && running && !basinItemInv.isPresent()) if (world != null && world.isRemote && running && !basinItemInv.isPresent())
updateBasin(); updateBasin();
} }
@ -163,7 +167,7 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity {
public void renderParticles() { public void renderParticles() {
IItemHandler itemHandler = basinItemInv.orElse(null); IItemHandler itemHandler = basinItemInv.orElse(null);
BasinInventory inv = (BasinInventory) itemHandler; BasinInventory inv = (BasinInventory) itemHandler;
if (inv == null) if (inv == null || world == null)
return; return;
for (int slot = 0; slot < inv.getInputHandler() for (int slot = 0; slot < inv.getInputHandler()
@ -204,14 +208,16 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity {
.allMatch(ingredient -> (ingredient.isSimple() || ingredient.getMatchingStacks().length == 1))) .allMatch(ingredient -> (ingredient.isSimple() || ingredient.getMatchingStacks().length == 1)))
return false; return false;
List<ItemStack> remaining = new ArrayList<>(); CombinedItemFluidList remaining = new CombinedItemFluidList();
inputs.forEachItemStack(stack -> remaining.add(stack.copy())); inputs.forEachItemStack(stack -> remaining.add(stack.copy()));
basinFluidInv.ifPresent(
fluidInv -> ((CombinedFluidHandler) fluidInv).forEachTank(fluidStack -> remaining.add(fluidStack.copy())));
// sort by leniency // sort by leniency
List<Ingredient> sortedIngredients = new LinkedList<>(ingredients); List<Ingredient> sortedIngredients = new LinkedList<>(ingredients);
sortedIngredients.sort(Comparator.comparingInt(i -> i.getMatchingStacks().length)); sortedIngredients.sort(Comparator.comparingInt(i -> i.getMatchingStacks().length));
Ingredients: for (Ingredient ingredient : sortedIngredients) { Ingredients: for (Ingredient ingredient : sortedIngredients) {
for (ItemStack stack : remaining) { for (ItemStack stack : remaining.getItemStacks()) {
if (stack.isEmpty()) if (stack.isEmpty())
continue; continue;
if (ingredient.test(stack)) { if (ingredient.test(stack)) {
@ -221,7 +227,10 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity {
} }
return false; return false;
} }
return true;
if (!(recipe instanceof MixingRecipe))
return true;
return ((MixingRecipe) recipe).getHeatLevelRequired() <= getHeatLevelApplied();
} }
@Override @Override
@ -258,4 +267,13 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity {
return running; return running;
} }
private int getHeatLevelApplied() {
if (world == null)
return 0;
TileEntity te = world.getTileEntity(pos.down(3));
if (!(te instanceof HeaterTileEntity))
return AllTags.AllBlockTags.FAN_HEATERS.matches(world.getBlockState(pos.down(3))) ? 1 : 0;
return ((HeaterTileEntity) te).getHeatLevel();
}
} }

View file

@ -1,52 +1,58 @@
package com.simibubi.create.content.contraptions.components.mixer; package com.simibubi.create.content.contraptions.components.mixer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.content.contraptions.processing.BasinTileEntity.BasinInputInventory; import com.simibubi.create.content.contraptions.processing.BasinTileEntity.BasinInputInventory;
import com.simibubi.create.content.contraptions.processing.ProcessingIngredient; import com.simibubi.create.content.contraptions.processing.ProcessingIngredient;
import com.simibubi.create.content.contraptions.processing.ProcessingOutput; import com.simibubi.create.content.contraptions.processing.ProcessingOutput;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.IRecipe;
import net.minecraft.item.crafting.Ingredient; import net.minecraft.item.crafting.Ingredient;
import net.minecraft.util.NonNullList; import net.minecraft.util.NonNullList;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.fluids.FluidStack;
import javax.annotation.Nonnull;
import java.util.*;
public class MixingRecipe extends ProcessingRecipe<BasinInputInventory> { public class MixingRecipe extends ProcessingRecipe<BasinInputInventory> {
public MixingRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients, public MixingRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int processingDuration) { List<ProcessingOutput> results, int processingDuration, List<FluidStack> fluidIngredients,
super(AllRecipeTypes.MIXING, id, group, ingredients, results, processingDuration); List<FluidStack> fluidResults, int requiredHeat) {
super(AllRecipeTypes.MIXING, id, group, ingredients, results, processingDuration, fluidIngredients,
fluidResults, requiredHeat);
}
public static MixingRecipe of(IRecipe<?> recipe) {
return new MixingRecipe(recipe.getId(), recipe.getGroup(), ProcessingIngredient.list(recipe.getIngredients()),
Collections.singletonList(new ProcessingOutput(recipe.getRecipeOutput(), 1)), -1, null, null, 0);
} }
@Override @Override
protected int getMaxInputCount() { protected int getMaxInputCount() {
return 9; return 9;
} }
@Override @Override
protected int getMaxOutputCount() { protected int getMaxOutputCount() {
return 1; return 1;
} }
@Override @Override
protected boolean canHaveCatalysts() { protected boolean canHaveCatalysts() {
return true; return true;
} }
@Override @Override
public boolean matches(BasinInputInventory inv, World worldIn) { public boolean matches(BasinInputInventory inv, @Nonnull World worldIn) {
if (inv.isEmpty()) if (inv.isEmpty())
return false; return false;
NonNullList<Ingredient> ingredients = getIngredients(); NonNullList<Ingredient> ingredients = this.getIngredients();
if (!ingredients.stream().allMatch(Ingredient::isSimple)) if (!ingredients.stream()
.allMatch(Ingredient::isSimple))
return false; return false;
List<ItemStack> remaining = new ArrayList<>(); List<ItemStack> remaining = new ArrayList<>();
@ -59,7 +65,7 @@ public class MixingRecipe extends ProcessingRecipe<BasinInputInventory> {
// sort by leniency // sort by leniency
List<Ingredient> sortedIngredients = new LinkedList<>(ingredients); List<Ingredient> sortedIngredients = new LinkedList<>(ingredients);
sortedIngredients.sort((i1, i2) -> i1.getMatchingStacks().length - i2.getMatchingStacks().length); sortedIngredients.sort(Comparator.comparingInt(i -> i.getMatchingStacks().length));
Ingredients: for (Ingredient ingredient : sortedIngredients) { Ingredients: for (Ingredient ingredient : sortedIngredients) {
for (ItemStack stack : remaining) { for (ItemStack stack : remaining) {
if (stack.isEmpty()) if (stack.isEmpty())
@ -74,9 +80,22 @@ public class MixingRecipe extends ProcessingRecipe<BasinInputInventory> {
return true; return true;
} }
public static MixingRecipe of(IRecipe<?> recipe) { @Override
return new MixingRecipe(recipe.getId(), recipe.getGroup(), ProcessingIngredient.list(recipe.getIngredients()), protected boolean canHaveFluidIngredient() {
Arrays.asList(new ProcessingOutput(recipe.getRecipeOutput(), 1)), -1); return true;
} }
@Override
protected boolean canHaveFluidOutput() {
return true;
}
@Override
protected boolean requiresHeating() {
return this.requiredHeat > 0;
}
public int getHeatLevelRequired() {
return requiredHeat;
}
} }

View file

@ -6,8 +6,10 @@ import java.util.Optional;
import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.AllSoundEvents; import com.simibubi.create.AllSoundEvents;
import com.simibubi.create.content.contraptions.fluids.CombinedFluidHandler;
import com.simibubi.create.content.contraptions.processing.BasinOperatingTileEntity; import com.simibubi.create.content.contraptions.processing.BasinOperatingTileEntity;
import com.simibubi.create.content.contraptions.processing.BasinTileEntity.BasinInventory; import com.simibubi.create.content.contraptions.processing.BasinTileEntity.BasinInventory;
import com.simibubi.create.content.contraptions.processing.CombinedItemFluidList;
import com.simibubi.create.content.logistics.InWorldProcessing; import com.simibubi.create.content.logistics.InWorldProcessing;
import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.advancement.AllTriggers;
import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.item.ItemHelper;
@ -297,11 +299,12 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity {
.allMatch(Ingredient::isSimple)) .allMatch(Ingredient::isSimple))
return false; return false;
List<ItemStack> remaining = new ArrayList<>(); CombinedItemFluidList remaining = new CombinedItemFluidList();
inputs.forEachItemStack(stack -> remaining.add(stack.copy())); inputs.forEachItemStack(stack -> remaining.add(stack.copy()));
basinFluidInv.ifPresent(fluidInv -> ((CombinedFluidHandler) fluidInv).forEachTank(fluidStack -> remaining.add(fluidStack.copy())));
Ingredients: for (Ingredient ingredient : ingredients) { Ingredients: for (Ingredient ingredient : ingredients) {
for (ItemStack stack : remaining) { for (ItemStack stack : remaining.getItemStacks()) {
if (stack.isEmpty()) if (stack.isEmpty())
continue; continue;
if (ingredient.test(stack)) { if (ingredient.test(stack)) {

View file

@ -1,20 +1,21 @@
package com.simibubi.create.content.contraptions.components.press; package com.simibubi.create.content.contraptions.components.press;
import java.util.List;
import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.content.contraptions.components.press.MechanicalPressTileEntity.PressingInv; import com.simibubi.create.content.contraptions.components.press.MechanicalPressTileEntity.PressingInv;
import com.simibubi.create.content.contraptions.processing.ProcessingIngredient; import com.simibubi.create.content.contraptions.processing.ProcessingIngredient;
import com.simibubi.create.content.contraptions.processing.ProcessingOutput; import com.simibubi.create.content.contraptions.processing.ProcessingOutput;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.List;
@ParametersAreNonnullByDefault
public class PressingRecipe extends ProcessingRecipe<MechanicalPressTileEntity.PressingInv> { public class PressingRecipe extends ProcessingRecipe<MechanicalPressTileEntity.PressingInv> {
public PressingRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients, public PressingRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int processingDuration) { List<ProcessingOutput> results, int processingDuration) {
super(AllRecipeTypes.PRESSING, id, group, ingredients, results, processingDuration); super(AllRecipeTypes.PRESSING, id, group, ingredients, results, processingDuration);
} }
@ -22,12 +23,12 @@ public class PressingRecipe extends ProcessingRecipe<MechanicalPressTileEntity.P
public boolean matches(PressingInv inv, World worldIn) { public boolean matches(PressingInv inv, World worldIn) {
if (inv.isEmpty()) if (inv.isEmpty())
return false; return false;
return ingredients.get(0).test(inv.getStackInSlot(0)); return ingredients.get(0)
.test(inv.getStackInSlot(0));
} }
@Override @Override
protected int getMaxOutputCount() { protected int getMaxOutputCount() {
return 2; return 2;
} }
} }

View file

@ -1,20 +1,21 @@
package com.simibubi.create.content.contraptions.components.saw; package com.simibubi.create.content.contraptions.components.saw;
import java.util.List;
import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.content.contraptions.processing.ProcessingIngredient; import com.simibubi.create.content.contraptions.processing.ProcessingIngredient;
import com.simibubi.create.content.contraptions.processing.ProcessingOutput; import com.simibubi.create.content.contraptions.processing.ProcessingOutput;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.items.wrapper.RecipeWrapper; import net.minecraftforge.items.wrapper.RecipeWrapper;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.List;
@ParametersAreNonnullByDefault
public class CuttingRecipe extends ProcessingRecipe<RecipeWrapper> { public class CuttingRecipe extends ProcessingRecipe<RecipeWrapper> {
public CuttingRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients, public CuttingRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int processingDuration) { List<ProcessingOutput> results, int processingDuration) {
super(AllRecipeTypes.CUTTING, id, group, ingredients, results, processingDuration); super(AllRecipeTypes.CUTTING, id, group, ingredients, results, processingDuration);
} }
@ -22,9 +23,10 @@ public class CuttingRecipe extends ProcessingRecipe<RecipeWrapper> {
public boolean matches(RecipeWrapper inv, World worldIn) { public boolean matches(RecipeWrapper inv, World worldIn) {
if (inv.isEmpty()) if (inv.isEmpty())
return false; return false;
return ingredients.get(0).test(inv.getStackInSlot(0)); return ingredients.get(0)
.test(inv.getStackInSlot(0));
} }
@Override @Override
protected int getMaxOutputCount() { protected int getMaxOutputCount() {
return 4; return 4;

View file

@ -248,7 +248,7 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity {
for (int roll = 0; roll < rolls; roll++) { for (int roll = 0; roll < rolls; roll++) {
List<ItemStack> results = new LinkedList<ItemStack>(); List<ItemStack> results = new LinkedList<ItemStack>();
if (recipe instanceof CuttingRecipe) if (recipe instanceof CuttingRecipe)
results = ((CuttingRecipe) recipe).rollResults(); results = ((CuttingRecipe) recipe).rollResults().getItemStacks();
else if (recipe instanceof StonecuttingRecipe) else if (recipe instanceof StonecuttingRecipe)
results.add(recipe.getRecipeOutput() results.add(recipe.getRecipeOutput()
.copy()); .copy());

View file

@ -37,7 +37,7 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity {
protected IRecipe<?> lastRecipe; protected IRecipe<?> lastRecipe;
protected LazyOptional<IItemHandler> basinItemInv = LazyOptional.empty(); protected LazyOptional<IItemHandler> basinItemInv = LazyOptional.empty();
protected LazyOptional<IFluidHandler> basinFluidInv = LazyOptional.empty(); protected LazyOptional<IFluidHandler> basinFluidInv = LazyOptional.empty();
protected MultiIngredientTypeList inputs; protected CombinedItemFluidList inputs;
public BasinOperatingTileEntity(TileEntityType<?> typeIn) { public BasinOperatingTileEntity(TileEntityType<?> typeIn) {
super(typeIn); super(typeIn);
@ -59,7 +59,7 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity {
} }
public void gatherInputs() { public void gatherInputs() {
inputs = new MultiIngredientTypeList(); inputs = new CombinedItemFluidList();
basinItemInv.ifPresent(inv -> { basinItemInv.ifPresent(inv -> {
IItemHandlerModifiable inputHandler = ((BasinInventory) inv).getInputHandler(); IItemHandlerModifiable inputHandler = ((BasinInventory) inv).getInputHandler();

View file

@ -3,6 +3,8 @@ package com.simibubi.create.content.contraptions.processing;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import javax.annotation.Nonnull;
import com.simibubi.create.content.contraptions.fluids.CombinedFluidHandler; import com.simibubi.create.content.contraptions.fluids.CombinedFluidHandler;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
@ -10,6 +12,7 @@ import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputB
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.ListNBT;
import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.ITickableTileEntity;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityType; import net.minecraft.tileentity.TileEntityType;
@ -24,8 +27,6 @@ import net.minecraftforge.items.ItemStackHandler;
import net.minecraftforge.items.wrapper.CombinedInvWrapper; import net.minecraftforge.items.wrapper.CombinedInvWrapper;
import net.minecraftforge.items.wrapper.RecipeWrapper; import net.minecraftforge.items.wrapper.RecipeWrapper;
import javax.annotation.Nonnull;
public class BasinTileEntity extends SmartTileEntity implements ITickableTileEntity { public class BasinTileEntity extends SmartTileEntity implements ITickableTileEntity {
public boolean contentsChanged; public boolean contentsChanged;
@ -121,7 +122,7 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt
super.read(compound); super.read(compound);
inputItemInventory.deserializeNBT(compound.getCompound("InputItems")); inputItemInventory.deserializeNBT(compound.getCompound("InputItems"));
outputItemInventory.deserializeNBT(compound.getCompound("OutputItems")); outputItemInventory.deserializeNBT(compound.getCompound("OutputItems"));
if (compound.hasUniqueId("fluids")) if (compound.contains("fluids"))
fluidInventory fluidInventory
.ifPresent(combinedFluidHandler -> combinedFluidHandler.readFromNBT(compound.getList("fluids", 10))); .ifPresent(combinedFluidHandler -> combinedFluidHandler.readFromNBT(compound.getList("fluids", 10)));
} }
@ -131,7 +132,10 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt
super.write(compound); super.write(compound);
compound.put("InputItems", inputItemInventory.serializeNBT()); compound.put("InputItems", inputItemInventory.serializeNBT());
compound.put("OutputItems", outputItemInventory.serializeNBT()); compound.put("OutputItems", outputItemInventory.serializeNBT());
fluidInventory.ifPresent(combinedFuidHandler -> compound.put("fluids", combinedFuidHandler.getListNBT())); fluidInventory.ifPresent(combinedFuidHandler -> {
ListNBT nbt = combinedFuidHandler.getListNBT();
compound.put("fluids", nbt);
});
return compound; return compound;
} }

View file

@ -6,23 +6,31 @@ import net.minecraftforge.fluids.FluidStack;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.function.Consumer; import java.util.function.Consumer;
public class MultiIngredientTypeList { public class CombinedItemFluidList {
private final ArrayList<ItemStack> itemIngredients = new ArrayList<>(); private final ArrayList<ItemStack> itemStacks = new ArrayList<>();
private final ArrayList<FluidStack> fluidIngredients = new ArrayList<>(); private final ArrayList<FluidStack> fluidStacks = new ArrayList<>();
public void add(ItemStack itemstack) { public void add(ItemStack itemstack) {
itemIngredients.add(itemstack); itemStacks.add(itemstack);
} }
public void add(FluidStack fluidStack) { public void add(FluidStack fluidStack) {
fluidIngredients.add(fluidStack); fluidStacks.add(fluidStack);
} }
public void forEachItemStack(Consumer<? super ItemStack> itemStackConsumer) { public void forEachItemStack(Consumer<? super ItemStack> itemStackConsumer) {
itemIngredients.forEach(itemStackConsumer); itemStacks.forEach(itemStackConsumer);
} }
public void forEachFluidStack(Consumer<? super FluidStack> fluidStackConsumer) { public void forEachFluidStack(Consumer<? super FluidStack> fluidStackConsumer) {
fluidIngredients.forEach(fluidStackConsumer); fluidStacks.forEach(fluidStackConsumer);
}
public ArrayList<ItemStack> getItemStacks() {
return itemStacks;
}
public ArrayList<FluidStack> getFluidStacks() {
return fluidStacks;
} }
} }

View file

@ -0,0 +1,56 @@
package com.simibubi.create.content.contraptions.processing;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.foundation.block.ITE;
import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ActionResultType;
import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.World;
import javax.annotation.Nullable;
import javax.annotation.ParametersAreNonnullByDefault;
@MethodsReturnNonnullByDefault
@ParametersAreNonnullByDefault
public class HeaterBlock extends Block implements ITE<HeaterTileEntity> {
public HeaterBlock(Properties properties) {
super(properties);
}
@Override
public boolean hasTileEntity(BlockState state) {
return true;
}
@Nullable
@Override
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
return AllTileEntities.HEATER.create();
}
@Override
public Class<HeaterTileEntity> getTileEntityClass() {
return HeaterTileEntity.class;
}
@Override
public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand,
BlockRayTraceResult blockRayTraceResult) {
TileEntity te = world.getTileEntity(pos);
if (te instanceof HeaterTileEntity && ((HeaterTileEntity) te).tryUpdateFuel(player.getHeldItem(hand))) {
if (!player.isCreative())
player.getHeldItem(hand)
.shrink(1);
return ActionResultType.SUCCESS;
}
return ActionResultType.PASS;
}
}

View file

@ -0,0 +1,53 @@
package com.simibubi.create.content.contraptions.processing;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer;
import com.simibubi.create.foundation.utility.SuperByteBuffer;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.Vector3f;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
import net.minecraft.util.Direction;
public class HeaterRenderer extends SafeTileEntityRenderer<HeaterTileEntity> {
private static final Minecraft INSTANCE = Minecraft.getInstance();
public HeaterRenderer(TileEntityRendererDispatcher dispatcher) {
super(dispatcher);
}
@Override
protected void renderSafe(HeaterTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
int light, int overlay) {
AllBlockPartials blazeModel;
switch (te.getHeatLevel()) {
case 2:
blazeModel = AllBlockPartials.BLAZE_HEATER_BLAZE_TWO;
break;
case 3:
blazeModel = AllBlockPartials.BLAZE_HEATER_BLAZE_THREE;
break;
case 4:
blazeModel = AllBlockPartials.BLAZE_HEATER_BLAZE_FOUR;
break;
default:
blazeModel = AllBlockPartials.BLAZE_HEATER_BLAZE_ONE;
}
Vector3f difference = new Vector3f(INSTANCE.player.getPositionVector()
.subtract(te.getPos()
.getX() + 0.5, 0,
te.getPos()
.getZ() + 0.5)
.mul(1, 0, 1));
difference.normalize();
SuperByteBuffer blazeBuffer = blazeModel.renderOn(te.getBlockState());
blazeBuffer.rotateCentered(Direction.UP,
(float) ((difference.getX() < 0 ? 1 : -1) * Math.acos(Direction.NORTH.getUnitVector()
.dot(difference))));
blazeBuffer.renderInto(ms, buffer.getBuffer(RenderType.getSolid()));
}
}

View file

@ -0,0 +1,91 @@
package com.simibubi.create.content.contraptions.processing;
import java.util.List;
import com.simibubi.create.AllItems;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.TileEntityType;
import net.minecraftforge.common.ForgeHooks;
public class HeaterTileEntity extends SmartTileEntity {
int fuelLevel;
private int burnTimeRemaining;
private int bufferedHeatLevel;
public HeaterTileEntity(TileEntityType<? extends HeaterTileEntity> tileEntityTypeIn) {
super(tileEntityTypeIn);
fuelLevel = 0;
burnTimeRemaining = 0;
bufferedHeatLevel = 1;
}
@Override
public void tick() {
super.tick();
if (burnTimeRemaining > 0) {
burnTimeRemaining--;
if (burnTimeRemaining == 0 && fuelLevel > 0) {
fuelLevel--;
sendData();
}
markDirty();
}
}
@Override
public void lazyTick() {
super.lazyTick();
updateHeatLevel();
}
@Override
public void addBehaviours(List<TileEntityBehaviour> behaviours) {}
@Override
public CompoundNBT write(CompoundNBT compound) {
compound.putInt("fuelLevel", fuelLevel);
compound.putInt("burnTimeRemaining", burnTimeRemaining);
return super.write(compound);
}
@Override
public void read(CompoundNBT compound) {
fuelLevel = compound.getInt("fuelLevel");
burnTimeRemaining = compound.getInt("burnTimeRemaining");
super.read(compound);
if (fuelLevel == 0) {
burnTimeRemaining = 0;
markDirty();
}
}
boolean tryUpdateFuel(ItemStack itemStack) {
int burnTime = itemStack.getItem()
.getBurnTime(itemStack);
int newFuelLevel = 1; // todo: int newFuelLevel = itemStack.getItem() == AllItems.SUPER_SPECIAL_FUEL.get() ? 2 : 1;
if (burnTime == -1)
burnTime = ForgeHooks.getBurnTime(itemStack);
if (burnTime < burnTimeRemaining && newFuelLevel <= fuelLevel)
return false;
burnTimeRemaining = burnTime;
fuelLevel = newFuelLevel;
updateHeatLevel();
return true;
}
public int getHeatLevel() {
return bufferedHeatLevel;
}
private void updateHeatLevel() {
bufferedHeatLevel = 1 + fuelLevel;
// todo: check for fan
markDirty();
sendData();
}
}

View file

@ -7,9 +7,9 @@ import net.minecraft.network.PacketBuffer;
public class ProcessingOutput { public class ProcessingOutput {
private static Random r = new Random(); private static final Random r = new Random();
private ItemStack stack; private final ItemStack stack;
private float chance; private final float chance;
public ProcessingOutput(ItemStack stack, float chance) { public ProcessingOutput(ItemStack stack, float chance) {
this.stack = stack; this.stack = stack;

View file

@ -1,12 +1,8 @@
package com.simibubi.create.content.contraptions.processing; package com.simibubi.create.content.contraptions.processing;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.Create; import com.simibubi.create.Create;
import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.inventory.IInventory; import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.IRecipe;
@ -15,18 +11,35 @@ import net.minecraft.item.crafting.IRecipeType;
import net.minecraft.item.crafting.Ingredient; import net.minecraft.item.crafting.Ingredient;
import net.minecraft.util.NonNullList; import net.minecraft.util.NonNullList;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fluids.FluidStack;
import javax.annotation.Nullable;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.List;
import java.util.stream.Collectors;
@MethodsReturnNonnullByDefault
@ParametersAreNonnullByDefault
public abstract class ProcessingRecipe<T extends IInventory> implements IRecipe<T> { public abstract class ProcessingRecipe<T extends IInventory> implements IRecipe<T> {
protected final List<ProcessingIngredient> ingredients; protected final List<ProcessingIngredient> ingredients;
private final List<ProcessingOutput> results;
private final IRecipeType<?> type;
private final IRecipeSerializer<?> serializer;
protected final ResourceLocation id; protected final ResourceLocation id;
protected final String group; protected final String group;
protected final int processingDuration; protected final int processingDuration;
protected final List<FluidStack> fluidIngredients;
protected final List<FluidStack> fluidResults;
protected final int requiredHeat;
private final List<ProcessingOutput> results;
private final IRecipeType<?> type;
private final IRecipeSerializer<?> serializer;
public ProcessingRecipe(AllRecipeTypes recipeType, ResourceLocation id, String group, public ProcessingRecipe(AllRecipeTypes recipeType, ResourceLocation id, String group,
List<ProcessingIngredient> ingredients, List<ProcessingOutput> results, int processingDuration) { List<ProcessingIngredient> ingredients, List<ProcessingOutput> results, int processingDuration) {
this(recipeType, id, group, ingredients, results, processingDuration, null, null, 0);
}
public ProcessingRecipe(AllRecipeTypes recipeType, ResourceLocation id, String group,
List<ProcessingIngredient> ingredients, List<ProcessingOutput> results, int processingDuration,
@Nullable List<FluidStack> fluidIngredients, @Nullable List<FluidStack> fluidResults, int requiredHeat) {
this.type = recipeType.type; this.type = recipeType.type;
this.serializer = recipeType.serializer; this.serializer = recipeType.serializer;
this.id = id; this.id = id;
@ -34,20 +47,23 @@ public abstract class ProcessingRecipe<T extends IInventory> implements IRecipe<
this.ingredients = ingredients; this.ingredients = ingredients;
this.results = results; this.results = results;
this.processingDuration = processingDuration; this.processingDuration = processingDuration;
this.fluidIngredients = fluidIngredients;
this.fluidResults = fluidResults;
this.requiredHeat = requiredHeat;
validate(recipeType); validate(recipeType);
} }
private void validate(AllRecipeTypes recipeType) { private void validate(AllRecipeTypes recipeType) {
if (ingredients.size() > getMaxInputCount()) if (ingredients.size() > getMaxInputCount())
Create.logger.warn("Your custom " + recipeType.name() + " recipe (" + id.toString() + ") has more inputs (" Create.logger.warn("Your custom " + recipeType.name() + " recipe (" + id.toString() + ") has more inputs ("
+ ingredients.size() + ") than supported (" + getMaxInputCount() + ")."); + ingredients.size() + ") than supported (" + getMaxInputCount() + ").");
if (results.size() > getMaxOutputCount()) if (results.size() > getMaxOutputCount())
Create.logger.warn("Your custom " + recipeType.name() + " recipe (" + id.toString() + ") has more outputs (" Create.logger.warn("Your custom " + recipeType.name() + " recipe (" + id.toString() + ") has more outputs ("
+ results.size() + ") than supported (" + getMaxOutputCount() + ")."); + results.size() + ") than supported (" + getMaxOutputCount() + ").");
ingredients.forEach(i -> { ingredients.forEach(i -> {
if (i.isCatalyst() && !canHaveCatalysts()) if (i.isCatalyst() && !canHaveCatalysts())
Create.logger.warn("Your custom " + recipeType.name() + " recipe (" + id.toString() Create.logger.warn("Your custom " + recipeType.name() + " recipe (" + id.toString()
+ ") has a catalyst ingredient, which act like a regular ingredient in this type."); + ") has a catalyst ingredient, which act like a regular ingredient in this type.");
}); });
} }
@ -62,14 +78,14 @@ public abstract class ProcessingRecipe<T extends IInventory> implements IRecipe<
return processingDuration; return processingDuration;
} }
public List<ItemStack> rollResults() { public CombinedItemFluidList rollResults() {
List<ItemStack> stacks = new ArrayList<>(); CombinedItemFluidList results = new CombinedItemFluidList();
for (ProcessingOutput output : getRollableResults()) { for (ProcessingOutput output : getRollableItemResults()) {
ItemStack stack = output.rollOutput(); ItemStack stack = output.rollOutput();
if (!stack.isEmpty()) if (!stack.isEmpty())
stacks.add(stack); results.add(stack);
} }
return stacks; return results;
} }
@Override @Override
@ -84,7 +100,9 @@ public abstract class ProcessingRecipe<T extends IInventory> implements IRecipe<
@Override @Override
public ItemStack getRecipeOutput() { public ItemStack getRecipeOutput() {
return getRollableResults().isEmpty() ? ItemStack.EMPTY : getRollableResults().get(0).getStack(); return getRollableItemResults().isEmpty() ? ItemStack.EMPTY
: getRollableItemResults().get(0)
.getStack();
} }
@Override @Override
@ -119,15 +137,29 @@ public abstract class ProcessingRecipe<T extends IInventory> implements IRecipe<
return false; return false;
} }
public List<ProcessingOutput> getRollableResults() { public List<ProcessingOutput> getRollableItemResults() {
return results; return results;
} }
public List<ProcessingIngredient> getRollableIngredients() { public List<ProcessingIngredient> getRollableIngredients() {
return ingredients; return ingredients;
} }
public List<ItemStack> getPossibleOutputs() { public List<ItemStack> getPossibleOutputs() {
return getRollableResults().stream().map(output -> output.getStack()).collect(Collectors.toList()); return getRollableItemResults().stream()
.map(ProcessingOutput::getStack)
.collect(Collectors.toList());
}
protected boolean canHaveFluidIngredient() {
return false;
}
protected boolean canHaveFluidOutput() {
return false;
}
protected boolean requiresHeating() {
return false;
} }
} }

View file

@ -1,20 +1,27 @@
package com.simibubi.create.content.contraptions.processing; package com.simibubi.create.content.contraptions.processing;
import java.util.ArrayList;
import java.util.List;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.fluid.Fluid;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipeSerializer; import net.minecraft.item.crafting.IRecipeSerializer;
import net.minecraft.network.PacketBuffer; import net.minecraft.network.PacketBuffer;
import net.minecraft.util.JSONUtils; import net.minecraft.util.JSONUtils;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.Registry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.registries.ForgeRegistries;
import javax.annotation.Nullable;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.ArrayList;
import java.util.List;
@MethodsReturnNonnullByDefault
@ParametersAreNonnullByDefault
public class ProcessingRecipeSerializer<T extends ProcessingRecipe<?>> public class ProcessingRecipeSerializer<T extends ProcessingRecipe<?>>
extends net.minecraftforge.registries.ForgeRegistryEntry<IRecipeSerializer<?>> implements IRecipeSerializer<T> { extends net.minecraftforge.registries.ForgeRegistryEntry<IRecipeSerializer<?>> implements IRecipeSerializer<T> {
protected final IRecipeFactory<T> factory; protected final IRecipeFactory<T> factory;
@ -27,32 +34,59 @@ public class ProcessingRecipeSerializer<T extends ProcessingRecipe<?>>
String s = JSONUtils.getString(json, "group", ""); String s = JSONUtils.getString(json, "group", "");
List<ProcessingIngredient> ingredients = new ArrayList<>(); List<ProcessingIngredient> ingredients = new ArrayList<>();
List<FluidStack> fluidIngredients = new ArrayList<>();
for (JsonElement e : JSONUtils.getJsonArray(json, "ingredients")) { for (JsonElement e : JSONUtils.getJsonArray(json, "ingredients")) {
int count = 1; JsonObject entry = e.getAsJsonObject();
if (JSONUtils.hasField((JsonObject) e, "count")) { if (JSONUtils.hasField(entry, "fluid")) {
count = JSONUtils.getInt(e.getAsJsonObject().get("count"), "count"); addFluidToList(fluidIngredients, entry);
} } else {
for(int i = 0; i < count; i++) { int count = 1;
ingredients.add(ProcessingIngredient.parse(e.getAsJsonObject())); if (JSONUtils.hasField(entry, "count")) {
count = JSONUtils.getInt(entry, "count");
}
for (int i = 0; i < count; i++) {
ingredients.add(ProcessingIngredient.parse(entry));
}
} }
} }
List<ProcessingOutput> results = new ArrayList<>(); List<ProcessingOutput> results = new ArrayList<>();
List<FluidStack> fluidResults = new ArrayList<>();
for (JsonElement e : JSONUtils.getJsonArray(json, "results")) { for (JsonElement e : JSONUtils.getJsonArray(json, "results")) {
String s1 = JSONUtils.getString(e.getAsJsonObject().get("item"), "item"); JsonObject entry = e.getAsJsonObject();
int i = JSONUtils.getInt(e.getAsJsonObject().get("count"), "count"); if (JSONUtils.hasField(entry, "fluid")) {
float chance = 1; addFluidToList(fluidResults, entry);
if (JSONUtils.hasField((JsonObject) e, "chance")) } else {
chance = JSONUtils.getFloat(e.getAsJsonObject().get("chance"), "chance"); String s1 = JSONUtils.getString(entry, "item");
ItemStack itemstack = new ItemStack(Registry.ITEM.getOrDefault(new ResourceLocation(s1)), i); int i = JSONUtils.getInt(entry, "count");
results.add(new ProcessingOutput(itemstack, chance)); float chance = 1;
if (JSONUtils.hasField(entry, "chance"))
chance = JSONUtils.getFloat(entry, "chance");
ItemStack itemstack = new ItemStack(Registry.ITEM.getOrDefault(new ResourceLocation(s1)), i);
results.add(new ProcessingOutput(itemstack, chance));
}
} }
int duration = -1; int duration = -1;
if (JSONUtils.hasField(json, "processingTime")) if (JSONUtils.hasField(json, "processingTime"))
duration = JSONUtils.getInt(json, "processingTime"); duration = JSONUtils.getInt(json, "processingTime");
return this.factory.create(recipeId, s, ingredients, results, duration); int requiredHeat = 0;
if (JSONUtils.hasField(json, "requiredHeat"))
requiredHeat = JSONUtils.getInt(json, "requiredHeat");
return this.factory.create(recipeId, s, ingredients, results, duration, fluidIngredients, fluidResults,
requiredHeat);
}
private void addFluidToList(List<FluidStack> fluidStacks, JsonObject entry) {
Fluid fluid = ForgeRegistries.FLUIDS.getValue(ResourceLocation.tryCreate(JSONUtils.getString(entry, "fluid")));
int amount = 1;
if (JSONUtils.hasField(entry, "amount")) {
amount = JSONUtils.getInt(entry, "amount");
}
if (fluid != null && amount > 0)
fluidStacks.add(new FluidStack(fluid, amount));
} }
public T read(ResourceLocation recipeId, PacketBuffer buffer) { public T read(ResourceLocation recipeId, PacketBuffer buffer) {
@ -63,14 +97,26 @@ public class ProcessingRecipeSerializer<T extends ProcessingRecipe<?>>
for (int i = 0; i < ingredientCount; i++) for (int i = 0; i < ingredientCount; i++)
ingredients.add(ProcessingIngredient.parse(buffer)); ingredients.add(ProcessingIngredient.parse(buffer));
int fluidInputCount = buffer.readInt();
List<FluidStack> fluidIngredients = new ArrayList<>();
for (int i = 0; i < fluidInputCount; i++)
fluidIngredients.add(FluidStack.readFromPacket(buffer));
List<ProcessingOutput> results = new ArrayList<>(); List<ProcessingOutput> results = new ArrayList<>();
int outputCount = buffer.readInt(); int outputCount = buffer.readInt();
for (int i = 0; i < outputCount; i++) for (int i = 0; i < outputCount; i++)
results.add(ProcessingOutput.read(buffer)); results.add(ProcessingOutput.read(buffer));
int duration = buffer.readInt(); int fluidOutputCount = buffer.readInt();
List<FluidStack> fluidResults = new ArrayList<>();
for (int i = 0; i < fluidOutputCount; i++)
fluidResults.add(FluidStack.readFromPacket(buffer));
return this.factory.create(recipeId, s, ingredients, results, duration); int duration = buffer.readInt();
int requiredHeat = buffer.readInt();
return this.factory.create(recipeId, s, ingredients, results, duration, fluidIngredients, fluidResults,
requiredHeat);
} }
public void write(PacketBuffer buffer, T recipe) { public void write(PacketBuffer buffer, T recipe) {
@ -78,16 +124,49 @@ public class ProcessingRecipeSerializer<T extends ProcessingRecipe<?>>
buffer.writeInt(recipe.ingredients.size()); buffer.writeInt(recipe.ingredients.size());
recipe.ingredients.forEach(i -> i.write(buffer)); recipe.ingredients.forEach(i -> i.write(buffer));
if (recipe.canHaveFluidIngredient() && recipe.fluidIngredients != null) {
buffer.writeInt(recipe.fluidIngredients.size());
recipe.fluidIngredients.forEach(fluidStack -> fluidStack.writeToPacket(buffer));
} else {
buffer.writeInt(0);
}
buffer.writeInt(recipe.getRollableResults().size()); buffer.writeInt(recipe.getRollableItemResults()
recipe.getRollableResults().forEach(i -> i.write(buffer)); .size());
recipe.getRollableItemResults()
.forEach(i -> i.write(buffer));
if (recipe.canHaveFluidOutput() && recipe.fluidResults != null) {
buffer.writeInt(recipe.fluidResults.size());
recipe.fluidResults.forEach(fluidStack -> fluidStack.writeToPacket(buffer));
} else {
buffer.writeInt(0);
}
buffer.writeInt(recipe.processingDuration); buffer.writeInt(recipe.processingDuration);
buffer.writeInt(recipe.requiredHeat);
} }
public interface IRecipeFactory<T extends ProcessingRecipe<?>> { public interface IRecipeFactory<T extends ProcessingRecipe<?>> {
T create(ResourceLocation id, String group, List<ProcessingIngredient> ingredients, List<ProcessingOutput> results, default T create(ResourceLocation recipeId, String s, List<ProcessingIngredient> ingredients,
int duration); List<ProcessingOutput> results, int duration, @Nullable List<FluidStack> fluidIngredients,
@Nullable List<FluidStack> fluidResults, int requiredHeat) {
return create(recipeId, s, ingredients, results, duration);
}
T create(ResourceLocation recipeId, String s, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int duration);
} }
public interface IExtendedRecipeFactory<T extends ProcessingRecipe<?>> extends IRecipeFactory<T> {
@Override
T create(ResourceLocation recipeId, String s, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int duration, @Nullable List<FluidStack> fluidIngredients,
@Nullable List<FluidStack> fluidResults, int requiredHeat);
@Override
default T create(ResourceLocation recipeId, String s, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int duration) {
throw new IllegalStateException("Incorrect recipe creation function used: " + recipeId);
}
}
} }

View file

@ -2,6 +2,7 @@ package com.simibubi.create.content.curiosities.tools;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.Enchantment;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.item.ItemEntity;
@ -24,6 +25,10 @@ import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.common.util.FakePlayer;
import javax.annotation.ParametersAreNonnullByDefault;
@MethodsReturnNonnullByDefault
@ParametersAreNonnullByDefault
public class SandPaperItem extends Item { public class SandPaperItem extends Item {
public SandPaperItem(Properties properties) { public SandPaperItem(Properties properties) {
@ -68,8 +73,6 @@ public class SandPaperItem extends Item {
return FAIL; return FAIL;
BlockRayTraceResult ray = (BlockRayTraceResult) raytraceresult; BlockRayTraceResult ray = (BlockRayTraceResult) raytraceresult;
Vec3d hitVec = ray.getHitVec(); Vec3d hitVec = ray.getHitVec();
if (hitVec == null)
return FAIL;
AxisAlignedBB bb = new AxisAlignedBB(hitVec, hitVec).grow(1f); AxisAlignedBB bb = new AxisAlignedBB(hitVec, hitVec).grow(1f);
ItemEntity pickUp = null; ItemEntity pickUp = null;

View file

@ -1,28 +1,26 @@
package com.simibubi.create.content.curiosities.tools; package com.simibubi.create.content.curiosities.tools;
import java.util.List;
import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.content.contraptions.processing.ProcessingIngredient; import com.simibubi.create.content.contraptions.processing.ProcessingIngredient;
import com.simibubi.create.content.contraptions.processing.ProcessingOutput; import com.simibubi.create.content.contraptions.processing.ProcessingOutput;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe;
import com.simibubi.create.content.curiosities.tools.SandPaperPolishingRecipe.SandPaperInv; import com.simibubi.create.content.curiosities.tools.SandPaperPolishingRecipe.SandPaperInv;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.IRecipe;
import net.minecraft.util.DamageSource;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.ItemStackHandler;
import net.minecraftforge.items.wrapper.RecipeWrapper; import net.minecraftforge.items.wrapper.RecipeWrapper;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.List;
@ParametersAreNonnullByDefault
public class SandPaperPolishingRecipe extends ProcessingRecipe<SandPaperInv> { public class SandPaperPolishingRecipe extends ProcessingRecipe<SandPaperInv> {
public static DamageSource CURSED_POLISHING = new DamageSource("create.curse_polish").setExplosion();
public SandPaperPolishingRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients, public SandPaperPolishingRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int processingDuration) { List<ProcessingOutput> results, int processingDuration) {
super(AllRecipeTypes.SANDPAPER_POLISHING, id, group, ingredients, results, processingDuration); super(AllRecipeTypes.SANDPAPER_POLISHING, id, group, ingredients, results, processingDuration);
} }
@ -33,18 +31,21 @@ public class SandPaperPolishingRecipe extends ProcessingRecipe<SandPaperInv> {
public static ItemStack applyPolish(World world, Vec3d position, ItemStack stack, ItemStack sandPaperStack) { public static ItemStack applyPolish(World world, Vec3d position, ItemStack stack, ItemStack sandPaperStack) {
List<IRecipe<SandPaperInv>> matchingRecipes = getMatchingRecipes(world, stack); List<IRecipe<SandPaperInv>> matchingRecipes = getMatchingRecipes(world, stack);
if (!matchingRecipes.isEmpty()) if (!matchingRecipes.isEmpty())
return matchingRecipes.get(0).getCraftingResult(new SandPaperInv(stack)).copy(); return matchingRecipes.get(0)
.getCraftingResult(new SandPaperInv(stack))
.copy();
return stack; return stack;
} }
public static List<IRecipe<SandPaperInv>> getMatchingRecipes(World world, ItemStack stack) {
return world.getRecipeManager()
.getRecipes(AllRecipeTypes.SANDPAPER_POLISHING.getType(), new SandPaperInv(stack), world);
}
@Override @Override
public boolean matches(SandPaperInv inv, World worldIn) { public boolean matches(SandPaperInv inv, World worldIn) {
return ingredients.get(0).test(inv.getStackInSlot(0)); return ingredients.get(0)
} .test(inv.getStackInSlot(0));
public static List<IRecipe<SandPaperInv>> getMatchingRecipes(World world, ItemStack stack) {
return world.getRecipeManager().getRecipes(AllRecipeTypes.SANDPAPER_POLISHING.getType(), new SandPaperInv(stack),
world);
} }
@Override @Override

View file

@ -263,7 +263,7 @@ public class InWorldProcessing {
if (recipe instanceof ProcessingRecipe) { if (recipe instanceof ProcessingRecipe) {
stacks = new ArrayList<>(); stacks = new ArrayList<>();
for (int i = 0; i < stackIn.getCount(); i++) { for (int i = 0; i < stackIn.getCount(); i++) {
List<ItemStack> rollResults = ((ProcessingRecipe<?>) recipe).rollResults(); List<ItemStack> rollResults = ((ProcessingRecipe<?>) recipe).rollResults().getItemStacks();
for (ItemStack stack : rollResults) { for (ItemStack stack : rollResults) {
for (ItemStack previouslyRolled : stacks) { for (ItemStack previouslyRolled : stacks) {
if (stack.isEmpty()) if (stack.isEmpty())

View file

@ -21,6 +21,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.mou
import com.simibubi.create.content.contraptions.components.tracks.ReinforcedRailBlock; import com.simibubi.create.content.contraptions.components.tracks.ReinforcedRailBlock;
import com.simibubi.create.content.contraptions.fluids.FluidPipeBlock; import com.simibubi.create.content.contraptions.fluids.FluidPipeBlock;
import com.simibubi.create.content.contraptions.fluids.FluidTankBlock; import com.simibubi.create.content.contraptions.fluids.FluidTankBlock;
import com.simibubi.create.content.contraptions.processing.HeaterBlock;
import com.simibubi.create.content.logistics.block.belts.observer.BeltObserverBlock; import com.simibubi.create.content.logistics.block.belts.observer.BeltObserverBlock;
import com.simibubi.create.content.palettes.PavedBlock; import com.simibubi.create.content.palettes.PavedBlock;
import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Iterate;
@ -212,6 +213,10 @@ public class BlockStateGen {
.build(); .build();
}); });
} }
public static NonNullBiConsumer<DataGenContext<Block, HeaterBlock>, RegistrateBlockstateProvider> blazeHeater(){
return (c, p) -> ConfiguredModel.builder().modelFile(p.models().getExistingFile(p.modLoc("block/" + c.getName() + "/block"))).build();
}
public static NonNullBiConsumer<DataGenContext<Block, ReinforcedRailBlock>, RegistrateBlockstateProvider> reinforcedRail() { public static NonNullBiConsumer<DataGenContext<Block, ReinforcedRailBlock>, RegistrateBlockstateProvider> reinforcedRail() {
return (c, p) -> p.getVariantBuilder(c.get()) return (c, p) -> p.getVariantBuilder(c.get())

View file

@ -1,13 +1,15 @@
package com.simibubi.create.foundation.data; package com.simibubi.create.foundation.data;
import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.material.MaterialColor; import net.minecraft.block.material.MaterialColor;
import net.minecraft.block.material.PushReaction; import net.minecraft.block.material.PushReaction;
@MethodsReturnNonnullByDefault
public class SharedProperties { public class SharedProperties {
public static Material beltMaterial = public static Material beltMaterial =
new Material(MaterialColor.GRAY, false, true, true, true, true, false, false, PushReaction.NORMAL); new Material(MaterialColor.GRAY, false, true, true, true, true, false, false, PushReaction.NORMAL);
@ -22,5 +24,4 @@ public class SharedProperties {
public static Block wooden() { public static Block wooden() {
return Blocks.STRIPPED_SPRUCE_WOOD; return Blocks.STRIPPED_SPRUCE_WOOD;
} }
} }

View file

@ -0,0 +1,29 @@
{
"credit": "Made with Blockbench",
"textures": {
"1": "create:block/tamed_blaze"
},
"elements": [
{
"name": "Blaze 4",
"from": [4, 6, 4],
"to": [12, 14, 12],
"rotation": {"angle": 0, "axis": "y", "origin": [6, 6, 6]},
"faces": {
"north": {"uv": [12, 0, 16, 4], "texture": "#1"},
"east": {"uv": [8, 0, 12, 4], "texture": "#1"},
"south": {"uv": [8, 0, 12, 4], "texture": "#1"},
"west": {"uv": [8, 0, 12, 4], "texture": "#1"},
"up": {"uv": [8, 4, 12, 8], "texture": "#1"},
"down": {"uv": [12, 4, 16, 8], "texture": "#1"}
}
}
],
"groups": [
{
"name": "Blazes",
"origin": [8, 8, 8],
"children": [15, 16, 17, 18]
}
]
}

View file

@ -0,0 +1,28 @@
{
"credit": "Made with Blockbench",
"textures": {
"1": "create:block/tamed_blaze"
},
"elements": [
{
"name": "Blaze 1",
"from": [6, 6, 6],
"to": [10, 10, 10],
"faces": {
"north": {"uv": [8, 8, 10, 10], "texture": "#1"},
"east": {"uv": [6, 8, 8, 10], "texture": "#1"},
"south": {"uv": [6, 8, 8, 10], "texture": "#1"},
"west": {"uv": [6, 8, 8, 10], "texture": "#1"},
"up": {"uv": [6, 10, 8, 12], "texture": "#1"},
"down": {"uv": [8, 10, 10, 12], "texture": "#1"}
}
}
],
"groups": [
{
"name": "Blazes",
"origin": [8, 8, 8],
"children": [15, 16, 17, 18]
}
]
}

View file

@ -0,0 +1,29 @@
{
"credit": "Made with Blockbench",
"textures": {
"1": "create:block/tamed_blaze"
},
"elements": [
{
"name": "Blaze 3",
"from": [4, 6, 4],
"to": [12, 14, 12],
"rotation": {"angle": 0, "axis": "y", "origin": [6, 6, 6]},
"faces": {
"north": {"uv": [4, 0, 8, 4], "texture": "#1"},
"east": {"uv": [0, 0, 4, 4], "texture": "#1"},
"south": {"uv": [0, 0, 4, 4], "texture": "#1"},
"west": {"uv": [0, 0, 4, 4], "texture": "#1"},
"up": {"uv": [0, 4, 4, 8], "texture": "#1"},
"down": {"uv": [4, 4, 8, 8], "texture": "#1"}
}
}
],
"groups": [
{
"name": "Blazes",
"origin": [8, 8, 8],
"children": [15, 16, 17, 18]
}
]
}

View file

@ -0,0 +1,29 @@
{
"credit": "Made with Blockbench",
"textures": {
"1": "create:block/tamed_blaze"
},
"elements": [
{
"name": "Blaze 2",
"from": [5, 6, 5],
"to": [11, 12, 11],
"rotation": {"angle": 0, "axis": "y", "origin": [7, 7, 7]},
"faces": {
"north": {"uv": [3, 8, 6, 11], "texture": "#1"},
"east": {"uv": [0, 8, 3, 11], "texture": "#1"},
"south": {"uv": [0, 8, 3, 11], "texture": "#1"},
"west": {"uv": [0, 8, 3, 11], "texture": "#1"},
"up": {"uv": [0, 11, 3, 14], "texture": "#1"},
"down": {"uv": [3, 11, 6, 14], "texture": "#1"}
}
}
],
"groups": [
{
"name": "Blazes",
"origin": [8, 8, 8],
"children": [15, 16, 17, 18]
}
]
}

View file

@ -0,0 +1,236 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/blaze_heater_brazier",
"particle": "create:block/blaze_heater_brazier"
},
"elements": [
{
"name": "Brazier Sides 1",
"from": [2, 5, 2],
"to": [14, 14, 14],
"faces": {
"north": {"uv": [1.5, 2, 6.5, 5.5], "texture": "#0"},
"east": {"uv": [1.5, 2, 6.5, 5.5], "texture": "#0"},
"south": {"uv": [1.5, 2, 6.5, 5.5], "texture": "#0"},
"west": {"uv": [1.5, 2, 6.5, 5.5], "texture": "#0"},
"up": {"uv": [8, 8, 16, 16], "texture": "#0"},
"down": {"uv": [0, 0, 12, 12], "texture": "#0"}
}
},
{
"name": "Brazier Sides 2",
"from": [1, 5, 2],
"to": [2, 14, 14],
"faces": {
"north": {"uv": [8, 8, 16, 16], "texture": "#0"},
"east": {"uv": [1.5, 2, 6.5, 5.5], "texture": "#0"},
"south": {"uv": [8, 8, 16, 16], "texture": "#0"},
"west": {"uv": [8, 8, 16, 16], "texture": "#0"},
"up": {"uv": [8, 8, 16, 16], "texture": "#0"},
"down": {"uv": [0, 0, 12, 12], "texture": "#0"}
}
},
{
"name": "Brazier Sides 3",
"from": [2, 5, 14],
"to": [14, 14, 15],
"faces": {
"north": {"uv": [1.5, 2, 6.5, 5.5], "texture": "#0"},
"east": {"uv": [8, 8, 16, 16], "texture": "#0"},
"south": {"uv": [8, 8, 16, 16], "texture": "#0"},
"west": {"uv": [8, 8, 16, 16], "texture": "#0"},
"up": {"uv": [8, 8, 16, 16], "rotation": 270, "texture": "#0"},
"down": {"uv": [0, 0, 12, 12], "rotation": 90, "texture": "#0"}
}
},
{
"name": "Brazier Sides 4",
"from": [14, 5, 2],
"to": [15, 14, 14],
"faces": {
"north": {"uv": [8, 8, 16, 16], "texture": "#0"},
"east": {"uv": [8, 8, 16, 16], "texture": "#0"},
"south": {"uv": [8, 8, 16, 16], "texture": "#0"},
"west": {"uv": [1.5, 2, 6.5, 5.5], "texture": "#0"},
"up": {"uv": [8, 8, 16, 16], "rotation": 180, "texture": "#0"},
"down": {"uv": [0, 0, 12, 12], "rotation": 180, "texture": "#0"}
}
},
{
"name": "Brazier Sides 5",
"from": [2, 5, 1],
"to": [14, 14, 2],
"faces": {
"north": {"uv": [8, 8, 16, 16], "texture": "#0"},
"east": {"uv": [8, 8, 16, 16], "texture": "#0"},
"south": {"uv": [1.5, 2, 6.5, 5.5], "texture": "#0"},
"west": {"uv": [8, 8, 16, 16], "texture": "#0"},
"up": {"uv": [8, 8, 16, 16], "rotation": 90, "texture": "#0"},
"down": {"uv": [0, 0, 12, 12], "rotation": 270, "texture": "#0"}
}
},
{
"name": "Brazier Spikes 1",
"from": [2, 14, 2],
"to": [14, 17, 3],
"rotation": {"angle": -45, "axis": "x", "origin": [8, 14, 2]},
"faces": {
"north": {"uv": [1.5, 0.5, 6.5, 2], "texture": "#0"},
"east": {"uv": [8, 8, 16, 16], "texture": "#0"},
"south": {"uv": [8, 8, 16, 16], "texture": "#0"},
"west": {"uv": [0, 0, 1, 3], "texture": "#0"},
"up": {"uv": [8, 8, 16, 16], "texture": "#0"},
"down": {"uv": [8, 8, 16, 16], "texture": "#0"}
}
},
{
"name": "Brazier Spikes 1b",
"from": [2, 14, 1],
"to": [14, 17, 2],
"rotation": {"angle": -45, "axis": "x", "origin": [8, 14, 2]},
"faces": {
"north": {"uv": [8, 8, 16, 16], "texture": "#0"},
"east": {"uv": [0, 0, 1, 3], "texture": "#0"},
"south": {"uv": [1.5, 0.5, 6.5, 2], "texture": "#0"},
"west": {"uv": [8, 8, 16, 16], "texture": "#0"},
"up": {"uv": [8, 8, 16, 16], "rotation": 180, "texture": "#0"},
"down": {"uv": [8, 8, 16, 16], "rotation": 180, "texture": "#0"}
}
},
{
"name": "Brazier Spikes 2",
"from": [2, 14, 2],
"to": [3, 17, 14],
"rotation": {"angle": 45, "axis": "z", "origin": [2, 14, 8]},
"faces": {
"north": {"uv": [8, 8, 16, 16], "texture": "#0"},
"east": {"uv": [8, 8, 16, 16], "texture": "#0"},
"south": {"uv": [0, 0, 1, 3], "texture": "#0"},
"west": {"uv": [1.5, 0.5, 6.5, 2], "texture": "#0"},
"up": {"uv": [8, 8, 16, 16], "rotation": 270, "texture": "#0"},
"down": {"uv": [8, 8, 16, 16], "rotation": 90, "texture": "#0"}
}
},
{
"name": "Brazier Spikes 2b",
"from": [1, 14, 2],
"to": [2, 17, 14],
"rotation": {"angle": 45, "axis": "z", "origin": [2, 14, 8]},
"faces": {
"north": {"uv": [0, 0, 1, 3], "texture": "#0"},
"east": {"uv": [1.5, 0.5, 6.5, 2], "texture": "#0"},
"south": {"uv": [8, 8, 16, 16], "texture": "#0"},
"west": {"uv": [8, 8, 16, 16], "texture": "#0"},
"up": {"uv": [8, 8, 16, 16], "rotation": 90, "texture": "#0"},
"down": {"uv": [8, 8, 16, 16], "rotation": 270, "texture": "#0"}
}
},
{
"name": "Brazier Spikes 3",
"from": [2, 14, 13],
"to": [14, 17, 14],
"rotation": {"angle": 45, "axis": "x", "origin": [8, 14, 14]},
"faces": {
"north": {"uv": [8, 8, 16, 16], "texture": "#0"},
"east": {"uv": [0, 0, 1, 3], "texture": "#0"},
"south": {"uv": [1.5, 0.5, 6.5, 2], "texture": "#0"},
"west": {"uv": [8, 8, 16, 16], "texture": "#0"},
"up": {"uv": [8, 8, 16, 16], "rotation": 180, "texture": "#0"},
"down": {"uv": [8, 8, 16, 16], "rotation": 180, "texture": "#0"}
}
},
{
"name": "Brazier Spikes 3b",
"from": [2, 14, 14],
"to": [14, 17, 15],
"rotation": {"angle": 45, "axis": "x", "origin": [8, 14, 14]},
"faces": {
"north": {"uv": [1.5, 0.5, 6.5, 2], "texture": "#0"},
"east": {"uv": [8, 8, 16, 16], "texture": "#0"},
"south": {"uv": [8, 8, 16, 16], "texture": "#0"},
"west": {"uv": [0, 0, 1, 3], "texture": "#0"},
"up": {"uv": [8, 8, 16, 16], "texture": "#0"},
"down": {"uv": [8, 8, 16, 16], "texture": "#0"}
}
},
{
"name": "Brazier Spikes 4",
"from": [14, 14, 2],
"to": [17, 15, 14],
"rotation": {"angle": 45, "axis": "z", "origin": [14, 14, 8]},
"faces": {
"north": {"uv": [0, 0, 1, 3], "rotation": 270, "texture": "#0"},
"east": {"uv": [8, 8, 16, 16], "rotation": 180, "texture": "#0"},
"south": {"uv": [8, 8, 16, 16], "rotation": 90, "texture": "#0"},
"west": {"uv": [8, 8, 16, 16], "texture": "#0"},
"up": {"uv": [8, 8, 16, 16], "rotation": 90, "texture": "#0"},
"down": {"uv": [1.5, 0.5, 6.5, 2], "rotation": 90, "texture": "#0"}
}
},
{
"name": "Brazier Spikes 4b",
"from": [14, 13, 2],
"to": [17, 14, 14],
"rotation": {"angle": 45, "axis": "z", "origin": [14, 14, 8]},
"faces": {
"north": {"uv": [8, 8, 16, 16], "rotation": 270, "texture": "#0"},
"east": {"uv": [8, 8, 16, 16], "texture": "#0"},
"south": {"uv": [0, 0, 1, 3], "rotation": 90, "texture": "#0"},
"west": {"uv": [8, 8, 16, 16], "rotation": 180, "texture": "#0"},
"up": {"uv": [1.5, 0.5, 6.5, 2], "rotation": 90, "texture": "#0"},
"down": {"uv": [8, 8, 16, 16], "rotation": 90, "texture": "#0"}
}
},
{
"name": "Base",
"from": [0, 0, 0],
"to": [16, 4, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [0.5, 8, 0.5]},
"faces": {
"north": {"uv": [0, 6, 8, 8], "texture": "#0"},
"east": {"uv": [0, 6, 8, 8], "texture": "#0"},
"south": {"uv": [0, 6, 8, 8], "texture": "#0"},
"west": {"uv": [0, 6, 8, 8], "texture": "#0"},
"up": {"uv": [0, 8, 8, 16], "texture": "#0"},
"down": {"uv": [0, 8, 8, 16], "texture": "#0"}
}
},
{
"name": "Brazier bottom",
"from": [2, 4, 2],
"to": [14, 5, 14],
"rotation": {"angle": 0, "axis": "y", "origin": [2.5, 8, 2.5]},
"faces": {
"north": {"uv": [1.5, 5.5, 6.5, 6], "texture": "#0"},
"east": {"uv": [1.5, 5.5, 6.5, 6], "texture": "#0"},
"south": {"uv": [1.5, 5.5, 6.5, 6], "texture": "#0"},
"west": {"uv": [1.5, 5.5, 6.5, 6], "texture": "#0"},
"up": {"uv": [9, 1, 15, 7], "texture": "#0"},
"down": {"uv": [8, 8, 16, 16], "texture": "#0"}
}
}
],
"groups": [
{
"name": "Brazier",
"origin": [0.5, 0.5, 0.5],
"children": [
{
"name": "Brazier Sides",
"origin": [0.5, 0.5, 0.5],
"children": [0, 1, 2, 3, 4]
},
{
"name": "Brazier Spikes",
"origin": [0.5, 0.5, 0.5],
"children": [5, 6, 7, 8, 9, 10, 11, 12]
}, 13, 14]
},
{
"name": "Blazes",
"origin": [8, 8, 8],
"children": [15, 16, 17, 18]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View file

@ -16,5 +16,6 @@
"item": "create:brass_ingot", "item": "create:brass_ingot",
"count": 2 "count": 2
} }
] ],
"requiredHeat": 1
} }