package Ġme . ste ven . ind rev . recipes . machines Ċ Ċ import Ġa lex i il . mc . lib . attributes . fluid . volume . Fluid Volume Ċ import Ġcom . google . gson . JsonArray Ċ import Ġcom . google . gson . Json Element Ċ import Ġcom . google . gson . JsonObject Ċ import Ġme . ste ven . ind rev . recipes . machines . entries . Input Entry Ċ import Ġme . ste ven . ind rev . recipes . machines . entries . Output Entry Ċ import Ġnet . minecraft . inventory . Inventory Ċ import Ġnet . minecraft . item . ItemStack Ċ import Ġnet . minecraft . network . Packet Byte Buf Ċ import Ġnet . minecraft . recipe . Ingredient Ċ import Ġnet . minecraft . recipe . Recipe Ċ import Ġnet . minecraft . recipe . Recipe Serializer Ċ import Ġnet . minecraft . util . Identifier Ċ import Ġnet . minecraft . util . Json Helper Ċ import Ġnet . minecraft . util . collection . Default edList Ċ import Ġnet . minecraft . util . registry . Registry Ċ import Ġnet . minecraft . world . World Ċ import Ġjava . util .* Ċ Ċ interface ĠIR Recipe Ġ: ĠRecipe < Inventory > Ġ{ ĊĠĠĠ Ġval Ġidentifier : ĠIdentifier ĊĠĠĠ Ġval Ġinput : ĠArray < Input Entry > ĊĠĠĠ Ġval Ġoutputs : ĠArray < Output Entry > ĊĠĠĠ Ġval Ġticks : ĠInt ĊĊĠĠĠ Ġoverride Ġfun ĠgetId (): ĠIdentifier Ġ= Ġidentifier ĊĊĠĠĠ Ġ@ Deprecated (" Unsupported Ġmethod Ġfor ĠInd ustrial ĠRe volution 's Ġrecipes ", Ġreplace With Ġ= ĠReplace With (" craft ( Random )"), ĠDeprec ation Level . ERROR ) ĊĠĠĠ Ġoverride Ġfun Ġcraft ( inv : ĠInventory ?): ĠItemStack Ġ= Ġthrow ĠIllegalArgumentException (" Unsupported Ġmethod Ġfor ĠInd ustrial ĠRe volution 's Ġrecipes ") ĊĠĠĠ Ġ@ Deprecated (" Unsupported Ġmethod Ġfor ĠInd ustrial ĠRe volution 's Ġrecipes ", Ġreplace With Ġ= ĠReplace With (" output "), ĠDeprec ation Level . ERROR ) ĊĠĠĠ Ġoverride Ġfun Ġget Output (): ĠItemStack Ġ= Ġoutputs . first OrNull ()?. stack Ġ?: ĠItemStack . EMPTY ĊĠĠĠ Ġ@ Deprecated (" Unsupported Ġmethod Ġfor ĠInd ustrial ĠRe volution 's Ġrecipes ", Ġreplace With Ġ= ĠReplace With (" input "), ĠDeprec ation Level . ERROR ) ĊĠĠĠ Ġoverride Ġfun Ġget Ing redients (): ĠDefault edList < Ingredient > Ġ= Ġthrow ĠIllegalArgumentException (" Unsupported Ġmethod Ġfor ĠInd ustrial ĠRe volution 's Ġrecipes ") ĊĠĠĠ Ġ@ Deprecated (" Unsupported Ġmethod Ġfor ĠInd ustrial ĠRe volution 's Ġrecipes ", Ġreplace With Ġ= ĠReplace With (" matches ( Inventory , ĠFluid Volume ?) "), ĠDeprec ation Level . ERROR ) ĊĠĠĠ Ġoverride Ġfun Ġmatches ( inv : ĠInventory ?, Ġworld : ĠWorld ?): ĠBoolean Ġ= Ġthrow ĠIllegalArgumentException (" Unsupported Ġmethod Ġfor ĠInd ustrial ĠRe volution 's Ġrecipes ") ĊĊĠĠĠ Ġoverride Ġfun ĠgetType (): ĠIR Recipe Type < *> ĊĊĠĠĠ Ġoverride Ġfun ĠisEmpty (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinput . isEmpty () Ġ|| Ġinput . any Ġ{ Ġentry Ġ-> Ġentry . ingredient . matching Stack s . isEmpty () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Ignored In Recipe Book (): ĠBoolean Ġ= Ġtrue ĊĊĠĠĠ Ġfun Ġcraft ( random : ĠRandom ?): ĠList < ItemStack > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproduced Ġ= ĠArrayList < ItemStack >( outputs . size ) ĊĠĠĠĠĠĠĠ Ġoutputs . forEach Ġ{ Ġ( stack , Ġchance ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( chance Ġ>= Ġ 1 . 0 Ġ|| Ġrandom Ġ!= Ġnull Ġ&& Ġrandom . next Double () Ġ> Ġchance ) Ġproduced . add ( stack . copy ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġproduced ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmatches ( inv : ĠList < ItemStack >, Ġfluid Volume : ĠFluid Volume ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( inv . isEmpty ()) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( inv . size Ġ== Ġ 1 Ġ&& Ġinput . size Ġ== Ġ 1 ) Ġreturn Ġmatches ( inv . first (), Ġfluid Volume ) ĊĠĠĠĠĠĠĠ Ġval Ġremainder Ġ= Ġinput . map Ġ{ Ġit . copy () Ġ}. let Ġ{ Ġit Ġas ? ĠArrayList < Input Entry > Ġ?: Ġit . to Mutable List () Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( stack Ġin Ġinv ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġremainder . first OrNull Ġ{ Ġ( ingredient , Ġcount ) Ġ-> Ġingredient . test ( stack ) Ġ&& Ġstack . count Ġ>= Ġcount Ġ} Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . count Ġ-= Ġstack . count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . count Ġ<= Ġ 0 ) Ġremainder . remove ( result ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġremainder . isEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmatches ( stack : ĠItemStack , Ġfluid Volume : ĠFluid Volume ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( input . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( ingredient , Ġcount ) Ġ= Ġinput . first () ĊĠĠĠĠĠĠĠ Ġif Ġ( ingredient . test ( stack ) Ġ&& Ġstack . count Ġ>= Ġcount ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġclass ĠIR Recipe Serializer < T Ġ: ĠIR Recipe >( private Ġval Ġfactory : Ġ( Identifier , ĠArray < Input Entry >, ĠArray < Output Entry >, ĠInt ) Ġ-> ĠT ) Ġ: ĠRecipe Serializer < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġread ( id : ĠIdentifier , Ġjson : ĠJsonObject ): ĠT Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġingredients Ġ= Ġingredients From Element ( json [" ingredients "]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġticks Ġ= Ġjson . get (" process Time "). as Int ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġitem Stack s From Element ( json [" output "]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfactory ( id , Ġingredients , Ġoutput , Ġticks ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġread ( id : ĠIdentifier , Ġbuf : ĠPacket Byte Buf ): ĠT Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġbuf . readInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġingredients Ġ= Ġmutable ListOf < Input Entry >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġsize ). forEach Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġingredient Ġ= ĠIng redient . from Packet ( buf ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġbuf . readInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġingredients . add ( Input Entry ( ingredient , Ġcount )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġticks Ġ= Ġbuf . readInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Size Ġ= Ġbuf . readInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġmutable ListOf < Output Entry >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġoutput Size ). forEach Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstack Ġ= Ġbuf . read ItemStack () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchance Ġ= Ġbuf . read Double () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . add ( Output Entry ( stack , Ġchance )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfactory ( id , Ġingredients . to Typed Array (), Ġoutput . to Typed Array (), Ġticks ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġwrite ( buf : ĠPacket Byte Buf , Ġrecipe : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . writeInt ( recipe . input . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecipe . input . forEach Ġ{ Ġ( ingredient , Ġcount ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġingredient . write ( buf ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . writeInt ( count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . writeInt ( recipe . ticks ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . writeInt ( recipe . outputs . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecipe . outputs . forEach Ġ{ Ġ( stack , Ġchance ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . write ItemStack ( stack ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . write Double ( chance ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġingredients From Element ( json Element : ĠJson Element ?): ĠArray < Input Entry > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( json Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJson Array Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson Element . map Ġ{ Ġingredient FromJson ( it . as JsonObject ) Ġ}. to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJsonObject Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ingredient FromJson ( json Element )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġreturn Ġempty Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" expected Ġjson Ġobject Ġor Ġarray Ġat Ġ' ingredients ', Ġreceived Ġ$ json Element ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġitem Stack s From Element ( json Element : ĠJson Element ?): ĠArray < Output Entry > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( json Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJson Array Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson Element . map Ġ{ Ġitem Stack FromJson ( it . as JsonObject ) !! Ġ}. sorted By Descending Ġ{ Ġit . chance Ġ}. to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJsonObject Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( item Stack FromJson ( json Element ) Ġ?: Ġreturn Ġempty Array ()). to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġreturn Ġempty Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" expected Ġjson Ġobject Ġor Ġarray Ġat Ġ' ingredients ', Ġreceived Ġ$ json Element ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġingredient FromJson ( json : ĠJsonObject ): ĠInput Entry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġing Ġ= ĠIng redient . fromJson ( json ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= ĠJson Helper . getInt ( json , Ġ" count ", Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠInput Entry ( ing , Ġcount ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġitem Stack FromJson ( json : ĠJsonObject ): ĠOutput Entry ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠitemId Ġ= Ġjson . get (" item "). asString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( itemId Ġ== Ġ" empty ") Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠRegistry . ITEM . get ( Identifier ( itemId )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= ĠItemStack Ġ{ Ġitem Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( output . isEmpty ) Ġprintln (" empty Ġ$ itemId ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . count Ġ= ĠJson Helper . getInt ( json , Ġ" count ", Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchance Ġ= ĠJson Helper . get Float ( json , Ġ" chance ", Ġ 1 f ). toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠOutput Entry ( output , Ġchance ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }