Skip to content
This repository was archived by the owner on Jan 3, 2020. It is now read-only.

Commit 94f8a72

Browse files
committed
fix some concurrent errors
1 parent 44a124c commit 94f8a72

File tree

2 files changed

+40
-41
lines changed

2 files changed

+40
-41
lines changed

src/main/java/org/devinprogress/uniskinmod/DynamicSkinManager.java

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ private void forceLoadTextures(CachedDynamicSkin cache) {
154154
}
155155
}
156156

157+
/* Do not call this from external threads, GL error will occur */
157158
public void forceLoadTexture(File sourceFile, MinecraftProfileTexture.Type textureType, boolean isAlex) {
158159
try {
159160
File dstFolder = this.mcSkinCacheDir;
@@ -175,13 +176,27 @@ public void forceLoadTexture(File sourceFile, MinecraftProfileTexture.Type textu
175176
}
176177
}
177178

178-
public String forceLoadTexture(String local_file, MinecraftProfileTexture.Type textureType, boolean isAlex) {
179+
public String forceCopyTexture(String local_file) {
179180
try {
180-
if (local_file == null || textureType == null) return null;
181+
if (local_file == null) return null;
181182
if (!local_file.startsWith("local:")) return null;
182-
File src = new File(local_file.substring(6));
183-
String sha256 = DigestUtils.sha256Hex(new FileInputStream(src)).toLowerCase();
184-
forceLoadTexture(src, textureType, isAlex);
183+
return forceCopyTexture(new File(local_file.substring(6)));
184+
} catch (Exception ex) {
185+
UniSkinMod.log.catching(Level.WARN, ex);
186+
return null;
187+
}
188+
}
189+
190+
public String forceCopyTexture(File f) {
191+
try {
192+
if (f == null) return null;
193+
File dstFolder = this.mcSkinCacheDir;
194+
String sha256 = DigestUtils.sha256Hex(new FileInputStream(f)).toLowerCase();
195+
String dir = sha256.substring(0, 2);
196+
File subDir = new File(dstFolder, dir);
197+
subDir.mkdirs();
198+
File dstFile = new File(subDir, sha256);
199+
FileUtils.copyFile(f, dstFile);
185200
return "http://127.0.0.1/" + sha256;
186201
} catch (Exception ex) {
187202
UniSkinMod.log.catching(Level.WARN, ex);

src/main/java/org/devinprogress/uniskinmod/UniSkinCore.java

Lines changed: 20 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,7 @@
2323
import java.lang.reflect.Field;
2424
import java.net.HttpURLConnection;
2525
import java.net.URL;
26-
import java.util.Collections;
27-
import java.util.Set;
2826
import java.util.UUID;
29-
import java.util.concurrent.ConcurrentHashMap;
3027
import java.util.concurrent.ExecutionException;
3128

3229
/**
@@ -49,7 +46,7 @@ public UniSkinCore(UniSkinConfig configuration, File localSkin) {
4946
for (String str : cfg.rootURIs) UniSkinMod.log.info("Added Root URI: {}", str);
5047
for (String str : cfg.legacySkinURIs) UniSkinMod.log.info("Added Skin URI: {}", str);
5148
for (String str : cfg.legacyCapeURIs) UniSkinMod.log.info("Added Cape URI: {}", str);
52-
UniSkinMod.log.info("Load genuine skins: {}", cfg.loadGenuineSkins? "Enabled": "Disabled");
49+
UniSkinMod.log.info("Load genuine skins: {}", cfg.loadGenuineSkins ? "Enabled" : "Disabled");
5350
mojangProfileRepo = new YggdrasilAuthenticationService(Minecraft.getMinecraft().getProxy(), UUID.randomUUID().toString())
5451
.createProfileRepository();
5552

@@ -65,7 +62,9 @@ public UniSkinCore(UniSkinConfig configuration, File localSkin) {
6562
f.setAccessible(true);
6663
Object obj = f.get(Minecraft.getMinecraft());
6764
assertDir = (File) obj;
68-
} catch (ReflectiveOperationException ex) {
65+
} catch (NoSuchFieldException ex) {
66+
throw new RuntimeException("Unable to determine skin cache dir.", ex);
67+
} catch (IllegalAccessException ex) {
6968
throw new RuntimeException("Unable to determine skin cache dir.", ex);
7069
}
7170
if (assertDir == null) throw new RuntimeException("Unable to determine skin cache dir.");
@@ -170,10 +169,9 @@ private void injectLocalProfile(GameProfile profile) {
170169
UniSkinProfile api = UniSkinProfile.getLocalProfile(f, new File(localSkinDir, "textures"));
171170
if (api == null) return;
172171
MojangTexturePayload payload = MojangTexturePayload.fromGameProfile(profile);
173-
payload.addCape(dynamicSkinManager.forceLoadTexture(api.getCapeURL(), MinecraftProfileTexture.Type.CAPE, false));
174-
boolean isAlex = ("slim".equalsIgnoreCase(api.getModel()) || "alex".equalsIgnoreCase(api.getModel()));
175-
payload.addSkin(dynamicSkinManager.forceLoadTexture(api.getSkinURL(), MinecraftProfileTexture.Type.SKIN, isAlex), api.getModel());
176-
payload.addElytra(dynamicSkinManager.forceLoadTexture(api.getElytraURL(), MinecraftProfileTexture.Type.ELYTRA, false));
172+
payload.addCape(dynamicSkinManager.forceCopyTexture(api.getCapeURL()));
173+
payload.addSkin(dynamicSkinManager.forceCopyTexture(api.getSkinURL()), api.getModel());
174+
payload.addElytra(dynamicSkinManager.forceCopyTexture(api.getElytraURL()));
177175
payload.dumpIntoGameProfile(profile);
178176
return;
179177
}
@@ -241,7 +239,7 @@ private void injectLegacyProfile(GameProfile profile) {
241239
try {
242240
File localFile = new File(localTexture, hash);
243241
FileUtils.writeByteArrayToFile(localFile, skinData);
244-
dynamicSkinManager.forceLoadTexture(localFile, MinecraftProfileTexture.Type.SKIN, false);
242+
dynamicSkinManager.forceCopyTexture(localFile);
245243
payload.addSkin("http://127.0.0.1/" + hash, "default");
246244
UniSkinMod.log.info("Injecting legacy skin: {} {}", playerName, hash);
247245
} catch (IOException ex) {
@@ -263,7 +261,7 @@ private void injectLegacyProfile(GameProfile profile) {
263261
try {
264262
File localFile = new File(localTexture, hash);
265263
FileUtils.writeByteArrayToFile(localFile, capeData);
266-
dynamicSkinManager.forceLoadTexture(localFile, MinecraftProfileTexture.Type.CAPE, false);
264+
dynamicSkinManager.forceCopyTexture(localFile);
267265
payload.addCape("http://127.0.0.1/" + hash);
268266
UniSkinMod.log.info("Injecting legacy cape: {} {}", playerName, hash);
269267
} catch (IOException ex) {
@@ -289,39 +287,25 @@ public ResourceLocation getDynamicSkinResource(NetworkPlayerInfo player) {
289287
/**
290288
* called from TileEntitySkllRenderer.renderSkull()
291289
*/
292-
private final Set<String> loading = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());
293-
294290
public ResourceLocation getDynamicSkinResourceForSkull(GameProfile gp, ResourceLocation def) {
295291
if (gp == null) return def;
296-
final String name = gp.getName();
292+
String name = gp.getName();
297293
if (name == null || name.length() <= 0) return def;
298-
299-
if (loading.contains(name)) return def;
300-
DynamicSkinManager.CachedDynamicSkin s = dynamicSkinManager.cache.getIfPresent(name);
301-
if (s == null) {
302-
loading.add(name);
303-
new Thread(new Runnable() {
304-
@Override
305-
public void run() {
306-
try {
307-
dynamicSkinManager.cache.get(name);
308-
} catch (ExecutionException ex) {
309-
UniSkinMod.log.catching(Level.WARN, ex);
310-
}
311-
loading.remove(name);
312-
}
313-
}, "Skull-Texture-Fetch-" + name).start();
294+
try {
295+
DynamicSkinManager.CachedDynamicSkin s = dynamicSkinManager.cache.get(name);
296+
if (s.skin != null && s.skin.length != 0) {
297+
double spf = (double) s.skinInterval / (double) s.skin.length;
298+
int id = ((int) Math.floor((double) (System.currentTimeMillis() % s.skinInterval) / spf)) % (s.skin.length);
299+
return s.skin[id];
300+
}
301+
} catch (ExecutionException ex) {
302+
UniSkinMod.log.catching(Level.WARN, ex);
314303
return def;
315304
}
316-
if (s.skin != null && s.skin.length != 0) {
317-
double spf = (double) s.skinInterval / (double) s.skin.length;
318-
int id = ((int) Math.floor((double) (System.currentTimeMillis() % s.skinInterval) / spf)) % (s.skin.length);
319-
return s.skin[id];
320-
}
321-
322305
return def;
323306
}
324307

308+
325309
/**
326310
* called from AbstractClientPlayer.getSkinType()
327311
*/

0 commit comments

Comments
 (0)