package Ġal 1 3 2 . al che mistry . recipes Ċ Ċ import Ġal 1 3 2 . al che mistry . utils . are Stack s Equal Ignore Quantity Ċ import Ġal 1 3 2 . alib . utils . extensions . to Immutable Ċ import Ġcom . google . common . collect . ImmutableList Ċ import Ġnet . minecraft . item . ItemStack Ċ import Ġjava . util .* ĊĊ Ċ data Ġclass ĠProb ability Group ( private Ġval Ġ_ output : ĠList < ItemStack >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprobability : ĠDouble Ġ= Ġ 1 . 0 ) Ġ{ ĊĊĠĠĠ Ġval Ġoutput : ĠList < ItemStack > ĊĠĠĠĠĠĠĠ Ġget (): ĠList < ItemStack > Ġ= Ġ_ output . to Immutable () Ċ } ĊĊ Ċ data Ġclass ĠProb ability Set ( private Ġvar Ġ_ set : ĠList < Probability Group >? Ġ= ĠArrayList (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrelative Probability : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroll s : ĠInt Ġ= Ġ 1 ) Ġ{ ĊĊĠĠĠ Ġval Ġset : ĠImmutableList < Probability Group > ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠImmutableList . copyOf (_ set ) ĊĊĊĠĠĠ Ġfun Ġto Stack List (): ĠList < ItemStack > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtemp Ġ= ĠImmutableList . Builder < ImmutableList < ItemStack >>() ĊĠĠĠĠĠĠĠ Ġset . forEach Ġ{ Ġtemp . add ( ImmutableList . copyOf ( it . output )) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtemp . build (). flatten (). to Immutable () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġprobability AtIndex ( index : ĠInt ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( relative Probability ) Ġreturn Ġ( set [ index ]. probability Ġ/ Ġset . sum By Double Ġ{ Ġit . probability Ġ}) ĊĠĠĠĠĠĠĠ Ġelse Ġreturn Ġset [ index ]. probability ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġcalculate Output (): ĠList < ItemStack > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtemp Ġ= ĠArrayList < ItemStack >() ĊĠĠĠĠĠĠĠ Ġval Ġr ando Ġ= ĠRandom () ĊĠĠĠĠĠĠĠ Ġ( 1 .. roll s ). forEach Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( relative Probability ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Probability Ġ= Ġset . sum By Double Ġ{ Ġit . probability Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Probability Ġ= Ġr ando . next Double () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtracking Probability Ġ= Ġ 0 . 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( component Ġin Ġset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracking Probability Ġ+= Ġ( component . probability Ġ/ Ġtotal Probability ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tracking Probability Ġ>= Ġtarget Probability ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent . output . filter Not Ġ{ Ġit . isEmpty Ġ}. forEach Ġ{ Ġx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstack : ĠItemStack Ġ= Ġx . copy () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġtemp . indexOf First Ġ{ Ġstack . are Stack s Equal Ignore Quantity ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ!= Ġ- 1 ) Ġtemp [ index ]. grow ( stack . count )// stack . count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġtemp . add ( stack ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ġ// absolute Ġprobability ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( component Ġin Ġset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( component . probability Ġ>= Ġr ando . nextInt ( 1 0 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent . output . filter Not Ġ{ Ġit . isEmpty Ġ}. forEach Ġ{ Ġx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstack : ĠItemStack Ġ= Ġx . copy () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġtemp . indexOf First Ġ{ Ġstack . are Stack s Equal Ignore Quantity ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ!= Ġ- 1 ) Ġtemp [ index ]. grow ( stack . count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġtemp . add ( stack ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtemp ĊĠĠĠ Ġ} Ċ }