From 33d46527589e204b15978a25dab18a3499db5c15 Mon Sep 17 00:00:00 2001 From: Electroblob77 <35599699+Electroblob77@users.noreply.github.com> Date: Thu, 4 Jun 2020 22:45:39 +0100 Subject: [PATCH] Add summoned creature appear/disappear animation --- .../wizardry/client/ClientProxy.java | 1 + .../wizardry/client/renderer/LayerFrost.java | 11 --- .../wizardry/client/renderer/LayerStone.java | 9 +- .../client/renderer/LayerSummonAnimation.java | 88 ++++++++++++++++++ .../client/renderer/LayerTiledOverlay.java | 53 +++++------ .../entity/living/EntityBlazeMinion.java | 6 ++ .../wizardry/entity/living/EntityDecoy.java | 5 + .../entity/living/EntityIceGiant.java | 6 ++ .../entity/living/EntityIceWraith.java | 6 ++ .../entity/living/EntityLightningWraith.java | 6 ++ .../wizardry/entity/living/EntityPhoenix.java | 6 ++ .../entity/living/EntityVexMinion.java | 5 + .../entity/living/EntityZombieMinion.java | 9 +- .../entity/living/ISummonedCreature.java | 10 ++ .../textures/entity/summon_overlay.png | Bin 0 -> 1101 bytes .../summon_overlay/summon_overlay_0.png | Bin 0 -> 967 bytes .../summon_overlay/summon_overlay_1.png | Bin 0 -> 1074 bytes .../summon_overlay/summon_overlay_10.png | Bin 0 -> 969 bytes .../summon_overlay/summon_overlay_11.png | Bin 0 -> 1092 bytes .../summon_overlay/summon_overlay_12.png | Bin 0 -> 1190 bytes .../summon_overlay/summon_overlay_13.png | Bin 0 -> 1280 bytes .../summon_overlay/summon_overlay_14.png | Bin 0 -> 1349 bytes .../summon_overlay/summon_overlay_15.png | Bin 0 -> 1401 bytes .../summon_overlay/summon_overlay_16.png | Bin 0 -> 1415 bytes .../summon_overlay/summon_overlay_17.png | Bin 0 -> 1406 bytes .../summon_overlay/summon_overlay_18.png | Bin 0 -> 1400 bytes .../summon_overlay/summon_overlay_2.png | Bin 0 -> 1192 bytes .../summon_overlay/summon_overlay_3.png | Bin 0 -> 1280 bytes .../summon_overlay/summon_overlay_4.png | Bin 0 -> 1348 bytes .../summon_overlay/summon_overlay_5.png | Bin 0 -> 1401 bytes .../summon_overlay/summon_overlay_6.png | Bin 0 -> 1410 bytes .../summon_overlay/summon_overlay_7.png | Bin 0 -> 1404 bytes .../summon_overlay/summon_overlay_8.png | Bin 0 -> 1382 bytes .../summon_overlay/summon_overlay_9.png | Bin 0 -> 904 bytes 34 files changed, 169 insertions(+), 52 deletions(-) create mode 100644 src/main/java/electroblob/wizardry/client/renderer/LayerSummonAnimation.java create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/summon_overlay.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_0.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_1.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_10.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_11.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_12.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_13.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_14.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_15.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_16.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_17.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_18.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_2.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_3.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_4.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_5.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_6.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_7.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_8.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_9.png diff --git a/src/main/java/electroblob/wizardry/client/ClientProxy.java b/src/main/java/electroblob/wizardry/client/ClientProxy.java index fa249025..40ae8f91 100644 --- a/src/main/java/electroblob/wizardry/client/ClientProxy.java +++ b/src/main/java/electroblob/wizardry/client/ClientProxy.java @@ -691,6 +691,7 @@ public class ClientProxy extends CommonProxy { public void initialiseLayers(){ LayerTiledOverlay.initialiseLayers(LayerStone::new); LayerTiledOverlay.initialiseLayers(LayerFrost::new); + LayerTiledOverlay.initialiseLayers(LayerSummonAnimation::new); } @Override diff --git a/src/main/java/electroblob/wizardry/client/renderer/LayerFrost.java b/src/main/java/electroblob/wizardry/client/renderer/LayerFrost.java index 44b7063e..6d6be505 100644 --- a/src/main/java/electroblob/wizardry/client/renderer/LayerFrost.java +++ b/src/main/java/electroblob/wizardry/client/renderer/LayerFrost.java @@ -3,23 +3,12 @@ package electroblob.wizardry.client.renderer; import electroblob.wizardry.Wizardry; import electroblob.wizardry.block.BlockStatue; import electroblob.wizardry.registry.WizardryPotions; -import net.minecraft.client.Minecraft; -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.model.ModelPlayer; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.GlStateManager.DestFactor; import net.minecraft.client.renderer.GlStateManager.SourceFactor; -import net.minecraft.client.renderer.OpenGlHelper; -import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.RenderLivingBase; -import net.minecraft.client.renderer.entity.RenderPlayer; -import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import org.lwjgl.opengl.GL11; /** * Layer used to render the frost texture on creatures with the frostbite effect. diff --git a/src/main/java/electroblob/wizardry/client/renderer/LayerStone.java b/src/main/java/electroblob/wizardry/client/renderer/LayerStone.java index f9ccf368..49a5cf84 100644 --- a/src/main/java/electroblob/wizardry/client/renderer/LayerStone.java +++ b/src/main/java/electroblob/wizardry/client/renderer/LayerStone.java @@ -2,19 +2,12 @@ package electroblob.wizardry.client.renderer; import electroblob.wizardry.block.BlockStatue; import electroblob.wizardry.client.ClientProxy; -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelBiped; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.GlStateManager.DestFactor; import net.minecraft.client.renderer.GlStateManager.SourceFactor; -import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.entity.RenderLivingBase; -import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import org.lwjgl.opengl.GL11; /** * Layer used to render the stone texture on a petrified creature. @@ -22,6 +15,8 @@ import org.lwjgl.opengl.GL11; * @author Electroblob * @since Wizardry 1.2 */ +// N.B. The rule here is don't restrict the type any more than necessary, so even though we *know* petrified creatures +// are always instances of EntityLiving, we don't need any methods/fields specific to EntityLiving so use ELB instead. public class LayerStone extends LayerTiledOverlay { private static final ResourceLocation TEXTURE = new ResourceLocation("textures/blocks/stone.png"); diff --git a/src/main/java/electroblob/wizardry/client/renderer/LayerSummonAnimation.java b/src/main/java/electroblob/wizardry/client/renderer/LayerSummonAnimation.java new file mode 100644 index 00000000..a0f182ca --- /dev/null +++ b/src/main/java/electroblob/wizardry/client/renderer/LayerSummonAnimation.java @@ -0,0 +1,88 @@ +package electroblob.wizardry.client.renderer; + +import electroblob.wizardry.Wizardry; +import electroblob.wizardry.entity.living.ISummonedCreature; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.GlStateManager.DestFactor; +import net.minecraft.client.renderer.GlStateManager.SourceFactor; +import net.minecraft.client.renderer.entity.RenderLivingBase; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.event.RenderLivingEvent; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; + +/** + * Layer used to render the appear/disappear animation for summoned creatures. + * + * @author Electroblob + * @since Wizardry 4.3 + */ +@EventBusSubscriber +public class LayerSummonAnimation extends LayerTiledOverlay { + + private static final int ANIMATION_TICKS = 19; + private static final int HIDE_MODEL_TICKS = 9; + + private static final ResourceLocation[] TEXTURES = new ResourceLocation[ANIMATION_TICKS]; + + static { + for(int i=0; i renderer){ + super(renderer, 32, 32); + } + + @Override + public boolean shouldRender(T entity, float partialTicks){ + return entity instanceof ISummonedCreature && ((ISummonedCreature)entity).hasAnimation() + && getFrameNumber(entity) < ANIMATION_TICKS; + } + + @Override + public ResourceLocation getTexture(T entity, float partialTicks){ + return TEXTURES[getFrameNumber(entity)]; + } + + private int getFrameNumber(T entity){ + if(!(entity instanceof ISummonedCreature)) throw new IllegalArgumentException("Entity must be an ISummonedCreature"); + return Math.min(entity.ticksExisted, Math.max(((ISummonedCreature)entity).getLifetime() - entity.ticksExisted - 1, 0)); + } + + @Override + public void doRenderLayer(T entity, float limbSwing, float limbSwingAmount, float partialTicks, + float ageInTicks, float netHeadYaw, float headPitch, float scale){ + + if(!(entity instanceof ISummonedCreature)) return; + + GlStateManager.enableBlend(); + GlStateManager.blendFunc(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA); + + int colour = ((ISummonedCreature)entity).getAnimationColour((float)getFrameNumber(entity) / ANIMATION_TICKS); + GlStateManager.color((colour >> 16 & 255) / 255f, (colour >> 8 & 255) / 255f, (colour & 255) / 255f); + + super.doRenderLayer(entity, limbSwing, limbSwingAmount, partialTicks, ageInTicks, netHeadYaw, headPitch, scale); + + GlStateManager.disableBlend(); + } + + @SubscribeEvent + public static void onRenderLivingEvent(RenderLivingEvent.Pre event){ + if(shouldHideMainModel(event.getEntity())) event.getEntity().setInvisible(true); + } + + @SubscribeEvent + public static void onRenderLivingEvent(RenderLivingEvent.Post event){ + if(shouldHideMainModel(event.getEntity())) event.getEntity().setInvisible(false); + } + + private static boolean shouldHideMainModel(EntityLivingBase entity){ + return entity instanceof ISummonedCreature && ((ISummonedCreature)entity).hasAnimation() + && (entity.ticksExisted < HIDE_MODEL_TICKS + || ((ISummonedCreature)entity).getLifetime() - entity.ticksExisted < HIDE_MODEL_TICKS); + } + +} diff --git a/src/main/java/electroblob/wizardry/client/renderer/LayerTiledOverlay.java b/src/main/java/electroblob/wizardry/client/renderer/LayerTiledOverlay.java index 2aee5dea..5c755a2e 100644 --- a/src/main/java/electroblob/wizardry/client/renderer/LayerTiledOverlay.java +++ b/src/main/java/electroblob/wizardry/client/renderer/LayerTiledOverlay.java @@ -30,10 +30,21 @@ public abstract class LayerTiledOverlay implements L private final RenderLivingBase renderer; - public LayerTiledOverlay(RenderLivingBase renderer){ + private final int textureWidth; + private final int textureHeight; + + /** Creates a new {@code LayerTiledOverlay} with the given renderer parameters. */ + public LayerTiledOverlay(RenderLivingBase renderer, int textureWidth, int textureHeight){ + this.textureWidth = textureWidth; + this.textureHeight = textureHeight; this.renderer = renderer; } + /** Creates a new {@code LayerTiledOverlay} with the given renderer. Texture width and height default to 16. */ + public LayerTiledOverlay(RenderLivingBase renderer){ + this(renderer, 16, 16); + } + /** * Returns true if this layer should be rendered for the given entity, false if not. * @param entity The entity being rendered @@ -60,26 +71,6 @@ public abstract class LayerTiledOverlay implements L return renderer.getMainModel(); } - /** - * Returns the width of the texture to use for the overlay. Defaults to 16. - * @param entity The entity being rendered - * @param partialTicks The current partial tick time - * @return The width of the texture in pixels. - */ - public int getTextureWidth(T entity, float partialTicks){ - return 16; - } - - /** - * Returns the height of the texture to use for the overlay. Defaults to 16. - * @param entity The entity being rendered - * @param partialTicks The current partial tick time - * @return The height of the texture in pixels. - */ - public int getTextureHeight(T entity, float partialTicks){ - return 16; - } - /** * Returns whether to render the second layer of mob/player skins (which is not an actual render layer, but * part of the model) as part of this layer. Defaults to false. @@ -138,19 +129,16 @@ public abstract class LayerTiledOverlay implements L ModelBase model = getModel(entity, partialTicks); - int width = getTextureWidth(entity, partialTicks); - int height = getTextureHeight(entity, partialTicks); - // Calculate the scaling required in each direction double scaleX = 1, scaleY = 1; // It's more logical to use the model's texture size, but some classes don't bother setting it properly // (e.g. ModelVillager), so to get the correct dimensions I'm getting them from the first box instead. if(model.boxList != null && model.boxList.get(0) != null){ - scaleX = (double)model.boxList.get(0).textureWidth / width; - scaleY = (double)model.boxList.get(0).textureHeight / height; + scaleX = (double)model.boxList.get(0).textureWidth / textureWidth; + scaleY = (double)model.boxList.get(0).textureHeight / textureHeight; }else{ // Fallback to model fields; should never be needed - scaleX = (double)model.textureWidth / width; - scaleY = (double)model.textureHeight / height; + scaleX = (double)model.textureWidth / textureWidth; + scaleY = (double)model.textureHeight / textureHeight; } GlStateManager.scale(scaleX, scaleY, 1); @@ -220,13 +208,14 @@ public abstract class LayerTiledOverlay implements L * @param The type of entity this layer renderer is applicable for */ @SuppressWarnings("unchecked") - public static void initialiseLayers(Class entityType, Function, LayerRenderer> layerFactory){ + public static void initialiseLayers(Class entityType, Function, LayerRenderer> layerFactory){ for(Class c : Minecraft.getMinecraft().getRenderManager().entityRenderMap.keySet()){ if(entityType.isAssignableFrom(c)){ Render renderer = Minecraft.getMinecraft().getRenderManager().getEntityClassRenderObject(c); - if(renderer instanceof RenderLivingBase){ // Should always be true + if(renderer instanceof RenderLivingBase){ // Should always be true // For some reason IntelliJ is quite happy with this cast, even without suppress warnings + // Instinct suggests Java shouldn't be happy casting to RenderLivingBase but somehow it works ((RenderLivingBase)renderer).addLayer(layerFactory.apply((RenderLivingBase)renderer)); } } @@ -235,7 +224,7 @@ public abstract class LayerTiledOverlay implements L // Players have a separate renderer map if(entityType.isAssignableFrom(EntityPlayer.class)){ for(RenderPlayer renderer : Minecraft.getMinecraft().getRenderManager().getSkinMap().values()){ - renderer.addLayer(layerFactory.apply((RenderLivingBase)renderer)); + renderer.addLayer(layerFactory.apply((RenderLivingBase)renderer)); // This does need suppress warnings } } } @@ -245,7 +234,7 @@ public abstract class LayerTiledOverlay implements L * {@link LayerTiledOverlay#initialiseLayers(Class, Function)}. * @param layerFactory A function that creates a layer for a given renderer, usually a constructor reference */ - public static void initialiseLayers(Function, LayerRenderer> layerFactory){ + public static void initialiseLayers(Function, LayerRenderer> layerFactory){ initialiseLayers(EntityLivingBase.class, layerFactory); } diff --git a/src/main/java/electroblob/wizardry/entity/living/EntityBlazeMinion.java b/src/main/java/electroblob/wizardry/entity/living/EntityBlazeMinion.java index fc7873b2..a54d78a8 100644 --- a/src/main/java/electroblob/wizardry/entity/living/EntityBlazeMinion.java +++ b/src/main/java/electroblob/wizardry/entity/living/EntityBlazeMinion.java @@ -1,6 +1,7 @@ package electroblob.wizardry.entity.living; import electroblob.wizardry.Wizardry; +import electroblob.wizardry.client.DrawingUtils; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.ai.EntityAIHurtByTarget; import net.minecraft.entity.ai.EntityAINearestAttackableTarget; @@ -105,6 +106,11 @@ public class EntityBlazeMinion extends EntityBlaze implements ISummonedCreature return false; } + @Override + public int getAnimationColour(float animationProgress){ + return DrawingUtils.mix(0xffdd4d, 0xff6600, animationProgress); + } + @Override protected boolean processInteract(EntityPlayer player, EnumHand hand){ // In this case, the delegate method determines whether super is called. diff --git a/src/main/java/electroblob/wizardry/entity/living/EntityDecoy.java b/src/main/java/electroblob/wizardry/entity/living/EntityDecoy.java index a797807d..f704a0ca 100644 --- a/src/main/java/electroblob/wizardry/entity/living/EntityDecoy.java +++ b/src/main/java/electroblob/wizardry/entity/living/EntityDecoy.java @@ -54,6 +54,11 @@ public class EntityDecoy extends EntitySummonedCreature { } } + @Override + public int getAnimationColour(float animationProgress){ + return 0xffc600; + } + @Override public boolean isEntityInvulnerable(DamageSource source){ return true; diff --git a/src/main/java/electroblob/wizardry/entity/living/EntityIceGiant.java b/src/main/java/electroblob/wizardry/entity/living/EntityIceGiant.java index b964ac3e..10e94e52 100644 --- a/src/main/java/electroblob/wizardry/entity/living/EntityIceGiant.java +++ b/src/main/java/electroblob/wizardry/entity/living/EntityIceGiant.java @@ -1,6 +1,7 @@ package electroblob.wizardry.entity.living; import electroblob.wizardry.Wizardry; +import electroblob.wizardry.client.DrawingUtils; import electroblob.wizardry.registry.WizardryPotions; import electroblob.wizardry.registry.WizardrySounds; import electroblob.wizardry.util.ParticleBuilder; @@ -96,6 +97,11 @@ public class EntityIceGiant extends EntityIronGolem implements ISummonedCreature } } + @Override + public int getAnimationColour(float animationProgress){ + return DrawingUtils.mix(0xffffff, 0x73e1ff, animationProgress); + } + @Override public void onLivingUpdate(){ diff --git a/src/main/java/electroblob/wizardry/entity/living/EntityIceWraith.java b/src/main/java/electroblob/wizardry/entity/living/EntityIceWraith.java index 8e4e55b4..8b4ff0a7 100644 --- a/src/main/java/electroblob/wizardry/entity/living/EntityIceWraith.java +++ b/src/main/java/electroblob/wizardry/entity/living/EntityIceWraith.java @@ -1,6 +1,7 @@ package electroblob.wizardry.entity.living; import electroblob.wizardry.Wizardry; +import electroblob.wizardry.client.DrawingUtils; import electroblob.wizardry.registry.Spells; import electroblob.wizardry.registry.WizardrySounds; import electroblob.wizardry.util.ParticleBuilder; @@ -61,6 +62,11 @@ public class EntityIceWraith extends EntityBlazeMinion { } } + @Override + public int getAnimationColour(float animationProgress){ + return DrawingUtils.mix(0xffffff, 0x73e1ff, animationProgress); + } + @Override public void onLivingUpdate(){ diff --git a/src/main/java/electroblob/wizardry/entity/living/EntityLightningWraith.java b/src/main/java/electroblob/wizardry/entity/living/EntityLightningWraith.java index e0dd58be..60a766ec 100644 --- a/src/main/java/electroblob/wizardry/entity/living/EntityLightningWraith.java +++ b/src/main/java/electroblob/wizardry/entity/living/EntityLightningWraith.java @@ -1,6 +1,7 @@ package electroblob.wizardry.entity.living; import electroblob.wizardry.Wizardry; +import electroblob.wizardry.client.DrawingUtils; import electroblob.wizardry.registry.Spells; import electroblob.wizardry.util.ParticleBuilder; import electroblob.wizardry.util.ParticleBuilder.Type; @@ -49,6 +50,11 @@ public class EntityLightningWraith extends EntityBlazeMinion { } } + @Override + public int getAnimationColour(float animationProgress){ + return DrawingUtils.mix(0xffffff, 0x0092ff, animationProgress); + } + @Override public void onLivingUpdate(){ // Fortunately, lightning wraiths don't replace any of blazes' particle effects or the fire sound, they only diff --git a/src/main/java/electroblob/wizardry/entity/living/EntityPhoenix.java b/src/main/java/electroblob/wizardry/entity/living/EntityPhoenix.java index 23e11730..a634445b 100644 --- a/src/main/java/electroblob/wizardry/entity/living/EntityPhoenix.java +++ b/src/main/java/electroblob/wizardry/entity/living/EntityPhoenix.java @@ -1,5 +1,6 @@ package electroblob.wizardry.entity.living; +import electroblob.wizardry.client.DrawingUtils; import electroblob.wizardry.registry.Spells; import electroblob.wizardry.registry.WizardrySounds; import electroblob.wizardry.spell.Spell; @@ -151,6 +152,11 @@ public class EntityPhoenix extends EntitySummonedCreature implements ISpellCaste } } + @Override + public int getAnimationColour(float animationProgress){ + return DrawingUtils.mix(0xffdd4d, 0xff6600, animationProgress); + } + @Override public void onLivingUpdate(){ diff --git a/src/main/java/electroblob/wizardry/entity/living/EntityVexMinion.java b/src/main/java/electroblob/wizardry/entity/living/EntityVexMinion.java index 73ed60ba..42c8d8f6 100644 --- a/src/main/java/electroblob/wizardry/entity/living/EntityVexMinion.java +++ b/src/main/java/electroblob/wizardry/entity/living/EntityVexMinion.java @@ -91,6 +91,11 @@ public class EntityVexMinion extends EntityVex implements ISummonedCreature { } } + @Override + public int getAnimationColour(float animationProgress){ + return 0xef829c; + } + @Override public boolean hasParticleEffect(){ return true; diff --git a/src/main/java/electroblob/wizardry/entity/living/EntityZombieMinion.java b/src/main/java/electroblob/wizardry/entity/living/EntityZombieMinion.java index 4685aa0f..27891d9a 100644 --- a/src/main/java/electroblob/wizardry/entity/living/EntityZombieMinion.java +++ b/src/main/java/electroblob/wizardry/entity/living/EntityZombieMinion.java @@ -94,8 +94,8 @@ public class EntityZombieMinion extends EntityZombie implements ISummonedCreatur private void spawnParticleEffect(){ if(this.world.isRemote){ for(int i = 0; i < 15; i++){ - this.world.spawnParticle(EnumParticleTypes.SMOKE_LARGE, this.posX + this.rand.nextFloat(), - this.posY + 1 + this.rand.nextFloat(), this.posZ + this.rand.nextFloat(), 0, 0, 0); + this.world.spawnParticle(EnumParticleTypes.SMOKE_LARGE, this.posX + this.rand.nextFloat() - 0.5f, + this.posY + this.rand.nextFloat() * 2, this.posZ + this.rand.nextFloat() - 0.5f, 0, 0, 0); } } } @@ -105,6 +105,11 @@ public class EntityZombieMinion extends EntityZombie implements ISummonedCreatur return true; } + @Override + public boolean hasAnimation(){ + return this.dataManager.get(SPAWN_PARTICLES) || this.ticksExisted > 20; + } + public void hideParticles(){ this.dataManager.set(SPAWN_PARTICLES, false); } diff --git a/src/main/java/electroblob/wizardry/entity/living/ISummonedCreature.java b/src/main/java/electroblob/wizardry/entity/living/ISummonedCreature.java index c4639338..772551f7 100644 --- a/src/main/java/electroblob/wizardry/entity/living/ISummonedCreature.java +++ b/src/main/java/electroblob/wizardry/entity/living/ISummonedCreature.java @@ -239,6 +239,16 @@ public interface ISummonedCreature extends IEntityAdditionalSpawnData, IEntityOw /** Whether this creature should spawn a subtle black swirl particle effect while alive. */ boolean hasParticleEffect(); + /** Returns whether this creature has an animation when appearing and disappearing. */ + default boolean hasAnimation(){ + return true; + } + + /** Returns the colour of this creature's appear/disappear animation. */ + default int getAnimationColour(float animationProgress){ + return 0x000000; + } + /** * Called from the event handler after the damage change is applied. Does nothing by default, but can be overridden * to do something when a successful attack is made. This was added because the event-based damage source system can diff --git a/src/main/resources/assets/ebwizardry/textures/entity/summon_overlay.png b/src/main/resources/assets/ebwizardry/textures/entity/summon_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..9c25c43ec3a08dd58aa255b3fff72f976f566f80 GIT binary patch literal 1101 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!toqpCt8N`ey06$*;-(=u~X z6-p`#QWa7wGSe6sDsEk!o?Y}tgQxX>w&-RS6@jLw2?n8?n8+v+@0eO4*5M7XPWH( zzW?|R{r^n6>-;uscyoK{+%@YgGFg9h>|y$~aZ|#EKbN?kJl*iQYT2G=Q$M6yzy4(A zJm=i?^9L2&f+hA&cr$PBVcWjYKZT+(h4+}}RP-_bYC3)Ydf&N+Q!Ado@Ujk{b~oP3 zQBSYEV(GuJrz9y4JkFZ>F$W#GSI18&mAFPy3&ft9!+?bMc*$vl3kt<^5+&h4NP zC&E1I4R=E8f)(=IoTedHvK2ymvu2rOciOeBFm&sF+@tkOcSe-S=9HUWpEOl`4I{lY zmrqiymPwqIY<5cXc?_4BE=R1v?gNXb_?qo+_1(VX=Co~lrgnW=xiG8uYSyZq)6~wI z@A;=|ws=}pUg~q%rCZu#zwfv`@7tc~eNnIXwXd@+d%f~`oL^S=D^=5dO5bfwYLnf@*e4sTX29qw~sFY&H77=m%%Uo>u4J=hl4NaPYh8OZ|ubrTP1( z6mMVty!c0R-GbA3v@`{JjJp7TZS+dBnX?oB+);rjl>v#p2!@Bh&C=cj|dtZIMI@25%I_q$ou z`8zm6jug1~XRON$8(1e`d#W>&YRxX8gY| zr1fmn@%~V6WGsBHeqa9wUUtz=#g&zMmhLhummCsh?!R6btGVpz`sVM-ckFK-{@ai! z6!Ub~+2`NZZ+QKf)%$jx&F$u`vd7C8{C%Lj;LI80+uuIRdi>aQc^`l3{_xAopS}rx z6Lqrv^Xpopj*Fsh4-YJ#;PRz1ZQ|=S7N1{TE^&%Z{-U-2g5I6O;ve5#>@M4wx7)^B zFzFuOPuIn{>VKnlFTL&nVY3yNc7<~7Le*!B@>B%<{3BAWf9|crhnWl4&$-Y7p5IlBV3$$7d&MoId3*Bh!*oa}O~{Pvo&UXKa4YFlyhLnwcB7GPFEe zY`8!(h*4YB^>0Mcm4MKTA|a-$S7u+FrMi5LW%}vj{#9zzd~|2ejNbU_(aEcuXYUqY z-`btPeR)!M>!YPpq9$%pDmi*vRBo$W&54P8wx1H)<)5zLeR?_Q^0e8e`Ae^!i?y=* zKW}&IyS-nkE_DW3U0#`P_x8)?Ii(A(we^^kJV`w4F8OuYwv~3li^YrfFL#@LOJ&-$ z`L-(#=6n-udRDe*vSdf0lE8LP2G+BaBTKwG)pwrM5j*C-kSA-2u-|e|9+u0VYnt=Q z_>1;G6*Kv(o%ct(C~?tm=_iL=wx9fa<}G*D-gWmiHZh!CUyvo0nvmQaoO+!9+hhCv zZU3bn$i6^^^}-%(|0)jbpY@R4FnPkX)z6NFF)%Q&C3(BMFo3~N=iT)T3=EtF9+AZi z4BWyX%*Zfnjsyb(1AB?5uPgf#HWpD9qwl3DcNiELvOQfKLn02p4Liu?pvbez?%MzV z%)3jg4tB3OShT@=gQDMIuT3st!tW2iayWbJfEdGymtQ&m8GPTv5$I88s`mcVH~R~V zuGqi2wl@9NBppvxr#oy3(ss-Y*A8$ota!1Nmsi16&SD<#VP?-Ayw>xsFs=RRv1b~{ Nou00KF6*2Ung9k7y&(Vq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_1.png b/src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_1.png new file mode 100644 index 0000000000000000000000000000000000000000..7e94bcec9e17c62ac542d002740330f87bb7425c GIT binary patch literal 1074 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANM!cdJ4oN`ey06$*;-(=u~X z6-p`#QWa7wGSe6sDsH`<9ysZa22b04OV_>zm6jug1~XRON$8(1e`d#W>&YRxX8gY| zr1fmn@%~V6WGsBHeqa9wUUtz=#g&zMmhLhummCsh?!R6btGVpz`sVM-ckFK-{@ai! z6!Ub~+2`NZZ+QKf)%$jx&F$u`vd7C8{C%Lj;LI80+uuIRdi>aQc^`l3{_xAopS}rx z6Lqrv^Xpopj*Fsh4-YJ#;PRz1ZQ|=S7N1{TE^&%Z{-U-2g5I6O;ve5#>@M4wx7)^B zFzFuOPuIn{>VKnlFTL&nVY3yNc7<~7Le*!B@>B%<{3BAWf9|crhnWl4&$-Y7p5IlBV3$$7d&MoId3*Bh!*oa}O~{Pvo&UXKa4YFlyhLnwcB7GPFEe zY`8!(h*4YB^>0Mcm4MKTA|a-$S7u+FrMi5LW%}vj{#9zzd~|2ejNbU_(aEcuXYUqY z-`btPeR)!M>!YPpq9$%pDmi*vRBo$W&54P8wx1H)<)5zLeR?_Q^0e8e`Ae^!i?y=* zKW}&IyS-nkE_DW3U0#`P_x8)?Ii(A(we^^kJV`w4F8OuYwv~3li^YrfFL#@LOJ&-$ z`L-(#=6n-udRDe*vSdf0lE8LP2G+BaBTKwG)pwrM5j*C-kSA-2u-|e|9+u0VYnt=Q z_>1;G6*Kv(o%ct(C~?tm=_iL=wx9fa<}G*D-gWmiHZh!CUyvo0nvmQaoO+!9+hhCv zZU3bn$i6^^^}-%(|0)jbpY@R4FnPkX)z6NFF)%Q&C3(BMFo3~N=iT)T3=EtF9+AZi z4BWyX%*Zfnjsyb(1AB?5uPgf#HWpD9qwl3DcNiELu6epRhD02G8s^A%Sb=A8#{FC6 ze^$i(o?>@qw@+~B*2VyJ8L^c@tgbBTWt%4GC>>7R`_1a=qOIF+H!u0reEs-ip27{S zPxM)T9Aa1Af9>ZERfU9Kx=vydC*E#9({W-oGvgILKl`m$ot~#2cqTOE;Q=Gf>z5ie z7lkyhmOp!oYf5y?pZw>4C!RK6s?od0FKU6iYR>Agma~iE!}LAocXWl{%D(jU`(~G* zbq^;dxtwpDCQ|Lb{`ultIV}I$+Jc!Hlo(nH_6M^+S-X9?th?Fr)9hP=7UZ4&UHO># X?2OZ&s~NXNf`Y`;)z4*}Q$iB}x+(X| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_10.png b/src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_10.png new file mode 100644 index 0000000000000000000000000000000000000000..af60cfbffcb853926f121e066956cf48b91e35aa GIT binary patch literal 969 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANM!_o_l7N`ey06$*;-(=u~X z6-p`#QWa7wGSe6sDsH`<9ysZa22b04OV_>zm6jug1~XReJt${yKcmpUTy3S-CjQ?S z(t0-Pcz>ujG8R5p|6lT`=GnS%$e!i-afaU@F8`1t^BFF^~?NE-&}rU z>m>f?*MFx7EY|Kh)ab9+`Qq~#rR$M}&#o?i*|P1}i_jO@Zx7kl2)>uwn<4&s+v&|B ziqGCoh&Q=ac4__AXs+6Mg0@EXwgx+c|17vGard~z`m0x`EDYhR4wUzfRJM?t5OghD z@@#?Dv29U~#X1`uzwpgskKzvLSom#$%Ums9tLs|>4~q!T&)H#QJ}tG_Q16a{tz(Ue zR8G(m_CkZq1!@MLZN;N1PoKJeV&YC=o0$SVV#lY8?KAr4xtqDy(0jVZueGAjj&5c! z?Dfq1_JK)2Dmpm!*E%t~tG<6&!W;sopXp=0RuQAfx70oN39dxi-d zJ4GieGB(ceoMPmfY^L<$#e-nOVz-;}3J$C8X!2|jJlXKrrueb!;-{xiO_z-3cF?es zVxFZWx*;g&O24W*Z>XrRW9a5tyTsN;7M+?^yv^qOimarQS2oSuDY{y3UX1PToz)+s zc5rMn(A^oK5$Cm1)Kl9jd{6Adz}E-cWnNxTmM{Ae*moA$mY!L`@FdX=~@{NY-@ERfC2%p$bxPlElw&)Gk2 zGrV^|hW}?f7=1X-{O>ByeMb9;3Da+~rS4#0U|>t~c6VU_gP+d3>lqjrI14-?iy0WW zg+Z8+Vb&Z81_lQ95>H=O_9tvCqAbP@MIl}c3=BD*E{-7)hu==SD0o1D!&&>VQOLBV z+&>z1o7x}7zn2tFm@(6~RrTQa#IFZlEIXjj;Bxx3{s)cny_||O+h$MM#P2cnw=u&N zX4Tzs&swd{wVYr};91YeV7q~-L8DUAnQ6-nb|?4u;tY4!dR6ko>peGK>(`sJ5#&%$ LS3j3^P6zm6jug1~XReJt${yKcmpUTy3S-CjQ?S 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_13.png b/src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_13.png new file mode 100644 index 0000000000000000000000000000000000000000..98f57c22789cff89e14862c8e9df0330e242e78f GIT binary patch literal 1280 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANM!cdJ4oN`ey06$*;-(=u~X z6-p`#QWa7wGSe6sDsH`<9ysZa22b04OV_>zm6jug1~XReJt${yKcmpUTy3S-CjQ?S z(t0-Pcz>ujG8R5p|6lT`=GnS%$e!i-afaU@F8`1t^BFF^~?NE-&}rU z>m>f?*MFx7EY|Kh)ab9+`Qq~#rR$M}&#o?i*|P1}i_j<8Zx7kl2)>uwn<4&s+v&|B ziqGCoh&Q=ac4__AXs+6Mg0@EXwgx+c|17vGard~z`m0x`EDYhR4wUzfRJM?t@F_@n zv83P88)4cReX3?1_Z&YvWH)jdUXh!!B6z9e^Ic|HGm;)n<_&*#Y*UWju~z9N>K*-V z&Awe<6!_G5udt-;d+wy2ANfKt`f=Ri z2gR1DigO?J*4(O;>H4B;yS7c1?T-n{vQh5=`vmO?0a6T=k6}4`Da_s zeYg7M*CoPBOO^$nuetRy-SV}=T3*S_7bgz4^&7qN%?++y=BEFo&bQZWtEY~xeRV+d z%{R&{XWzQ08w)&kQOKLjz%@&K^NT4${za1`b$a@pB(Hd=&+(fq!Le*|1pD1La!=|` z>Sp}X&HH0ql(^`({)yJkyve^O-WI=76}vw$g>hE=!z(7I4jf}!eyUIY&GGs=-g@Z= zvM-Qfy|4${zlsCY1~B;Pyt|%(fq}EYBeIx*fm;}a z85w5Hkzin8U@!6Xb!C6T#v;mMnko3Po`HdJiKmNWNW|f_;WyVFQQ#?=kbQ$s!4 z%lYzS&+kujS&zrgjNdGCvw!a!Rs$Y>4$l+Y^gmxxNWI6yr2c$*LQYwoq()?9S$6Eq zgx@y#nwu-{DT!;J_{!NUdAF_q;5v)%53V+4a20LKLsZm%atlQ4^V>kRuBB1d1m z3~@_aagOnUR?|nu+cGTs1+J@+5)F3qI9dja&baV9)|I6@I%9=c zew^LPz!vXzrkMxXDv$nk?y_Xm%?b1SE>Lk~G5M!)mh{&9JarS&9}Co-4J!+F zYM6D2e??=(^^ZFXO@iz%n1&c;sAwGyvsX}S@iXT>_upxmps27`U*oSweF};9(__D| YOGM9F{*p824Jd*=UHx3vIVCg!02vKCdH?_b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_14.png b/src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_14.png new file mode 100644 index 0000000000000000000000000000000000000000..3ef94ac87a636a09f11d05bc913b64fc5f612c33 GIT binary patch literal 1349 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANM!cdJ4oN`ey06$*;-(=u~X z6-p`#QWa7wGSe6sDsH`<9ysZa22b04OV_>zm6jug1~XReJt${yKcmpUTy3S-CjQ?S z(t0-Pcz>ujG8R5p|6lT`=GnS%$e!i-afaU@F8`1t^BFF^~?NE-&}rU z>m>f?*MFx7EY|Kh)ab9+`Qq~#rR$M}&#o?i*|P1}i_j<8Zx7kl2)>uwn<4&s+v&|B ziqGCoh&Q=ac4__AXs+6Mg0@EXwgx+c|17vGard~z`m0x`EDYhR4wUzfRJM?t@F_@n zv83P88)4cReX3?1_Z&YvWH)jdUXh!!B6z9e^Ic|HGm;)n<_&*#Y*UWju~z9N>K*-V z&Awe<6!_G5udt-;d+wy2ANfKt`f=Ri z2gR1DigO?J*4(O;>H4B;yS7c1?T-n{vQh5=`vmO?0a6T=k6}4`Da_s zeYg7M*CoPBOO^$nuetRy-SV}=T3*S_7bgz4^&7qN%?++y=BEFo&bQZWtEY~xeRV+d z%{R&{XWzQ08w)&kQOKLjz%@&K^NT4${za1`b$a@pB(Hd=&+(fq!Le*|1pD1La!=|` z>Sp}X&HH0ql(^`({)yJkyve^O-WI=76}vw$g>hE=!z(7I4jf}!eyUIY&GGs=-g@Z= zvM-Qfy|4${zlsCY1~B;Pyt|%(fq}EYBeIx*fm;}a z85w5Hkzin8U@!6Xb!C6T#v;mMnko3Po`He!rKgKyNW|f_;io6QQQ&#AaK|q%w!VjR zJ=*77dnv#s`NN8FgZSp7Sy4{k>_UBexpV#oY(KL4`@dFy&C8z`zUlwUwSduL`Cpa< z_6eQ);)V2Coi`o8s5tYD{I>PU`FHN0mdKI;Vst0A5{evH$=8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_15.png b/src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_15.png new file mode 100644 index 0000000000000000000000000000000000000000..b6db5d2d71ee5a6655e488b4d51aa23aba413a62 GIT binary patch literal 1401 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 L^>bP0l+XkK%QbsR literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_17.png b/src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_17.png new file mode 100644 index 0000000000000000000000000000000000000000..333aed6ca8a3cdc56894fcdb807051945772ead8 GIT binary patch literal 1406 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANM!_o_l7N`ey06$*;-(=u~X z6-p`#QWa7wGSe6sDsH`<9ysZa22b04OV_>zm6jug1~XReJt${yKcmpUTy3S-CjQ?S z(sGg`r#<-3Vk~^F{=eiyX+A9>=b+CqMST`Qo~_zea_b-O3if%ui|^k04}VhlzjL>F z7EFI_IREzkL+kqab#i}y%;CRQCUd{>TX%nhk@5MQ+vm#_9-j95Z8_y{tnd6~oBcOt ztI3~RfBvL`Tew6k^L!_v!n4NRG3iHVUN`ks-*WYMsO$b~dUx)Me|&eZyKH0LZX0jG zqI$XwfQllW@_!U zi#*F0<*ybsIW8jY@_s?(f~^j%5?TCSS5{tHP<&U~l*jPn$u{faUMa5Cq?jKZ4ChuV+lZ?V20vALvk(fz2z7#nVZ z!!w>d6OChVO3q&8egEpA<-0oPAK>D6HR-0|L8*T2BMZN*(2bnKS|=6U5x#TsS6K!j z#qCK3DhdL|ok7bo&bYD2%GPMPozwWu%;GWCx|PvPNwQ#0dR|TPmYT?)M#}l6)LyvId4qqmXjCp4k1$)_?^iA7nAl7QMVxphLTs1=hAN7rVyKdT^ z_&X{3!k6efKhmEZa`_%Vfm`^l+IQvc`YXQfs#|=5$t3*Y6_Zm3j0}rK0|Q%Eaj?ad>U`>AV&Lo;kcOrxxDP zdT0AV^7q%jJpUA~$4n6L(r4LuZ{x|Z-j)-Sj?DXE_{}bBZG467<{9b9du#O>%ouh@ z^fL%Gc)p20_cNHQ>PnRT(f6F+G>+|JDPWM`VGvNzQ{X*NR_DXwVR?V{#&wP^8~Is| z=qvO`y*_T4-mW<1{gX5~4~c109Spdhw*Q#d@#(POtDSklzm1p$u1d2>oZhY*p`OUQ z;(<@n+PV6U8Xf0!g$n!m)af{*2!4LQS z9A4C#tUqZmmDz$x@Z6bW4(p!({>|o4)WGX_cf!nG>GGvX(4)dXC%W1&_tF&r&XC zi}wGWc3!kxS@6!`4!PLudmX3tPWTzZBM>usvJqYyRThv?}6@~Gsn)| z_I1lLbUR`lDJXMI>;I9Cf~0IY>mU1;|L|~&vDP)r7FRj^XU&6%C0i^Go=(curbvFL^9#`8BRhp6&%Ve^Je}~aw=`lO2PB9|FizOv%vf>!?KT;nAHn|v_YxM)78&qol`;+ E0Cxs|O8@`> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_18.png b/src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_18.png new file mode 100644 index 0000000000000000000000000000000000000000..c19f0c949d18e5ef4b8339105bb94392982d8cae GIT binary patch literal 1400 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 c?{%dYmdKI;Vst0GY`~fB*mh literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_4.png b/src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_4.png new file mode 100644 index 0000000000000000000000000000000000000000..236d1871de82049954b60e4bfd951599df30d450 GIT binary patch literal 1348 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANM!_o_l7N`ey06$*;-(=u~X z6-p`#QWa7wGSe6sDsH`<9ysZa22b04OV_>zm6jug1~XReJt${yKcmpUTy3S-CjQ?S z(t0-Pcz>ujG8R5p|6lT`=GnS%$e!i-afaU@F8`1t^BFF^~?NE-&}rU z>m>f?*MFx7EY|Kh)ab9+`Qq~#rR$M}&#o?i*|P1}i_kyWZx7kl2)>uwn<4&s+v&|B ziqGCoh&Q=ac4__AXs+6Mg0@EXwgx+c|17vGard~z`m0x`EDYhR4wUzfRJM?t5OghD z@@#?Dv29U~#X1`uzwpgskKzvLSom#$%Ums9tLs|>4~q!T&)H#QJ}tG_Q16a{tz(Ue zR8G(m_CkZq1!@MLZN;N1PoKJeV&YC=o0$SVV#lY8?KAr4xtqDy(0jVZueGAjj&5c! z?Dfq1_JK)2Dmpm!*E%t~tG<6&!W;sopXp=0RuQAfx70oN39dxi-d zJ4GieGB(ceoMPmfY^L<$#e-nOVz-;}3J$C8X!2|jJlXKrrueb!;-{xiO_z-3cF?es zVxFZWx*;g&O24W*Z>XrRW9a5tyTsN;7M+?^yv^qOimarQS2oSuDY{y3UX1PToz)+s zc5rMn(A^oK5$Cm1)Kl9jd{6Adz}E-cWnNxTmM{Ae*moA$mY!L`@FdX=~@{NY-@ERfC2%p$bxPlElw&)Gk2 zGrV^|hW}?f7=1X-{O>Byea3~{6Xq@3lEKfwz`&N|?e4+=20xv5*E29Ma29w(7Bet# z3xhBt!>l`&NOL|LqUu6y&2fr0V4r;B4q#NoB!r+bem@YFW%IAWNKf?wpg!cqHFt99H=Dd6n8Ze%nZkIfqjg zNCwJ0spx8&<7KqH)8|R!JdH&@$0BznY&~&j>AI$(y4y^Wo8s75=D{I>PU`FHJ0t)D2+F1EK_aP6V&o->P#t=2xg^N{sbj6sC)`))4t|@|7VY;)tG(AfCu51W{-wVqA**>9XY1_8y9e8-;eV&8){gn^G-^)Ilmh5^U&*x@i zZK;VopFwNqh4e@swV8L67gz+@*eJ}NyrwltAvtfamRFP0&U?>}NKKG=eJ0UdXW7m3 wkM=G2+T(0k$El%HRkpj4Z<%vl`A*AvW}cFx?)O4j7K74=r>mdKI;Vst06S@MIRF3v literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_5.png b/src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_5.png new file mode 100644 index 0000000000000000000000000000000000000000..a8a876ed05aee506a5cd0bb6afe6960bf2d8856c GIT binary patch literal 1401 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 Ib4q9e09kI5`Tzg` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_7.png b/src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_7.png new file mode 100644 index 0000000000000000000000000000000000000000..4175d5835c1989089970daae032c69a5287a315e GIT binary patch literal 1404 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANM!_o_l7N`ey06$*;-(=u~X z6-p`#QWa7wGSe6sDsH`<9ysZa22b04OV_>zm6jug1~XReJt${yKcmpUTy3S-CjQ?S z(t0-Pcz>ujG8R5p|6lT`=GnS%$e!i-afaU@F8`1t^BFF^~?NE-&}rU z>m>f?*MFx7EY|Kh)ab9+`Qq~#rR$M}&#o?i*|P1}i_lZoZ?#tcP`YPZby4qH?(}p` zr!%(|_h)Q*yCgn)yT~sa<*Jmrs)VBDKOA=(?&>d$TfJJ-d8N#^MRwCRxfR$bEM0Tm zXx77!p4_cX&mxkVU&xy9ZxLG|;QZFH(<)S|WL@^+Hcd6Vn+2(PI;Wo{#q4mbYWk63 za$|`H|D%LU4!#M`s`a*fnl^R)MCD@j3L`}c-9CNYn$$m&%h;uor|AWLiPk>Toz9pf zHTlk)hpY-F+m`M6602LYYW5G#H4O{&X3BD}`MASL#;gC)B-Q&=9gSSRz4r665j8XUDAFPEVhzZ@f*cA)v;D z&BRqJVd;_;^4@(?tF&e{tx7X3)s5QxWQytYoXU5BSC33unQC0D9Tsb|v#PB4`=hM| zf;ov%MH>V5ObODS6xOn?V)voN*P8h)FD-Ppd-Gwj%+`f9QCYW&Ha}at< zyXlOxc1{=W_>~wj8~U+4GUHsZpwg(@PxGUS`OKq-erQZ_>@7L;(xkI7!K$FfgzsdAqwXfWc4a-SrF%44efXk;M!Q z+`=Ht$S`Y;1Oo#Ddx@v7EBg~R7Eu=KzLj?>7#Nu3JzX3_A`Y(&_s(lE;Hgb^NSdr` z{y@U^uMG1__66Q%6P2dqoj6fC-*;J-3d`jFzmLvuejb?p_sIK=tKT1u%>T@JfF~j7 zHLC+#!HU1Pzy7__B)9dN{@33P_LDZRW8`7*V`mWQ5TC%7uusjHanic)Z`MQ$xV~j( z{K$M_@wHoK8x9AYQZL%fp(1lSOF?4lC&#nti)uJp+}6!LyRVf|;~6h|&-2@2YuY!l z`4psWy>?DLkjtx}+viR)bGG@RtxwgGJFh%)o6_`VhHtaQy5m~+nJz3Bjy7)al=<(= z(sI}R^DLfl%Ld1ef;2O>qP_Rz%^8Xq-iQ=CrqMdG>BjGWXtAOBizPIdmfD&7Qjt zmxv|1?3pYov?1)5x|@qY^zR!7zuO*lH-2<0v-9pQ1?y+&tjCp?>T<-1MbFl#>yPlB zU9P@li-6Onjjor!&o#LtquP1(=e;u%7c_btIijt-@|E=apxq@ivI}1wSX*gr^!#a) zT=Cj^g=NLBZk*=|FJ#uedc(@ngax*Kgv7$X^U9{t$1+#=VHannwDv)w`k zJJea0N#ARF;Bw*3GPVbjQ_dCzE6+3k&;4fS<-A{PPj7u`S8b1b0!mw+u6{1-oD!M< Dzm6jug1~XRON$8(1e`d#W>&YRxX8gY| zr1fmn@%~V6WGsBHeqa9wUUtz=#g&zMmhLhummCsh?!R6btGVpz`sVM-ckFK-{@ai! z6!Ub~+2`NZZ+QKf)%$jx&F$u`vd7C8{C%Lj;LI80+uuIRdi>aQc^`l3{_xAopS}rx z6Lqrv^Xpopj*Fsh4-YJ#;PRz1ZQ|=S7N1{TE^(Tj9Q#*)3-|XAu6wG#EQ(!oTkm{O z%Z%;Lbr&;kd+xuMr}?GQ?aPTjUk*I+`#8BQxkUc)p0M!Xwjj$luC+R;y$>oJydu}9 znjBs!aXX9k?8YN(7p*hoGIRqJ+io=rm98>*5p&&*H`u3U)5BADBBq@^x}%`^g-WKG zR8G(m_CkZq1!@MLZN;N1PoKJeV&YC=o0$SVV#lY8?KAr4xtqDy(0jVZueGAjj&5c! z?Dfq1_JK)2Dmpm!*E%t~tG<6&!W;sopXp=0RuQAfx70oN39dxi-d zJ4GieGB(ceoMPmfY^L<$#e-nOVz-;}3J$C8X!2|jJlXKrrueb!;-{xiO_z-3cF?es zVxFZWx*;g&O24W*Z>XrRW9a5tyTsN;7M+?^yv^qOimarQS2oSuDY{y3UX1PToz)+s zc5rMn(A^oK5$Cm1)Kl9jd{6Adz}E-cWnNxTmM{Ae*monG-e5qTn_2 zxBu^7F&CXy6l&V5GVygEZ>(<66cYjCp0^u+OC;y~kl9_i?%dFD ze>g|)Ns6Qg%b9og40vkKbWEzuHz}UGtMuyehIED}B7)315#FEXvd0|p`SL`hSK?#i zR_n*pEDL?6Xy+ZtxxjQwr{nRSKhL6>cCl|<%HYEEpOf+7^^1Gd7OU%tDjt)}<$3aX z&wn3=Ei4h@lPj@&RzXpD-XVmn$R?B%I#1#>0-vMOeJlrnq~d1J1@S)(;Bds|dKt#ov2s41S1-+JT63)K{*`GIaJ zhn6h)ax3i#QxIbaXU*=QIolR6xc+6xEmOVt;RHvF`5x7Sol9=&UOyckWcGWB+a9(5 f+))>%+<7eiQibK+do9kJpk(Cf>gTe~DWM4fNYj0( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_9.png b/src/main/resources/assets/ebwizardry/textures/entity/summon_overlay/summon_overlay_9.png new file mode 100644 index 0000000000000000000000000000000000000000..d4397aed10d20370704f1599a401a0d2cde3a5a6 GIT binary patch literal 904 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANM!cdJ4oN`ey06$*;-(=u~X z6-p`#QWa7wGSe6sDsH`<9ysZa22b04OV_>zm6jug1~XReJt${yKcmpUTy3S-CjQ?S z(t0-Pcz>ujG8R5p|6lT`=GnS%$e!i-afaU@F8`1t^BFF^~?NE-&}rU z>m>f?*MFx7EY|Kh)ab9+`Qq~#rR$M}&#o?i*vexG+D_8I1G-wn@Ymzt((Og$WT<#^CFjz0D!Q@%#I z8PDn3xHjy9jCYQ}-sWeG*O)|;R@iC;F869aSDJgp;OG%`>2+s%Q*XxfaBtV#wd7{T z2G5CdM-DD&oOR&L_n3^Qy4vx|?$7)_q&OKw$;3zfIQ2vQEuYCTo!CV$wuj9SKhJc; zL~ZBI!`u!TIliSYcSrpQG5;tW!RQ!kWGxo)xUkh?iriM!?#&1Mles=>m2cX|?4a}{ z%%_coB}pytlt}N*js=UG{g0lJOs#KVSXs2(;DDP7bKmDPz2!aA^tI#Da&#FM{>b3T z=n6UD8 z3#;|_&MR3o z-ov~X3I5GzI(a~z|3|oS4Lf_ogvsIyuJ|%AFt8U_vwpMlEU19bw}ZvTNaAd5U*{an^LB{Ts5E~$|p literal 0 HcmV?d00001