198 lines
5.2 KiB
C#
198 lines
5.2 KiB
C#
using System;
|
||
using Server.Mobiles;
|
||
|
||
namespace Server.Items
|
||
{
|
||
public abstract class BaseThrown : BaseRanged
|
||
{
|
||
private Mobile m_Thrower;
|
||
private Mobile m_Target;
|
||
private Point3D m_KillSave;
|
||
|
||
public BaseThrown(int itemID)
|
||
: base(itemID)
|
||
{
|
||
}
|
||
|
||
public BaseThrown(Serial serial)
|
||
: base(serial)
|
||
{
|
||
}
|
||
|
||
public abstract int MinThrowRange { get; }
|
||
public virtual int MaxThrowRange
|
||
{
|
||
get
|
||
{
|
||
return MinThrowRange + 3;
|
||
}
|
||
}
|
||
public override int DefMaxRange
|
||
{
|
||
get
|
||
{
|
||
int baseRange = MaxThrowRange;
|
||
|
||
var attacker = Parent as Mobile;
|
||
|
||
if (attacker != null)
|
||
{
|
||
/*
|
||
* Each weapon has a base and max range available to it, where the base
|
||
* range is modified by the player’s strength to determine the actual range.
|
||
*
|
||
* Determining the maximum range of each weapon while in use:
|
||
* - Range = BaseRange + ((PlayerStrength - MinWeaponStrReq) / ((150 - MinWeaponStrReq) / 3))
|
||
* - The absolute maximum range is capped at 11 tiles.
|
||
*
|
||
* As per OSI tests: with 140 Strength you achieve max range for all throwing weapons.
|
||
*/
|
||
|
||
return (baseRange - 3) + ((attacker.Str - AosStrengthReq) / ((140 - AosStrengthReq) / 3));
|
||
}
|
||
else
|
||
{
|
||
return baseRange;
|
||
}
|
||
}
|
||
}
|
||
|
||
public override int EffectID
|
||
{
|
||
get
|
||
{
|
||
return ItemID;
|
||
}
|
||
}
|
||
|
||
public override Type AmmoType
|
||
{
|
||
get
|
||
{
|
||
return null;
|
||
}
|
||
}
|
||
|
||
public override Item Ammo
|
||
{
|
||
get
|
||
{
|
||
return null;
|
||
}
|
||
}
|
||
|
||
public override int DefHitSound
|
||
{
|
||
get
|
||
{
|
||
return 0x5D3;
|
||
}
|
||
}
|
||
|
||
public override int DefMissSound
|
||
{
|
||
get
|
||
{
|
||
return 0x5D4;
|
||
}
|
||
}
|
||
|
||
public override SkillName DefSkill
|
||
{
|
||
get
|
||
{
|
||
return SkillName.Throwing;
|
||
}
|
||
}
|
||
|
||
public override WeaponAnimation DefAnimation
|
||
{
|
||
get
|
||
{
|
||
return WeaponAnimation.Throwing;
|
||
}
|
||
}
|
||
|
||
public override SkillName AccuracySkill
|
||
{
|
||
get
|
||
{
|
||
return SkillName.Throwing;
|
||
}
|
||
}
|
||
|
||
/*public override TimeSpan OnSwing(Mobile attacker, IDamageable damageable)
|
||
{
|
||
TimeSpan ts = base.OnSwing(attacker, damageable);
|
||
|
||
// time it takes to throw it around including mystic arc
|
||
if (ts < TimeSpan.FromMilliseconds(1000))
|
||
ts = TimeSpan.FromMilliseconds(1000);
|
||
|
||
return ts;
|
||
}*/
|
||
|
||
public override bool OnFired(Mobile attacker, IDamageable damageable)
|
||
{
|
||
m_Thrower = attacker;
|
||
|
||
if (!attacker.InRange(damageable, 1))
|
||
{
|
||
attacker.MovingEffect(damageable, EffectID, 18, 1, false, false, Hue, 0);
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
public override void OnHit(Mobile attacker, IDamageable damageable, double damageBonus)
|
||
{
|
||
m_KillSave = damageable.Location;
|
||
|
||
if (!(WeaponAbility.GetCurrentAbility(attacker) is MysticArc))
|
||
Timer.DelayCall(TimeSpan.FromMilliseconds(333.0), new TimerCallback(ThrowBack));
|
||
|
||
base.OnHit(attacker, damageable, damageBonus);
|
||
}
|
||
|
||
public override void OnMiss(Mobile attacker, IDamageable damageable)
|
||
{
|
||
m_Target = damageable as Mobile;
|
||
|
||
if (!(WeaponAbility.GetCurrentAbility(attacker) is MysticArc))
|
||
Timer.DelayCall(TimeSpan.FromMilliseconds(333.0), new TimerCallback(ThrowBack));
|
||
|
||
base.OnMiss(attacker, damageable);
|
||
}
|
||
|
||
public virtual void ThrowBack()
|
||
{
|
||
if (m_Target != null)
|
||
m_Target.MovingEffect(m_Thrower, EffectID, 18, 1, false, false, Hue, 0);
|
||
else if (m_Thrower != null)
|
||
Effects.SendMovingParticles(new Entity(Serial.Zero, m_KillSave, m_Thrower.Map), m_Thrower, ItemID, 18, 0, false, false, Hue, 0, 9502, 1, 0, (EffectLayer)255, 0x100);
|
||
}
|
||
|
||
public override void Serialize(GenericWriter writer)
|
||
{
|
||
base.Serialize(writer);
|
||
|
||
writer.Write((int)1); // version
|
||
}
|
||
|
||
public override void Deserialize(GenericReader reader)
|
||
{
|
||
base.Deserialize(reader);
|
||
|
||
int version = reader.ReadInt();
|
||
|
||
if (version == 0)
|
||
InheritsItem = true;
|
||
}
|
||
|
||
#region Old Item Serialization Vars
|
||
/* DO NOT USE! Only used in serialization of abyss reaver that originally derived from Item */
|
||
public bool InheritsItem { get; protected set; }
|
||
#endregion
|
||
}
|
||
}
|