From f655db8d282ae5b7506f20a8f2e9e372e5d2e50e Mon Sep 17 00:00:00 2001 From: xDark <19853368+xxDark@users.noreply.github.com> Date: Fri, 5 Jun 2020 19:23:19 +0300 Subject: [PATCH] Backport MC-186052 --- .../bugs/IPatched$TextureManager.java | 10 ++++++ .../client/MixinNetHandlerPlayClient.java | 36 +++++++++++++++++++ .../mixins/client/MixinTextureManager.java | 21 +++++++++++ .../resources/mixins.vanillafix.bugs.json | 3 +- 4 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/dimdev/vanillafix/bugs/IPatched$TextureManager.java create mode 100644 src/main/java/org/dimdev/vanillafix/bugs/mixins/client/MixinTextureManager.java diff --git a/src/main/java/org/dimdev/vanillafix/bugs/IPatched$TextureManager.java b/src/main/java/org/dimdev/vanillafix/bugs/IPatched$TextureManager.java new file mode 100644 index 0000000..8aba946 --- /dev/null +++ b/src/main/java/org/dimdev/vanillafix/bugs/IPatched$TextureManager.java @@ -0,0 +1,10 @@ +package org.dimdev.vanillafix.bugs; + +import net.minecraft.client.renderer.texture.ITextureObject; +import net.minecraft.util.ResourceLocation; + +import java.util.Map; + +public interface IPatched$TextureManager { + Map getTextures(); +} diff --git a/src/main/java/org/dimdev/vanillafix/bugs/mixins/client/MixinNetHandlerPlayClient.java b/src/main/java/org/dimdev/vanillafix/bugs/mixins/client/MixinNetHandlerPlayClient.java index e6f600c..b7c4bd7 100644 --- a/src/main/java/org/dimdev/vanillafix/bugs/mixins/client/MixinNetHandlerPlayClient.java +++ b/src/main/java/org/dimdev/vanillafix/bugs/mixins/client/MixinNetHandlerPlayClient.java @@ -3,10 +3,23 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.network.NetHandlerPlayClient; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.texture.AbstractTexture; +import net.minecraft.client.renderer.texture.ITextureObject; +import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.network.play.INetHandlerPlayClient; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.ITextComponent; +import org.dimdev.vanillafix.bugs.IPatched$TextureManager; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.Iterator; +import java.util.Map; /** * Makes interdimensional teleportation nearly as fast as same-dimension @@ -14,9 +27,13 @@ * the player to see partially loaded terrain rather than waiting for the whole * render distance to load, but that's also the vanilla behaviour for same-dimension * teleportation. + * + * Forces {@link TextureManager} to unload all skins it has. + * See https://bugs.mojang.com/browse/MC-186052 */ @Mixin(value = NetHandlerPlayClient.class, priority = 500) public abstract class MixinNetHandlerPlayClient implements INetHandlerPlayClient { + @Shadow private Minecraft client; @Redirect(method = "handleJoinGame", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;displayGuiScreen(Lnet/minecraft/client/gui/GuiScreen;)V")) private void onGuiDisplayJoin(Minecraft mc, GuiScreen guiScreenIn) { @@ -27,4 +44,23 @@ private void onGuiDisplayJoin(Minecraft mc, GuiScreen guiScreenIn) { private void onGuiDisplayRespawn(Minecraft mc, GuiScreen guiScreenIn) { mc.displayGuiScreen(null); } + + @Inject(method = "onDisconnect", at = @At("HEAD")) + private void onDisconnect(ITextComponent reason, CallbackInfo ci) { + TextureManager renderEngine = this.client.getTextureManager(); + Map textures = ((IPatched$TextureManager)renderEngine).getTextures(); + Iterator> iterator = textures.entrySet().iterator(); + while (iterator.hasNext()) { + Map.Entry entry = iterator.next(); + if (entry.getKey().getPath().startsWith("skins/")) { + iterator.remove(); + ITextureObject texture = entry.getValue(); + if (texture instanceof AbstractTexture) { + ((AbstractTexture) texture).deleteGlTexture(); + } else { + GlStateManager.deleteTexture(texture.getGlTextureId()); + } + } + } + } } diff --git a/src/main/java/org/dimdev/vanillafix/bugs/mixins/client/MixinTextureManager.java b/src/main/java/org/dimdev/vanillafix/bugs/mixins/client/MixinTextureManager.java new file mode 100644 index 0000000..24c8480 --- /dev/null +++ b/src/main/java/org/dimdev/vanillafix/bugs/mixins/client/MixinTextureManager.java @@ -0,0 +1,21 @@ +package org.dimdev.vanillafix.bugs.mixins.client; + +import net.minecraft.client.renderer.texture.ITextureObject; +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.util.ResourceLocation; +import org.dimdev.vanillafix.bugs.IPatched$TextureManager; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Map; + +@Mixin(TextureManager.class) +public class MixinTextureManager implements IPatched$TextureManager { + @Shadow @Final private Map mapTextureObjects; + + @Override + public Map getTextures() { + return mapTextureObjects; + } +} diff --git a/src/main/resources/mixins.vanillafix.bugs.json b/src/main/resources/mixins.vanillafix.bugs.json index 0d4b6d3..3ed7e37 100644 --- a/src/main/resources/mixins.vanillafix.bugs.json +++ b/src/main/resources/mixins.vanillafix.bugs.json @@ -23,7 +23,8 @@ "client.MixinEntityRenderer", "client.MixinServerPinger$1", "client.MixinThreadDownloadImageData", - "client.MixinEnumConnectionState" + "client.MixinEnumConnectionState", + "client.MixinTextureManager" ], "injectors": { "maxShiftBy": 10