package mattparks.mods.space.core.proxy; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.BufferedReader; import java.io.File; 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.Map; import mattparks.mods.space.core.SpaceCore; import mattparks.mods.space.core.tick.TickHandlerClient; import mattparks.mods.space.core.util.SpaceMusicTicker; import mattparks.mods.space.mercury.MercuryCore; import micdoodle8.mods.galacticraft.api.event.client.CelestialBodyRenderEvent; import micdoodle8.mods.galacticraft.core.GalacticraftCore; import micdoodle8.mods.galacticraft.core.client.gui.screen.GuiCelestialSelection; import micdoodle8.mods.galacticraft.core.client.render.ThreadDownloadImageDataGC; import micdoodle8.mods.galacticraft.core.proxy.ClientProxyCore; import micdoodle8.mods.galacticraft.core.util.VersionUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.audio.MusicTicker; import net.minecraft.client.entity.AbstractClientPlayer; import net.minecraft.client.renderer.IImageBuffer; import net.minecraft.item.EnumRarity; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.event.RenderPlayerEvent; import net.minecraftforge.common.util.EnumHelper; import org.lwjgl.opengl.GL11; import com.google.common.collect.Maps; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.common.FMLLog; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.eventhandler.SubscribeEvent; public class ClientProxy extends CommonProxy { public static EnumRarity spaceItem = EnumHelper.addRarity("SpaceRarity", EnumChatFormatting.RED, "Space"); public static MusicTicker.MusicType MUSIC_TYPE_SPACE; private static Minecraft mc = FMLClientHandler.instance().getClient(); private static Map<String, ResourceLocation> capesMap = Maps.newHashMap(); private static final ResourceLocation saturnRingTexture = new ResourceLocation(GalacticraftCore.ASSET_PREFIX, "textures/gui/celestialbodies/saturnRings.png"); private static final ResourceLocation uranusRingTexture = new ResourceLocation(GalacticraftCore.ASSET_PREFIX, "textures/gui/celestialbodies/uranusRings.png"); @Override public void preInit(FMLPreInitializationEvent event) { super.preInit(event); } @Override public void init(FMLInitializationEvent event) { Class[][] commonTypes = { { MusicTicker.MusicType.class, ResourceLocation.class, int.class, int.class }, }; MUSIC_TYPE_SPACE = EnumHelper.addEnum(commonTypes, MusicTicker.MusicType.class, "SNOWSTORM", new ResourceLocation(MercuryCore.ASSET_PREFIX, "4space.musicSpace"), 12000, 24000); ClientProxyCore.setupCapes(); super.init(event); } @Override public void postInit(FMLPostInitializationEvent event) { try { Field ftc = Minecraft.getMinecraft().getClass().getDeclaredField(VersionUtil.getNameDynamic(VersionUtil.KEY_FIELD_MUSICTICKER)); ftc.setAccessible(true); ftc.set(Minecraft.getMinecraft(), new SpaceMusicTicker(Minecraft.getMinecraft())); } catch (Exception e) { e.printStackTrace(); } super.postInit(event); } public static void registerHandlers() { TickHandlerClient tickHandlerClient = new TickHandlerClient(); } public static void setupCapes() { try { ClientProxy.updateCapeList(); } catch (Exception e) { FMLLog.severe("Error while setting up 4Space capes"); e.printStackTrace(); } /* * if (Loader.isModLoaded("CoFHCore")) { for (Entry<String, String> e : * ClientProxy.capeMap.entrySet()) { try { Object capeRegistry = * Class.forName * ("cofh.api.core.RegistryAccess").getField("capeRegistry").get(null); * Class.forName("cofh.api.core.ISimpleRegistry").getMethod("register", * String.class, String.class).invoke(capeRegistry, e.getKey(), * e.getValue()); } catch (Exception e1) { e1.printStackTrace(); break; * } } } */ } private static void updateCapeList() { int timeout = 10000; URL capeListUrl = null; try { capeListUrl = new URL("https://raw.github.com/4Space/4Space-1.7/master/capes.txt"); } catch (MalformedURLException e) { FMLLog.severe("Error getting capes list URL"); e.printStackTrace(); return; } URLConnection connection = null; try { connection = capeListUrl.openConnection(); } catch (IOException e) { e.printStackTrace(); return; } connection.setConnectTimeout(timeout); connection.setReadTimeout(timeout); InputStream stream = null; try { stream = connection.getInputStream(); } catch (IOException e) { e.printStackTrace(); return; } InputStreamReader streamReader = new InputStreamReader(stream); BufferedReader reader = new BufferedReader(streamReader); String line; try { while ((line = reader.readLine()) != null) { if (line.contains(":")) { int splitLocation = line.indexOf(":"); String username = line.substring(0, splitLocation); String capeUrl = "https://raw.github.com/4Space/4Space-1.7/master/capes/" + line.substring(splitLocation + 1) + ".png"; ClientProxyCore.capeMap.put(username, capeUrl); } } } catch (IOException e) { e.printStackTrace(); } try { reader.close(); } catch (IOException e) { e.printStackTrace(); } try { streamReader.close(); } catch (IOException e) { e.printStackTrace(); } try { stream.close(); } catch (IOException e) { e.printStackTrace(); } } @SubscribeEvent public void onPostRender(RenderPlayerEvent.Specials.Post event) { AbstractClientPlayer player = (AbstractClientPlayer) event.entityPlayer; boolean flag = ClientProxyCore.capeMap.containsKey(event.entityPlayer.getCommandSenderName()); float f4; if (flag && !player.isInvisible() && !player.getHideCape()) { String url = ClientProxyCore.capeMap.get(player.getCommandSenderName()); ResourceLocation capeLoc = capesMap.get(url); if (!capesMap.containsKey(url)) { try { String dirName = Minecraft.getMinecraft().mcDataDir.getAbsolutePath(); File directory = new File(dirName, "assets"); boolean success = true; if (!directory.exists()) { success = directory.mkdir(); } if (success) { directory = new File(directory, "4SpaceCapes"); if (!directory.exists()) { success = directory.mkdir(); } if (success) { String hash = String.valueOf(player.getCommandSenderName().hashCode()); File file1 = new File(directory, hash.substring(0, 2)); File file2 = new File(file1, hash); final ResourceLocation resourcelocation = new ResourceLocation("4SpaceCapes/" + hash); ThreadDownloadImageDataGC threaddownloadimagedata = new ThreadDownloadImageDataGC(file2, url, null, new IImageBuffer() { public BufferedImage parseUserSkin(BufferedImage p_78432_1_) { if (p_78432_1_ == null) { return null; } else { BufferedImage bufferedimage1 = new BufferedImage(512, 256, 2); Graphics graphics = bufferedimage1.getGraphics(); graphics.drawImage(p_78432_1_, 0, 0, null); graphics.dispose(); p_78432_1_ = bufferedimage1; } return p_78432_1_; } public void func_152634_a() { } }); if (ClientProxy.mc.getTextureManager().loadTexture(resourcelocation, threaddownloadimagedata)) { capeLoc = resourcelocation; } } } } catch (Exception e) { e.printStackTrace(); } capesMap.put(url, capeLoc); } if (capeLoc != null) { ClientProxy.mc.getTextureManager().bindTexture(capeLoc); GL11.glPushMatrix(); GL11.glTranslatef(0.0F, 0.0F, 0.125F); double d3 = player.field_71091_bM + (player.field_71094_bP - player.field_71091_bM) * event.partialRenderTick - (player.prevPosX + (player.posX - player.prevPosX) * event.partialRenderTick); double d4 = player.field_71096_bN + (player.field_71095_bQ - player.field_71096_bN) * event.partialRenderTick - (player.prevPosY + (player.posY - player.prevPosY) * event.partialRenderTick); double d0 = player.field_71097_bO + (player.field_71085_bR - player.field_71097_bO) * event.partialRenderTick - (player.prevPosZ + (player.posZ - player.prevPosZ) * event.partialRenderTick); f4 = (player.prevRenderYawOffset + (player.renderYawOffset - player.prevRenderYawOffset) * event.partialRenderTick) / 57.29578F; double d1 = MathHelper.sin(f4); double d2 = -MathHelper.cos(f4); float f5 = (float) d4 * 10.0F; if (f5 < -6.0F) { f5 = -6.0F; } if (f5 > 32.0F) { f5 = 32.0F; } float f6 = (float) (d3 * d1 + d0 * d2) * 100.0F; float f7 = (float) (d3 * d2 - d0 * d1) * 100.0F; if (f6 < 0.0F) { f6 = 0.0F; } float f8 = player.prevCameraYaw + (player.cameraYaw - player.prevCameraYaw) * event.partialRenderTick; f5 += MathHelper.sin((player.prevDistanceWalkedModified + (player.distanceWalkedModified - player.prevDistanceWalkedModified) * event.partialRenderTick) * 6.0F) * 32.0F * f8; if (player.isSneaking()) { f5 += 25.0F; } GL11.glRotatef(6.0F + f6 / 2.0F + f5, 1.0F, 0.0F, 0.0F); GL11.glRotatef(f7 / 2.0F, 0.0F, 0.0F, 1.0F); GL11.glRotatef(-f7 / 2.0F, 0.0F, 1.0F, 0.0F); GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); event.renderer.modelBipedMain.renderCloak(0.0625F); GL11.glPopMatrix(); } } } @SubscribeEvent public void onRenderPlanetPost(CelestialBodyRenderEvent.Post event) { // TODO? if (this.mc.currentScreen instanceof GuiCelestialSelection) { if (event.celestialBody == SpaceCore.planetSaturn) { this.mc.renderEngine.bindTexture(saturnRingTexture); float size = GuiCelestialSelection.getWidthForCelestialBodyStatic(event.celestialBody) / 6.0F; ((GuiCelestialSelection) this.mc.currentScreen).drawTexturedModalRect(-7.5F * size, -1.75F * size, 15.0F * size, 3.5F * size, 0, 0, 30, 7, false, false, 30, 7); } else if (event.celestialBody == SpaceCore.planetUranus) { this.mc.renderEngine.bindTexture(uranusRingTexture); float size = GuiCelestialSelection.getWidthForCelestialBodyStatic(event.celestialBody) / 6.0F; ((GuiCelestialSelection) this.mc.currentScreen).drawTexturedModalRect(-1.75F * size, -7.0F * size, 3.5F * size, 14.0F * size, 0, 0, 28, 7, false, false, 28, 7); } } } }