Skip to content

Commit

Permalink
add support for capes
Browse files Browse the repository at this point in the history
better downloader implementation, respects 404 and caches results
fix the issue with mcheli's dummy camera entity
  • Loading branch information
zlainsama committed Feb 10, 2016
1 parent cad6ecb commit c2682af
Show file tree
Hide file tree
Showing 19 changed files with 1,313 additions and 397 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ buildscript {

apply plugin: 'forge'

version = "1.7.10-v6"
version = "1.7.10-v7"
group= "lain.mods.skinport"
archivesBaseName = "SkinPort"

Expand Down
5 changes: 5 additions & 0 deletions src/main/java/lain/mods/skinport/PlayerUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,11 @@ public static boolean isOfflineID(UUID uuid)
return offlineIDs.contains(uuid);
}

public static boolean isOfflinePlayer(EntityPlayer player)
{
return isOfflineID(getPlayerID(player));
}

public static void registerListener()
{
EventListener listener = new EventListener();
Expand Down
84 changes: 70 additions & 14 deletions src/main/java/lain/mods/skinport/SkinPort.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,25 +10,32 @@
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import lain.mods.skinport.api.ISkin;
import lain.mods.skinport.api.ISkinProviderService;
import lain.mods.skinport.api.SkinProviderAPI;
import lain.mods.skinport.compat.SkinPortRenderPlayer_RPA;
import lain.mods.skinport.network.NetworkManager;
import lain.mods.skinport.network.packet.PacketGet0;
import lain.mods.skinport.network.packet.PacketGet1;
import lain.mods.skinport.network.packet.PacketPut0;
import lain.mods.skinport.network.packet.PacketPut1;
import lain.mods.skinport.providers.CrafatarSkinProviderService;
import lain.mods.skinport.providers.MojangSkinProviderService;
import lain.mods.skinport.providers.UserManagedLocalSkinProviderService;
import lain.mods.skinport.providers.CrafatarCachedCapeProvider;
import lain.mods.skinport.providers.CrafatarCachedSkinProvider;
import lain.mods.skinport.providers.MojangCachedCapeProvider;
import lain.mods.skinport.providers.MojangCachedSkinProvider;
import lain.mods.skinport.providers.UserManagedCapeProvider;
import lain.mods.skinport.providers.UserManagedSkinProvider;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.AbstractClientPlayer;
import net.minecraft.client.entity.EntityClientPlayerMP;
import net.minecraft.client.entity.EntityOtherPlayerMP;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiOptions;
import net.minecraft.client.renderer.entity.Render;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.common.config.Configuration;
import org.apache.commons.io.FileUtils;
Expand All @@ -55,6 +62,29 @@ public static EntityPlayerMP findPlayer(UUID uuid)
return PlayerUtils.findPlayer(uuid);
}

@SideOnly(Side.CLIENT)
public static ResourceLocation getLocationCape(AbstractClientPlayer player, ResourceLocation result)
{
if (result == null)
{
ISkin cape = SkinProviderAPI.getCape(player);
if (cape != null && cape.isSkinReady())
return cape.getSkinLocation();
}
return result;
}

@SideOnly(Side.CLIENT)
public static ResourceLocation getLocationSkin(AbstractClientPlayer player, ResourceLocation result)
{
ISkin skin = SkinProviderAPI.getSkin(player);
if (skin == null || !skin.isSkinReady())
skin = SkinProviderAPI.getDefaultSkin(player);
if (skin != null && skin.isSkinReady())
return skin.getSkinLocation();
return result;
}

@SideOnly(Side.CLIENT)
public static void GuiOptions_postInitGui(GuiOptions gui, List<GuiButton> buttonList)
{
Expand All @@ -73,6 +103,12 @@ public static void GuiOptions_preActionPerformed(GuiOptions gui, GuiButton butto
}
}

@SideOnly(Side.CLIENT)
public static boolean hasCape(AbstractClientPlayer player, boolean result)
{
return player.getLocationCape() != null;
}

@SideOnly(Side.CLIENT)
public static void loadOptions()
{
Expand Down Expand Up @@ -105,11 +141,11 @@ public static void onPut0(UUID uuid, int value)
@SideOnly(Side.CLIENT)
public static Render RenderManager_getEntityRenderObject(RenderManager manager, Entity entity, Render value)
{
if (entity instanceof AbstractClientPlayer)
if (entity instanceof EntityClientPlayerMP || entity instanceof EntityOtherPlayerMP)
{
AbstractClientPlayer player = (AbstractClientPlayer) entity;
ISkin skin = SkinProviderAPI.getSkin(player);
if (!skin.isSkinReady())
if (skin == null || !skin.isSkinReady())
skin = SkinProviderAPI.getDefaultSkin(player);
Render render = skinMap.get(skin.getSkinType());
if (render != null)
Expand Down Expand Up @@ -179,20 +215,33 @@ public static void toggleModelPart(SkinCustomization part)
@SideOnly(Side.CLIENT)
public static int clientFlags;

@SideOnly(Side.CLIENT)
public static ISkinProviderService skinService;
@SideOnly(Side.CLIENT)
public static ISkinProviderService capeService;

@SideOnly(Side.CLIENT)
@SubscribeEvent
public void handleClientTicks(TickEvent.ClientTickEvent event)
{
if (skinService == null && capeService == null)
return;

if (event.phase == TickEvent.Phase.START)
{
World world = Minecraft.getMinecraft().theWorld;
if (world != null && world.playerEntities != null && !world.playerEntities.isEmpty())
{
for (Object obj : world.playerEntities)
{
// This should keep skins loaded.
// This should keep skins/capes loaded.
if (obj instanceof AbstractClientPlayer)
SkinProviderAPI.getSkin((AbstractClientPlayer) obj);
{
if (skinService != null)
skinService.getSkin((AbstractClientPlayer) obj);
if (capeService != null)
capeService.getSkin((AbstractClientPlayer) obj);
}
}
}
}
Expand Down Expand Up @@ -240,18 +289,25 @@ public Integer load(UUID key) throws Exception
if (event.getSide().isClient())
{
Configuration config = new Configuration(event.getSuggestedConfigurationFile());
boolean useCrafatar = config.getBoolean("useCrafatar", Configuration.CATEGORY_GENERAL, true, "add Crafatar as secondary skin/cape provider?");
if (config.hasChanged())
config.save();

skinService = SkinProviderAPI.createService();
capeService = SkinProviderAPI.createService();

SkinProviderAPI.register(MojangSkinProviderService.createSkinProvider(), true);
SkinProviderAPI.register(UserManagedLocalSkinProviderService.createSkinProvider(), false);
if (config.getBoolean("useCrafatar", Configuration.CATEGORY_GENERAL, true, "add Crafatar as secondary skin provider?"))
SkinProviderAPI.register(CrafatarSkinProviderService.createSkinProvider(), false);
skinService.register(new MojangCachedSkinProvider());
skinService.register(new UserManagedSkinProvider());
if (useCrafatar)
skinService.register(new CrafatarCachedSkinProvider());
capeService.register(new MojangCachedCapeProvider());
capeService.register(new UserManagedCapeProvider());
if (useCrafatar)
capeService.register(new CrafatarCachedCapeProvider());

loadOptions();

FMLCommonHandler.instance().bus().register(this);

if (config.hasChanged())
config.save();
}
}

Expand Down
20 changes: 0 additions & 20 deletions src/main/java/lain/mods/skinport/SkinPortRenderPlayer.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,9 @@
package lain.mods.skinport;

import lain.mods.skinport.api.ISkin;
import lain.mods.skinport.api.SkinProviderAPI;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.AbstractClientPlayer;
import net.minecraft.client.model.ModelBiped;
import net.minecraft.client.renderer.entity.RenderPlayer;
import net.minecraft.client.renderer.texture.ITextureObject;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.opengl.GL11;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

Expand Down Expand Up @@ -66,15 +60,6 @@ public void doRender(AbstractClientPlayer p_76986_1_, double p_76986_2_, double
modelPlayer.bipedCloak.showModel = smCloak;
}

@Override
protected ResourceLocation getEntityTexture(AbstractClientPlayer player)
{
ISkin skin = SkinProviderAPI.getSkin(player);
if (!skin.isSkinReady())
skin = SkinProviderAPI.getDefaultSkin(player);
return skin.getSkinLocation();
}

@Override
protected void renderEquippedItems(AbstractClientPlayer p_77029_1_, float p_77029_2_)
{
Expand Down Expand Up @@ -140,11 +125,6 @@ public void renderFirstPersonArm(EntityPlayer player)
if (modelPlayer.bipedCloak.showModel)
modelPlayer.bipedCloak.showModel = SkinCustomization.contains(flags, SkinCustomization.cape);

int tid = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D);
ITextureObject itobj = Minecraft.getMinecraft().getTextureManager().getTexture(((AbstractClientPlayer) player).getLocationSkin());
if (itobj != null && itobj.getGlTextureId() == tid)
Minecraft.getMinecraft().getTextureManager().bindTexture(getEntityTexture(player)); // #blameMojang

modelPlayer.isRiding = modelPlayer.isSneak = false;
super.renderFirstPersonArm(player);

Expand Down
2 changes: 1 addition & 1 deletion src/main/java/lain/mods/skinport/api/ISkinProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ public interface ISkinProvider

/**
* @param player
* @return You can only return null when this provider is registered as secondary providers.
* @return You can return null if no result.
*/
ISkin getSkin(AbstractClientPlayer player);

Expand Down
10 changes: 10 additions & 0 deletions src/main/java/lain/mods/skinport/api/ISkinProviderService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package lain.mods.skinport.api;

public interface ISkinProviderService extends ISkinProvider
{

void clear();

void register(ISkinProvider provider);

}
Loading

0 comments on commit c2682af

Please sign in to comment.