From 7d7fceab926f76a7a3034c4330391e01dddfae92 Mon Sep 17 00:00:00 2001 From: bconlon Date: Thu, 16 Jul 2020 22:52:49 -0700 Subject: [PATCH] Backported some cape stuff. --- .../aether/client/AetherClientEvents.java | 27 +++++- .../client/gui/button/GuiCapeButton.java | 30 ++++++ .../renders/entity/PlayerAetherRenderer.java | 89 +++++++++--------- .../legacy/aether/network/AetherNetwork.java | 3 + .../network/packets/PacketCapeChanged.java | 59 ++++++++++++ .../legacy/aether/player/PlayerAether.java | 11 ++- .../assets/aether_legacy/lang/en_US.lang | 3 +- .../textures/armor/accessory_swuff.png | Bin 5413 -> 0 bytes 8 files changed, 172 insertions(+), 50 deletions(-) create mode 100644 src/main/java/com/legacy/aether/client/gui/button/GuiCapeButton.java create mode 100644 src/main/java/com/legacy/aether/network/packets/PacketCapeChanged.java delete mode 100644 src/main/resources/assets/aether_legacy/textures/armor/accessory_swuff.png diff --git a/src/main/java/com/legacy/aether/client/AetherClientEvents.java b/src/main/java/com/legacy/aether/client/AetherClientEvents.java index 8dadd61..374263a 100644 --- a/src/main/java/com/legacy/aether/client/AetherClientEvents.java +++ b/src/main/java/com/legacy/aether/client/AetherClientEvents.java @@ -4,12 +4,13 @@ import java.util.List; import com.legacy.aether.client.gui.GuiCustomizationScreen; import com.legacy.aether.client.gui.GuiEnterAether; -import com.legacy.aether.client.gui.button.GuiCustomizationScreenButton; -import com.legacy.aether.client.gui.button.GuiGlowButton; -import com.legacy.aether.client.gui.button.GuiHaloButton; +import com.legacy.aether.client.gui.button.*; import com.legacy.aether.client.gui.menu.AetherMainMenu; import com.legacy.aether.client.gui.menu.GuiMenuToggleButton; +import com.legacy.aether.network.packets.PacketCapeChanged; +import com.legacy.aether.network.packets.PacketPerkChanged; import com.legacy.aether.player.perks.AetherRankings; +import com.legacy.aether.player.perks.util.EnumAetherPerkType; import cpw.mods.fml.client.FMLClientHandler; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.*; @@ -31,7 +32,6 @@ import net.minecraftforge.client.event.RenderPlayerEvent.SetArmorModel; import com.legacy.aether.AetherConfig; import com.legacy.aether.client.gui.AetherLoadingScreen; -import com.legacy.aether.client.gui.button.GuiAccessoryButton; import com.legacy.aether.client.renders.entity.PlayerAetherRenderer; import com.legacy.aether.entities.EntitiesAether; import com.legacy.aether.items.ItemAetherSpawnEgg; @@ -240,6 +240,15 @@ public class AetherClientEvents { } } } + + if (event.gui.getClass() == ScreenChatOptions.class) + { + if (Minecraft.getMinecraft().thePlayer != null) + { + int i = 13; + event.buttonList.add(new GuiCapeButton(event.gui.width / 2 - 155 + i % 2 * 160, event.gui.height / 6 + 24 * (i >> 1))); + } + } } @SubscribeEvent @@ -285,6 +294,16 @@ public class AetherClientEvents { { Minecraft.getMinecraft().displayGuiScreen(new GuiCustomizationScreen(event.gui)); } + + if (event.button.getClass() == GuiCapeButton.class) + { + PlayerAether player = PlayerAether.get(Minecraft.getMinecraft().thePlayer); + + boolean enableCape = !player.shouldRenderCape; + + player.shouldRenderCape = enableCape; + AetherNetwork.sendToServer(new PacketCapeChanged(player.getEntity().getEntityId(), player.shouldRenderCape)); + } } @SubscribeEvent diff --git a/src/main/java/com/legacy/aether/client/gui/button/GuiCapeButton.java b/src/main/java/com/legacy/aether/client/gui/button/GuiCapeButton.java new file mode 100644 index 0000000..69fc357 --- /dev/null +++ b/src/main/java/com/legacy/aether/client/gui/button/GuiCapeButton.java @@ -0,0 +1,30 @@ +package com.legacy.aether.client.gui.button; + +import com.legacy.aether.player.PlayerAether; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.resources.I18n; + +public class GuiCapeButton extends GuiButton +{ + public GuiCapeButton(int xPos, int yPos) + { + super(203, xPos, yPos, 150, 20, I18n.format("gui.button.aether_cape")); + } + + public void drawButton(Minecraft mc, int mouseX, int mouseY) + { + PlayerAether player = PlayerAether.get(mc.thePlayer); + + if (player.shouldRenderCape) + { + this.displayString = I18n.format("gui.button.aether_cape") + " " + I18n.format("options.on"); + } + else + { + this.displayString = I18n.format("gui.button.aether_cape") + " " + I18n.format("options.off"); + } + + super.drawButton(mc, mouseX, mouseY); + } +} \ No newline at end of file diff --git a/src/main/java/com/legacy/aether/client/renders/entity/PlayerAetherRenderer.java b/src/main/java/com/legacy/aether/client/renders/entity/PlayerAetherRenderer.java index 6d85cea..cf9da5b 100644 --- a/src/main/java/com/legacy/aether/client/renders/entity/PlayerAetherRenderer.java +++ b/src/main/java/com/legacy/aether/client/renders/entity/PlayerAetherRenderer.java @@ -228,66 +228,67 @@ public class PlayerAetherRenderer { GL11.glColor3f(1.0F, 1.0F, 1.0F); } - GL11.glScalef(0.9375F, 0.9375F, 0.9375F); - if (playerAether.getAccessoryInventory().getStackInSlot(AccessoryType.CAPE) != null && !playerAether.getAccessoryInventory().wearingAccessory(new ItemStack(ItemsAether.invisibility_cape))) { ItemAccessory cape = (ItemAccessory) playerAether.getAccessoryInventory().getStackInSlot(AccessoryType.CAPE).getItem(); - if (!player.isInvisible() && !player.getHideCape()) { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GL11.glPushMatrix(); - GL11.glTranslatef(0.0F, 0.0F, 0.125F); - double d0 = player.field_71091_bM + (player.field_71094_bP - player.field_71091_bM) * (double) partialTicks - (player.prevPosX + (player.posX - player.prevPosX) * (double) partialTicks); - double d1 = player.field_71096_bN + (player.field_71095_bQ - player.field_71096_bN) * (double) partialTicks - (player.prevPosY + (player.posY - player.prevPosY) * (double) partialTicks); - double d2 = player.field_71097_bO + (player.field_71085_bR - player.field_71097_bO) * (double) partialTicks - (player.prevPosZ + (player.posZ - player.prevPosZ) * (double) partialTicks); - float f = player.prevRenderYawOffset + (player.renderYawOffset - player.prevRenderYawOffset) * partialTicks; - double d3 = (double) MathHelper.sin(f * (float) Math.PI / 180.0F); - double d4 = (double) (-MathHelper.cos(f * (float) Math.PI / 180.0F)); - float f1 = (float) d1 * 10.0F; - f1 = MathHelper.clamp_float(f1, -6.0F, 32.0F); - float f2 = (float) (d0 * d3 + d2 * d4) * 100.0F; - float f3 = (float) (d0 * d4 - d2 * d3) * 100.0F; + if (!player.isInvisible()) { + if (playerAether.shouldRenderCape) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glPushMatrix(); + GL11.glTranslatef(0.0F, 0.0F, 0.125F); + double d0 = player.field_71091_bM + (player.field_71094_bP - player.field_71091_bM) * (double) partialTicks - (player.prevPosX + (player.posX - player.prevPosX) * (double) partialTicks); + double d1 = player.field_71096_bN + (player.field_71095_bQ - player.field_71096_bN) * (double) partialTicks - (player.prevPosY + (player.posY - player.prevPosY) * (double) partialTicks); + double d2 = player.field_71097_bO + (player.field_71085_bR - player.field_71097_bO) * (double) partialTicks - (player.prevPosZ + (player.posZ - player.prevPosZ) * (double) partialTicks); + float f = player.prevRenderYawOffset + (player.renderYawOffset - player.prevRenderYawOffset) * partialTicks; + double d3 = (double) MathHelper.sin(f * (float) Math.PI / 180.0F); + double d4 = (double) (-MathHelper.cos(f * (float) Math.PI / 180.0F)); + float f1 = (float) d1 * 10.0F; + f1 = MathHelper.clamp_float(f1, -6.0F, 32.0F); + float f2 = (float) (d0 * d3 + d2 * d4) * 100.0F; + float f3 = (float) (d0 * d4 - d2 * d3) * 100.0F; - if (f2 < 0.0F) { - f2 = 0.0F; - } + if (f2 < 0.0F) { + f2 = 0.0F; + } - float f4 = player.prevCameraYaw + (player.cameraYaw - player.prevCameraYaw) * partialTicks; - f1 = f1 + MathHelper.sin((player.prevDistanceWalkedModified + (player.distanceWalkedModified - player.prevDistanceWalkedModified) * partialTicks) * 6.0F) * 32.0F * f4; + float f4 = player.prevCameraYaw + (player.cameraYaw - player.prevCameraYaw) * partialTicks; + f1 = f1 + MathHelper.sin((player.prevDistanceWalkedModified + (player.distanceWalkedModified - player.prevDistanceWalkedModified) * partialTicks) * 6.0F) * 32.0F * f4; - if (player.isSneaking()) { - f1 += 25.0F; - } + if (player.isSneaking()) { + f1 += 25.0F; + } - GL11.glRotatef(6.0F + f2 / 2.0F + f1, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(f3 / 2.0F, 0.0F, 0.0F, 1.0F); - GL11.glRotatef(-f3 / 2.0F, 0.0F, 1.0F, 0.0F); - GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(6.0F + f2 / 2.0F + f1, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(f3 / 2.0F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(-f3 / 2.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); - int colour = cape.getColorFromItemStack(playerAether.getAccessoryInventory().getStackInSlot(AccessoryType.CAPE), 0); + int colour = cape.getColorFromItemStack(playerAether.getAccessoryInventory().getStackInSlot(AccessoryType.CAPE), 0); - float red = ((colour >> 16) & 0xff) / 255F; - float green = ((colour >> 8) & 0xff) / 255F; - float blue = (colour & 0xff) / 255F; + float red = ((colour >> 16) & 0xff) / 255F; + float green = ((colour >> 8) & 0xff) / 255F; + float blue = (colour & 0xff) / 255F; - if (player.hurtTime > 0) { - GL11.glColor3f(1.0F, 0.5F, 0.5F); - } else { - GL11.glColor3f(red, green, blue); - } + if (player.hurtTime > 0) { + GL11.glColor3f(1.0F, 0.5F, 0.5F); + } else { + GL11.glColor3f(red, green, blue); + } - if (player.getUniqueID().toString().equals("47ec3a3b-3f41-49b6-b5a0-c39abb7b51ef")) { - this.mc.getTextureManager().bindTexture(Aether.locate("textures/armor/accessory_swuff.png")); - } else { this.mc.getTextureManager().bindTexture(cape.texture); - } - this.modelMisc.renderCloak(scale); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GL11.glPopMatrix(); + GL11.glTranslatef(0.0F, 0.015625F, -0.0625F); + GL11.glScalef(0.8F, 0.9375F, 0.234375F); + + this.modelMisc.renderCloak(scale); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glPopMatrix(); + } } } + GL11.glScalef(0.9375F, 0.9375F, 0.9375F); + if (playerAether.getAccessoryInventory().getStackInSlot(AccessoryType.GLOVES) != null) { ItemAccessory gloves = (ItemAccessory) playerAether.getAccessoryInventory().getStackInSlot(AccessoryType.GLOVES).getItem(); diff --git a/src/main/java/com/legacy/aether/network/AetherNetwork.java b/src/main/java/com/legacy/aether/network/AetherNetwork.java index bca67c8..c1200bb 100644 --- a/src/main/java/com/legacy/aether/network/AetherNetwork.java +++ b/src/main/java/com/legacy/aether/network/AetherNetwork.java @@ -43,6 +43,9 @@ public class AetherNetwork { INSTANCE.registerMessage(PacketSendEternalDay.class, PacketSendEternalDay.class, discriminant++, Side.CLIENT); INSTANCE.registerMessage(PacketSendShouldCycle.class, PacketSendShouldCycle.class, discriminant++, Side.CLIENT); INSTANCE.registerMessage(PacketSendTime.class, PacketSendTime.class, discriminant++, Side.CLIENT); + + INSTANCE.registerMessage(PacketCapeChanged.class, PacketCapeChanged.class, discriminant++, Side.SERVER); + INSTANCE.registerMessage(PacketCapeChanged.class, PacketCapeChanged.class, discriminant++, Side.CLIENT); } public static void sendToAll(IMessage message) { diff --git a/src/main/java/com/legacy/aether/network/packets/PacketCapeChanged.java b/src/main/java/com/legacy/aether/network/packets/PacketCapeChanged.java new file mode 100644 index 0000000..d5fca60 --- /dev/null +++ b/src/main/java/com/legacy/aether/network/packets/PacketCapeChanged.java @@ -0,0 +1,59 @@ +package com.legacy.aether.network.packets; + +import com.legacy.aether.player.PlayerAether; +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayer; + +public class PacketCapeChanged extends AetherPacket +{ + public int entityID; + + public boolean renderCape; + + public PacketCapeChanged() { + + } + + public PacketCapeChanged(int entityID, boolean info) { + this.entityID = entityID; + this.renderCape = info; + } + + @Override + public void fromBytes(ByteBuf buf) { + this.entityID = buf.readInt(); + this.renderCape = buf.readBoolean(); + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeInt(this.entityID); + buf.writeBoolean(this.renderCape); + } + + @Override + public void handleClient(PacketCapeChanged message, EntityPlayer player) { + if (player != null && player.worldObj != null) { + EntityPlayer parent = (EntityPlayer) player.worldObj.getEntityByID(message.entityID); + + if (parent != null) { + PlayerAether instance = PlayerAether.get(parent); + + instance.shouldRenderCape = message.renderCape; + } + } + } + + @Override + public void handleServer(PacketCapeChanged message, EntityPlayer player) { + if (player != null && player.worldObj != null && !player.worldObj.isRemote) { + EntityPlayer parent = (EntityPlayer) player.worldObj.getEntityByID(message.entityID); + + if (parent != null) { + PlayerAether instance = PlayerAether.get(parent); + + instance.shouldRenderCape = message.renderCape; + } + } + } +} diff --git a/src/main/java/com/legacy/aether/player/PlayerAether.java b/src/main/java/com/legacy/aether/player/PlayerAether.java index b339bb9..8a5afc4 100644 --- a/src/main/java/com/legacy/aether/player/PlayerAether.java +++ b/src/main/java/com/legacy/aether/player/PlayerAether.java @@ -8,6 +8,7 @@ import com.legacy.aether.Aether; import com.legacy.aether.entities.passive.mountable.EntityParachute; import com.legacy.aether.items.ItemsAether; import com.legacy.aether.network.AetherNetwork; +import com.legacy.aether.network.packets.PacketCapeChanged; import com.legacy.aether.network.packets.PacketPerkChanged; import com.legacy.aether.player.perks.AetherRankings; import com.legacy.aether.player.perks.util.EnumAetherPerkType; @@ -66,7 +67,7 @@ public class PlayerAether implements IPlayerAether { public DonatorMoaSkin donatorMoaSkin = new DonatorMoaSkin(); - public boolean shouldRenderHalo, shouldRenderGlow; + public boolean shouldRenderHalo, shouldRenderGlow, shouldRenderCape; private boolean isJumping; @@ -95,6 +96,7 @@ public class PlayerAether implements IPlayerAether { public PlayerAether() { this.shouldRenderHalo = true; this.shouldRenderGlow = false; + this.shouldRenderCape = true; this.abilities.addAll(Arrays.asList(new AbilityAccessories(this), new AbilityArmor(this), new AbilityFlight(this), new AbilityRepulsion(this))); } @@ -114,6 +116,7 @@ public class PlayerAether implements IPlayerAether { { AetherNetwork.sendToAll(new PacketPerkChanged(this.getEntity().getEntityId(), EnumAetherPerkType.Halo, this.shouldRenderHalo)); AetherNetwork.sendToAll(new PacketPerkChanged(this.getEntity().getEntityId(), EnumAetherPerkType.Glow, this.shouldRenderGlow)); + AetherNetwork.sendToAll(new PacketCapeChanged(this.getEntity().getEntityId(), this.shouldRenderCape)); } for (int i = 0; i < this.getAbilities().size(); ++i) { @@ -386,6 +389,7 @@ public class PlayerAether implements IPlayerAether { aetherTag.setBoolean("glow", this.shouldRenderGlow); } + aetherTag.setBoolean("cape", this.shouldRenderCape); aetherTag.setInteger("shardCount", this.shardCount); aetherTag.setTag("accessories", this.getAccessoryInventory().writeToNBT(aetherTag)); @@ -413,6 +417,11 @@ public class PlayerAether implements IPlayerAether { this.shouldRenderGlow = aetherTag.getBoolean("glow"); } + if (aetherTag.hasKey("cape")) + { + this.shouldRenderCape = aetherTag.getBoolean("cape"); + } + this.updateShardCount(aetherTag.getInteger("shardCount")); this.getAccessoryInventory().readFromNBT(aetherTag.getTagList("accessories", 10)); this.setBedLocation(new ChunkCoordinates(aetherTag.getInteger("bedX"), aetherTag.getInteger("bedY"), aetherTag.getInteger("bedZ"))); diff --git a/src/main/resources/assets/aether_legacy/lang/en_US.lang b/src/main/resources/assets/aether_legacy/lang/en_US.lang index f9e3cb5..1d12b52 100644 --- a/src/main/resources/assets/aether_legacy/lang/en_US.lang +++ b/src/main/resources/assets/aether_legacy/lang/en_US.lang @@ -420,4 +420,5 @@ gui.skyroot_bed.respawn_point=Respawn point set gui.options.perk_customization=Perk Customization... gui.options.perk_customization.title=Perk Customization gui.button.halo=Halo: -gui.button.glow=Developer Glow: \ No newline at end of file +gui.button.glow=Developer Glow: +gui.button.aether_cape=Aether Cape: \ No newline at end of file diff --git a/src/main/resources/assets/aether_legacy/textures/armor/accessory_swuff.png b/src/main/resources/assets/aether_legacy/textures/armor/accessory_swuff.png deleted file mode 100644 index 263064313acfb2cd4a2e8f780e1425c6192b5108..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5413 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