From e075550beb320c19bc715bc187c31821e1c62e30 Mon Sep 17 00:00:00 2001 From: Shinare Date: Sat, 5 Apr 2025 23:23:44 +0300 Subject: [PATCH] Adding Staff of Saruman the White --- .../com/zivilon/cinder_loe/CinderLoE.java | 8 ++ .../render/RenderSarumanWhiteFireball.java | 50 ++++++++++ .../cinder_loe/coremod/LOTRWeaponLinker.java | 2 +- .../entity/SarumanWhiteFireball.java | 92 ++++++++++++++++++ .../cinder_loe/items/SarumanWhiteStaff.java | 46 +++++++++ .../mixins/MixinEntityLivingBase.java | 29 +++--- .../assets/cinder_loe/lang/en_GB.lang | 1 + .../assets/cinder_loe/lang/en_US.lang | 1 + .../assets/cinder_loe/misc/particles.png | Bin 5501 -> 7160 bytes .../items/large/sarumanWhiteStaff.png | Bin 0 -> 5492 bytes .../lotr/textures/items/sarumanWhiteStaff.png | Bin 0 -> 4321 bytes 11 files changed, 212 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/zivilon/cinder_loe/client/render/RenderSarumanWhiteFireball.java create mode 100644 src/main/java/com/zivilon/cinder_loe/entity/SarumanWhiteFireball.java create mode 100644 src/main/java/com/zivilon/cinder_loe/items/SarumanWhiteStaff.java create mode 100644 src/main/resources/assets/lotr/textures/items/large/sarumanWhiteStaff.png create mode 100644 src/main/resources/assets/lotr/textures/items/sarumanWhiteStaff.png diff --git a/src/main/java/com/zivilon/cinder_loe/CinderLoE.java b/src/main/java/com/zivilon/cinder_loe/CinderLoE.java index f8b8022..d79d3ed 100644 --- a/src/main/java/com/zivilon/cinder_loe/CinderLoE.java +++ b/src/main/java/com/zivilon/cinder_loe/CinderLoE.java @@ -285,6 +285,7 @@ public class CinderLoE { public static Item pallandoStaff; public static Item alatarStaff; public static Item sarumanStaff; + public static Item sarumanWhiteStaff; // Relics public static Item welfRelic; @@ -379,6 +380,7 @@ public class CinderLoE { //Misc EntityRegistry.registerModEntity(EntityWarDart.class, "WarDart", (entityID + 44), this, 64, 1, true); EntityRegistry.registerModEntity(SarumanFireball.class, "SarumanFireball", entityID + 0, this, 64, 10, true); + EntityRegistry.registerModEntity(SarumanWhiteFireball.class, "SarumanWhiteFireball", entityID + 61, this, 64, 10, true); EntityRegistry.registerModEntity(LOTREntitySauron.class, "LOTREntitySauron", (entityID + 28), this, 64, 1, true); EntityRegistry.registerModEntity(UtumnoSlaveTrader.class, "UtumnoSlaveTrader", (entityID + 30), this, 64, 1, true); @@ -555,6 +557,7 @@ public class CinderLoE { pallandoStaff = (new PallandoStaff()).setUnlocalizedName("lotr:pallandoStaff").setTextureName("lotr:pallandoStaff"); alatarStaff = (new AlatarStaff()).setUnlocalizedName("lotr:alatarStaff").setTextureName("lotr:alatarStaff"); sarumanStaff = (new SarumanStaff()).setUnlocalizedName("lotr:sarumanStaff").setTextureName("lotr:sarumanStaff"); + sarumanWhiteStaff = (new SarumanWhiteStaff()).setUnlocalizedName("lotr:sarumanWhiteStaff").setTextureName("lotr:sarumanStaff"); // Relics welfRelic = (new WoodElfRelic()).setUnlocalizedName("lotr:welfRelic").setTextureName("lotr:welfRelic"); unitLevelTool = (new unitLevelTool()).setUnlocalizedName("lotr:unitLevelTool").setTextureName("stick"); @@ -621,11 +624,13 @@ public class CinderLoE { ItemRegistration.register(pallandoStaff, "pallandoStaff", 6701); ItemRegistration.register(alatarStaff, "alatarStaff", 6702); ItemRegistration.register(sarumanStaff, "sarumanStaff", 6703); + ItemRegistration.register(sarumanWhiteStaff, "sarumanWhiteStaff", 6705); linkLOTRWeapon(radagastStaff, "radagastStaff"); linkLOTRWeapon(pallandoStaff, "pallandoStaff"); linkLOTRWeapon(alatarStaff, "alatarStaff"); linkLOTRWeapon(sarumanStaff, "sarumanStaff"); + linkLOTRWeapon(sarumanWhiteStaff, "sarumanWhiteStaff"); //Relics ItemRegistration.register(welfRelic, "welfRelic", 6704); @@ -961,6 +966,7 @@ public class CinderLoE { RenderingRegistry.registerEntityRenderingHandler(CorruptSkeletonArcher.class, new RenderCorruptSkeleton()); RenderingRegistry.registerEntityRenderingHandler(SarumanFireball.class, new RenderSarumanFireball()); + RenderingRegistry.registerEntityRenderingHandler(SarumanWhiteFireball.class, new RenderSarumanWhiteFireball()); RenderingRegistry.registerEntityRenderingHandler(Renegade.class, new RenderRenegade()); RenderingRegistry.registerEntityRenderingHandler(RenegadeCaptain.class, new RenderRenegade()); RenderingRegistry.registerEntityRenderingHandler(Wraith.class, new RenderWraith()); @@ -1192,6 +1198,7 @@ public class CinderLoE { CinderCore.registerItemFallback(Item.getIdFromItem(pallandoStaff), Item.getIdFromItem(LOTRMod.gandalfStaffWhite), "cinder_loe", "1.0"); CinderCore.registerItemFallback(Item.getIdFromItem(alatarStaff), Item.getIdFromItem(LOTRMod.gandalfStaffWhite), "cinder_loe", "1.0"); CinderCore.registerItemFallback(Item.getIdFromItem(sarumanStaff), Item.getIdFromItem(LOTRMod.gandalfStaffWhite), "cinder_loe", "1.0"); + CinderCore.registerItemFallback(Item.getIdFromItem(sarumanWhiteStaff), Item.getIdFromItem(LOTRMod.gandalfStaffWhite), "cinder_loe", "1.4"); // == Relics == CinderCore.registerItemFallback(Item.getIdFromItem(welfRelic), Item.getIdFromItem(LOTRMod.rhinoHorn), "cinder_loe", "1.2"); // == Specials == @@ -1263,6 +1270,7 @@ public class CinderLoE { CinderCore.registerEntityFallback(CorruptOrc.class, LOTREntityGundabadOrc.class, "cinder_loe", "1.2.3"); CinderCore.registerEntityFallback(SarumanFireball.class, LOTREntityGandalfFireball.class, "cinder_loe", "1.0"); + CinderCore.registerEntityFallback(SarumanWhiteFireball.class, LOTREntityGandalfFireball.class, "cinder_loe", "1.4"); CinderCore.registerEntityFallback(Renegade.class, LOTREntityBandit.class, "cinder_loe", "1.0"); CinderCore.registerEntityFallback(RenegadeCaptain.class, LOTREntityBandit.class, "cinder_loe", "1.1"); CinderCore.registerEntityFallback(Wraith.class, LOTREntityMarshWraith.class, "cinder_loe", "1.0"); diff --git a/src/main/java/com/zivilon/cinder_loe/client/render/RenderSarumanWhiteFireball.java b/src/main/java/com/zivilon/cinder_loe/client/render/RenderSarumanWhiteFireball.java new file mode 100644 index 0000000..ec581ab --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/client/render/RenderSarumanWhiteFireball.java @@ -0,0 +1,50 @@ +package com.zivilon.cinder_loe.client.render; + +import lotr.client.LOTRClientProxy; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +import com.zivilon.cinder_loe.entity.SarumanWhiteFireball; + +public class RenderSarumanWhiteFireball extends Render { + public static final ResourceLocation particlesTexture = new ResourceLocation("cinder_loe:misc/particles.png"); + + protected ResourceLocation getEntityTexture(Entity entity) { + return particlesTexture; + } + + public void doRender(Entity entity, double d, double d1, double d2, float f, float f1) { + GL11.glPushMatrix(); + GL11.glTranslatef((float)d, (float)d1, (float)d2); + GL11.glEnable(32826); + bindEntityTexture(entity); + Tessellator tessellator = Tessellator.instance; + drawSprite(tessellator, 32 + ((SarumanWhiteFireball)entity).animationTick); + GL11.glDisable(32826); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glPopMatrix(); + } + + private void drawSprite(Tessellator tessellator, int index) { + float f = (index % 8 * 16 + 0) / 128.0F; + float f1 = (index % 8 * 16 + 16) / 128.0F; + float f2 = (index / 8 * 16 + 0) / 128.0F; + float f3 = (index / 8 * 16 + 16) / 128.0F; + float f4 = 1.0F; + float f5 = 0.5F; + float f6 = 0.25F; + GL11.glRotatef(180.0F - this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(-this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F); + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, 1.0F, 0.0F); + tessellator.setBrightness(15728880); + tessellator.addVertexWithUV((0.0F - f5), (0.0F - f6), 0.0D, f, f3); + tessellator.addVertexWithUV((f4 - f5), (0.0F - f6), 0.0D, f1, f3); + tessellator.addVertexWithUV((f4 - f5), (f4 - f6), 0.0D, f1, f2); + tessellator.addVertexWithUV((0.0F - f5), (f4 - f6), 0.0D, f, f2); + tessellator.draw(); + } +} \ No newline at end of file diff --git a/src/main/java/com/zivilon/cinder_loe/coremod/LOTRWeaponLinker.java b/src/main/java/com/zivilon/cinder_loe/coremod/LOTRWeaponLinker.java index 75f95db..469b3de 100644 --- a/src/main/java/com/zivilon/cinder_loe/coremod/LOTRWeaponLinker.java +++ b/src/main/java/com/zivilon/cinder_loe/coremod/LOTRWeaponLinker.java @@ -20,7 +20,7 @@ public class LOTRWeaponLinker implements IClassTransformer { // Can add any number of items, append with comma return addLinks(basicClass, "spearRedDwarf", "crossbowRedDwarf", "swordRedDwarf", "battleaxeRedDwarf", "pikeRedDwarf", "daggerRedDwarf", "daggerRedDwarfPoisoned", "hammerRedDwarf", - "radagastStaff", "alatarStaff", "pallandoStaff", "sarumanStaff", "maceWarlord", + "radagastStaff", "alatarStaff", "pallandoStaff", "sarumanStaff", "maceWarlord", "sarumanWhiteStaff", "spearLimwaith", "tridentLimwaith", "daggerLimwaith", "daggerLimwaithPoisoned", "truncheonLimwaith", "battleaxeLimwaith", "blowgunLimwaith", "frostblade", "spearsolidgold", "whip", "spearUnnamed", "welfRelic", "daggerVoid", "swordBree", diff --git a/src/main/java/com/zivilon/cinder_loe/entity/SarumanWhiteFireball.java b/src/main/java/com/zivilon/cinder_loe/entity/SarumanWhiteFireball.java new file mode 100644 index 0000000..f1882f2 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/entity/SarumanWhiteFireball.java @@ -0,0 +1,92 @@ +package com.zivilon.cinder_loe.entity; + +import cpw.mods.fml.common.network.simpleimpl.IMessage; + +import lotr.common.LOTRLevelData; +import lotr.common.LOTRMod; +import lotr.common.entity.npc.LOTREntityNPC; +import lotr.common.entity.animal.LOTREntityHorse; +import lotr.common.entity.projectile.LOTREntityGandalfFireball; +import lotr.common.fac.LOTRFaction; +import lotr.common.network.LOTRPacketHandler; +import lotr.common.network.LOTRPacketWeaponFX; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.attributes.IAttributeInstance; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.projectile.EntityThrowable; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; + +import java.util.ArrayList; +import java.util.List; + +public class SarumanWhiteFireball extends LOTREntityGandalfFireball { + public SarumanWhiteFireball(World world) { + super(world); + } + + public SarumanWhiteFireball(World world, EntityLivingBase entityliving) { + super(world, entityliving); + } + + public SarumanWhiteFireball(World world, double d, double d1, double d2) { + super(world, d, d1, d2); + } + + protected void onImpact(MovingObjectPosition m) { + if (!this.worldObj.isRemote) + if (m.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { + explode((Entity)null); + } else if (m.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY) { + Entity entity = m.entityHit; + if (isEntityVulnerable(entity)) + explode(entity); + } + } + + private void explode(Entity target) { + if (this.worldObj.isRemote) + return; + this.worldObj.playSoundAtEntity((Entity)this, "lotr:item.gandalfFireball", 4.0F, (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F); + LOTRPacketWeaponFX packet = new LOTRPacketWeaponFX(LOTRPacketWeaponFX.Type.MACE_SAURON, (Entity)this); + LOTRPacketHandler.networkWrapper.sendToAllAround((IMessage)packet, LOTRPacketHandler.nearEntity((Entity)this, 64.0D)); + if (target != null && isEntityVulnerable(target)) + target.attackEntityFrom(DamageSource.causeMobDamage(getThrower()), 10.0F); + List entities = this.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, this.boundingBox.expand(6.0D, 6.0D, 6.0D)); + if (!entities.isEmpty()) + for (int i = 0; i < entities.size(); i++) { + EntityLivingBase entity = entities.get(i); + if (entity != target && isEntityVulnerable((Entity)entity)) { + float damage = 10.0F - getDistanceToEntity((Entity)entity) * 0.5F; + if (damage > 0.0F) + entity.attackEntityFrom(DamageSource.causeMobDamage(getThrower()), damage); + } + } + setDead(); + } + + private boolean isEntityVulnerable(Entity entity) { + if (entity == getThrower()) + return false; + if (!(entity instanceof EntityLivingBase)) + return false; + if (entity instanceof EntityPlayer) + return (LOTRLevelData.getData((EntityPlayer)entity).getAlignment(LOTRFaction.HIGH_ELF) < 0.0F); + return !LOTRFaction.HIGH_ELF.isGoodRelation(LOTRMod.getNPCFaction(entity)); + } + + protected float func_70182_d() { + return 1.5F; + } + + protected float getGravityVelocity() { + return 0.0F; + } +} \ No newline at end of file diff --git a/src/main/java/com/zivilon/cinder_loe/items/SarumanWhiteStaff.java b/src/main/java/com/zivilon/cinder_loe/items/SarumanWhiteStaff.java new file mode 100644 index 0000000..68984f6 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/items/SarumanWhiteStaff.java @@ -0,0 +1,46 @@ +package com.zivilon.cinder_loe.items; + +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import java.util.List; +import lotr.common.LOTRCreativeTabs; +import lotr.common.LOTRLevelData; +import lotr.common.LOTRMod; +import lotr.common.fac.LOTRFaction; +import lotr.common.network.LOTRPacketHandler; +import lotr.common.network.LOTRPacketWeaponFX; + +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumAction; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.PotionEffect; +import net.minecraft.potion.Potion; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; + +import com.zivilon.cinder_loe.items.WizardStaff; +import com.zivilon.cinder_loe.entity.SarumanWhiteFireball; + +public class SarumanWhiteStaff extends WizardStaff { + public SarumanWhiteStaff() { + super(); + } + + public ItemStack onEaten(ItemStack itemstack, World world, EntityPlayer entityplayer) { + entityplayer.swingItem(); + itemstack.damageItem(2, (EntityLivingBase)entityplayer); + world.playSoundAtEntity((Entity)entityplayer, "mob.ghast.fireball", 2.0F, (itemRand.nextFloat() - itemRand.nextFloat()) * 0.2F + 1.0F); + if (!world.isRemote) { + world.spawnEntityInWorld((Entity)new SarumanWhiteFireball(world, (EntityLivingBase)entityplayer)); + LOTRPacketWeaponFX packet = new LOTRPacketWeaponFX(LOTRPacketWeaponFX.Type.MACE_SAURON, (Entity)entityplayer); + LOTRPacketHandler.networkWrapper.sendToAllAround((IMessage)packet, LOTRPacketHandler.nearEntity((Entity)entityplayer, 64.0D)); + } + return itemstack; + } +} \ No newline at end of file diff --git a/src/main/java/com/zivilon/cinder_loe/mixins/MixinEntityLivingBase.java b/src/main/java/com/zivilon/cinder_loe/mixins/MixinEntityLivingBase.java index a566896..66c73be 100644 --- a/src/main/java/com/zivilon/cinder_loe/mixins/MixinEntityLivingBase.java +++ b/src/main/java/com/zivilon/cinder_loe/mixins/MixinEntityLivingBase.java @@ -199,26 +199,23 @@ public abstract class MixinEntityLivingBase extends Entity { @Dynamic private void check_cauldron() { - try { - Class target_class = EntityLivingBase.class; - - while (target_class != null) { - Method[] methods = target_class.getDeclaredMethods(); - - for (Method method : methods) { - if (method.getName().equals("damageEntity_CB")) { - cauldron_method = method; - return; - } - } + try { + Class target_class = EntityLivingBase.class; + Method[] methods = target_class.getDeclaredMethods(); + + for (Method method : methods) { + if (method.getName().equals("damageEntity_CB")) { + cauldron_method = method; + return; } - } catch (Exception e) { - e.printStackTrace(); } - - return; + } catch (Exception e) { + e.printStackTrace(); } + return; +} + @Dynamic public boolean entitydamage_cauldron(DamageSource source, float damage) { boolean return_value = true; diff --git a/src/main/resources/assets/cinder_loe/lang/en_GB.lang b/src/main/resources/assets/cinder_loe/lang/en_GB.lang index 9206c9c..2b6899c 100644 --- a/src/main/resources/assets/cinder_loe/lang/en_GB.lang +++ b/src/main/resources/assets/cinder_loe/lang/en_GB.lang @@ -1,2 +1,3 @@ item.lotr:sarumanStaff.name=Staff of Saruman of Many Colours +item.lotr:sarumanWhiteStaff.name=Staff of Saruman the White item.lotr:boarArmorRedDwarf.name=Red Dwarven Boar Armour diff --git a/src/main/resources/assets/cinder_loe/lang/en_US.lang b/src/main/resources/assets/cinder_loe/lang/en_US.lang index 399e4aa..5c645fd 100644 --- a/src/main/resources/assets/cinder_loe/lang/en_US.lang +++ b/src/main/resources/assets/cinder_loe/lang/en_US.lang @@ -102,6 +102,7 @@ item.lotr:radagastStaff.name=Staff of Radagast the Brown item.lotr:pallandoStaff.name=Staff of Pallando the Blue item.lotr:alatarStaff.name=Staff of Alatar the Blue item.lotr:sarumanStaff.name=Staff of Saruman of Many Colors +item.lotr:sarumanWhiteStaff.name=Staff of Saruman the White item.lotr:welfRelic.name=Horn of the Greenwood Stag diff --git a/src/main/resources/assets/cinder_loe/misc/particles.png b/src/main/resources/assets/cinder_loe/misc/particles.png index 49e035d032305c571707f8389eb0a4946e1cd846..4c771424c4f256b0e5af9102ebc65fdd966164ce 100644 GIT binary patch delta 3531 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 delta 2110 zcmah~dsNcd7XASu(r8-%Bme+f007YdAZo@_1M)u{3V{JIweO4?Yt(!tW(7tN`0rMr=D4r? zf|_ss8nco^gg^mZwJlJCq~-={`)@T4oz(yWSBf;Lv9gfAZ=pKJP_6#3RGROu4J15~ zfVXu}7a)-AoCqW*lKln(QGGhulhqACivHWuN~MA)=wsPbQ;@%LEdqv)d9ds1$Ks8d zHCkR}dWTaO>vrIkr@pbFrSnS$1EZ(Ht3M1%D}>3y4ag)O#hGF$`7TZ6qh%B3LXmaU zCuG&f@_H)>Z$G5LB&;j%54d-ZGH&+!BU72!jqY0F!$00GI5nw|Pz#K_ zXdu6Z`ETzCjf9E|Z;+h=XOY-9ns||Oz622@1F}o=!?uVFZde*oEwrpEgn4^v30V2u9?jYIDhGowVvmrXz+J-wiQXE+aSUIU0w^kD<6e5{u zPo~%sZ3%WcE^tGLLk3>W-rxtGVH>Y?6t`8B{A(==tK(z2y-vZ4rAF3w+ z1ylgwihDDigV#3!$Dvq^p`*qxd@(<)PgcGceK0&@D5y&1 z-Hs8eQuc?RGG_wutDtFMImH0isn$X>NLikV5KQHjl^6zRHT)pqs&Rx?bsH^Eqdl`+W z3(0b>0yvnQlG&rNC)f1Q+kv{Etni0GRII@CXex{{plw_!_^}aeX(?JexM(!W>Gt^J*f>KN6%i@P-_FLnPx|1Rr|PINKpn9US6d=cDe zy#V9;AA^qrn|f>Fxc3L2U5JPt`E@;D#-G17qaPf<^k7gjNse4K^%Qx=q!}v>b#8GP z;snoM-W1=q9x((RM>+ST(hvdjr{~hV2-5?VuZBBae8I-ppPFKmbeGuGKfiF<7L4n` zKh<%e`Ixr9tq#D(rqV*^BfeyYeF<{tk|wl7@*@La=+sXWuN2FRcd*tno4)0rDWppt zJEkS~-TTl|&Oij*I&+p2{v3QH)v12&+-wLw?12xa-zN)(>Fgy&$06rUSrvMFVRy?CVJ-WSbm97dMbylLh-=p|Ms0Z~aJAsZ{@VN6MGr0|vpEhK zT%)l)ro&I8n519hiF1Y)kDt)5Dn;F*rws$3dtO6G;JFtWD)Y6W-rV#@szMHW|M(_m z5HPAOq9e;udl4c9Coj8f8$-h~=_YXvZ0Z2k4SadKW3o5r?dO?z?t8C0SgF|!9h|mJ zrIkB&tDgVSf~9B64ZR5O+i50CRh6EG2{)aW~pp+y<7q z=Ud=MwV3`qKe2zS-^rga=>ex*`BAIOk$a|{`Y##vnG6c8mxn@_vHDfY($;WRICo?W zIu!)Ton0zi(xWS^P-s-6ar@QW^M&7bb@{%pXP}$UzW_}3D{!r7m2a%KkEB1JlREER z;+ir0A2jB=NAhz^`KVW5!v0(%P%cC_!|vcF5Q)f6<1)d+6UHg5PTRY>AGZw77=}Ln ze6hV}uHC=!7gRk~I4+Sn;N-}+)*LMcmLDnCe-rZ82Zs7r$N$m85T$O-X^g|DRvTgEW2JfR K^c1->PyGgwGlty& diff --git a/src/main/resources/assets/lotr/textures/items/large/sarumanWhiteStaff.png b/src/main/resources/assets/lotr/textures/items/large/sarumanWhiteStaff.png new file mode 100644 index 0000000000000000000000000000000000000000..0262cb5382dedd9ae8a7d1e849ad106ba871650f GIT binary patch literal 5492 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 Q8%#H0&;r4MS+T4C1&#PAAOHXW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lotr/textures/items/sarumanWhiteStaff.png b/src/main/resources/assets/lotr/textures/items/sarumanWhiteStaff.png new file mode 100644 index 0000000000000000000000000000000000000000..c5eb5b8f13929d37dd9fa08b5b5da6ab5f24b1b2 GIT binary patch literal 4321 zcmeHKeNYtV8Q;?)6u}l7wegE}H6)6AyL-3ywY?LN1MZ9mCn7?$iSO<19h>{u^LF75 zGz3l32C$@&#+Yam6JyYl4qYMiO9Mo4O_Rib_O_&O$;=`hp$ z$IaaB?(_bh-}^kj_j#VVt##(-B_~c#L=Ys|ZnGA`>yMRh!UXu6`p-K6UfQdQO5{Qi zMuQ>IE%EKSjm0+{XRM{%{O2h?qSM-N=udsv&Do2Dz6iA}AawJ=Pk-@V|gq_ri> zbjPRdQ>SllH8wvp-P_f8h}?R%_|L1GOm)UBzs{VDac7*laZ|DV55Kb2cB=YBd&Y$u zjTbk+w_?KF&T+qU&M{T@X58p{y>#mfp~j8Wj>{eIWE|aa_2)ZETfgjK&j(&WZhN|y zcyBc)uesWIt!mZ8RMj`<4|kNWYP??a{;V}O?9V2>_jDiq#9~z>W2bmr^;m0W&-3S3 zc~hHyl=+KyA2_I*G-*RE#=p7l_iarrt&g7EfAf~A+8b*A&qD`4fn`@A!15|_EM-{H zuLhjx;?)s<5Y`=nm@^_lzRkS+JEl2k8iA^JRjqD#S0Z$}eK8 zysU}CG8QG8BMc<)^D;mqeqTUhA{H#l%fNfZOkijfB6}@ZiNlFziyusW<&iy;p|nM@{v)DRjC4iUIi8IVB)4@h$r zihd3&FR>vZC<|f$RXBl5ESD`92G`NS`20bKV~9Q=4X6P1AR-`0P->F!`-xZ&NzSQ& zBm)6`r-xJoyOb#8C9yoj@;McJK%N^*!LdXB!SawVnhwVjypQ)os04SVMr@g9cQ}VU z6bU?nKN$6bVvj(|f_qr35wR&N(R5-1f$l@RBhZ7nN5K%~a4=SpEmy*`TP>KfKf{Tv zz%kKV9#A}OplMuB8Vxw@rro&FO_MmM0lZG{VmXr4#!%SP-NrU9=uI zX|)F24NN+gGibDc(nYB_mdO=EegKbC@B6Mqg0-lyQlwg|kGd-d!@zW)v_Pp; zND#HdY?$m24`eY^B#J%@rUZp5o$Kn2f5 zT#3UkQ+xpa0}8`eC40}@qwqCrg6sY~E3y!ohnRk=P0fdv9|mou5`s)>SH7xFaW@Bz z@v_~K6Mt#k)G6^vy!Z4BX!@1inpI?cf7gdp;`ljt<(z7Mwe?o_?N;sD_{QSBDbvtb z3)8HV%d5XUP;kzevggW!?W$#clR>F$Hew2}RNTC)C^8>aM4Dd|YvFzfU2 kZ9mQI`Xh34(uBzPx@zBV*3@);1_MLvIr-K%7O&a(Uuw@62mk;8 literal 0 HcmV?d00001