Backport Screen mixin for better compatibility

This commit is contained in:
Sollace 2020-06-12 23:48:51 +02:00
parent 5f0594c44b
commit 44bc07238e
4 changed files with 44 additions and 25 deletions

View file

@ -11,6 +11,7 @@ import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Streams;
import com.minelittlepony.gui.IconicButton;
import com.mojang.authlib.GameProfile;
import com.mojang.authlib.minecraft.MinecraftProfileTexture;
import com.mojang.authlib.minecraft.MinecraftProfileTexture.Type;
@ -34,6 +35,9 @@ import com.voxelmodpack.hdskins.util.PlayerUtil;
import com.voxelmodpack.hdskins.util.ProfileTextureUtil;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.AbstractClientPlayer;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiMainMenu;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.network.NetworkPlayerInfo;
import net.minecraft.client.renderer.ThreadDownloadImageData;
import net.minecraft.client.renderer.texture.ITextureObject;
@ -41,6 +45,8 @@ import net.minecraft.client.resources.DefaultPlayerSkin;
import net.minecraft.client.resources.IResourceManager;
import net.minecraft.client.resources.IResourceManagerReloadListener;
import net.minecraft.client.resources.SkinManager;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import org.apache.commons.io.FileUtils;
import org.apache.http.impl.client.CloseableHttpClient;
@ -65,6 +71,7 @@ import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Stream;
import javax.annotation.Nullable;
@ -112,6 +119,14 @@ public final class HDSkinManager implements IResourceManagerReloadListener {
return skinsGuiFunc.apply(ImmutableList.copyOf(this.skinServers));
}
public void displaySkinningGui(GuiScreen screen, Consumer<GuiButton> buttons) {
if (screen instanceof GuiMainMenu) {
buttons.accept(new IconicButton(screen.width - 50, screen.height - 50, sender -> {
Minecraft.getMinecraft().displayGuiScreen(HDSkinManager.INSTANCE.createSkinsGui());
}).setIcon(new ItemStack(Items.LEATHER_LEGGINGS), 0x3c5dcb));
}
}
private CompletableFuture<Map<Type, MinecraftProfileTexture>> loadProfileData(GameProfile profile) {
return CompletableFuture.supplyAsync(() -> {

View file

@ -1,24 +0,0 @@
package com.voxelmodpack.hdskins.mixin;
import com.minelittlepony.gui.IconicButton;
import com.voxelmodpack.hdskins.HDSkinManager;
import net.minecraft.client.gui.GuiMainMenu;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(GuiMainMenu.class)
public class MixinGuiMainMenu extends GuiScreen {
@Inject(method = "initGui()V", at = @At("RETURN"))
private void onInit(CallbackInfo ci) {
addButton(new IconicButton(width - 50, height - 50, sender -> {
mc.displayGuiScreen(HDSkinManager.INSTANCE.createSkinsGui());
}).setIcon(new ItemStack(Items.LEATHER_LEGGINGS), 0x3c5dcb));
}
}

View file

@ -0,0 +1,27 @@
package com.voxelmodpack.hdskins.mixin;
import com.voxelmodpack.hdskins.HDSkinManager;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Gui;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.GuiYesNoCallback;
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.callback.CallbackInfo;
@Mixin(GuiScreen.class)
abstract class MixinGuiScreen extends Gui implements GuiYesNoCallback {
@Shadow
protected abstract <T extends GuiButton> T addButton(T buttonIn);
@Inject(method = "setWorldAndResolution(Lnet/minecraft/client/Minecraft;II)V", at = @At("RETURN"))
private void setWorldAndResolution(Minecraft mc, int width, int height, CallbackInfo info) {
HDSkinManager.INSTANCE.displaySkinningGui((GuiScreen)(Object)this, this::addButton);
}
}

View file

@ -3,9 +3,10 @@
"minVersion": "0.7",
"package": "com.voxelmodpack.hdskins.mixin",
"refmap": "hdskins.mixin.refmap.json",
"compatibilityLevel": "JAVA_8",
"mixins": [
"MixinMinecraft",
"MixinGuiMainMenu",
"MixinGuiScreen",
"MixinImageBufferDownload",
"MixinNetworkPlayerInfo",
"MixinSkullRenderer"