// Script modified by Paralon - 29/08/05 12:12:34 /* Last Update: 29 Aug 2005 * * Added some talent bonuses but not tested * Flametongue; Frosbrand and Rockbitter are not supported yet * * Also add to Globals.cs (for example, after "World.HttpServerPort = 8080;"): * TotemsTimer.TotemsList = new ArrayList(); * new TotemsTimer(1001).Start(); * Without this string totems won't work *if(HelperTools.Utility.Random(0,1) == 1) */ using System; using Server; using Server.Items; using Server.Creatures; using HelperTools; using System.Collections; #region BaseTotem namespace Server.Creatures { public enum TotemTarget { Friends, Enemy } public enum TotemType { Air, Earth, Fire, Water } public class BaseTotems : BaseCreature { public int LifeTime; public int Delay; public int BaseDelay; public TotemType totemType; bool MakeFakeCast; ArrayList AffectedMobs; float Range; TotemTarget target; public Mobile Caster; int SpellID; SingleTargetSpellEffect effectHandler; public BaseTotems() : base() { AffectedMobs = new ArrayList(); Delay = 0; BaseDelay = 0; } public BaseTotems( Mobile caster, int lifetime, int _basedelay, float range, TotemType totemtype, TotemTarget Target, int SpellId, SingleTargetSpellEffect spelleffect, bool Fake ) : base() { AffectedMobs = new ArrayList(); Delay = 0; BaseDelay = 0; MakeFakeCast = Fake; Caster = caster; LifeTime = lifetime; //============================ Delay = 0; BaseDelay = _basedelay; //============================ Range = range; effectHandler = spelleffect; target = Target; SpellID = SpellId; totemType = totemtype; for(int i=0; i= BaseDelay) { this.Delay = 0; //foreach(Mobile mob in this.KnownObjects()) old style. crashes foreach( Object obj in this.KnownObjects() ) { if( obj is Mobile ) { Mobile mob = obj as Mobile; //Console.WriteLine("TOTEM: mob= " + mob.ToString()); if (this.Distance(mob) < Range && !mob.Dead) { if (CanCast(mob)) { if(!mob.AlreadyHaveAura((Abilities.abilities[ SpellID ] as AuraEffect))) { if(MakeFakeCast) FakeCast(SpellID, mob); effectHandler( Abilities.abilities[ SpellID ], this, mob ); if (!AffectedMobs.Contains(mob)) AffectedMobs.Add(mob); } } } } } for(int i = 0; i < AffectedMobs.Count; i++) { Mobile m = AffectedMobs[i] as Mobile; if(m.MapId != MapId || Distance(m) > Range || m.Dead) { m.ReleaseAura((Abilities.abilities[ SpellID ] as AuraEffect)); AffectedMobs.RemoveAt(i); i--; } } } this.Delay++; } private bool CanCast(Mobile mob) { if (target == TotemTarget.Friends && Caster == mob) return true; if(Caster is Character) { Character ch = Caster as Character; if((target == TotemTarget.Friends && ch.GroupMembers.Members.Contains(mob)) || (target == TotemTarget.Enemy && Caster.Reputation( mob ) < 0.4)) return true; } else if ((target == TotemTarget.Friends && Caster.Reputation( mob ) > 0.6) ||(target == TotemTarget.Enemy && Caster.Reputation( mob ) < 0.4)) return true; return false; } public void SummonTotem(Mobile caster, int lifetime, int _basedelay, float range, TotemType totemtype, TotemTarget Target, int SpellId, SingleTargetSpellEffect spelleffect ) { SummonTotem(caster, lifetime, _basedelay, range, totemtype, Target, SpellId, spelleffect, true); } public void SummonTotem(Mobile caster, int lifetime, int _basedelay, float range, TotemType totemtype, TotemTarget Target, int SpellId, SingleTargetSpellEffect spelleffect, bool _fakecast ) { MakeFakeCast = _fakecast; Caster = caster; LifeTime = lifetime; //============================ Delay = 0; BaseDelay = _basedelay; //============================ Range = range; effectHandler = spelleffect; target = Target; SpellID = SpellId; totemType = totemtype; for(int i=0; i 0) { for (int i=0; i< TotemsList.Count; i++) { totem = (TotemsList[i] as BaseTotems); totem.ApplyEffect(); totem.LifeTime--; if (totem.LifeTime < 0 || totem.Dead) { TotemsList.RemoveAt(i); i--; totem.RemoveTotem(); } } } } } } #endregion namespace Server { public class ShamanSpells { #region Spells #region Shock Auras (crashes; makes "burning hands") /*public class EarthShockAura : Aura { private int duration; private int frequency; private Mobile src; private Mobile targ; private SpellTemplate spell; public EarthShockAura(SpellTemplate st, Mobile c, Mobile t, int dur, int freq) { this.spell = st; this.src = c; this.targ = t; this.duration = dur; this.frequency = freq; base.PeriodicAura(new Aura.AuraPeriodicEffect(this.AuraTick), dur, this.frequency); } public void AuraTick() { if(!targ.Dead) this.targ.CancelCast(); } } public class FrostShockAura : Aura { private int duration; private int frequency; private Mobile src; private Mobile targ; private SpellTemplate spell; public FrostShockAura(SpellTemplate st, Mobile c, Mobile t, int dur, int freq) { this.spell = st; this.src = c; this.targ = t; this.duration = dur; this.frequency = freq; this.SpeedModifier = -st.S1; this.OnRelease = new Aura.AuraReleaseDelegate(FrostShockEnd); base.PeriodicAura(new Aura.AuraPeriodicEffect(this.AuraTick), dur, this.frequency); } public void FrostShockEnd(Mobile c) { this.SpeedModifier = 0; c.ReleaseAura((this.spell as AuraEffect)); } public void AuraTick() { } } public class FlameShockAura : Aura { private int duration; private int frequency; private Mobile src; private Mobile targ; private SpellTemplate spell; public FlameShockAura(SpellTemplate st, Mobile c, Mobile t, int dur, int freq) { this.spell = st; this.src = c; this.targ = t; this.duration = dur; this.frequency = freq; base.PeriodicAura(new Aura.AuraPeriodicEffect(this.AuraTick), dur, this.frequency); } public void AuraTick() {//TODO: check if is dead if(!targ.Dead) this.spell.MakeDamage(src, targ, spell.S1); } }*/ #endregion #region Earthbnid Totem (100% working) public static void OnCastEarthbindTotem( BaseAbility ba, Mobile c ) { BaseTotems bt = new BaseTotems(); bt.Name = "Earthbind Totem"; bt.Id = 2630; bt.Model = 4588; bt.SummonTotem(c, 45, 0, 900f, TotemType.Earth, TotemTarget.Enemy, 3600, new SingleTargetSpellEffect(OnCastEarthbind)); } public static void OnCastEarthbind(BaseAbility ba, Mobile c, Mobile target) { AuraEffect st = (AuraEffect)ba; Aura aura = new Aura(); aura.SpeedModifier = (((float)st.S1-100f)/100f); target.AddAura(c, st, aura); } #endregion #region Ancestral Spirit public static void OnCastAncestralSpirit(BaseAbility ba, Mobile c, Mobile target) { SpellTemplate st = (SpellTemplate)ba; if(!c.InCombat) { if(target.Dead) { Character ch = target as Character; ch.ReclaimCorps(); st.Heal(c, ch, SpellDamage.TypeS1); } } else c.CancelCast(); (c as Character).SendMessage(string.Format("OnCastAncestralSpirit: S1={0} S2={1} S3={2}", st.S1.ToString(), st.S2.ToString(), st.S3.ToString())); } #endregion #region Astral Recall public static void OnCastAstralRecall(BaseAbility ba, Mobile c) { //Character ch = c as Character; } #endregion #region +Chain Heal public static void OnCastChainHeal(BaseAbility ba, Mobile c, Mobile target) { SpellTemplate st = (SpellTemplate)ba; int dmg; if(c.HaveTalent(Server.Talents.Purification)) { AuraEffect add = (AuraEffect)c.GetTalentEffect(Server.Talents.Purification); dmg = (int)(st.S1*((100+add.S1)/100)); } else dmg = st.S1; st.Heal(c, target, dmg); Mobile lasttarg = target; int jump = 0; for(int i=0; i additional Frost damage and slowing the //target's movement speed to 75% for 8 seconds. Lasts for 5 minutes. AuraEffect ae = (AuraEffect)ba; Aura a = new Aura(); a.FrostDamageIncrease = ae.S1; c.AddAura(ae, a); a.OnMeleeHitDone = 1; c.Triggers[1] = new Mobile.OnMeleeHitDoneTrigger(OnFrostbrandHit); } public static void OnFrostbrandHit( Mobile c, Mobile target, AuraEffect ae ) { (c as Character).SendMessage(String.Format("Frostbrand: S1={0} S2={1} S3={2}", ae.S1.ToString(), ae.S2.ToString(), ae.S3.ToString())); (c as Character).SendMessage(String.Format("Frostbrand: T1={0} T2={1}", ae.T1.ToString(), ae.T2.ToString())); } #endregion #region Ghost Wolf (not tested) public static void OnCastGhostWolf(BaseAbility ba, Mobile c) { c.Polymorph(171); SpellTemplate st = (SpellTemplate)ba; Console.WriteLine("OnCastGhostWolf st.S1={0} st.S2={1} st.S3={2}", st.S1.ToString(), st.S2.ToString(), st.S3.ToString()); } #endregion #region +Grace of Air Totem public static void OnCastGraceofAirTotem(BaseAbility ba, Mobile c) { BaseTotems bt = new BaseTotems(); bt.totemType = TotemType.Water; bt.Model = 4590; switch(ba.Id) { case 8835: bt.Name = "Grace of Air Totem"; bt.Id = 7486; bt.SummonTotem(c, 75, 0, 400f, TotemType.Air, TotemTarget.Friends, 8836, new SingleTargetSpellEffect(OnTotemGraceofAir)); break; case 10627: bt.Name = "Grace of Air Totem II"; bt.Id = 7487; bt.SummonTotem(c, 75, 0, 400f, TotemType.Air, TotemTarget.Friends, 10626, new SingleTargetSpellEffect(OnTotemGraceofAir)); break; } } public static void OnTotemGraceofAir(BaseAbility ba, Mobile c, Mobile target) { AuraEffect ae = (AuraEffect)ba; Aura a = new Aura(); if((c as BaseTotems).Caster.HaveTalent(Server.Talents.ImprovedGraceOfAirTotem)) { AuraEffect add = (AuraEffect)(c as BaseTotems).Caster.GetTalentEffect(Server.Talents.ImprovedGraceOfAirTotem); a.AgBonus = (int)(ae.S1*(100 + add.S1)/100); } else a.AgBonus = ae.S1; target.AddAura(ae, a); } #endregion #region Grounding Totem public static void OnCastGroundingTotem(BaseAbility ba, Mobile c) { } #endregion #region ++Healing Stream Totem public static void OnCastHealingStreamTotem(BaseAbility ba, Mobile c) { BaseTotems bt = new BaseTotems(); bt.Model = 4587; int duradd; if(c.HaveTalent(Server.Talents.Eventide)) { duradd = (int)((100+(c.GetTalentEffect(Server.Talents.Eventide) as AuraEffect).S1)/100); } else duradd = 1; switch(ba.Id) { case 5394: bt.Name = "Healing Stream Totem"; bt.Id = 3527; bt.SummonTotem(c, 60*duradd, 2, 400f, TotemType.Water, TotemTarget.Friends, 5672, new SingleTargetSpellEffect(OnCastHealingStream), false); break; case 6375: bt.Name = "Healing Stream Totem II"; bt.Id = 3906; bt.SummonTotem(c, 60*duradd, 2, 400f, TotemType.Water, TotemTarget.Friends, 6371, new SingleTargetSpellEffect(OnCastHealingStream), false); break; case 6377: bt.Name = "Healing Stream Totem III"; bt.Id = 3907; bt.SummonTotem(c, 60*duradd, 2, 400f, TotemType.Water, TotemTarget.Friends, 6372, new SingleTargetSpellEffect(OnCastHealingStream), false); break; case 10462: bt.Name = "Healing Stream Totem IV"; bt.Id = 3908; bt.SummonTotem(c, 60*duradd, 2, 400f, TotemType.Water, TotemTarget.Friends, 10460, new SingleTargetSpellEffect(OnCastHealingStream), false); break; case 10463: bt.Name = "Healing Stream Totem V"; bt.Id = 3909; bt.SummonTotem(c, 60*duradd, 2, 400f, TotemType.Water, TotemTarget.Friends, 10461, new SingleTargetSpellEffect(OnCastHealingStream), false); break; } } public static void OnCastHealingStream(BaseAbility ba, Mobile c, Mobile target) { SpellTemplate st = (SpellTemplate)ba; if(target.HitPoints < target.BaseHitPoints) { c.FakeCast(ba.Id, target); if((c as BaseTotems).Caster.HaveTalent(Server.Talents.ImprovedHealingStreamTotem)) { AuraEffect add = (AuraEffect)(c as BaseTotems).Caster.GetTalentEffect(Server.Talents.ImprovedHealingStreamTotem); st.Heal(c, target, (int)((st.S1)*((100+add.S1)/100))); } else st.Heal(c, target, st.S1); } } #endregion #region +Healing Wave public static void OnCastHealingWave(BaseAbility ba, Mobile c, Mobile target) { SpellTemplate st = (SpellTemplate)ba; int dmg; if(c.HaveTalent(Server.Talents.Purification)) { AuraEffect add = (AuraEffect)c.GetTalentEffect(Server.Talents.Purification); dmg = (int)(st.S1*((100+add.S1)/100)); } else dmg = st.S1; st.Heal(c, target, dmg); } #endregion #region +Lesser Healing Wave public static void OnCastLesserHealingWave(BaseAbility ba, Mobile c, Mobile target) { SpellTemplate st = (SpellTemplate)ba; int dmg; if(c.HaveTalent(Server.Talents.Purification)) { AuraEffect add = (AuraEffect)c.GetTalentEffect(Server.Talents.Purification); dmg = (int)(st.S1*((100+add.S1)/100)); } else dmg = st.S1; st.Heal(c, target, dmg); } #endregion #region Lightning Bolt (100% working) public static void OnCastLightningBolt(BaseAbility ba, Mobile c, Mobile target) { SpellTemplate st = (SpellTemplate)ba; st.MakeDamage(c, target, st.S1); } #endregion #region LightningShield (only one ball and no effect) public static void OnCastLightningShield(BaseAbility ba, Mobile c) { AuraEffect ae = (AuraEffect)ba; //FrostArmorAura aura = new FrostArmorAura(); Aura a = new Aura(); a.OnMeleeHit = 324; //id of the trigger //OnRangedHit ?? c.Triggers[ 324 ] = new Mobile.OnMeleeHitTrigger( OnLightningShieldHit ); c.AddAura( ae, a ); } public static void OnLightningShieldHit( Mobile m, Mobile target, AuraEffect ae ) { Console.WriteLine("OnLightningShieldHit: S1={0} S2={1} S3={2}", ae.S1.ToString(), ae.S2.ToString(), ae.S3.ToString()); //ae.MakeDamage(m, target, ae.S2); //Aura au = new Aura(); //aura.SpeedModifier = 0.5f; //target.AddAura( (AuraEffect)Abilities.abilities[ 14207 ], aura, true );// true for offensive aura //target.ChangeRunSpeed( target.RunSpeed ); } #endregion #region +Magma Totem (no graphics) public static void OnCastMagmaTotem(BaseAbility ba, Mobile c) { BaseTotems bt = new BaseTotems(); bt.Model = 4589; switch(ba.Id) { case 8190: bt.Name = "Magma Totem"; bt.Id = 5929; bt.SummonTotem(c, 20, 2, 256f, TotemType.Fire, TotemTarget.Enemy, 8187, new SingleTargetSpellEffect(OnCastMagma), true); Console.WriteLine("MagmaTotem created"); break; case 10585: bt.Name = "Magma Totem II"; bt.Id = 7464; bt.SummonTotem(c, 20, 2, 256f, TotemType.Fire, TotemTarget.Enemy, 10579, new SingleTargetSpellEffect(OnCastMagma), true); break; case 10586: bt.Name = "Magma Totem III"; bt.Id = 7465; bt.SummonTotem(c, 20, 2, 256f, TotemType.Fire, TotemTarget.Enemy, 10580, new SingleTargetSpellEffect(OnCastMagma), true); break; case 10587: bt.Name = "Magma Totem IV"; bt.Id = 7466; bt.SummonTotem(c, 20, 2, 256f, TotemType.Fire, TotemTarget.Enemy, 10581, new SingleTargetSpellEffect(OnCastMagma), true); break; } } public static void OnCastMagma(BaseAbility ba, Mobile c, Mobile target) { SpellTemplate st = (SpellTemplate)ba; Console.WriteLine("MagmaTotemCast: S1={0}; S2={1}; S3={2}", st.S1.ToString(), st.S2.ToString(), st.S3.ToString()); if((c as BaseTotems).Caster.HaveTalent(Server.Talents.CallOfFlame)) { AuraEffect add = (AuraEffect)(c as BaseTotems).Caster.GetTalentEffect(Server.Talents.CallOfFlame); st.MakeDamage(c, target, (int)(st.S1*((100+add.S1)/100))); } else st.MakeDamage(c, target, st.S1); } #endregion #region ++Mana Spring Totem public static void OnCastManaSpringTotem(BaseAbility ba, Mobile c) { BaseTotems bt = new BaseTotems(); bt.Model = 4587; int duradd; if(c.HaveTalent(Server.Talents.Eventide)) { duradd = (int)((100+(c.GetTalentEffect(Server.Talents.Eventide) as AuraEffect).S1)/100); } else duradd = 1; switch(ba.Id) { case 5675: bt.Name = "Mana Spring Totem"; bt.Id = 3573; bt.SummonTotem(c, 60*duradd, 2, 400f, TotemType.Water, TotemTarget.Friends, 5677, new SingleTargetSpellEffect(OnCastManaSpring), false); break; case 10495: bt.Name = "Mana Spring Totem II"; bt.Id = 7414; bt.SummonTotem(c, 60*duradd, 2, 400f, TotemType.Water, TotemTarget.Friends, 10491, new SingleTargetSpellEffect(OnCastManaSpring), false); break; case 10496: bt.Name = "Mana Spring Totem III"; bt.Id = 7415; bt.SummonTotem(c, 60*duradd, 2, 400f, TotemType.Water, TotemTarget.Friends, 10493, new SingleTargetSpellEffect(OnCastManaSpring), false); break; case 10497: bt.Name = "Mana Spring Totem IV"; bt.Id = 7416; bt.SummonTotem(c, 60*duradd, 2, 400f, TotemType.Water, TotemTarget.Friends, 10494, new SingleTargetSpellEffect(OnCastManaSpring), false); break; } } public static void OnCastManaSpring(BaseAbility ba, Mobile c, Mobile target) {//TODO: OnCastManaSpring (working. check values) SpellTemplate st = (SpellTemplate)ba; if(target.Mana < target.BaseMana) { c.FakeCast(ba.Id, target); if((c as BaseTotems).Caster.HaveTalent(Server.Talents.ImprovedManaSpringTotem)) { AuraEffect add = (AuraEffect)(c as BaseTotems).Caster.GetTalentEffect(Server.Talents.ImprovedManaSpringTotem); //(target as Character).SendMessage(String.Format("ManaSpring: add: S1={0} S2={1} S3={2}", add.S1.ToString(), add.S2.ToString(), add.S3.ToString())); target.GainMana(c, (int)((st.S1)*((100 + add.S1)/100))); (target as Character).SendMessage(String.Format("ManaSpring: gained: {0}", Convert.ToString(((st.S1)*((100+add.S1)/100))))); } else target.GainMana(c, st.S1); } } #endregion #region Mana Tide Totem (100% scripted) public static void OnCastManaTideTotem(BaseAbility ba, Mobile c) { BaseTotems bt = new BaseTotems(); bt.Model = 4587; switch(ba.Id) { case 5675: bt.Name = "Mana Tide Totem"; bt.Id = 10467; bt.SummonTotem(c, 12, 3, 400f, TotemType.Water, TotemTarget.Friends, 16191, new SingleTargetSpellEffect(OnCastManaTide), false); break; case 10495: bt.Name = "Mana Tide Totem II"; bt.Id = 11100; bt.SummonTotem(c, 12, 3, 400f, TotemType.Water, TotemTarget.Friends, 17355, new SingleTargetSpellEffect(OnCastManaTide), false); break; case 10496: bt.Name = "Mana Tide Totem III"; bt.Id = 11101; bt.SummonTotem(c, 12, 3, 400f, TotemType.Water, TotemTarget.Friends, 17360, new SingleTargetSpellEffect(OnCastManaTide), false); break; } } public static void OnCastManaTide(BaseAbility ba, Mobile c, Mobile target) { // SpellTemplate st = (SpellTemplate)ba; if(target.Mana < target.BaseMana) { c.FakeCast(ba.Id, target); target.GainMana(c, (ba as SpellTemplate).S1); } } #endregion #region Nature Resistance Totem (100% working) public static void OnCastNatureResistanceTotem(BaseAbility ba, Mobile c) { BaseTotems bt = new BaseTotems(); bt.Model = 4590; switch(ba.Id) { case 10595: bt.Name = "Nature Resistance Totem"; bt.Id = 7467; bt.SummonTotem(c, 60, 0, 400f, TotemType.Air, TotemTarget.Friends, 10596, new SingleTargetSpellEffect(OnCastNatureResistance)); break; case 10600: bt.Name = "Nature Resistance Totem II"; bt.Id = 7468; bt.SummonTotem(c, 60, 0, 400f, TotemType.Air, TotemTarget.Friends, 10598, new SingleTargetSpellEffect(OnCastNatureResistance)); break; case 10601: bt.Name = "Nature Resistance Totem III"; bt.Id = 7469; bt.SummonTotem(c, 60, 0, 400f, TotemType.Air, TotemTarget.Friends, 10599, new SingleTargetSpellEffect(OnCastNatureResistance)); break; } } public static void OnCastNatureResistance(BaseAbility ba, Mobile c, Mobile target) { AuraEffect ae = (AuraEffect)ba; Aura a = new Aura(); a.NatureResistanceBonus = ae.S1; target.AddAura(c, ae, a); } #endregion #region Poison Cleansing Totem public static void OnCastPoisonCleansingTotem(BaseAbility ba, Mobile c) {//spellID for totem 8168 } #endregion #region Purge (50% working) public static void OnCastPurge(BaseAbility ba, Mobile c, Mobile target) { if(ba.Id == 370) { //target.ReleaseAura(target.Auras[Utility.Random(0, target.Auras.Count)] as AuraEffect); (target.Auras[HelperTools.Utility.Random(0, target.Auras.Count)] as Aura).Release(target); } else if(ba.Id == 8012) { //target.ReleaseAura(target.Auras[Utility.Random(0, target.Auras.Count)] as AuraEffect); //target.ReleaseAura(target.Auras[Utility.Random(0, target.Auras.Count)] as AuraEffect); (target.Auras[HelperTools.Utility.Random(0, target.Auras.Count)] as Aura).Release(target); (target.Auras[HelperTools.Utility.Random(0, target.Auras.Count)] as Aura).Release(target); } } #endregion #region Reincarnation public static void OnCastReincarnation(BaseAbility ba, Mobile c) { } #endregion #region +Rockbiter Weapon public static void OnCastRockbiterWeapon(BaseAbility ba, Mobile c) {//Rockbitter Weapon (not working. no talent) AuraEffect st = (AuraEffect)ba; Aura aura = new Aura(); if(c.HaveTalent(Server.Talents.ImprovedRockbiterWeapon)) { AuraEffect add = (AuraEffect)c.GetTalentEffect(Server.Talents.ImprovedRockbiterWeapon); aura.AttackPowerBonus = (int)(st.S1*((100+add.S1)/100)); } else aura.AttackPowerBonus = st.S1; (c as Character).SendMessage(String.Format("RockbiterWeapon: S1={0}; S2={1}; S3={2}", st.S1.ToString(), st.S2.ToString(), st.S3.ToString())); c.AddAura(st, aura); Console.WriteLine("RockbiterWeaponCast done"); } #endregion #region ++Searing Totem (no graphics) public static void OnCastSearingTotem(BaseAbility ba, Mobile c) { BaseTotems bt = new BaseTotems(); int bonus; if(c.HaveTalent(Server.Talents.ImprovedSearingTotem)) { bonus = (int)(100 + ((c.GetTalentEffect(Server.Talents.ImprovedSearingTotem) as AuraEffect).S1)/100); } else bonus = 1; bt.Model = 4589; switch(ba.Id) { case 3599: bt.Name = "Searing Totem"; bt.Id = 2523; bt.SummonTotem(c, 30*bonus, 2, 400f, TotemType.Fire, TotemTarget.Enemy, 3606, new SingleTargetSpellEffect(OnCastSearing)); break; case 6363: bt.Name = "Searing Totem II"; bt.Id = 3902; bt.SummonTotem(c, 35*bonus, 2, 400f, TotemType.Fire, TotemTarget.Enemy, 6350, new SingleTargetSpellEffect(OnCastSearing)); break; case 6364: bt.Name = "Searing Totem III"; bt.Id = 3903; bt.SummonTotem(c, 40*bonus, 2, 400f, TotemType.Fire, TotemTarget.Enemy, 6351, new SingleTargetSpellEffect(OnCastSearing)); break; case 6365: bt.Name = "Searing Totem IV"; bt.Id = 3904; bt.SummonTotem(c, 45*bonus, 2, 400f, TotemType.Fire, TotemTarget.Enemy, 6352, new SingleTargetSpellEffect(OnCastSearing)); break; case 10437: bt.Name = "Searing Totem V"; bt.Id = 7400; bt.SummonTotem(c, 50*bonus, 2, 400f, TotemType.Fire, TotemTarget.Enemy, 10435, new SingleTargetSpellEffect(OnCastSearing)); break; case 10438: bt.Name = "Searing Totem VI"; bt.Id = 7402; bt.SummonTotem(c, 55*bonus, 2, 400f, TotemType.Fire, TotemTarget.Enemy, 10436, new SingleTargetSpellEffect(OnCastSearing)); break; } } public static void OnCastSearing(BaseAbility ba, Mobile c, Mobile target) { SpellTemplate st = (SpellTemplate)ba; Console.WriteLine("SearingTotemCast: S1={0}; S2={1}; S3={2}", st.S1.ToString(), st.S2.ToString(), st.S3.ToString()); if((c as BaseTotems).Caster.HaveTalent(Server.Talents.CallOfFlame)) { AuraEffect add = (AuraEffect)(c as BaseTotems).Caster.GetTalentEffect(Server.Talents.CallOfFlame); st.MakeDamage(c, target, (int)(st.S1*((100+add.S1)/100))); } else st.MakeDamage(c, target, st.S1); } #endregion #region Sentry Totem (looks like it's impossible to create it using base totem) public static void OnCastSentryTotem(BaseAbility ba, Mobile c) { /* BaseTotems bt = new BaseTotems(); bt.Name = "Stoneskin Totem"; bt.Id = 2630; bt.Model = 4588; bt.BaseHitPoints = 100; bt.HitPoints = 100; bt.SummonTotem(c, 45, 0, 3, 20f, TotemTarget.Friends, 8072, new SingleTargetSpellEffect(OnCastSearing)); */ } #endregion #region +Stoneclaw Totem public static void OnCastStoneclawTotem(BaseAbility ba, Mobile c) { BaseTotems bt = new BaseTotems(); bt.Model = 4588; int bonus; if(c.HaveTalent(Server.Talents.ImprovedStoneclawTotem)) { AuraEffect add = (AuraEffect)c.GetTalentEffect(Server.Talents.ImprovedStoneclawTotem); bonus = (int)((100 + add.S1)/100); } else bonus = 1; switch(ba.Id) { case 5730: bt.BaseHitPoints = 50; bt.HitPoints = 50*bonus; bt.Name = "Stoneclaw Totem"; bt.Id = 3579; bt.SummonTotem(c, 15, 1, 16f, TotemType.Earth, TotemTarget.Enemy, 5729, new SingleTargetSpellEffect(OnCastStoneClaw)); break; case 6390: bt.BaseHitPoints = 150; bt.HitPoints = 150*bonus; bt.Name = "Stoneclaw Totem II"; bt.Id = 3911; bt.SummonTotem(c, 60, 2, 16f, TotemType.Earth, TotemTarget.Enemy, 6393, new SingleTargetSpellEffect(OnCastStoneClaw)); break; case 6391: bt.BaseHitPoints = 220; bt.HitPoints = 220*bonus; bt.Name = "Stoneclaw Totem III"; bt.Id = 3912; bt.SummonTotem(c, 45, 2, 16f, TotemType.Earth, TotemTarget.Enemy, 6394, new SingleTargetSpellEffect(OnCastStoneClaw)); break; case 6392: bt.BaseHitPoints = 280; bt.HitPoints = 280*bonus; bt.Name = "Stoneclaw Totem IV"; bt.Id = 3913; bt.SummonTotem(c, 45, 2, 16f, TotemType.Earth, TotemTarget.Enemy, 6395, new SingleTargetSpellEffect(OnCastStoneClaw)); break; case 10427: bt.BaseHitPoints = 390; bt.HitPoints = 390*bonus; bt.Name = "Stoneclaw Totem V"; bt.Id = 7398; bt.SummonTotem(c, 45, 2, 16f, TotemType.Earth, TotemTarget.Enemy, 10423, new SingleTargetSpellEffect(OnCastStoneClaw)); break; case 10428: bt.BaseHitPoints = 480; bt.HitPoints = 480*bonus; bt.Name = "Stoneclaw Totem VI"; bt.Id = 7399; bt.SummonTotem(c, 45, 2, 16f, TotemType.Earth, TotemTarget.Enemy, 10424, new SingleTargetSpellEffect(OnCastStoneClaw)); break; } } public static void OnCastStoneClaw(BaseAbility ba, Mobile c, Mobile target) { //dunno if here should be an auraeffect //AuraEffect st = (AuraEffect)ba; //Aura a = new Aura(); //if(target is BaseCreature) //{ // target.AddAura(st, a); if(target is BaseCreature) { BaseCreature bc = target as BaseCreature; bc.BeginCombatWith(c); } //} } #endregion #region +Stoneskin Totem public static void OnCastStoneskinTotem(BaseAbility ba, Mobile c) { BaseTotems bt = new BaseTotems(); bt.Model = 4588; switch(ba.Id) { case 8071: bt.Name = "Stoneskin Totem"; bt.Id = 5873; bt.SummonTotem(c, 45, 0, 400f, TotemType.Earth, TotemTarget.Friends, 8072, new SingleTargetSpellEffect(OnCastStoneskin)); break; case 8154: bt.Name = "Stoneskin Totem II"; bt.Id = 5919; bt.SummonTotem(c, 60, 0, 400f, TotemType.Earth, TotemTarget.Friends, 8156, new SingleTargetSpellEffect(OnCastStoneskin)); break; case 8155: bt.Name = "Stoneskin Totem III"; bt.Id = 5920; bt.SummonTotem(c, 45, 0, 400f, TotemType.Earth, TotemTarget.Friends, 8157, new SingleTargetSpellEffect(OnCastStoneskin)); break; case 10406: bt.Name = "Stoneskin Totem IV"; bt.Id = 7366; bt.SummonTotem(c, 45, 0, 400f, TotemType.Earth, TotemTarget.Friends, 10403, new SingleTargetSpellEffect(OnCastStoneskin)); break; case 10407: bt.Name = "Stoneskin Totem V"; bt.Id = 7367; bt.SummonTotem(c, 45, 0, 400f, TotemType.Earth, TotemTarget.Friends, 10404, new SingleTargetSpellEffect(OnCastStoneskin)); break; case 10408: bt.Name = "Stoneskin Totem VI"; bt.Id = 7368; bt.SummonTotem(c, 45, 0, 400f, TotemType.Earth, TotemTarget.Friends, 10405, new SingleTargetSpellEffect(OnCastStoneskin)); break; } } public static void OnCastStoneskin(BaseAbility ba, Mobile c, Mobile target) {//TODO: stoneskin totem talent added (crashes with null obj. reference) Console.WriteLine("Stoneskin Cast Begin"); AuraEffect ae = (AuraEffect)ba; Console.WriteLine("Line1"); Aura aura = new Aura(); Console.WriteLine("Line2"); if((c as BaseTotems).Caster.HaveTalent(Server.Talents.ImprovedStoneskinTotem)) { Console.WriteLine("Line3"); AuraEffect add = (AuraEffect)(c as BaseTotems).Caster.GetTalentEffect(Server.Talents.ImprovedStoneskinTotem); Console.WriteLine("Line4"); aura.PhysicalAbsorb = ae.S1 + add.S1; Console.WriteLine("Line5"); //(target as Character).SendMessage(String.Format("TalentBonus: S1={0}, S2={1}, S3={2}", add.S1.ToString(), add.S2.ToString(), add.S3.ToString())); } else { Console.WriteLine("Line6"); aura.PhysicalAbsorb = ae.S1; Console.WriteLine("Line7"); } Console.WriteLine("Line8"); //(c as Character).SendMessage(String.Format("OnCastStoneskin: S1={0}, S2={1}, S3={2}", ae.S1.ToString(), ae.S2.ToString(), ae.S3.ToString())); target.AddAura(c, ae, aura); Console.WriteLine("Stoneskin Successfull"); } #endregion #region +Strength of Earth Totem public static void OnCastStrengthofEarthTotem(BaseAbility ba, Mobile c) { BaseTotems bt = new BaseTotems(); bt.Model = 4588; switch(ba.Id) { case 8075: bt.Name = "Strength of Earth Totem"; bt.Id = 5874; bt.SummonTotem(c, 45, 0, 400f, TotemType.Earth, TotemTarget.Friends, 8076, new SingleTargetSpellEffect(OnCastStrengthofEarth)); break; case 8160: bt.Name = "Strength of Earth Totem II"; bt.Id = 5921; bt.SummonTotem(c, 60, 0, 400f, TotemType.Earth, TotemTarget.Friends, 8162, new SingleTargetSpellEffect(OnCastStrengthofEarth)); break; case 8161: bt.Name = "Strength of Earth Totem III"; bt.Id = 5922; bt.SummonTotem(c, 75, 0, 400f, TotemType.Earth, TotemTarget.Friends, 8163, new SingleTargetSpellEffect(OnCastStrengthofEarth)); break; case 10442: bt.Name = "Strength of Earth Totem IV"; bt.Id = 7403; bt.SummonTotem(c, 90, 0, 400f, TotemType.Earth, TotemTarget.Friends, 10441, new SingleTargetSpellEffect(OnCastStrengthofEarth)); break; } } public static void OnCastStrengthofEarth(BaseAbility ba, Mobile c, Mobile target) {//TODO: strength of the earth totem talent added (not tested) AuraEffect ae = (AuraEffect)ba; Aura aura = new Aura(); if((c as BaseTotems).Caster.HaveTalent(Server.Talents.ImprovedStrengthOfEarthTotem)) { AuraEffect add = (AuraEffect)(c as BaseTotems).Caster.GetTalentEffect(Server.Talents.ImprovedStrengthOfEarthTotem); aura.StrBonus = (int)(ae.S1)*(1 + (add.S1/100)); (target as Character).SendMessage(string.Format("OnCastStrengthofEarth: tS1={0} tS2={1} tS3={2}", add.S1.ToString(), add.S2.ToString(), add.S3.ToString())); } else aura.StrBonus = ae.S1; target.AddAura(c, ae, aura); } #endregion #region Tremor Totem public static void OnCastTremorTotem(BaseAbility ba, Mobile c) {//spell ID = 8146 /*BaseTotems bt = new BaseTotems(c, 90, 0, 900f, TotemType.Earth, TotemTarget.Friends, 8146, new SingleTargetSpellEffect(OnCastTremor)); bt.Name = "Tremor Totem"; bt.Id = 2630; bt.Model = 4588; //bt.SummonTotem(c, 45, 20f, TotemTarget.Friends, 8072, new SingleTargetSpellEffect(OnCastTremor));*/ } public static void OnCastTremor(BaseAbility ba, Mobile c, Mobile target) { /*for(int i=0; i