diff --git a/src/hdskins/java/com/voxelmodpack/hdskins/HDSkinManager.java b/src/hdskins/java/com/voxelmodpack/hdskins/HDSkinManager.java index ac9358ac..c623d0bc 100644 --- a/src/hdskins/java/com/voxelmodpack/hdskins/HDSkinManager.java +++ b/src/hdskins/java/com/voxelmodpack/hdskins/HDSkinManager.java @@ -45,6 +45,8 @@ import java.util.UUID; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -62,6 +64,8 @@ public final class HDSkinManager implements IResourceManagerReloadListener { private boolean enabled = true; + private List clearListeners = Lists.newArrayList(); + private List skinServers = Lists.newArrayList(); private Map> skinCache = Maps.newHashMap(); @@ -223,6 +227,10 @@ public final class HDSkinManager implements IResourceManagerReloadListener { } + public void addClearListener(ISkinCacheClearListener listener) { + clearListeners.add(listener); + } + public static void clearSkinCache() { LiteLoaderLogger.info("Clearing local player skin cache"); @@ -238,6 +246,19 @@ public final class HDSkinManager implements IResourceManagerReloadListener { var1.printStackTrace(); } + INSTANCE.clearListeners = INSTANCE.clearListeners.stream() + .filter(HDSkinManager::onSkinCacheCleared) + .collect(Collectors.toList()); + } + + private static boolean onSkinCacheCleared(ISkinCacheClearListener callback) { + try { + return callback.onSkinCacheCleared(); + } catch (Exception e) { + LiteLoaderLogger.warning("Exception ancountered calling skin listener '{}'. It will be removed.", callback.getClass().getName()); + e.printStackTrace(); + return false; + } } public void addSkinModifier(ISkinModifier modifier) { diff --git a/src/hdskins/java/com/voxelmodpack/hdskins/ISkinCacheClearListener.java b/src/hdskins/java/com/voxelmodpack/hdskins/ISkinCacheClearListener.java new file mode 100644 index 00000000..d1a21d0f --- /dev/null +++ b/src/hdskins/java/com/voxelmodpack/hdskins/ISkinCacheClearListener.java @@ -0,0 +1,6 @@ +package com.voxelmodpack.hdskins; + +@FunctionalInterface +public interface ISkinCacheClearListener { + boolean onSkinCacheCleared(); +} diff --git a/src/hdskins/java/com/voxelmodpack/hdskins/Later.java b/src/hdskins/java/com/voxelmodpack/hdskins/Later.java new file mode 100644 index 00000000..8503de38 --- /dev/null +++ b/src/hdskins/java/com/voxelmodpack/hdskins/Later.java @@ -0,0 +1,27 @@ +package com.voxelmodpack.hdskins; + +public final class Later extends Thread { + + private final int delay; + + protected Later(int delay, Runnable runnable) { + super(runnable); + this.delay = delay; + } + + public static void performLater(int delay, Runnable callable) { + new Later(delay, callable).start(); + } + + public static void performNow(Runnable callable) { + new Later(0, callable).start(); + } + + @Override + public void run() { + try { + if (delay > 0) sleep(delay); + } catch (InterruptedException e) {} + super.run(); + } +} diff --git a/src/hdskins/java/com/voxelmodpack/hdskins/gui/GuiSkins.java b/src/hdskins/java/com/voxelmodpack/hdskins/gui/GuiSkins.java index a1f232dc..7e8fe3ac 100644 --- a/src/hdskins/java/com/voxelmodpack/hdskins/gui/GuiSkins.java +++ b/src/hdskins/java/com/voxelmodpack/hdskins/gui/GuiSkins.java @@ -10,6 +10,7 @@ import com.mojang.authlib.GameProfile; import com.mojang.authlib.minecraft.MinecraftProfileTexture; import com.mumfrey.liteloader.util.log.LiteLoaderLogger; import com.voxelmodpack.hdskins.HDSkinManager; +import com.voxelmodpack.hdskins.Later; import com.voxelmodpack.hdskins.skins.SkinUploadResponse; import com.voxelmodpack.hdskins.upload.awt.ThreadOpenFilePNG; import net.minecraft.client.Minecraft; @@ -34,6 +35,7 @@ import net.minecraft.util.text.TextFormatting; import org.apache.commons.io.FilenameUtils; import org.apache.logging.log4j.LogManager; import org.lwjgl.BufferUtils; +import org.lwjgl.opengl.Display; import org.lwjgl.opengl.GL11; import org.lwjgl.util.glu.GLU; @@ -88,7 +90,8 @@ public class GuiSkins extends GuiScreen implements FutureCallback files.stream().findFirst().ifPresent(this::loadLocalFile)); fileDrop.setVisible(true); + fileDrop.requestFocusInWindow(); } catch (Exception e) { e.printStackTrace(); } @@ -227,10 +237,16 @@ public class GuiSkins extends GuiScreen implements FutureCallback { + if (!(Minecraft.getMinecraft().currentScreen instanceof GuiSkins)) { + if (fileDrop != null) { + fileDrop.setVisible(false); + } + GuiSkins.this.localPlayer.releaseTextures(); + GuiSkins.this.remotePlayer.releaseTextures(); + HDSkinManager.clearSkinCache(); + } + }); } private void onFileOpenDialogClosed(JFileChooser fileDialog, int dialogResult) { @@ -283,7 +299,7 @@ public class GuiSkins extends GuiScreen implements FutureCallback poniesCache = Maps.newHashMap(); - private Map backgroudPoniesCache = Maps.newHashMap(); public PonyManager(PonyConfig config) { this.config = config; @@ -149,7 +149,6 @@ public class PonyManager implements IResourceManagerReloadListener { @Override public void onResourceManagerReload(IResourceManager resourceManager) { poniesCache.clear(); - backgroudPoniesCache.clear(); backgroundPonyList.clear(); try { for (IResource res : resourceManager.getAllResources(BGPONIES_JSON)) { @@ -202,4 +201,11 @@ public class PonyManager implements IResourceManagerReloadListener { return ponies.stream().map(this::apply).collect(Collectors.toList()); } } + + @Override + public boolean onSkinCacheCleared() { + MineLittlePony.logger.info("Flushed {} cached ponies.", poniesCache.size()); + poniesCache.clear(); + return true; + } } diff --git a/src/main/java/com/minelittlepony/hdskins/gui/GuiSkinsMineLP.java b/src/main/java/com/minelittlepony/hdskins/gui/GuiSkinsMineLP.java index 1a540e88..87b434c2 100644 --- a/src/main/java/com/minelittlepony/hdskins/gui/GuiSkinsMineLP.java +++ b/src/main/java/com/minelittlepony/hdskins/gui/GuiSkinsMineLP.java @@ -40,12 +40,4 @@ public class GuiSkinsMineLP extends GuiSkins { ponyManager.removePony(resource); } } - - @Override - public void onGuiClosed() { - super.onGuiClosed(); - ponyManager.removePony(localPlayer.getSkinTexture()); - ponyManager.removePony(remotePlayer.getSkinTexture()); - - } }