Overwrite

Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
This commit is contained in:
Unstable Kitsune
2023-11-28 23:20:26 -05:00
parent 3cd54811de
commit b918192e4e
11608 changed files with 2644205 additions and 47 deletions

View File

@@ -0,0 +1,231 @@
using System;
using System.Collections.Generic;
using Server.Items;
namespace Server.Spells.Chivalry
{
public class ConsecrateWeaponSpell : PaladinSpell
{
private static readonly SpellInfo m_Info = new SpellInfo(
"Consecrate Weapon", "Consecrus Arma",
-1,
9002);
private static Dictionary<Mobile, ConsecratedWeaponContext> m_Table = new Dictionary<Mobile, ConsecratedWeaponContext>();
public ConsecrateWeaponSpell(Mobile caster, Item scroll)
: base(caster, scroll, m_Info)
{
}
public override TimeSpan CastDelayBase
{
get
{
return TimeSpan.FromSeconds(0.5);
}
}
public override double RequiredSkill
{
get
{
return 15.0;
}
}
public override int RequiredMana
{
get
{
return 10;
}
}
public override int RequiredTithing
{
get
{
return 10;
}
}
public override int MantraNumber
{
get
{
return 1060720;
}
}// Consecrus Arma
public override bool BlocksMovement
{
get
{
return false;
}
}
public override void OnCast()
{
BaseWeapon weapon = this.Caster.Weapon as BaseWeapon;
if (Caster.Player && (weapon == null || weapon is Fists))
{
this.Caster.SendLocalizedMessage(501078); // You must be holding a weapon.
}
else if (this.CheckSequence())
{
/* Temporarily enchants the weapon the caster is currently wielding.
* The type of damage the weapon inflicts when hitting a target will
* be converted to the target's worst Resistance type.
* Duration of the effect is affected by the caster's Karma and lasts for 3 to 11 seconds.
*/
int itemID, soundID;
switch ( weapon.Skill )
{
case SkillName.Macing:
itemID = 0xFB4;
soundID = 0x232;
break;
case SkillName.Archery:
itemID = 0x13B1;
soundID = 0x145;
break;
default:
itemID = 0xF5F;
soundID = 0x56;
break;
}
this.Caster.PlaySound(0x20C);
this.Caster.PlaySound(soundID);
this.Caster.FixedParticles(0x3779, 1, 30, 9964, 3, 3, EffectLayer.Waist);
IEntity from = new Entity(Serial.Zero, new Point3D(this.Caster.X, this.Caster.Y, this.Caster.Z), this.Caster.Map);
IEntity to = new Entity(Serial.Zero, new Point3D(this.Caster.X, this.Caster.Y, this.Caster.Z + 50), this.Caster.Map);
Effects.SendMovingParticles(from, to, itemID, 1, 0, false, false, 33, 3, 9501, 1, 0, EffectLayer.Head, 0x100);
double seconds = this.ComputePowerValue(20);
// TODO: Should caps be applied?
int pkarma = this.Caster.Karma;
if (pkarma > 5000)
seconds = 11.0;
else if (pkarma >= 4999)
seconds = 10.0;
else if (pkarma >= 3999)
seconds = 9.00;
else if (pkarma >= 2999)
seconds = 8.0;
else if (pkarma >= 1999)
seconds = 7.0;
else if (pkarma >= 999)
seconds = 6.0;
else
seconds = 5.0;
TimeSpan duration = TimeSpan.FromSeconds(seconds);
ConsecratedWeaponContext context;
if (IsUnderEffects(Caster))
{
context = m_Table[Caster];
if (context.Timer != null)
{
context.Timer.Stop();
context.Timer = null;
}
context.Weapon = weapon;
}
else
{
context = new ConsecratedWeaponContext(Caster, weapon);
}
weapon.ConsecratedContext = context;
context.Timer = Timer.DelayCall<Mobile>(duration, RemoveEffects, Caster);
m_Table[Caster] = context;
BuffInfo.AddBuff(Caster, new BuffInfo(BuffIcon.ConsecrateWeapon, 1151385, 1151386, duration, Caster, String.Format("{0}\t{1}", context.ConsecrateProcChance, context.ConsecrateDamageBonus)));
}
this.FinishSequence();
}
public static bool IsUnderEffects(Mobile m)
{
return m_Table.ContainsKey(m);
}
public static void RemoveEffects(Mobile m)
{
if (m_Table.ContainsKey(m))
{
var context = m_Table[m];
context.Expire();
m_Table.Remove(m);
}
}
}
public class ConsecratedWeaponContext
{
public Mobile Owner { get; private set; }
public BaseWeapon Weapon { get; set; }
public Timer Timer { get; set; }
public int ConsecrateProcChance
{
get
{
if (!Core.SA || Owner.Skills.Chivalry.Value >= 80)
{
return 100;
}
return (int)Owner.Skills.Chivalry.Value;
}
}
public int ConsecrateDamageBonus
{
get
{
if (Core.SA)
{
double value = Owner.Skills.Chivalry.Value;
if (value >= 90)
{
return (int)Math.Truncate((value - 90) / 2);
}
}
return 0;
}
}
public ConsecratedWeaponContext(Mobile owner, BaseWeapon weapon)
{
Owner = owner;
Weapon = weapon;
}
public void Expire()
{
Weapon.ConsecratedContext = null;
Effects.PlaySound(Weapon.GetWorldLocation(), Weapon.Map, 0x1F8);
if (Timer != null)
{
Timer.Stop();
Timer = null;
}
}
}
}