package Ġcom . ci ar and g . sound bounds . client . options Ċ Ċ import Ġnet . minecraft . client . gui . screen . Screen Ċ import Ġnet . minecraft . client . gui . widget . Button Widget Ċ import Ġnet . minecraft . client . gui . widget . Option Button Widget Ċ import Ġnet . minecraft . client . options . Boolean Option Ċ import Ġnet . minecraft . client . options . Key Binding Ċ import Ġnet . minecraft . client . util . math . Matrix Stack Ċ import Ġnet . minecraft . text . Literal Text Ċ import Ġorg . lwjgl . glfw . GLFW Ċ import Ġkotlin . math . pow Ċ Ċ class ĠSB Options Screen Ġ: ĠScreen ( Literal Text (" Sound Bounds ĠClient ĠOptions ")) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġx Center Ġ= Ġwidth Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġwidget Width Ġ= Ġ 1 5 0 ĊĠĠĠĠĠĠĠ Ġval Ġwidget Height Ġ= Ġ 2 0 ĊĠĠĠĠĠĠĠ Ġval Ġsp acer Ġ= Ġwidget Height Ġ/ Ġ 4 ĊĠĠĠĠĠĠĠ Ġval Ġtop Ġ= Ġheight Ġ/ Ġ 4 Ġ- Ġwidget Height Ġ/ Ġ 2 ĊĊĠĠĠĠĠĠĠ Ġval Ġx Pos Ġ= Ġx Center Ġ- Ġwidget Width Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġvar Ġcounter Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfun Ġnext Y () Ġ= Ġtop Ġ+ Ġ( widget Height Ġ+ Ġsp acer ) Ġ* Ġcounter ++ ĊĊĠĠĠĠĠĠĠ Ġsuper . init () ĊĠĠĠĠĠĠĠ Ġadd Button ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠButton Widget ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Pos , Ġnext Y (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidget Width , Ġwidget Height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLiteral Text (" Reset ĠAll ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSB Client Options . set To Default () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient ?. open Screen ( SB Options Screen ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġadd Button ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSB Slider Widget ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Pos , Ġnext Y (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidget Width , Ġwidget Height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Fade Dur (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Fade ĠDuration ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġvalue Ġ-> Ġformat Duration ( to Fade Dur ( value ), Ġ{ Ġ" ms " Ġ}, Ġ{ Ġ" secs " Ġ}, Ġ{ Ġ" mins " Ġ}) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġvalue Ġ-> Ġformat Duration ( to Fade Dur ( value ), Ġ{ Ġit . toString () Ġ}, Ġ{ Ġtruncate ( it ) Ġ}, Ġ{ Ġtruncate ( it ) Ġ}) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġvalue Ġ-> ĠSB Client Options . data . fade Duration Ġ= Ġto Fade Dur ( value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġadd Button ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSB Slider Widget ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Pos , Ġnext Y (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidget Width , Ġwidget Height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Idle Dur (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Post - Song ĠId le ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġvalue Ġ-> Ġformat Duration ( to Idle Dur ( value ), Ġ{ Ġ" ms " Ġ}, Ġ{ Ġ" secs " Ġ}, Ġ{ Ġ" mins " Ġ}) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġvalue Ġ-> Ġformat Duration ( to Idle Dur ( value ), Ġ{ Ġit . toString () Ġ}, Ġ{ Ġtruncate ( it ) Ġ}, Ġ{ Ġtruncate ( it ) Ġ}) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġvalue Ġ-> ĠSB Client Options . data . idle Duration Ġ= Ġto Idle Dur ( value ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġadd Button ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSB Slider Widget ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Pos , Ġnext Y (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidget Width , Ġwidget Height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Buf Dur (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Buffer ĠSize ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ" ms " Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġvalue Ġ-> Ġto Buf Dur ( value ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġvalue Ġ-> ĠSB Client Options . data . buffer Duration Ġ= Ġto Buf Dur ( value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġadd Button ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSB Slider Widget ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Pos , Ġnext Y (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidget Width , Ġwidget Height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Look ahead (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Look ahead ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ" buffers " Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġvalue Ġ-> Ġto Look ahead ( value ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġvalue Ġ-> ĠSB Client Options . data . look ahead Ġ= Ġto Look ahead ( value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġdisk Stream Button Ġ= ĠOption Button Widget ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx Pos , Ġnext Y (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwidget Width , Ġwidget Height , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisk Stream Option , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisk Stream Option . getDisplay String ( null ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġbutton : ĠButton Widget Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisk Stream Option . toggle ( client ?. options ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbutton . message Ġ= Ġdisk Stream Option . getDisplay String ( client ?. options ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient ?. options ?. write () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdisk Stream Button . active Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġadd Button ( disk Stream Button ) ĊĠĠĠĠĠĠĠ Ġadd Button ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOption Button Widget ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Pos , Ġnext Y (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidget Width , Ġwidget Height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauto Now Playing Option , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauto Now Playing Option . getDisplay String ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġbutton : ĠButton Widget Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauto Now Playing Option . toggle ( client ?. options ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbutton . message Ġ= Ġauto Now Playing Option . getDisplay String ( client ?. options ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient ?. options ?. write () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrender ( matrices : ĠMatrix Stack , Ġmouse X : ĠInt , ĠmouseY : ĠInt , Ġdelta : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrender Background ( matrices ) ĊĠĠĠĠĠĠĠ Ġdraw Center ed Text ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmatrices , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Renderer , Ġtitle , Ġwidth Ġ/ Ġ 2 , Ġ 3 0 , Ġ 0 xffffff ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġsuper . render ( matrices , Ġmouse X , ĠmouseY , Ġdelta ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonClose () Ġ{ ĊĠĠĠĠĠĠĠ ĠSB Client Options . write () ĊĠĠĠĠĠĠĠ Ġsuper . onClose () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠFA DE _ SL IDER _ S KE W : ĠDouble Ġ= Ġ 2 . 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠID LE _ SL IDER _ S KE W : ĠDouble Ġ= Ġ 2 . 0 ĊĠĠĠĠĠĠĠ Ġval Ġbinding Ġ= ĠKey Binding (" Client ĠOptions ĠScreen ", ĠGLFW . GLFW _ KEY _ B , Ġ" Sound Bounds ") ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġformat Duration ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmilliseconds : ĠLong , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġms : Ġ( Long ) Ġ-> ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsecs : Ġ( Double ) Ġ-> ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmins : Ġ( Double ) Ġ-> ĠString ĊĠĠĠĠĠĠĠ Ġ): ĠString Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmilliseconds Ġ< Ġ 1 0 0 0 Ġ-> Ġms ( milliseconds ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmilliseconds Ġ< Ġ 6 0 Ġ* Ġ 1 0 0 0 Ġ-> Ġsecs ( milliseconds . toDouble () Ġ/ Ġ 1 0 0 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġmins ( milliseconds . toDouble () Ġ/ Ġ 1 0 0 0 . 0 Ġ/ Ġ 6 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġtruncate ( value : ĠDouble ) Ġ= ĠString . format ("% . 2 f ", Ġvalue ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġto Sk ew ed Ste pped Long ( value : ĠDouble , Ġmax : ĠLong , Ġmin : ĠLong , Ġskew Factor : ĠDouble , Ġstep : ĠLong ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange : ĠLong Ġ= Ġmax Ġ- Ġmin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġskew ed : ĠDouble Ġ= Ġrange Ġ* Ġvalue . pow ( skew Factor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexact : ĠLong Ġ= Ġskew ed . to Long () Ġ+ Ġmin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġexact Ġ- Ġexact Ġ% Ġstep ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġfrom Sk ew ed Long ( value : ĠLong , Ġmin : ĠLong , Ġmax : ĠLong , Ġskew Factor : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Ġ= Ġ( max Ġ- Ġmin ). toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp ct Linear : ĠDouble Ġ= Ġ( value Ġ- Ġmin ) Ġ/ Ġrange ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġp ct Linear . pow ( 1 . 0 Ġ/ Ġskew Factor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġto Fade Dur ( slider Value : ĠDouble ) Ġ= Ġto Sk ew ed Ste pped Long ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġslider Value , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSB Client Options . MAX _ FA DE _ D UR , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSB Client Options . MIN _ FA DE _ D UR , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFA DE _ SL IDER _ S KE W , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSB Client Options . FA DE _ D UR _ STEP ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġfrom Fade Dur () Ġ= Ġfrom Sk ew ed Long ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSB Client Options . data . fade Duration , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSB Client Options . MIN _ FA DE _ D UR , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSB Client Options . MAX _ FA DE _ D UR , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFA DE _ SL IDER _ S KE W ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġto Idle Dur ( slider Value : ĠDouble ) Ġ= Ġto Sk ew ed Ste pped Long ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġslider Value , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSB Client Options . MAX _ IDLE _ D UR , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSB Client Options . MIN _ IDLE _ D UR , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠID LE _ SL IDER _ S KE W , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSB Client Options . IDLE _ D UR _ STEP ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġfrom Idle Dur () Ġ= Ġfrom Sk ew ed Long ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSB Client Options . data . idle Duration , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSB Client Options . MIN _ IDLE _ D UR , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSB Client Options . MAX _ IDLE _ D UR , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠID LE _ SL IDER _ S KE W ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġto Buf Dur ( slider Value : ĠDouble ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange : ĠLong Ġ= ĠSB Client Options . MAX _ BUF _ D UR Ġ- ĠSB Client Options . MIN _ BUF _ D UR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( slider Value Ġ* Ġrange ). to Long () Ġ+ ĠSB Client Options . MIN _ BUF _ D UR ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġfrom Buf Dur (): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmin : ĠLong Ġ= ĠSB Client Options . MIN _ BUF _ D UR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange : ĠDouble Ġ= Ġ( SB Client Options . MAX _ BUF _ D UR Ġ- Ġmin ). toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( SB Client Options . data . buffer Duration Ġ- Ġmin ) Ġ/ Ġrange ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġto Look ahead ( slider Value : ĠDouble ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange : ĠInt Ġ= ĠSB Client Options . MAX _ LOOK A HEAD Ġ- ĠSB Client Options . MIN _ LOOK A HEAD ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( slider Value Ġ* Ġrange ). toInt () Ġ+ ĠSB Client Options . MIN _ LOOK A HEAD ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġfrom Look ahead (): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmin : ĠInt Ġ= ĠSB Client Options . MIN _ LOOK A HEAD ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange : ĠDouble Ġ= Ġ( SB Client Options . MAX _ LOOK A HEAD Ġ- Ġmin ). toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( SB Client Options . data . look ahead Ġ- Ġmin ) Ġ/ Ġrange ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdisk Stream Option Ġ= ĠBoolean Option ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Stream ĠFrom ĠDisk ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġfalse Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ_, Ġ_ Ġ-> Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġauto Now Playing Option Ġ= ĠBoolean Option ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Auto ĠNow - Playing ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĠSB Client Options . data . auto Now Playing Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ_, Ġon Off Ġ-> ĠSB Client Options . data . auto Now Playing Ġ= Ġon Off Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ