package Ġnet . cy dh ra . tech n ocracy . foundation . content . capabilities . fluid Ċ Ċ import Ġnet . cy dh ra . tech n ocracy . foundation . content . capabilities . Abstract Mutable Capability Handler Ċ import Ġnet . minecraft . nbt . NBT Tag Compound Ċ import Ġnet . minecraftforge . common . util . IN BT Serializable Ċ import Ġnet . minecraftforge . fluid s . Fluid Registry Ċ import Ġnet . minecraftforge . fluid s . Fluid Stack Ċ import Ġnet . minecraftforge . fluid s . capability . I Fluid Handler Ċ import Ġnet . minecraftforge . fluid s . capability . I Fluid Tank Properties Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . min Ċ Ċ /** Ċ Ġ* Ġ@ param Ġcapacity Ġfluid Ġstorage Ġcapacity Ċ Ġ* Ġ@ param Ġallowed Fluid Ġa Ġlist Ġof Ġfluid Ġnames Ġthat Ġare Ġallowed Ġto Ġstore , Ġempty Ġif Ġall Ġfluid s Ġare Ġallowed Ċ Ġ* Ġ@ param Ġtank type Ġwhether Ġinput , Ġoutput Ġor Ġboth Ġare Ġallowed Ċ Ġ*/ Ċ open Ġclass ĠDynamic Fluid Capability ( var Ġcapacity : ĠInt Ġ= Ġ 1 0 0 0 , Ġval Ġallowed Fluid : ĠMutable List < String > Ġ= Ġmutable ListOf (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtank type : ĠT ank Type Ġ= ĠT ank Type . BOTH ) Ġ: ĊĠĠĠĠĠĠĠ ĠI Fluid Handler , ĠIN BT Serializable < NBT Tag Compound >, ĠAbstract Mutable Capability Handler () Ġ{ ĊĊĠĠĠ Ġvar Ġcurrent Fluid : ĠFluid Stack ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġval Ġsimple Tank Property Ġ= ĠarrayOf < I Fluid Tank Properties >( Simple Tank Property ( this )) ĊĊĠĠĠ Ġ// Threshold Ġin Ġpercent Ġthat Ġis Ġneeded Ġfor Ġthe Ġte Ġto Ġsend Ġan Ġupdate Ġto Ġthe Ġclient ĊĠĠĠ Ġvar Ġfluid Change Threshold Ġ= Ġ- 1 f ĊĠĠĠ Ġ// The Ġlast Ġamount Ġof Ġfluid Ġthat Ġwas Ġsynced Ġwith Ġthe Ġclient ĊĠĠĠ Ġprivate Ġvar Ġlast Updated Fluid Value Ġ= Ġ- 1 ĊĊĠĠĠ Ġoverride Ġfun Ġdrain ( resource : ĠFluid Stack , Ġdo Dr ain : ĠBoolean ): ĠFluid Stack ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġlast Fluid Ġ= Ġcurrent Fluid ĊĊĠĠĠĠĠĠĠ Ġif Ġ( current Fluid Ġ== Ġnull Ġ|| Ġ! current Fluid !!. is Fluid Equal ( resource )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdrain Ġ= Ġmin ( resource . amount , Ġcurrent Fluid !!. amount ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( do Dr ain ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Fluid !!. amount Ġ-= Ġdrain ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠFluid Stack ( current Fluid !!. fluid , Ġdrain ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( current Fluid !!. amount Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Fluid Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( do Dr ain ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmark Dirty ( current Fluid Ġ!= Ġlast Fluid ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġout ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdrain ( max Dr ain : ĠInt , Ġdo Dr ain : ĠBoolean ): ĠFluid Stack ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlast Fluid Ġ= Ġcurrent Fluid ĊĊĠĠĠĠĠĠĠ Ġif Ġ( current Fluid Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġdrain Ġ= Ġmin ( max Dr ain , Ġcurrent Fluid !!. amount ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( do Dr ain ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Fluid !!. amount Ġ-= Ġdrain ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠFluid Stack ( current Fluid !!. fluid , Ġdrain ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( current Fluid !!. amount Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Fluid Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( do Dr ain ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmark Dirty ( current Fluid Ġ!= Ġlast Fluid ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġout ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Fluid ( resource : ĠFluid Stack ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Fluid Ġ= ĠFluid Stack ( resource . fluid , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfill Ġ= Ġmin ( resource . amount , Ġcapacity ) ĊĊĠĠĠĠĠĠĠ Ġcurrent Fluid !!. amount Ġ= Ġfill ĊĊĠĠĠĠĠĠĠ Ġmark Dirty ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfill ( resource : ĠFluid Stack , Ġdo Fill : ĠBoolean ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlast Fluid Ġ= Ġcurrent Fluid ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! allowed Fluid . contains ( resource . fluid . name ) Ġ&& Ġ! allowed Fluid . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( current Fluid Ġ!= Ġnull Ġ&& Ġ! current Fluid !!. is Fluid Equal ( resource )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġif Ġ( do Fill ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Fluid Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Fluid Ġ= ĠFluid Stack ( resource . fluid , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfill Ġ= Ġmin ( resource . amount , Ġcapacity Ġ- Ġcurrent Fluid !!. amount ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Fluid !!. amount Ġ+= Ġfill ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmark Dirty ( current Fluid Ġ!= Ġlast Fluid ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfill ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Fluid Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmin ( resource . amount , Ġcapacity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmin ( resource . amount , Ġcapacity Ġ- Ġcurrent Fluid !!. amount ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmark Dirty ( needs Client R er ender : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( fluid Change Threshold Ġ!= Ġ- 1 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Fluid Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Updated Fluid Value Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchange Ġ= Ġabs ( current Fluid !!. amount Ġ- Ġlast Updated Fluid Value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpercentage Ġ= Ġabs ( change Ġ/ Ġcapacity . toFloat ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( percentage Ġ>= Ġfluid Change Threshold Ġ/ Ġ 1 0 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Updated Fluid Value Ġ= Ġcurrent Fluid !!. amount ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . mark Dirty ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuper . mark Dirty ( needs Client R er ender ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Tank Properties (): ĠArray < I Fluid Tank Properties > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsimple Tank Property ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdeserialize NBT ( nbt : ĠN BT Tag Compound ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Fluid Ġ= ĠFluid Stack . load Fluid Stack From NBT ( nbt ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġserialize NBT (): ĠN BT Tag Compound Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtag Ġ= ĠN BT Tag Compound () ĊĠĠĠĠĠĠĠ Ġtag . set Integer (" Amount ", Ġthis . current Fluid ?. amount Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġtag . set Integer (" Capacity ", Ġthis . capacity ) ĊĠĠĠĠĠĠĠ Ġtag . setString (" Fluid Name ", Ġif Ġ( current Fluid Ġ!= Ġnull ) ĠFluid Registry . get Fluid Name ( this . current Fluid ) Ġelse Ġ"") ĊĠĠĠĠĠĠĠ Ġreturn Ġtag ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠT ank Type Ġ{ ĊĠĠĠĠĠĠĠ ĠINPUT , ĠOUTPUT , ĠBOT H ĊĠĠĠ Ġ} Ċ }