package Ġcom . mart m ists . yn et . network Ċ Ċ import Ġcom . mart m ists . yn et . Y Net Mod Ċ import Ġcom . mart m ists . yn et . block entity . Controller Block Entity Ċ import Ġcom . mart m ists . yn et . util . Y Net Registry Ċ import Ġcom . mart m ists . yn et . transfer . type . Disabled Type Ċ import Ġcom . mart m ists . yn et . transfer . type . Type Ċ import Ġnet . minecraft . block . entity . Block Entity Ċ import Ġnet . minecraft . util . math . Block Pos Ċ import Ġnet . minecraft . world . World Ċ Ċ class ĠNetwork ( val Ġbe : ĠController Block Entity ) Ġ{ ĊĠĠĠ Ġval Ġworld : ĠWorld ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġbe . world !! ĊĠĠĠ Ġvar Ġdid Init Ġ= Ġfalse ĊĠĠĠ Ġval Ġc ables Ġ= Ġmutable Set Of < Long >() Ġ Ġ// ĠBlockPos . as Long ĊĠĠĠ Ġval Ġconnector s Ġ= Ġmutable Set Of < Long >() ĊĠĠĠ Ġval Ġchannels Ġ= ĠarrayOf < Channel < *> >( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChannel . empty ( this ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChannel . empty ( this ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChannel . empty ( this ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChannel . empty ( this ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChannel . empty ( this ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChannel . empty ( this ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChannel . empty ( this ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChannel . empty ( this ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChannel . empty ( this ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChannel . empty ( this ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġnetworks . add ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġre scan () Ġ{ ĊĠĠĠĠĠĠĠ Ġc ables . clear () ĊĠĠĠĠĠĠĠ Ġconnector s . clear () ĊĠĠĠĠĠĠĠ Ġscan ( be . pos ) ĊĠĠĠĠĠĠĠ Ġval Ġconnected Ġ= Ġget Connected Blocks () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(( index , Ġchannel ) Ġin Ġchannels . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Ġ= ĠChannel ( this , Ġmutable ListOf (), Ġchannel . type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew . connected Blocks . addAll ( connected . map Ġ{ Ġit t Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Ġ= Ġchannel . connected Blocks . first OrNull Ġ{ Ġit . be Ġ== Ġit t Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc be Ġ= ĠConfig ured Block Entity ( this . be , Ġit t , Ġold ?. priority Ġ?: Ġ 0 , Ġold ?. mode Ġ?: ĠInteraction Mode . DISABLED , Ġold ?. filter Ġ?: Ġmutable ListOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc be ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannels [ index ] Ġ= Ġnew ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbe . mark Dirty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Neighbors ( pos : ĠBlockPos ) Ġ= ĠlistOf ( pos . up (), Ġpos . down (), Ġpos . north (), Ġpos . east (), Ġpos . south (), Ġpos . west ()). map Ġ{ Ġit . as Long () Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġscan ( origin : ĠBlockPos ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscanned Ġ= Ġmutable Set Of ( origin . as Long ()) ĊĠĠĠĠĠĠĠ Ġval Ġto Scan Ġ= Ġmutable Set Of (* get Neighbors ( origin ). to Typed Array ()) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( to Scan . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġto Scan . elementAt ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Scan . remove ( next ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( side Ġin Ġget Neighbors ( Block Pos . from Long ( next ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( side Ġ! in Ġscanned ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscanned . add ( side ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġworld . getBlock State ( Block Pos . from Long ( side )). block ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( b Ġ=== ĠY Net Mod . C ABLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc ables . add ( side ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( b Ġ=== ĠY Net Mod . CON NE CTOR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnector s . add ( side ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Scan . add ( side ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtick () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! did Init ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre scan () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdid Init Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( world . is Client ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġchannels . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . type Ġ!= ĠDisabled Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" tick ing Ġchannel Ġ$ it Ġof Ġtype Ġ${ it . type }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠY Net Registry . get Handler ( it . type )?. tick ( it Ġas ĠChannel < Type >) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Connected Blocks (): ĠList < Block Entity > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( connectors . isEmpty ()) Ġreturn ĠlistOf () ĊĊĠĠĠĠĠĠĠ Ġval Ġall Blocks Ġ= Ġmutable Set Of < Long >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( c Ġin Ġconnector s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpos Ġ= ĠBlockPos . from Long ( c ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( side Ġin Ġget Neighbors ( pos )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Y Net Mod . should Connect ( world , ĠBlockPos . from Long ( side ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall Blocks . add ( side ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġall Blocks . map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġworld . getBlock Entity ( Block Pos . from Long ( it )) ĊĠĠĠĠĠĠĠ Ġ}. toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnetworks Ġ= Ġmutable ListOf < Network >() ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Connector ( world : ĠWorld , Ġpos : ĠBlockPos ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( side Ġin ĠlistOf ( pos . up (), Ġpos . down (), Ġpos . north (), Ġpos . east (), Ġpos . south (), Ġpos . west ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( world . getBlock State ( side ). block Ġ=== ĠY Net Mod . CONTROLLER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbe Ġ= Ġ( world . getBlock Entity ( side ) Ġas ĠController Block Entity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbe . network . connectors . add ( pos . as Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbe . network . re scan () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( net Ġin Ġnetworks ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( side . as Long () Ġin Ġnet . connectors Ġ|| Ġside . as Long () Ġin Ġnet . c ables ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnet . connectors . add ( pos . as Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnet . re scan () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġremove Connector ( pos : ĠBlockPos ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( net Ġin Ġnetworks ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pos . as Long () Ġin Ġnet . connectors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnet . re scan () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Cable ( pos : ĠBlockPos ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( side Ġin ĠlistOf ( pos . up (), Ġpos . down (), Ġpos . north (), Ġpos . east (), Ġpos . south (), Ġpos . west ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( net Ġin Ġnetworks ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( side . as Long () Ġin Ġnet . connectors Ġ|| Ġside . as Long () Ġin Ġnet . c ables ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnet . c ables . add ( pos . as Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnet . re scan () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġremove Cable ( pos : ĠBlockPos ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( net Ġin Ġnetworks ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pos . as Long () Ġin Ġnet . c ables ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnet . re scan () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }