mirror of
https://github.com/Eaglercraft-Archive/Eaglercraftx-1.8.8-src.git
synced 2025-06-27 18:38:14 -05:00
Update #28 - Added capes, voice chat, FNAW skins, and fixes
This commit is contained in:
@ -0,0 +1,83 @@
|
||||
package net.lax1dude.eaglercraft.v1_8.profile;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.EaglercraftUUID;
|
||||
import net.lax1dude.eaglercraft.v1_8.netty.Unpooled;
|
||||
import net.minecraft.network.PacketBuffer;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class CapePackets {
|
||||
|
||||
public static final int PACKET_MY_CAPE_PRESET = 0x01;
|
||||
public static final int PACKET_MY_CAPE_CUSTOM = 0x02;
|
||||
public static final int PACKET_GET_OTHER_CAPE = 0x03;
|
||||
public static final int PACKET_OTHER_CAPE_PRESET = 0x04;
|
||||
public static final int PACKET_OTHER_CAPE_CUSTOM = 0x05;
|
||||
|
||||
public static void readPluginMessage(PacketBuffer buffer, ServerCapeCache capeCache) throws IOException {
|
||||
try {
|
||||
int type = (int)buffer.readByte() & 0xFF;
|
||||
switch(type) {
|
||||
case PACKET_OTHER_CAPE_PRESET: {
|
||||
EaglercraftUUID responseUUID = buffer.readUuid();
|
||||
int responsePreset = buffer.readInt();
|
||||
if(buffer.isReadable()) {
|
||||
throw new IOException("PACKET_OTHER_CAPE_PRESET had " + buffer.readableBytes() + " remaining bytes!");
|
||||
}
|
||||
capeCache.cacheCapePreset(responseUUID, responsePreset);
|
||||
break;
|
||||
}
|
||||
case PACKET_OTHER_CAPE_CUSTOM: {
|
||||
EaglercraftUUID responseUUID = buffer.readUuid();
|
||||
byte[] readCape = new byte[1173];
|
||||
buffer.readBytes(readCape);
|
||||
if(buffer.isReadable()) {
|
||||
throw new IOException("PACKET_OTHER_CAPE_CUSTOM had " + buffer.readableBytes() + " remaining bytes!");
|
||||
}
|
||||
capeCache.cacheCapeCustom(responseUUID, readCape);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
throw new IOException("Unknown skin packet type: " + type);
|
||||
}
|
||||
}catch(IOException ex) {
|
||||
throw ex;
|
||||
}catch(Throwable t) {
|
||||
throw new IOException("Failed to parse cape packet!", t);
|
||||
}
|
||||
}
|
||||
|
||||
public static byte[] writeMyCapePreset(int capeId) {
|
||||
return new byte[] { (byte) PACKET_MY_CAPE_PRESET, (byte) (capeId >> 24), (byte) (capeId >> 16),
|
||||
(byte) (capeId >> 8), (byte) (capeId & 0xFF) };
|
||||
}
|
||||
|
||||
public static byte[] writeMyCapeCustom(CustomCape customCape) {
|
||||
byte[] packet = new byte[1 + customCape.texture.length];
|
||||
packet[0] = (byte) PACKET_MY_CAPE_CUSTOM;
|
||||
System.arraycopy(customCape.texture, 0, packet, 1, customCape.texture.length);
|
||||
return packet;
|
||||
}
|
||||
|
||||
public static PacketBuffer writeGetOtherCape(EaglercraftUUID playerId) throws IOException {
|
||||
PacketBuffer ret = new PacketBuffer(Unpooled.buffer(17, 17));
|
||||
ret.writeByte(PACKET_GET_OTHER_CAPE);
|
||||
ret.writeUuid(playerId);
|
||||
return ret;
|
||||
}
|
||||
}
|
@ -0,0 +1,58 @@
|
||||
package net.lax1dude.eaglercraft.v1_8.profile;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class CustomCape {
|
||||
|
||||
public final String name;
|
||||
public final byte[] texture;
|
||||
|
||||
private EaglerSkinTexture textureInstance;
|
||||
private ResourceLocation resourceLocation;
|
||||
|
||||
private static int texId = 0;
|
||||
|
||||
public CustomCape(String name, byte[] texture) {
|
||||
this.name = name;
|
||||
this.texture = texture;
|
||||
byte[] texture2 = new byte[4096];
|
||||
SkinConverter.convertCape23x17RGBto32x32RGBA(texture, texture2);
|
||||
this.textureInstance = new EaglerSkinTexture(texture2, 32, 32);
|
||||
this.resourceLocation = null;
|
||||
}
|
||||
|
||||
public void load() {
|
||||
if(resourceLocation == null) {
|
||||
resourceLocation = new ResourceLocation("eagler:capes/custom/tex_" + texId++);
|
||||
Minecraft.getMinecraft().getTextureManager().loadTexture(resourceLocation, textureInstance);
|
||||
}
|
||||
}
|
||||
|
||||
public ResourceLocation getResource() {
|
||||
return resourceLocation;
|
||||
}
|
||||
|
||||
public void delete() {
|
||||
if(resourceLocation != null) {
|
||||
Minecraft.getMinecraft().getTextureManager().deleteTexture(resourceLocation);
|
||||
resourceLocation = null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,75 @@
|
||||
package net.lax1dude.eaglercraft.v1_8.profile;
|
||||
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public enum DefaultCapes {
|
||||
|
||||
NO_CAPE(0, "No Cape", null),
|
||||
MINECON_2011(1, "Minecon 2011", new ResourceLocation("eagler:capes/01.minecon_2011.png")),
|
||||
MINECON_2012(2, "Minecon 2012", new ResourceLocation("eagler:capes/02.minecon_2012.png")),
|
||||
MINECON_2013(3, "Minecon 2013", new ResourceLocation("eagler:capes/03.minecon_2013.png")),
|
||||
MINECON_2015(4, "Minecon 2015", new ResourceLocation("eagler:capes/04.minecon_2015.png")),
|
||||
MINECON_2016(5, "Minecon 2016", new ResourceLocation("eagler:capes/05.minecon_2016.png")),
|
||||
MICROSOFT_ACCOUNT(6, "Microsoft Account", new ResourceLocation("eagler:capes/06.microsoft_account.png")),
|
||||
MAPMAKER(7, "Realms Mapmaker", new ResourceLocation("eagler:capes/07.mapmaker.png")),
|
||||
MOJANG_OLD(8, "Mojang Old", new ResourceLocation("eagler:capes/08.mojang_old.png")),
|
||||
MOJANG_NEW(9, "Mojang New", new ResourceLocation("eagler:capes/09.mojang_new.png")),
|
||||
JIRA_MOD(10, "Jira Moderator", new ResourceLocation("eagler:capes/10.jira_mod.png")),
|
||||
MOJANG_VERY_OLD(11, "Mojang Very Old", new ResourceLocation("eagler:capes/11.mojang_very_old.png")),
|
||||
SCROLLS(12, "Scrolls", new ResourceLocation("eagler:capes/12.scrolls.png")),
|
||||
COBALT(13, "Cobalt", new ResourceLocation("eagler:capes/13.cobalt.png")),
|
||||
TRANSLATOR(14, "Lang Translator", new ResourceLocation("eagler:capes/14.translator.png")),
|
||||
MILLIONTH_ACCOUNT(15, "Millionth Player", new ResourceLocation("eagler:capes/15.millionth_account.png")),
|
||||
PRISMARINE(16, "Prismarine", new ResourceLocation("eagler:capes/16.prismarine.png")),
|
||||
SNOWMAN(17, "Snowman", new ResourceLocation("eagler:capes/17.snowman.png")),
|
||||
SPADE(18, "Spade", new ResourceLocation("eagler:capes/18.spade.png")),
|
||||
BIRTHDAY(19, "Birthday", new ResourceLocation("eagler:capes/19.birthday.png")),
|
||||
DB(20, "dB", new ResourceLocation("eagler:capes/20.db.png"));
|
||||
|
||||
public static final DefaultCapes[] defaultCapesMap = new DefaultCapes[21];
|
||||
|
||||
public final int id;
|
||||
public final String name;
|
||||
public final ResourceLocation location;
|
||||
|
||||
private DefaultCapes(int id, String name, ResourceLocation location) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.location = location;
|
||||
}
|
||||
|
||||
public static DefaultCapes getCapeFromId(int id) {
|
||||
DefaultCapes e = null;
|
||||
if(id >= 0 && id < defaultCapesMap.length) {
|
||||
e = defaultCapesMap[id];
|
||||
}
|
||||
if(e != null) {
|
||||
return e;
|
||||
}else {
|
||||
return NO_CAPE;
|
||||
}
|
||||
}
|
||||
|
||||
static {
|
||||
DefaultCapes[] capes = values();
|
||||
for(int i = 0; i < capes.length; ++i) {
|
||||
defaultCapesMap[capes[i].id] = capes[i];
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -42,9 +42,14 @@ public enum DefaultSkins {
|
||||
CREEPER(20, "Creeper", new ResourceLocation("eagler:skins/21.creeper.png"), SkinModel.STEVE),
|
||||
ZOMBIE(21, "Zombie", new ResourceLocation("eagler:skins/22.zombie.png"), SkinModel.ZOMBIE),
|
||||
PIG(22, "Pig", new ResourceLocation("eagler:skins/23.pig.png"), SkinModel.STEVE),
|
||||
MOOSHROOM(23, "Mooshroom", new ResourceLocation("eagler:skins/24.mooshroom.png"), SkinModel.STEVE);
|
||||
MOOSHROOM(23, "Mooshroom", new ResourceLocation("eagler:skins/24.mooshroom.png"), SkinModel.STEVE),
|
||||
LONG_ARMS(24, "Long Arms", new ResourceLocation("eagler:mesh/longarms.fallback.png"), SkinModel.LONG_ARMS),
|
||||
WEIRD_CLIMBER_DUDE(25, "Weird Climber Dude", new ResourceLocation("eagler:mesh/weirdclimber.fallback.png"), SkinModel.WEIRD_CLIMBER_DUDE),
|
||||
LAXATIVE_DUDE(26, "Laxative Dude", new ResourceLocation("eagler:mesh/laxativedude.fallback.png"), SkinModel.LAXATIVE_DUDE),
|
||||
BABY_CHARLES(27, "Baby Charles", new ResourceLocation("eagler:mesh/charles.fallback.png"), SkinModel.BABY_CHARLES),
|
||||
BABY_WINSTON(28, "Baby Winston", new ResourceLocation("eagler:mesh/winston.fallback.png"), SkinModel.BABY_WINSTON);
|
||||
|
||||
public static final DefaultSkins[] defaultSkinsMap = new DefaultSkins[24];
|
||||
public static final DefaultSkins[] defaultSkinsMap = new DefaultSkins[29];
|
||||
|
||||
public final int id;
|
||||
public final String name;
|
||||
|
@ -16,7 +16,7 @@ import net.minecraft.nbt.NBTTagList;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2022-2023 lax1dude, ayunami2000. All Rights Reserved.
|
||||
* Copyright (c) 2022-2024 lax1dude, ayunami2000. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
@ -37,7 +37,11 @@ public class EaglerProfile {
|
||||
public static int presetSkinId;
|
||||
public static int customSkinId;
|
||||
|
||||
public static int presetCapeId;
|
||||
public static int customCapeId;
|
||||
|
||||
public static final List<CustomSkin> customSkins = new ArrayList();
|
||||
public static final List<CustomCape> customCapes = new ArrayList();
|
||||
|
||||
public static final EaglercraftRandom rand;
|
||||
|
||||
@ -78,6 +82,25 @@ public class EaglerProfile {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static ResourceLocation getActiveCapeResourceLocation() {
|
||||
if(presetCapeId == -1) {
|
||||
if(customCapeId >= 0 && customCapeId < customCapes.size()) {
|
||||
return customCapes.get(customCapeId).getResource();
|
||||
}else {
|
||||
customCapeId = -1;
|
||||
presetCapeId = 0;
|
||||
return DefaultCapes.defaultCapesMap[0].location;
|
||||
}
|
||||
}else {
|
||||
if(presetCapeId >= 0 && presetCapeId < DefaultCapes.defaultCapesMap.length) {
|
||||
return DefaultCapes.defaultCapesMap[presetCapeId].location;
|
||||
}else {
|
||||
presetCapeId = 0;
|
||||
return DefaultCapes.defaultCapesMap[0].location;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static EaglercraftUUID getPlayerUUID() {
|
||||
return Minecraft.getMinecraft().getSession().getProfile().getId();
|
||||
@ -114,6 +137,25 @@ public class EaglerProfile {
|
||||
}
|
||||
}
|
||||
|
||||
public static byte[] getCapePacket() {
|
||||
if(presetCapeId == -1) {
|
||||
if(customCapeId >= 0 && customCapeId < customCapes.size()) {
|
||||
return CapePackets.writeMyCapeCustom(customCapes.get(customCapeId));
|
||||
}else {
|
||||
customCapeId = -1;
|
||||
presetCapeId = 0;
|
||||
return CapePackets.writeMyCapePreset(0);
|
||||
}
|
||||
}else {
|
||||
if(presetCapeId >= 0 && presetCapeId < DefaultCapes.defaultCapesMap.length) {
|
||||
return CapePackets.writeMyCapePreset(presetCapeId);
|
||||
}else {
|
||||
presetCapeId = 0;
|
||||
return CapePackets.writeMyCapePreset(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean doesSkinExist(String name) {
|
||||
for(int i = 0, l = customSkins.size(); i < l; ++i) {
|
||||
if(customSkins.get(i).name.equalsIgnoreCase(name)) {
|
||||
@ -123,6 +165,15 @@ public class EaglerProfile {
|
||||
return false;
|
||||
}
|
||||
|
||||
private static boolean doesCapeExist(String name) {
|
||||
for(int i = 0, l = customCapes.size(); i < l; ++i) {
|
||||
if(customCapes.get(i).name.equalsIgnoreCase(name)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static int addCustomSkin(String fileName, byte[] rawSkin) {
|
||||
if(doesSkinExist(fileName)) {
|
||||
String newName;
|
||||
@ -139,6 +190,22 @@ public class EaglerProfile {
|
||||
return r;
|
||||
}
|
||||
|
||||
public static int addCustomCape(String fileName, byte[] rawCape23x17RGB) {
|
||||
if(doesCapeExist(fileName)) {
|
||||
String newName;
|
||||
int i = 2;
|
||||
while(doesCapeExist(newName = fileName + " (" + i + ")")) {
|
||||
++i;
|
||||
}
|
||||
fileName = newName;
|
||||
}
|
||||
CustomCape newCape = new CustomCape(fileName, rawCape23x17RGB);
|
||||
newCape.load();
|
||||
int r = customCapes.size();
|
||||
customCapes.add(newCape);
|
||||
return r;
|
||||
}
|
||||
|
||||
public static void clearCustomSkins() {
|
||||
for(int i = 0, l = customSkins.size(); i < l; ++i) {
|
||||
customSkins.get(i).delete();
|
||||
@ -146,6 +213,13 @@ public class EaglerProfile {
|
||||
customSkins.clear();
|
||||
}
|
||||
|
||||
public static void clearCustomCapes() {
|
||||
for(int i = 0, l = customCapes.size(); i < l; ++i) {
|
||||
customCapes.get(i).delete();
|
||||
}
|
||||
customCapes.clear();
|
||||
}
|
||||
|
||||
public static void read() {
|
||||
read(EagRuntime.getStorage("p"));
|
||||
}
|
||||
@ -169,6 +243,9 @@ public class EaglerProfile {
|
||||
presetSkinId = profile.getInteger("presetSkin");
|
||||
customSkinId = profile.getInteger("customSkin");
|
||||
|
||||
if(profile.hasKey("presetCape", 99)) presetCapeId = profile.getInteger("presetCape");
|
||||
if(profile.hasKey("customCape", 99)) customCapeId = profile.getInteger("customCape");
|
||||
|
||||
String loadUsername = profile.getString("username").trim();
|
||||
|
||||
if(!loadUsername.isEmpty()) {
|
||||
@ -193,7 +270,21 @@ public class EaglerProfile {
|
||||
newSkin.load();
|
||||
customSkins.add(newSkin);
|
||||
}
|
||||
|
||||
|
||||
if(profile.hasKey("capes", 9)) {
|
||||
clearCustomCapes();
|
||||
NBTTagList capesList = profile.getTagList("capes", 10);
|
||||
for(int i = 0, l = capesList.tagCount(); i < l; ++i) {
|
||||
NBTTagCompound cape = capesList.getCompoundTagAt(i);
|
||||
String capeName = cape.getString("name");
|
||||
byte[] capeData = cape.getByteArray("data");
|
||||
if(capeData.length != 1173) continue;
|
||||
CustomCape newCape = new CustomCape(capeName, capeData);
|
||||
newCape.load();
|
||||
customCapes.add(newCape);
|
||||
}
|
||||
}
|
||||
|
||||
if(presetSkinId == -1) {
|
||||
if(customSkinId < 0 || customSkinId >= customSkins.size()) {
|
||||
presetSkinId = 0;
|
||||
@ -206,12 +297,26 @@ public class EaglerProfile {
|
||||
}
|
||||
}
|
||||
|
||||
if(presetCapeId == -1) {
|
||||
if(customCapeId < 0 || customCapeId >= customCapes.size()) {
|
||||
presetCapeId = 0;
|
||||
customCapeId = -1;
|
||||
}
|
||||
}else {
|
||||
customCapeId = -1;
|
||||
if(presetCapeId < 0 || presetCapeId >= DefaultCapes.defaultCapesMap.length) {
|
||||
presetCapeId = 0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static byte[] write() {
|
||||
NBTTagCompound profile = new NBTTagCompound();
|
||||
profile.setInteger("presetSkin", presetSkinId);
|
||||
profile.setInteger("customSkin", customSkinId);
|
||||
profile.setInteger("presetCape", presetCapeId);
|
||||
profile.setInteger("customCape", customCapeId);
|
||||
profile.setString("username", username);
|
||||
NBTTagList skinsList = new NBTTagList();
|
||||
for(int i = 0, l = customSkins.size(); i < l; ++i) {
|
||||
@ -223,6 +328,15 @@ public class EaglerProfile {
|
||||
skinsList.appendTag(skin);
|
||||
}
|
||||
profile.setTag("skins", skinsList);
|
||||
NBTTagList capesList = new NBTTagList();
|
||||
for(int i = 0, l = customCapes.size(); i < l; ++i) {
|
||||
CustomCape cp = customCapes.get(i);
|
||||
NBTTagCompound cape = new NBTTagCompound();
|
||||
cape.setString("name", cp.name);
|
||||
cape.setByteArray("data", cp.texture);
|
||||
capesList.appendTag(cape);
|
||||
}
|
||||
profile.setTag("capes", capesList);
|
||||
EaglerOutputStream bao = new EaglerOutputStream();
|
||||
try {
|
||||
CompressedStreamTools.writeCompressed(profile, bao);
|
||||
@ -253,9 +367,14 @@ public class EaglerProfile {
|
||||
|
||||
setName(username);
|
||||
|
||||
presetSkinId = rand.nextInt(DefaultSkins.defaultSkinsMap.length);
|
||||
do {
|
||||
presetSkinId = rand.nextInt(DefaultSkins.defaultSkinsMap.length);
|
||||
}while(DefaultSkins.defaultSkinsMap[presetSkinId].model.highPoly != null);
|
||||
customSkinId = -1;
|
||||
|
||||
presetCapeId = 0;
|
||||
customCapeId = -1;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,359 @@
|
||||
package net.lax1dude.eaglercraft.v1_8.profile;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.EagRuntime;
|
||||
import net.lax1dude.eaglercraft.v1_8.Keyboard;
|
||||
import net.lax1dude.eaglercraft.v1_8.Mouse;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.EnumCursorType;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.FileChooserResult;
|
||||
import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager;
|
||||
import net.lax1dude.eaglercraft.v1_8.opengl.ImageData;
|
||||
import net.minecraft.client.audio.PositionedSoundRecord;
|
||||
import net.minecraft.client.gui.GuiButton;
|
||||
import net.minecraft.client.gui.GuiScreen;
|
||||
import net.minecraft.client.resources.I18n;
|
||||
import net.minecraft.util.EnumChatFormatting;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2022-2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class GuiScreenEditCape extends GuiScreen {
|
||||
|
||||
private final GuiScreenEditProfile parent;
|
||||
|
||||
private boolean dropDownOpen = false;
|
||||
private String[] dropDownOptions;
|
||||
private int slotsVisible = 0;
|
||||
protected int selectedSlot = 0;
|
||||
private int scrollPos = -1;
|
||||
private int skinsHeight = 0;
|
||||
private boolean dragging = false;
|
||||
private int mousex = 0;
|
||||
private int mousey = 0;
|
||||
|
||||
private static final ResourceLocation eaglerGui = new ResourceLocation("eagler:gui/eagler_gui.png");
|
||||
|
||||
protected String screenTitle = "Edit Cape";
|
||||
|
||||
public GuiScreenEditCape(GuiScreenEditProfile parent) {
|
||||
this.parent = parent;
|
||||
updateOptions();
|
||||
}
|
||||
|
||||
public void initGui() {
|
||||
Keyboard.enableRepeatEvents(true);
|
||||
screenTitle = I18n.format("editCape.title");
|
||||
selectedSlot = EaglerProfile.presetCapeId == -1 ? EaglerProfile.customCapeId : (EaglerProfile.presetCapeId + EaglerProfile.customCapes.size());
|
||||
buttonList.add(new GuiButton(0, width / 2 - 100, height / 6 + 168, I18n.format("gui.done")));
|
||||
buttonList.add(new GuiButton(1, width / 2 - 21, height / 6 + 80, 71, 20, I18n.format("editCape.addCape")));
|
||||
buttonList.add(new GuiButton(2, width / 2 - 21 + 71, height / 6 + 80, 72, 20, I18n.format("editCape.clearCape")));
|
||||
}
|
||||
|
||||
private void updateOptions() {
|
||||
int numCustom = EaglerProfile.customCapes.size();
|
||||
String[] n = new String[numCustom + DefaultCapes.defaultCapesMap.length];
|
||||
for(int i = 0; i < numCustom; ++i) {
|
||||
n[i] = EaglerProfile.customCapes.get(i).name;
|
||||
}
|
||||
int numDefault = DefaultCapes.defaultCapesMap.length;
|
||||
for(int j = 0; j < numDefault; ++j) {
|
||||
n[numCustom + j] = DefaultCapes.defaultCapesMap[j].name;
|
||||
}
|
||||
dropDownOptions = n;
|
||||
}
|
||||
|
||||
public void drawScreen(int mx, int my, float partialTicks) {
|
||||
drawDefaultBackground();
|
||||
drawCenteredString(fontRendererObj, screenTitle, width / 2, 15, 16777215);
|
||||
drawString(fontRendererObj, I18n.format("editCape.playerCape"), width / 2 - 20, height / 6 + 36, 10526880);
|
||||
|
||||
mousex = mx;
|
||||
mousey = my;
|
||||
|
||||
int skinX = width / 2 - 120;
|
||||
int skinY = height / 6 + 8;
|
||||
int skinWidth = 80;
|
||||
int skinHeight = 130;
|
||||
|
||||
drawRect(skinX, skinY, skinX + skinWidth, skinY + skinHeight, 0xFFA0A0A0);
|
||||
drawRect(skinX + 1, skinY + 1, skinX + skinWidth - 1, skinY + skinHeight - 1, 0xFF000015);
|
||||
|
||||
int skid = selectedSlot - EaglerProfile.customCapes.size();
|
||||
if(skid < 0) {
|
||||
skid = 0;
|
||||
}
|
||||
|
||||
if(dropDownOpen) {
|
||||
super.drawScreen(0, 0, partialTicks);
|
||||
}else {
|
||||
super.drawScreen(mx, my, partialTicks);
|
||||
}
|
||||
|
||||
int numberOfCustomSkins = EaglerProfile.customSkins.size();
|
||||
int numberOfCustomCapes = EaglerProfile.customCapes.size();
|
||||
ResourceLocation skinTexture;
|
||||
SkinModel model;
|
||||
if(parent.selectedSlot < numberOfCustomSkins) {
|
||||
CustomSkin customSkin = EaglerProfile.customSkins.get(parent.selectedSlot);
|
||||
skinTexture = customSkin.getResource();
|
||||
model = customSkin.model;
|
||||
}else {
|
||||
DefaultSkins defaultSkin = DefaultSkins.getSkinFromId(parent.selectedSlot - numberOfCustomSkins);
|
||||
skinTexture = defaultSkin.location;
|
||||
model = defaultSkin.model;
|
||||
}
|
||||
|
||||
if(model.highPoly != null) {
|
||||
drawCenteredString(fontRendererObj, I18n.format(this.mc.gameSettings.enableFNAWSkins ? "editProfile.disableFNAW" : "editProfile.enableFNAW"), width / 2, height / 6 + 150, 10526880);
|
||||
}
|
||||
|
||||
skinX = width / 2 - 20;
|
||||
skinY = height / 6 + 52;
|
||||
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);
|
||||
|
||||
GlStateManager.color(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
|
||||
mc.getTextureManager().bindTexture(eaglerGui);
|
||||
drawTexturedModalRect(skinX + skinWidth - 18, skinY + 3, 0, 0, 16, 16);
|
||||
|
||||
drawString(fontRendererObj, dropDownOptions[selectedSlot], skinX + 5, skinY + 7, 14737632);
|
||||
|
||||
skinX = width / 2 - 20;
|
||||
skinY = height / 6 + 73;
|
||||
skinWidth = 140;
|
||||
skinHeight = (height - skinY - 10);
|
||||
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) {
|
||||
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);
|
||||
}
|
||||
drawString(fontRendererObj, 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);
|
||||
}
|
||||
|
||||
if(!EagRuntime.getConfiguration().isDemo()) {
|
||||
GlStateManager.pushMatrix();
|
||||
GlStateManager.scale(0.75f, 0.75f, 0.75f);
|
||||
GlStateManager.color(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
String text = I18n.format("editProfile.importExport");
|
||||
|
||||
int w = mc.fontRendererObj.getStringWidth(text);
|
||||
boolean hover = mx > 1 && my > 1 && mx < (w * 3 / 4) + 7 && my < 12;
|
||||
if(hover) {
|
||||
Mouse.showCursor(EnumCursorType.HAND);
|
||||
}
|
||||
|
||||
drawString(mc.fontRendererObj, EnumChatFormatting.UNDERLINE + text, 5, 5, hover ? 0xFFEEEE22 : 0xFFCCCCCC);
|
||||
|
||||
GlStateManager.popMatrix();
|
||||
}
|
||||
|
||||
int xx = width / 2 - 80;
|
||||
int yy = height / 6 + 130;
|
||||
|
||||
skinX = this.width / 2 - 120;
|
||||
skinY = this.height / 6 + 8;
|
||||
skinWidth = 80;
|
||||
skinHeight = 130;
|
||||
|
||||
ResourceLocation capeTexture;
|
||||
if(selectedSlot < numberOfCustomCapes) {
|
||||
capeTexture = EaglerProfile.customCapes.get(selectedSlot).getResource();
|
||||
}else {
|
||||
capeTexture = DefaultCapes.getCapeFromId(selectedSlot - numberOfCustomCapes).location;
|
||||
}
|
||||
|
||||
SkinPreviewRenderer.renderPreview(xx, yy, mx, my, true, model, skinTexture, capeTexture);
|
||||
}
|
||||
|
||||
public void handleMouseInput() throws IOException {
|
||||
super.handleMouseInput();
|
||||
if(dropDownOpen) {
|
||||
int var1 = Mouse.getEventDWheel();
|
||||
if(var1 < 0) {
|
||||
scrollPos += 3;
|
||||
}
|
||||
if(var1 > 0) {
|
||||
scrollPos -= 3;
|
||||
if(scrollPos < 0) {
|
||||
scrollPos = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void actionPerformed(GuiButton par1GuiButton) {
|
||||
if(!dropDownOpen) {
|
||||
if(par1GuiButton.id == 0) {
|
||||
safeProfile();
|
||||
this.mc.displayGuiScreen((GuiScreen) parent);
|
||||
}else if(par1GuiButton.id == 1) {
|
||||
EagRuntime.displayFileChooser("image/png", "png");
|
||||
}else if(par1GuiButton.id == 2) {
|
||||
EaglerProfile.clearCustomCapes();
|
||||
safeProfile();
|
||||
updateOptions();
|
||||
selectedSlot = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void updateScreen() {
|
||||
if(EagRuntime.fileChooserHasResult()) {
|
||||
FileChooserResult result = EagRuntime.getFileChooserResult();
|
||||
if(result != null) {
|
||||
ImageData loadedCape = ImageData.loadImageFile(result.fileData);
|
||||
if(loadedCape != null) {
|
||||
if((loadedCape.width == 32 || loadedCape.width == 64) && loadedCape.height == 32) {
|
||||
byte[] resized = new byte[1173];
|
||||
SkinConverter.convertCape32x32RGBAto23x17RGB(loadedCape, resized);
|
||||
int k;
|
||||
if((k = EaglerProfile.addCustomCape(result.fileName, resized)) != -1) {
|
||||
selectedSlot = k;
|
||||
updateOptions();
|
||||
safeProfile();
|
||||
}
|
||||
}else {
|
||||
EagRuntime.showPopup("The selected image '" + result.fileName + "' is not the right size!\nEaglercraft only supports 32x32 or 64x32 capes");
|
||||
}
|
||||
}else {
|
||||
EagRuntime.showPopup("The selected file '" + result.fileName + "' is not a PNG file!");
|
||||
}
|
||||
}
|
||||
}
|
||||
if(dropDownOpen) {
|
||||
if(Mouse.isButtonDown(0)) {
|
||||
int skinX = width / 2 - 20;
|
||||
int skinY = height / 6 + 73;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
public void onGuiClosed() {
|
||||
Keyboard.enableRepeatEvents(false);
|
||||
}
|
||||
|
||||
protected void keyTyped(char c, int k) {
|
||||
if(k == 200 && selectedSlot > 0) {
|
||||
--selectedSlot;
|
||||
scrollPos = selectedSlot - 2;
|
||||
}
|
||||
if(k == 208 && selectedSlot < (dropDownOptions.length - 1)) {
|
||||
++selectedSlot;
|
||||
scrollPos = selectedSlot - 2;
|
||||
}
|
||||
}
|
||||
|
||||
protected void mouseClicked(int mx, int my, int button) {
|
||||
if (button == 0) {
|
||||
if(!EagRuntime.getConfiguration().isDemo()) {
|
||||
int w = mc.fontRendererObj.getStringWidth(I18n.format("editProfile.importExport"));
|
||||
if(mx > 1 && my > 1 && mx < (w * 3 / 4) + 7 && my < 12) {
|
||||
safeProfile();
|
||||
mc.displayGuiScreen(new GuiScreenImportExportProfile(parent));
|
||||
mc.getSoundHandler().playSound(PositionedSoundRecord.create(new ResourceLocation("gui.button.press"), 1.0F));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
int skinX = width / 2 + 140 - 40;
|
||||
int skinY = height / 6 + 52;
|
||||
|
||||
if(mx >= skinX && mx < (skinX + 20) && my >= skinY && my < (skinY + 22)) {
|
||||
dropDownOpen = !dropDownOpen;
|
||||
return;
|
||||
}
|
||||
|
||||
skinX = width / 2 - 20;
|
||||
skinY = height / 6 + 52;
|
||||
int skinWidth = 140;
|
||||
int skinHeight = skinsHeight;
|
||||
|
||||
if(!(mx >= skinX && mx < (skinX + skinWidth) && my >= skinY && my < (skinY + skinHeight + 22))) {
|
||||
dragging = false;
|
||||
if(dropDownOpen) {
|
||||
dropDownOpen = false;
|
||||
return;
|
||||
}
|
||||
}else if(dropDownOpen && !dragging) {
|
||||
skinY += 21;
|
||||
for(int i = 0; i < slotsVisible; i++) {
|
||||
if(i + scrollPos < dropDownOptions.length) {
|
||||
if(mx >= skinX && mx < (skinX + skinWidth - 10) && my >= (skinY + i * 10 + 5) && my < (skinY + i * 10 + 15) && selectedSlot != i + scrollPos) {
|
||||
selectedSlot = i + scrollPos;
|
||||
dropDownOpen = false;
|
||||
dragging = false;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
super.mouseClicked(mx, my, button);
|
||||
}
|
||||
|
||||
protected void safeProfile() {
|
||||
int customLen = EaglerProfile.customCapes.size();
|
||||
if(selectedSlot < customLen) {
|
||||
EaglerProfile.presetCapeId = -1;
|
||||
EaglerProfile.customCapeId = selectedSlot;
|
||||
}else {
|
||||
EaglerProfile.presetCapeId = selectedSlot - customLen;
|
||||
EaglerProfile.customCapeId = -1;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -20,7 +20,7 @@ import static net.lax1dude.eaglercraft.v1_8.opengl.RealOpenGLEnums.*;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2022-2023 lax1dude, ayunami2000. All Rights Reserved.
|
||||
* Copyright (c) 2022-2024 lax1dude, ayunami2000. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
@ -42,7 +42,7 @@ public class GuiScreenEditProfile extends GuiScreen {
|
||||
private boolean dropDownOpen = false;
|
||||
private String[] dropDownOptions;
|
||||
private int slotsVisible = 0;
|
||||
private int selectedSlot = 0;
|
||||
protected int selectedSlot = 0;
|
||||
private int scrollPos = -1;
|
||||
private int skinsHeight = 0;
|
||||
private boolean dragging = false;
|
||||
@ -102,11 +102,25 @@ public class GuiScreenEditProfile extends GuiScreen {
|
||||
drawRect(skinX, skinY, skinX + skinWidth, skinY + skinHeight, 0xFFA0A0A0);
|
||||
drawRect(skinX + 1, skinY + 1, skinX + skinWidth - 1, skinY + skinHeight - 1, 0xFF000015);
|
||||
|
||||
int skid = selectedSlot - EaglerProfile.customSkins.size();
|
||||
if(skid < 0) {
|
||||
skid = 0;
|
||||
GlStateManager.pushMatrix();
|
||||
GlStateManager.translate(skinX + 2, skinY - 9, 0.0f);
|
||||
GlStateManager.scale(0.75f, 0.75f, 0.75f);
|
||||
|
||||
int numberOfCustomSkins = EaglerProfile.customSkins.size();
|
||||
int skid = selectedSlot - numberOfCustomSkins;
|
||||
SkinModel selectedSkinModel = skid < 0 ? EaglerProfile.customSkins.get(selectedSlot).model : DefaultSkins.getSkinFromId(skid).model;
|
||||
if(selectedSkinModel == SkinModel.STEVE || selectedSkinModel == SkinModel.ALEX || (selectedSkinModel.highPoly != null && !this.mc.gameSettings.enableFNAWSkins)) {
|
||||
String capesText = I18n.format("editProfile.capes");
|
||||
int color = 10526880;
|
||||
if(mx > skinX - 10 && my > skinY - 16 && mx < skinX + (fontRendererObj.getStringWidth(capesText) * 0.75f) + 10 && my < skinY + 7) {
|
||||
color = 0xFFCCCC44;
|
||||
Mouse.showCursor(EnumCursorType.HAND);
|
||||
}
|
||||
this.drawString(this.fontRendererObj, EnumChatFormatting.UNDERLINE + capesText, 0, 0, color);
|
||||
}
|
||||
|
||||
GlStateManager.popMatrix();
|
||||
|
||||
usernameField.drawTextBox();
|
||||
if(dropDownOpen || newSkinWaitSteveOrAlex) {
|
||||
super.drawScreen(0, 0, partialTicks);
|
||||
@ -114,6 +128,10 @@ public class GuiScreenEditProfile extends GuiScreen {
|
||||
super.drawScreen(mx, my, partialTicks);
|
||||
}
|
||||
|
||||
if(selectedSkinModel.highPoly != null) {
|
||||
drawCenteredString(fontRendererObj, I18n.format(this.mc.gameSettings.enableFNAWSkins ? "editProfile.disableFNAW" : "editProfile.enableFNAW"), width / 2, height / 6 + 150, 10526880);
|
||||
}
|
||||
|
||||
skinX = width / 2 - 20;
|
||||
skinY = height / 6 + 82;
|
||||
skinWidth = 140;
|
||||
@ -184,7 +202,6 @@ public class GuiScreenEditProfile extends GuiScreen {
|
||||
|
||||
int xx = width / 2 - 80;
|
||||
int yy = height / 6 + 130;
|
||||
int numberOfCustomSkins = EaglerProfile.customSkins.size();
|
||||
|
||||
if(newSkinWaitSteveOrAlex && selectedSlot < numberOfCustomSkins) {
|
||||
skinWidth = 70;
|
||||
@ -217,8 +234,8 @@ public class GuiScreenEditProfile extends GuiScreen {
|
||||
drawCenteredString(fontRendererObj, "Steve", skinX + skinWidth / 2, skinY + skinHeight + 6, cc);
|
||||
}
|
||||
|
||||
mc.getTextureManager().bindTexture(newSkin.getResource());
|
||||
SkinPreviewRenderer.renderBiped(xx, yy, mx, my, SkinModel.STEVE);
|
||||
SkinPreviewRenderer.renderPreview(xx, yy, mx, my, false, SkinModel.STEVE, newSkin.getResource(),
|
||||
EaglerProfile.getActiveCapeResourceLocation());
|
||||
|
||||
skinX = width / 2 + 20;
|
||||
skinY = height / 4;
|
||||
@ -242,8 +259,8 @@ public class GuiScreenEditProfile extends GuiScreen {
|
||||
drawCenteredString(fontRendererObj, "Alex", skinX + skinWidth / 2, skinY + skinHeight + 8, cc);
|
||||
}
|
||||
|
||||
mc.getTextureManager().bindTexture(newSkin.getResource());
|
||||
SkinPreviewRenderer.renderBiped(xx, yy, mx, my, SkinModel.ALEX);
|
||||
SkinPreviewRenderer.renderPreview(xx, yy, mx, my, false, SkinModel.ALEX, newSkin.getResource(),
|
||||
EaglerProfile.getActiveCapeResourceLocation());
|
||||
}else {
|
||||
skinX = this.width / 2 - 120;
|
||||
skinY = this.height / 6 + 8;
|
||||
@ -251,20 +268,17 @@ public class GuiScreenEditProfile extends GuiScreen {
|
||||
skinHeight = 130;
|
||||
|
||||
ResourceLocation texture;
|
||||
SkinModel model;
|
||||
if(selectedSlot < numberOfCustomSkins) {
|
||||
CustomSkin customSkin = EaglerProfile.customSkins.get(selectedSlot);
|
||||
texture = customSkin.getResource();
|
||||
model = customSkin.model;
|
||||
if(skid < 0) {
|
||||
texture = EaglerProfile.customSkins.get(selectedSlot).getResource();
|
||||
}else {
|
||||
DefaultSkins defaultSkin = DefaultSkins.defaultSkinsMap[selectedSlot - numberOfCustomSkins];
|
||||
texture = defaultSkin.location;
|
||||
model = defaultSkin.model;
|
||||
texture = DefaultSkins.getSkinFromId(skid).location;
|
||||
}
|
||||
|
||||
mc.getTextureManager().bindTexture(texture);
|
||||
SkinPreviewRenderer.renderBiped(xx, yy, newSkinWaitSteveOrAlex ? width / 2 : mx, newSkinWaitSteveOrAlex ? height / 2 : my, model);
|
||||
SkinPreviewRenderer.renderPreview(xx, yy, newSkinWaitSteveOrAlex ? width / 2 : mx,
|
||||
newSkinWaitSteveOrAlex ? height / 2 : my, false, selectedSkinModel, texture,
|
||||
EaglerProfile.getActiveCapeResourceLocation());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void handleMouseInput() throws IOException {
|
||||
@ -287,12 +301,14 @@ public class GuiScreenEditProfile extends GuiScreen {
|
||||
if(!dropDownOpen) {
|
||||
if(par1GuiButton.id == 0) {
|
||||
safeProfile();
|
||||
EaglerProfile.save();
|
||||
this.mc.displayGuiScreen((GuiScreen) parent);
|
||||
}else if(par1GuiButton.id == 1) {
|
||||
EagRuntime.displayFileChooser("image/png", "png");
|
||||
}else if(par1GuiButton.id == 2) {
|
||||
EaglerProfile.clearCustomSkins();
|
||||
safeProfile();
|
||||
EaglerProfile.save();
|
||||
updateOptions();
|
||||
selectedSlot = 0;
|
||||
}
|
||||
@ -335,6 +351,7 @@ public class GuiScreenEditProfile extends GuiScreen {
|
||||
newSkinWaitSteveOrAlex = true;
|
||||
updateOptions();
|
||||
safeProfile();
|
||||
EaglerProfile.save();
|
||||
}
|
||||
}else {
|
||||
EagRuntime.showPopup("The selected image '" + result.fileName + "' is not the right size!\nEaglercraft only supports 64x32 or 64x64 skins");
|
||||
@ -387,21 +404,37 @@ public class GuiScreenEditProfile extends GuiScreen {
|
||||
}
|
||||
|
||||
protected void mouseClicked(int mx, int my, int button) {
|
||||
super.mouseClicked(mx, my, button);
|
||||
usernameField.mouseClicked(mx, my, button);
|
||||
if (button == 0) {
|
||||
if(!EagRuntime.getConfiguration().isDemo()) {
|
||||
int w = mc.fontRendererObj.getStringWidth(I18n.format("editProfile.importExport"));
|
||||
if(mx > 1 && my > 1 && mx < (w * 3 / 4) + 7 && my < 12) {
|
||||
safeProfile();
|
||||
EaglerProfile.save();
|
||||
mc.displayGuiScreen(new GuiScreenImportExportProfile(this));
|
||||
mc.getSoundHandler().playSound(PositionedSoundRecord.create(new ResourceLocation("gui.button.press"), 1.0F));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
int skinX, skinY;
|
||||
int skid = selectedSlot - EaglerProfile.customSkins.size();
|
||||
SkinModel selectedSkinModel = skid < 0 ? EaglerProfile.customSkins.get(selectedSlot).model : DefaultSkins.getSkinFromId(skid).model;
|
||||
if(selectedSkinModel == SkinModel.STEVE || selectedSkinModel == SkinModel.ALEX || (selectedSkinModel.highPoly != null && !this.mc.gameSettings.enableFNAWSkins)) {
|
||||
skinX = this.width / 2 - 120;
|
||||
skinY = this.height / 6 + 8;
|
||||
String capesText = I18n.format("editProfile.capes");
|
||||
if(mx > skinX - 10 && my > skinY - 16 && mx < skinX + (fontRendererObj.getStringWidth(capesText) * 0.75f) + 10 && my < skinY + 7) {
|
||||
safeProfile();
|
||||
this.mc.displayGuiScreen(new GuiScreenEditCape(this));
|
||||
mc.getSoundHandler().playSound(PositionedSoundRecord.create(new ResourceLocation("gui.button.press"), 1.0F));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if(newSkinWaitSteveOrAlex) {
|
||||
int skinX = width / 2 - 90;
|
||||
int skinY = height / 4;
|
||||
skinX = width / 2 - 90;
|
||||
skinY = height / 4;
|
||||
int skinWidth = 70;
|
||||
int skinHeight = 120;
|
||||
if(mx >= skinX && my >= skinY && mx < skinX + skinWidth && my < skinY + skinHeight) {
|
||||
@ -423,8 +456,8 @@ public class GuiScreenEditProfile extends GuiScreen {
|
||||
}
|
||||
return;
|
||||
}else if(selectedSlot < EaglerProfile.customSkins.size()) {
|
||||
int skinX = width / 2 - 120;
|
||||
int skinY = height / 6 + 18;
|
||||
skinX = width / 2 - 120;
|
||||
skinY = height / 6 + 18;
|
||||
int skinWidth = 80;
|
||||
int skinHeight = 120;
|
||||
if(mx >= skinX && my >= skinY && mx < skinX + skinWidth && my < skinY + skinHeight) {
|
||||
@ -434,8 +467,8 @@ public class GuiScreenEditProfile extends GuiScreen {
|
||||
}
|
||||
}
|
||||
}
|
||||
int skinX = width / 2 + 140 - 40;
|
||||
int skinY = height / 6 + 82;
|
||||
skinX = width / 2 + 140 - 40;
|
||||
skinY = height / 6 + 82;
|
||||
|
||||
if(mx >= skinX && mx < (skinX + 20) && my >= skinY && my < (skinY + 22)) {
|
||||
dropDownOpen = !dropDownOpen;
|
||||
@ -448,27 +481,26 @@ public class GuiScreenEditProfile extends GuiScreen {
|
||||
int skinHeight = skinsHeight;
|
||||
|
||||
if(!(mx >= skinX && mx < (skinX + skinWidth) && my >= skinY && my < (skinY + skinHeight + 22))) {
|
||||
dropDownOpen = false;
|
||||
dragging = false;
|
||||
return;
|
||||
}
|
||||
|
||||
skinY += 21;
|
||||
|
||||
if(dropDownOpen && !dragging) {
|
||||
if(dropDownOpen) {
|
||||
dropDownOpen = false;
|
||||
return;
|
||||
}
|
||||
}else if(dropDownOpen && !dragging) {
|
||||
skinY += 21;
|
||||
for(int i = 0; i < slotsVisible; i++) {
|
||||
if(i + scrollPos < dropDownOptions.length) {
|
||||
if(selectedSlot != i + scrollPos) {
|
||||
if(mx >= skinX && mx < (skinX + skinWidth - 10) && my >= (skinY + i * 10 + 5) && my < (skinY + i * 10 + 15) && selectedSlot != i + scrollPos) {
|
||||
selectedSlot = i + scrollPos;
|
||||
dropDownOpen = false;
|
||||
dragging = false;
|
||||
}
|
||||
if(mx >= skinX && mx < (skinX + skinWidth - 10) && my >= (skinY + i * 10 + 5) && my < (skinY + i * 10 + 15)) {
|
||||
selectedSlot = i + scrollPos;
|
||||
dropDownOpen = false;
|
||||
dragging = false;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
super.mouseClicked(mx, my, button);
|
||||
}
|
||||
|
||||
protected void safeProfile() {
|
||||
@ -488,7 +520,6 @@ public class GuiScreenEditProfile extends GuiScreen {
|
||||
name = name.substring(0, 16);
|
||||
}
|
||||
EaglerProfile.setName(name);
|
||||
EaglerProfile.save();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,113 @@
|
||||
package net.lax1dude.eaglercraft.v1_8.profile;
|
||||
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2022-2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public enum HighPolySkin {
|
||||
|
||||
LONG_ARMS(
|
||||
new ResourceLocation("eagler:mesh/longarms.png"),
|
||||
new ResourceLocation("eagler:mesh/longarms0.mdl"),
|
||||
null,
|
||||
new ResourceLocation("eagler:mesh/longarms2.mdl"),
|
||||
new ResourceLocation[] {
|
||||
new ResourceLocation("eagler:mesh/longarms1.mdl")
|
||||
},
|
||||
new float[] {
|
||||
1.325f
|
||||
},
|
||||
0.0f,
|
||||
new ResourceLocation("eagler:mesh/longarms.fallback.png")
|
||||
),
|
||||
|
||||
WEIRD_CLIMBER_DUDE(
|
||||
new ResourceLocation("eagler:mesh/weirdclimber.png"),
|
||||
new ResourceLocation("eagler:mesh/weirdclimber0.mdl"),
|
||||
null,
|
||||
new ResourceLocation("eagler:mesh/weirdclimber2.mdl"),
|
||||
new ResourceLocation[] {
|
||||
new ResourceLocation("eagler:mesh/weirdclimber1.mdl")
|
||||
},
|
||||
new float[] {
|
||||
2.62f
|
||||
},
|
||||
-90.0f,
|
||||
new ResourceLocation("eagler:mesh/weirdclimber.fallback.png")
|
||||
),
|
||||
|
||||
LAXATIVE_DUDE(
|
||||
new ResourceLocation("eagler:mesh/laxativedude.png"),
|
||||
new ResourceLocation("eagler:mesh/laxativedude0.mdl"),
|
||||
null,
|
||||
new ResourceLocation("eagler:mesh/laxativedude3.mdl"),
|
||||
new ResourceLocation[] {
|
||||
new ResourceLocation("eagler:mesh/laxativedude1.mdl"),
|
||||
new ResourceLocation("eagler:mesh/laxativedude2.mdl")
|
||||
},
|
||||
new float[] {
|
||||
2.04f
|
||||
},
|
||||
0.0f,
|
||||
new ResourceLocation("eagler:mesh/laxativedude.fallback.png")
|
||||
),
|
||||
|
||||
BABY_CHARLES(
|
||||
new ResourceLocation("eagler:mesh/charles.png"),
|
||||
new ResourceLocation("eagler:mesh/charles0.mdl"),
|
||||
new ResourceLocation("eagler:mesh/charles1.mdl"),
|
||||
new ResourceLocation("eagler:mesh/charles2.mdl"),
|
||||
new ResourceLocation[] {},
|
||||
new float[] {},
|
||||
0.0f,
|
||||
new ResourceLocation("eagler:mesh/charles.fallback.png")
|
||||
),
|
||||
|
||||
BABY_WINSTON(
|
||||
new ResourceLocation("eagler:mesh/winston.png"),
|
||||
new ResourceLocation("eagler:mesh/winston0.mdl"),
|
||||
null,
|
||||
new ResourceLocation("eagler:mesh/winston1.mdl"),
|
||||
new ResourceLocation[] {},
|
||||
new float[] {},
|
||||
0.0f,
|
||||
new ResourceLocation("eagler:mesh/winston.fallback.png")
|
||||
);
|
||||
|
||||
public static float highPolyScale = 0.5f;
|
||||
|
||||
public final ResourceLocation texture;
|
||||
public final ResourceLocation bodyModel;
|
||||
public final ResourceLocation headModel;
|
||||
public final ResourceLocation eyesModel;
|
||||
public final ResourceLocation[] limbsModel;
|
||||
public final float[] limbsOffset;
|
||||
public final float limbsInitialRotation;
|
||||
public final ResourceLocation fallbackTexture;
|
||||
|
||||
HighPolySkin(ResourceLocation texture, ResourceLocation bodyModel, ResourceLocation headModel, ResourceLocation eyesModel,
|
||||
ResourceLocation[] limbsModel, float[] limbsOffset, float limbsInitialRotation, ResourceLocation fallbackTexture) {
|
||||
this.texture = texture;
|
||||
this.bodyModel = bodyModel;
|
||||
this.headModel = headModel;
|
||||
this.eyesModel = eyesModel;
|
||||
this.limbsModel = limbsModel;
|
||||
this.limbsOffset = limbsOffset;
|
||||
this.limbsInitialRotation = limbsInitialRotation;
|
||||
this.fallbackTexture = fallbackTexture;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,463 @@
|
||||
package net.lax1dude.eaglercraft.v1_8.profile;
|
||||
|
||||
import static net.lax1dude.eaglercraft.v1_8.opengl.RealOpenGLEnums.*;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||
import net.lax1dude.eaglercraft.v1_8.opengl.EaglerMeshLoader;
|
||||
import net.lax1dude.eaglercraft.v1_8.opengl.EaglercraftGPU;
|
||||
import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager;
|
||||
import net.lax1dude.eaglercraft.v1_8.opengl.OpenGlHelper;
|
||||
import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.DeferredStateManager;
|
||||
import net.lax1dude.eaglercraft.v1_8.vector.Matrix4f;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.entity.AbstractClientPlayer;
|
||||
import net.minecraft.client.model.ModelBase;
|
||||
import net.minecraft.client.renderer.block.model.ItemCameraTransforms;
|
||||
import net.minecraft.client.renderer.entity.RenderManager;
|
||||
import net.minecraft.client.renderer.entity.RenderPlayer;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.init.Items;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemBlock;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.MathHelper;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2022-2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class RenderHighPoly extends RenderPlayer {
|
||||
|
||||
private static final Logger logger = LogManager.getLogger("RenderHighPoly");
|
||||
|
||||
public RenderHighPoly(RenderManager renderManager, ModelBase fallbackModel, float fallbackScale) {
|
||||
super(renderManager, fallbackModel, fallbackScale);
|
||||
}
|
||||
|
||||
private static final Matrix4f tmpMatrix = new Matrix4f();
|
||||
|
||||
public void doRender(AbstractClientPlayer abstractclientplayer, double d0, double d1, double d2, float f,
|
||||
float f1) {
|
||||
if (!abstractclientplayer.isUser() || this.renderManager.livingPlayer == abstractclientplayer) {
|
||||
HighPolySkin highPolySkin = abstractclientplayer.getEaglerSkinModel().highPoly;
|
||||
|
||||
if(highPolySkin == null) {
|
||||
super.doRender(abstractclientplayer, d0, d1, d2, f, f1);
|
||||
return;
|
||||
}
|
||||
|
||||
GlStateManager.pushMatrix();
|
||||
GlStateManager.disableCull();
|
||||
|
||||
try {
|
||||
Minecraft mc = Minecraft.getMinecraft();
|
||||
float f2 = this.interpolateRotation(abstractclientplayer.prevRenderYawOffset, abstractclientplayer.renderYawOffset,
|
||||
f1);
|
||||
float f3 = this.interpolateRotation(abstractclientplayer.prevRotationYawHead, abstractclientplayer.rotationYawHead,
|
||||
f1);
|
||||
float f4 = f3 - f2;
|
||||
if (abstractclientplayer.isRiding() && abstractclientplayer.ridingEntity instanceof EntityLivingBase) {
|
||||
EntityLivingBase entitylivingbase1 = (EntityLivingBase) abstractclientplayer.ridingEntity;
|
||||
f2 = this.interpolateRotation(entitylivingbase1.prevRenderYawOffset, entitylivingbase1.renderYawOffset,
|
||||
f1);
|
||||
f4 = f3 - f2;
|
||||
float f5 = MathHelper.wrapAngleTo180_float(f4);
|
||||
if (f5 < -85.0F) {
|
||||
f5 = -85.0F;
|
||||
}
|
||||
|
||||
if (f5 >= 85.0F) {
|
||||
f5 = 85.0F;
|
||||
}
|
||||
|
||||
f2 = f3 - f5;
|
||||
if (f5 * f5 > 2500.0F) {
|
||||
f2 += f5 * 0.2F;
|
||||
}
|
||||
}
|
||||
|
||||
this.renderLivingAt(abstractclientplayer, d0, d1, d2);
|
||||
float f10 = this.handleRotationFloat(abstractclientplayer, f1);
|
||||
this.rotateCorpse(abstractclientplayer, f10, f2, f1);
|
||||
GlStateManager.enableRescaleNormal();
|
||||
this.preRenderCallback(abstractclientplayer, f1);
|
||||
float f6 = 0.0625F;
|
||||
GlStateManager.scale(HighPolySkin.highPolyScale, HighPolySkin.highPolyScale, HighPolySkin.highPolyScale);
|
||||
mc.getTextureManager().bindTexture(highPolySkin.texture);
|
||||
|
||||
if(abstractclientplayer.isPlayerSleeping()) {
|
||||
if(highPolySkin == HighPolySkin.LAXATIVE_DUDE || highPolySkin == HighPolySkin.WEIRD_CLIMBER_DUDE) {
|
||||
GlStateManager.translate(0.0f, -3.7f, 0.0f);
|
||||
}else if(highPolySkin == HighPolySkin.BABY_WINSTON) {
|
||||
GlStateManager.translate(0.0f, -2.4f, 0.0f);
|
||||
}else {
|
||||
GlStateManager.translate(0.0f, -3.0f, 0.0f);
|
||||
}
|
||||
}
|
||||
|
||||
float var15 = abstractclientplayer.prevLimbSwingAmount + (abstractclientplayer.limbSwingAmount - abstractclientplayer.prevLimbSwingAmount) * f1;
|
||||
float var16 = abstractclientplayer.limbSwing - abstractclientplayer.limbSwingAmount * (1.0F - f1);
|
||||
|
||||
if(highPolySkin == HighPolySkin.LONG_ARMS) {
|
||||
GlStateManager.rotate(MathHelper.sin(var16) * 20f * var15, 0.0f, 1.0f, 0.0f);
|
||||
GlStateManager.rotate(MathHelper.cos(var16) * 7f * var15, 0.0f, 0.0f, 1.0f);
|
||||
}else if(highPolySkin == HighPolySkin.WEIRD_CLIMBER_DUDE) {
|
||||
GlStateManager.rotate(MathHelper.sin(var16) * 7f * var15, 0.0f, 1.0f, 0.0f);
|
||||
GlStateManager.rotate(MathHelper.cos(var16) * 3f * var15, 0.0f, 0.0f, 1.0f);
|
||||
GlStateManager.rotate(-f3, 0.0f, 1.0f, 0.0f);
|
||||
float xd = (float)(abstractclientplayer.posX - abstractclientplayer.prevPosX);
|
||||
GlStateManager.rotate(xd * 70.0f * var15, 0.0f, 0.0f, 1.0f);
|
||||
float zd = (float)(abstractclientplayer.posZ - abstractclientplayer.prevPosZ);
|
||||
GlStateManager.rotate(zd * 70.0f * var15, 1.0f, 0.0f, 0.0f);
|
||||
GlStateManager.rotate(f3, 0.0f, 1.0f, 0.0f);
|
||||
}else if(highPolySkin == HighPolySkin.LAXATIVE_DUDE) {
|
||||
GlStateManager.rotate(-f3, 0.0f, 1.0f, 0.0f);
|
||||
float xd = (float)(abstractclientplayer.posX - abstractclientplayer.prevPosX);
|
||||
GlStateManager.rotate(-xd * 40.0f * var15, 0.0f, 0.0f, 1.0f);
|
||||
float zd = (float)(abstractclientplayer.posZ - abstractclientplayer.prevPosZ);
|
||||
GlStateManager.rotate(-zd * 40.0f * var15, 1.0f, 0.0f, 0.0f);
|
||||
GlStateManager.rotate(f3, 0.0f, 1.0f, 0.0f);
|
||||
}else if(highPolySkin == HighPolySkin.BABY_WINSTON) {
|
||||
GlStateManager.translate(0.0f, (MathHelper.cos(f10 % 100000.0f) + 1.0f) * var15 * 0.2f, 0.0f);
|
||||
GlStateManager.rotate(MathHelper.sin(var16) * 5f * var15, 0.0f, 1.0f, 0.0f);
|
||||
GlStateManager.rotate(MathHelper.cos(var16) * 5f * var15, 0.0f, 0.0f, 1.0f);
|
||||
}
|
||||
|
||||
if (abstractclientplayer.hurtTime > 0 || abstractclientplayer.deathTime > 0) {
|
||||
GlStateManager.color(1.2f, 0.8F, 0.8F, 1.0F);
|
||||
}
|
||||
|
||||
if(DeferredStateManager.isInDeferredPass()) {
|
||||
DeferredStateManager.setDefaultMaterialConstants();
|
||||
DeferredStateManager.setRoughnessConstant(0.5f);
|
||||
DeferredStateManager.setMetalnessConstant(0.05f);
|
||||
}
|
||||
|
||||
if(highPolySkin.bodyModel != null) {
|
||||
EaglercraftGPU.drawHighPoly(EaglerMeshLoader.getEaglerMesh(highPolySkin.bodyModel));
|
||||
}
|
||||
float jumpFactor = 0.0f;
|
||||
|
||||
if(highPolySkin.headModel != null) {
|
||||
if(highPolySkin == HighPolySkin.BABY_CHARLES) {
|
||||
long millis = System.currentTimeMillis();
|
||||
float partialTicks = (float) ((millis - abstractclientplayer.eaglerHighPolyAnimationTick) * 0.02);
|
||||
//long l50 = millis / 50l * 50l;
|
||||
//boolean runTick = par1EntityPlayer.eaglerHighPolyAnimationTick < l50 && millis >= l50;
|
||||
abstractclientplayer.eaglerHighPolyAnimationTick = millis;
|
||||
|
||||
if(partialTicks < 0.0f) {
|
||||
partialTicks = 0.0f;
|
||||
}
|
||||
if(partialTicks > 1.0f) {
|
||||
partialTicks = 1.0f;
|
||||
}
|
||||
|
||||
float jumpFac = (float)(abstractclientplayer.posY - abstractclientplayer.prevPosY);
|
||||
if(jumpFac < 0.0f && !abstractclientplayer.isCollidedVertically) {
|
||||
jumpFac = -jumpFac;
|
||||
jumpFac *= 0.1f;
|
||||
}
|
||||
jumpFac -= 0.05f;
|
||||
if(jumpFac > 0.1f && !abstractclientplayer.isCollidedVertically) {
|
||||
jumpFac = 0.1f;
|
||||
}else if(jumpFac < 0.0f) {
|
||||
jumpFac = 0.0f;
|
||||
}else if(jumpFac > 0.1f && abstractclientplayer.isCollidedVertically) {
|
||||
jumpFac = 0.1f;
|
||||
}else if(jumpFac > 0.4f) {
|
||||
jumpFac = 0.4f;
|
||||
}
|
||||
jumpFac *= 10.0f;
|
||||
|
||||
abstractclientplayer.eaglerHighPolyAnimationFloat3 += (jumpFac / (jumpFac + 1.0f)) * 6.0f * partialTicks;
|
||||
|
||||
if(Float.isInfinite(abstractclientplayer.eaglerHighPolyAnimationFloat3)) {
|
||||
abstractclientplayer.eaglerHighPolyAnimationFloat3 = 1.0f;
|
||||
}else if(abstractclientplayer.eaglerHighPolyAnimationFloat3 > 1.0f) {
|
||||
abstractclientplayer.eaglerHighPolyAnimationFloat3 = 1.0f;
|
||||
}else if(abstractclientplayer.eaglerHighPolyAnimationFloat3 < -1.0f) {
|
||||
abstractclientplayer.eaglerHighPolyAnimationFloat3 = -1.0f;
|
||||
}
|
||||
|
||||
abstractclientplayer.eaglerHighPolyAnimationFloat2 += abstractclientplayer.eaglerHighPolyAnimationFloat3 * partialTicks;
|
||||
|
||||
abstractclientplayer.eaglerHighPolyAnimationFloat5 += partialTicks;
|
||||
while(abstractclientplayer.eaglerHighPolyAnimationFloat5 > 0.05f) {
|
||||
abstractclientplayer.eaglerHighPolyAnimationFloat5 -= 0.05f;
|
||||
abstractclientplayer.eaglerHighPolyAnimationFloat3 *= 0.99f;
|
||||
abstractclientplayer.eaglerHighPolyAnimationFloat2 *= 0.9f;
|
||||
}
|
||||
|
||||
jumpFactor = abstractclientplayer.eaglerHighPolyAnimationFloat2; //(abstractclientplayer.eaglerHighPolyAnimationFloat1 - abstractclientplayer.eaglerHighPolyAnimationFloat2) * partialTicks + abstractclientplayer.eaglerHighPolyAnimationFloat2;
|
||||
jumpFactor -= 0.12f;
|
||||
if(jumpFactor < 0.0f) {
|
||||
jumpFactor = 0.0f;
|
||||
}
|
||||
jumpFactor = jumpFactor / (jumpFactor + 2.0f);
|
||||
if(jumpFactor > 1.0f) {
|
||||
jumpFactor = 1.0f;
|
||||
}
|
||||
}
|
||||
if(jumpFactor > 0.0f) {
|
||||
GlStateManager.pushMatrix();
|
||||
GlStateManager.translate(0.0f, jumpFactor * 3.0f, 0.0f);
|
||||
}
|
||||
|
||||
EaglercraftGPU.drawHighPoly(EaglerMeshLoader.getEaglerMesh(highPolySkin.headModel));
|
||||
|
||||
if(jumpFactor > 0.0f) {
|
||||
GlStateManager.popMatrix();
|
||||
}
|
||||
}
|
||||
|
||||
if(highPolySkin.limbsModel != null && highPolySkin.limbsModel.length > 0) {
|
||||
for(int i = 0; i < highPolySkin.limbsModel.length; ++i) {
|
||||
DeferredStateManager.setRoughnessConstant(0.023f);
|
||||
DeferredStateManager.setMetalnessConstant(0.902f);
|
||||
float offset = 0.0f;
|
||||
if(highPolySkin.limbsOffset != null) {
|
||||
if(highPolySkin.limbsOffset.length == 1) {
|
||||
offset = highPolySkin.limbsOffset[0];
|
||||
}else {
|
||||
offset = highPolySkin.limbsOffset[i];
|
||||
}
|
||||
}
|
||||
|
||||
GlStateManager.pushMatrix();
|
||||
|
||||
if(offset != 0.0f || highPolySkin.limbsInitialRotation != 0.0f) {
|
||||
if(offset != 0.0f) {
|
||||
GlStateManager.translate(0.0f, offset, 0.0f);
|
||||
}
|
||||
if(highPolySkin.limbsInitialRotation != 0.0f) {
|
||||
GlStateManager.rotate(highPolySkin.limbsInitialRotation, 1.0f, 0.0f, 0.0f);
|
||||
}
|
||||
}
|
||||
|
||||
if(highPolySkin == HighPolySkin.LONG_ARMS) {
|
||||
if(abstractclientplayer.isSwingInProgress) {
|
||||
float var17 = MathHelper.cos(-abstractclientplayer.getSwingProgress(f1) * (float)Math.PI * 2.0f - 1.2f) - 0.362f;
|
||||
var17 *= var17;
|
||||
GlStateManager.rotate(-var17 * 20.0f, 1.0f, 0.0f, 0.0f);
|
||||
}
|
||||
}else if(highPolySkin == HighPolySkin.WEIRD_CLIMBER_DUDE) {
|
||||
if(abstractclientplayer.isSwingInProgress) {
|
||||
float var17 = MathHelper.cos(-abstractclientplayer.getSwingProgress(f1) * (float)Math.PI * 2.0f - 1.2f) - 0.362f;
|
||||
var17 *= var17;
|
||||
GlStateManager.rotate(var17 * 60.0f, 1.0f, 0.0f, 0.0f);
|
||||
}
|
||||
GlStateManager.rotate(40.0f * var15, 1.0f, 0.0f, 0.0f);
|
||||
}else if(highPolySkin == HighPolySkin.LAXATIVE_DUDE) {
|
||||
float fff = (i == 0) ? 1.0f : -1.0f;
|
||||
float swing = (MathHelper.cos(f10 % 100000.0f) * fff + 0.2f) * var15;
|
||||
float swing2 = (MathHelper.cos(f10 % 100000.0f) * fff * 0.5f + 0.0f) * var15;
|
||||
GlStateManager.rotate(swing * 25.0f, 1.0f, 0.0f, 0.0f);
|
||||
if(abstractclientplayer.isSwingInProgress) {
|
||||
float var17 = MathHelper.cos(-abstractclientplayer.getSwingProgress(f1) * (float)Math.PI * 2.0f - 1.2f) - 0.362f;
|
||||
var17 *= var17;
|
||||
GlStateManager.rotate(-var17 * 25.0f, 1.0f, 0.0f, 0.0f);
|
||||
}
|
||||
|
||||
// shear matrix
|
||||
tmpMatrix.setIdentity();
|
||||
tmpMatrix.m21 = swing2;
|
||||
tmpMatrix.m23 = swing2 * -0.2f;
|
||||
GlStateManager.multMatrix(tmpMatrix);
|
||||
}
|
||||
|
||||
if(i != 0) {
|
||||
mc.getTextureManager().bindTexture(highPolySkin.texture);
|
||||
if (abstractclientplayer.hurtTime > 0 || abstractclientplayer.deathTime > 0) {
|
||||
GlStateManager.color(1.2f, 0.8F, 0.8F, 1.0F);
|
||||
}else {
|
||||
GlStateManager.color(1.0f, 1.0F, 1.0F, 1.0F);
|
||||
}
|
||||
}
|
||||
EaglercraftGPU.drawHighPoly(EaglerMeshLoader.getEaglerMesh(highPolySkin.limbsModel[i]));
|
||||
|
||||
if(i == 0) {
|
||||
GlStateManager.pushMatrix();
|
||||
|
||||
GlStateManager.translate(-0.287f, 0.05f, 0.0f);
|
||||
|
||||
if(highPolySkin == HighPolySkin.LONG_ARMS) {
|
||||
GlStateManager.translate(1.72f, 2.05f, -0.24f);
|
||||
ItemStack stk = abstractclientplayer.getHeldItem();
|
||||
if(stk != null) {
|
||||
Item itm = stk.getItem();
|
||||
if(itm != null) {
|
||||
if(itm == Items.bow) {
|
||||
GlStateManager.translate(-0.22f, 0.8f, 0.6f);
|
||||
GlStateManager.rotate(-90.0f, 1.0f, 0.0f, 0.0f);
|
||||
}else if(itm instanceof ItemBlock && !((ItemBlock)itm).getBlock().isNormalCube()) {
|
||||
GlStateManager.translate(0.0f, -0.1f, 0.13f);
|
||||
}else if(!itm.isFull3D()) {
|
||||
GlStateManager.translate(-0.08f, -0.1f, 0.16f);
|
||||
}
|
||||
}
|
||||
}
|
||||
}else if(highPolySkin == HighPolySkin.WEIRD_CLIMBER_DUDE) {
|
||||
GlStateManager.translate(-0.029f, 1.2f, -3f);
|
||||
GlStateManager.rotate(-5.0f, 0.0f, 1.0f, 0.0f);
|
||||
float var17 = -1.2f * var15;
|
||||
if(abstractclientplayer.isSwingInProgress) {
|
||||
float vvar17 = MathHelper.cos(-abstractclientplayer.getSwingProgress(f1) * (float)Math.PI * 2.0f - 1.2f) - 0.362f;
|
||||
var17 = vvar17 < var17 ? vvar17 : var17;
|
||||
}
|
||||
GlStateManager.translate(-0.02f * var17, 0.42f * var17, var17 * 0.35f);
|
||||
GlStateManager.rotate(var17 * 30.0f, 1.0f, 0.0f, 0.0f);
|
||||
GlStateManager.rotate(110.0f, 1.0f, 0.0f, 0.0f);
|
||||
ItemStack stk = abstractclientplayer.getHeldItem();
|
||||
if(stk != null) {
|
||||
Item itm = stk.getItem();
|
||||
if(itm != null) {
|
||||
if(itm == Items.bow) {
|
||||
GlStateManager.translate(-0.18f, 1.0f, 0.4f);
|
||||
GlStateManager.rotate(-95.0f, 1.0f, 0.0f, 0.0f);
|
||||
}else if(itm instanceof ItemBlock && !((ItemBlock)itm).getBlock().isNormalCube()) {
|
||||
GlStateManager.translate(0.0f, -0.1f, 0.13f);
|
||||
}else if(!itm.isFull3D()) {
|
||||
GlStateManager.translate(-0.08f, -0.1f, 0.16f);
|
||||
}
|
||||
}
|
||||
}
|
||||
}else if(highPolySkin == HighPolySkin.LAXATIVE_DUDE) {
|
||||
GlStateManager.translate(1.291f, 2.44f, -2.18f);
|
||||
GlStateManager.rotate(95.0f, 1.0f, 0.0f, 0.0f);
|
||||
ItemStack stk = abstractclientplayer.getHeldItem();
|
||||
if(stk != null) {
|
||||
Item itm = stk.getItem();
|
||||
if(itm != null) {
|
||||
if(itm == Items.bow) {
|
||||
GlStateManager.translate(-0.65f, 1.3f, -0.1f);
|
||||
GlStateManager.rotate(180.0f, 0.0f, 0.0f, 1.0f);
|
||||
GlStateManager.rotate(20.0f, 1.0f, 0.0f, 0.0f);
|
||||
}else if(itm instanceof ItemBlock && !((ItemBlock)itm).getBlock().isNormalCube()) {
|
||||
GlStateManager.translate(0.0f, -0.35f, 0.4f);
|
||||
}else if(!itm.isFull3D()) {
|
||||
GlStateManager.translate(-0.1f, -0.1f, 0.16f);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DeferredStateManager.setDefaultMaterialConstants();
|
||||
renderHeldItem(abstractclientplayer, f1);
|
||||
GlStateManager.popMatrix();
|
||||
}
|
||||
|
||||
GlStateManager.popMatrix();
|
||||
}
|
||||
}
|
||||
|
||||
if(highPolySkin.eyesModel != null && !DeferredStateManager.isEnableShadowRender()) {
|
||||
float ff = 0.00416f;
|
||||
int brightness = abstractclientplayer.getBrightnessForRender(0.0f);
|
||||
float blockLight = (brightness % 65536) * ff;
|
||||
float skyLight = (brightness / 65536) * ff;
|
||||
float sunCurve = (float)((abstractclientplayer.worldObj.getWorldTime() + 4000l) % 24000) / 24000.0f;
|
||||
sunCurve = MathHelper.clamp_float(9.8f - MathHelper.abs(sunCurve * 5.0f + sunCurve * sunCurve * 45.0f - 14.3f) * 0.7f, 0.0f, 1.0f);
|
||||
skyLight = skyLight * (sunCurve * 0.85f + 0.15f);
|
||||
blockLight = blockLight * (sunCurve * 0.3f + 0.7f);
|
||||
float eyeBrightness = blockLight;
|
||||
if(skyLight > eyeBrightness) {
|
||||
eyeBrightness = skyLight;
|
||||
}
|
||||
eyeBrightness += blockLight * 0.2f;
|
||||
eyeBrightness = 1.0f - eyeBrightness;
|
||||
eyeBrightness = MathHelper.clamp_float(eyeBrightness * 1.9f - 1.0f, 0.0f, 1.0f);
|
||||
if(eyeBrightness > 0.1f) {
|
||||
if(DeferredStateManager.isInDeferredPass()) {
|
||||
GlStateManager.color(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
DeferredStateManager.setDefaultMaterialConstants();
|
||||
DeferredStateManager.setEmissionConstant(eyeBrightness);
|
||||
}else {
|
||||
GlStateManager.enableBlend();
|
||||
GlStateManager.blendFunc(GL_ONE, GL_ONE);
|
||||
GlStateManager.color(eyeBrightness * 7.0f, eyeBrightness * 7.0f, eyeBrightness * 7.0f, 1.0f);
|
||||
if(jumpFactor > 0.0f) {
|
||||
GlStateManager.pushMatrix();
|
||||
GlStateManager.translate(0.0f, jumpFactor * 3.0f, 0.0f);
|
||||
}
|
||||
}
|
||||
GlStateManager.disableTexture2D();
|
||||
GlStateManager.disableLighting();
|
||||
GlStateManager.enableCull();
|
||||
|
||||
EaglercraftGPU.drawHighPoly(EaglerMeshLoader.getEaglerMesh(highPolySkin.eyesModel));
|
||||
|
||||
GlStateManager.enableTexture2D();
|
||||
GlStateManager.enableLighting();
|
||||
GlStateManager.disableCull();
|
||||
if(jumpFactor > 0.0f) {
|
||||
GlStateManager.popMatrix();
|
||||
}
|
||||
GlStateManager.color(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
if(!DeferredStateManager.isInDeferredPass()) {
|
||||
GlStateManager.disableBlend();
|
||||
}
|
||||
}
|
||||
}
|
||||
}catch(Throwable t) {
|
||||
logger.error("Couldn\'t render entity");
|
||||
logger.error(t);
|
||||
}
|
||||
GlStateManager.setActiveTexture(OpenGlHelper.lightmapTexUnit);
|
||||
GlStateManager.enableTexture2D();
|
||||
GlStateManager.setActiveTexture(OpenGlHelper.defaultTexUnit);
|
||||
GlStateManager.enableCull();
|
||||
GlStateManager.popMatrix();
|
||||
}
|
||||
}
|
||||
|
||||
public void renderRightArm(AbstractClientPlayer clientPlayer) {
|
||||
|
||||
}
|
||||
|
||||
public void renderLeftArm(AbstractClientPlayer clientPlayer) {
|
||||
|
||||
}
|
||||
|
||||
protected void renderHeldItem(AbstractClientPlayer clientPlayer, float partialTicks) {
|
||||
ItemStack itemstack = clientPlayer.getHeldItem();
|
||||
if (itemstack != null) {
|
||||
GlStateManager.pushMatrix();
|
||||
GlStateManager.translate(-0.11F, 0.475F, 0.25F);
|
||||
if (clientPlayer.fishEntity != null) {
|
||||
itemstack = new ItemStack(Items.fishing_rod, 0);
|
||||
}
|
||||
|
||||
Item item = itemstack.getItem();
|
||||
Minecraft minecraft = Minecraft.getMinecraft();
|
||||
if (item instanceof ItemBlock && Block.getBlockFromItem(item).getRenderType() == 2) {
|
||||
GlStateManager.translate(0.0F, 0.1875F, -0.3125F);
|
||||
GlStateManager.rotate(20.0F, 1.0F, 0.0F, 0.0F);
|
||||
GlStateManager.rotate(45.0F, 0.0F, 1.0F, 0.0F);
|
||||
float f1 = 0.375F;
|
||||
GlStateManager.scale(-f1, -f1, f1);
|
||||
}
|
||||
|
||||
if (clientPlayer.isSneaking()) {
|
||||
GlStateManager.translate(0.0F, 0.203125F, 0.0F);
|
||||
}
|
||||
|
||||
minecraft.getItemRenderer().renderItem(clientPlayer, itemstack,
|
||||
ItemCameraTransforms.TransformType.THIRD_PERSON);
|
||||
GlStateManager.popMatrix();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,242 @@
|
||||
package net.lax1dude.eaglercraft.v1_8.profile;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.EaglercraftUUID;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||
import net.lax1dude.eaglercraft.v1_8.socket.EaglercraftNetworkManager;
|
||||
import net.minecraft.client.renderer.texture.TextureManager;
|
||||
import net.minecraft.network.PacketBuffer;
|
||||
import net.minecraft.network.play.client.C17PacketCustomPayload;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2022-2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
public class ServerCapeCache {
|
||||
|
||||
private static final Logger logger = LogManager.getLogger("ServerCapeCache");
|
||||
|
||||
public class CapeCacheEntry {
|
||||
|
||||
protected final boolean isPresetCape;
|
||||
protected final int presetCapeId;
|
||||
protected final CacheCustomCape customCape;
|
||||
|
||||
protected long lastCacheHit = System.currentTimeMillis();
|
||||
|
||||
protected CapeCacheEntry(EaglerSkinTexture textureInstance, ResourceLocation resourceLocation) {
|
||||
this.isPresetCape = false;
|
||||
this.presetCapeId = -1;
|
||||
this.customCape = new CacheCustomCape(textureInstance, resourceLocation);
|
||||
ServerCapeCache.this.textureManager.loadTexture(resourceLocation, textureInstance);
|
||||
}
|
||||
|
||||
/**
|
||||
* Use only for the constant for the client player
|
||||
*/
|
||||
protected CapeCacheEntry(ResourceLocation resourceLocation) {
|
||||
this.isPresetCape = false;
|
||||
this.presetCapeId = -1;
|
||||
this.customCape = new CacheCustomCape(null, resourceLocation);
|
||||
}
|
||||
|
||||
protected CapeCacheEntry(int presetSkinId) {
|
||||
this.isPresetCape = true;
|
||||
this.presetCapeId = presetSkinId;
|
||||
this.customCape = null;
|
||||
}
|
||||
|
||||
public ResourceLocation getResourceLocation() {
|
||||
if(isPresetCape) {
|
||||
return DefaultCapes.getCapeFromId(presetCapeId).location;
|
||||
}else {
|
||||
if(customCape != null) {
|
||||
return customCape.resourceLocation;
|
||||
}else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void free() {
|
||||
if(!isPresetCape && customCape.resourceLocation != null) {
|
||||
ServerCapeCache.this.textureManager.deleteTexture(customCape.resourceLocation);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
protected static class CacheCustomCape {
|
||||
|
||||
protected final EaglerSkinTexture textureInstance;
|
||||
protected final ResourceLocation resourceLocation;
|
||||
|
||||
protected CacheCustomCape(EaglerSkinTexture textureInstance, ResourceLocation resourceLocation) {
|
||||
this.textureInstance = textureInstance;
|
||||
this.resourceLocation = resourceLocation;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private final CapeCacheEntry defaultCacheEntry = new CapeCacheEntry(0);
|
||||
private final Map<EaglercraftUUID, CapeCacheEntry> capesCache = new HashMap();
|
||||
private final Map<EaglercraftUUID, Long> waitingCapes = new HashMap();
|
||||
private final Map<EaglercraftUUID, Long> evictedCapes = new HashMap();
|
||||
|
||||
private final EaglercraftNetworkManager networkManager;
|
||||
protected final TextureManager textureManager;
|
||||
|
||||
private final EaglercraftUUID clientPlayerId;
|
||||
private final CapeCacheEntry clientPlayerCacheEntry;
|
||||
|
||||
private long lastFlush = System.currentTimeMillis();
|
||||
private long lastFlushReq = System.currentTimeMillis();
|
||||
private long lastFlushEvict = System.currentTimeMillis();
|
||||
|
||||
private static int texId = 0;
|
||||
|
||||
public ServerCapeCache(EaglercraftNetworkManager networkManager, TextureManager textureManager) {
|
||||
this.networkManager = networkManager;
|
||||
this.textureManager = textureManager;
|
||||
this.clientPlayerId = EaglerProfile.getPlayerUUID();
|
||||
this.clientPlayerCacheEntry = new CapeCacheEntry(EaglerProfile.getActiveCapeResourceLocation());
|
||||
}
|
||||
|
||||
public CapeCacheEntry getClientPlayerCape() {
|
||||
return clientPlayerCacheEntry;
|
||||
}
|
||||
|
||||
public CapeCacheEntry getCape(EaglercraftUUID player) {
|
||||
if(player.equals(clientPlayerId)) {
|
||||
return clientPlayerCacheEntry;
|
||||
}
|
||||
CapeCacheEntry etr = capesCache.get(player);
|
||||
if(etr == null) {
|
||||
if(!waitingCapes.containsKey(player) && !evictedCapes.containsKey(player)) {
|
||||
waitingCapes.put(player, System.currentTimeMillis());
|
||||
PacketBuffer buffer;
|
||||
try {
|
||||
buffer = CapePackets.writeGetOtherCape(player);
|
||||
}catch(IOException ex) {
|
||||
logger.error("Could not write cape request packet!");
|
||||
logger.error(ex);
|
||||
return defaultCacheEntry;
|
||||
}
|
||||
networkManager.sendPacket(new C17PacketCustomPayload("EAG|Capes-1.8", buffer));
|
||||
}
|
||||
return defaultCacheEntry;
|
||||
}else {
|
||||
etr.lastCacheHit = System.currentTimeMillis();
|
||||
return etr;
|
||||
}
|
||||
}
|
||||
|
||||
public void cacheCapePreset(EaglercraftUUID player, int presetId) {
|
||||
if(waitingCapes.remove(player) != null) {
|
||||
CapeCacheEntry etr = capesCache.remove(player);
|
||||
if(etr != null) {
|
||||
etr.free();
|
||||
}
|
||||
capesCache.put(player, new CapeCacheEntry(presetId));
|
||||
}else {
|
||||
logger.error("Unsolicited cape response recieved for \"{}\"! (preset {})", player, presetId);
|
||||
}
|
||||
}
|
||||
|
||||
public void cacheCapeCustom(EaglercraftUUID player, byte[] pixels) {
|
||||
if(waitingCapes.remove(player) != null) {
|
||||
CapeCacheEntry etr = capesCache.remove(player);
|
||||
if(etr != null) {
|
||||
etr.free();
|
||||
}
|
||||
byte[] pixels32x32 = new byte[4096];
|
||||
SkinConverter.convertCape23x17RGBto32x32RGBA(pixels, pixels32x32);
|
||||
try {
|
||||
etr = new CapeCacheEntry(new EaglerSkinTexture(pixels32x32, 32, 32),
|
||||
new ResourceLocation("eagler:capes/multiplayer/tex_" + texId++));
|
||||
}catch(Throwable t) {
|
||||
etr = new CapeCacheEntry(0);
|
||||
logger.error("Could not process custom skin packet for \"{}\"!", player);
|
||||
logger.error(t);
|
||||
}
|
||||
capesCache.put(player, etr);
|
||||
}else {
|
||||
logger.error("Unsolicited skin response recieved for \"{}\"!", player);
|
||||
}
|
||||
}
|
||||
|
||||
public void flush() {
|
||||
long millis = System.currentTimeMillis();
|
||||
if(millis - lastFlushReq > 5000l) {
|
||||
lastFlushReq = millis;
|
||||
if(!waitingCapes.isEmpty()) {
|
||||
Iterator<Long> waitingItr = waitingCapes.values().iterator();
|
||||
while(waitingItr.hasNext()) {
|
||||
if(millis - waitingItr.next().longValue() > 30000l) {
|
||||
waitingItr.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(millis - lastFlushEvict > 1000l) {
|
||||
lastFlushEvict = millis;
|
||||
if(!evictedCapes.isEmpty()) {
|
||||
Iterator<Long> evictItr = evictedCapes.values().iterator();
|
||||
while(evictItr.hasNext()) {
|
||||
if(millis - evictItr.next().longValue() > 3000l) {
|
||||
evictItr.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(millis - lastFlush > 60000l) {
|
||||
lastFlush = millis;
|
||||
if(!capesCache.isEmpty()) {
|
||||
Iterator<CapeCacheEntry> entryItr = capesCache.values().iterator();
|
||||
while(entryItr.hasNext()) {
|
||||
CapeCacheEntry etr = entryItr.next();
|
||||
if(millis - etr.lastCacheHit > 900000l) { // 15 minutes
|
||||
entryItr.remove();
|
||||
etr.free();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void destroy() {
|
||||
Iterator<CapeCacheEntry> entryItr = capesCache.values().iterator();
|
||||
while(entryItr.hasNext()) {
|
||||
entryItr.next().free();
|
||||
}
|
||||
capesCache.clear();
|
||||
waitingCapes.clear();
|
||||
evictedCapes.clear();
|
||||
}
|
||||
|
||||
public void evictCape(EaglercraftUUID uuid) {
|
||||
evictedCapes.put(uuid, Long.valueOf(System.currentTimeMillis()));
|
||||
CapeCacheEntry etr = capesCache.remove(uuid);
|
||||
if(etr != null) {
|
||||
etr.free();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -321,6 +321,7 @@ public class ServerSkinCache {
|
||||
}
|
||||
skinsCache.clear();
|
||||
waitingSkins.clear();
|
||||
evictedSkins.clear();
|
||||
}
|
||||
|
||||
public void evictSkin(EaglercraftUUID uuid) {
|
||||
|
@ -3,7 +3,7 @@ package net.lax1dude.eaglercraft.v1_8.profile;
|
||||
import net.lax1dude.eaglercraft.v1_8.opengl.ImageData;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2022-2023 lax1dude, ayunami2000. All Rights Reserved.
|
||||
* Copyright (c) 2022-2024 lax1dude, ayunami2000. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
@ -35,6 +35,56 @@ public class SkinConverter {
|
||||
copyRawPixels(skinIn.pixels, skinOut.pixels, 48, 52, 44, 64, 52, 20, 56, 32, 64, 64);
|
||||
}
|
||||
|
||||
public static void convertCape32x32RGBAto23x17RGB(ImageData skinIn, byte[] skinOut) {
|
||||
int i, j;
|
||||
for(int y = 0; y < 17; ++y) {
|
||||
for(int x = 0; x < 22; ++x) {
|
||||
i = (y * 23 + x) * 3;
|
||||
j = skinIn.pixels[y * skinIn.width + x];
|
||||
if((j & 0xFF000000) != 0) {
|
||||
skinOut[i] = (byte)(j >> 16);
|
||||
skinOut[i + 1] = (byte)(j >> 8);
|
||||
skinOut[i + 2] = (byte)(j & 0xFF);
|
||||
}else {
|
||||
skinOut[i] = skinOut[i + 1] = skinOut[i + 2] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
for(int y = 0; y < 11; ++y) {
|
||||
i = ((y + 6) * 23 + 22) * 3;
|
||||
j = skinIn.pixels[(y + 11) * skinIn.width + 22];
|
||||
if((j & 0xFF000000) != 0) {
|
||||
skinOut[i] = (byte)(j >> 16);
|
||||
skinOut[i + 1] = (byte)(j >> 8);
|
||||
skinOut[i + 2] = (byte)(j & 0xFF);
|
||||
}else {
|
||||
skinOut[i] = skinOut[i + 1] = skinOut[i + 2] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void convertCape23x17RGBto32x32RGBA(byte[] skinIn, byte[] skinOut) {
|
||||
int i, j;
|
||||
for(int y = 0; y < 17; ++y) {
|
||||
for(int x = 0; x < 22; ++x) {
|
||||
i = (y * 32 + x) << 2;
|
||||
j = (y * 23 + x) * 3;
|
||||
skinOut[i] = (byte)0xFF;
|
||||
skinOut[i + 1] = skinIn[j];
|
||||
skinOut[i + 2] = skinIn[j + 1];
|
||||
skinOut[i + 3] = skinIn[j + 2];
|
||||
}
|
||||
}
|
||||
for(int y = 0; y < 11; ++y) {
|
||||
i = ((y + 11) * 32 + 22) << 2;
|
||||
j = ((y + 6) * 23 + 22) * 3;
|
||||
skinOut[i] = (byte)0xFF;
|
||||
skinOut[i + 1] = skinIn[j];
|
||||
skinOut[i + 2] = skinIn[j + 1];
|
||||
skinOut[i + 3] = skinIn[j + 2];
|
||||
}
|
||||
}
|
||||
|
||||
private static void copyRawPixels(int[] imageIn, int[] imageOut, int dx1, int dy1, int dx2, int dy2, int sx1,
|
||||
int sy1, int sx2, int sy2, int imgSrcWidth, int imgDstWidth) {
|
||||
if(dx1 > dx2) {
|
||||
|
@ -19,15 +19,19 @@ import java.util.Map;
|
||||
*
|
||||
*/
|
||||
public enum SkinModel {
|
||||
STEVE(0, 64, 64, "default", false), ALEX(1, 64, 64, "slim", false), ZOMBIE(2, 64, 64, "zombie", true);
|
||||
STEVE(0, 64, 64, "default", false), ALEX(1, 64, 64, "slim", false), ZOMBIE(2, 64, 64, "zombie", true),
|
||||
LONG_ARMS(3, HighPolySkin.LONG_ARMS), WEIRD_CLIMBER_DUDE(4, HighPolySkin.WEIRD_CLIMBER_DUDE),
|
||||
LAXATIVE_DUDE(5, HighPolySkin.LAXATIVE_DUDE), BABY_CHARLES(6, HighPolySkin.BABY_CHARLES),
|
||||
BABY_WINSTON(7, HighPolySkin.BABY_WINSTON);
|
||||
|
||||
public final int id;
|
||||
public final int width;
|
||||
public final int height;
|
||||
public final String profileSkinType;
|
||||
public final boolean sanitize;
|
||||
public final HighPolySkin highPoly;
|
||||
|
||||
public static final SkinModel[] skinModels = new SkinModel[3];
|
||||
public static final SkinModel[] skinModels = new SkinModel[8];
|
||||
private static final Map<String, SkinModel> skinModelsByName = new HashMap();
|
||||
|
||||
private SkinModel(int id, int w, int h, String profileSkinType, boolean sanitize) {
|
||||
@ -36,6 +40,16 @@ public enum SkinModel {
|
||||
this.height = h;
|
||||
this.profileSkinType = profileSkinType;
|
||||
this.sanitize = sanitize;
|
||||
this.highPoly = null;
|
||||
}
|
||||
|
||||
private SkinModel(int id, HighPolySkin highPoly) {
|
||||
this.id = id;
|
||||
this.width = 256;
|
||||
this.height = 128;
|
||||
this.profileSkinType = "eagler";
|
||||
this.sanitize = true;
|
||||
this.highPoly = highPoly;
|
||||
}
|
||||
|
||||
public static SkinModel getModelFromId(String str) {
|
||||
|
@ -58,6 +58,9 @@ public class SkinPackets {
|
||||
modelId = SkinModel.STEVE;
|
||||
}
|
||||
}
|
||||
if(modelId.highPoly != null) {
|
||||
modelId = SkinModel.STEVE;
|
||||
}
|
||||
int bytesToRead = modelId.width * modelId.height * 4;
|
||||
byte[] readSkin = new byte[bytesToRead];
|
||||
buffer.readBytes(readSkin);
|
||||
|
@ -1,10 +1,14 @@
|
||||
package net.lax1dude.eaglercraft.v1_8.profile;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.opengl.EaglerMeshLoader;
|
||||
import net.lax1dude.eaglercraft.v1_8.opengl.EaglercraftGPU;
|
||||
import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.model.ModelBiped;
|
||||
import net.minecraft.client.model.ModelPlayer;
|
||||
import net.minecraft.client.model.ModelZombie;
|
||||
import net.minecraft.client.renderer.RenderHelper;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2022-2023 lax1dude, ayunami2000. All Rights Reserved.
|
||||
@ -36,7 +40,11 @@ public class SkinPreviewRenderer {
|
||||
playerModelZombie.isChild = false;
|
||||
}
|
||||
|
||||
public static void renderBiped(int x, int y, int mx, int my, SkinModel skinModel) {
|
||||
public static void renderPreview(int x, int y, int mx, int my, SkinModel skinModel) {
|
||||
renderPreview(x, y, mx, my, false, skinModel, null, null);
|
||||
}
|
||||
|
||||
public static void renderPreview(int x, int y, int mx, int my, boolean capeMode, SkinModel skinModel, ResourceLocation skinTexture, ResourceLocation capeTexture) {
|
||||
ModelBiped model;
|
||||
switch(skinModel) {
|
||||
case STEVE:
|
||||
@ -49,6 +57,17 @@ public class SkinPreviewRenderer {
|
||||
case ZOMBIE:
|
||||
model = playerModelZombie;
|
||||
break;
|
||||
case LONG_ARMS:
|
||||
case WEIRD_CLIMBER_DUDE:
|
||||
case LAXATIVE_DUDE:
|
||||
case BABY_CHARLES:
|
||||
case BABY_WINSTON:
|
||||
if(skinModel.highPoly != null && Minecraft.getMinecraft().gameSettings.enableFNAWSkins) {
|
||||
renderHighPoly(x, y, mx, my, skinModel.highPoly);
|
||||
return;
|
||||
}
|
||||
model = playerModelSteve;
|
||||
break;
|
||||
}
|
||||
|
||||
GlStateManager.enableTexture2D();
|
||||
@ -65,12 +84,95 @@ public class SkinPreviewRenderer {
|
||||
RenderHelper.enableGUIStandardItemLighting();
|
||||
|
||||
GlStateManager.translate(0.0f, 1.0f, 0.0f);
|
||||
GlStateManager.rotate(((y - my) * -0.06f), 1.0f, 0.0f, 0.0f);
|
||||
if(capeMode) {
|
||||
GlStateManager.rotate(140.0f, 0.0f, 1.0f, 0.0f);
|
||||
mx = x - (x - mx) - 20;
|
||||
GlStateManager.rotate(((y - my) * -0.02f), 1.0f, 0.0f, 0.0f);
|
||||
}else {
|
||||
GlStateManager.rotate(((y - my) * -0.06f), 1.0f, 0.0f, 0.0f);
|
||||
}
|
||||
GlStateManager.rotate(((x - mx) * 0.06f), 0.0f, 1.0f, 0.0f);
|
||||
GlStateManager.translate(0.0f, -1.0f, 0.0f);
|
||||
|
||||
if(skinTexture != null) {
|
||||
Minecraft.getMinecraft().getTextureManager().bindTexture(skinTexture);
|
||||
}
|
||||
|
||||
model.render(null, 0.0f, 0.0f, (float)(System.currentTimeMillis() % 2000000) / 50f, ((x - mx) * 0.06f), ((y - my) * -0.1f), 0.0625f);
|
||||
|
||||
if(capeTexture != null && model instanceof ModelPlayer) {
|
||||
Minecraft.getMinecraft().getTextureManager().bindTexture(capeTexture);
|
||||
GlStateManager.pushMatrix();
|
||||
GlStateManager.translate(0.0F, 0.0F, 0.125F);
|
||||
GlStateManager.rotate(6.0F, 1.0F, 0.0F, 0.0F);
|
||||
GlStateManager.rotate(180.0F, 0.0F, 1.0F, 0.0F);
|
||||
((ModelPlayer)model).renderCape(0.0625f);
|
||||
GlStateManager.popMatrix();
|
||||
}
|
||||
|
||||
GlStateManager.popMatrix();
|
||||
GlStateManager.disableLighting();
|
||||
}
|
||||
|
||||
private static void renderHighPoly(int x, int y, int mx, int my, HighPolySkin msh) {
|
||||
GlStateManager.enableTexture2D();
|
||||
GlStateManager.disableBlend();
|
||||
GlStateManager.disableCull();
|
||||
GlStateManager.color(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
|
||||
GlStateManager.pushMatrix();
|
||||
GlStateManager.translate(x, y - 80.0f, 100.0f);
|
||||
GlStateManager.scale(50.0f, 50.0f, 50.0f);
|
||||
GlStateManager.rotate(180.0f, 1.0f, 0.0f, 0.0f);
|
||||
GlStateManager.scale(1.0f, -1.0f, 1.0f);
|
||||
|
||||
RenderHelper.enableGUIStandardItemLighting();
|
||||
|
||||
GlStateManager.translate(0.0f, 1.0f, 0.0f);
|
||||
GlStateManager.rotate(((y - my) * -0.06f), 1.0f, 0.0f, 0.0f);
|
||||
GlStateManager.rotate(((x - mx) * 0.06f), 0.0f, 1.0f, 0.0f);
|
||||
GlStateManager.rotate(180.0f, 0.0f, 0.0f, 1.0f);
|
||||
GlStateManager.translate(0.0f, -0.6f, 0.0f);
|
||||
|
||||
GlStateManager.scale(HighPolySkin.highPolyScale, HighPolySkin.highPolyScale, HighPolySkin.highPolyScale);
|
||||
Minecraft.getMinecraft().getTextureManager().bindTexture(msh.texture);
|
||||
|
||||
if(msh.bodyModel != null) {
|
||||
EaglercraftGPU.drawHighPoly(EaglerMeshLoader.getEaglerMesh(msh.bodyModel));
|
||||
}
|
||||
|
||||
if(msh.headModel != null) {
|
||||
EaglercraftGPU.drawHighPoly(EaglerMeshLoader.getEaglerMesh(msh.headModel));
|
||||
}
|
||||
|
||||
if(msh.limbsModel != null && msh.limbsModel.length > 0) {
|
||||
for(int i = 0; i < msh.limbsModel.length; ++i) {
|
||||
float offset = 0.0f;
|
||||
if(msh.limbsOffset != null) {
|
||||
if(msh.limbsOffset.length == 1) {
|
||||
offset = msh.limbsOffset[0];
|
||||
}else {
|
||||
offset = msh.limbsOffset[i];
|
||||
}
|
||||
}
|
||||
if(offset != 0.0f || msh.limbsInitialRotation != 0.0f) {
|
||||
GlStateManager.pushMatrix();
|
||||
if(offset != 0.0f) {
|
||||
GlStateManager.translate(0.0f, offset, 0.0f);
|
||||
}
|
||||
if(msh.limbsInitialRotation != 0.0f) {
|
||||
GlStateManager.rotate(msh.limbsInitialRotation, 1.0f, 0.0f, 0.0f);
|
||||
}
|
||||
}
|
||||
|
||||
EaglercraftGPU.drawHighPoly(EaglerMeshLoader.getEaglerMesh(msh.limbsModel[i]));
|
||||
|
||||
if(offset != 0.0f || msh.limbsInitialRotation != 0.0f) {
|
||||
GlStateManager.popMatrix();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GlStateManager.popMatrix();
|
||||
GlStateManager.disableLighting();
|
||||
}
|
||||
|
Reference in New Issue
Block a user