package Ġme . ste ven . ind rev . invent ories Ċ Ċ import Ġme . ste ven . ind rev . block entities . Machine Block Entity Ċ import Ġme . ste ven . ind rev . block entities . cr after s . Upgrade Provider Ċ import Ġme . ste ven . ind rev . components . Inventory Component Ċ import Ġme . ste ven . ind rev . items . misc . IR Cool er Item Ċ import Ġme . ste ven . ind rev . items . upgrade . IR Upgrade Item Ċ import Ġme . ste ven . ind rev . registry . IR Item Registry Ċ import Ġme . ste ven . ind rev . utils . EMPTY _ INT _ ARRAY Ċ import Ġme . ste ven . ind rev . utils . component 1 Ċ import Ġme . ste ven . ind rev . utils . component 2 Ċ import Ġnet . minecraft . item . ItemStack Ċ Ċ open Ġclass ĠFilter able Ġ{ ĊĠĠĠ Ġvar Ġfilters : ĠMutable Map < Int , Ġ( ItemStack ) Ġ-> ĠBoolean > Ġ= Ġhash Map Of () ĊĊĠĠĠ Ġin fix Ġfun ĠInt . filter ( filter : Ġ( ItemStack ) Ġ-> ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfilters [ this ] Ġ= Ġfilter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġin fix Ġfun ĠInt Range . filter ( filter : Ġ( ItemStack , ĠInt ) Ġ-> ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ ĠforEach Ġ{ Ġslot Ġ-> Ġfilters [ slot ] Ġ= Ġ{ Ġstack Ġ-> Ġfilter ( stack , Ġslot ) Ġ} Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ open Ġclass ĠIR Inventory DSL Ġ: ĠFilter able () Ġ{ ĊĠĠĠ Ġvar Ġbattery Slot : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġcool er Slot : ĠInt ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġinput : ĠFilter ed Slots Ġ= ĠFilter ed Slots . EMPTY _ FILTER ĊĠĠĠ Ġprivate Ġvar Ġoutput : ĠFilter ed Slots Ġ= ĠFilter ed Slots . EMPTY _ FILTER ĊĠĠĠ Ġvar Ġupgrade Slots : ĠInt Range ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġinput ( block : ĠFilter ed Slots . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinput Ġ= ĠFilter ed Slots () ĊĠĠĠĠĠĠĠ Ġblock ( input ) ĊĠĠĠĠĠĠĠ Ġinput . filters . forEach Ġ{ Ġ( key , Ġvalue ) Ġ-> Ġfilters [ key ] Ġ= Ġvalue Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġoutput ( block : ĠFilter ed Slots . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoutput Ġ= ĠFilter ed Slots () ĊĠĠĠĠĠĠĠ Ġblock ( output ) ĊĠĠĠĠĠĠĠ Ġoutput . filters . forEach Ġ{ Ġ( key , Ġvalue ) Ġ-> Ġfilters [ key ] Ġ= Ġvalue Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild ( block Entity : ĠMachine Block Entity < *> ): ĠIR Inventory Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsize Ġ= Ġinput . slots . plus ( output . slots ). plus ( filters . keys ). distinct (). size Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġif Ġ( co oler Slot Ġ== Ġnull Ġ&& Ġblock Entity . temperature Component Ġ!= Ġnull ) Ġcool er Slot Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġif Ġ( co oler Slot Ġ!= Ġnull ) Ġsize ++ ĊĠĠĠĠĠĠĠ Ġif Ġ( block Entity Ġis ĠUpgrade Provider ) Ġsize Ġ+= Ġblock Entity . upgrade Slots . size ĊĠĠĠĠĠĠĠ Ġreturn ĠIR Inventory ( this , Ġsize , Ġinput . slots , Ġoutput . slots ) Ġ{ Ġslot , Ġstack Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stack Ġ== Ġnull ) Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġfilters . compute If Absent ( slot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ(_, Ġitem ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġslot Ġ== Ġbattery Slot Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcool er Slot Ġ!= Ġnull Ġ&& Ġslot Ġ== Ġcool er Slot Ġ-> Ġitem Ġis ĠIRC ool er Item Ġ|| Ġitem Ġ== ĠIR Item Registry . HE AT _ CO IL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . slots . contains ( slot ) Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Entity Ġis ĠUpgrade Provider Ġ-> Ġitem Ġis ĠIR Upgrade Item Ġ&& Ġslot Ġin Ġblock Entity . upgrade Slots Ġ&& Ġ! block Entity . is Locked ( slot , Ġblock Entity . tier ) Ġ&& Ġblock Entity . available Upgrade s . contains ( item . upgrade ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ( stack ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠFilter ed Slots Ġ: ĠFilter able () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġslots : ĠInt Array Ġ= ĠEMPTY _ INT _ ARRAY ĊĠĠĠĠĠĠĠ Ġvar Ġslot : ĠInt ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġslots Ġ= Ġint ArrayOf ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġfilter ( filter : Ġ( ItemStack , ĠInt ) Ġ-> ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġslots . forEach Ġ{ Ġslot Ġ-> Ġfilters [ slot ] Ġ= Ġ{ Ġstack Ġ-> Ġfilter ( stack , Ġslot ) Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠEMPTY _ FILTER Ġ= ĠFilter ed Slots () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġinventory ( block Entity : ĠMachine Block Entity <* >, Ġblock : ĠIR Inventory DSL . () Ġ-> ĠUnit ): ĠInventory Component Ġ{ ĊĠĠĠ Ġval Ġd sl Ġ= ĠIR Inventory DSL () ĊĠĠĠ Ġblock ( dsl ) ĊĠĠĠ Ġval Ġinv Ġ= Ġd sl . build ( block Entity ) ĊĠĠĠ Ġreturn ĠInventory Component ( block Entity ) Ġ{ Ġinv Ġ} Ċ }