@@ -36,6 +36,12 @@ public final class AltRenderer
3636 private static final ConcurrentHashMap <String , Identifier > onlineSkins =
3737 new ConcurrentHashMap <>();
3838
39+ private static final ConcurrentHashMap <String , PlayerModelType > onlineModels =
40+ new ConcurrentHashMap <>();
41+
42+ private static final ConcurrentHashMap .KeySetView <String , Boolean > loadingSkins =
43+ ConcurrentHashMap .newKeySet ();
44+
3945 private static final HashMap <String , Identifier > offlineSkins =
4046 new HashMap <>();
4147
@@ -46,15 +52,34 @@ private static Identifier getSkinTexture(String name)
4652
4753 Identifier offlineSkin = offlineSkins .get (name );
4854 if (offlineSkin == null )
49- {
50- queueOnlineSkinLoading (name );
5155 offlineSkin = loadOfflineSkin (name );
52- }
5356
5457 Identifier onlineSkin = onlineSkins .get (name );
58+ if (onlineSkin == null )
59+ queueOnlineSkinLoading (name );
60+
5561 return onlineSkin != null ? onlineSkin : offlineSkin ;
5662 }
5763
64+ public static void refreshSkin (String name )
65+ {
66+ if (name == null || name .isBlank ())
67+ return ;
68+
69+ onlineSkins .remove (name );
70+ onlineModels .remove (name );
71+ loadingSkins .remove (name );
72+ queueOnlineSkinLoading (name );
73+ }
74+
75+ public static boolean isSkinLoading (String name )
76+ {
77+ if (name == null || name .isBlank ())
78+ return false ;
79+
80+ return loadingSkins .contains (name );
81+ }
82+
5883 private static Identifier loadOfflineSkin (String name )
5984 {
6085 UUID uuid = UUIDUtil .createOfflinePlayerUUID (name );
@@ -67,6 +92,12 @@ private static Identifier loadOfflineSkin(String name)
6792
6893 private static void queueOnlineSkinLoading (String name )
6994 {
95+ if (name == null || name .isBlank ())
96+ return ;
97+
98+ if (!loadingSkins .add (name ))
99+ return ;
100+
70101 Minecraft mc = WurstClient .MC ;
71102
72103 CompletableFuture .supplyAsync (() -> {
@@ -90,9 +121,17 @@ private static void queueOnlineSkinLoading(String name)
90121 }, BACKGROUND_THREAD ).thenAcceptAsync (skinTextures -> {
91122
92123 if (skinTextures != null )
124+ {
93125 onlineSkins .put (name , skinTextures .body ().texturePath ());
126+ onlineModels .put (name , skinTextures .model ());
127+ }
94128
95- }, BACKGROUND_THREAD );
129+ loadingSkins .remove (name );
130+
131+ }, BACKGROUND_THREAD ).exceptionally (error -> {
132+ loadingSkins .remove (name );
133+ return null ;
134+ });
96135 }
97136
98137 public static void drawAltFace (GuiGraphics context , String name , int x ,
@@ -132,9 +171,7 @@ public static void drawAltBody(GuiGraphics context, String name, int x,
132171 {
133172 Identifier texture = getSkinTexture (name );
134173
135- boolean slim =
136- DefaultPlayerSkin .get (UUIDUtil .createOfflinePlayerUUID (name ))
137- .model () == PlayerModelType .SLIM ;
174+ boolean slim = getModelType (name ) == PlayerModelType .SLIM ;
138175
139176 // Face
140177 x = x + width / 4 ;
@@ -271,9 +308,7 @@ public static void drawAltBack(GuiGraphics context, String name, int x,
271308 {
272309 Identifier texture = getSkinTexture (name );
273310
274- boolean slim =
275- DefaultPlayerSkin .get (UUIDUtil .createOfflinePlayerUUID (name ))
276- .model () == PlayerModelType .SLIM ;
311+ boolean slim = getModelType (name ) == PlayerModelType .SLIM ;
277312
278313 // Face
279314 x = x + width / 4 ;
@@ -402,4 +437,14 @@ public static void drawAltBack(GuiGraphics context, String name, int x,
402437 e .printStackTrace ();
403438 }
404439 }
440+
441+ private static PlayerModelType getModelType (String name )
442+ {
443+ PlayerModelType onlineModel = onlineModels .get (name );
444+ if (onlineModel != null )
445+ return onlineModel ;
446+
447+ return DefaultPlayerSkin .get (UUIDUtil .createOfflinePlayerUUID (name ))
448+ .model ();
449+ }
405450}
0 commit comments