Files
abysmal-isle/Scripts/SubSystem/ACC/Complete Spell System/-=+ 03 Systems/Ancient/Spells/PeerSpell.cs
Unstable Kitsune b918192e4e Overwrite
Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
2023-11-28 23:20:26 -05:00

311 lines
13 KiB
C#

using System;
using System.Collections;
using Server;
using Server.Targeting;
using Server.Items;
using Server.Network;
using Server.Mobiles;
using Server.Spells;
using Server.Spells.Fifth;
namespace Server.ACC.CSS.Systems.Ancient
{
public class AncientPeerSpell : AncientSpell
{
private static SpellInfo m_Info = new SpellInfo(
"Peer", "Vas Wis",
221,
9002,
Reagent.MandrakeRoot,
Reagent.Nightshade
);
public override SpellCircle Circle
{
get { return SpellCircle.Third; }
}
private int m_OldBody;
private Souless m_Fake;
public ArrayList m_PeerMod;
public AncientPeerSpell(Mobile caster, Item scroll)
: base(caster, scroll, m_Info)
{
}
public override void OnCast()
{
if (!CheckSequence())
return;
else if (Caster.Mounted)
{
Caster.SendLocalizedMessage(1042561); //Please dismount first.
}
else if (!Caster.CanBeginAction(typeof(AncientPeerSpell)))
{
Caster.SendLocalizedMessage(1005559); // This spell is already in effect.
}
else if (Server.Spells.TransformationSpellHelper.UnderTransformation(Caster))
{
Caster.SendMessage("Your eyes stay firmly inside your body.");
}
else if (Caster.BodyMod == 183 || Caster.BodyMod == 184)
{
Caster.SendMessage("Your eyes stay firmly inside your body.");
}
else if (!Caster.CanBeginAction(typeof(IncognitoSpell)) || Caster.IsBodyMod)
{
DoFizzle();
}
else if (CheckSequence())
{
if (Caster.BeginAction(typeof(AncientPeerSpell)))
{
if (this.Scroll != null)
Scroll.Consume();
Caster.PlaySound(0x2DF);
Caster.SendMessage("Your sight leaves your body.");
Souless dg = new Souless(this);
dg.Body = Caster.Body;
dg.Hue = Caster.Hue;
dg.Name = Caster.Name;
dg.SpeechHue = Caster.SpeechHue;
dg.Fame = Caster.Fame;
dg.Karma = Caster.Karma;
dg.EmoteHue = Caster.EmoteHue;
dg.Title = Caster.Title;
dg.Criminal = (Caster.Criminal);
dg.AccessLevel = Caster.AccessLevel;
dg.Str = Caster.Str;
dg.Int = Caster.Int;
dg.Hits = Caster.Hits;
dg.Dex = Caster.Dex;
dg.Mana = Caster.Mana;
dg.Stam = Caster.Stam;
dg.VirtualArmor = (Caster.VirtualArmor);
dg.SetSkill(SkillName.Wrestling, Caster.Skills[SkillName.Wrestling].Value);
dg.SetSkill(SkillName.Tactics, Caster.Skills[SkillName.Tactics].Value);
dg.SetSkill(SkillName.Anatomy, Caster.Skills[SkillName.Anatomy].Value);
dg.SetSkill(SkillName.Magery, Caster.Skills[SkillName.Magery].Value);
dg.SetSkill(SkillName.MagicResist, Caster.Skills[SkillName.MagicResist].Value);
dg.SetSkill(SkillName.Meditation, Caster.Skills[SkillName.Meditation].Value);
dg.SetSkill(SkillName.EvalInt, Caster.Skills[SkillName.EvalInt].Value);
dg.SetSkill(SkillName.Archery, Caster.Skills[SkillName.Archery].Value);
dg.SetSkill(SkillName.Macing, Caster.Skills[SkillName.Macing].Value);
dg.SetSkill(SkillName.Swords, Caster.Skills[SkillName.Swords].Value);
dg.SetSkill(SkillName.Fencing, Caster.Skills[SkillName.Fencing].Value);
dg.SetSkill(SkillName.Lumberjacking, Caster.Skills[SkillName.Lumberjacking].Value);
dg.SetSkill(SkillName.Alchemy, Caster.Skills[SkillName.Alchemy].Value);
dg.SetSkill(SkillName.Parry, Caster.Skills[SkillName.Parry].Value);
dg.SetSkill(SkillName.Focus, Caster.Skills[SkillName.Focus].Value);
dg.SetSkill(SkillName.Necromancy, Caster.Skills[SkillName.Necromancy].Value);
dg.SetSkill(SkillName.Chivalry, Caster.Skills[SkillName.Chivalry].Value);
dg.SetSkill(SkillName.ArmsLore, Caster.Skills[SkillName.ArmsLore].Value);
dg.SetSkill(SkillName.Poisoning, Caster.Skills[SkillName.Poisoning].Value);
dg.SetSkill(SkillName.SpiritSpeak, Caster.Skills[SkillName.SpiritSpeak].Value);
dg.SetSkill(SkillName.Stealing, Caster.Skills[SkillName.Stealing].Value);
dg.SetSkill(SkillName.Inscribe, Caster.Skills[SkillName.Inscribe].Value);
dg.Kills = (Caster.Kills);
m_PeerMod = new ArrayList();
double loss = (0 - Caster.Skills[SkillName.AnimalTaming].Base);
SkillMod sk = new DefaultSkillMod(SkillName.AnimalTaming, true, loss);
Caster.AddSkillMod(sk);
m_PeerMod.Add(sk);
double loss1 = (0 - Caster.Skills[SkillName.AnimalLore].Base);
SkillMod sk1 = new DefaultSkillMod(SkillName.AnimalLore, true, loss1);// Druidry
Caster.AddSkillMod(sk1);
m_PeerMod.Add(sk1);
double loss3 = (0 - Caster.Skills[SkillName.Necromancy].Base);
SkillMod sk3 = new DefaultSkillMod(SkillName.Necromancy, true, loss3);
Caster.AddSkillMod(sk3);
m_PeerMod.Add(sk3);
double loss4 = (0 - Caster.Skills[SkillName.TasteID].Base);
SkillMod sk4 = new DefaultSkillMod(SkillName.TasteID, true, loss4);
Caster.AddSkillMod(sk4);
m_PeerMod.Add(sk4);
// Clear Items
RemoveFromAllLayers(dg);
// Then copy
CopyFromLayer(Caster, dg, Layer.FirstValid);
CopyFromLayer(Caster, dg, Layer.OneHanded);
CopyFromLayer(Caster, dg, Layer.TwoHanded);
CopyFromLayer(Caster, dg, Layer.Shoes);
CopyFromLayer(Caster, dg, Layer.Pants);
CopyFromLayer(Caster, dg, Layer.Shirt);
CopyFromLayer(Caster, dg, Layer.Helm);
CopyFromLayer(Caster, dg, Layer.Gloves);
CopyFromLayer(Caster, dg, Layer.Ring);
CopyFromLayer(Caster, dg, Layer.Talisman);
CopyFromLayer(Caster, dg, Layer.Neck);
CopyFromLayer(Caster, dg, Layer.Hair);
CopyFromLayer(Caster, dg, Layer.Waist);
CopyFromLayer(Caster, dg, Layer.InnerTorso);
CopyFromLayer(Caster, dg, Layer.Bracelet);
//CopyFromLayer(Caster, dg, Layer.Unused_xF);
CopyFromLayer(Caster, dg, Layer.FacialHair);
CopyFromLayer(Caster, dg, Layer.MiddleTorso);
CopyFromLayer(Caster, dg, Layer.Earrings);
CopyFromLayer(Caster, dg, Layer.Arms);
CopyFromLayer(Caster, dg, Layer.Cloak);
CopyFromLayer(Caster, dg, Layer.Backpack);
CopyFromLayer(Caster, dg, Layer.OuterTorso);
CopyFromLayer(Caster, dg, Layer.OuterLegs);
CopyFromLayer(Caster, dg, Layer.InnerLegs);
CopyFromLayer(Caster, dg, Layer.LastUserValid);
CopyFromLayer(Caster, dg, Layer.Mount);
dg.Owner = Caster;
dg.OldBody = m_OldBody;
m_Fake = dg;
dg.Map = Caster.Map;
dg.Location = Caster.Location;
BaseArmor.ValidateMobile(Caster);
m_OldBody = Caster.Body;
Caster.BodyValue = 903;
Caster.Blessed = true;
StopTimer(Caster);
Timer t = new InternalTimer(Caster, m_OldBody, m_Fake, this);
m_Timers[Caster] = t;
t.Start();
}
else
{
Caster.SendLocalizedMessage(1005559); // This spell is already in effect.
}
}
FinishSequence();
}
private void CopyFromLayer(Mobile from, Mobile mimic, Layer layer)
{
if (mimic.FindItemOnLayer(layer) != null && mimic.FindItemOnLayer(layer).LootType != LootType.Blessed)
mimic.FindItemOnLayer(layer).LootType = LootType.Newbied;
}
private void DeleteFromLayer(Mobile from, Layer layer)
{
if (from.FindItemOnLayer(layer) != null)
from.RemoveItem(from.FindItemOnLayer(layer));
}
private void RemoveFromAllLayers(Mobile from)
{
DeleteFromLayer(from, Layer.FirstValid);
DeleteFromLayer(from, Layer.OneHanded);
DeleteFromLayer(from, Layer.TwoHanded);
DeleteFromLayer(from, Layer.Shoes);
DeleteFromLayer(from, Layer.Pants);
DeleteFromLayer(from, Layer.Shirt);
DeleteFromLayer(from, Layer.Helm);
DeleteFromLayer(from, Layer.Gloves);
DeleteFromLayer(from, Layer.Ring);
DeleteFromLayer(from, Layer.Talisman);
DeleteFromLayer(from, Layer.Neck);
DeleteFromLayer(from, Layer.Hair);
DeleteFromLayer(from, Layer.Waist);
DeleteFromLayer(from, Layer.InnerTorso);
DeleteFromLayer(from, Layer.Bracelet);
//DeleteFromLayer(from, Layer.Unused_xF);
DeleteFromLayer(from, Layer.FacialHair);
DeleteFromLayer(from, Layer.MiddleTorso);
DeleteFromLayer(from, Layer.Earrings);
DeleteFromLayer(from, Layer.Arms);
DeleteFromLayer(from, Layer.Cloak);
DeleteFromLayer(from, Layer.Backpack);
DeleteFromLayer(from, Layer.OuterTorso);
DeleteFromLayer(from, Layer.OuterLegs);
DeleteFromLayer(from, Layer.InnerLegs);
DeleteFromLayer(from, Layer.LastUserValid);
DeleteFromLayer(from, Layer.Mount);
}
public void RemovePeerMod()
{
if (m_PeerMod == null)
return;
for (int i = 0; i < m_PeerMod.Count; ++i)
((SkillMod)m_PeerMod[i]).Remove();
m_PeerMod = null;
}
private static Hashtable m_Timers = new Hashtable();
public static bool StopTimer(Mobile m)
{
Timer t = (Timer)m_Timers[m];
if (t != null)
{
t.Stop();
m_Timers.Remove(m);
}
return (t != null);
}
private class InternalTimer : Timer
{
private Mobile m_Owner;
private int m_OldBody;
private Souless fake;
private Point3D loc;
private AncientPeerSpell m_spell;
public InternalTimer(Mobile owner, int body, Souless m_Fake, AncientPeerSpell spell)
: base(TimeSpan.FromSeconds(0))
{
m_Owner = owner;
m_OldBody = body;
fake = m_Fake;
m_spell = spell;
int val = (int)owner.Skills[SkillName.Magery].Value;
if (val > 100)
val = 100;
double loss2 = (0 - m_Owner.Skills[SkillName.Magery].Base);
SkillMod sk2 = new DefaultSkillMod(SkillName.Magery, true, loss2);
m_Owner.AddSkillMod(sk2);
m_spell.m_PeerMod.Add(sk2);
Delay = TimeSpan.FromSeconds(val);
Priority = TimerPriority.TwoFiftyMS;
}
protected override void OnTick()
{
if (!m_Owner.CanBeginAction(typeof(AncientPeerSpell)))
{
if (fake != null && !fake.Deleted)
{
loc = new Point3D(fake.X, fake.Y, fake.Z);
m_Owner.Location = loc;
m_Owner.Blessed = fake.Blessed;
fake.Delete();
}
m_Owner.BodyValue = m_OldBody;
m_spell.RemovePeerMod();
m_Owner.EndAction(typeof(AncientPeerSpell));
BaseArmor.ValidateMobile(m_Owner);
}
}
}
}
}