1111package org .redlance .dima_dencep .mods .rrls .mixins ;
1212
1313import com .llamalad7 .mixinextras .sugar .Local ;
14+ import net .minecraft .Util ;
1415import net .minecraft .client .gui .components .FocusableTextWidget ;
1516import net .minecraft .network .chat .Component ;
17+ import net .minecraft .util .ARGB ;
1618import net .minecraft .util .Mth ;
19+ import org .objectweb .asm .Opcodes ;
1720import org .redlance .dima_dencep .mods .rrls .RrlsConfig ;
1821import org .redlance .dima_dencep .mods .rrls .config .Type ;
1922import org .redlance .dima_dencep .mods .rrls .utils .DummyGuiGraphics ;
@@ -47,16 +50,18 @@ public abstract class LoadingOverlayMixin extends Overlay {
4750 @ Final
4851 private Minecraft minecraft ;
4952 @ Shadow
50- protected abstract void drawProgressBar ( GuiGraphics guiGraphics , int minX , int minY , int maxX , int maxY , float partialTick ) ;
53+ public float currentProgress ;
5154 @ Shadow
52- private static int replaceAlpha (int color , int alpha ) {
53- return 0 ;
54- }
55+ private long fadeOutStart ;
56+ @ Shadow
57+ private long fadeInStart ;
58+ @ Shadow
59+ public abstract void drawProgressBar (GuiGraphics guiGraphics , int minX , int minY , int maxX , int maxY , float partialTick );
5560
5661 @ Unique
5762 private FocusableTextWidget rrls$textWidget ;
5863 @ Unique
59- private float rrls$fadeOutTime ;
64+ private boolean rrls$isFinished ;
6065
6166 @ Inject (
6267 method = "<init>" ,
@@ -72,37 +77,50 @@ private static int replaceAlpha(int color, int alpha) {
7277 }
7378
7479 @ Override
75- public void rrls$miniRender (GuiGraphics graphics ) {
80+ public void rrls$miniRender (GuiGraphics graphics , float partialTick ) {
7681 int i = graphics .guiWidth ();
7782 int j = graphics .guiHeight ();
7883
84+ float ease = 1.0F ;
85+ if (RrlsConfig .interpolateProgress ()) {
86+ ease -= RrlsConfig .easing ().invoke (this .currentProgress , RrlsConfig .easingArg ());
87+
88+ } else if (this .fadeOutStart > -1L ) {
89+ float f = (float )(Util .getMillis () - this .fadeOutStart ) / RrlsConfig .animationSpeed ();
90+ ease -= RrlsConfig .easing ().invoke (Mth .clamp (f , 0.0F , 1.0F ), RrlsConfig .easingArg ());
91+ }
92+
93+ int easeAlpha = Math .max (Math .round (ease * 255.0F ), 4 ); // Fuck Font#adjustColor
94+ int easeColor = ARGB .color (easeAlpha , 255 , 255 , 255 );
95+
7996 switch (RrlsConfig .type ()) {
8097 case Type .PROGRESS -> {
8198 int s = (int ) ((double ) j * 0.8325 );
8299 int r = (int ) (Math .min (i * 0.75 , j ) * 0.5 );
83100
84- this .drawProgressBar (graphics , i / 2 - r , s - 5 , i / 2 + r , s + 5 , this . rrls$fadeOutTime );
101+ this .drawProgressBar (graphics , i / 2 - r , s - 5 , i / 2 + r , s + 5 , ease );
85102 }
86103
87104 case Type .TEXT -> graphics .drawCenteredString (
88105 minecraft .font , RrlsConfig .reloadText (), i / 2 , 70 ,
89- RrlsConfig .rgbProgress () ? RainbowUtils .rainbowColor () : - 1
106+ RrlsConfig .rgbProgress () ? RainbowUtils .rainbowColor (easeAlpha ) : easeColor
90107 );
91108
92109 case Type .TEXT_WITH_BACKGROUND -> {
93110 if (rrls$textWidget != null ) {
94111 rrls$textWidget .setMaxWidth (i );
95112 rrls$textWidget .setX (i / 2 - rrls$textWidget .getWidth () / 2 );
96113 rrls$textWidget .setY (j - j / 3 );
114+ rrls$textWidget .setColor (easeColor );
97115
98116 if (RrlsConfig .rgbProgress ())
99- rrls$textWidget .setColor (RainbowUtils .rainbowColor ());
117+ rrls$textWidget .setColor (RainbowUtils .rainbowColor (easeAlpha ));
100118
101119 // This will make sure the widget is rendered above other widgets in Pause screen
102120 graphics .pose ().pushPose ();
103- graphics .pose ().translate (0 , 0 ,255 );
121+ graphics .pose ().translate (0 , 0 , 255 );
104122
105- rrls$textWidget .render (graphics , 0 , 0 , this . rrls$fadeOutTime );
123+ rrls$textWidget .render (graphics , 0 , 0 , partialTick );
106124
107125 graphics .pose ().popPose ();
108126 }
@@ -111,15 +129,11 @@ private static int replaceAlpha(int color, int alpha) {
111129 }
112130 }
113131
114- @ Inject (
115- method = "render" ,
116- at = @ At (
117- value = "INVOKE" ,
118- target = "Lnet/minecraft/client/Minecraft;setOverlay(Lnet/minecraft/client/gui/screens/Overlay;)V"
119- )
120- )
121- public void rrls$onLoadDone (GuiGraphics guiGraphics , int mouseX , int mouseY , float partialTick , CallbackInfo ci ) {
122- this .rrls$textWidget = null ;
132+ @ Override
133+ public void rrls$resetProgress () {
134+ this .currentProgress = 0 ;
135+ this .fadeOutStart = -1L ;
136+ this .fadeInStart = -1L ;
123137 }
124138
125139 @ Inject (
@@ -133,18 +147,6 @@ private static int replaceAlpha(int color, int alpha) {
133147 rrls$setState (OverlayHelper .lookupState (minecraft .screen , rrls$getState () != OverlayHelper .State .WAIT ));
134148 }
135149
136- @ Inject (
137- method = "render" ,
138- at = @ At (
139- value = "FIELD" ,
140- target = "Lnet/minecraft/client/gui/screens/LoadingOverlay;fadeInStart:J" ,
141- ordinal = 2
142- )
143- )
144- public void rrls$hookPartialTick (GuiGraphics guiGraphics , int mouseX , int mouseY , float partialTick , CallbackInfo ci , @ Local (ordinal = 1 ) float f ) {
145- this .rrls$fadeOutTime = 1.0F - Mth .clamp (f , 0.0F , 1.0F );
146- }
147-
148150 @ WrapWithCondition (
149151 method = "render" ,
150152 at = @ At (
@@ -197,21 +199,69 @@ private static int replaceAlpha(int color, int alpha) {
197199 original .call (red , green , blue , alpha );
198200 }
199201
202+ @ WrapOperation (
203+ method = "drawProgressBar" ,
204+ at = @ At (
205+ value = "INVOKE" ,
206+ target = "Ljava/lang/Math;round(F)I"
207+ )
208+ )
209+ public int rrls$lerp (float i , Operation <Integer > original , @ Local (argsOnly = true ) float partialTick ) {
210+ if (RrlsConfig .interpolateProgress ()) {
211+ return Mth .ceil (Mth .lerp (partialTick , 0.0F , 255.0F ));
212+ }
213+
214+ return original .call (i );
215+ }
216+
200217 @ WrapOperation (
201218 method = "drawProgressBar" ,
202219 at = @ At (
203220 value = "INVOKE" ,
204221 target = "Lnet/minecraft/util/ARGB;color(IIII)I"
205222 )
206223 )
207- public int rrls$rainbowProgress (int alpha , int red , int green , int blue , Operation <Integer > original ) {
224+ public int rrls$rainbowProgress (int alpha , int red , int green , int blue , Operation <Integer > original , @ Local ( argsOnly = true ) float partialTick ) {
208225 if (RrlsConfig .rgbProgress () && rrls$getState () != OverlayHelper .State .DEFAULT ) {
209- return replaceAlpha ( RainbowUtils .rainbowColor (), alpha );
226+ return RainbowUtils .rainbowColor (partialTick );
210227 }
211228
212229 return original .call (alpha , red , green , blue );
213230 }
214231
232+ @ WrapOperation (
233+ method = "render" ,
234+ at = @ At (
235+ value = "FIELD" ,
236+ target = "Lnet/minecraft/client/gui/screens/LoadingOverlay;fadeOutStart:J" ,
237+ ordinal = 2
238+ )
239+ )
240+ public long rrls$interpolateAtEnd (LoadingOverlay instance , Operation <Long > original ) {
241+ if (this .fadeOutStart == -1L && this .currentProgress >= 0.999F ) {
242+ this .fadeOutStart = Util .getMillis ();
243+ }
244+ if (RrlsConfig .interpolateAtEnd ()) {
245+ return this .rrls$isFinished ? 1L : -1L ;
246+ }
247+ return original .call (instance );
248+ }
249+
250+ @ WrapOperation (
251+ method = "render" ,
252+ at = @ At (
253+ value = "FIELD" ,
254+ target = "Lnet/minecraft/client/gui/screens/LoadingOverlay;fadeOutStart:J" ,
255+ opcode = Opcodes .PUTFIELD
256+ )
257+ )
258+ public void rrls$ (LoadingOverlay instance , long value , Operation <Void > original ) {
259+ this .rrls$isFinished = true ;
260+ if (!RrlsConfig .interpolateAtEnd ()) {
261+ original .call (instance , value );
262+ }
263+ }
264+
215265 @ ModifyConstant (
216266 method = "render" ,
217267 constant = {
0 commit comments