diff --git a/src/main/java/com/minelittlepony/unicopia/UnicopiaClient.java b/src/main/java/com/minelittlepony/unicopia/UnicopiaClient.java index 571690ea..ce2363ae 100644 --- a/src/main/java/com/minelittlepony/unicopia/UnicopiaClient.java +++ b/src/main/java/com/minelittlepony/unicopia/UnicopiaClient.java @@ -13,6 +13,8 @@ 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.util.gui.ButtonGridLayout; import com.minelittlepony.util.gui.UButton; @@ -21,7 +23,10 @@ import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiOptions; +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; import net.minecraft.init.SoundEvents; import net.minecraft.world.IInteractionObject; @@ -160,8 +165,37 @@ public class UnicopiaClient extends UClient { @SubscribeEvent public static void preEntityRender(RenderLivingEvent.Pre event) { if (event.getEntity() instanceof EntityPlayer) { - if (PlayerSpeciesList.instance().getPlayer((EntityPlayer)event.getEntity()).isInvisible()) { + IPlayer iplayer = PlayerSpeciesList.instance().getPlayer((EntityPlayer)event.getEntity()); + + if (iplayer.isInvisible()) { event.setCanceled(true); + + // 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 (iplayer.hasEffect()) { + RenderManager renderMan = Minecraft.getMinecraft().getRenderManager(); + + if (renderMan.isRenderShadow()) { + return; + } + + // I assume we're in the inventory now. + IMagicEffect effect = iplayer.getEffect(); + if (!effect.getDead() && effect instanceof SpellDisguise) { + effect.update(iplayer); + + Entity e = ((SpellDisguise)effect).getDisguise(); + + // Check for a disguise and render it in our place. + if (e != null) { + e.setInvisible(false); + renderMan.renderEntity(e, 0, 0, 0, 0, 1, false); + } + } } } } @@ -213,7 +247,7 @@ public class UnicopiaClient extends UClient { if (event.phase == Phase.END) { EntityPlayer player = UClient.instance().getPlayer(); - if (player != null) { + if (player != null && !player.isDead) { Race newRace = getclientPlayerRace(); if (newRace != clientPlayerRace) { diff --git a/src/main/java/com/minelittlepony/unicopia/entity/EntityRainbow.java b/src/main/java/com/minelittlepony/unicopia/entity/EntityRainbow.java index 28385c11..b0236af0 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/EntityRainbow.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/EntityRainbow.java @@ -52,11 +52,6 @@ public class EntityRainbow extends EntityWeatherEffect { )); } - @Override - public AxisAlignedBB getRenderBoundingBox() { - return super.getRenderBoundingBox(); - } - @Override public SoundCategory getSoundCategory() { return SoundCategory.WEATHER; diff --git a/src/main/java/com/minelittlepony/unicopia/entity/EntitySpell.java b/src/main/java/com/minelittlepony/unicopia/entity/EntitySpell.java index 3053a808..8fcb51d4 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/EntitySpell.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/EntitySpell.java @@ -95,6 +95,11 @@ public class EntitySpell extends EntityLiving implements IMagicals, ICaster The owning entity + */ public class EffectSync { @Nullable @@ -25,7 +32,27 @@ public class EffectSync { } public boolean has() { - return get() != null; + NBTTagCompound comp = owned.getEntity().getDataManager().get(param); + + if (comp == null || !comp.hasKey("effect_id")) { + if (effect != null) { + effect.setDead(); + effect = null; + } + } else { + String id = comp.getString("effect_id"); + + if (effect == null || !effect.getName().contentEquals(id)) { + if (effect != null) { + effect.setDead(); + } + effect = SpellRegistry.instance().createEffectFromNBT(comp); + } else if (!owned.getEntity().world.isRemote && effect.isDirty()) { + set(effect); + } + } + + return effect != null; } public IMagicEffect get() { diff --git a/src/main/java/com/minelittlepony/unicopia/player/PlayerCapabilities.java b/src/main/java/com/minelittlepony/unicopia/player/PlayerCapabilities.java index 74624e97..c94fe9df 100644 --- a/src/main/java/com/minelittlepony/unicopia/player/PlayerCapabilities.java +++ b/src/main/java/com/minelittlepony/unicopia/player/PlayerCapabilities.java @@ -333,6 +333,11 @@ class PlayerCapabilities implements IPlayer { sendCapabilities(true); } + @Override + public boolean hasEffect() { + return effectDelegate.has(); + } + @Nullable @Override public IMagicEffect getEffect() { diff --git a/src/main/java/com/minelittlepony/unicopia/render/RenderRainbow.java b/src/main/java/com/minelittlepony/unicopia/render/RenderRainbow.java index 5aea9b58..496f506e 100644 --- a/src/main/java/com/minelittlepony/unicopia/render/RenderRainbow.java +++ b/src/main/java/com/minelittlepony/unicopia/render/RenderRainbow.java @@ -23,8 +23,6 @@ public class RenderRainbow extends Render { private static final ResourceLocation TEXTURE = new ResourceLocation("unicopia", "textures/environment/rainbow.png"); public void doRender(EntityRainbow entity, double x, double y, double z, float entityYaw, float partialTicks) { - - float distance = Minecraft.getMinecraft().getRenderViewEntity().getDistance(entity); float maxDistance = 16 * Minecraft.getMinecraft().gameSettings.renderDistanceChunks; double r = entity.getRadius(); diff --git a/src/main/java/com/minelittlepony/unicopia/spell/ICaster.java b/src/main/java/com/minelittlepony/unicopia/spell/ICaster.java index 94bc2961..e33e9a49 100644 --- a/src/main/java/com/minelittlepony/unicopia/spell/ICaster.java +++ b/src/main/java/com/minelittlepony/unicopia/spell/ICaster.java @@ -24,9 +24,7 @@ public interface ICaster extends IOwned, ILevelle @Nullable IMagicEffect getEffect(); - default boolean hasEffect() { - return getEffect() != null; - } + boolean hasEffect(); /** * Gets the entity directly responsible for casting. diff --git a/src/main/java/com/minelittlepony/unicopia/spell/SpellDisguise.java b/src/main/java/com/minelittlepony/unicopia/spell/SpellDisguise.java index 4f02b662..ef6346d7 100644 --- a/src/main/java/com/minelittlepony/unicopia/spell/SpellDisguise.java +++ b/src/main/java/com/minelittlepony/unicopia/spell/SpellDisguise.java @@ -46,6 +46,10 @@ public class SpellDisguise extends AbstractSpell { return 0; } + public Entity getDisguise() { + return entity; + } + public SpellDisguise setDisguise(@Nullable Entity entity) { if (entity == this.entity) { entity = null;