From ea39dd0f98274112ebd07b3c1ca21926484b2f59 Mon Sep 17 00:00:00 2001 From: Sollace Date: Mon, 11 Feb 2019 17:41:24 +0200 Subject: [PATCH] Fixed various disguise bugs - Fixed changeligns playing hurt sounds when flying whilst disguised as a player - Fixed invisible disguised changelings - Fixed disguised changelings not showing all the hat layer parts - Changeling disguises will work better with falling blocks and shulkers --- .../com/minelittlepony/unicopia/UClient.java | 4 +- .../unicopia/UnicopiaClient.java | 78 ++++++++--------- .../entity/EntityFakeClientPlayer.java | 24 +++--- .../entity/EntityFakeServerPlayer.java | 57 +++++++++++++ .../unicopia/mixin/MixinEntity.java | 23 ++++- .../unicopia/player/IPlayer.java | 9 ++ .../unicopia/render/DisguiseRenderer.java | 84 +++++++++++++++++++ .../unicopia/spell/SpellDisguise.java | 70 +++++++++++++++- 8 files changed, 289 insertions(+), 60 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/entity/EntityFakeServerPlayer.java create mode 100644 src/main/java/com/minelittlepony/unicopia/render/DisguiseRenderer.java diff --git a/src/main/java/com/minelittlepony/unicopia/UClient.java b/src/main/java/com/minelittlepony/unicopia/UClient.java index 5dda06f3..66e4f93d 100644 --- a/src/main/java/com/minelittlepony/unicopia/UClient.java +++ b/src/main/java/com/minelittlepony/unicopia/UClient.java @@ -5,6 +5,7 @@ import java.util.UUID; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import com.minelittlepony.unicopia.entity.EntityFakeServerPlayer; import com.minelittlepony.unicopia.forgebullshit.FUF; import com.mojang.authlib.GameProfile; @@ -12,7 +13,6 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.IInteractionObject; import net.minecraft.world.WorldServer; -import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; @@ -72,7 +72,7 @@ public class UClient { */ @Nonnull public EntityPlayer createPlayer(Entity observer, GameProfile profile) { - return new FakePlayer((WorldServer)observer.world, profile); + return new EntityFakeServerPlayer((WorldServer)observer.world, profile); } public void preInit(FMLPreInitializationEvent event) {} diff --git a/src/main/java/com/minelittlepony/unicopia/UnicopiaClient.java b/src/main/java/com/minelittlepony/unicopia/UnicopiaClient.java index 665fa066..8f8b405f 100644 --- a/src/main/java/com/minelittlepony/unicopia/UnicopiaClient.java +++ b/src/main/java/com/minelittlepony/unicopia/UnicopiaClient.java @@ -15,8 +15,7 @@ import com.minelittlepony.unicopia.network.MsgRequestCapabilities; import com.minelittlepony.unicopia.player.IPlayer; import com.minelittlepony.unicopia.player.IView; import com.minelittlepony.unicopia.player.PlayerSpeciesList; -import com.minelittlepony.unicopia.spell.IMagicEffect; -import com.minelittlepony.unicopia.spell.SpellDisguise; +import com.minelittlepony.unicopia.render.DisguiseRenderer; import com.minelittlepony.util.gui.ButtonGridLayout; import com.minelittlepony.util.gui.UButton; import com.mojang.authlib.GameProfile; @@ -28,7 +27,6 @@ import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiOptions; import net.minecraft.client.gui.GuiShareToLan; import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.resources.I18n; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -124,7 +122,7 @@ public class UnicopiaClient extends UClient { return false; } - return getPlayer().getGameProfile().getId().equals(player.getGameProfile().getId()); + return IPlayer.equal(getPlayer(), player); } @Override @@ -173,56 +171,52 @@ public class UnicopiaClient extends UClient { @SideOnly(Side.CLIENT) @SubscribeEvent public static void preEntityRender(RenderLivingEvent.Pre event) { - if (event.getEntity() instanceof EntityPlayer) { - IPlayer iplayer = PlayerSpeciesList.instance().getPlayer((EntityPlayer)event.getEntity()); - /*if (!MineLP.modIsActive()) { - float roll = iplayer.getCamera().calculateRoll(); - float pitch = iplayer.getCamera().calculatePitch(0); - GlStateManager.rotate(roll, 0, 0, 1); - GlStateManager.rotate(pitch, 1, 0, 0); - }*/ + Entity entity = event.getEntity(); + + if (DisguiseRenderer.instance().renderDisguise(entity, event.getPartialRenderTick())) { + event.setCanceled(true); + } + + if (entity instanceof EntityPlayer) { + IPlayer iplayer = PlayerSpeciesList.instance().getPlayer((EntityPlayer)entity); if (iplayer.isInvisible()) { event.setCanceled(true); + } else { + GlStateManager.pushMatrix(); - // This fixes lighting errors on the armour slots. - // #MahjongPls - // @FUF(reason = "Forge should fix this. Cancelling their event skips neccessary state resetting at the end of the render method") - GlStateManager.enableAlpha(); + if (!MineLP.modIsActive() && !entity.onGround) { + float roll = iplayer.getCamera().calculateRoll(); + float pitch = iplayer.getCamera().calculatePitch(0); + GlStateManager.rotate(roll, 0, 0, 1); + GlStateManager.rotate(pitch, 1, 0, 0); + } } if (iplayer.hasEffect()) { - RenderManager renderMan = Minecraft.getMinecraft().getRenderManager(); - - IMagicEffect effect = iplayer.getEffect(false); - - if (!effect.getDead() && effect instanceof SpellDisguise) { - Entity e = ((SpellDisguise)effect).getDisguise(); - - if (renderMan.isRenderShadow() && !(e instanceof EntityPlayer)) { - return; - } - - // Check for a disguise and render it in our place. - if (e != null) { - e.setInvisible(false); - - float partialTicks = Minecraft.getMinecraft().getRenderPartialTicks(); - - if (renderMan.isRenderShadow()) { - renderMan.renderEntityStatic(e, partialTicks, false); - } else { - e.setAlwaysRenderNameTag(false); - effect.update(iplayer); - renderMan.renderEntity(e, 0, 0, 0, 0, 1, false); - } - } - } + DisguiseRenderer.instance().renderDisguiseToGui(iplayer); } } } + @SideOnly(Side.CLIENT) + @SubscribeEvent + public static void postEntityRender(RenderLivingEvent.Post event) { + Entity entity = event.getEntity(); + + if (entity instanceof EntityPlayer) { + GlStateManager.popMatrix(); + + + } + + // This fixes lighting errors on the armour slots. + // #MahjongPls + // @FUF(reason = "Forge should fix this. Cancelling their event skips neccessary state resetting at the end of the render method") + GlStateManager.enableAlpha(); + } + @SideOnly(Side.CLIENT) @Override public void preInit(FMLPreInitializationEvent event) { diff --git a/src/main/java/com/minelittlepony/unicopia/entity/EntityFakeClientPlayer.java b/src/main/java/com/minelittlepony/unicopia/entity/EntityFakeClientPlayer.java index 54752e27..b8a4bcbf 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/EntityFakeClientPlayer.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/EntityFakeClientPlayer.java @@ -1,26 +1,25 @@ package com.minelittlepony.unicopia.entity; -import java.util.UUID; - import javax.annotation.Nullable; +import com.minelittlepony.unicopia.UClient; import com.minelittlepony.unicopia.player.IOwned; import com.mojang.authlib.GameProfile; -import net.minecraft.client.Minecraft; import net.minecraft.client.entity.AbstractClientPlayer; import net.minecraft.client.network.NetworkPlayerInfo; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.text.ITextComponent; import net.minecraft.world.World; -public class EntityFakeClientPlayer extends AbstractClientPlayer implements IOwned { +public class EntityFakeClientPlayer extends AbstractClientPlayer implements IOwned { private final GameProfile profile; private NetworkPlayerInfo playerInfo; - private UUID owner; + private EntityPlayer owner; public EntityFakeClientPlayer(World world, GameProfile profile) { super(world, profile); @@ -28,6 +27,7 @@ public class EntityFakeClientPlayer extends AbstractClientPlayer implements IOwn this.profile = profile; } + @Override @Nullable protected NetworkPlayerInfo getPlayerInfo() { if (playerInfo == null) { @@ -53,18 +53,22 @@ public class EntityFakeClientPlayer extends AbstractClientPlayer implements IOwn } @Override - public boolean getAlwaysRenderNameTagForRender() { - return !(Minecraft.getMinecraft().player != null - && Minecraft.getMinecraft().player.getGameProfile().getId().equals(getOwner())); + public boolean getAlwaysRenderNameTag() { + return !UClient.instance().isClientPlayer(getOwner()); } @Override - public UUID getOwner() { + public boolean getAlwaysRenderNameTagForRender() { + return getAlwaysRenderNameTag(); + } + + @Override + public EntityPlayer getOwner() { return owner; } @Override - public void setOwner(UUID owner) { + public void setOwner(EntityPlayer owner) { this.owner = owner; } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/EntityFakeServerPlayer.java b/src/main/java/com/minelittlepony/unicopia/entity/EntityFakeServerPlayer.java new file mode 100644 index 00000000..4c36c507 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/entity/EntityFakeServerPlayer.java @@ -0,0 +1,57 @@ +package com.minelittlepony.unicopia.entity; + +import com.minelittlepony.unicopia.UClient; +import com.minelittlepony.unicopia.player.IOwned; +import com.mojang.authlib.GameProfile; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.world.WorldServer; +import net.minecraftforge.common.util.FakePlayer; + +public class EntityFakeServerPlayer extends FakePlayer implements IOwned { + + private EntityPlayer owner; + + public EntityFakeServerPlayer(WorldServer world, GameProfile profile) { + super(world, profile); + } + + @Override + public boolean isPlayer() { + return false; + } + + @Override + protected void playEquipSound(ItemStack stack) { + /*noop*/ + } + + @Override + public EntityPlayer getOwner() { + return owner; + } + + @Override + public void setOwner(EntityPlayer owner) { + this.owner = owner; + } + + @Override + public boolean getAlwaysRenderNameTag() { + return !UClient.instance().isClientPlayer(getOwner()); + } + + @Override + public boolean getAlwaysRenderNameTagForRender() { + return getAlwaysRenderNameTag(); + } + + @Override + public ITextComponent getDisplayName() { + ITextComponent name = super.getDisplayName(); + name.getStyle().setItalic(true); + return name; + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinEntity.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinEntity.java index f15c9548..9fd4b16b 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinEntity.java @@ -1,17 +1,34 @@ package com.minelittlepony.unicopia.mixin; +import com.google.common.base.Optional; import com.minelittlepony.unicopia.forgebullshit.FUF; import net.minecraft.entity.Entity; import net.minecraft.entity.MoverType; +import net.minecraft.entity.monster.EntityShulker; +import net.minecraft.network.datasync.DataParameter; import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; @FUF(reason = "Waiting for mixins?") -// pseudo code for things forge can't do. -// @Mixin(Entity.class) public interface MixinEntity { - // @Accessor("setSize") + abstract class Player extends net.minecraft.entity.player.EntityPlayer { + private Player() { super(null, null);} + + public static DataParameter getModelFlag() { + return PLAYER_MODEL_FLAG; + } + + } + abstract class Shulker extends EntityShulker { + private Shulker() { super(null);} + + public static DataParameter> getAttachmentPosFlag() { + return ATTACHED_BLOCK_POS; + } + } + static void setSize(Entity self, float width, float height) { if (self.width != width || self.height != height) { float f = self.width; diff --git a/src/main/java/com/minelittlepony/unicopia/player/IPlayer.java b/src/main/java/com/minelittlepony/unicopia/player/IPlayer.java index 0c628590..bb4eda48 100644 --- a/src/main/java/com/minelittlepony/unicopia/player/IPlayer.java +++ b/src/main/java/com/minelittlepony/unicopia/player/IPlayer.java @@ -9,6 +9,7 @@ import com.minelittlepony.unicopia.UClient; import com.minelittlepony.unicopia.enchanting.IPageOwner; import com.minelittlepony.unicopia.network.ITransmittable; import com.minelittlepony.unicopia.spell.ICaster; +import com.mojang.authlib.GameProfile; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -78,4 +79,12 @@ public interface IPlayer extends ICaster, IRaceContainercast(entity).getOwner()); + IPlayer iplayer = PlayerSpeciesList.instance().getPlayer(IOwned.cast(entity).getOwner()); return iplayer != null && iplayer.getPlayerSpecies().canFly(); }