diff --git a/src/main/java/com/minelittlepony/client/MineLPClient.java b/src/main/java/com/minelittlepony/client/MineLPClient.java index ac25048d..6e3ef26c 100644 --- a/src/main/java/com/minelittlepony/client/MineLPClient.java +++ b/src/main/java/com/minelittlepony/client/MineLPClient.java @@ -8,17 +8,26 @@ import com.minelittlepony.client.settings.ClientPonyConfig; import com.minelittlepony.common.client.IModUtilities; import com.minelittlepony.settings.JsonConfig; import com.minelittlepony.settings.PonyConfig; +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.minecraft.MinecraftProfileTexture; + +import javax.annotation.Nullable; + +import java.util.Map; +import java.util.stream.Collectors; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.TitleScreen; import net.minecraft.client.options.KeyBinding; import net.minecraft.client.render.entity.EntityRenderDispatcher; +import net.minecraft.client.texture.PlayerSkinProvider; import net.minecraft.client.util.InputUtil; import net.minecraft.resource.ReloadableResourceManager; import net.minecraft.text.LiteralText; import net.minecraft.text.Style; import net.minecraft.text.TranslatableText; import net.minecraft.util.Formatting; +import net.minecraft.util.Identifier; import net.minecraft.util.SystemUtil; import org.lwjgl.glfw.GLFW; @@ -47,11 +56,15 @@ public class MineLPClient extends MineLittlePony { public MineLPClient(IModUtilities utils) { utilities = utils; - config = JsonConfig.of(utils.getConfigDirectory().resolve("minelp.json"), ClientPonyConfig::new); + config = JsonConfig.of(utils.getConfigDirectory().resolve("minelp.json"), this::createConfig); ponyManager = new PonyManager(config); keyBinding = utilities.registerKeybind("key.categories.misc", "minelittlepony:settings", GLFW.GLFW_KEY_F9); } + protected ClientPonyConfig createConfig() { + return new ClientPonyConfig(); + } + /** * Called when the game is ready. */ @@ -100,6 +113,15 @@ public class MineLPClient extends MineLittlePony { PonySkullRenderer.resolve(); } + public Map getProfileTextures(@Nullable GameProfile profile) { + PlayerSkinProvider provider = MinecraftClient.getInstance().getSkinProvider(); + + return provider.getTextures(profile) + .entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, entry -> { + return provider.loadSkin(entry.getValue(), entry.getKey()); + })); + } + @Override public PonyManager getManager() { return ponyManager; diff --git a/src/main/java/com/minelittlepony/client/PonyRenderManager.java b/src/main/java/com/minelittlepony/client/PonyRenderManager.java index e399c31a..f9444ac1 100644 --- a/src/main/java/com/minelittlepony/client/PonyRenderManager.java +++ b/src/main/java/com/minelittlepony/client/PonyRenderManager.java @@ -4,8 +4,6 @@ import java.util.Map; import java.util.function.Function; import com.google.common.collect.Maps; -import com.minelittlepony.client.gui.hdskins.DummyPony; -import com.minelittlepony.client.gui.hdskins.RenderDummyPony; import com.minelittlepony.client.model.IPonyModel; import com.minelittlepony.client.model.races.PlayerModels; import com.minelittlepony.client.render.LevitatingItemRenderer; @@ -47,9 +45,6 @@ public class PonyRenderManager { * Registers all new player skin types. (currently only pony and slimpony). */ public void initialiseRenderers(EntityRenderDispatcher manager) { - // Preview on the select skin gui - MineLPClient.getInstance().getModUtilities().addRenderer(DummyPony.class, RenderDummyPony::new); - PlayerModels[] models = PlayerModels.values(); for (int i = 1; i < models.length; i++) { diff --git a/src/main/java/com/minelittlepony/client/PonySkinModifier.java b/src/main/java/com/minelittlepony/client/PonySkinModifier.java index f2e698c2..2d0ff6a3 100644 --- a/src/main/java/com/minelittlepony/client/PonySkinModifier.java +++ b/src/main/java/com/minelittlepony/client/PonySkinModifier.java @@ -6,21 +6,15 @@ public class PonySkinModifier implements ISkinModifier { @Override public void convertSkin(ISkinModifier.IDrawer drawer) { - // int scale = drawer.getImage().getWidth() / 64; + int scale = drawer.getImage().getWidth() / 64; - // TODO: What are these numbers!? + // TODO: What are these numbers!? - //top, mirror - // drawer.draw(scale, 60, 32, 58, 34, 58, 16, 60, 18, false, false); - //bottom, mirror - // drawer.draw(scale, 62, 32, 60, 34, 60, 16, 62, 18, false, false); - //inside - // drawer.draw(scale, 58, 34, 56, 48, 60, 18, 62, 32, false, false); - //back - // drawer.draw(scale, 60, 34, 58, 48, 58, 18, 60, 32, false, false); - //outside - // drawer.draw(scale, 62, 34, 60, 48, 56, 18, 58, 32, false, false); - //back - // drawer.draw(scale, 64, 34, 62, 48, 62, 18, 64, 32, false, false); + drawer.draw(scale, 60, 32, 58, 34, 58, 16, 60, 18, false, false); // top, mirror + drawer.draw(scale, 62, 32, 60, 34, 60, 16, 62, 18, false, false); // bottom, mirror + drawer.draw(scale, 58, 34, 56, 48, 60, 18, 62, 32, false, false); // inside + drawer.draw(scale, 60, 34, 58, 48, 58, 18, 60, 32, false, false); // back + drawer.draw(scale, 62, 34, 60, 48, 56, 18, 58, 32, false, false); // outside + drawer.draw(scale, 64, 34, 62, 48, 62, 18, 64, 32, false, false); // back } } diff --git a/src/main/java/com/minelittlepony/client/gui/hdskins/ClientPonyConfigHDSkins.java b/src/main/java/com/minelittlepony/client/gui/hdskins/ClientPonyConfigHDSkins.java new file mode 100644 index 00000000..4775909d --- /dev/null +++ b/src/main/java/com/minelittlepony/client/gui/hdskins/ClientPonyConfigHDSkins.java @@ -0,0 +1,19 @@ +package com.minelittlepony.client.gui.hdskins; + +import com.minelittlepony.client.settings.ClientPonyConfig; +import com.minelittlepony.hdskins.HDSkins; +import com.minelittlepony.settings.PonyLevel; + +public class ClientPonyConfigHDSkins extends ClientPonyConfig { + + @Override + public void setPonyLevel(PonyLevel ponylevel) { + // only trigger reloads when the value actually changes + if (ponylevel != getPonyLevel()) { + HDSkins.getInstance().parseSkins(); + } + + super.setPonyLevel(ponylevel); + } + +} diff --git a/src/main/java/com/minelittlepony/client/gui/hdskins/MineLPHDSkins.java b/src/main/java/com/minelittlepony/client/gui/hdskins/MineLPHDSkins.java index 89303d63..b5c7f262 100644 --- a/src/main/java/com/minelittlepony/client/gui/hdskins/MineLPHDSkins.java +++ b/src/main/java/com/minelittlepony/client/gui/hdskins/MineLPHDSkins.java @@ -1,21 +1,28 @@ package com.minelittlepony.client.gui.hdskins; import net.minecraft.client.MinecraftClient; +import net.minecraft.util.Identifier; import com.minelittlepony.common.client.IModUtilities; import com.minelittlepony.client.MineLPClient; import com.minelittlepony.client.PonySkinModifier; -import com.minelittlepony.client.PonySkinParser; - +import com.minelittlepony.client.settings.ClientPonyConfig; import com.minelittlepony.hdskins.HDSkins; +import com.minelittlepony.hdskins.ISkinCacheClearListener; import com.minelittlepony.hdskins.net.LegacySkinServer; import com.minelittlepony.hdskins.net.SkinServer; import com.minelittlepony.hdskins.net.ValhallaSkinServer; +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.minecraft.MinecraftProfileTexture; + +import javax.annotation.Nullable; + +import java.util.Map; /** * All the interactions with HD Skins. */ -public class MineLPHDSkins extends MineLPClient { +public class MineLPHDSkins extends MineLPClient implements ISkinCacheClearListener { private static final String MINELP_VALHALLA_SERVER = "http://skins.minelittlepony-mod.com"; private static final String MINELP_LEGACY_SERVER = "http://minelpskins.voxelmodpack.com"; @@ -35,6 +42,12 @@ public class MineLPHDSkins extends MineLPClient { SkinServer.defaultServers.add(0, valhalla); } + @Override + public boolean onSkinCacheCleared() { + getManager().clearCache(); + return true; + } + /** * Called when the game is ready. */ @@ -42,6 +55,9 @@ public class MineLPHDSkins extends MineLPClient { public void postInit(MinecraftClient minecraft) { super.postInit(minecraft); + // Preview on the select skin gui + getModUtilities().addRenderer(DummyPony.class, RenderDummyPony::new); + HDSkins manager = HDSkins.getInstance(); // Convert legacy pony skins @@ -49,8 +65,18 @@ public class MineLPHDSkins extends MineLPClient { // Parse trigger pixel data manager.addSkinParser(new PonySkinParser()); // Clear ponies when skins are cleared - manager.addClearListener(getManager()); + manager.addClearListener(this); // Ponify the skins GUI. manager.setSkinsGui(GuiSkinsMineLP::new); } + + @Override + protected ClientPonyConfig createConfig() { + return new ClientPonyConfigHDSkins(); + } + + @Override + public Map getProfileTextures(@Nullable GameProfile profile) { + return HDSkins.getInstance().getTextures(profile); + } } diff --git a/src/main/java/com/minelittlepony/client/PonySkinParser.java b/src/main/java/com/minelittlepony/client/gui/hdskins/PonySkinParser.java similarity index 95% rename from src/main/java/com/minelittlepony/client/PonySkinParser.java rename to src/main/java/com/minelittlepony/client/gui/hdskins/PonySkinParser.java index 5bbbdde4..be8e1862 100644 --- a/src/main/java/com/minelittlepony/client/PonySkinParser.java +++ b/src/main/java/com/minelittlepony/client/gui/hdskins/PonySkinParser.java @@ -1,4 +1,4 @@ -package com.minelittlepony.client; +package com.minelittlepony.client.gui.hdskins; import com.minelittlepony.MineLittlePony; import com.minelittlepony.client.model.races.PlayerModels; diff --git a/src/main/java/com/minelittlepony/client/model/races/PlayerModels.java b/src/main/java/com/minelittlepony/client/model/races/PlayerModels.java index 4a10f24f..51cd8c1e 100644 --- a/src/main/java/com/minelittlepony/client/model/races/PlayerModels.java +++ b/src/main/java/com/minelittlepony/client/model/races/PlayerModels.java @@ -5,7 +5,6 @@ import com.minelittlepony.client.model.ModelWrapper; import com.minelittlepony.client.model.entities.ModelSeapony; import com.minelittlepony.client.render.entities.player.RenderPonyPlayer; import com.minelittlepony.client.render.entities.player.RenderSeaponyPlayer; -import com.minelittlepony.hdskins.VanillaModels; import com.minelittlepony.model.IModel; import com.minelittlepony.pony.meta.Race; @@ -21,7 +20,7 @@ public enum PlayerModels { /** * The default non-pony model. This is typically handled my the vanilla renderer. */ - DEFAULT(VanillaModels.DEFAULT, VanillaModels.SLIM, Race.HUMAN, ModelEarthPony::new), + DEFAULT("default", "slim", Race.HUMAN, ModelEarthPony::new), EARTHPONY(Race.EARTH, ModelEarthPony::new), PEGASUS(Race.PEGASUS, ModelPegasus::new), BATPONY(Race.BATPONY, ModelBatpony::new), @@ -53,7 +52,7 @@ public enum PlayerModels { PlayerModels(Race race, Function resolver) { normal = new PendingModel(name().toLowerCase()); - slim = new PendingModel(VanillaModels.SLIM + normal.key); + slim = new PendingModel("slim" + normal.key); this.resolver = resolver; diff --git a/src/main/java/com/minelittlepony/client/pony/Pony.java b/src/main/java/com/minelittlepony/client/pony/Pony.java index e9f6ce22..10f4f9c9 100644 --- a/src/main/java/com/minelittlepony/client/pony/Pony.java +++ b/src/main/java/com/minelittlepony/client/pony/Pony.java @@ -6,7 +6,6 @@ import com.minelittlepony.client.PonyRenderManager; import com.minelittlepony.client.ducks.IBufferedTexture; import com.minelittlepony.client.render.IPonyRender; import com.minelittlepony.client.transform.PonyTransformation; -import com.minelittlepony.hdskins.util.ProfileTextureUtil; import com.minelittlepony.pony.IPony; import com.minelittlepony.pony.IPonyData; import com.minelittlepony.pony.meta.Race; @@ -62,7 +61,8 @@ public class Pony implements IPony { NativeImage ponyTexture = getBufferedImage(resource); if (ponyTexture == null) { - ponyTexture = ProfileTextureUtil.getDynamicBufferedImage(16, 16, MissingSprite.getMissingSpriteTexture()); + ponyTexture = new NativeImage(16, 16, true); + ponyTexture.copyFrom(MissingSprite.getMissingSpriteTexture().getImage()); MinecraftClient.getInstance().getTextureManager().registerTexture(resource, new NativeImageBackedTexture(ponyTexture)); } diff --git a/src/main/java/com/minelittlepony/client/pony/PonyManager.java b/src/main/java/com/minelittlepony/client/pony/PonyManager.java index aad01ff1..35c53ac2 100644 --- a/src/main/java/com/minelittlepony/client/pony/PonyManager.java +++ b/src/main/java/com/minelittlepony/client/pony/PonyManager.java @@ -8,7 +8,6 @@ import com.google.gson.Gson; import com.google.gson.JsonParseException; import com.minelittlepony.MineLittlePony; import com.minelittlepony.common.util.MoreStreams; -import com.minelittlepony.hdskins.ISkinCacheClearListener; import com.minelittlepony.pony.IPony; import com.minelittlepony.pony.IPonyManager; import com.minelittlepony.settings.PonyConfig; @@ -44,7 +43,7 @@ import java.util.concurrent.TimeUnit; * The PonyManager is responsible for reading and recoding all the pony data associated with an entity of skin. * */ -public class PonyManager implements IPonyManager, ResourceReloadListener, ISkinCacheClearListener { +public class PonyManager implements IPonyManager, ResourceReloadListener { private static final Gson GSON = new Gson(); @@ -159,6 +158,11 @@ public class PonyManager implements IPonyManager, ResourceReloadListener, ISkinC }, clientExecutor); } + public void clearCache() { + MineLittlePony.logger.info("Flushed {} cached ponies.", poniesCache.size()); + poniesCache.invalidateAll(); + } + public void reloadAll(ResourceManager resourceManager) { poniesCache.invalidateAll(); backgroundPonyList.clear(); @@ -253,11 +257,4 @@ public class PonyManager implements IPonyManager, ResourceReloadListener, ISkinC return MoreStreams.map(imports, this::makeImport); } } - - @Override - public boolean onSkinCacheCleared() { - MineLittlePony.logger.info("Flushed {} cached ponies.", poniesCache.size()); - poniesCache.invalidateAll(); - return true; - } } diff --git a/src/main/java/com/minelittlepony/client/render/entities/RenderPonyMob.java b/src/main/java/com/minelittlepony/client/render/entities/RenderPonyMob.java index 468e163d..ed1511cf 100644 --- a/src/main/java/com/minelittlepony/client/render/entities/RenderPonyMob.java +++ b/src/main/java/com/minelittlepony/client/render/entities/RenderPonyMob.java @@ -14,7 +14,6 @@ import com.minelittlepony.client.render.layer.LayerPonyArmor; import com.minelittlepony.client.render.layer.LayerPonyCustomHead; import com.minelittlepony.client.render.layer.LayerPonyElytra; import com.minelittlepony.client.util.render.PonyRenderer; -import com.minelittlepony.hdskins.HDSkins; import com.minelittlepony.model.IUnicorn; import com.minelittlepony.pony.IPony; import com.mojang.blaze3d.platform.GlStateManager; @@ -106,7 +105,7 @@ public abstract class RenderPonyMob & IPonyModel> extends RenderPonyMob { @SuppressWarnings({"rawtypes", "unchecked"}) - public Proxy(List exportedLayers, EntityRenderDispatcher manager, M model) { + public Proxy(List exportedLayers, EntityRenderDispatcher manager, M model) { super(manager, model); exportedLayers.addAll(features); diff --git a/src/main/java/com/minelittlepony/client/render/tileentities/skull/PlayerSkullRenderer.java b/src/main/java/com/minelittlepony/client/render/tileentities/skull/PlayerSkullRenderer.java index d87ebafd..8e44278f 100644 --- a/src/main/java/com/minelittlepony/client/render/tileentities/skull/PlayerSkullRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/tileentities/skull/PlayerSkullRenderer.java @@ -1,9 +1,9 @@ package com.minelittlepony.client.render.tileentities.skull; +import com.minelittlepony.client.MineLPClient; import com.minelittlepony.client.model.components.ModelDeadMau5Ears; import com.minelittlepony.client.pony.Pony; import com.minelittlepony.client.render.RenderPony; -import com.minelittlepony.hdskins.HDSkins; import com.minelittlepony.settings.PonyConfig; import com.minelittlepony.settings.PonyLevel; import com.mojang.authlib.GameProfile; @@ -43,7 +43,7 @@ public class PlayerSkullRenderer extends PonySkull { deadMau5.setVisible(profile != null && "deadmau5".equals(profile.getName())); if (profile != null) { - Identifier skin = HDSkins.getInstance().getTextures(profile).get(Type.SKIN); + Identifier skin = MineLPClient.getInstance().getProfileTextures(profile).get(Type.SKIN); if (skin != null && Pony.getBufferedImage(skin) != null) { return skin; } diff --git a/src/main/java/com/minelittlepony/client/settings/ClientPonyConfig.java b/src/main/java/com/minelittlepony/client/settings/ClientPonyConfig.java index 80651b76..1fbf25e2 100644 --- a/src/main/java/com/minelittlepony/client/settings/ClientPonyConfig.java +++ b/src/main/java/com/minelittlepony/client/settings/ClientPonyConfig.java @@ -4,9 +4,7 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.entity.player.PlayerEntity; import com.minelittlepony.client.render.entities.MobRenderers; -import com.minelittlepony.hdskins.HDSkins; import com.minelittlepony.settings.PonyConfig; -import com.minelittlepony.settings.PonyLevel; public class ClientPonyConfig extends PonyConfig { @@ -14,16 +12,6 @@ public class ClientPonyConfig extends PonyConfig { initWith(MobRenderers.values()); } - @Override - public void setPonyLevel(PonyLevel ponylevel) { - // only trigger reloads when the value actually changes - if (ponylevel != getPonyLevel()) { - HDSkins.getInstance().parseSkins(); - } - - super.setPonyLevel(ponylevel); - } - @Override public void save() { super.save();