All pastes #35416 Raw Edit

132

public text v1 · immutable
#35416 ·published 2006-01-01 02:09 UTC
rendered paste body
//	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<caster.AdditionnalStates.Count; i++)
			{
				if (caster.AdditionnalStates[i] is BaseTotems)
				{
					BaseTotems bt = (BaseTotems)caster.AdditionnalStates[i];
					if (bt.totemType == totemType)
					{
						bt.LooseHits(bt, bt.BaseHitPoints);
						caster.AdditionnalStates.RemoveAt(i);
						i--;
					}
				}
			}
			caster.AdditionnalStates.Add(this);
 
			Level = Caster.Level;
			Freeze  = true;
			Faction = Caster.Faction;
			SummonedBy = Caster;
			World.Add(this, Caster.X, Caster.Y, Caster.Z, Caster.MapId);
			TotemsTimer.TotemsList.Add(this);
		}
 
		public void ApplyEffect()
		{
			if(this.Delay >= 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<caster.AdditionnalStates.Count; i++)
			{
				if (caster.AdditionnalStates[i] is BaseTotems)
				{
					BaseTotems bt = (BaseTotems)caster.AdditionnalStates[i];
					if (bt.totemType == totemType)
					{
						bt.LooseHits(bt, bt.BaseHitPoints);
						caster.AdditionnalStates.RemoveAt(i);
						i--;
					}
				}
			}
			caster.AdditionnalStates.Add(this);
 
			Level = Caster.Level;
			Freeze  = true;
			Faction = Caster.Faction;
			SummonedBy = Caster;
			World.Add(this, Caster.X, Caster.Y, Caster.Z, Caster.MapId);
			TotemsTimer.TotemsList.Add(this);
		}
 
		public void RemoveTotem()
		{
			foreach (Mobile m in AffectedMobs)
			{
				m.ReleaseAura((Abilities.abilities[ SpellID ] as AuraEffect));
			}
			AffectedMobs.Clear();
			Caster.Summon = null;
			LooseHits(this, BaseHitPoints);
			World.Remove( this, Caster );
		}
	}
 





	public class TotemsTimer : WowTimer, IInitialize
	{
		public static void Initialize() 
		{
			new TotemsTimer(1001).Start();	
		}
		public static ArrayList TotemsList = new ArrayList();
		BaseTotems totem;
 
		public TotemsTimer(double time) : base(time)
		{
		}
 
		public override void OnTick()
		{
			if (TotemsList.Count > 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<target.KnownObjects.Count; i++)
			{
				if(target.KnownObjects[i] is Mobile)
				{
					Mobile m = target.KnownObjects[i] as Mobile;
					lasttarg.FakeCast(ba.Id, m);
					st.Heal(c, m, (int)(dmg*(Math.Pow(0.5, jump))));
					lasttarg = m;
					jump--;
				}
			}
		}
		#endregion
		#region +Chain Lightning
		public static void OnCastChainLightning(BaseAbility ba, Mobile c, Mobile target)
		{
			SpellTemplate st = (SpellTemplate)ba;
			(c as Character).SendMessage(String.Format("ChainLightning: S1={0} S2={1} S3={2}", st.S1.ToString(), st.S2.ToString(), st.S3.ToString()));
			int dmg;
			if(c.HaveTalent(Server.Talents.ImprovedChainLightning))
			{
				AuraEffect add = (AuraEffect)c.GetTalentEffect(Server.Talents.ImprovedChainLightning);
				dmg = (int)(st.S1*((100+add.S1)/100));
			}
			else dmg = st.S1;
			st.MakeDamage(c, target, dmg);
			int jump = 0;
			Mobile lasttarg = target;
			for(int i=0; i<c.KnownObjects.Count; i++)
			{
				if(c.KnownObjects[i] is Mobile)
				{
					if(jump < 3)
					{
						Mobile mob = c.KnownObjects[i] as Mobile;
						lasttarg.FakeCast(ba.Id, mob);
						st.MakeDamage(c, mob, (int)((dmg)*(Math.Pow(0.7,jump))));
						lasttarg = mob;
						jump++;
					}
				}
			}
		}
		#endregion
		#region Cure Disease (not tested)
		public static void OnCastCureDisease(BaseAbility ba, Mobile c, Mobile target)
		{
			Aura tmp;
			bool cured = false;
			for(int i=0; i<target.Auras.Count; i++)
			{
				if((target.Auras[i] as AuraEffect).Dispeltype == DispelType.Disease)
				{
					tmp = target.Auras[i] as Aura;
					if(HelperTools.Utility.Random(0,1) == 1)
					{
						//target.ReleaseAura((target.Auras[i] as AuraEffect));
						tmp.Release(target);
						cured = true;
						break;
					}
				}
			}
			if(!cured)
			{
				for(int i=0; i<target.Auras.Count; i++)
				{
					if((target.Auras[i] as AuraEffect).Dispeltype == DispelType.Disease)
					{
						tmp = target.Auras[i] as Aura;
						tmp.Release(target);
					}
				}
			}
		}
		#endregion
		#region Cure Poison (not tested)
		public static void OnCastCurePoison(BaseAbility ba, Mobile c, Mobile target)
		{
			Aura tmp;
			bool cured = false;
			for(int i=0; i<target.Auras.Count; i++)
			{
				if((target.Auras[i] as AuraEffect).Dispeltype == DispelType.Poison)
				{
					tmp = target.Auras[i] as Aura;
					if(HelperTools.Utility.Random(0,1) == 1)
					{
						//target.ReleaseAura((target.Auras[i] as AuraEffect));
						(target.Auras[i] as Aura).Release(target);
						cured = true;
						break;
					}
				}
			}
			if(!cured)
			{
				for(int i=0; i<target.Auras.Count; i++)
				{
					if((target.Auras[i] as AuraEffect).Dispeltype == DispelType.Poison)
					{
						tmp = target.Auras[i] as Aura;
						tmp.Release(target);
					}
				}
			}
		}
		#endregion
		#region Disease Cleansing Totem (not tested)
		public static void OnCastDiseaseCleansingTotem(BaseAbility ba, Mobile c)
		{
			BaseTotems bt = new BaseTotems();

			bt.Model = 4587;
			bt.Name = "Disease Cleansing Totem";
			bt.Id = 5924;
			bt.SummonTotem(c, 90, 5, 400f, TotemType.Water, TotemTarget.Friends, 8185, new SingleTargetSpellEffect(OnCastDiseaseCleansing));
		}

		public static void OnCastDiseaseCleansing(BaseAbility ba, Mobile c, Mobile target)
		{
			Aura tmp;
			bool cured = false;
			for(int i=0; i<target.Auras.Count; i++)
			{
				if((target.Auras[i] as AuraEffect).Dispeltype == DispelType.Disease)
				{
					tmp = target.Auras[i] as Aura;
					if(HelperTools.Utility.Random(0,1) == 1)

					{
						//target.ReleaseAura((target.Auras[i] as AuraEffect));
						tmp.Release(target);
						cured = true;
						break;
					}
				}
			}
			if(!cured)
			{
				for(int i=0; i<target.Auras.Count; i++)
				{
					if((target.Auras[i] as AuraEffect).Dispeltype == DispelType.Disease)
					{
						tmp = target.Auras[i] as Aura;
						tmp.Release(target);
					}
				}
			}
		}
		#endregion
		#region +Earth Shock
		public static void OnCastEarthShock(BaseAbility ba, Mobile c, Mobile target)
		{//TODO: earth shock (cancel earth cast)
			SpellTemplate st = (SpellTemplate)ba;
			if(c.HaveTalent(Server.Talents.Concussion))
			{
				AuraEffect add = (AuraEffect)c.GetTalentEffect(Server.Talents.Concussion);
				st.MakeDamage(c, target, (int)(st.S1*((100+add.S1)/100)));
			}
			else st.MakeDamage(c, target, st.S1);
			Console.WriteLine("OnCastEarthShock: st S1={0} S2={1} S3={2}", st.S1.ToString(), st.S2.ToString(), st.S3.ToString());
			if(!target.Dead) target.CancelCast();
		}
		#endregion
		#region Far Sight
		public static void OnCastFarSight(BaseAbility ba, Mobile c, Mobile target)
		{
		}
		#endregion
		#region +Fire Nova Totem
		public static void OnCastFireNovaTotem(BaseAbility ba, Mobile c)
		{
			BaseTotems bt = new BaseTotems();
			bt.Model = 4683;
			switch(ba.Id)
			{
				case 1535:
					bt.Name = "Fire Nova Totem";
					bt.Id = 5879;
					bt.SummonTotem(c, 5, 0, 400f, TotemType.Fire, TotemTarget.Enemy, 8349, new SingleTargetSpellEffect(OnCastFireNova));
					break;
				case 8498:
					bt.Name = "Fire Nova Totem II";
					bt.Id = 6110;
					bt.SummonTotem(c, 5, 0, 400f, TotemType.Fire, TotemTarget.Enemy, 8502, new SingleTargetSpellEffect(OnCastFireNova));
					break;
				case 8499:
					bt.Name = "Fire Nova Totem III";
					bt.Id = 6111;
					bt.SummonTotem(c, 5, 0, 400f, TotemType.Fire, TotemTarget.Enemy, 8503, new SingleTargetSpellEffect(OnCastFireNova));
					break;
				case 11314:
					bt.Name = "Fire Nova Totem IV";
					bt.Id = 7844;
					bt.SummonTotem(c, 5, 0, 400f, TotemType.Fire, TotemTarget.Enemy, 11306, new SingleTargetSpellEffect(OnCastFireNova));
					break;
				case 11315:
					bt.Name = "Fire Nova Totem V";
					bt.Id = 7845;
					bt.SummonTotem(c, 5, 0, 400f, TotemType.Fire, TotemTarget.Enemy, 11307, new SingleTargetSpellEffect(OnCastFireNova));
					break;
			}
		}

		public static void OnCastFireNova(BaseAbility ba, Mobile c, Mobile target)
		{
			SpellTemplate st = (SpellTemplate)ba;
			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 Fire Resistance Totem
		public static void OnCastFireResistanceTotem(BaseAbility ba, Mobile c)
		{
			BaseTotems bt = new BaseTotems();

			bt.Model = 4587;
			switch(ba.Id)
			{
				case 8184:
					bt.Name = "Fire Resistance Totem";
					bt.Id = 5927;
					bt.SummonTotem(c, 60, 0, 400f, TotemType.Water, TotemTarget.Friends, 8185, new SingleTargetSpellEffect(OnCastFireResistance));
					break;
				case 10537:
					bt.Name = "Fire Resistance Totem II";
					bt.Id = 7424;
					bt.SummonTotem(c, 60, 0, 400f, TotemType.Water, TotemTarget.Friends, 10534, new SingleTargetSpellEffect(OnCastFireResistance));
					break;
				case 10538:
					bt.Name = "Fire Resistance Totem III";
					bt.Id = 7425;
					bt.SummonTotem(c, 60, 0, 400f, TotemType.Water, TotemTarget.Friends, 10535, new SingleTargetSpellEffect(OnCastFireResistance));
					break;
			}
		}

		public static void OnCastFireResistance(BaseAbility ba, Mobile c, Mobile target)
		{
			AuraEffect st = (AuraEffect)ba;
			Aura a = new Aura();
			a.FireResistanceBonus = st.S1;
			target.AddAura(st, a);
		}
		#endregion
		#region +Flame Shock
		public static void OnCastFlameShock(BaseAbility ba, Mobile c, Mobile target)
		{//Flame Shock Instantly sears the target with fire, causing $s1 damage immediately and 
		 //		$o2 damage over $d. $s2 Fire damage every $t2 seconds.
			SpellTemplate st = (SpellTemplate)ba;
			Console.WriteLine("FlameShock st.S1={0} st.S2={1} st.S3={2}", st.S1.ToString(), st.S2.ToString(), st.S3.ToString());
			if(c.HaveTalent(Server.Talents.Concussion))
			{
				AuraEffect add = (AuraEffect)c.GetTalentEffect(Server.Talents.Concussion);
				st.MakeDamage(c, target, (int)(st.S1*((100+add.S1)/100)));
			}
			else st.MakeDamage(c, target, st.S1);
			if(!target.Dead) st.ApplyDot(c, target, st.S2, 2, st.Duration(c));
			//st.MakeDamage(c, target, SpellDamage.TypeS1);
			//Console.WriteLine("OnCastFlameShock st.S1={0} st.S2={1} st.S3={2}", st.S1.ToString(), st.S2.ToString(), st.S3.ToString());
			//Console.WriteLine("OnCastFlameShock st.Duration(c)={0}", st.Duration(c).ToString());
			
			//AuraEffect ae = (AuraEffect)ba;
			//FlameShockAura fsa = new FlameShockAura((ba as SpellTemplate), c, target, st.Duration, st.T1);
			//target.AddAura(ae, fsa);
		}
		#endregion
		#region +Flametongue Weapon
		public static void OnCastFlametongueWeapon(BaseAbility ba, Mobile c,Item item)
		{
			SpellTemplate ae = (SpellTemplate)ba;
			if(item != null)
			{
				
				ae.EnchantItem(c, item,300000,(short)1);
			}
		}
		#endregion
		#region +Flametongue Totem
		public static void OnCastFlametongueTotem(BaseAbility ba, Mobile c)
		{
			BaseTotems bt = new BaseTotems();
			bt.Model = 4589;
			/*dunno correct number for totems spell*/

			switch(ba.Id)
			{
				case 8227:
					bt.Id = 5950;
					bt.Name = "Flametongue Totem";
					bt.SummonTotem(c, 90, 1, 400f, TotemType.Fire, TotemTarget.Friends, 8230, new SingleTargetSpellEffect(OnTotemFlameTongue));
					//or 8253
					break;
				case 8249:
					bt.Id = 6012;
					bt.Name = "Flametongue Totem II";
					bt.SummonTotem(c, 90, 1, 400f, TotemType.Fire, TotemTarget.Friends, 8250, new SingleTargetSpellEffect(OnTotemFlameTongue));
					//or 8248
					break;
				case 10526:
					bt.Id = 7423;
					bt.Name = "Flametongue Totem III";
					bt.SummonTotem(c, 90, 1, 400f, TotemType.Fire, TotemTarget.Friends, 10521, new SingleTargetSpellEffect(OnTotemFlameTongue));
					//or 10523
					break;
				case 16387:
					bt.Id = 10557;
					bt.Name = "Flametongue Totem IV";
					bt.SummonTotem(c, 90, 1, 400f, TotemType.Fire, TotemTarget.Friends, 15036, new SingleTargetSpellEffect(OnTotemFlameTongue));
					//or 16389
					break;
			}
		}

		public static void OnTotemFlameTongue(BaseAbility ba, Mobile c, Mobile target)
		{//TODO: FlameTongue totem
			AuraEffect ae = (AuraEffect)ba;
			Aura a = new Aura();
			a.FireDamageIncrease = ae.S1;
			target.AddAura(ae, a);
		}
		#endregion
		#region Frost Resistance Totem (100% working)
		public static void OnCastFrostResistanceTotem(BaseAbility ba, Mobile c)
		{
			BaseTotems bt = new BaseTotems();
			bt.Model = 4589;
			switch(ba.Id)
			{
				case 8181:
					bt.Name = "Frost Resistance Totem";
					bt.Id = 5926;
					bt.SummonTotem(c, 60, 0, 400f, TotemType.Fire, TotemTarget.Friends, 8182, new SingleTargetSpellEffect(OnCastFrostResistance));
					break;
				case 10478:
					bt.Name = "Frost Resistance Totem II";
					bt.Id = 7412;
					bt.SummonTotem(c, 60, 0, 400f, TotemType.Fire, TotemTarget.Friends, 10476, new SingleTargetSpellEffect(OnCastFrostResistance));
					break;
				case 10479:
					bt.Name = "Frost Resistance Totem III";
					bt.Id = 7413;
					bt.SummonTotem(c, 60, 0, 400f, TotemType.Fire, TotemTarget.Friends, 10477, new SingleTargetSpellEffect(OnCastFrostResistance));
					break;
			}
		}

		public static void OnCastFrostResistance(BaseAbility ba, Mobile c, Mobile target)
		{
			AuraEffect st = (AuraEffect)ba;
			Aura a = new Aura();
			a.FrostResistanceBonus = st.S1;
			target.AddAura(st, a);
		}
		#endregion
		#region +Frost Shock
		public static void OnCastFrostShock(BaseAbility ba, Mobile c, Mobile target)
		{
			SpellTemplate st = (SpellTemplate)ba;
			//st.MakeDamage(c, target, SpellDamage.TypeS1);
			if(c.HaveTalent(Server.Talents.Concussion))
			{
				AuraEffect add = (AuraEffect)c.GetTalentEffect(Server.Talents.Concussion);
				st.MakeDamage(c, target, (int)(st.S1*((100+add.S1)/100)));
			}
			else st.MakeDamage(c, target, st.S1);
			if(!target.Dead)
			{
				AuraEffect ae = (AuraEffect)ba;
				Aura a = new Aura();
				a.OnRelease = new Aura.AuraReleaseDelegate(OnFrostShockEnded);
				a.SpeedModifier = ae.S1;
				target.AddAura(ae, a);
				target.ChangeRunSpeed(target.RunSpeed);
			}
		}

		public static void OnFrostShockEnded(Mobile from)
		{
			from.ChangeRunSpeed(from.RunSpeed);
		}
		#endregion
		#region +Frostbrand Weapon
		public static void OnCastFrostbrandWeapon(BaseAbility ba, Mobile c)
		{//TODO: Frostbrabd Weapon (hits every time instead of a chance to hit)
			//Imbue the Shaman's weapon with frost. Each hit has a chance of causing <..> 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<target.Auras; i++)
			{
				if((target.Auras[i] as AuraEffect).Dispeltype
			}*/
		}
		#endregion
		#region Water Breathing
		public static void OnCastWaterBreathing(BaseAbility ba, Mobile c, Mobile target)
		{
		}
		#endregion
		#region Water Walking
		public static void OnCastWaterWalking(BaseAbility ba, Mobile c, Mobile target)
		{
		}
		#endregion
		#region Windfury Totem
		public static void OnCastWindfuryTotem(BaseAbility ba, Mobile c)
		{
/*			BaseTotems bt = new BaseTotems();
			bt.Name = "Windfury Totem";
			bt.Id = 6112;
			bt.Model = 4588;
			switch(ba.Id)
			{
				case 8512:
					bt.SummonTotem(c, 90, 400f, TotemType.Earth, TotemTarget.Friends, 8516, new SingleTargetSpellEffect(OnCastWindfury));
					break;
				case 10613:
					bt.SummonTotem(c, 90, 400f, TotemType.Earth, TotemTarget.Friends, 10608, new SingleTargetSpellEffect(OnCastWindfury));
					break;
				case 10614:
					bt.SummonTotem(c, 90, 400f, TotemType.Earth, TotemTarget.Friends, 10610, new SingleTargetSpellEffect(OnCastWindfury));
					break;
			}*/
		}

		public static void OnCastWindfury(BaseAbility ba, Mobile c, Mobile target)
		{
/*			AuraEffect st = (AuraEffect)ba;
			Aura aura = new Aura();
			aura.AgBonus = st.Bonus1;
			if( Utility.Random(100) < 20 ) aura.AttackPowerBonus = st.S1;
			Console.WriteLine("OnCastEarthbind st.S1={0} st.S2={1} st.S3={2}", st.S1.ToString(), st.S2.ToString(), st.S3.ToString());
			target.AddAura(st, aura);*/
		}
		#endregion
		#region Windfury Weapon
		public static void OnCastWindfuryWeapon(BaseAbility ba, Mobile c)
		{
		}
		#endregion
		#region Windwall Totem
		public static void OnCastWindwallTotem(BaseAbility ba, Mobile c)
		{
		}
		#endregion
		#endregion
	}
}