package portables.client.render; import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import net.minecraft.client.entity.AbstractClientPlayer; import net.minecraftforge.client.event.RenderPlayerEvent; import javax.swing.*; import java.awt.*; import java.awt.image.BufferedImage; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.lang.reflect.Field; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.HashMap; public class CloakRender { private final String serverLocation = "https://raw.github.com/konwboj/SimplePortables/master/capes.txt"; private final int timeout = 1000; private static final Graphics GRAPHICS = new BufferedImage(128, 128, BufferedImage.TYPE_INT_RGB).getGraphics(); private HashMap<String, String> cloaks = new HashMap<String, String>(); private ArrayList<AbstractClientPlayer> capePlayers = new ArrayList<AbstractClientPlayer>(); public static CloakRender instance; public CloakRender() { buildCloakURLDatabase(); instance = this; } @SubscribeEvent public void onPreRenderSpecials(RenderPlayerEvent.Specials.Pre event) { if (Loader.isModLoaded("shadersmod")) { return; } if (event.entityPlayer instanceof AbstractClientPlayer) { AbstractClientPlayer abstractClientPlayer = (AbstractClientPlayer) event.entityPlayer; if (!capePlayers.contains(abstractClientPlayer)) { String cloakURL = cloaks.get(event.entityPlayer.getGameProfile().getName()); if (cloakURL == null) { return; } capePlayers.add(abstractClientPlayer); try { Class clazz = abstractClientPlayer.getTextureCape().getClass(); Field f = clazz.getDeclaredField("textureUploaded"); f.setAccessible(true); f.set(abstractClientPlayer.getTextureCape(), false); } catch (Exception e) { e.printStackTrace(); } // abstractClientPlayer.getTextureCape().textureUploaded = false; new Thread(new CloakThread(abstractClientPlayer, cloakURL)).start(); event.renderCape = true; } } } public void buildCloakURLDatabase() { URL url; try { url = new URL(serverLocation); URLConnection con = url.openConnection(); con.setConnectTimeout(timeout); con.setReadTimeout(timeout); InputStream io = con.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(io)); String str; int linetracker = 1; while ((str = br.readLine()) != null) { if (str.contains(":")) { String nick = str.substring(0, str.indexOf(":")); String link = str.substring(str.indexOf(":") + 1); new Thread(new CloakPreload(link)).start(); cloaks.put(nick, link); } else { System.err.println("[TinkersConstruct] [skins.txt] Syntax error on line " + linetracker + ": " + str); } linetracker++; } br.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private class CloakThread implements Runnable { AbstractClientPlayer abstractClientPlayer; String cloakURL; public CloakThread(AbstractClientPlayer player, String cloak) { abstractClientPlayer = player; cloakURL = cloak; } @Override public void run() { try { Image cape = new ImageIcon(new URL(cloakURL)).getImage(); BufferedImage bo = new BufferedImage(cape.getWidth(null), cape.getHeight(null), BufferedImage.TYPE_INT_ARGB); bo.getGraphics().drawImage(cape, 0, 0, null); abstractClientPlayer.getTextureCape().setBufferedImage(bo); } catch (MalformedURLException e) { e.printStackTrace(); } } } private class CloakPreload implements Runnable { String cloakURL; public CloakPreload(String link) { cloakURL = link; } @Override public void run() { try { GRAPHICS.drawImage(new ImageIcon(new URL(cloakURL)).getImage(), 0, 0, null); } catch (MalformedURLException e) { e.printStackTrace(); } } } public void refreshCapes() { cloaks.clear(); capePlayers.clear(); buildCloakURLDatabase(); } }