@ file : Suppress (" Replace Get Or Set ") Ċ Ċ package Ġflavor . pie . pie conom y Ċ Ċ import Ġcom . google . common . collect . Immutable Map Ċ import Ġflavor . pie . kl udge .* Ċ import Ġorg . spongepowered . api . event . cause . Cause Ċ import Ġorg . spongepowered . api . item . inventory . ItemStack Ċ import Ġorg . spongepowered . api . item . inventory . Slot Ċ import Ġorg . spongepowered . api . service . context . Context Ċ import Ġorg . spongepowered . api . service . econom y . Currency Ċ import Ġorg . spongepowered . api . service . econom y . E conom y Service Ċ import Ġorg . spongepowered . api . service . econom y . account . Account Ċ import Ġorg . spongepowered . api . service . econom y . account . Unique Account Ċ import Ġorg . spongepowered . api . service . econom y . transaction . Result Type Ċ import Ġorg . spongepowered . api . service . econom y . transaction . Transaction Result Ċ import Ġorg . spongepowered . api . service . econom y . transaction . Transaction Types Ċ import Ġorg . spongepowered . api . service . econom y . transaction . Transfer Result Ċ import Ġorg . spongepowered . api . text . Text Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . math . Round ingMode Ċ import Ġjava . util . UUID Ċ Ċ class ĠP ie conom y Player Account ( val Ġid : ĠUUID ) Ġ: ĠP ie conom y Account , ĠUnique Account Ġ{ ĊĠĠĠ Ġval Ġconfig Ġget () Ġ= ĠP ie conom y . instance . config ĊĊĠĠĠ Ġoverride Ġfun Ġget Identifier (): ĠString Ġ= Ġid . toString () ĊĊĠĠĠ Ġoverride Ġfun Ġhas Balance ( currency : ĠCurrency , Ġcontexts : ĠSet < Context >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġid . player () Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġp . storage Inventory . get (* config . items . filter Ġ{ Ġ(_, Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . currency Ġ== Ġcurrency ĊĠĠĠĠĠĠĠ Ġ}. keys . map ( Item Variant :: to Item ). to Typed Array ()). peek (). isPresent ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreset Balances ( cause : ĠCause , Ġcontexts : ĠSet < Context >, Ġfire Event : ĠBoolean ): ĠMap < Currency , ĠTransaction Result > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsvc : ĠEconom y Service Ġby ĠUn checked Service ĊĠĠĠĠĠĠĠ Ġreturn Ġsvc . currencies . map Ġ{ Ġit Ġto Ġreset Balance ( it , Ġcause , Ġcontexts , Ġfire Event ) Ġ}. toMap () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Balance ( currency : ĠCurrency , Ġcontexts : ĠSet < Context >): ĠBigDecimal Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġid . player () Ġ?: Ġreturn ĠBigDecimal . ZERO ĊĠĠĠĠĠĠĠ Ġreturn Ġp . storage Inventory . get (* config . items . filter Ġ{ Ġ(_, Ġvalue ) Ġ-> Ġvalue . currency Ġ== Ġcurrency Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. keys . map ( Item Variant :: to Item ). to Typed Array ()). slots ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . peek (). get (). let Ġ{ Ġconfig . items [ it . type , Ġit . data ] !!. amount Ġ* ĠBigDecimal ( it . quantity ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold ( BigDecimal . ZERO , ĠBigDecimal :: add ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Balances ( contexts : ĠSet < Context >): ĠMap < Currency , ĠBigDecimal > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsvc : ĠEconom y Service Ġby ĠUn checked Service ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠImmutableMap . builder < Currency , ĠBigDecimal >() ĊĠĠĠĠĠĠĠ Ġsvc . currencies . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Balance ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . put ( it , Ġget Balance ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget DisplayName (): ĠText Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplayer Ġ= Ġid . player () Ġ?: Ġreturn Ġ! id . toString () ĊĠĠĠĠĠĠĠ Ġreturn Ġ! player . name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget UniqueId (): ĠUUID Ġ= Ġid ĊĊĠĠĠ Ġoverride Ġfun Ġtransfer ( to : ĠAccount , Ġcurrency : ĠCurrency , Ġamount : ĠBigDecimal , Ġcause : ĠCause , Ġcontexts : ĠSet < Context >, Ġfire Event : ĠBoolean ): ĠTransfer Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġ( to Ġas ? ĠP ie conom y Account )?. deposit ( currency , Ġamount , Ġcause , Ġcontexts , Ġfalse ) Ġ?: Ġto . deposit ( currency , Ġamount , Ġcause , Ġcontexts ) ĊĠĠĠĠĠĠĠ Ġif Ġ( res . result Ġ!= ĠResult Type . SUCCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠP ie conom y Transfer Result ( this , Ġamount , Ġcontexts , Ġcurrency , Ġres . result , Ġto , Ġfalse ). also Ġ{ Ġif Ġ( fire Event ) Ġpost ( it , Ġcause ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġres 2 Ġ= Ġwithdraw ( currency , Ġamount , Ġcause , Ġcontexts , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġif Ġ( res 2 . result Ġ!= ĠResult Type . SUCCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto . withdraw ( currency , Ġamount , Ġcause , Ġcontexts ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠP ie conom y Transfer Result ( this , Ġamount , Ġcontexts , Ġcurrency , Ġres 2 . result , Ġto , Ġtrue ). also Ġ{ Ġif Ġ( fire Event ) Ġpost ( it , Ġcause ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠP ie conom y Transfer Result ( this , Ġamount , Ġcontexts , Ġcurrency , ĠResult Type . SUCCESS , Ġto , Ġfalse ). also Ġ{ Ġif Ġ( fire Event ) Ġpost ( it , Ġcause ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetDefault Balance ( currency : ĠCurrency ): ĠBigDecimal Ġ= ĠBigDecimal . ZERO ĊĊĠĠĠ Ġoverride Ġfun Ġreset Balance ( currency : ĠCurrency , Ġcause : ĠCause , Ġcontexts : ĠSet < Context >, Ġfire Event : ĠBoolean ): ĠTransaction Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġid . player () Ġ?: Ġreturn ĠP ie conom y Transaction Result ( this , ĠBigDecimal . ZERO , Ġcontexts , Ġcurrency , ĠResult Type . FAILED , ĠTransaction Types . WITH DRAW ). also Ġ{ Ġif Ġ( fire Event ) Ġpost ( it , Ġcause ) Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġnum Ġ= ĠBigDecimal . ZERO ĊĠĠĠĠĠĠĠ Ġconfig . items . filter Ġ{ Ġ(_, Ġvalue ) Ġ-> Ġvalue . currency Ġ== Ġcurrency Ġ}. forEach Ġ{ Ġ( type , Ġ_) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . storage Inventory [ type . to Item ()]. slots < Slot >(). forEach Ġ{ Ġit . poll (). if Present Ġ{ Ġnum Ġ+= ĠBigDecimal ( it . quantity ) Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠP ie conom y Transaction Result ( this , Ġnum , Ġcontexts , Ġcurrency , ĠResult Type . SUCCESS , ĠTransaction Types . WITH DRAW ). also Ġ{ Ġif Ġ( fire Event ) Ġpost ( it , Ġcause ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdeposit ( currency : ĠCurrency , Ġamount : ĠBigDecimal , Ġcause : ĠCause , Ġcontexts : ĠSet < Context >, Ġfire Event : ĠBoolean ): ĠTransaction Result Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( amount Ġ< ĠBigDecimal . ZERO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" amount Ġcannot Ġbe Ġnegative ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġid . player () Ġ?: Ġreturn ĠP ie conom y Transaction Result ( this , Ġamount , Ġcontexts , Ġcurrency , ĠResult Type . FAILED , ĠTransaction Types . DE POSIT ). also Ġ{ Ġif Ġ( fire Event ) Ġpost ( it , Ġcause ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġitems Ġ= Ġconfig . items . filter Ġ{ Ġ(_, Ġvalue ) Ġ-> Ġvalue . currency Ġ== Ġcurrency Ġ}. map Values Ġ{ Ġit . value . amount Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġit . to Sorted Map ( Comparator . comp aring < Item Variant , ĠBigDecimal > Ġ{ Ġv Ġ-> Ġit [ v ] Ġ}. reversed ()) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmin Ġ= Ġitems [ items . last Key ()] !! ĊĠĠĠĠĠĠĠ Ġvar Ġleft Ġ= Ġamount ĊĠĠĠĠĠĠĠ Ġval Ġinserted : ĠMutable List < ItemStack > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġloop @ for Ġ(( item , Ġvalue ) Ġin Ġitems ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( left Ġ>= Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġused Ġ= Ġmin Of ( item . type . max Stack Quantity , Ġleft . divide ( value , ĠRound ingMode . DOWN ). toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Insert Ġ= ĠItemStack . of ( item . type , Ġused ). with Data ( item . data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġp . storage Inventory . offer ( to Insert ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Insert . quantity Ġ= Ġused Ġ- Ġto Insert . quantity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġ-= Ġvalue Ġ* ĠBigDecimal ( to Insert . quantity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinserted Ġ+= Ġto Insert ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! res . rejected Items . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue @ loop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Ġ< Ġmin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( left Ġ>= Ġmin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( insert Ġin Ġinserted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . storage Inventory [ insert ]. poll ( insert . quantity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠP ie conom y Transaction Result ( this , Ġamount , Ġcontexts , Ġcurrency , ĠResult Type . ACCOUNT _ NO _ SPACE , ĠTransaction Types . DE POSIT ). also Ġ{ Ġif Ġ( fire Event ) Ġpost ( it , Ġcause ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġlist ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġinserted Ġ+= Ġitem Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquantity Ġ= Ġitem . quantity Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġp . storage Inventory . offer ( item ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġitem . quantity Ġ= Ġquantity Ġ- Ġitem . quantity Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! res . rejected Items . isEmpty ()) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( insert Ġin Ġinserted ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . storage Inventory . query Any < Inventory >( insert ). poll ( insert . quantity ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠP ie conom y Transaction Result ( this , Ġamount , Ġcontexts , Ġcurrency , ĠResult Type . ACCOUNT _ NO _ SPACE , ĠTransaction Types . DE POSIT ). also Ġ{ Ġif Ġ( fire Event ) Ġpost ( it , Ġcause ) Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠP ie conom y Transaction Result ( this , Ġamount , Ġcontexts , Ġcurrency , ĠResult Type . SUCCESS , ĠTransaction Types . DE POSIT ). also Ġ{ Ġif Ġ( fire Event ) Ġpost ( it , Ġcause ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġwithdraw ( currency : ĠCurrency , Ġamount : ĠBigDecimal , Ġcause : ĠCause , Ġcontexts : ĠSet < Context >, Ġfire Event : ĠBoolean ): ĠTransaction Result Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( amount Ġ< ĠBigDecimal . ZERO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" amount Ġcannot Ġbe Ġnegative ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġid . player () Ġ?: Ġreturn ĠP ie conom y Transaction Result ( this , Ġamount , Ġcontexts , Ġcurrency , ĠResult Type . FAILED , ĠTransaction Types . WITH DRAW ). also Ġ{ Ġif Ġ( fire Event ) Ġpost ( it , Ġcause ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġitems Ġ= Ġconfig . items . filter Ġ{ Ġ(_, Ġvalue ) Ġ-> Ġvalue . currency Ġ== Ġcurrency Ġ}. map Values Ġ{ Ġit . value . amount Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġit . to Sorted Map ( Comparator . comp aring < Item Variant , ĠBigDecimal > Ġ{ Ġv Ġ-> Ġit [ v ] Ġ}. reversed ()) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmin Ġ= Ġitems [ items . last Key ()] !! ĊĠĠĠĠĠĠĠ Ġif Ġ( amount Ġ- Ġget Balance ( currency , Ġcontexts ) Ġ> Ġmin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠP ie conom y Transaction Result ( this , Ġamount , Ġcontexts , Ġcurrency , ĠResult Type . ACCOUNT _ NO _ FUN DS , ĠTransaction Types . WITH DRAW ). also Ġ{ Ġif Ġ( fire Event ) Ġpost ( it , Ġcause ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġleft Ġ= Ġamount ĊĠĠĠĠĠĠĠ Ġval Ġremoved Ġ= ĠArrayList < ItemStack >() ĊĠĠĠĠĠĠĠ Ġfor Ġ(( item , Ġvalue ) Ġin Ġitems ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ> Ġleft ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġp . storage Inventory [ item . to Item ()] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġavailable Ġ= Ġmin Of (( left Ġ/ Ġvalue ). toInt (), Ġquery . total Items ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġused Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( used Ġ< Ġavailable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpol led Ġ= Ġquery . poll ( min Of ( item . type . max Stack Quantity , Ġavailable )). get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pol led . quantity Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġused Ġ+= Ġpol led . quantity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremoved Ġ+= Ġpol led ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġ-= ĠBigDecimal ( used ) Ġ* Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Ġ< Ġmin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( left Ġ>= Ġmin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreversed Ġ= Ġitems . keys . reversed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġitem : ĠItemStack ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( type Ġin Ġreversed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremoved Item Ġ= Ġ! p . storage Inventory [ type . to Item ()]. poll ( 1 ) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Price Ġ= Ġitems [ type ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchange Ġ= Ġitem Price Ġ- Ġleft ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġdeposit ( currency , Ġchange , Ġcause , Ġcontexts ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( res . result Ġ== ĠResult Type . SUCCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Ġ= Ġremoved Item ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . storage Inventory . offer ( removed Item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremoved . forEach Ġ{ Ġp . storage Inventory . offer ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠP ie conom y Transaction Result ( this , Ġamount , Ġcontexts , Ġcurrency , ĠResult Type . ACCOUNT _ NO _ SPACE , ĠTransaction Types . WITH DRAW ). also Ġ{ Ġif Ġ( fire Event ) Ġpost ( it , Ġcause ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠP ie conom y Transaction Result ( this , Ġamount , Ġcontexts , Ġcurrency , ĠResult Type . SUCCESS , ĠTransaction Types . WITH DRAW ). also Ġ{ Ġif Ġ( fire Event ) Ġpost ( it , Ġcause ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Active Contexts (): ĠSet < Context > Ġ= Ġset Of () ĊĊĠĠĠ Ġoverride Ġfun Ġset Balance ( currency : ĠCurrency , Ġamount : ĠBigDecimal , Ġcause : ĠCause , Ġcontexts : ĠSet < Context >, Ġfire Event : ĠBoolean ): ĠTransaction Result Ġ{ ĊĠĠĠĠĠĠĠ Ġid . player () Ġ?: Ġreturn ĠP ie conom y Transaction Result ( this , ĠBigDecimal . ZERO , Ġcontexts , Ġcurrency , ĠResult Type . FAILED , ĠTransaction Types . DE POSIT ). also Ġ{ Ġif Ġ( fire Event ) Ġpost ( it , Ġcause ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġitems Ġ= Ġconfig . items . filter Ġ{ Ġ(_, Ġvalue ) Ġ-> Ġvalue . currency Ġ== Ġcurrency Ġ}. map Values Ġ{ Ġit . value . amount Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġit . to Sorted Map ( Comparator . comp aring < Item Variant , ĠBigDecimal > Ġ{ Ġv Ġ-> Ġit [ v ] Ġ}. reversed ()) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmin Ġ= Ġitems [ items . last Key ()] !! ĊĠĠĠĠĠĠĠ Ġif Ġ( amount Ġ< Ġmin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreset Balance ( currency , Ġcause , Ġcontexts , Ġfire Event ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbal Ġ= Ġget Balance ( currency , Ġcontexts ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbal Ġ> Ġamount Ġ-> Ġwithdraw ( currency , Ġbal Ġ- Ġamount , Ġcause , Ġcontexts , Ġfire Event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbal Ġ== Ġamount Ġ-> ĠP ie conom y Transaction Result ( this , ĠBigDecimal . ZERO , Ġcontexts , Ġcurrency , ĠResult Type . SUCCESS , ĠTransaction Types . DE POSIT ). also Ġ{ Ġif Ġ( fire Event ) Ġpost ( it , Ġcause ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbal Ġ< Ġamount Ġ-> Ġdeposit ( currency , Ġamount Ġ- Ġbal , Ġcause , Ġcontexts , Ġfire Event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Logic Ġand Ġreason Ġhave Ġde sert ed Ġus . ĠW he e !") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpost ( res : ĠTransaction Result , Ġcause : ĠCause ) Ġ= ĠEvent Manager . post ( Pie conom y Transaction Event ( cause , Ġres )) Ċ } Ċ