Files
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

259 lines
9.1 KiB
C#

using System;
using Server.Gumps;
using Server.Items;
using System.Collections.Generic;
using Server;
using Server.Mobiles;
using Server.Spells;
using Server.Network;
using Server.Spells.Spellweaving;
namespace Server.Spells.Mysticism
{
public class EnchantSpell : MysticSpell
{
private static readonly string ModName = "EnchantAttribute";
public override SpellCircle Circle { get { return SpellCircle.Second; } }
public override bool ClearHandsOnCast { get { return false; } }
public BaseWeapon Weapon { get; set; }
public AosWeaponAttribute Attribute { get; set; }
private static SpellInfo m_Info = new SpellInfo(
"Enchant", "In Ort Ylem",
230,
9022,
Reagent.SpidersSilk,
Reagent.MandrakeRoot,
Reagent.SulfurousAsh
);
public EnchantSpell( Mobile caster, Item scroll ) : base( caster, scroll, m_Info )
{
}
public EnchantSpell( Mobile caster, Item scroll, BaseWeapon weapon, AosWeaponAttribute attribute ) : base( caster, scroll, m_Info )
{
Weapon = weapon;
this.Attribute = attribute;
}
public override bool CheckCast()
{
if (Weapon == null)
{
BaseWeapon wep = Caster.Weapon as BaseWeapon;
if (wep == null)
{
Caster.SendLocalizedMessage(501078); // You must be holding a weapon.
}
else
{
if (Caster.HasGump(typeof(EnchantSpellGump)))
{
Caster.CloseGump(typeof(EnchantSpellGump));
}
var gump = new EnchantSpellGump(Caster, Scroll, wep);
int serial = gump.Serial;
Caster.SendGump(gump);
Timer.DelayCall(TimeSpan.FromSeconds(30), () =>
{
var current = Caster.FindGump(typeof(EnchantSpellGump));
if (current != null && current.Serial == serial)
{
Caster.CloseGump(typeof(EnchantSpellGump));
FinishSequence();
}
});
}
return false;
}
else if (IsUnderSpellEffects(Caster, Weapon))
{
Caster.SendLocalizedMessage(501775); // This spell is already in effect.
return false;
}
else if (ImmolatingWeaponSpell.IsImmolating(Caster, Weapon) || Weapon.ConsecratedContext != null)
{
Caster.SendLocalizedMessage(1080128); //You cannot use this ability while your weapon is enchanted.
return false;
}
else if (Weapon.FocusWeilder != null)
{
Caster.SendLocalizedMessage(1080446); // You cannot enchant an item that is under the effects of the ninjitsu focus attack ability.
return false;
}
else if (Weapon.WeaponAttributes.HitLightning > 0 || Weapon.WeaponAttributes.HitFireball > 0 || Weapon.WeaponAttributes.HitHarm > 0 || Weapon.WeaponAttributes.HitMagicArrow > 0 || Weapon.WeaponAttributes.HitDispel > 0)
{
Caster.SendLocalizedMessage(1080127); // This weapon already has a hit spell effect and cannot be enchanted.
return false;
}
return true;
}
public override void OnCast()
{
BaseWeapon wep = Caster.Weapon as BaseWeapon;
if (wep == null || wep != Weapon)
{
Caster.SendLocalizedMessage(501078); // You must be holding a weapon.
}
else if (IsUnderSpellEffects(Caster, Weapon))
{
Caster.SendLocalizedMessage(501775); // This spell is already in effect.
}
else if (ImmolatingWeaponSpell.IsImmolating(Caster, Weapon) || Weapon.ConsecratedContext != null)
{
Caster.SendLocalizedMessage(1080128); //You cannot use this ability while your weapon is enchanted.
}
else if (Weapon.FocusWeilder != null)
{
Caster.SendLocalizedMessage(1080446); // You cannot enchant an item that is under the effects of the ninjitsu focus attack ability.
}
else if (Weapon.WeaponAttributes.HitLightning > 0 || Weapon.WeaponAttributes.HitFireball > 0 || Weapon.WeaponAttributes.HitHarm > 0 || Weapon.WeaponAttributes.HitMagicArrow > 0 || Weapon.WeaponAttributes.HitDispel > 0)
{
Caster.SendLocalizedMessage(1080127); // This weapon already has a hit spell effect and cannot be enchanted.
}
else if (CheckSequence() && Caster.Weapon == Weapon)
{
Caster.PlaySound(0x64E);
Caster.FixedEffect(0x36CB, 1, 9, 1915, 0);
int prim = (int)Caster.Skills[CastSkill].Value;
int sec = (int)Caster.Skills[DamageSkill].Value;
int value = (60 * (prim + sec)) / 240;
double duration = ((double)(prim + sec) / 2.0) + 30.0;
int malus = 0;
if (Table == null)
Table = new Dictionary<Mobile, EnchantmentTimer>();
Enhancement.SetValue(Caster, this.Attribute, value, ModName);
if (prim >= 80 && sec >= 80 && Weapon.Attributes.SpellChanneling == 0)
{
Enhancement.SetValue(Caster, AosAttribute.SpellChanneling, 1, ModName);
Enhancement.SetValue(Caster, AosAttribute.CastSpeed, -1, ModName);
malus = 1;
}
Table[Caster] = new EnchantmentTimer(Caster, Weapon, this.Attribute, value, malus, duration);
int loc;
switch (this.Attribute)
{
default:
case AosWeaponAttribute.HitLightning: loc = 1060423; break;
case AosWeaponAttribute.HitFireball: loc = 1060420; break;
case AosWeaponAttribute.HitHarm: loc = 1060421; break;
case AosWeaponAttribute.HitMagicArrow: loc = 1060426; break;
case AosWeaponAttribute.HitDispel: loc = 1060417; break;
}
BuffInfo.AddBuff(Caster, new BuffInfo(BuffIcon.Enchant, 1080126, loc, TimeSpan.FromSeconds(duration), Caster, value.ToString()));
Weapon.EnchantedWeilder = Caster;
Weapon.InvalidateProperties();
}
FinishSequence();
}
public static Dictionary<Mobile, EnchantmentTimer> Table { get; set; }
public static bool IsUnderSpellEffects(Mobile Caster, BaseWeapon wep)
{
if (Table == null)
return false;
return Table.ContainsKey(Caster) && Table[Caster].Weapon == wep;
}
public static AosWeaponAttribute BonusAttribute(Mobile from)
{
if (Table.ContainsKey(from))
return Table[from].WeaponAttribute;
return AosWeaponAttribute.HitColdArea;
}
public static int BonusValue(Mobile from)
{
if (Table.ContainsKey(from))
return Table[from].AttributeValue;
return 0;
}
public static bool CastingMalus(Mobile from, BaseWeapon weapon)
{
if (Table.ContainsKey(from))
return Table[from].CastingMalus > 0;
return false;
}
public static void RemoveEnchantment(Mobile caster)
{
if(Table != null && Table.ContainsKey(caster))
{
Table[caster].Stop();
Table[caster] = null;
Table.Remove(caster);
caster.SendLocalizedMessage(1115273); // The enchantment on your weapon has expired.
caster.PlaySound(0x1E6);
Enhancement.RemoveMobile(caster);
}
}
public static void OnWeaponRemoved(BaseWeapon wep, Mobile from)
{
if(IsUnderSpellEffects(from, wep))
RemoveEnchantment(from);
if (wep.EnchantedWeilder != null)
wep.EnchantedWeilder = null;
}
}
public class EnchantmentTimer : Timer
{
public Mobile Owner { get; set; }
public BaseWeapon Weapon { get; set; }
public AosWeaponAttribute WeaponAttribute { get; set; }
public int AttributeValue { get; set; }
public int CastingMalus { get; set; }
public EnchantmentTimer(Mobile owner, BaseWeapon wep, AosWeaponAttribute attribute, int value, int malus, double duration) : base(TimeSpan.FromSeconds(duration))
{
Owner = owner;
Weapon = wep;
WeaponAttribute = attribute;
AttributeValue = value;
CastingMalus = malus;
this.Start();
}
protected override void OnTick()
{
if(Weapon != null)
Weapon.EnchantedWeilder = null;
EnchantSpell.RemoveEnchantment(Owner);
}
}
}