added multiplayer capes
|
@ -15,8 +15,10 @@ import net.md_5.bungee.event.EventHandler;
|
||||||
public class PluginEaglerSkins extends Plugin implements Listener {
|
public class PluginEaglerSkins extends Plugin implements Listener {
|
||||||
|
|
||||||
private final HashMap<String,byte[]> skinCollection = new HashMap();
|
private final HashMap<String,byte[]> skinCollection = new HashMap();
|
||||||
|
private final HashMap<String,byte[]> capeCollection = new HashMap();
|
||||||
|
|
||||||
private static final int[] SKIN_DATA_SIZE = new int[] { 64*32*4, 64*64*4, 128*64*4, 128*128*4, 1, 64*64*4, 128*128*4 };
|
private static final int[] SKIN_DATA_SIZE = new int[] { 64*32*4, 64*64*4, -9, -9, 1, 64*64*4, -9 }; // 128 pixel skins crash clients
|
||||||
|
private static final int[] CAPE_DATA_SIZE = new int[] { 32*32*4, -9, 1 };
|
||||||
|
|
||||||
public PluginEaglerSkins() {
|
public PluginEaglerSkins() {
|
||||||
super(new PluginDescription("EaglerSkins", PluginEaglerSkins.class.getName(), "1.0.0", "LAX1DUDE", Collections.emptySet(), null));
|
super(new PluginDescription("EaglerSkins", PluginEaglerSkins.class.getName(), "1.0.0", "LAX1DUDE", Collections.emptySet(), null));
|
||||||
|
@ -45,6 +47,11 @@ public class PluginEaglerSkins extends Plugin implements Listener {
|
||||||
if(t >= 0 && t < SKIN_DATA_SIZE.length && msg.length == (SKIN_DATA_SIZE[t] + 1)) {
|
if(t >= 0 && t < SKIN_DATA_SIZE.length && msg.length == (SKIN_DATA_SIZE[t] + 1)) {
|
||||||
skinCollection.put(user, msg);
|
skinCollection.put(user, msg);
|
||||||
}
|
}
|
||||||
|
}else if("EAG|MyCape".equals(event.getTag())) {
|
||||||
|
int t = (int)msg[0] & 0xFF;
|
||||||
|
if(t >= 0 && t < CAPE_DATA_SIZE.length && msg.length == (CAPE_DATA_SIZE[t] + 1)) {
|
||||||
|
capeCollection.put(user, msg);
|
||||||
|
}
|
||||||
}else if("EAG|FetchSkin".equals(event.getTag())) {
|
}else if("EAG|FetchSkin".equals(event.getTag())) {
|
||||||
if(msg.length > 2) {
|
if(msg.length > 2) {
|
||||||
String fetch = new String(msg, 2, msg.length - 2, StandardCharsets.UTF_8);
|
String fetch = new String(msg, 2, msg.length - 2, StandardCharsets.UTF_8);
|
||||||
|
@ -53,6 +60,12 @@ public class PluginEaglerSkins extends Plugin implements Listener {
|
||||||
byte[] conc = new byte[data.length + 2];
|
byte[] conc = new byte[data.length + 2];
|
||||||
conc[0] = msg[0]; conc[1] = msg[1]; //synchronization cookie
|
conc[0] = msg[0]; conc[1] = msg[1]; //synchronization cookie
|
||||||
System.arraycopy(data, 0, conc, 2, data.length);
|
System.arraycopy(data, 0, conc, 2, data.length);
|
||||||
|
if((data = capeCollection.get(fetch)) != null) {
|
||||||
|
byte[] conc2 = new byte[conc.length + data.length];
|
||||||
|
System.arraycopy(conc, 0, conc2, 0, conc.length);
|
||||||
|
System.arraycopy(data, 0, conc2, conc.length, data.length);
|
||||||
|
conc = conc2;
|
||||||
|
}
|
||||||
((UserConnection)event.getSender()).sendData("EAG|UserSkin", conc);
|
((UserConnection)event.getSender()).sendData("EAG|UserSkin", conc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -66,6 +79,7 @@ public class PluginEaglerSkins extends Plugin implements Listener {
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPlayerDisconnect(PlayerDisconnectEvent event) {
|
public void onPlayerDisconnect(PlayerDisconnectEvent event) {
|
||||||
skinCollection.remove(event.getPlayer().getName());
|
skinCollection.remove(event.getPlayer().getName());
|
||||||
|
capeCollection.remove(event.getPlayer().getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,11 +31,32 @@ menu.convertingLevel=Converting world
|
||||||
menu.simulating=Simulating the world for a bit
|
menu.simulating=Simulating the world for a bit
|
||||||
menu.respawning=Respawning
|
menu.respawning=Respawning
|
||||||
menu.shareToLan=Open to LAN
|
menu.shareToLan=Open to LAN
|
||||||
|
menu.skinCapeSettings=Skins/Capes Settings...
|
||||||
|
menu.skinCapeSettingsNote0=I put the button up here so
|
||||||
|
menu.skinCapeSettingsNote1=lazy people can find it
|
||||||
|
menu.skinCapeSettings.skinCustomization=Skin Customization
|
||||||
|
menu.skinCapeSettings.skinCustomization.cape=Cape
|
||||||
|
menu.skinCapeSettings.skinCustomization.jacket=Jacket
|
||||||
|
menu.skinCapeSettings.skinCustomization.hat=Hat
|
||||||
|
menu.skinCapeSettings.skinCustomization.leftArm=Left Sleeve
|
||||||
|
menu.skinCapeSettings.skinCustomization.rightArm=Right Sleeve
|
||||||
|
menu.skinCapeSettings.skinCustomization.leftPants=Left Pants Leg
|
||||||
|
menu.skinCapeSettings.skinCustomization.rightPants=Right Pants Leg
|
||||||
|
menu.skinCapeSettings.skinCustomization.allOff=All Off
|
||||||
|
menu.skinCapeSettings.skinCustomization.allOn=All On
|
||||||
|
menu.skinCapeSettings.skinCustomization.otherPlayers=Other Players
|
||||||
|
menu.skinCapeSettings.skinCustomization.showErasersOn=Eraser Skins: Enable
|
||||||
|
menu.skinCapeSettings.skinCustomization.showErasersOff=Eraser Skins: Disable
|
||||||
|
menu.skinCapeSettings.skinCustomization.showOtherCapes=Show Capes
|
||||||
|
|
||||||
profile.title=Edit Profile
|
profile.title=Edit Profile
|
||||||
|
profile.capeTitle=Select Cape
|
||||||
profile.screenname=Screenname
|
profile.screenname=Screenname
|
||||||
profile.playerSkin=Player Skin
|
profile.playerSkin=Player Skin
|
||||||
|
profile.playerCape=Player Cape
|
||||||
profile.addSkin=Add Skin
|
profile.addSkin=Add Skin
|
||||||
|
profile.addCape=Add Cape
|
||||||
|
profile.capes=Capes
|
||||||
profile.clearSkin=Clear List
|
profile.clearSkin=Clear List
|
||||||
|
|
||||||
fancyGraphicsNote=go to -> Options -> Video Settings on the pause menu to enable fancy graphics and smooth lighting
|
fancyGraphicsNote=go to -> Options -> Video Settings on the pause menu to enable fancy graphics and smooth lighting
|
||||||
|
@ -293,7 +314,7 @@ options.particles=Particles
|
||||||
options.particles.all=All
|
options.particles.all=All
|
||||||
options.particles.decreased=Decreased
|
options.particles.decreased=Decreased
|
||||||
options.particles.minimal=Minimal
|
options.particles.minimal=Minimal
|
||||||
options.multiplayer.title=Multiplayer Settings...
|
options.multiplayer.title=Chat Settings...
|
||||||
options.chat.title=Chat Settings...
|
options.chat.title=Chat Settings...
|
||||||
options.chat.visibility=Chat
|
options.chat.visibility=Chat
|
||||||
options.chat.visibility.full=Shown
|
options.chat.visibility.full=Shown
|
||||||
|
|
BIN
lwjgl-rundir/resources/skins/c01.minecon_2011.png
Normal file
After Width: | Height: | Size: 410 B |
BIN
lwjgl-rundir/resources/skins/c02.minecon_2012.png
Normal file
After Width: | Height: | Size: 438 B |
BIN
lwjgl-rundir/resources/skins/c03.minecon_2013.png
Normal file
After Width: | Height: | Size: 498 B |
BIN
lwjgl-rundir/resources/skins/c04.minecon_2015.png
Normal file
After Width: | Height: | Size: 456 B |
BIN
lwjgl-rundir/resources/skins/c05.minecon_2016.png
Normal file
After Width: | Height: | Size: 404 B |
BIN
lwjgl-rundir/resources/skins/c06.microsoft_account.png
Normal file
After Width: | Height: | Size: 510 B |
BIN
lwjgl-rundir/resources/skins/c07.mapmaker.png
Normal file
After Width: | Height: | Size: 658 B |
BIN
lwjgl-rundir/resources/skins/c08.mojang_old.png
Normal file
After Width: | Height: | Size: 635 B |
BIN
lwjgl-rundir/resources/skins/c09.mojang_new.png
Normal file
After Width: | Height: | Size: 363 B |
BIN
lwjgl-rundir/resources/skins/c10.jira_mod.png
Normal file
After Width: | Height: | Size: 573 B |
BIN
lwjgl-rundir/resources/skins/c11.mojang_very_old.png
Normal file
After Width: | Height: | Size: 785 B |
BIN
lwjgl-rundir/resources/skins/c12.scrolls.png
Normal file
After Width: | Height: | Size: 838 B |
BIN
lwjgl-rundir/resources/skins/c13.cobalt.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
lwjgl-rundir/resources/skins/c14.translator.png
Normal file
After Width: | Height: | Size: 895 B |
BIN
lwjgl-rundir/resources/skins/c15.millionth_account.png
Normal file
After Width: | Height: | Size: 923 B |
BIN
lwjgl-rundir/resources/skins/c16.prismarine.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
lwjgl-rundir/resources/skins/c17.snowman.png
Normal file
After Width: | Height: | Size: 692 B |
BIN
lwjgl-rundir/resources/skins/c18.spade.png
Normal file
After Width: | Height: | Size: 640 B |
BIN
lwjgl-rundir/resources/skins/c19.birthday.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
lwjgl-rundir/resources/skins/c20.db.png
Normal file
After Width: | Height: | Size: 700 B |
|
@ -4,6 +4,7 @@ import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
import net.lax1dude.eaglercraft.EaglerProfile.EaglerProfileCape;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.src.EntityClientPlayerMP;
|
import net.minecraft.src.EntityClientPlayerMP;
|
||||||
import net.minecraft.src.EntityOtherPlayerMP;
|
import net.minecraft.src.EntityOtherPlayerMP;
|
||||||
|
@ -58,6 +59,30 @@ public class DefaultSkinRenderer {
|
||||||
null, null, null, null, null
|
null, null, null, null, null
|
||||||
};
|
};
|
||||||
|
|
||||||
|
public static final TextureLocation[] defaultVanillaCapes = new TextureLocation[] {
|
||||||
|
null,
|
||||||
|
new TextureLocation("/skins/c01.minecon_2011.png"),
|
||||||
|
new TextureLocation("/skins/c02.minecon_2012.png"),
|
||||||
|
new TextureLocation("/skins/c03.minecon_2013.png"),
|
||||||
|
new TextureLocation("/skins/c04.minecon_2015.png"),
|
||||||
|
new TextureLocation("/skins/c05.minecon_2016.png"),
|
||||||
|
new TextureLocation("/skins/c06.microsoft_account.png"),
|
||||||
|
new TextureLocation("/skins/c07.mapmaker.png"),
|
||||||
|
new TextureLocation("/skins/c08.mojang_old.png"),
|
||||||
|
new TextureLocation("/skins/c09.mojang_new.png"),
|
||||||
|
new TextureLocation("/skins/c10.jira_mod.png"),
|
||||||
|
new TextureLocation("/skins/c11.mojang_very_old.png"),
|
||||||
|
new TextureLocation("/skins/c12.scrolls.png"),
|
||||||
|
new TextureLocation("/skins/c13.cobalt.png"),
|
||||||
|
new TextureLocation("/skins/c14.translator.png"),
|
||||||
|
new TextureLocation("/skins/c15.millionth_account.png"),
|
||||||
|
new TextureLocation("/skins/c16.prismarine.png"),
|
||||||
|
new TextureLocation("/skins/c17.snowman.png"),
|
||||||
|
new TextureLocation("/skins/c18.spade.png"),
|
||||||
|
new TextureLocation("/skins/c19.birthday.png"),
|
||||||
|
new TextureLocation("/skins/c20.db.png")
|
||||||
|
};
|
||||||
|
|
||||||
public static final HighPolySkin[] defaultHighPoly = new HighPolySkin[] {
|
public static final HighPolySkin[] defaultHighPoly = new HighPolySkin[] {
|
||||||
null, null, null, null, null, null, null, null, null, null,
|
null, null, null, null, null, null, null, null, null, null,
|
||||||
null, null, null, null, null, null, null, null, null, null,
|
null, null, null, null, null, null, null, null, null, null,
|
||||||
|
@ -81,6 +106,7 @@ public class DefaultSkinRenderer {
|
||||||
|
|
||||||
private static final HashMap<Integer,EntityOtherPlayerMP> skinCookies = new HashMap();
|
private static final HashMap<Integer,EntityOtherPlayerMP> skinCookies = new HashMap();
|
||||||
private static final HashMap<EntityOtherPlayerMP,Integer> skinGLUnits = new HashMap();
|
private static final HashMap<EntityOtherPlayerMP,Integer> skinGLUnits = new HashMap();
|
||||||
|
private static final HashMap<EntityOtherPlayerMP,Integer> capeGLUnits = new HashMap();
|
||||||
private static final HashMap<EntityOtherPlayerMP,Long> skinGLTimeout = new HashMap();
|
private static final HashMap<EntityOtherPlayerMP,Long> skinGLTimeout = new HashMap();
|
||||||
|
|
||||||
private static long lastClean = 0l;
|
private static long lastClean = 0l;
|
||||||
|
@ -96,6 +122,9 @@ public class DefaultSkinRenderer {
|
||||||
if(skinGLUnits.containsKey(ee.getKey())) {
|
if(skinGLUnits.containsKey(ee.getKey())) {
|
||||||
Minecraft.getMinecraft().renderEngine.deleteTexture(skinGLUnits.remove(ee.getKey()));
|
Minecraft.getMinecraft().renderEngine.deleteTexture(skinGLUnits.remove(ee.getKey()));
|
||||||
}
|
}
|
||||||
|
if(capeGLUnits.containsKey(ee.getKey())) {
|
||||||
|
Minecraft.getMinecraft().renderEngine.deleteTexture(capeGLUnits.remove(ee.getKey()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Iterator<Entry<Integer, EntityOtherPlayerMP>> itr2 = skinCookies.entrySet().iterator();
|
Iterator<Entry<Integer, EntityOtherPlayerMP>> itr2 = skinCookies.entrySet().iterator();
|
||||||
|
@ -114,9 +143,10 @@ public class DefaultSkinRenderer {
|
||||||
}else if(p instanceof EntityOtherPlayerMP) {
|
}else if(p instanceof EntityOtherPlayerMP) {
|
||||||
EntityOtherPlayerMP pp = (EntityOtherPlayerMP) p;
|
EntityOtherPlayerMP pp = (EntityOtherPlayerMP) p;
|
||||||
if(pp.skinPacket != null) {
|
if(pp.skinPacket != null) {
|
||||||
if(((int)pp.skinPacket[0] & 0xFF) != 4) {
|
int type = ((int)pp.skinPacket[0] & 0xFF);
|
||||||
|
if(type != 4 && type >= 0 && type < EaglerProfile.SKIN_DATA_SIZE.length) {
|
||||||
if(!skinGLUnits.containsKey(pp)) {
|
if(!skinGLUnits.containsKey(pp)) {
|
||||||
byte[] skinToLoad = new byte[pp.skinPacket.length - 1];
|
byte[] skinToLoad = new byte[EaglerProfile.SKIN_DATA_SIZE[type]];
|
||||||
System.arraycopy(pp.skinPacket, 1, skinToLoad, 0, skinToLoad.length);
|
System.arraycopy(pp.skinPacket, 1, skinToLoad, 0, skinToLoad.length);
|
||||||
int w, h;
|
int w, h;
|
||||||
|
|
||||||
|
@ -131,15 +161,6 @@ public class DefaultSkinRenderer {
|
||||||
w = 64;
|
w = 64;
|
||||||
h = 64;
|
h = 64;
|
||||||
break;
|
break;
|
||||||
case 2:
|
|
||||||
w = 128;
|
|
||||||
h = 64;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
case 6:
|
|
||||||
w = 128;
|
|
||||||
h = 128;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(skinToLoad.length / 4 == w * h) {
|
if(skinToLoad.length / 4 == w * h) {
|
||||||
|
@ -160,6 +181,110 @@ public class DefaultSkinRenderer {
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}else {
|
}else {
|
||||||
|
requestSkin(pp);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean bindSyncedCape(EntityPlayer p) {
|
||||||
|
EaglerAdapter.glMatrixMode(EaglerAdapter.GL_TEXTURE);
|
||||||
|
EaglerAdapter.glPushMatrix();
|
||||||
|
EaglerAdapter.glMatrixMode(EaglerAdapter.GL_MODELVIEW);
|
||||||
|
if(p instanceof EntityClientPlayerMP) {
|
||||||
|
if(EaglerProfile.presetCapeId < 0) {
|
||||||
|
EaglerProfileCape cp = EaglerProfile.capes.get(EaglerProfile.customCapeId);
|
||||||
|
if(cp != null) {
|
||||||
|
Minecraft.getMinecraft().renderEngine.bindTexture(cp.glTex);
|
||||||
|
EaglerAdapter.glMatrixMode(EaglerAdapter.GL_TEXTURE);
|
||||||
|
EaglerAdapter.glScalef(2.0f, 1.0f, 1.0f);
|
||||||
|
EaglerAdapter.glMatrixMode(EaglerAdapter.GL_MODELVIEW);
|
||||||
|
return true;
|
||||||
|
}else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
if(EaglerProfile.presetCapeId < defaultVanillaCapes.length) {
|
||||||
|
TextureLocation loc = defaultVanillaCapes[EaglerProfile.presetCapeId];
|
||||||
|
if(loc == null) {
|
||||||
|
return false;
|
||||||
|
}else {
|
||||||
|
loc.bindTexture();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else if(p instanceof EntityOtherPlayerMP) {
|
||||||
|
EntityOtherPlayerMP pp = (EntityOtherPlayerMP) p;
|
||||||
|
if(pp.skinPacket != null) {
|
||||||
|
int tp = ((int)pp.skinPacket[0] & 0xFF);
|
||||||
|
if(tp >= 0 && tp < EaglerProfile.SKIN_DATA_SIZE.length) {
|
||||||
|
int offset = 1 + EaglerProfile.SKIN_DATA_SIZE[tp];
|
||||||
|
if(pp.skinPacket.length > offset) {
|
||||||
|
int capeType = (int)pp.skinPacket[offset] & 0xFF;
|
||||||
|
if(capeType >= 0 && capeType < EaglerProfile.CAPE_DATA_SIZE.length) {
|
||||||
|
int len = EaglerProfile.CAPE_DATA_SIZE[capeType];
|
||||||
|
if(pp.skinPacket.length > offset + len) {
|
||||||
|
if(capeType != 2) {
|
||||||
|
if(!capeGLUnits.containsKey(pp)) {
|
||||||
|
byte[] dataToLoad = new byte[len];
|
||||||
|
System.arraycopy(pp.skinPacket, offset + 1, dataToLoad, 0, len);
|
||||||
|
int w, h;
|
||||||
|
switch(capeType) {
|
||||||
|
case 0:
|
||||||
|
default:
|
||||||
|
w = 32;
|
||||||
|
h = 32;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(dataToLoad.length / 4 == w * h) {
|
||||||
|
capeGLUnits.put(pp, Minecraft.getMinecraft().renderEngine.setupTextureRaw(dataToLoad, w, h));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
skinGLTimeout.put(pp, System.currentTimeMillis());
|
||||||
|
Integer i = capeGLUnits.get(pp);
|
||||||
|
if(i != null && i.intValue() > 0) {
|
||||||
|
EaglerAdapter.glMatrixMode(EaglerAdapter.GL_TEXTURE);
|
||||||
|
EaglerAdapter.glScalef(2.0f, 1.0f, 1.0f);
|
||||||
|
EaglerAdapter.glMatrixMode(EaglerAdapter.GL_MODELVIEW);
|
||||||
|
Minecraft.getMinecraft().renderEngine.bindTexture(i.intValue());
|
||||||
|
return true;
|
||||||
|
}else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
int preset = (int)pp.skinPacket[offset + 1] & 0xFF;
|
||||||
|
if(preset < defaultVanillaCapes.length) {
|
||||||
|
TextureLocation loc = defaultVanillaCapes[preset];
|
||||||
|
if(loc == null) {
|
||||||
|
return false;
|
||||||
|
}else {
|
||||||
|
loc.bindTexture();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
requestSkin(pp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void requestSkin(EntityOtherPlayerMP pp) {
|
||||||
if(!skinCookies.containsValue(pp)) {
|
if(!skinCookies.containsValue(pp)) {
|
||||||
int cookie = (int)(System.nanoTime() % 65536);
|
int cookie = (int)(System.nanoTime() % 65536);
|
||||||
skinCookies.put(cookie, pp);
|
skinCookies.put(cookie, pp);
|
||||||
|
@ -171,11 +296,6 @@ public class DefaultSkinRenderer {
|
||||||
Minecraft.getMinecraft().getNetHandler().addToSendQueue(new Packet250CustomPayload("EAG|FetchSkin", pkt));
|
Minecraft.getMinecraft().getNetHandler().addToSendQueue(new Packet250CustomPayload("EAG|FetchSkin", pkt));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
}else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void skinResponse(byte[] data) {
|
public static void skinResponse(byte[] data) {
|
||||||
int cookie = ((int)data[0] & 0xFF) | (((int)data[1] & 0xFF) << 8);
|
int cookie = ((int)data[0] & 0xFF) | (((int)data[1] & 0xFF) << 8);
|
||||||
|
@ -322,6 +442,10 @@ public class DefaultSkinRenderer {
|
||||||
public static ModelSkeleton skeletonRenderer = null;
|
public static ModelSkeleton skeletonRenderer = null;
|
||||||
|
|
||||||
public static void renderPlayerPreview(int x, int y, int mx, int my, int id2) {
|
public static void renderPlayerPreview(int x, int y, int mx, int my, int id2) {
|
||||||
|
boolean capeMode = (id2 & 0x10000) == 0x10000;
|
||||||
|
if(capeMode) {
|
||||||
|
id2 -= 0x10000;
|
||||||
|
}
|
||||||
int id = id2 - EaglerProfile.skins.size();
|
int id = id2 - EaglerProfile.skins.size();
|
||||||
boolean highPoly = isHighPoly(id);
|
boolean highPoly = isHighPoly(id);
|
||||||
|
|
||||||
|
@ -341,7 +465,13 @@ public class DefaultSkinRenderer {
|
||||||
EaglerAdapter.glScalef(1.0F, -1.0F, 1.0F);
|
EaglerAdapter.glScalef(1.0F, -1.0F, 1.0F);
|
||||||
RenderHelper.enableGUIStandardItemLighting();
|
RenderHelper.enableGUIStandardItemLighting();
|
||||||
EaglerAdapter.glTranslatef(0.0F, 1.0F, 0.0F);
|
EaglerAdapter.glTranslatef(0.0F, 1.0F, 0.0F);
|
||||||
|
if(capeMode) {
|
||||||
|
EaglerAdapter.glRotatef(140.0f, 0.0f, 1.0f, 0.0f);
|
||||||
|
mx = x - (x - mx) - 20;
|
||||||
|
EaglerAdapter.glRotatef(((y - my) * -0.02f), 1.0f, 0.0f, 0.0f);
|
||||||
|
}else {
|
||||||
EaglerAdapter.glRotatef(((y - my) * -0.06f), 1.0f, 0.0f, 0.0f);
|
EaglerAdapter.glRotatef(((y - my) * -0.06f), 1.0f, 0.0f, 0.0f);
|
||||||
|
}
|
||||||
EaglerAdapter.glRotatef(((x - mx) * 0.06f), 0.0f, 1.0f, 0.0f);
|
EaglerAdapter.glRotatef(((x - mx) * 0.06f), 0.0f, 1.0f, 0.0f);
|
||||||
EaglerAdapter.glTranslatef(0.0F, -1.0F, 0.0F);
|
EaglerAdapter.glTranslatef(0.0F, -1.0F, 0.0F);
|
||||||
|
|
||||||
|
@ -426,6 +556,33 @@ public class DefaultSkinRenderer {
|
||||||
oldSkinRenderer.render(null, 0.0f, 0.0f, (float)(System.currentTimeMillis() % 100000) / 50f, ((x - mx) * 0.06f), ((y - my) * -0.1f), 0.0625F);
|
oldSkinRenderer.render(null, 0.0f, 0.0f, (float)(System.currentTimeMillis() % 100000) / 50f, ((x - mx) * 0.06f), ((y - my) * -0.1f), 0.0625F);
|
||||||
oldSkinRenderer.blockTransparentSkin = false;
|
oldSkinRenderer.blockTransparentSkin = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(capeMode && !(EaglerProfile.presetCapeId >= 0 && defaultVanillaCapes[EaglerProfile.presetCapeId] == null)) {
|
||||||
|
EaglerAdapter.glPushMatrix();
|
||||||
|
EaglerAdapter.glTranslatef(0.0F, 0.0F, 0.150F);
|
||||||
|
EaglerAdapter.glRotatef(180.0F, 0.0F, 1.0F, 0.0F);
|
||||||
|
EaglerAdapter.glRotatef(-6.0F, 1.0F, 0.0F, 0.0F);
|
||||||
|
|
||||||
|
if(EaglerProfile.presetCapeId < 0) {
|
||||||
|
Minecraft.getMinecraft().renderEngine.bindTexture(EaglerProfile.capes.get(EaglerProfile.customCapeId).glTex);
|
||||||
|
EaglerAdapter.glMatrixMode(EaglerAdapter.GL_TEXTURE);
|
||||||
|
EaglerAdapter.glPushMatrix();
|
||||||
|
EaglerAdapter.glScalef(2.0f, 1.0f, 1.0f);
|
||||||
|
EaglerAdapter.glMatrixMode(EaglerAdapter.GL_MODELVIEW);
|
||||||
|
}else {
|
||||||
|
defaultVanillaCapes[EaglerProfile.presetCapeId].bindTexture();
|
||||||
|
}
|
||||||
|
|
||||||
|
oldSkinRenderer.bipedCloak.render(0.0625F);
|
||||||
|
|
||||||
|
if(EaglerProfile.presetCapeId < 0) {
|
||||||
|
EaglerAdapter.glMatrixMode(EaglerAdapter.GL_TEXTURE);
|
||||||
|
EaglerAdapter.glPopMatrix();
|
||||||
|
EaglerAdapter.glMatrixMode(EaglerAdapter.GL_MODELVIEW);
|
||||||
|
}
|
||||||
|
|
||||||
|
EaglerAdapter.glPopMatrix();
|
||||||
|
}
|
||||||
}else if(isZombieModel(id)) {
|
}else if(isZombieModel(id)) {
|
||||||
if(zombieRenderer == null) zombieRenderer = new ModelZombie(0.0F, true);
|
if(zombieRenderer == null) zombieRenderer = new ModelZombie(0.0F, true);
|
||||||
zombieRenderer.isChild = false;
|
zombieRenderer.isChild = false;
|
||||||
|
|
|
@ -22,16 +22,32 @@ public class EaglerProfile {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class EaglerProfileCape {
|
||||||
|
public String name;
|
||||||
|
public byte[] data;
|
||||||
|
public int glTex;
|
||||||
|
public EaglerProfileCape(String name, byte[] data, int glTex) {
|
||||||
|
this.name = name;
|
||||||
|
this.data = data;
|
||||||
|
this.glTex = glTex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static String username;
|
public static String username;
|
||||||
public static int presetSkinId;
|
public static int presetSkinId;
|
||||||
public static int customSkinId;
|
public static int customSkinId;
|
||||||
|
public static int presetCapeId;
|
||||||
|
public static int customCapeId;
|
||||||
|
|
||||||
public static int newSkinNotificationIndex = 0;
|
public static int newSkinNotificationIndex = 0;
|
||||||
|
|
||||||
public static String myChannel;
|
public static String myChannel;
|
||||||
|
|
||||||
public static final int[] SKIN_DATA_SIZE = new int[] { 64*32*4, 64*64*4, 128*64*4, 128*128*4, 2, 64*64*4, 128*128*4 };
|
public static final int[] SKIN_DATA_SIZE = new int[] { 64*32*4, 64*64*4, -9, -9, 1, 64*64*4, -9 };
|
||||||
|
public static final int[] CAPE_DATA_SIZE = new int[] { 32*32*4, -9, 1 };
|
||||||
|
|
||||||
public static ArrayList<EaglerProfileSkin> skins = new ArrayList();
|
public static ArrayList<EaglerProfileSkin> skins = new ArrayList();
|
||||||
|
public static ArrayList<EaglerProfileCape> capes = new ArrayList();
|
||||||
|
|
||||||
public static final EaglercraftRandom rand;
|
public static final EaglercraftRandom rand;
|
||||||
|
|
||||||
|
@ -44,11 +60,27 @@ public class EaglerProfile {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int getCapeSize(int len) {
|
||||||
|
for(int i = 0; i < CAPE_DATA_SIZE.length; ++i) {
|
||||||
|
if(len == CAPE_DATA_SIZE[i]) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
public static byte[] getSkinPacket() {
|
public static byte[] getSkinPacket() {
|
||||||
if(presetSkinId == -1) {
|
if(presetSkinId == -1) {
|
||||||
byte[] d = skins.get(customSkinId).data;
|
byte[] d = skins.get(customSkinId).data;
|
||||||
|
if(d == null) {
|
||||||
|
return new byte[] { (byte)4, (byte)0 };
|
||||||
|
}
|
||||||
byte[] d2 = new byte[1 + d.length];
|
byte[] d2 = new byte[1 + d.length];
|
||||||
d2[0] = (byte) getSkinSize(d.length);
|
int sz = getSkinSize(d.length);
|
||||||
|
if(sz < 0) {
|
||||||
|
return new byte[] { (byte)4, (byte)0 };
|
||||||
|
}
|
||||||
|
d2[0] = (byte) sz;
|
||||||
if(d2[0] == (byte)1 && skins.get(customSkinId).slim) {
|
if(d2[0] == (byte)1 && skins.get(customSkinId).slim) {
|
||||||
d2[0] = (byte)5;
|
d2[0] = (byte)5;
|
||||||
}
|
}
|
||||||
|
@ -62,6 +94,25 @@ public class EaglerProfile {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static byte[] getCapePacket() {
|
||||||
|
if(presetCapeId == -1) {
|
||||||
|
byte[] d = capes.get(customCapeId).data;
|
||||||
|
if(d == null) {
|
||||||
|
return new byte[] { (byte)2, (byte)0 };
|
||||||
|
}
|
||||||
|
byte[] d2 = new byte[1 + d.length];
|
||||||
|
int sz = getCapeSize(d.length);
|
||||||
|
if(sz < 0) {
|
||||||
|
return new byte[] { (byte)2, (byte)0 };
|
||||||
|
}
|
||||||
|
d2[0] = (byte) sz;
|
||||||
|
System.arraycopy(d, 0, d2, 1, d.length);
|
||||||
|
return d2;
|
||||||
|
}else {
|
||||||
|
return new byte[] { (byte)2, (byte)presetCapeId };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static String[] concatArrays(String[] a, String[] b) {
|
public static String[] concatArrays(String[] a, String[] b) {
|
||||||
String[] r = new String[a.length + b.length];
|
String[] r = new String[a.length + b.length];
|
||||||
System.arraycopy(a, 0, r, 0, a.length);
|
System.arraycopy(a, 0, r, 0, a.length);
|
||||||
|
@ -96,15 +147,6 @@ public class EaglerProfile {
|
||||||
w = 64;
|
w = 64;
|
||||||
h = 64;
|
h = 64;
|
||||||
break;
|
break;
|
||||||
case 2:
|
|
||||||
w = 128;
|
|
||||||
h = 64;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
case 6:
|
|
||||||
w = 128;
|
|
||||||
h = 128;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int im = Minecraft.getMinecraft().renderEngine.setupTextureRaw(data, w, h);
|
int im = Minecraft.getMinecraft().renderEngine.setupTextureRaw(data, w, h);
|
||||||
|
@ -120,6 +162,42 @@ public class EaglerProfile {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int addCape(String name, byte[] data) {
|
||||||
|
int i = -1;
|
||||||
|
for(int j = 0, l = capes.size(); j < l; ++j) {
|
||||||
|
if(capes.get(j).name.equalsIgnoreCase(name)) {
|
||||||
|
i = j;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int t = getCapeSize(data.length);
|
||||||
|
|
||||||
|
if(t == -1) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int w, h;
|
||||||
|
|
||||||
|
switch(t) {
|
||||||
|
default:
|
||||||
|
case 0:
|
||||||
|
w = 32;
|
||||||
|
h = 32;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
int im = Minecraft.getMinecraft().renderEngine.setupTextureRaw(data, w, h);
|
||||||
|
if(i == -1) {
|
||||||
|
i = capes.size();
|
||||||
|
capes.add(new EaglerProfileCape(name, data, im));
|
||||||
|
}else {
|
||||||
|
capes.get(i).glTex = im;
|
||||||
|
capes.get(i).data = data;
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
static {
|
static {
|
||||||
String[] usernameDefaultWords = ConfigConstants.profanity ? new String[] {
|
String[] usernameDefaultWords = ConfigConstants.profanity ? new String[] {
|
||||||
"Eagler", "Eagler", "Bitch", "Cock", "Milf", "Milf", "Yeer", "Groon",
|
"Eagler", "Eagler", "Bitch", "Cock", "Milf", "Milf", "Yeer", "Groon",
|
||||||
|
@ -147,6 +225,8 @@ public class EaglerProfile {
|
||||||
if(!LocalStorageManager.profileSettingsStorage.hasNoTags()) {
|
if(!LocalStorageManager.profileSettingsStorage.hasNoTags()) {
|
||||||
presetSkinId = LocalStorageManager.profileSettingsStorage.getInteger("ps");
|
presetSkinId = LocalStorageManager.profileSettingsStorage.getInteger("ps");
|
||||||
customSkinId = LocalStorageManager.profileSettingsStorage.getInteger("cs");
|
customSkinId = LocalStorageManager.profileSettingsStorage.getInteger("cs");
|
||||||
|
presetCapeId = LocalStorageManager.profileSettingsStorage.getInteger("pc");
|
||||||
|
customCapeId = LocalStorageManager.profileSettingsStorage.getInteger("cc");
|
||||||
username = LocalStorageManager.profileSettingsStorage.getString("name");
|
username = LocalStorageManager.profileSettingsStorage.getString("name");
|
||||||
newSkinNotificationIndex = LocalStorageManager.profileSettingsStorage.getInteger("nsi");
|
newSkinNotificationIndex = LocalStorageManager.profileSettingsStorage.getInteger("nsi");
|
||||||
if(newSkinNotificationIndex == 0) {
|
if(newSkinNotificationIndex == 0) {
|
||||||
|
@ -163,6 +243,13 @@ public class EaglerProfile {
|
||||||
addSkin(s2, ((NBTTagCompound)k).getByteArray("data"), ((NBTTagCompound)k).getBoolean("slim"));
|
addSkin(s2, ((NBTTagCompound)k).getByteArray("data"), ((NBTTagCompound)k).getBoolean("slim"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
n = LocalStorageManager.profileSettingsStorage.getCompoundTag("capes");
|
||||||
|
for(Object s : NBTTagCompound.getTagMap(n).keySet()) {
|
||||||
|
NBTTagCompound ct = n.getCompoundTag((String)s);
|
||||||
|
addCape((String)s, ct.getByteArray("data"));
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
newSkinNotificationIndex = GuiScreenEditProfile.newDefaultNotice;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
307
src/main/java/net/lax1dude/eaglercraft/GuiScreenEditCape.java
Normal file
|
@ -0,0 +1,307 @@
|
||||||
|
package net.lax1dude.eaglercraft;
|
||||||
|
|
||||||
|
import net.lax1dude.eaglercraft.EaglerProfile.EaglerProfileCape;
|
||||||
|
import net.minecraft.src.GuiButton;
|
||||||
|
import net.minecraft.src.GuiScreen;
|
||||||
|
import net.minecraft.src.StringTranslate;
|
||||||
|
|
||||||
|
public class GuiScreenEditCape extends GuiScreen {
|
||||||
|
|
||||||
|
private boolean dropDownOpen = false;
|
||||||
|
private String[] dropDownOptions;
|
||||||
|
private int slotsVisible = 0;
|
||||||
|
private int selectedSlot = 0;
|
||||||
|
private int scrollPos = -1;
|
||||||
|
private int skinsHeight = 0;
|
||||||
|
private boolean dragging = false;
|
||||||
|
private int mousex = 0;
|
||||||
|
private int mousey = 0;
|
||||||
|
|
||||||
|
public static final String[] defaultVanillaCapeNames = new String[] {
|
||||||
|
"No Cape",
|
||||||
|
"Minecon 2011",
|
||||||
|
"Minecon 2012",
|
||||||
|
"Minecon 2013",
|
||||||
|
"Minecon 2015",
|
||||||
|
"Minecon 2016",
|
||||||
|
"Microsoft Account",
|
||||||
|
"Realms Mapmaker",
|
||||||
|
"Mojang Old",
|
||||||
|
"Mojang New",
|
||||||
|
"Jira Moderator",
|
||||||
|
"Mojang Very Old",
|
||||||
|
"Scrolls",
|
||||||
|
"Cobalt",
|
||||||
|
"Lang Translator",
|
||||||
|
"Millionth Player",
|
||||||
|
"Prismarine",
|
||||||
|
"Snowman",
|
||||||
|
"Spade",
|
||||||
|
"Birthday",
|
||||||
|
"dB"
|
||||||
|
};
|
||||||
|
|
||||||
|
protected String screenTitle = "Select Cape";
|
||||||
|
|
||||||
|
private GuiScreen parent;
|
||||||
|
private int skinToShow;
|
||||||
|
|
||||||
|
public GuiScreenEditCape(GuiScreen parent, int skinToShow) {
|
||||||
|
this.parent = parent;
|
||||||
|
this.skinToShow = skinToShow;
|
||||||
|
reconcatDD();
|
||||||
|
this.selectedSlot = EaglerProfile.presetCapeId < 0 ? EaglerProfile.customCapeId : (EaglerProfile.presetCapeId + EaglerProfile.capes.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void initGui() {
|
||||||
|
super.initGui();
|
||||||
|
EaglerAdapter.enableRepeatEvents(true);
|
||||||
|
StringTranslate var1 = StringTranslate.getInstance();
|
||||||
|
screenTitle = var1.translateKey("profile.capeTitle");
|
||||||
|
this.buttonList.add(new GuiButton(200, this.width / 2 - 100, this.height / 6 + 168, var1.translateKey("gui.done")));
|
||||||
|
this.buttonList.add(new GuiButton(2, this.width / 2 - 21, this.height / 6 + 81, 71, 20, var1.translateKey("profile.addCape")));
|
||||||
|
this.buttonList.add(new GuiButton(3, this.width / 2 - 21 + 71, this.height / 6 + 81, 72, 20, var1.translateKey("profile.clearSkin")));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onGuiClosed() {
|
||||||
|
EaglerAdapter.enableRepeatEvents(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void reconcatDD() {
|
||||||
|
String[] n = new String[EaglerProfile.capes.size()];
|
||||||
|
for(int i = 0; i < n.length; ++i) {
|
||||||
|
n[i] = EaglerProfile.capes.get(i).name;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.dropDownOptions = EaglerProfile.concatArrays(n, defaultVanillaCapeNames);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final TextureLocation gui = new TextureLocation("/gui/gui.png");
|
||||||
|
|
||||||
|
public void drawScreen(int mx, int my, float par3) {
|
||||||
|
StringTranslate var1 = StringTranslate.getInstance();
|
||||||
|
this.drawDefaultBackground();
|
||||||
|
|
||||||
|
this.drawCenteredString(this.fontRenderer, this.screenTitle, this.width / 2, 15, 16777215);
|
||||||
|
|
||||||
|
this.drawString(this.fontRenderer, "Player Cape", this.width / 2 - 20, this.height / 6 + 37, 10526880);
|
||||||
|
mousex = mx;
|
||||||
|
mousey = my;
|
||||||
|
|
||||||
|
int skinX = this.width / 2 - 120;
|
||||||
|
int skinY = this.height / 6 + 8;
|
||||||
|
int skinWidth = 80;
|
||||||
|
int skinHeight = 130;
|
||||||
|
|
||||||
|
drawRect(skinX, skinY, skinX + skinWidth, skinY + skinHeight, -6250336);
|
||||||
|
drawRect(skinX + 1, skinY + 1, skinX + skinWidth - 1, skinY + skinHeight - 1, 0xff000015);
|
||||||
|
|
||||||
|
if(dropDownOpen) {
|
||||||
|
super.drawScreen(-1, -1, par3);
|
||||||
|
}else {
|
||||||
|
super.drawScreen(mx, my, par3);
|
||||||
|
}
|
||||||
|
|
||||||
|
skinX = this.width / 2 - 20;
|
||||||
|
skinY = this.height / 6 + 53;
|
||||||
|
skinWidth = 140;
|
||||||
|
skinHeight = 22;
|
||||||
|
|
||||||
|
drawRect(skinX, skinY, skinX + skinWidth, skinY + skinHeight, -6250336);
|
||||||
|
drawRect(skinX + 1, skinY + 1, skinX + skinWidth - 21, skinY + skinHeight - 1, -16777216);
|
||||||
|
drawRect(skinX + skinWidth - 20, skinY + 1, skinX + skinWidth - 1, skinY + skinHeight - 1, -16777216);
|
||||||
|
|
||||||
|
EaglerAdapter.glColor4f(1f, 1f, 1f, 1f);
|
||||||
|
gui.bindTexture();
|
||||||
|
drawTexturedModalRect(skinX + skinWidth - 18, skinY + 3, 0, 240, 16, 16);
|
||||||
|
|
||||||
|
this.fontRenderer.drawStringWithShadow(dropDownOptions[selectedSlot], skinX + 5, skinY + 7, 14737632);
|
||||||
|
|
||||||
|
EaglerProfile.customCapeId = (selectedSlot < EaglerProfile.capes.size()) ? selectedSlot : -1;
|
||||||
|
EaglerProfile.presetCapeId = EaglerProfile.customCapeId < 0 ? (selectedSlot - EaglerProfile.capes.size()) : -1;
|
||||||
|
|
||||||
|
skinX = this.width / 2 - 20;
|
||||||
|
skinY = this.height / 6 + 74;
|
||||||
|
skinWidth = 140;
|
||||||
|
skinHeight = (this.height - skinY - 4);
|
||||||
|
slotsVisible = (skinHeight / 10);
|
||||||
|
if(slotsVisible > dropDownOptions.length) slotsVisible = dropDownOptions.length;
|
||||||
|
skinHeight = slotsVisible * 10 + 7;
|
||||||
|
skinsHeight = skinHeight;
|
||||||
|
if(scrollPos == -1) {
|
||||||
|
scrollPos = selectedSlot - 2;
|
||||||
|
}
|
||||||
|
if(scrollPos > (dropDownOptions.length - slotsVisible)) {
|
||||||
|
scrollPos = (dropDownOptions.length - slotsVisible);
|
||||||
|
}
|
||||||
|
if(scrollPos < 0) {
|
||||||
|
scrollPos = 0;
|
||||||
|
}
|
||||||
|
if(dropDownOpen) {
|
||||||
|
drawRect(skinX, skinY, skinX + skinWidth, skinY + skinHeight, -6250336);
|
||||||
|
drawRect(skinX + 1, skinY + 1, skinX + skinWidth - 1, skinY + skinHeight - 1, -16777216);
|
||||||
|
for(int i = 0; i < slotsVisible; i++) {
|
||||||
|
if(i + scrollPos < dropDownOptions.length) {
|
||||||
|
int idx = i + scrollPos - EaglerProfile.capes.size();
|
||||||
|
if(selectedSlot == i + scrollPos) {
|
||||||
|
drawRect(skinX + 1, skinY + i*10 + 4, skinX + skinWidth - 1, skinY + i*10 + 14, 0x77ffffff);
|
||||||
|
}else if(mx >= skinX && mx < (skinX + skinWidth - 10) && my >= (skinY + i*10 + 5) && my < (skinY + i*10 + 15)) {
|
||||||
|
drawRect(skinX + 1, skinY + i*10 + 4, skinX + skinWidth - 1, skinY + i*10 + 14, 0x55ffffff);
|
||||||
|
}
|
||||||
|
this.fontRenderer.drawStringWithShadow(dropDownOptions[i + scrollPos], skinX + 5, skinY + 5 + i*10, 14737632);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int scrollerSize = skinHeight * slotsVisible / dropDownOptions.length;
|
||||||
|
int scrollerPos = skinHeight * scrollPos / dropDownOptions.length;
|
||||||
|
drawRect(skinX + skinWidth - 4, skinY + scrollerPos + 1, skinX + skinWidth - 1, skinY + scrollerPos + scrollerSize, 0xff888888);
|
||||||
|
}
|
||||||
|
|
||||||
|
int xx = this.width / 2 - 80;
|
||||||
|
int yy = this.height / 6 + 130;
|
||||||
|
|
||||||
|
DefaultSkinRenderer.renderPlayerPreview(xx, yy, mx, my, skinToShow | 0x10000);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void actionPerformed(GuiButton par1GuiButton) {
|
||||||
|
if(!dropDownOpen) {
|
||||||
|
if(par1GuiButton.id == 200) {
|
||||||
|
mc.displayGuiScreen(parent);
|
||||||
|
}else if(par1GuiButton.id == 2) {
|
||||||
|
EaglerAdapter.openFileChooser("png", "image/png");
|
||||||
|
}else if(par1GuiButton.id == 3) {
|
||||||
|
for(EaglerProfileCape i : EaglerProfile.capes) {
|
||||||
|
this.mc.renderEngine.deleteTexture(i.glTex);
|
||||||
|
}
|
||||||
|
EaglerProfile.capes.clear();
|
||||||
|
this.dropDownOptions = defaultVanillaCapeNames;
|
||||||
|
this.selectedSlot = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateScreen() {
|
||||||
|
if(dropDownOpen) {
|
||||||
|
if(EaglerAdapter.mouseIsButtonDown(0)) {
|
||||||
|
int skinX = this.width / 2 - 20;
|
||||||
|
int skinY = this.height / 6 + 74;
|
||||||
|
int skinWidth = 140;
|
||||||
|
if(mousex >= (skinX + skinWidth - 10) && mousex < (skinX + skinWidth) && mousey >= skinY && mousey < (skinY + skinsHeight)) {
|
||||||
|
dragging = true;
|
||||||
|
}
|
||||||
|
if(dragging) {
|
||||||
|
int scrollerSize = skinsHeight * slotsVisible / dropDownOptions.length;
|
||||||
|
scrollPos = (mousey - skinY - (scrollerSize / 2)) * dropDownOptions.length / skinsHeight;
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
dragging = false;
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
dragging = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] b;
|
||||||
|
if((b = EaglerAdapter.getFileChooserResult()) != null && b.length > 0) {
|
||||||
|
EaglerImage img = EaglerImage.loadImage(b);
|
||||||
|
|
||||||
|
if(!((img.w == 32 && img.h == 32) || (img.w == 64 && img.h == 64) || (img.w == 64 && img.h == 32) || (img.w == 64 && img.h == 128))) return;
|
||||||
|
|
||||||
|
int[] loadSkin = img.data;
|
||||||
|
if(img.w == 64 && img.h == 32) {
|
||||||
|
loadSkin = grabPiece(loadSkin, 32, 32, 64);
|
||||||
|
}else if(img.w == 128 && img.h == 64) {
|
||||||
|
loadSkin = grabPiece(loadSkin, 64, 64, 128);
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] rawSkin = new byte[loadSkin.length * 4];
|
||||||
|
for(int i = 0; i < loadSkin.length; i++) {
|
||||||
|
int i2 = i * 4; int i3 = loadSkin[i];
|
||||||
|
rawSkin[i2] = (byte)(i3);
|
||||||
|
rawSkin[i2 + 1] = (byte)(i3 >> 8);
|
||||||
|
rawSkin[i2 + 2] = (byte)(i3 >> 16);
|
||||||
|
rawSkin[i2 + 3] = (byte)(i3 >> 24);
|
||||||
|
}
|
||||||
|
String name = EaglerAdapter.getFileChooserResultName();
|
||||||
|
if(name.length() > 32) {
|
||||||
|
name = name.substring(0, 32);
|
||||||
|
}
|
||||||
|
int k;
|
||||||
|
if((k = EaglerProfile.addCape(name, rawSkin)) != -1) {
|
||||||
|
selectedSlot = k;
|
||||||
|
reconcatDD();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int[] grabPiece(int[] input, int w, int h, int sw) {
|
||||||
|
int[] ret = new int[w * h];
|
||||||
|
for(int i = 0; i < h; ++i) {
|
||||||
|
System.arraycopy(input, i * sw, ret, i * w, w);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void handleMouseInput() {
|
||||||
|
super.handleMouseInput();
|
||||||
|
if(dropDownOpen) {
|
||||||
|
int var1 = EaglerAdapter.mouseGetEventDWheel();
|
||||||
|
if(var1 < 0) {
|
||||||
|
scrollPos += 3;
|
||||||
|
}
|
||||||
|
if(var1 > 0) {
|
||||||
|
scrollPos -= 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void keyTyped(char par1, int par2) {
|
||||||
|
if(par2 == 200 && selectedSlot > 0) {
|
||||||
|
--selectedSlot;
|
||||||
|
scrollPos = selectedSlot - 2;
|
||||||
|
}
|
||||||
|
if(par2 == 208 && selectedSlot < (dropDownOptions.length - 1)) {
|
||||||
|
++selectedSlot;
|
||||||
|
scrollPos = selectedSlot - 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void mouseClicked(int par1, int par2, int par3) {
|
||||||
|
super.mouseClicked(par1, par2, par3);
|
||||||
|
|
||||||
|
if (par3 == 0) {
|
||||||
|
int skinX = this.width / 2 + 140 - 40;
|
||||||
|
int skinY = this.height / 6 + 53;
|
||||||
|
|
||||||
|
if(par1 >= skinX && par1 < (skinX + 20) && par2 >= skinY && par2 < (skinY + 22)) {
|
||||||
|
dropDownOpen = !dropDownOpen;
|
||||||
|
}
|
||||||
|
|
||||||
|
skinX = this.width / 2 - 20;
|
||||||
|
skinY = this.height / 6 + 53;
|
||||||
|
int skinWidth = 140;
|
||||||
|
int skinHeight = skinsHeight;
|
||||||
|
|
||||||
|
if(!(par1 >= skinX && par1 < (skinX + skinWidth) && par2 >= skinY && par2 < (skinY + skinHeight + 22))) {
|
||||||
|
dropDownOpen = false;
|
||||||
|
dragging = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
skinY += 21;
|
||||||
|
|
||||||
|
if(dropDownOpen && !dragging) {
|
||||||
|
for(int i = 0; i < slotsVisible; i++) {
|
||||||
|
if(i + scrollPos < dropDownOptions.length) {
|
||||||
|
if(selectedSlot != i + scrollPos) {
|
||||||
|
if(par1 >= skinX && par1 < (skinX + skinWidth - 10) && par2 >= (skinY + i*10 + 5) && par2 < (skinY + i*10 + 15) && selectedSlot != i + scrollPos) {
|
||||||
|
selectedSlot = i + scrollPos;
|
||||||
|
dropDownOpen = false;
|
||||||
|
dragging = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,6 +1,7 @@
|
||||||
package net.lax1dude.eaglercraft;
|
package net.lax1dude.eaglercraft;
|
||||||
|
|
||||||
import net.lax1dude.eaglercraft.EaglerProfile.EaglerProfileSkin;
|
import net.lax1dude.eaglercraft.EaglerProfile.EaglerProfileSkin;
|
||||||
|
import net.minecraft.src.EnumChatFormatting;
|
||||||
import net.minecraft.src.GuiButton;
|
import net.minecraft.src.GuiButton;
|
||||||
import net.minecraft.src.GuiScreen;
|
import net.minecraft.src.GuiScreen;
|
||||||
import net.minecraft.src.GuiTextField;
|
import net.minecraft.src.GuiTextField;
|
||||||
|
@ -115,7 +116,6 @@ public class GuiScreenEditProfile extends GuiScreen {
|
||||||
if(cnt <= 0) {
|
if(cnt <= 0) {
|
||||||
this.drawString(this.fontRenderer, var1.translateKey("profile.playerSkin"), this.width / 2 - 20, this.height / 6 + 66, 10526880);
|
this.drawString(this.fontRenderer, var1.translateKey("profile.playerSkin"), this.width / 2 - 20, this.height / 6 + 66, 10526880);
|
||||||
}
|
}
|
||||||
|
|
||||||
mousex = mx;
|
mousex = mx;
|
||||||
mousey = my;
|
mousey = my;
|
||||||
|
|
||||||
|
@ -127,6 +127,25 @@ public class GuiScreenEditProfile extends GuiScreen {
|
||||||
drawRect(skinX, skinY, skinX + skinWidth, skinY + skinHeight, -6250336);
|
drawRect(skinX, skinY, skinX + skinWidth, skinY + skinHeight, -6250336);
|
||||||
drawRect(skinX + 1, skinY + 1, skinX + skinWidth - 1, skinY + skinHeight - 1, 0xff000015);
|
drawRect(skinX + 1, skinY + 1, skinX + skinWidth - 1, skinY + skinHeight - 1, 0xff000015);
|
||||||
|
|
||||||
|
EaglerAdapter.glPushMatrix();
|
||||||
|
EaglerAdapter.glTranslatef(skinX + 2, skinY - 9, 0.0f);
|
||||||
|
EaglerAdapter.glScalef(0.75f, 0.75f, 0.75f);
|
||||||
|
|
||||||
|
int skid = selectedSlot - EaglerProfile.skins.size();
|
||||||
|
if(skid < 0) {
|
||||||
|
skid = 0;
|
||||||
|
}
|
||||||
|
if(DefaultSkinRenderer.isStandardModel(skid) || DefaultSkinRenderer.isZombieModel(skid)) {
|
||||||
|
String capesText = var1.translateKey("profile.capes");
|
||||||
|
int color = 10526880;
|
||||||
|
if(mx > skinX - 10 && my > skinY - 16 && mx < skinX + (fontRenderer.getStringWidth(capesText) / 0.75f) + 10 && my < skinY + 7) {
|
||||||
|
color = 0xFFCCCC44;
|
||||||
|
}
|
||||||
|
this.drawString(this.fontRenderer, EnumChatFormatting.UNDERLINE + capesText, 0, 0, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
EaglerAdapter.glPopMatrix();
|
||||||
|
|
||||||
this.username.drawTextBox();
|
this.username.drawTextBox();
|
||||||
if(dropDownOpen || newSkinWaitSteveOrAlex) {
|
if(dropDownOpen || newSkinWaitSteveOrAlex) {
|
||||||
super.drawScreen(0, 0, par3);
|
super.drawScreen(0, 0, par3);
|
||||||
|
@ -301,6 +320,8 @@ public class GuiScreenEditProfile extends GuiScreen {
|
||||||
|
|
||||||
LocalStorageManager.profileSettingsStorage.setInteger("ps", EaglerProfile.presetSkinId);
|
LocalStorageManager.profileSettingsStorage.setInteger("ps", EaglerProfile.presetSkinId);
|
||||||
LocalStorageManager.profileSettingsStorage.setInteger("cs", EaglerProfile.customSkinId);
|
LocalStorageManager.profileSettingsStorage.setInteger("cs", EaglerProfile.customSkinId);
|
||||||
|
LocalStorageManager.profileSettingsStorage.setInteger("pc", EaglerProfile.presetCapeId);
|
||||||
|
LocalStorageManager.profileSettingsStorage.setInteger("cc", EaglerProfile.customCapeId);
|
||||||
LocalStorageManager.profileSettingsStorage.setInteger("nsi", EaglerProfile.newSkinNotificationIndex);
|
LocalStorageManager.profileSettingsStorage.setInteger("nsi", EaglerProfile.newSkinNotificationIndex);
|
||||||
LocalStorageManager.profileSettingsStorage.setString("name", EaglerProfile.username);
|
LocalStorageManager.profileSettingsStorage.setString("name", EaglerProfile.username);
|
||||||
|
|
||||||
|
@ -313,6 +334,14 @@ public class GuiScreenEditProfile extends GuiScreen {
|
||||||
}
|
}
|
||||||
LocalStorageManager.profileSettingsStorage.setCompoundTag("skins", skins);
|
LocalStorageManager.profileSettingsStorage.setCompoundTag("skins", skins);
|
||||||
|
|
||||||
|
NBTTagCompound capes = new NBTTagCompound();
|
||||||
|
for(int i = 0, l = EaglerProfile.capes.size(); i < l; i++) {
|
||||||
|
NBTTagCompound nbt = new NBTTagCompound();
|
||||||
|
nbt.setByteArray("data", EaglerProfile.capes.get(i).data);
|
||||||
|
capes.setTag(EaglerProfile.capes.get(i).name, nbt);
|
||||||
|
}
|
||||||
|
LocalStorageManager.profileSettingsStorage.setCompoundTag("capes", capes);
|
||||||
|
|
||||||
LocalStorageManager.saveStorageP();
|
LocalStorageManager.saveStorageP();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -434,9 +463,9 @@ public class GuiScreenEditProfile extends GuiScreen {
|
||||||
return;
|
return;
|
||||||
}else if(selectedSlot < EaglerProfile.skins.size()) {
|
}else if(selectedSlot < EaglerProfile.skins.size()) {
|
||||||
int skinX = this.width / 2 - 120;
|
int skinX = this.width / 2 - 120;
|
||||||
int skinY = this.height / 6 + 8;
|
int skinY = this.height / 6 + 18;
|
||||||
int skinWidth = 80;
|
int skinWidth = 80;
|
||||||
int skinHeight = 130;
|
int skinHeight = 120;
|
||||||
if(par1 >= skinX && par2 >= skinY && par1 < skinX + skinWidth && par2 < skinY + skinHeight) {
|
if(par1 >= skinX && par2 >= skinY && par1 < skinX + skinWidth && par2 < skinY + skinHeight) {
|
||||||
if(selectedSlot < EaglerProfile.skins.size()) {
|
if(selectedSlot < EaglerProfile.skins.size()) {
|
||||||
int type = EaglerProfile.getSkinSize(EaglerProfile.skins.get(selectedSlot).data.length);
|
int type = EaglerProfile.getSkinSize(EaglerProfile.skins.get(selectedSlot).data.length);
|
||||||
|
@ -449,7 +478,6 @@ public class GuiScreenEditProfile extends GuiScreen {
|
||||||
}
|
}
|
||||||
super.mouseClicked(par1, par2, par3);
|
super.mouseClicked(par1, par2, par3);
|
||||||
this.username.mouseClicked(par1, par2, par3);
|
this.username.mouseClicked(par1, par2, par3);
|
||||||
|
|
||||||
if (par3 == 0) {
|
if (par3 == 0) {
|
||||||
int skinX = this.width / 2 + 140 - 40;
|
int skinX = this.width / 2 + 140 - 40;
|
||||||
int skinY = this.height / 6 + 82;
|
int skinY = this.height / 6 + 82;
|
||||||
|
@ -493,6 +521,20 @@ public class GuiScreenEditProfile extends GuiScreen {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int skid = selectedSlot - EaglerProfile.skins.size();
|
||||||
|
if(skid < 0) {
|
||||||
|
skid = 0;
|
||||||
|
}
|
||||||
|
if(DefaultSkinRenderer.isStandardModel(skid) || DefaultSkinRenderer.isZombieModel(skid)) {
|
||||||
|
skinX = this.width / 2 - 120;
|
||||||
|
skinY = this.height / 6 + 8;
|
||||||
|
String capesText = StringTranslate.getInstance().translateKey("profile.capes");
|
||||||
|
if(par1 > skinX - 10 && par2 > skinY - 16 && par1 < skinX + (fontRenderer.getStringWidth(capesText) / 0.75f) + 10 && par2 < skinY + 7) {
|
||||||
|
save();
|
||||||
|
this.mc.sndManager.playSoundFX("random.click", 1.0F, 1.0F);
|
||||||
|
this.mc.displayGuiScreen(new GuiScreenEditCape(this, selectedSlot));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -77,6 +77,7 @@ public class GuiConnecting extends GuiScreen {
|
||||||
this.clientHandler = new NetClientHandler(this.mc, uri, 0);
|
this.clientHandler = new NetClientHandler(this.mc, uri, 0);
|
||||||
this.clientHandler.addToSendQueue(new Packet2ClientProtocol(69, EaglerProfile.username, uria, port));
|
this.clientHandler.addToSendQueue(new Packet2ClientProtocol(69, EaglerProfile.username, uria, port));
|
||||||
this.clientHandler.addToSendQueue(new Packet250CustomPayload("EAG|MySkin", EaglerProfile.getSkinPacket()));
|
this.clientHandler.addToSendQueue(new Packet250CustomPayload("EAG|MySkin", EaglerProfile.getSkinPacket()));
|
||||||
|
this.clientHandler.addToSendQueue(new Packet250CustomPayload("EAG|MyCape", EaglerProfile.getCapePacket()));
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
try {
|
try {
|
||||||
this.clientHandler.disconnect();
|
this.clientHandler.disconnect();
|
||||||
|
|
|
@ -605,8 +605,9 @@ public class RenderPlayer extends RenderLiving {
|
||||||
|
|
||||||
float var11;
|
float var11;
|
||||||
|
|
||||||
if (par1EntityPlayer.username.equalsIgnoreCase("LAX1DUDE") && !par1EntityPlayer.isInvisible() && !par1EntityPlayer.getHideCape() && renderType != 21) {
|
if(DefaultSkinRenderer.isStandardModel(renderType) || DefaultSkinRenderer.isZombieModel(renderType)) {
|
||||||
lax1dude_cape.bindTexture();
|
if(!par1EntityPlayer.isInvisible() && !par1EntityPlayer.getHideCape()) {
|
||||||
|
if(DefaultSkinRenderer.bindSyncedCape(par1EntityPlayer)) {
|
||||||
EaglerAdapter.glPushMatrix();
|
EaglerAdapter.glPushMatrix();
|
||||||
EaglerAdapter.glTranslatef(0.0F, 0.0F, 0.125F);
|
EaglerAdapter.glTranslatef(0.0F, 0.0F, 0.125F);
|
||||||
double var21 = par1EntityPlayer.field_71091_bM + (par1EntityPlayer.field_71094_bP - par1EntityPlayer.field_71091_bM) * (double) par2
|
double var21 = par1EntityPlayer.field_71091_bM + (par1EntityPlayer.field_71094_bP - par1EntityPlayer.field_71091_bM) * (double) par2
|
||||||
|
@ -649,6 +650,11 @@ public class RenderPlayer extends RenderLiving {
|
||||||
this.modelBipedMain.renderCloak(0.0625F);
|
this.modelBipedMain.renderCloak(0.0625F);
|
||||||
EaglerAdapter.glPopMatrix();
|
EaglerAdapter.glPopMatrix();
|
||||||
}
|
}
|
||||||
|
EaglerAdapter.glMatrixMode(EaglerAdapter.GL_TEXTURE);
|
||||||
|
EaglerAdapter.glPopMatrix();
|
||||||
|
EaglerAdapter.glMatrixMode(EaglerAdapter.GL_MODELVIEW);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemStack var22 = par1EntityPlayer.inventory.getCurrentItem();
|
ItemStack var22 = par1EntityPlayer.inventory.getCurrentItem();
|
||||||
|
|