package Ġnet . nd rei . tes lac ore lib . inventory Ċ Ċ import Ġcom . google . common . collect . Lists Ċ import Ġnet . minecraft . item . Enum D ye Color Ċ import Ġnet . minecraft . item . ItemStack Ċ import Ġnet . minecraft . nbt . NBT Tag Compound Ċ import Ġnet . minecraft . nbt . NBT Tag List Ċ import Ġnet . minecraftforge . common . util . Constants Ċ import Ġnet . minecraftforge . common . util . IN BT Serializable Ċ import Ġnet . minecraftforge . fluid s . Fluid Ċ import Ġnet . minecraftforge . fluid s . Fluid Stack Ċ import Ġnet . minecraftforge . fluid s . I Fluid Tank Ċ import Ġnet . minecraftforge . fluid s . capability . Fluid Tank Properties Ċ import Ġnet . minecraftforge . fluid s . capability . I Fluid Handler Ċ import Ġnet . minecraftforge . fluid s . capability . I Fluid Tank Properties Ċ import Ġnet . nd rei . tes lac ore lib . Tes la Core Lib Ċ import Ġnet . nd rei . tes lac ore lib . utils . can Fill From Ċ import Ġnet . nd rei . tes lac ore lib . utils . fill From Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠCF Ġon Ġ 2 0 1 7 - 0 6 - 2 8 . Ċ Ġ*/ Ċ open Ġclass ĠFluid Storage Ġ: ĠI Fluid Handler , ĠIN BT Serializable < NBT Tag Compound > Ġ{ ĊĠĠĠ Ġprotected Ġval Ġt anks : ĠMutable List < I Fluid Tank > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġ// # region ĠI Fluid Handler ĠMethods ĊĊĠĠĠ Ġoverride Ġfun Ġget Tank Properties (): ĠArray < I Fluid Tank Properties > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= ĠLists . newArrayList < I Fluid Tank Properties >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( tank Ġin Ġthis . t anks ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcan Dr ain Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcan Fill Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tank Ġis ĠI Filtered Fluid Tank ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcan Dr ain Ġ= Ġtank . can Dr ain () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcan Fill Ġ= Ġtank . can Fill () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( Fluid Tank Properties ( tank . fluid , Ġtank . capacity , Ġcan Fill , Ġcan Dr ain )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlist . to Typed Array () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfill ( resource : ĠFluid Stack ?, Ġdo Fill : ĠBoolean ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( resource Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsource Ġ= Ġresource . copy () ĊĠĠĠĠĠĠĠ Ġvar Ġused Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( tank Ġin Ġthis . t anks ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tank Ġis ĠI Filtered Fluid Tank ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! tank . can Fill () Ġ|| Ġ! tank . accept s Fluid ( source )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġamount Ġ= Ġtank . fill ( source , Ġdo Fill ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġused Ġ+= ĠMath . min ( amount , Ġsource . amount ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( source . amount Ġ<= Ġamount ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource . amount Ġ-= Ġamount ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠTes la Core Lib . logger . info (" Tank Ġfilled Ġwith Ġ" Ġ+ Ġused Ġ+ Ġ" Ġmb Ġof Ġ" Ġ+ Ġsource . get Fluid (). getName ()); ĊĠĠĠĠĠĠĠ Ġreturn Ġused ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdrain ( resource : ĠFluid Stack ?, Ġdo Dr ain : ĠBoolean ): ĠFluid Stack ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( resource Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis . drain ( resource . amount , Ġdo Dr ain , Ġresource ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdrain ( max Dr ain : ĠInt , Ġdo Dr ain : ĠBoolean ): ĠFluid Stack ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . drain ( max Dr ain , Ġdo Dr ain , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdrain ( max Dr ain : ĠInt , Ġdo Dr ain : ĠBoolean , Ġfilter : ĠFluid Stack ?): ĠFluid Stack ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Filter Ġ= Ġfilter ĊĠĠĠĠĠĠĠ Ġvar Ġfluid : ĠFluid Stack ? Ġ= Ġif Ġ( current Filter Ġ== Ġnull ) Ġnull Ġelse Ġcurrent Filter . copy () ĊĠĠĠĠĠĠĠ Ġif Ġ( fluid Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfluid . amount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( tank Ġin Ġthis . t anks ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tank Ġis ĠI Filtered Fluid Tank ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! tank . can Dr ain ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontained Ġ= Ġtank . fluid Ġ?: Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Filter Ġ!= Ġnull Ġ&& Ġ! contained . is Fluid Equal ( current Filter )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdr ained Ġ= Ġtank . drain ( max Dr ain Ġ- Ġ( if Ġ( fluid Ġ== Ġnull ) Ġ 0 Ġelse Ġfluid . amount ), Ġdo Dr ain ) Ġ?: Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fluid Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfluid Ġ= Ġdr ained . copy () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Filter Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmake Ġsure Ġwe Ġare Ġnot Ġextracting Ġdifferent Ġfluid s Ġfrom Ġother Ġt anks ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Filter Ġ= Ġfluid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfluid . amount Ġ+= Ġdr ained . amount ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( fluid Ġ!= Ġnull ) Ġ&& Ġ( fluid . amount Ġ>= Ġmax Dr ain )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( fluid Ġ!= Ġnull Ġ&& Ġfluid . amount Ġ== Ġ 0 ) Ġnull Ġelse Ġfluid Ġ// ĠTODO : ĠFluid Stack . EMPTY Ġ?? ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// # endregion ĊĊĠĠĠ Ġfun Ġget T anks (): ĠArray < I Fluid Tank > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . t anks . to Typed Array () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Tank ( tank : ĠI Fluid Tank ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . t anks . add ( tank ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" unused ") ĊĠĠĠ Ġfun Ġadd Tank ( accepted Fluid : ĠFluid , Ġcapacity : ĠInt ): ĠFilter ed Fluid Tank Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtank Ġ= ĠFilter ed Fluid Tank ( accepted Fluid , ĠFluid Tank ( capacity )) ĊĠĠĠĠĠĠĠ Ġthis . add Tank ( tank ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtank ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Tank ( accepted Fluid : ĠFluid , Ġtank : ĠI Fluid Tank , Ġcolor : ĠEnum D ye Color , Ġname : ĠString , Ġbounding Box : ĠBounding Rectangle ): ĠCo lo red Fluid Handler Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcolored Ġ= ĠCo lo red Fluid Handler ( accepted Fluid , Ġtank , Ġcolor , Ġname , Ġbounding Box ) ĊĠĠĠĠĠĠĠ Ġthis . add Tank ( colored ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcolored ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Tank ( tank : ĠI Fluid Tank ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . t anks . remove If Ġ{ Ġt Ġ-> ĠFluid Storage . is Same Tank ( tank , Ġt ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġserialize NBT (): ĠN BT Tag Compound Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġn bt Ġ= ĠN BT Tag Compound () ĊĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= ĠN BT Tag List () ĊĠĠĠĠĠĠĠ Ġfor Ġ( raw Tank Ġin Ġthis . t anks ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtank Ġ= Ġ( raw Tank Ġas ? ĠFilter ed Fluid Tank )?. inner Tank Ġ?: Ġraw Tank ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtank N bt : ĠN BT Tag Compound ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tank Ġis ĠI Serializable Fluid Tank ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtank N bt Ġ= Ġtank . serialize NBT () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtank N bt Ġ= ĠN BT Tag Compound () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfluid Ġ= Ġtank . fluid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fluid Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfluid . writeTo NBT ( tank N bt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtank N bt . set Boolean ("_ empty ", Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . append Tag ( tank N bt ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġn bt . setTag (" t anks ", Ġlist ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġn bt ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdeserialize NBT ( nbt : ĠN BT Tag Compound ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist : ĠN BT Tag List ? Ġ= Ġif Ġ( nbt . has Key (" t anks ", ĠConstants . NBT . TAG _ LIST )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn bt . getTag List (" t anks ", ĠConstants . NBT . TAG _ COMP O UND ) Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( list Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( index Ġ< Ġlist . tag Count () Ġ&& Ġindex Ġ< Ġthis . t anks . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtank Ġ= Ġthis . t anks [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tank Ġis ĠFilter ed Fluid Tank ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtank Ġ= Ġtank . inner Tank ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtank N bt Ġ= Ġlist . get Compound Tag At ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tank Ġis ĠI Serializable Fluid Tank ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtank . deserialize NBT ( tank N bt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfluid : ĠFluid Stack ? Ġ= Ġif Ġ( tank N bt . has Key ("_ empty ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFluid Stack . load Fluid Stack From NBT ( tank N bt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tank . fluid Amount Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdrain Ġthe Ġtank ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtank . drain ( tank . fluid Amount , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fluid Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfilled Ġ= Ġtank . fill ( fluid , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( filled Ġ!= Ġfluid . amount ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTes la Core Lib . logger . warn (" Fluid Tank Ġdeserialized Ġfluid Ġwasn 't Ġtotally Ġput Ġinto Ġtank : Ġ" Ġ+ Ġfluid . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtank Count () Ġ= Ġthis . t anks . size ĊĊĠĠĠ Ġfun Ġaccepts Fluid From ( bucket : ĠItemStack ) Ġ= Ġthis . t anks . can Fill From ( bucket ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠBoolean Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġif Ġ(! bucket . isEmpty Ġ&& Ġbucket . has Capability ( Capability Fluid Handler . FL UID _ HANDLER _ ITEM _ CAP ABILITY , Ġnull )) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= Ġbucket . get Capability ( Capability Fluid Handler . FL UID _ HANDLER _ ITEM _ CAP ABILITY , Ġnull ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfluid Ġ= Ġhandler ?. drain ( 1 0 0 0 , Ġfalse ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fluid Ġ!= Ġnull Ġ&& Ġfluid . amount Ġ> Ġ 0 ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 1 0 0 0 Ġ== Ġthis . fill ( fluid , Ġfalse ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġfalse Ċ // ĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" unused ") ĊĠĠĠ Ġfun Ġfill Fluid From ( bucket : ĠItemStack ): ĠItemStack Ġ= Ġthis . t anks . fill From ( bucket ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠItemStack Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġif Ġ(! ItemStack Util . isEmpty ( bucket ) Ġ&& Ġbucket . has Capability ( Capability Fluid Handler . FL UID _ HANDLER _ ITEM _ CAP ABILITY , Ġnull )) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclone Ġ= Ġbucket . copy () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= Ġclone . get Capability ( Capability Fluid Handler . FL UID _ HANDLER _ ITEM _ CAP ABILITY , Ġnull ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfluid Ġ= Ġhandler ?. drain ( Fluid . BUCKET _ VOLUME , Ġfalse ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fluid Ġ!= Ġnull Ġ&& Ġfluid . amount Ġ== ĠFluid . BUCKET _ VOLUME ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfilled Ġ= Ġthis . fill ( fluid , Ġfalse ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( filled Ġ== ĠFluid . BUCKET _ VOLUME ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . fill ( fluid , Ġtrue ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . drain ( filled , Ġtrue ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhandler . container Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġbucket Ċ // ĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġis Same Tank ( a : ĠI Fluid Tank ?, Ġb : ĠI Fluid Tank ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( a Ġ== Ġb ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( a Ġ!= Ġnull Ġ&& Ġb Ġ!= Ġnull Ġ&& Ġb Ġis ĠI Fluid Tank Wrapper ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFluid Storage . is Same Tank ( a , Ġ( b Ġas ĠI Fluid Tank Wrapper ). inner Tank ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ