Overwrite
Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
This commit is contained in:
259
Scripts/Spells/Mysticism/SpellDefinitions/EnchantSpell .cs
Normal file
259
Scripts/Spells/Mysticism/SpellDefinitions/EnchantSpell .cs
Normal file
@@ -0,0 +1,259 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user