package Ġorg . gener ous g . fr u ity lib . network Ċ Ċ import Ġio . netty . channel . Channel HandlerContext Ċ import Ġio . netty . channel . Channel Outbound Handler Adapter Ċ import Ġio . netty . channel . Channel Promise Ċ import Ġio . netty . util . Attribute Key Ċ import Ġnet . minecraftforge . fml . common . network . F MLE mbed ded Channel Ċ import Ġnet . minecraftforge . fml . common . network . FM LO ut bound Handler Ċ import Ġnet . minecraftforge . fml . common . network . Network Registry Ċ import Ġnet . minecraftforge . fml . common . network . handshake . Network Dispatcher Ċ import Ġnet . minecraftforge . fml . common . network . internal . F ML Proxy Packet Ċ import Ġnet . minecraftforge . fml . rel a unch er . Side ĊĊ Ċ class ĠExtended Outbound Handler Ġ: ĠChannel Outbound Handler Adapter () Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠMESS AG ET ARGET Ġ= ĠAttribute Key . valueOf < IP acket Target Selector <* >> (" fl : outbound Target ") ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġ< T > Ġget Dispatch ers ( target : ĠIP acket Target Selector < T >, Ġarg : ĠAny ): ĠCollection < Network Dispatcher > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġmutable ListOf < Network Dispatcher >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget . list Dispatch ers ( target . cast Arg ( arg ), Ġoutput ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġoutput ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġinstall ( channels : ĠMap < Side , ĠF MLE mbed ded Channel >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( side Ġin ĠSide . values ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstall ( channels [ side ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġinstall ( fml Embedded Channel : ĠF MLE mbed ded Channel ?) Ġ= Ġf ml Embedded Channel ?. pipeline ()?. add After (" fml : outbound ", Ġ" fl : outbound ", ĠExtended Outbound Handler ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġoverride Ġfun Ġwrite ( ctx : ĠChannel HandlerContext , Ġmsg : ĠAny ?, Ġpromise : ĠChannel Promise ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( msg Ġ! is ĠF ML Proxy Packet ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . write ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= Ġctx . channel () ĊĊĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġchannel . attr ( MESS AG ET ARGET ). get () ĊĠĠĠĠĠĠĠ Ġif ( target Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . write ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpkt Ġ= Ġmsg ĊĠĠĠĠĠĠĠ Ġval Ġchannel Side Ġ= Ġchannel . attr ( Network Registry . CHANNEL _ SOURCE ). get () ĊĠĠĠĠĠĠĠ Ġrequire ( target . is Allowed On Side ( channel Side )) Ġ{ Ġ" Packet Ġis Ġnot Ġallowed Ġon Ġside " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġchannel Name Ġ= Ġchannel . attr ( Network Registry . F ML _ CHANNEL ). get () ĊĠĠĠĠĠĠĠ Ġval Ġarg Ġ= Ġchannel . attr ( FM LO ut bound Handler . F ML _ MESS AG ET ARGET ARGS ). get () ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdispatch ers Ġ= Ġget Dispatch ers ( target , Ġarg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( dispatcher Ġin Ġdispatch ers ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatcher . send Proxy ( pkt ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Failed Ġto Ġselect Ġand Ġsend Ġmessage Ġ( selector Ġ$ target , Ġarg : Ġ$ arg , Ġchannel : Ġ$ channel Name , Ġside : Ġ$ channel Side )", Ġt ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }