From 080022127c5c3af918ab91b89920367012a8bcb7 Mon Sep 17 00:00:00 2001 From: Electroblob77 <35599699+Electroblob77@users.noreply.github.com> Date: Fri, 26 Jun 2020 17:46:47 +0100 Subject: [PATCH] Add radiant totem spell --- .../wizardry/client/ClientProxy.java | 1 + .../effect/RenderContainmentField.java | 20 --- .../renderer/entity/RenderRadiantTotem.java | 145 ++++++++++++++++++ .../entity/construct/EntityHammer.java | 11 -- .../construct/EntityMagicConstruct.java | 17 +- .../entity/construct/EntityRadiantTotem.java | 130 ++++++++++++++++ .../entity/construct/EntityStormcloud.java | 24 --- .../electroblob/wizardry/registry/Spells.java | 2 + .../wizardry/registry/WizardryEntities.java | 1 + .../wizardry/spell/RadiantTotem.java | 24 +++ .../assets/ebwizardry/lang/en_gb.lang | 2 + .../assets/ebwizardry/lang/en_us.lang | 2 + .../ebwizardry/spells/radiant_totem.json | 28 ++++ .../textures/entity/radiant_totem/cube_0.png | Bin 0 -> 1046 bytes .../textures/entity/radiant_totem/cube_1.png | Bin 0 -> 1145 bytes .../textures/entity/radiant_totem/cube_10.png | Bin 0 -> 1220 bytes .../textures/entity/radiant_totem/cube_11.png | Bin 0 -> 1224 bytes .../textures/entity/radiant_totem/cube_12.png | Bin 0 -> 1239 bytes .../textures/entity/radiant_totem/cube_13.png | Bin 0 -> 1184 bytes .../textures/entity/radiant_totem/cube_2.png | Bin 0 -> 1182 bytes .../textures/entity/radiant_totem/cube_3.png | Bin 0 -> 1211 bytes .../textures/entity/radiant_totem/cube_4.png | Bin 0 -> 1224 bytes .../textures/entity/radiant_totem/cube_5.png | Bin 0 -> 1224 bytes .../textures/entity/radiant_totem/cube_6.png | Bin 0 -> 1230 bytes .../textures/entity/radiant_totem/cube_7.png | Bin 0 -> 1149 bytes .../textures/entity/radiant_totem/cube_8.png | Bin 0 -> 1186 bytes .../textures/entity/radiant_totem/cube_9.png | Bin 0 -> 1225 bytes .../textures/entity/radiant_totem/flare.png | Bin 0 -> 4875 bytes .../{healing_totem.png => radiant_totem.png} | Bin 29 files changed, 351 insertions(+), 56 deletions(-) create mode 100644 src/main/java/electroblob/wizardry/client/renderer/entity/RenderRadiantTotem.java create mode 100644 src/main/java/electroblob/wizardry/entity/construct/EntityRadiantTotem.java create mode 100644 src/main/java/electroblob/wizardry/spell/RadiantTotem.java create mode 100644 src/main/resources/assets/ebwizardry/spells/radiant_totem.json create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_0.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_1.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_10.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_11.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_12.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_13.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_2.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_3.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_4.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_5.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_6.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_7.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_8.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_9.png create mode 100644 src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/flare.png rename src/main/resources/assets/ebwizardry/textures/spells/{healing_totem.png => radiant_totem.png} (100%) diff --git a/src/main/java/electroblob/wizardry/client/ClientProxy.java b/src/main/java/electroblob/wizardry/client/ClientProxy.java index 67f7d84c..b910152f 100644 --- a/src/main/java/electroblob/wizardry/client/ClientProxy.java +++ b/src/main/java/electroblob/wizardry/client/ClientProxy.java @@ -813,6 +813,7 @@ public class ClientProxy extends CommonProxy { RenderingRegistry.registerEntityRenderingHandler(EntityIceSpike.class, RenderIceSpike::new); RenderingRegistry.registerEntityRenderingHandler(EntityForcefield.class, RenderForcefield::new); RenderingRegistry.registerEntityRenderingHandler(EntityZombieSpawner.class, RenderZombieSpawner::new); + RenderingRegistry.registerEntityRenderingHandler(EntityRadiantTotem.class, RenderRadiantTotem::new); //RenderingRegistry.registerEntityRenderingHandler(EntityContainmentField.class, RenderContainmentField::new); // Stuff that doesn't render diff --git a/src/main/java/electroblob/wizardry/client/renderer/effect/RenderContainmentField.java b/src/main/java/electroblob/wizardry/client/renderer/effect/RenderContainmentField.java index e0cdb632..d9ebb1bd 100644 --- a/src/main/java/electroblob/wizardry/client/renderer/effect/RenderContainmentField.java +++ b/src/main/java/electroblob/wizardry/client/renderer/effect/RenderContainmentField.java @@ -245,24 +245,4 @@ public class RenderContainmentField { buffer.pos(x, y, z).tex(u, v).color(1, 1, 1, f * alpha).endVertex(); } - // Useful to keep this mapping in case I ever want to draw cubes again - -// Vec3d[] vertices = WizardryUtilities.getVertices(entity.getEntityBoundingBox().offset(entity.getPositionVector().scale(-1))); -// -// // Outside -// drawFace(tessellator, vertices[0], vertices[1], vertices[3], vertices[2], u1, v1, u2, v2); // Bottom -// drawFace(tessellator, vertices[6], vertices[7], vertices[2], vertices[3], u1, v1, u2, v2); // South -// drawFace(tessellator, vertices[5], vertices[6], vertices[1], vertices[2], u1, v1, u2, v2); // East -// drawFace(tessellator, vertices[4], vertices[5], vertices[0], vertices[1], u1, v1, u2, v2); // North -// drawFace(tessellator, vertices[7], vertices[4], vertices[3], vertices[0], u1, v1, u2, v2); // West -// drawFace(tessellator, vertices[5], vertices[4], vertices[6], vertices[7], u1, v1, u2, v2); // Top -// -// // Inside -// drawFace(tessellator, vertices[1], vertices[0], vertices[2], vertices[3], u1, v1, u2, v2); // Bottom -// drawFace(tessellator, vertices[7], vertices[6], vertices[3], vertices[2], u1, v1, u2, v2); // South -// drawFace(tessellator, vertices[6], vertices[5], vertices[2], vertices[1], u1, v1, u2, v2); // East -// drawFace(tessellator, vertices[5], vertices[4], vertices[1], vertices[0], u1, v1, u2, v2); // North -// drawFace(tessellator, vertices[4], vertices[7], vertices[0], vertices[3], u1, v1, u2, v2); // West -// drawFace(tessellator, vertices[4], vertices[5], vertices[7], vertices[6], u1, v1, u2, v2); // Top - } diff --git a/src/main/java/electroblob/wizardry/client/renderer/entity/RenderRadiantTotem.java b/src/main/java/electroblob/wizardry/client/renderer/entity/RenderRadiantTotem.java new file mode 100644 index 00000000..8ecbe2b7 --- /dev/null +++ b/src/main/java/electroblob/wizardry/client/renderer/entity/RenderRadiantTotem.java @@ -0,0 +1,145 @@ +package electroblob.wizardry.client.renderer.entity; + +import electroblob.wizardry.Wizardry; +import electroblob.wizardry.client.DrawingUtils; +import electroblob.wizardry.entity.construct.EntityRadiantTotem; +import electroblob.wizardry.util.GeometryUtils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.Vec3d; +import org.lwjgl.opengl.GL11; + +import javax.annotation.Nullable; + +public class RenderRadiantTotem extends Render { + + private static final ResourceLocation FLARE_TEXTURE = new ResourceLocation(Wizardry.MODID, "textures/entity/radiant_totem/flare.png"); + private static final ResourceLocation[] CUBE_TEXTURES = new ResourceLocation[14]; + + static { + for(int i = 0; i< CUBE_TEXTURES.length; i++) CUBE_TEXTURES[i] = new ResourceLocation(Wizardry.MODID, "textures/entity/radiant_totem/cube_" + i + ".png"); + } + + public RenderRadiantTotem(RenderManager manager){ + super(manager); + } + + @Nullable + @Override + protected ResourceLocation getEntityTexture(EntityRadiantTotem entity){ + return CUBE_TEXTURES[entity.ticksExisted % CUBE_TEXTURES.length]; + } + + @Override + public void doRender(EntityRadiantTotem entity, double x, double y, double z, float entityYaw, float partialTicks){ + + Tessellator tessellator = Tessellator.getInstance(); + + GlStateManager.pushMatrix(); + + GlStateManager.enableBlend(); + GlStateManager.disableLighting(); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240, 240); + GlStateManager.depthMask(false); + GlStateManager.disableCull(); + + GlStateManager.translate(x, y + entity.height/2, z); + + float s = DrawingUtils.smoothScaleFactor(entity.lifetime, entity.ticksExisted, partialTicks, 10, 10); + GlStateManager.scale(s, s, s); + + drawFlare(tessellator); + drawCube(entity, tessellator, partialTicks); + + GlStateManager.disableBlend(); + GlStateManager.enableLighting(); + GlStateManager.depthMask(true); + GlStateManager.enableCull(); + + GlStateManager.popMatrix(); + } + + private void drawFlare(Tessellator tessellator){ + + BufferBuilder buffer = tessellator.getBuffer(); + + GlStateManager.pushMatrix(); + + GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + + bindTexture(FLARE_TEXTURE); + + // This counteracts the reverse rotation behaviour when in front f5 view. + // Fun fact: this is a bug with vanilla too! Look at a snowball in front f5 view, for example. + float yaw = Minecraft.getMinecraft().gameSettings.thirdPersonView == 2 + ? Minecraft.getMinecraft().getRenderManager().playerViewX + : -Minecraft.getMinecraft().getRenderManager().playerViewX; + GlStateManager.rotate(180.0F - Minecraft.getMinecraft().getRenderManager().playerViewY, 0.0F, 1.0F, 0.0F); + GlStateManager.rotate(yaw, 1.0F, 0.0F, 0.0F); + + buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX); + + float r = 0.5f; + + buffer.pos(-r, r, 0).tex(0, 0).endVertex(); + buffer.pos( r, r, 0).tex(1, 0).endVertex(); + buffer.pos( r, -r, 0).tex(1, 1).endVertex(); + buffer.pos(-r, -r, 0).tex(0, 1).endVertex(); + + tessellator.draw(); + + GlStateManager.popMatrix(); + } + + private void drawCube(EntityRadiantTotem entity, Tessellator tessellator, float partialTicks){ + + BufferBuilder buffer = tessellator.getBuffer(); + + GlStateManager.pushMatrix(); + + float age = entity.ticksExisted + partialTicks; + float rotationSpeed = 2; + +// GlStateManager.rotate(age * rotationSpeed/2, 0.0F, 1.0F, 0.0F); +// GlStateManager.rotate(60.0F, 0.7071F, 0.0F, 0.7071F); +// GlStateManager.rotate(age * rotationSpeed, 0.0F, 1.0F, 0.0F); + + GlStateManager.scale(0.5, 0.5, 0.5); + + GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + + bindEntityTexture(entity); + + Vec3d[] vertices = GeometryUtils.getVertices(entity.getEntityBoundingBox().offset(entity.getPositionVector() + .add(0, entity.height/2, 0).scale(-1))); + + buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX); + + // Outside + drawFace(buffer, vertices[0], vertices[1], vertices[3], vertices[2], 0.5f, 0, 0.75f, 0.5f); // Bottom + drawFace(buffer, vertices[6], vertices[7], vertices[2], vertices[3], 0.75f, 0.5f, 1, 1); // South + drawFace(buffer, vertices[5], vertices[6], vertices[1], vertices[2], 0, 0.5f, 0.25f, 1); // East + drawFace(buffer, vertices[4], vertices[5], vertices[0], vertices[1], 0.25f, 0.5f, 0.5f, 1); // North + drawFace(buffer, vertices[7], vertices[4], vertices[3], vertices[0], 0.5f, 0.5f, 0.75f, 1); // West + drawFace(buffer, vertices[5], vertices[4], vertices[6], vertices[7], 0.25f, 0, 0.5f, 0.5f); // Top + + tessellator.draw(); + + GlStateManager.popMatrix(); + } + + private static void drawFace(BufferBuilder buffer, Vec3d topLeft, Vec3d topRight, Vec3d bottomLeft, Vec3d bottomRight, float u1, float v1, float u2, float v2){ + buffer.pos(topLeft.x, topLeft.y, topLeft.z).tex(u1, v1).endVertex(); + buffer.pos(topRight.x, topRight.y, topRight.z).tex(u2, v1).endVertex(); + buffer.pos(bottomRight.x, bottomRight.y, bottomRight.z).tex(u2, v2).endVertex(); + buffer.pos(bottomLeft.x, bottomLeft.y, bottomLeft.z).tex(u1, v2).endVertex(); + } + +} diff --git a/src/main/java/electroblob/wizardry/entity/construct/EntityHammer.java b/src/main/java/electroblob/wizardry/entity/construct/EntityHammer.java index 7a0734ac..f5aa3819 100644 --- a/src/main/java/electroblob/wizardry/entity/construct/EntityHammer.java +++ b/src/main/java/electroblob/wizardry/entity/construct/EntityHammer.java @@ -241,23 +241,12 @@ public class EntityHammer extends EntityMagicConstruct { public void writeSpawnData(ByteBuf data){ super.writeSpawnData(data); data.writeBoolean(spin); - if(getCaster() != null) data.writeInt(getCaster().getEntityId()); } @Override public void readSpawnData(ByteBuf data){ super.readSpawnData(data); spin = data.readBoolean(); - - if(!data.isReadable()) return; - - Entity entity = world.getEntityByID(data.readInt()); - - if(entity instanceof EntityLivingBase){ - setCaster((EntityLivingBase)entity); - }else{ - Wizardry.logger.warn("Lightning hammer caster with ID in spawn data not found"); - } } @Override diff --git a/src/main/java/electroblob/wizardry/entity/construct/EntityMagicConstruct.java b/src/main/java/electroblob/wizardry/entity/construct/EntityMagicConstruct.java index 7b9b11ec..f3165aa7 100644 --- a/src/main/java/electroblob/wizardry/entity/construct/EntityMagicConstruct.java +++ b/src/main/java/electroblob/wizardry/entity/construct/EntityMagicConstruct.java @@ -35,7 +35,7 @@ import java.util.UUID; */ public abstract class EntityMagicConstruct extends Entity implements IEntityOwnable, IEntityAdditionalSpawnData { - /** The UUID of the caster. As of Wizardry 4.2, this is synced, and rather than storing the caster + /** The UUID of the caster. As of Wizardry 4.3, this is synced, and rather than storing the caster * instance via a weak reference, it is fetched from the UUID each time it is needed in * {@link EntityMagicConstruct#getCaster()}. */ private UUID casterUUID; @@ -120,11 +120,26 @@ public abstract class EntityMagicConstruct extends Entity implements IEntityOwna @Override public void writeSpawnData(ByteBuf data){ data.writeInt(lifetime); + data.writeInt(getCaster() == null ? -1 : getCaster().getEntityId()); } @Override public void readSpawnData(ByteBuf data){ + lifetime = data.readInt(); + + int id = data.readInt(); + + if(id == -1){ + setCaster(null); + }else{ + Entity entity = world.getEntityByID(id); + if(entity instanceof EntityLivingBase){ + setCaster((EntityLivingBase)entity); + }else{ + Wizardry.logger.warn("Construct caster with ID in spawn data not found"); + } + } } @Nullable diff --git a/src/main/java/electroblob/wizardry/entity/construct/EntityRadiantTotem.java b/src/main/java/electroblob/wizardry/entity/construct/EntityRadiantTotem.java new file mode 100644 index 00000000..9a43cc4f --- /dev/null +++ b/src/main/java/electroblob/wizardry/entity/construct/EntityRadiantTotem.java @@ -0,0 +1,130 @@ +package electroblob.wizardry.entity.construct; + +import electroblob.wizardry.constants.Constants; +import electroblob.wizardry.registry.Spells; +import electroblob.wizardry.spell.RadiantTotem; +import electroblob.wizardry.spell.Spell; +import electroblob.wizardry.util.*; +import electroblob.wizardry.util.BlockUtils.SurfaceCriteria; +import electroblob.wizardry.util.MagicDamage.DamageType; +import electroblob.wizardry.util.ParticleBuilder.Type; +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.World; + +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +public class EntityRadiantTotem extends EntityMagicConstruct { + + private static final int PERIMETER_PARTICLE_DENSITY = 6; + + public EntityRadiantTotem(World world){ + super(world); + this.setSize(1, 1); + } + + @Override + public void onUpdate(){ + + if(this.ticksExisted % 25 == 1){ + // TODO: Sound + } + + super.onUpdate(); + + double radius = Spells.radiant_totem.getProperty(Spell.EFFECT_RADIUS).floatValue(); // TODO: Blast modifiers + + if(world.isRemote){ + + ParticleBuilder.create(Type.DUST, rand, posX, posY + 0.2, posZ, 0.3, false) + .vel(0, -0.02 - world.rand.nextFloat() * 0.01, 0).clr(0xffffff).fade(0xffec90).spawn(world); + + for(int i=0; i nearby = EntityUtils.getLivingWithinRadius(radius, posX, posY, posZ, world); + nearby.sort(Comparator.comparingDouble(e -> e.getDistanceSq(this))); + + List nearbyAllies = nearby.stream().filter(e -> e == getCaster() + || AllyDesignationSystem.isAllied(getCaster(), e)).collect(Collectors.toList()); + nearby.removeAll(nearbyAllies); + + int targetsRemaining = Spells.radiant_totem.getProperty(RadiantTotem.MAX_TARGETS).intValue() + + (int)((damageMultiplier - 1) / Constants.POTENCY_INCREASE_PER_TIER); + + while(!nearbyAllies.isEmpty() && targetsRemaining > 0){ + + EntityLivingBase ally = nearbyAllies.remove(0); + + if(ally.getHealth() < ally.getMaxHealth()){ + // Slightly slower than healing aura, and it only does 1 at a time (without potency modifiers) + if(ally.ticksExisted % 8 == 0) ally.heal(Spells.radiant_totem.getProperty(Spell.HEALTH).floatValue()); + targetsRemaining--; + + if(world.isRemote){ + ParticleBuilder.create(Type.BEAM).pos(this.getPositionVector()).target(ally) + .clr(1, 0.6f + 0.3f * world.rand.nextFloat(), 0.2f).spawn(world); + } + } + } + + while(!nearby.isEmpty() && targetsRemaining > 0){ + + EntityLivingBase target = nearby.remove(0); + + if(EntityUtils.isLiving(target)){ + + if(target.ticksExisted % target.maxHurtResistantTime == 1){ + + float damage = Spells.radiant_totem.getProperty(Spell.DAMAGE).floatValue(); + + if(target.isEntityUndead()){ + target.setFire(Spells.radiant_totem.getProperty(Spell.BURN_DURATION).intValue()); +// damage *= getProperty(UNDEAD_DAMAGE_MULTIPLIER).floatValue(); + } + + EntityUtils.attackEntityWithoutKnockback(target, MagicDamage.causeIndirectMagicDamage(this, + getCaster(), DamageType.RADIANT), damage); + } + + targetsRemaining--; + + if(world.isRemote){ + ParticleBuilder.create(Type.BEAM).pos(this.getPositionVector().add(0, height/2, 0)) + .target(target).clr(1, 0.6f + 0.3f * world.rand.nextFloat(), 0.2f).spawn(world); + } + } + } + } + + // Usually damage multipliers don't need syncing, but here we're using it for the non-standard purpose of targeting + + @Override + public void writeSpawnData(ByteBuf data){ + super.writeSpawnData(data); + data.writeFloat(damageMultiplier); + } + + @Override + public void readSpawnData(ByteBuf data){ + super.readSpawnData(data); + damageMultiplier = data.readFloat(); + } +} diff --git a/src/main/java/electroblob/wizardry/entity/construct/EntityStormcloud.java b/src/main/java/electroblob/wizardry/entity/construct/EntityStormcloud.java index ab2943c9..ea1e851d 100644 --- a/src/main/java/electroblob/wizardry/entity/construct/EntityStormcloud.java +++ b/src/main/java/electroblob/wizardry/entity/construct/EntityStormcloud.java @@ -95,28 +95,4 @@ public class EntityStormcloud extends EntityMagicConstruct { } - // Need to sync the caster so they don't have particles spawned at them - - @Override - public void writeSpawnData(ByteBuf data){ - super.writeSpawnData(data); - if(getCaster() != null) data.writeInt(getCaster().getEntityId()); - } - - @Override - public void readSpawnData(ByteBuf data){ - - super.readSpawnData(data); - - if(!data.isReadable()) return; - - Entity entity = world.getEntityByID(data.readInt()); - - if(entity instanceof EntityLivingBase){ - setCaster((EntityLivingBase)entity); - }else{ - Wizardry.logger.warn("Stormcloud caster with ID in spawn data not found"); - } - } - } diff --git a/src/main/java/electroblob/wizardry/registry/Spells.java b/src/main/java/electroblob/wizardry/registry/Spells.java index 090ddaa8..d4f27671 100644 --- a/src/main/java/electroblob/wizardry/registry/Spells.java +++ b/src/main/java/electroblob/wizardry/registry/Spells.java @@ -243,6 +243,7 @@ public final class Spells { public static final Spell blinding_flash = placeholder(); public static final Spell stormcloud = placeholder(); + public static final Spell radiant_totem = placeholder(); public static final Spell firestorm = placeholder(); public static final Spell zombie_apocalypse = placeholder(); @@ -451,6 +452,7 @@ public final class Spells { registry.register(new BlindingFlash()); registry.register(new Stormcloud()); + registry.register(new RadiantTotem()); registry.register(new Firestorm()); registry.register(new ZombieApocalypse()); diff --git a/src/main/java/electroblob/wizardry/registry/WizardryEntities.java b/src/main/java/electroblob/wizardry/registry/WizardryEntities.java index d4162a34..ae0c4010 100644 --- a/src/main/java/electroblob/wizardry/registry/WizardryEntities.java +++ b/src/main/java/electroblob/wizardry/registry/WizardryEntities.java @@ -147,6 +147,7 @@ public class WizardryEntities { registry.register(createEntry(EntityHealAura.class, "healing_aura", TrackingType.CONSTRUCT).build()); registry.register(createEntry(EntityDecay.class, "decay", TrackingType.CONSTRUCT).build()); registry.register(createEntry(EntityZombieSpawner.class, "zombie_spawner", TrackingType.CONSTRUCT).build()); + registry.register(createEntry(EntityRadiantTotem.class, "radiant_totem", TrackingType.CONSTRUCT).build()); // These ones don't render, currently that makes no difference here but we might as well separate them registry.register(createEntry(EntityArrowRain.class, "arrow_rain", TrackingType.CONSTRUCT).build()); diff --git a/src/main/java/electroblob/wizardry/spell/RadiantTotem.java b/src/main/java/electroblob/wizardry/spell/RadiantTotem.java new file mode 100644 index 00000000..ec6cd64a --- /dev/null +++ b/src/main/java/electroblob/wizardry/spell/RadiantTotem.java @@ -0,0 +1,24 @@ +package electroblob.wizardry.spell; + +import electroblob.wizardry.entity.construct.EntityRadiantTotem; +import electroblob.wizardry.util.SpellModifiers; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.util.EnumFacing; + +import javax.annotation.Nullable; + +public class RadiantTotem extends SpellConstructRanged { + + public static final String MAX_TARGETS = "max_targets"; + + public RadiantTotem(){ + super("radiant_totem", EntityRadiantTotem::new, false); + this.addProperties(EFFECT_RADIUS, MAX_TARGETS, HEALTH, DAMAGE, BURN_DURATION); + this.floor(false); + } + + @Override + protected void addConstructExtras(EntityRadiantTotem construct, EnumFacing side, @Nullable EntityLivingBase caster, SpellModifiers modifiers){ + construct.posY += 1.2; + } +} diff --git a/src/main/resources/assets/ebwizardry/lang/en_gb.lang b/src/main/resources/assets/ebwizardry/lang/en_gb.lang index da082373..e5edab31 100644 --- a/src/main/resources/assets/ebwizardry/lang/en_gb.lang +++ b/src/main/resources/assets/ebwizardry/lang/en_gb.lang @@ -862,6 +862,7 @@ spell.ebwizardry\:pocket_workbench=Pocket Workbench spell.ebwizardry\:poison=Poison spell.ebwizardry\:poison_bomb=Poison Bomb spell.ebwizardry\:possession=Possession +spell.ebwizardry\:radiant_totem=Radiant Totem spell.ebwizardry\:ray_of_purification=Ray of Purification spell.ebwizardry\:remove_curse=Remove Curse spell.ebwizardry\:replenish_hunger=Replenish Hunger @@ -1040,6 +1041,7 @@ spell.ebwizardry\:pocket_workbench.desc=Allows the caster to craft items as if t spell.ebwizardry\:poison.desc=Fires poison in the direction you are pointing. spell.ebwizardry\:poison_bomb.desc=Lanches a poison bomb in the direction you are pointing which explodes on impact, poisoning nearby creatures. spell.ebwizardry\:possession.desc="Become thy enemy." +spell.ebwizardry\:radiant_totem.desc=Creates a radiant totem which shoots a beam of light at nearby creatures, healing allies but damaging mobs. Lasts for 30 seconds. Potency will increase the number of targets. spell.ebwizardry\:ray_of_purification.desc=Emits a ray of blinding light that damages and blinds its targets. Undead creatures take double damage and are set on fire. spell.ebwizardry\:remove_curse.desc=Removes any curse currently affecting the caster. spell.ebwizardry\:replenish_hunger.desc=Replenishes the caster's food level by 3 hunger points. diff --git a/src/main/resources/assets/ebwizardry/lang/en_us.lang b/src/main/resources/assets/ebwizardry/lang/en_us.lang index a2fea7e5..94ca5c1e 100644 --- a/src/main/resources/assets/ebwizardry/lang/en_us.lang +++ b/src/main/resources/assets/ebwizardry/lang/en_us.lang @@ -862,6 +862,7 @@ spell.ebwizardry\:pocket_workbench=Pocket Workbench spell.ebwizardry\:poison=Poison spell.ebwizardry\:poison_bomb=Poison Bomb spell.ebwizardry\:possession=Possession +spell.ebwizardry\:radiant_totem=Radiant Totem spell.ebwizardry\:ray_of_purification=Ray of Purification spell.ebwizardry\:remove_curse=Remove Curse spell.ebwizardry\:replenish_hunger=Replenish Hunger @@ -1040,6 +1041,7 @@ spell.ebwizardry\:pocket_workbench.desc=Allows the caster to craft items as if t spell.ebwizardry\:poison.desc=Fires poison in the direction you are pointing. spell.ebwizardry\:poison_bomb.desc=Lanches a poison bomb in the direction you are pointing which explodes on impact, poisoning nearby creatures. spell.ebwizardry\:possession.desc="Become thy enemy." +spell.ebwizardry\:radiant_totem.desc=Creates a radiant totem which shoots a beam of light at nearby creatures, healing allies but damaging mobs. Lasts for 30 seconds. Potency will increase the number of targets. spell.ebwizardry\:ray_of_purification.desc=Emits a ray of blinding light that damages and blinds its targets. Undead creatures take double damage and are set on fire. spell.ebwizardry\:remove_curse.desc=Removes any curse currently affecting the caster. spell.ebwizardry\:replenish_hunger.desc=Replenishes the caster's food level by 3 hunger points. diff --git a/src/main/resources/assets/ebwizardry/spells/radiant_totem.json b/src/main/resources/assets/ebwizardry/spells/radiant_totem.json new file mode 100644 index 00000000..62e55d05 --- /dev/null +++ b/src/main/resources/assets/ebwizardry/spells/radiant_totem.json @@ -0,0 +1,28 @@ +{ + "enabled": { + "book": true, + "scroll": true, + "wands": true, + "npcs": true, + "dispensers": true, + "commands": true, + "treasure": true, + "trades": true, + "looting": true + }, + "tier": "advanced", + "element": "healing", + "type": "construct", + "cost": 40, + "chargeup": 15, + "cooldown": 175, + "base_properties": { + "range": 8, + "duration": 600, + "effect_radius": 6, + "max_targets": 1, + "health": 1, + "damage": 1, + "burn_duration": 5 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_0.png b/src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_0.png new file mode 100644 index 0000000000000000000000000000000000000000..fa1e0012ed4934d8aeec7282a1ee6abaae439f46 GIT binary patch literal 1046 zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU=ZM7V_;w?XQ+*2U|=?>3W+EQN-S3>D9TUE z%t=)!sVqoUNUg|BV_>Mb^>k`<(Hjk(w)>Gsbq)$~bUrOuYh^v->3RNT>t8M@x>PBx zAss!9<&ye_*Z==XzLPiUaxZYalGOFlfm>7MT*ZdRInO=ZBfej)s6X_(`Od|s%+5~? ze|kUiG)9 zW!vTF-xqke33J$5zmqGv^LWnD`QgVz3)AHny2O2y`C#_+W$C*+Uq5PAe)D|Sx5xBP zveq5J?M^kPE>4@g=iJ>>7lci38Qa%9*f-ftlJ3r@16vvl*{-7EBONxW>Yq4)F*wae#X z5@T(+1y0X+@=P|0!72H9NLXEXdH9;`W(TVTrc6z9ZuqIOyj!VcweEh4>KB}4{|obY zFKv@maGepoLE@7_fy*bSiF~PHN>45xP)~mPhFM%dK``$L+l`7hEUAwz&2y$q)8n3> zB%{lqc*BItz8gr{ow6o1~(tTj<06*NIZL6MxT=%FUV_ z5m8mOm~G>$qpW8iyQmopJa$l6H<^KJmip$y8Z7gksBKm@G;1|jG114OSItm>XKn;r z?9IC;YEPc^{GpxqN7B;#;$JpP^NYDf@;mn~xc2GS;vcLT?+(qpe3)M*C*Z}jo1gxu z@0D|x-21@gkIU*WhO$o+kC$J4zh(Zu-TvVpr$7FG_M++Q^=H$rsY~y^UV1<9pI_#V z$ESb3pOAljPl)}k9rGpjZYs1ltV(@+kN2hCmhVoxZtN&`Mj`I6Sh)MbJ^vlQd!=TX zy|Z?+SULGO|M`c~ckauaUczg3G_@r!g=va29w(7BevL9R^{>EamTas2I6L#_h`Jj|{y>}UP^ALtvmh(|Sf zsX+OQ2hpjLje=}EDwD9TUE z%t=)!sVqoUNUg|BV_>Mb^>kYFw8t7eZTBOO>M(jX94R``R-DGZ`OnXTDl3<~DG3kV zztz$#;u`B0PND1nesAAhUl91|Uh9f!MTai@p5XkfsqyDytEx|lcF&K#7QQ$CNnf74 zgp#BF@$4+`{SI>SY*N$q*qxr6ce-EK-TeINg*_*drM%BiQ-0{|_xkSB)bK;?PuEmu zANR_ztgYqmN_ivblz7}%;ka?HM$sMC@7^(ae3O#Lagi8OxpK-g;wx%i!pNUQyf6$Ba_dPR%rz zjy*s%!hIvgx!kkPqoee*#cC45vw^eoWW(WOW5B_X4 z_4xjjLDT6?$H@r|4gM+Gm7wa?0&a`iupyQ(eN$nEa8w?rl)~W>i-ia^Zm#16#MIwtIc!&IWd%rKFn>HtW|#B&}wrb zn6Qt%boSWa5>IpK@0V5Y=G=KNy?1?ix#)B8uXedz^Os*)p?2nlxAkkQ3A_7RK1=?8 zcK82FBk?Ck*^X{vU|?WN@^*J&Z~(#O-}KWM7#KJUJR*x382Ao@Fyrz36)6l14D2PI zzOL*~*rWus1=?8t3o$S-%=dJ04DmSrcCw?;VFM0kSM~oKfBp+rc1@n1qyKhk??Kt^ zm%U3&JTh7)axtt8FD_@~ebBOe^7HeK3qMU&6xaLnx%u8Iw(|3*s^8y{dlr?sp!_)V z;rSVp?)^wh6BL}uc7Y|wvzd9`mFy(z0%w0>d<5671R9;p|f+=VZs zFr5-Q;d0HB`SqH{`|1LMOBorAH(yUWDEsI>W0F|WtYqV3mlzlr7(8A5T-G@yGywpI Cxeo9E literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_10.png b/src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_10.png new file mode 100644 index 0000000000000000000000000000000000000000..fcfc9dd88443a5988810660835384be987b088b3 GIT binary patch literal 1220 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_13.png b/src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_13.png new file mode 100644 index 0000000000000000000000000000000000000000..94f283ccfb0adfb9afb1761026958a0a955f05d7 GIT binary patch literal 1184 zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU=ZM7V_;w?XQ+*2U|?>l3W+EQN-S3>D9TUE z%t=)!sVqoUNUg|BV_>MbwRU>+rrQcUZTBNxrzdc>94R``HuK$r)9?9@dCr;a?eBN? zMna_d7si=8emyTQ-d_;NbCET$Tk{xexQAllu>;fo-l~o|RMFS{Tz${{Cw+bVJQLmD zf4?5Fysj-~9h=m$J#(J=U4MCe+2X^WOI}nznRo2U=9ecv>n;EJ?$Vai57VqZ$Gx@_ zp5^!ce)A%U*$yvm7Ji-ZSh8AV|9#2wBa>@eges3(JXmW#|H`@8w(_H!)wf1}y7J+9 z&<<6<){5}On(CD?y8{<=Ir>_4|}L z_68<@J(+(_I%Ca(XV%lb^-LZu6U_vd{4GjR z{~fnLW=YXsPF;qDX4zVc_buMZeeLztgH-}k0@Dt&d=4rTcYU#I+n)z-7OHy}oZe^Z zvHc~3s#A`m(G$mn&L^!(x~JB-tXSOW@Am8sv$%kQ;Jp*38$RCPJax?0EN4oa9{2ks z8C?d&8zx*PC({pbIc}&kk+>Ehrhl;0Lqv44ie=TD0HNe7H_oqE6W8437HaA{>uj{a z#*D1AlSPl76t;MFdB$#<5_FDZ)v3T*=+GR5yH8gqLZ^%8glDXJzF@WS`xBVad^DXQQ%yI^_o01~0ZQTEFt* zl53r<3zvsy39OdWTOqH0X=bAYJ5%9XmJJJb8b|jyJ@8v+94(X_%+W06*}geYovmr1 zkoRKl-P${+-cUH`Uv@-rLUZuR&mgcV?o0ZP8HO^Rie9y&qhyTv5p2b?Pf116|E6!-umEHfo zRe6cWUa!smYp{Cun>+j6YNpTK9sJM2x?CwJ%e{i(~{s_xGBth&Q`%S>c`VVs|qLu{?N} z&)em}RylY4mzTWQmG1W3*FfydozDK_$FK1D-#_tQ=G5N)QfaPs`+r(H_CKw)aJmjnC79|-?qZecnT9gu%<4{L4qOiLEQkJHvN z#fJXA$huWD=pW&Lyfmy6S syqJ_PCa5qTJ1-ot;9gal<6mJjxAY4)+x+G*FfcH9y85}Sb4q9e0DA5%mH+?% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_2.png b/src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_2.png new file mode 100644 index 0000000000000000000000000000000000000000..6338ada44eed8bb9d5135be5e676d6ce84ebb0fc GIT binary patch literal 1182 zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU=ZM7V_;w?XQ+*2U|=q;3W+EQN-S3>D9TUE z%t=)!sVqoUNUg|BV_>MbwRT!&*%K`uxBuCqds)1BgibR`pL;30=jnI$W2Q$#r!JXi zDHo9G6h0x~@B944_B$-RROGKDbrl|bI@y2H$HdchZ}a2+RP=d2^Ph45WM{uTi&Fdc z+sill{pG3LA+=)ury_mz*yZxG`}odZUif-qwN&u=WyF0e<};YG_5s}mo4Y`bp1@3DTQspr%=_t9-@^La1#l$HFf(U@nu^6sSNZM*eZ zbqlqQv`hI~wtv3W%VitzSn}sP_V;X)UzY~&zGjxa_TB2!c8h{0K3g>HWm1jfMxOAy zI!PMu8uDe86D6kYXu82Ri#1u*PiIA0@_Fg>yqM$FPenDWRxYaOUh}B!%p9*tS4&y; z@#ihl+u1v(@hn#sU((Jehm`ZAK8BgO+>@AfsNmR!A4V^He#|Z`yb_fk`z+4qc6RHY zCFTm3UOf3F9K~=b_nJx1uRcfdHP=@+mnulO&E(}i<9#!B%7N?mikgd;ON;rR-e(%I z{Uw8{)0>8r8;u8qZnF06SO}fYlIhzpAt}gfTF@y;N8_0Ei1dsnF-vwl^48dxv2l`D+(o<9@rR|tV{?78 z@1+z=Z~HH1zVz(2El*F0t_`W>H4R%E7JQa>@3olEx?65+iS*WuU*Wsz`;{M!ce1l= zR+c8!y?8lQ>d2~g?svyMUz~C9v1#5>#*~rq@{CyW`=yg#pP8m|L&VXc*SURjp*maB zzD+I1#LL2q^mhh+uz#d>{zRbr_xcHo`|>9JKJ~Wc*0kgCBIXQVV{c^d+R@g`%XM{A z#Jl>*=kBlF5>=q|?DTPQ*{CH?RKLqCV|)_)HEFB#lv`2XQ@dkI`)6L59rI-O&P(5~ z+_PTFzp3)&3h_nDll0H}ZLwPsXsWq#Zd%FVr+Ux$UX+zxW(uCnw|eoSe6g=vJYP&a z@n+S(SH@53_P3;KFR(SNyw!G}_ro%`Pie_9xi8G!(#^g|FE*C`RpQysTf1w?;WoS2 zONq|?b93xp%)RaKWz*mK3yZ$gIo{`XR`xr*u&@5eOZjc0I$~2L*dH=5Ft8FfcHz@pN$v z@i_i=vLoMN0}d8(?f)7!OZC48d&F(BRq3tj;O$D)Y+rYTlUIkS!9gWkd-*DbNKY%z ze+KD1-AmXjeMFo2F7y5|t+q|QaM;SqCBq?fH`}_nzTGkoyu2}g3pf1?7j0m+sJxk) z_U+wOg-Gs(P!}JUC(pRrey|?6c52sdIpM8kd%vzq|DkH3!rP~7b!ftQsRIibZLT-W s{Mxmrs^q}3ACqP{MCZ>6I8o2A+pv-8rT#So1_lNOPgg&ebxsLQ06mB#7XSbN literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_3.png b/src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_3.png new file mode 100644 index 0000000000000000000000000000000000000000..9b4dde734d47bdc460cd94cfb97c923260a78be3 GIT binary patch literal 1211 zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU=ZM7V_;w?XQ+*2U|_DT3W+EQN-S3>D9TUE z%t=)!sVqoUNUg|BV_>MbwRURmwAX4pZU3`HW1Cd%RHiXYoO{W)>(9OfwV5e%EQ+Ho z%-jSgT~OxOTL16e7jY@~=O@{>&Pcj*q2`mPkzJ1UEyGXGo>!Yi+9&=~Q2+PKQK3lU zu3>NP%k&e6Ya4&5>h~92+V$p!(U;Up$&$mLIg(%AGW@1sy1N6CmjC!BvDw-ByzE`O`IFN1i?%;q`cN*| zF*=6pqo%v}xra98#?Jm%Dk|%K9K3$=$-R9~*L}ZRm4E!*rv4KlOSZ1eojD^uK*yjo zMR}3-yoUU_whN`VML6cLpKXfk6z1M^_vYtwGp)Bul&}CeKyg@x~O$W ziipA?i6_UTqZkg=J~cV>=bWGUn(t-@tOR(B&$jVCTPvgH^`JU;=gFIn`Z@EqJ(dZ-9C9il2J`^@24wM71|}j zxgA(!q*!M?F-oYE53qm5YdWQwd!7@AVaA3DPJMd6B$9fhj>}HHy7Kyhz);`GX~oZU zBTP&;r&xLx?KtGr<*6CzrI~JV)?n^ND`(~BN=HTGojP5+r-l@{{tStC?hRdiHRQA2 z?%RcbzVFa}yKT9xd7j47XVDoOGdE9*dbeWhyIt=W9$$C2>eWxT+`!r;$NZn%3x4dH zEATnk|NRw(u)jtJA6s!YOLlao3tV?(VAXBDnf7KcPf_#DX)NtZ94iVX3d-b;I9xEF zcH!r-cYg15&AI-C-+3ZxDfQwXf04-r-6H#)a|3RF{^MRKe8HksdHL+uJ8mqvpws>I zFoXnYh`KT3>el`aN+U_bgA(zvhB+ACC3NEkD0G)!~g%)TGtFcDk2dxh-*w zXJP$)#@JlPb+TIu%L=ZZ;+CJTC%3BGPkgO!&C;(M{;gB+Ui`hzuH5T4k%(S*`o&@}H?F)^O&0t6)|J z1_rhyZ+9042M}ETO+Sr+fq}EYBeIx*f$uN~Gak=hk;1^hz+U3%>&pIwO-evh@#&kn zs~8v<_ItWGhIkx5JM|)OvjLCGd5!8TIft}lTRn}q77M8DtP@eWVipr3esS`r)HsXT zGK?)A&!W!Wbu^kh$KzZL*Kbj=lb%M(U{mg+%O}4#Jek^f`<+`&cVx55e}=7} X`we7{OtxoWU|{fc^>bP0l+XkKJJmAW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_4.png b/src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_4.png new file mode 100644 index 0000000000000000000000000000000000000000..8ea24c851cb597c183ccef4e3f9630221e3694e5 GIT binary patch literal 1224 zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU=ZM7V_;w?XQ+*2U|?>m3W+EQN-S3>D9TUE z%t=)!sVqoUNUg|BV_>MbwRU=L*=r4+w*Q;EBAZkNgibRuKR?6w?$dMD%QaU$C!aGt z&X%IcX?rL$_V?%f^8XJON!(x!?AAQS8}6Z4c&6q=@Ws9O`-d#q0GHg;^sS%6+z4Va=%%>d$Ou)+;JIehP8>?$7*n`{aY2LMAg4dNw?YE>1sme@pkmd+slVdQ)yq z)IM@_F@xYS1@n0qm;_#FFE{#ZJ$rY;-ZH~PChdBZF&pdh&JiPepYIV`DR z%G3PB%fgHFcUp4F7d}pZa>wDj`H7v4c@ux1d)pFq_Otj=e}~5+eRJ~mJwD9Vnl@9n z|NfHC`=;OH+Sl>Z=*P0hW_p#UmD{#5d|Fy{W>;>G{h1F1`pOT#E0>;knp>N>xBnsk zZ7ZdyQ|?pt_n*JZRvts?XP1%*f4Uz0%#lp6 z?!7iwsW#Nx{AZ-7#jeN+Hx8;xKMXckzv3m`u646y$KKZ`Y@KRD%eF^XmOQw(cGi5E z9qDrS8uQGv@2GG6qowsd>;8O;g8iOvW-@<2b9i;s|Du2O+@G$@tUfON&+4t{f2AG& z8BT;-*qFT$ZDn9!U`z6LcVTb`&OF1T-xg+fB0=7#I$Fx;Tb-96uU*khj@Dpm^1r!1Bumo^CHSmQ0@E&d<5>k=~`o ztj_6$Nso#dm^`x5WjsByChc0XeMxA1Lj9!)SD5X#{!4x&`^aqxkH(KbtCc1kUVBf? znC+0T#!``XIlEe47P(_@jU9Fw|F8@@r?n$W)w)4!ZT#Bj{?cYl59;0=d}iJEEAf{& z!~m_emz`>(3c^$J(~ lB{%r}zfy9oVflRqrM|Y$@-w*RGcYhPc)I$ztaD0e0stySJL&)c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_5.png b/src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_5.png new file mode 100644 index 0000000000000000000000000000000000000000..ffb44497853b67bb2deeb865789a5ef79f9e245d GIT binary patch literal 1224 zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU=ZM7V_;w?XQ+*2U|_DV3W+EQN-S3>D9TUE z%t=)!sVqoUNUg|BV_>MbwRURmrZ*ZKZT~lSMLIbM#`LL0nOg5SJ^%WVcXod(cU9-D zQSlO(z|OnX{(spoc5(Gsja8MWGn)EjUpV>6M567v;IS*8Gc`^qKDS(E^L*-$WXsQSw>JvS zbIU(|aYB!;B9GH0rY9B49;(WeADsJP%7g_+4qoV&m@05+@|}x2t0&vkPujiIr?+4( zSJb5t4|B^|Mc0n+ylq_K+`IhwYW`jCeDtpO-}$<)^8MS0*iO!wUMAvOeT1v|yF^#= z{NB=%wnMb`cC=fuP9f_?UK8zGUUMQRygfJ3T<^}#x9_Khw@57Qe5kw0>qe@a&!#nr z3LT3J#knnWL}X0D0=Sz`TZ-NL`|R%hQ+(&8or5KgNf^JAvK6Yke6FoZe(7nONiW^k z2~6){a*=4hQ{lwzu;cukSM%=gy(szmsZ;_p$E$g1$C*wC@e7Ck42n*CF0){{_mZbK zq;hVXG>9DBt|Y;yutA0IRHwMGVcL_62bU`paRzE}Y*>}!Bb&oi*3^0WL$Bqr-RoA! zB+2M9EWBaDW@0IFper!YUQE_B#3Vx{)HmzZtgTBXBwd;^X=$OGD7Toe?#!9d+a4WU zyjtD7{CwP|Ck@Iz#i!hE7N1*sAhYph(@j>Xr6DU99$RG^x;m~{SNl|Y@9K4#Td!W< zGtGC~hQ#0bnZ~zjPDf|n3GmW2%Uv1yd0O<#61E)&zGxX9$fU)~~<3%*6)@5lw*KK0L?(|W;1Zg;=w7Ya8xF02&P ze?0%okGt9VqUuSO9c=+wi0MWo=-3Np#d^ zo8#F%8=Bm?cgC}y<*HmiZ=tbSOxez2m-$m3b>C?Czq)mba#?md`t~c6VWL0Kw(o^wSs^7&r?&B8wRq_zr_G?NMQuIx|Pqy)6& zDwaPEVPIf5<>}%W;&J@#)Qh}_6?k0UcG$kknG|T`Wu`d0WXc53ID4+3C0cA(<^R6) z?C3vjS$=|TB45MTK4W9XumonK4=jB51RM@AY~zz(WzSplxuDMP%AF3z;vGV^5BE2& zV+;*#x2xUNf2B8HZRs60-RW+N=Xpe@-z~rHFt>R1-MrkDt7hHw=va1N|Cej1>GL;i z3}K97`g_xvA{PA;$yt&iJk8|%=j*OYx0cO+a=c*q0}H;@i+_Y(68vjYz!|BK5I&!c lYm4~DWFPnZK>z|dM z<;7EpwryXGpH$5i_&aHO_0I0!o03moIQq#*eui z{7`P9W=p$_uI06uJM-A7@2j^7lTmDp+B5qd!=jsTj776*1TWsyryTUT<(ie z)RSZFFksvHu|=#QAl~xo%=2CA zVmjjzj(wsBCo~)o^O(YvJJC`|v7gOOa^mI+Jq3qVF(*qm2)=1KaqO`9GnZMr*3@(q zZeeIiy6m#Ra}wj}YS+Im`70K#Y5MFD+U#cPJFA&R-lRp~u*Kq{DK8cu6G+}NBgxD# zKkMM4nX0EdCqLl0ED}_5GRVvFaAw=fo|}?Vmg0IrH5Y}vbi#s8TAxb)zWZHb|L(V$ z=cld?$@wppRdO|J)y_a?P1E~ZTE%8>y;9`9w)Ew`Y<}Ca*DIe-zO|^zzgO+dVk^ zFkt7eXUn@w-mBNjt^cidaQnKuzZ>lPuh&j~@NlD~xX6voOZR%OpId0tcc*j*&xYD* zPYz#-EPhwtwa&!ul^p@Z2VZlqg?>~<$eQ=!NztxWa4C1BsyQUSy3o|eanM1_lQ95>H=O_9tvo0@{-QZ@6z`U|`tl>EamTar|w_LEgg( z0-s&qOiUJb%QR1(l5;3k==((%r_jTJpFFg$Uh?#4Klo?^E1!p&VC228A)-sCusCd= zwR$U)fZ##R342VdRBk@n_1s@pYRg6AIWGMTKeHHron^W-s}Se{g5q u+Aw9&ZFT8crTq3^S^`q9`scp-B;PCQD9TUE z%t=)!sVqoUNUg|BV_>MbwRUQ>&}{`C*Z+~O(-SybjudTZocV6S>G!O{&m+}yv(&at z{OaT`5MKW`=N-FVmr#tr))`4L1+5}N>3eQ$ivK-%n!&rrkA8A~w%)n;G<(~L$1lHU zt_ikx)(dCm4c>R}^xVA5{l4zv=PxgOKe1XW`1~^E^SkFfyR$TN`r)%h&+=FQ_R6rT zox|>G*yZrzX5rTfkL9XG_Ww7k6DY`AR^5?$UusFJ zl|!dM^aP$tfe59_g&y5T+Jdh#9!#ES`TKx2#{>@XBHkREvZhUi{k+mk7oI+}Tf&{& zfy1nq$@i1w1}A|p{cO(ssUI!+T~xZdJSWN2@&qRJNd1*a2fqtwOP z=EbdaTvJu(_}60MIi4dH0v*}v4Q$lL4hs9ZSnj8CW z?VZ7Seuv@a>q}^#y{W3S#oauvG<2}o_{pAC0ljpeQ8n0T|&oP>KGUp*pj^6 zT^JldaQQd=GzJC+&H|6fVg?4j!ywFfJby(B0|NtliKnkC`x7=P0d2OT3tr9)3=AEf zE{-7{$KOr~^Optz`I*Bl&foIB)v zDKsc2>+ZYUXk(^4+4ujFH2yyPd0Lw1;>V!Lzc?GVKDPb$h>eeRM-2mm!fmVDo1d)n zlI)1gTe~DWM4f%uE$n literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_8.png b/src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_8.png new file mode 100644 index 0000000000000000000000000000000000000000..4c6e3a89298ebc8112bf9f16c506797163af3cb5 GIT binary patch literal 1186 zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU=ZM7V_;w?XQ+*2U|_DS3W+EQN-S3>D9TUE z%t=)!sVqoUNUg|BV_>MbwRUQ5*=r4+w*T3pn_0XSRHila&M7W8I6Yt7XR?~_r7vX< zelSORIQ1X6^6&5Em+~fly8=T#PYJ$tA*nBtE3U@+_RlA}=YHpGvP-N{R{!@yL4eif zu%%D#OYsw5tqwk#^nQEMrsSI+Q(qkZWF*n{T=3YX+GG@qL;+w*Mdk4($gR=0Kv z#ksvdesMz2DgiddOva)+mp=%dTm8Umhqp(-qlAin#WTMr-?{kot6t?lmGbCFsfT8w zTb3@J@UCdflQsRt=Ef!Nz0;r1=CATmyZ%kHd~f*sy>nM<8!85OUR$&+HEEw?p}W@M zInyriPJeVa?fi>ARXK$)$6|N;4rA_3cP)#a9-4c*My^KTh=wnZ|3v3QQz{Kk7PT}g z^qq^j^UTLqDN0;fEX5TB)mfd>Ixj(l0)wR9P{7zqwKDEB&r8lHdAa>$3BLw(DNbpUzPG{`JXkFHJAk&wpcI_dM+Gdjeczje&uIv%n*=n1O-sFbFdq&tH+kz`(#>;_2(k{)A0RKwD!Sn|luf1H&p$ z7sn8f<8P-1avfF>a7l0ee&XF<{)>xyEKhz}%;sh2w&}u`#mtK~NLKFfGnsSZZeaG? zYbt^c3?KS8zRNb|PEk3@zO{YH#P22lQ=1O5Z|z#LiQ)ELhIq@yuhXL^uxUs(bgWR( zTxm9A?b-Lq8pY)kY|a=m$fVxE9fuhZ#Hi{c6|k;5hxI{Mh~nX@42HJZIiq w8aFv)cgys@scNg=y1qG@^UB@ilRabay}*gu#WUR*7#J8lUHx3vIVCg!0A{T#{r~^~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_9.png b/src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/cube_9.png new file mode 100644 index 0000000000000000000000000000000000000000..6ef6c65e7376ffd58fe9e5b7f94651b4548655b8 GIT binary patch literal 1225 zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU=ZM7V_;w?XQ+*2U|?>m3W+EQN-S3>D9TUE z%t=)!sVqoUNUg|BV_>MbwRU>$rq^mbZU3`HW1Cb3giaqcJ99_2JSj3!9UjzNN`C8lY#_IStFRXr-=wmy-tx2Y6Uh%2o*v|6XGrx!R&;4NX z%cj3A4|j0CYgyjHqRQ7+=yHF4-8}1EeDfzg*Du;WWu>58u%q`Z zu9uqb!RM;x?Vh+$JHO@V%4spHrW?}c z8z&t0J9sdSc`L)lnB<2K&H3x4t!>`(_$EpuulaHDh0l-tTUP_J_m<48Hu`%)^wFfa z29Cv(U;Ae;a%`U&Ec;WocU?q&IJ>k%fcq?2X`RzmGa{zuZxv;G&R`p>q z=yFbWnC#5BMnd#!^2I=B*Jih%t4o%xi}dEwRP)u0e06_C(!oV5RgH^JhuKt=e0}ol z-A(UlG9NfE&)F3CZBDUfK~%!7gwjSg&DCoXdsnZ^+ittMBZxOL5PS4MuG7QHiQc8L7SkHR~@U#SRs zedN)F&C;eFXZ6%})cb8QW;X2Pd323)!Gfj6(Q}fg_^mUJ-t-_~MT1m!`{rVGwx*4n zG9GL1mfpGjj>qHhJ5NL{U%mLpUv%Z7Z;}1ZxdFFN|8V7G4zO>vUGAOnV}s+uDnb3f z<}dfG*V8_8=ABFa+A9TKMJd|KGLyXO5kco4CK{$z?gWmFu>)vwTi2 zkowlY!vETZ{BFD6>G#UR?FOVOsq8ujza* z{)*Y%H~1@bK4jmOjr&df@2h;d^M|o}-!fCLjpA>2pRyCGKKUu!)$#q`Jw?s(jDJ!W z)HB5Gv^O~^7j}e!fq^Z_+ueo10R)$S(@$eyVBjq9h%9Dc;5!V$jK}j=q%bfru$OrH zy0SlElM>K0=#SYO!N9<9#M8ww#N+teDF=BE8*sSVPyEi&GwJNENVi5mC;r~mD>iX* zwa5KZo&VwZ`5O*91dI=#X)`Rp&zMvD`g#;Um=c~v&R)u(^q;#iKBmDk!8VbBfq}u()z4*}Q$iB}4<9%% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/flare.png b/src/main/resources/assets/ebwizardry/textures/entity/radiant_totem/flare.png new file mode 100644 index 0000000000000000000000000000000000000000..c3c954504e2df15b35af20a24f4b840fcfdf30c2 GIT binary patch literal 4875 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ebwizardry/textures/spells/healing_totem.png b/src/main/resources/assets/ebwizardry/textures/spells/radiant_totem.png similarity index 100% rename from src/main/resources/assets/ebwizardry/textures/spells/healing_totem.png rename to src/main/resources/assets/ebwizardry/textures/spells/radiant_totem.png