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
cf9045eb16e5299a1d917c4cb536289f49411276 assets\create\blockstates\birch_window.json
94a1a91403eb4b035fec48071e7fcae57a8a6abd assets\create\blockstates\birch_window_pane.json
0626725f70103a55dabcda6f87ca943279d45793 assets\create\blockstates\blaze_heater.json
fba967b1f6e44b34a9d9662e2fedfc13aad7f36c assets\create\blockstates\brass_belt_funnel.json
8b1dd00adcc7e74c5a9feed069e2610b15a338cb assets\create\blockstates\brass_block.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
b2a7c321b1795f20e7433f81a55ce4683de081b8 assets\create\blockstates\fancy_weathered_limestone_bricks_stairs.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
e9da1794b6ece7f9aa8bcb43d42c23a55446133b assets\create\blockstates\flywheel.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
3a739f9d4276828d83f2d2750bf3227c87bcd438 assets\create\blockstates\pulley_magnet.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
c29213b77ac0c78d8979c5f6188d2b265696f9b9 assets\create\blockstates\redstone_link.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
7f39521b211441f5c3e06d60c5978cebe16cacfb assets\create\blockstates\zinc_block.json
b7181bcd8182b2f17088e5aa881f374c9c65470c assets\create\blockstates\zinc_ore.json
541831ab0cf2f0222f0b7e42ec6c4b0ae636168d assets\create\lang\en_ud.json
fd57d2d8144286e26033a087a501f45f2df9ea34 assets\create\lang\en_us.json
87c28254c2acb462fe6a994f688a19e31a4c7a9d assets\create\lang\unfinished\de_de.json
6cd93a72126063c634f49db190d4da545e5a6c43 assets\create\lang\unfinished\fr_fr.json
401d0b295988cfa31af1a94f8c50d86eb54cad0d assets\create\lang\unfinished\it_it.json
30f1189e1963d0a87a9505bfdac9b663ff9d09d1 assets\create\lang\unfinished\ja_jp.json
a56d5b51d410821b7993bdbfd1b141e51be11b54 assets\create\lang\unfinished\ko_kr.json
e8a39cb4afc7668f2690bcacda1f06afd9c82579 assets\create\lang\unfinished\nl_nl.json
3876e40fbc9c6e8561cc761949a6fb9565a03fce assets\create\lang\unfinished\pt_br.json
cc2c01ee69a5a394c9d6dc87f77e08f05adf38a7 assets\create\lang\unfinished\ru_ru.json
7a8b2739021d2e1d2b563f2bed3a201bd3f1b00f assets\create\lang\unfinished\zh_cn.json
00edba8c69557058bf9fbbc4d389dc455f24b0fc assets\create\lang\en_ud.json
7ed74343ba37814af0d96cd2ae5bf1249acd9baa assets\create\lang\en_us.json
4c87a086693857597af78c76761ec89ba9c602ba assets\create\lang\unfinished\de_de.json
c0fb10fa3849b9bd5b1265f6abdbf223e1de1a60 assets\create\lang\unfinished\fr_fr.json
b15d162779596a7a4d650885bdf7e2894e7b3846 assets\create\lang\unfinished\it_it.json
32053016c6a0642f9b42ab109fb3cbc512346970 assets\create\lang\unfinished\ja_jp.json
827ecb467d0ede69b8d025b15321d024f186b598 assets\create\lang\unfinished\ko_kr.json
6c730797cb1d02a2b6ec0318ec11750dc05775a0 assets\create\lang\unfinished\nl_nl.json
3a7b8d02ecb08237e887be76d7ee8173068ef63d assets\create\lang\unfinished\pt_br.json
61a40852ad3024962ee8878ca105ca59aa85922b assets\create\lang\unfinished\ru_ru.json
635c3cc20c533ecd1951092344fde2bc19c0a71e assets\create\lang\unfinished\zh_cn.json
846200eb548d3bfa2e77b41039de159b4b6cfb45 assets\create\models\block\acacia_window.json
1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets\create\models\block\acacia_window_pane_noside.json
1763ea2c9b981d187f5031ba608f3d5d3be3986a assets\create\models\block\acacia_window_pane_noside_alt.json
@ -997,6 +998,7 @@ bf1fc6bdf7fca6f1958a2d3e96202c1cecb50669 assets\create\models\item\basin.json
695a69d5854e2eb134b55d855bd2b7b18808a01d assets\create\models\item\belt_observer.json
9044243882cfd49a2827e1b910a4c9b0e46daa47 assets\create\models\item\birch_window.json
6ed49f59ea91068ef68720f43e67a9237594bdf0 assets\create\models\item\birch_window_pane.json
fa2761dc44857eb840a94df869de66a91988f0da assets\create\models\item\blaze_heater.json
17d340c3678bd24cb085ba49490b2b4cb341a9e7 assets\create\models\item\brass_block.json
f5a18f4279c2e845a5967b1c2f9e807c2bb77afb assets\create\models\item\brass_casing.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
67a8e2513c3cb09e6fe80279fda94f79d5018c37 data\create\loot_tables\blocks\birch_window.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
70d9d4def43d5b31fa7cdc5ca5002c71cf4a90b0 data\create\loot_tables\blocks\brass_block.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
266f08e604d229a9d2b46f7272c0b06ec270bf3d data\create\recipes\zinc_block.json
403576ae5710d4fe731144fe623b1673093076ea data\create\tags\blocks\brittle.json
06d3931993d4f61713390416f1e6fe1a0b5aaf43 data\create\tags\blocks\fan_heaters.json
081f5aa35602fc27af2ca01ea9f2fd5e7eb284dc data\create\tags\items\create_ingots.json
d2dc4ff179ef7b2aa9276455c196e15d44aa95a8 data\create\tags\items\crushed_ores.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": {
"north": "false",
"south": "true",
"west": "true",
"east": "false"
"east": "false",
"north": "false",
"south": "true"
},
"apply": {
"model": "create:block/fluid_pipe/lu_y"
@ -192,10 +192,10 @@
},
{
"when": {
"north": "false",
"south": "true",
"west": "false",
"east": "true"
"east": "true",
"north": "false",
"south": "true"
},
"apply": {
"model": "create:block/fluid_pipe/ru_y"
@ -203,10 +203,10 @@
},
{
"when": {
"north": "true",
"south": "false",
"west": "true",
"east": "false"
"east": "false",
"north": "true",
"south": "false"
},
"apply": {
"model": "create:block/fluid_pipe/ld_y"
@ -214,10 +214,10 @@
},
{
"when": {
"north": "true",
"south": "false",
"west": "false",
"east": "true"
"east": "true",
"north": "true",
"south": "false"
},
"apply": {
"model": "create:block/fluid_pipe/rd_y"
@ -225,10 +225,10 @@
},
{
"when": {
"west": "false",
"east": "false",
"north": "true",
"south": "true",
"west": "false",
"east": "false"
"south": "true"
},
"apply": {
"model": "create:block/fluid_pipe/ud_y"
@ -236,10 +236,10 @@
},
{
"when": {
"west": "false",
"east": "false",
"north": "false",
"south": "true",
"west": "false",
"east": "false"
"south": "true"
},
"apply": {
"model": "create:block/fluid_pipe/ud_y"
@ -247,10 +247,10 @@
},
{
"when": {
"west": "false",
"east": "false",
"north": "true",
"south": "false",
"west": "false",
"east": "false"
"south": "false"
},
"apply": {
"model": "create:block/fluid_pipe/ud_y"
@ -258,10 +258,10 @@
},
{
"when": {
"north": "false",
"south": "false",
"west": "true",
"east": "true"
"east": "true",
"north": "false",
"south": "false"
},
"apply": {
"model": "create:block/fluid_pipe/lr_y"
@ -269,10 +269,10 @@
},
{
"when": {
"north": "false",
"south": "false",
"west": "true",
"east": "false"
"east": "false",
"north": "false",
"south": "false"
},
"apply": {
"model": "create:block/fluid_pipe/lr_y"
@ -280,10 +280,10 @@
},
{
"when": {
"north": "false",
"south": "false",
"west": "false",
"east": "true"
"east": "true",
"north": "false",
"south": "false"
},
"apply": {
"model": "create:block/fluid_pipe/lr_y"
@ -291,10 +291,10 @@
},
{
"when": {
"north": "false",
"south": "false",
"west": "false",
"east": "false"
"east": "false",
"north": "false",
"south": "false"
},
"apply": {
"model": "create:block/fluid_pipe/none_y"
@ -302,10 +302,10 @@
},
{
"when": {
"up": "true",
"west": "false",
"down": "false",
"east": "true"
"east": "true",
"up": "true",
"down": "false"
},
"apply": {
"model": "create:block/fluid_pipe/lu_z"
@ -313,10 +313,10 @@
},
{
"when": {
"up": "true",
"west": "true",
"down": "false",
"east": "false"
"east": "false",
"up": "true",
"down": "false"
},
"apply": {
"model": "create:block/fluid_pipe/ru_z"
@ -324,10 +324,10 @@
},
{
"when": {
"up": "false",
"west": "false",
"down": "true",
"east": "true"
"east": "true",
"up": "false",
"down": "true"
},
"apply": {
"model": "create:block/fluid_pipe/ld_z"
@ -335,10 +335,10 @@
},
{
"when": {
"up": "false",
"west": "true",
"down": "true",
"east": "false"
"east": "false",
"up": "false",
"down": "true"
},
"apply": {
"model": "create:block/fluid_pipe/rd_z"
@ -346,10 +346,10 @@
},
{
"when": {
"west": "false",
"east": "false",
"up": "true",
"west": "false",
"down": "true",
"east": "false"
"down": "true"
},
"apply": {
"model": "create:block/fluid_pipe/ud_z"
@ -357,10 +357,10 @@
},
{
"when": {
"west": "false",
"east": "false",
"up": "true",
"west": "false",
"down": "false",
"east": "false"
"down": "false"
},
"apply": {
"model": "create:block/fluid_pipe/ud_z"
@ -368,10 +368,10 @@
},
{
"when": {
"up": "false",
"west": "false",
"down": "true",
"east": "false"
"east": "false",
"up": "false",
"down": "true"
},
"apply": {
"model": "create:block/fluid_pipe/ud_z"
@ -379,10 +379,10 @@
},
{
"when": {
"up": "false",
"west": "true",
"down": "false",
"east": "true"
"east": "true",
"up": "false",
"down": "false"
},
"apply": {
"model": "create:block/fluid_pipe/lr_z"
@ -390,10 +390,10 @@
},
{
"when": {
"up": "false",
"west": "false",
"down": "false",
"east": "true"
"east": "true",
"up": "false",
"down": "false"
},
"apply": {
"model": "create:block/fluid_pipe/lr_z"
@ -401,10 +401,10 @@
},
{
"when": {
"up": "false",
"west": "true",
"down": "false",
"east": "false"
"east": "false",
"up": "false",
"down": "false"
},
"apply": {
"model": "create:block/fluid_pipe/lr_z"
@ -412,10 +412,10 @@
},
{
"when": {
"up": "false",
"west": "false",
"down": "false",
"east": "false"
"east": "false",
"up": "false",
"down": "false"
},
"apply": {
"model": "create:block/fluid_pipe/none_z"

View file

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

View file

@ -25,6 +25,7 @@
"block.create.belt_observer": "\u0279\u01DD\u028C\u0279\u01DDsqO \u0287\u05DF\u01DD\u15FA",
"block.create.birch_window": "\u028Dopu\u0131M \u0265\u0254\u0279\u0131\u15FA",
"block.create.birch_window_pane": "\u01DDu\u0250\u0500 \u028Dopu\u0131M \u0265\u0254\u0279\u0131\u15FA",
"block.create.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_block": "\u029E\u0254o\u05DF\u15FA 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.birch_window": "Birch Window",
"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_block": "Brass Block",
"block.create.brass_casing": "Brass Casing",

View file

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

View file

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

View file

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

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 363",
"_": "Missing Localizations: 364",
"_": "->------------------------] Game Elements [------------------------<-",
@ -29,6 +29,7 @@
"block.create.belt_observer": "ベルトオブザーバー",
"block.create.birch_window": "UNLOCALIZED: Birch Window",
"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_block": "真鍮ブロック",
"block.create.brass_casing": "真鍮ケーシング",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 368",
"_": "Missing Localizations: 369",
"_": "->------------------------] Game Elements [------------------------<-",
@ -29,6 +29,7 @@
"block.create.belt_observer": "벨트 감지기",
"block.create.birch_window": "UNLOCALIZED: Birch Window",
"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_block": "황동 블럭",
"block.create.brass_casing": "황동 케이스",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 718",
"_": "Missing Localizations: 719",
"_": "->------------------------] Game Elements [------------------------<-",
@ -29,6 +29,7 @@
"block.create.belt_observer": "Transportband Observeerder",
"block.create.birch_window": "UNLOCALIZED: Birch Window",
"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_block": "UNLOCALIZED: Brass Block",
"block.create.brass_casing": "UNLOCALIZED: Brass Casing",

View file

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

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 782",
"_": "Missing Localizations: 783",
"_": "->------------------------] Game Elements [------------------------<-",
@ -29,6 +29,7 @@
"block.create.belt_observer": "Ленточный сканер",
"block.create.birch_window": "UNLOCALIZED: Birch Window",
"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_block": "UNLOCALIZED: Brass Block",
"block.create.brass_casing": "UNLOCALIZED: Brass Casing",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 44",
"_": "Missing Localizations: 45",
"_": "->------------------------] Game Elements [------------------------<-",
@ -29,6 +29,7 @@
"block.create.belt_observer": "传送带侦测器",
"block.create.birch_window": "白桦窗户",
"block.create.birch_window_pane": "白桦窗户板",
"block.create.blaze_heater": "UNLOCALIZED: Blaze Heater",
"block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel",
"block.create.brass_block": "黄铜块",
"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 {
private static List<AllBlockPartials> all = new ArrayList<>();
public static final AllBlockPartials
SCHEMATICANNON_CONNECTOR = get("schematicannon/connector"),
private static final List<AllBlockPartials> all = new ArrayList<>();
public static final AllBlockPartials SCHEMATICANNON_CONNECTOR = get("schematicannon/connector"),
SCHEMATICANNON_PIPE = get("schematicannon/pipe"),
SHAFTLESS_COGWHEEL = get("cogwheel_shaftless"),
SHAFTLESS_COGWHEEL = get("cogwheel_shaftless"),
SHAFT_HALF = get("shaft_half"),
BELT_PULLEY = get("belt_pulley"),
@ -46,11 +45,12 @@ public class AllBlockPartials {
BELT_DIAGONAL_MIDDLE = get("belt/diagonal_middle"),
BELT_DIAGONAL_END = get("belt/diagonal_end"),
ENCASED_FAN_INNER = get("encased_fan/propeller"),
HAND_CRANK_HANDLE = get("hand_crank/handle"),
MECHANICAL_PRESS_HEAD = get("mechanical_press/head"),
MECHANICAL_MIXER_POLE = get("mechanical_mixer/pole"),
MECHANICAL_MIXER_HEAD = get("mechanical_mixer/head"),
ENCASED_FAN_INNER = get("encased_fan/propeller"), HAND_CRANK_HANDLE = get("hand_crank/handle"),
MECHANICAL_PRESS_HEAD = get("mechanical_press/head"), MECHANICAL_MIXER_POLE = get("mechanical_mixer/pole"),
MECHANICAL_MIXER_HEAD = get("mechanical_mixer/head"), BLAZE_HEATER_BLAZE_ONE = get("blaze_heater/blaze/one"),
BLAZE_HEATER_BLAZE_TWO = get("blaze_heater/blaze/two"),
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_ARROW = get("mechanical_crafter/arrow"),
MECHANICAL_CRAFTER_BELT_FRAME = get("mechanical_crafter/belt"),
@ -73,41 +73,29 @@ public class AllBlockPartials {
FLEXPEATER_INDICATOR = get("diodes/indicator"),
FLYWHEEL = get("flywheel/wheel"),
FLYWHEEL_UPPER_ROTATING = get("flywheel/upper_rotating_connector"),
FLYWHEEL_LOWER_ROTATING = get("flywheel/lower_rotating_connector"),
FLYWHEEL_UPPER_SLIDING = get("flywheel/upper_sliding_connector"),
FLYWHEEL_LOWER_SLIDING = get("flywheel/lower_sliding_connector"),
FURNACE_GENERATOR_FRAME = get("furnace_engine/frame"),
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_RIGHT_DOOR = get("cuckoo_clock/right_door"),
CUCKOO_PIG = get("cuckoo_clock/pig"),
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"),
FURNACE_GENERATOR_FRAME = get("furnace_engine/frame"), 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_RIGHT_DOOR = get("cuckoo_clock/right_door"), CUCKOO_PIG = get("cuckoo_clock/pig"),
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_CROSSPLANE = get("symmetry_effect/crossplane"),
SYMMETRY_PLANE = get("symmetry_effect/plane"), SYMMETRY_CROSSPLANE = get("symmetry_effect/crossplane"),
SYMMETRY_TRIPLEPLANE = get("symmetry_effect/tripleplane"),
ARM_COG = get("mechanical_arm/cog"),
ARM_BASE = get("mechanical_arm/base"),
ARM_LOWER_BODY = get("mechanical_arm/lower_body"),
ARM_UPPER_BODY = get("mechanical_arm/upper_body"),
ARM_HEAD = get("mechanical_arm/head"),
ARM_CLAW_BASE = get("mechanical_arm/claw_base"),
ARM_CLAW_GRIP = get("mechanical_arm/claw_grip"),
FLAG_SHORT_IN = get("mechanical_arm/flag/short_in"),
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"),
ARM_COG = get("mechanical_arm/cog"), ARM_BASE = get("mechanical_arm/base"),
ARM_LOWER_BODY = get("mechanical_arm/lower_body"), ARM_UPPER_BODY = get("mechanical_arm/upper_body"),
ARM_HEAD = get("mechanical_arm/head"), ARM_CLAW_BASE = get("mechanical_arm/claw_base"),
ARM_CLAW_GRIP = get("mechanical_arm/claw_grip"),
FLAG_SHORT_IN = get("mechanical_arm/flag/short_in"), 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");
public static final Map<Direction, AllBlockPartials> PIPE_RIMS = map();
@ -123,8 +111,7 @@ public class AllBlockPartials {
private ResourceLocation modelLocation;
private IBakedModel bakedModel;
private AllBlockPartials() {
}
private AllBlockPartials() {}
private static void populateMaps() {
for (Direction d : Iterate.directions) {
@ -194,9 +181,7 @@ public class AllBlockPartials {
.rotateY(AngleHelper.horizontalAngle(facing))
.rotateX(AngleHelper.verticalAngle(facing))
.unCentre();
SuperByteBuffer renderPartial =
CreateClient.bufferCache.renderDirectionalPartial(this, referenceState, facing, ms);
return renderPartial;
return CreateClient.bufferCache.renderDirectionalPartial(this, referenceState, facing, ms);
}
}

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.PumpBlock;
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.sequencer.SequencedGearshiftBlock;
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.common.ToolType;
@SuppressWarnings("unused")
public class AllBlocks {
private static final CreateRegistrate REGISTRATE = Create.registrate()
@ -206,7 +208,7 @@ public class AllBlocks {
public static final BlockEntry<EncasedShaftBlock> ENCASED_SHAFT =
REGISTRATE.block("encased_shaft", EncasedShaftBlock::new)
.initialProperties(SharedProperties::stone)
.properties(p -> p.nonOpaque())
.properties(Block.Properties::nonOpaque)
.transform(StressConfigDefaults.setNoImpact())
.blockstate(BlockStateGen.axisBlockProvider(true))
.item()
@ -215,7 +217,7 @@ public class AllBlocks {
public static final BlockEntry<GearboxBlock> GEARBOX = REGISTRATE.block("gearbox", GearboxBlock::new)
.initialProperties(SharedProperties::stone)
.properties(p -> p.nonOpaque())
.properties(Block.Properties::nonOpaque)
.transform(StressConfigDefaults.setNoImpact())
.blockstate(BlockStateGen.axisBlockProvider(true))
.item()
@ -224,7 +226,7 @@ public class AllBlocks {
public static final BlockEntry<ClutchBlock> CLUTCH = REGISTRATE.block("clutch", ClutchBlock::new)
.initialProperties(SharedProperties::stone)
.properties(p -> p.nonOpaque())
.properties(Block.Properties::nonOpaque)
.transform(StressConfigDefaults.setNoImpact())
.blockstate((c, p) -> BlockStateGen.axisBlock(c, p, AssetLookup.forPowered(c, p)))
.item()
@ -233,7 +235,7 @@ public class AllBlocks {
public static final BlockEntry<GearshiftBlock> GEARSHIFT = REGISTRATE.block("gearshift", GearshiftBlock::new)
.initialProperties(SharedProperties::stone)
.properties(p -> p.nonOpaque())
.properties(Block.Properties::nonOpaque)
.transform(StressConfigDefaults.setNoImpact())
.blockstate((c, p) -> BlockStateGen.axisBlock(c, p, AssetLookup.forPowered(c, p)))
.item()
@ -243,7 +245,7 @@ public class AllBlocks {
public static final BlockEntry<EncasedBeltBlock> ENCASED_BELT =
REGISTRATE.block("encased_belt", EncasedBeltBlock::new)
.initialProperties(SharedProperties::stone)
.properties(p -> p.nonOpaque())
.properties(Block.Properties::nonOpaque)
.transform(StressConfigDefaults.setNoImpact())
.blockstate((c, p) -> new EncasedBeltGenerator((state, suffix) -> p.models()
.getExistingFile(p.modLoc("block/" + c.getName() + "/" + suffix))).generate(c, p))
@ -254,7 +256,7 @@ public class AllBlocks {
public static final BlockEntry<AdjustablePulleyBlock> ADJUSTABLE_PULLEY =
REGISTRATE.block("adjustable_pulley", AdjustablePulleyBlock::new)
.initialProperties(SharedProperties::stone)
.properties(p -> p.nonOpaque())
.properties(Block.Properties::nonOpaque)
.transform(StressConfigDefaults.setNoImpact())
.blockstate((c, p) -> new EncasedBeltGenerator((state, suffix) -> {
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)
.initialProperties(SharedProperties::wooden)
.properties(p -> p.nonOpaque())
.properties(Block.Properties::nonOpaque)
.blockstate(BlockStateGen.horizontalWheelProvider(false))
.addLayer(() -> RenderType::getCutoutMipped)
.transform(StressConfigDefaults.setCapacity(16.0))
@ -353,7 +355,7 @@ public class AllBlocks {
public static final BlockEntry<CrushingWheelBlock> CRUSHING_WHEEL =
REGISTRATE.block("crushing_wheel", CrushingWheelBlock::new)
.initialProperties(SharedProperties::stone)
.properties(p -> p.nonOpaque())
.properties(Block.Properties::nonOpaque)
.blockstate(BlockStateGen.axisBlockProvider(false))
.addLayer(() -> RenderType::getCutoutMipped)
.transform(StressConfigDefaults.setImpact(8.0))
@ -373,7 +375,7 @@ public class AllBlocks {
public static final BlockEntry<MechanicalPressBlock> MECHANICAL_PRESS =
REGISTRATE.block("mechanical_press", MechanicalPressBlock::new)
.initialProperties(SharedProperties::stone)
.properties(p -> p.nonOpaque())
.properties(Block.Properties::nonOpaque)
.blockstate(BlockStateGen.horizontalBlockProvider(true))
.transform(StressConfigDefaults.setImpact(8.0))
.item(BasinOperatorBlockItem::new)
@ -383,7 +385,7 @@ public class AllBlocks {
public static final BlockEntry<MechanicalMixerBlock> MECHANICAL_MIXER =
REGISTRATE.block("mechanical_mixer", MechanicalMixerBlock::new)
.initialProperties(SharedProperties::stone)
.properties(p -> p.nonOpaque())
.properties(Block.Properties::nonOpaque)
.blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p)))
.addLayer(() -> RenderType::getCutoutMipped)
.transform(StressConfigDefaults.setImpact(4.0))
@ -397,6 +399,15 @@ public class AllBlocks {
.simpleItem()
.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)
.initialProperties(SharedProperties::stone)
.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 =
REGISTRATE.block("cart_assembler", CartAssemblerBlock::new)
.initialProperties(SharedProperties::stone)
.properties(p -> p.nonOpaque())
.properties(Block.Properties::nonOpaque)
.blockstate(BlockStateGen.cartAssembler())
.addLayer(() -> RenderType::getCutoutMipped)
.tag(BlockTags.RAILS)
@ -534,7 +545,7 @@ public class AllBlocks {
public static final BlockEntry<ReinforcedRailBlock> REINFORCED_RAIL =
REGISTRATE.block("reinforced_rail", ReinforcedRailBlock::new)
.initialProperties(SharedProperties::stone)
.properties(p -> p.nonOpaque())
.properties(Block.Properties::nonOpaque)
.blockstate(BlockStateGen.reinforcedRail())
.addLayer(() -> RenderType::getCutoutMipped)
.tag(BlockTags.RAILS)
@ -645,7 +656,7 @@ public class AllBlocks {
public static final BlockEntry<MechanicalCrafterBlock> MECHANICAL_CRAFTER =
REGISTRATE.block("mechanical_crafter", MechanicalCrafterBlock::new)
.initialProperties(SharedProperties::softMetal)
.properties(p -> p.nonOpaque())
.properties(Block.Properties::nonOpaque)
.blockstate(BlockStateGen.horizontalBlockProvider(true))
.transform(StressConfigDefaults.setImpact(2.0))
.onRegister(CreateRegistrate.connectedTextures(new CrafterCTBehaviour()))
@ -657,7 +668,7 @@ public class AllBlocks {
public static final BlockEntry<SequencedGearshiftBlock> SEQUENCED_GEARSHIFT =
REGISTRATE.block("sequenced_gearshift", SequencedGearshiftBlock::new)
.initialProperties(SharedProperties::stone)
.properties(p -> p.nonOpaque())
.properties(Block.Properties::nonOpaque)
.transform(StressConfigDefaults.setNoImpact())
.blockstate(new SequencedGearshiftGenerator()::generate)
.item()
@ -666,7 +677,7 @@ public class AllBlocks {
public static final BlockEntry<FlywheelBlock> FLYWHEEL = REGISTRATE.block("flywheel", FlywheelBlock::new)
.initialProperties(SharedProperties::softMetal)
.properties(p -> p.nonOpaque())
.properties(Block.Properties::nonOpaque)
.transform(StressConfigDefaults.setNoImpact())
.blockstate(new FlywheelGenerator()::generate)
.item()
@ -817,7 +828,7 @@ public class AllBlocks {
public static final BlockEntry<PackagerBlock> PACKAGER = REGISTRATE.block("packager", PackagerBlock::new)
.initialProperties(SharedProperties::softMetal)
.transform(StressConfigDefaults.setImpact(4.0))
.properties(p -> p.nonOpaque())
.properties(Block.Properties::nonOpaque)
.blockstate((c, p) -> p.getVariantBuilder(c.get())
.forAllStates(s -> ConfiguredModel.builder()
.modelFile(AssetLookup.partialBaseModel(c, p))

View file

@ -1,7 +1,5 @@
package com.simibubi.create;
import java.util.function.Supplier;
import com.simibubi.create.compat.jei.ConversionRecipe;
import com.simibubi.create.content.contraptions.components.crafter.MechanicalCraftingRecipe;
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.processing.ProcessingRecipe;
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.curiosities.tools.SandPaperPolishingRecipe;
import com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperUpgradeRecipe;
import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.item.crafting.IRecipeSerializer;
@ -26,18 +24,20 @@ import net.minecraft.util.ResourceLocation;
import net.minecraft.util.registry.Registry;
import net.minecraftforge.event.RegistryEvent;
import java.util.function.Supplier;
public enum AllRecipeTypes {
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)),
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 IRecipeType<? extends IRecipe<? extends IInventory>> type;
@SuppressWarnings("unchecked")
public <T extends IRecipeType<?>> T getType() {
return (T) type;
}
private AllRecipeTypes(Supplier<IRecipeSerializer<?>> supplier) {
AllRecipeTypes(Supplier<IRecipeSerializer<?>> supplier) {
this(supplier, null);
}
private AllRecipeTypes(Supplier<IRecipeSerializer<?>> supplier,
IRecipeType<? extends IRecipe<? extends IInventory>> existingType) {
AllRecipeTypes(Supplier<IRecipeSerializer<?>> supplier,
IRecipeType<? extends IRecipe<? extends IInventory>> existingType) {
this.supplier = supplier;
this.type = existingType;
}
public static void register(RegistryEvent.Register<IRecipeSerializer<?>> event) {
ShapedRecipe.setCraftingSize(9, 9);
for (AllRecipeTypes r : AllRecipeTypes.values()) {
if (r.type == null)
r.type = customType(Lang.asId(r.name()));
r.serializer = r.supplier.get();
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) {
return Registry.register(Registry.RECIPE_TYPE, new ResourceLocation(Create.ID, id), new IRecipeType<T>() {
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);
}
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.PumpRenderer;
import com.simibubi.create.content.contraptions.fluids.PumpTileEntity;
import com.simibubi.create.content.contraptions.processing.BasinRenderer;
import com.simibubi.create.content.contraptions.processing.BasinTileEntity;
import com.simibubi.create.content.contraptions.processing.*;
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.sequencer.SequencedGearshiftTileEntity;
@ -201,6 +200,8 @@ public class AllTileEntities {
register("deployer", DeployerTileEntity::new, AllBlocks.DEPLOYER);
public static final TileEntityEntry<BasinTileEntity> 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 =
register("mechanical_crafter", MechanicalCrafterTileEntity::new, AllBlocks.MECHANICAL_CRAFTER);
public static final TileEntityEntry<SequencedGearshiftTileEntity> SEQUENCED_GEARSHIFT =
@ -300,6 +301,7 @@ public class AllTileEntities {
bind(SPEEDOMETER, GaugeRenderer::speed);
bind(STRESSOMETER, GaugeRenderer::stress);
bind(BASIN, BasinRenderer::new);
bind(HEATER, HeaterRenderer::new);
bind(DEPLOYER, DeployerRenderer::new);
bind(FLYWHEEL, FlywheelRenderer::new);
bind(FURNACE_ENGINE, EngineRenderer::new);

View file

@ -1,8 +1,10 @@
package com.simibubi.create.compat.jei;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import javax.annotation.ParametersAreNonnullByDefault;
import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.Create;
import com.simibubi.create.content.contraptions.processing.ProcessingIngredient;
@ -21,23 +23,25 @@ import net.minecraftforge.items.wrapper.RecipeWrapper;
* @author simibubi
*
*/
@ParametersAreNonnullByDefault
public class ConversionRecipe extends ProcessingRecipe<RecipeWrapper> {
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);
}
static int counter = 0;
public static ConversionRecipe create(ItemStack from, ItemStack to) {
List<ProcessingIngredient> ingredients = Arrays.asList(new ProcessingIngredient(Ingredient.fromStacks(from)));
List<ProcessingOutput> outputs = Arrays.asList(new ProcessingOutput(to, 1));
List<ProcessingIngredient> ingredients =
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);
}
public ConversionRecipe(ResourceLocation id, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results) {
List<ProcessingOutput> results) {
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))
return jeiSlot;
ProcessingRecipe<?> processingRecipe = (ProcessingRecipe<?>) recipe;
List<ProcessingOutput> rollableResults = processingRecipe.getRollableResults();
List<ProcessingOutput> rollableResults = processingRecipe.getRollableItemResults();
if (rollableResults.size() <= index)
return jeiSlot;
if (processingRecipe.getRollableResults().get(index).getChance() == 1)
if (processingRecipe.getRollableItemResults().get(index).getChance() == 1)
return jeiSlot;
return AllGuiTextures.JEI_CHANCE_SLOT;
}

View file

@ -41,7 +41,7 @@ public class CrushingCategory extends CreateRecipeCategory<AbstractCrushingRecip
itemStacks.init(0, true, 50, 2);
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 offset = -size * 19 / 2;
for (int outputIndex = 0; outputIndex < size; outputIndex++) {
@ -54,7 +54,7 @@ public class CrushingCategory extends CreateRecipeCategory<AbstractCrushingRecip
@Override
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_DOWN_ARROW.draw(72, 7);

View file

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

View file

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

View file

@ -43,7 +43,7 @@ public class PolishingCategory extends CreateRecipeCategory<SandPaperPolishingRe
@Override
public void setRecipe(IRecipeLayout recipeLayout, SandPaperPolishingRecipe recipe, IIngredients ingredients) {
IGuiItemStackGroup itemStacks = recipeLayout.getItemStacks();
List<ProcessingOutput> results = recipe.getRollableResults();
List<ProcessingOutput> results = recipe.getRollableItemResults();
itemStacks.init(0, true, 26, 28);
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.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++) {
itemStacks.init(outputIndex + 1, false, 131 + 19 * outputIndex, 50);
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) {
AllGuiTextures.JEI_SLOT.draw(26, 50);
getRenderedSlot(recipe, 0).draw(131, 50);
if (recipe.getRollableResults().size() > 1)
if (recipe.getRollableItemResults().size() > 1)
getRenderedSlot(recipe, 1).draw(131 + 19, 50);
AllGuiTextures.JEI_SHADOW.draw(61, 41);
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.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++) {
int xOffset = outputIndex % 2 == 0 ? 0 : 19;
int yOffset = (outputIndex / 2) * -19;
@ -55,7 +55,7 @@ public class SawingCategory extends CreateRecipeCategory<CuttingRecipe> {
@Override
public void draw(CuttingRecipe recipe, double mouseX, double mouseY) {
AllGuiTextures.JEI_SLOT.draw(43, 4);
int size = recipe.getRollableResults().size();
int size = recipe.getRollableItemResults().size();
for (int i = 0; i < size; i++) {
int xOffset = i % 2 == 0 ? 0 : 19;
int yOffset = (i / 2) * -19;

View file

@ -42,7 +42,7 @@ public class SplashingCategory extends ProcessingViaFanCategory<SplashingRecipe>
.get(0)
.getMatchingStacks()));
List<ProcessingOutput> results = recipe.getRollableResults();
List<ProcessingOutput> results = recipe.getRollableItemResults();
boolean single = results.size() == 1;
for (int outputIndex = 0; outputIndex < results.size(); outputIndex++) {
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 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);
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,14 +1,17 @@
package com.simibubi.create.content.contraptions.components.mixer;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
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.fluids.CombinedFluidHandler;
import com.simibubi.create.content.contraptions.processing.BasinOperatingTileEntity;
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.behaviour.CenteredSideValueBoxTransform;
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.particles.ItemParticleData;
import net.minecraft.particles.ParticleTypes;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.NonNullList;
@ -65,7 +69,7 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity {
}
public float getRenderedHeadOffset(float partialTicks) {
int localTick = 0;
int localTick;
float offset = 0;
if (running) {
if (runningTicks < 20) {
@ -121,7 +125,7 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity {
@Override
public void lazyTick() {
super.lazyTick();
if (world.isRemote && running && !basinItemInv.isPresent())
if (world != null && world.isRemote && running && !basinItemInv.isPresent())
updateBasin();
}
@ -163,7 +167,7 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity {
public void renderParticles() {
IItemHandler itemHandler = basinItemInv.orElse(null);
BasinInventory inv = (BasinInventory) itemHandler;
if (inv == null)
if (inv == null || world == null)
return;
for (int slot = 0; slot < inv.getInputHandler()
@ -204,14 +208,16 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity {
.allMatch(ingredient -> (ingredient.isSimple() || ingredient.getMatchingStacks().length == 1)))
return false;
List<ItemStack> remaining = new ArrayList<>();
CombinedItemFluidList remaining = new CombinedItemFluidList();
inputs.forEachItemStack(stack -> remaining.add(stack.copy()));
basinFluidInv.ifPresent(
fluidInv -> ((CombinedFluidHandler) fluidInv).forEachTank(fluidStack -> remaining.add(fluidStack.copy())));
// sort by leniency
List<Ingredient> sortedIngredients = new LinkedList<>(ingredients);
sortedIngredients.sort(Comparator.comparingInt(i -> i.getMatchingStacks().length));
Ingredients: for (Ingredient ingredient : sortedIngredients) {
for (ItemStack stack : remaining) {
for (ItemStack stack : remaining.getItemStacks()) {
if (stack.isEmpty())
continue;
if (ingredient.test(stack)) {
@ -221,7 +227,10 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity {
}
return false;
}
return true;
if (!(recipe instanceof MixingRecipe))
return true;
return ((MixingRecipe) recipe).getHeatLevelRequired() <= getHeatLevelApplied();
}
@Override
@ -258,4 +267,13 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity {
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;
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.content.contraptions.processing.BasinTileEntity.BasinInputInventory;
import com.simibubi.create.content.contraptions.processing.ProcessingIngredient;
import com.simibubi.create.content.contraptions.processing.ProcessingOutput;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipe;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.util.NonNullList;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.fluids.FluidStack;
import javax.annotation.Nonnull;
import java.util.*;
public class MixingRecipe extends ProcessingRecipe<BasinInputInventory> {
public MixingRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int processingDuration) {
super(AllRecipeTypes.MIXING, id, group, ingredients, results, processingDuration);
List<ProcessingOutput> results, int processingDuration, List<FluidStack> fluidIngredients,
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
protected int getMaxInputCount() {
return 9;
}
@Override
protected int getMaxOutputCount() {
return 1;
}
@Override
protected boolean canHaveCatalysts() {
return true;
}
@Override
public boolean matches(BasinInputInventory inv, World worldIn) {
public boolean matches(BasinInputInventory inv, @Nonnull World worldIn) {
if (inv.isEmpty())
return false;
NonNullList<Ingredient> ingredients = getIngredients();
if (!ingredients.stream().allMatch(Ingredient::isSimple))
NonNullList<Ingredient> ingredients = this.getIngredients();
if (!ingredients.stream()
.allMatch(Ingredient::isSimple))
return false;
List<ItemStack> remaining = new ArrayList<>();
@ -59,7 +65,7 @@ public class MixingRecipe extends ProcessingRecipe<BasinInputInventory> {
// sort by leniency
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) {
for (ItemStack stack : remaining) {
if (stack.isEmpty())
@ -74,9 +80,22 @@ public class MixingRecipe extends ProcessingRecipe<BasinInputInventory> {
return true;
}
public static MixingRecipe of(IRecipe<?> recipe) {
return new MixingRecipe(recipe.getId(), recipe.getGroup(), ProcessingIngredient.list(recipe.getIngredients()),
Arrays.asList(new ProcessingOutput(recipe.getRecipeOutput(), 1)), -1);
@Override
protected boolean canHaveFluidIngredient() {
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.AllSoundEvents;
import com.simibubi.create.content.contraptions.fluids.CombinedFluidHandler;
import com.simibubi.create.content.contraptions.processing.BasinOperatingTileEntity;
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.foundation.advancement.AllTriggers;
import com.simibubi.create.foundation.item.ItemHelper;
@ -297,11 +299,12 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity {
.allMatch(Ingredient::isSimple))
return false;
List<ItemStack> remaining = new ArrayList<>();
CombinedItemFluidList remaining = new CombinedItemFluidList();
inputs.forEachItemStack(stack -> remaining.add(stack.copy()));
basinFluidInv.ifPresent(fluidInv -> ((CombinedFluidHandler) fluidInv).forEachTank(fluidStack -> remaining.add(fluidStack.copy())));
Ingredients: for (Ingredient ingredient : ingredients) {
for (ItemStack stack : remaining) {
for (ItemStack stack : remaining.getItemStacks()) {
if (stack.isEmpty())
continue;
if (ingredient.test(stack)) {

View file

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

View file

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

View file

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

View file

@ -37,7 +37,7 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity {
protected IRecipe<?> lastRecipe;
protected LazyOptional<IItemHandler> basinItemInv = LazyOptional.empty();
protected LazyOptional<IFluidHandler> basinFluidInv = LazyOptional.empty();
protected MultiIngredientTypeList inputs;
protected CombinedItemFluidList inputs;
public BasinOperatingTileEntity(TileEntityType<?> typeIn) {
super(typeIn);
@ -59,7 +59,7 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity {
}
public void gatherInputs() {
inputs = new MultiIngredientTypeList();
inputs = new CombinedItemFluidList();
basinItemInv.ifPresent(inv -> {
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.Optional;
import javax.annotation.Nonnull;
import com.simibubi.create.content.contraptions.fluids.CombinedFluidHandler;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
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.nbt.CompoundNBT;
import net.minecraft.nbt.ListNBT;
import net.minecraft.tileentity.ITickableTileEntity;
import net.minecraft.tileentity.TileEntity;
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.RecipeWrapper;
import javax.annotation.Nonnull;
public class BasinTileEntity extends SmartTileEntity implements ITickableTileEntity {
public boolean contentsChanged;
@ -121,7 +122,7 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt
super.read(compound);
inputItemInventory.deserializeNBT(compound.getCompound("InputItems"));
outputItemInventory.deserializeNBT(compound.getCompound("OutputItems"));
if (compound.hasUniqueId("fluids"))
if (compound.contains("fluids"))
fluidInventory
.ifPresent(combinedFluidHandler -> combinedFluidHandler.readFromNBT(compound.getList("fluids", 10)));
}
@ -131,7 +132,10 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt
super.write(compound);
compound.put("InputItems", inputItemInventory.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;
}

View file

@ -6,23 +6,31 @@ import net.minecraftforge.fluids.FluidStack;
import java.util.ArrayList;
import java.util.function.Consumer;
public class MultiIngredientTypeList {
private final ArrayList<ItemStack> itemIngredients = new ArrayList<>();
private final ArrayList<FluidStack> fluidIngredients = new ArrayList<>();
public class CombinedItemFluidList {
private final ArrayList<ItemStack> itemStacks = new ArrayList<>();
private final ArrayList<FluidStack> fluidStacks = new ArrayList<>();
public void add(ItemStack itemstack) {
itemIngredients.add(itemstack);
itemStacks.add(itemstack);
}
public void add(FluidStack fluidStack) {
fluidIngredients.add(fluidStack);
fluidStacks.add(fluidStack);
}
public void forEachItemStack(Consumer<? super ItemStack> itemStackConsumer) {
itemIngredients.forEach(itemStackConsumer);
itemStacks.forEach(itemStackConsumer);
}
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 {
private static Random r = new Random();
private ItemStack stack;
private float chance;
private static final Random r = new Random();
private final ItemStack stack;
private final float chance;
public ProcessingOutput(ItemStack stack, float chance) {
this.stack = stack;

View file

@ -1,12 +1,8 @@
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.Create;
import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
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.util.NonNullList;
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> {
protected final List<ProcessingIngredient> ingredients;
private final List<ProcessingOutput> results;
private final IRecipeType<?> type;
private final IRecipeSerializer<?> serializer;
protected final ResourceLocation id;
protected final String group;
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,
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.serializer = recipeType.serializer;
this.id = id;
@ -34,20 +47,23 @@ public abstract class ProcessingRecipe<T extends IInventory> implements IRecipe<
this.ingredients = ingredients;
this.results = results;
this.processingDuration = processingDuration;
this.fluidIngredients = fluidIngredients;
this.fluidResults = fluidResults;
this.requiredHeat = requiredHeat;
validate(recipeType);
}
private void validate(AllRecipeTypes recipeType) {
if (ingredients.size() > getMaxInputCount())
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())
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 -> {
if (i.isCatalyst() && !canHaveCatalysts())
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;
}
public List<ItemStack> rollResults() {
List<ItemStack> stacks = new ArrayList<>();
for (ProcessingOutput output : getRollableResults()) {
public CombinedItemFluidList rollResults() {
CombinedItemFluidList results = new CombinedItemFluidList();
for (ProcessingOutput output : getRollableItemResults()) {
ItemStack stack = output.rollOutput();
if (!stack.isEmpty())
stacks.add(stack);
results.add(stack);
}
return stacks;
return results;
}
@Override
@ -84,7 +100,9 @@ public abstract class ProcessingRecipe<T extends IInventory> implements IRecipe<
@Override
public ItemStack getRecipeOutput() {
return getRollableResults().isEmpty() ? ItemStack.EMPTY : getRollableResults().get(0).getStack();
return getRollableItemResults().isEmpty() ? ItemStack.EMPTY
: getRollableItemResults().get(0)
.getStack();
}
@Override
@ -119,15 +137,29 @@ public abstract class ProcessingRecipe<T extends IInventory> implements IRecipe<
return false;
}
public List<ProcessingOutput> getRollableResults() {
public List<ProcessingOutput> getRollableItemResults() {
return results;
}
public List<ProcessingIngredient> getRollableIngredients() {
return ingredients;
}
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;
import java.util.ArrayList;
import java.util.List;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.fluid.Fluid;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipeSerializer;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.JSONUtils;
import net.minecraft.util.ResourceLocation;
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<?>>
extends net.minecraftforge.registries.ForgeRegistryEntry<IRecipeSerializer<?>> implements IRecipeSerializer<T> {
extends net.minecraftforge.registries.ForgeRegistryEntry<IRecipeSerializer<?>> implements IRecipeSerializer<T> {
protected final IRecipeFactory<T> factory;
@ -27,32 +34,59 @@ public class ProcessingRecipeSerializer<T extends ProcessingRecipe<?>>
String s = JSONUtils.getString(json, "group", "");
List<ProcessingIngredient> ingredients = new ArrayList<>();
List<FluidStack> fluidIngredients = new ArrayList<>();
for (JsonElement e : JSONUtils.getJsonArray(json, "ingredients")) {
int count = 1;
if (JSONUtils.hasField((JsonObject) e, "count")) {
count = JSONUtils.getInt(e.getAsJsonObject().get("count"), "count");
}
for(int i = 0; i < count; i++) {
ingredients.add(ProcessingIngredient.parse(e.getAsJsonObject()));
JsonObject entry = e.getAsJsonObject();
if (JSONUtils.hasField(entry, "fluid")) {
addFluidToList(fluidIngredients, entry);
} else {
int count = 1;
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<FluidStack> fluidResults = new ArrayList<>();
for (JsonElement e : JSONUtils.getJsonArray(json, "results")) {
String s1 = JSONUtils.getString(e.getAsJsonObject().get("item"), "item");
int i = JSONUtils.getInt(e.getAsJsonObject().get("count"), "count");
float chance = 1;
if (JSONUtils.hasField((JsonObject) e, "chance"))
chance = JSONUtils.getFloat(e.getAsJsonObject().get("chance"), "chance");
ItemStack itemstack = new ItemStack(Registry.ITEM.getOrDefault(new ResourceLocation(s1)), i);
results.add(new ProcessingOutput(itemstack, chance));
JsonObject entry = e.getAsJsonObject();
if (JSONUtils.hasField(entry, "fluid")) {
addFluidToList(fluidResults, entry);
} else {
String s1 = JSONUtils.getString(entry, "item");
int i = JSONUtils.getInt(entry, "count");
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;
if (JSONUtils.hasField(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) {
@ -63,14 +97,26 @@ public class ProcessingRecipeSerializer<T extends ProcessingRecipe<?>>
for (int i = 0; i < ingredientCount; i++)
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<>();
int outputCount = buffer.readInt();
for (int i = 0; i < outputCount; i++)
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) {
@ -78,16 +124,49 @@ public class ProcessingRecipeSerializer<T extends ProcessingRecipe<?>>
buffer.writeInt(recipe.ingredients.size());
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());
recipe.getRollableResults().forEach(i -> i.write(buffer));
buffer.writeInt(recipe.getRollableItemResults()
.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.requiredHeat);
}
public interface IRecipeFactory<T extends ProcessingRecipe<?>> {
T create(ResourceLocation id, String group, List<ProcessingIngredient> ingredients, List<ProcessingOutput> results,
int duration);
default T create(ResourceLocation recipeId, String s, List<ProcessingIngredient> ingredients,
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 mcp.MethodsReturnNonnullByDefault;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.item.ItemEntity;
@ -24,6 +25,10 @@ import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraftforge.common.util.FakePlayer;
import javax.annotation.ParametersAreNonnullByDefault;
@MethodsReturnNonnullByDefault
@ParametersAreNonnullByDefault
public class SandPaperItem extends Item {
public SandPaperItem(Properties properties) {
@ -68,8 +73,6 @@ public class SandPaperItem extends Item {
return FAIL;
BlockRayTraceResult ray = (BlockRayTraceResult) raytraceresult;
Vec3d hitVec = ray.getHitVec();
if (hitVec == null)
return FAIL;
AxisAlignedBB bb = new AxisAlignedBB(hitVec, hitVec).grow(1f);
ItemEntity pickUp = null;

View file

@ -1,28 +1,26 @@
package com.simibubi.create.content.curiosities.tools;
import java.util.List;
import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.content.contraptions.processing.ProcessingIngredient;
import com.simibubi.create.content.contraptions.processing.ProcessingOutput;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipe;
import com.simibubi.create.content.curiosities.tools.SandPaperPolishingRecipe.SandPaperInv;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.util.DamageSource;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraftforge.items.ItemStackHandler;
import net.minecraftforge.items.wrapper.RecipeWrapper;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.List;
@ParametersAreNonnullByDefault
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,
List<ProcessingOutput> results, int processingDuration) {
List<ProcessingOutput> results, int 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) {
List<IRecipe<SandPaperInv>> matchingRecipes = getMatchingRecipes(world, stack);
if (!matchingRecipes.isEmpty())
return matchingRecipes.get(0).getCraftingResult(new SandPaperInv(stack)).copy();
return matchingRecipes.get(0)
.getCraftingResult(new SandPaperInv(stack))
.copy();
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
public boolean matches(SandPaperInv inv, World worldIn) {
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);
return ingredients.get(0)
.test(inv.getStackInSlot(0));
}
@Override

View file

@ -263,7 +263,7 @@ public class InWorldProcessing {
if (recipe instanceof ProcessingRecipe) {
stacks = new ArrayList<>();
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 previouslyRolled : stacks) {
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.fluids.FluidPipeBlock;
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.palettes.PavedBlock;
import com.simibubi.create.foundation.utility.Iterate;
@ -212,6 +213,10 @@ public class BlockStateGen {
.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() {
return (c, p) -> p.getVariantBuilder(c.get())

View file

@ -1,13 +1,15 @@
package com.simibubi.create.foundation.data;
import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
import net.minecraft.block.material.Material;
import net.minecraft.block.material.MaterialColor;
import net.minecraft.block.material.PushReaction;
@MethodsReturnNonnullByDefault
public class SharedProperties {
public static Material beltMaterial =
new Material(MaterialColor.GRAY, false, true, true, true, true, false, false, PushReaction.NORMAL);
@ -22,5 +24,4 @@ public class SharedProperties {
public static Block wooden() {
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",
"count": 2
}
]
],
"requiredHeat": 1
}