105 lines
2.8 KiB
C#
105 lines
2.8 KiB
C#
using System;
|
|
using ModernUO.Serialization;
|
|
|
|
namespace Server.Items;
|
|
|
|
[SerializationGenerator(0)]
|
|
public abstract partial class BaseThrown : BaseRanged
|
|
{
|
|
public BaseThrown(int itemID) : base(itemID)
|
|
{
|
|
}
|
|
|
|
public abstract int MinThrowRange { get; }
|
|
|
|
public virtual int MaxThrowRange => MinThrowRange + 3;
|
|
|
|
public override int DefMaxRange
|
|
{
|
|
get
|
|
{
|
|
int baseRange = MaxThrowRange;
|
|
|
|
return Parent is Mobile attacker
|
|
? baseRange - 3 + (attacker.Str - AosStrengthReq) / ((140 - AosStrengthReq) / 3)
|
|
: baseRange;
|
|
}
|
|
}
|
|
|
|
public override int EffectID => ItemID;
|
|
|
|
public override Type AmmoType => null;
|
|
|
|
public override Item Ammo => null;
|
|
|
|
public override int DefHitSound => 0x5D3;
|
|
public override int DefMissSound => 0x5D4;
|
|
|
|
public override SkillName DefSkill => SkillName.Throwing;
|
|
|
|
public override WeaponAnimation DefAnimation => WeaponAnimation.Throwing;
|
|
|
|
public override bool OnFired(Mobile attacker, Mobile defender)
|
|
{
|
|
if (!attacker.InRange(defender, 1))
|
|
{
|
|
attacker.MovingEffect(defender, EffectID, 18, 1, false, false, Hue, 0);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public override void OnHit(Mobile attacker, Mobile defender, double damageBonus = 1)
|
|
{
|
|
if (WeaponAbility.GetCurrentAbility(attacker) is not MysticArc)
|
|
{
|
|
var location = new WorldLocation(defender.Location, attacker.Map);
|
|
Timer.StartTimer(TimeSpan.FromSeconds(0.3), () => Return(attacker, defender, location));
|
|
}
|
|
|
|
base.OnHit(attacker, defender, damageBonus);
|
|
}
|
|
|
|
public override void OnMiss(Mobile attacker, Mobile defender)
|
|
{
|
|
if (WeaponAbility.GetCurrentAbility(attacker) is not MysticArc)
|
|
{
|
|
var location = new WorldLocation(defender.Location, attacker.Map);
|
|
Timer.StartTimer(TimeSpan.FromSeconds(0.3), () => Return(attacker, defender, location));
|
|
}
|
|
|
|
base.OnMiss(attacker, defender);
|
|
}
|
|
|
|
public virtual void Return(Mobile thrower, Mobile target, WorldLocation worldLocation)
|
|
{
|
|
if (thrower == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (target != null)
|
|
{
|
|
target.MovingEffect(thrower, EffectID, 18, 1, false, false, Hue, 0);
|
|
}
|
|
else
|
|
{
|
|
Effects.SendMovingParticles(
|
|
new Entity(Serial.Zero, worldLocation.Location, worldLocation.Map),
|
|
thrower,
|
|
ItemID,
|
|
18,
|
|
0,
|
|
false,
|
|
false,
|
|
Hue,
|
|
0,
|
|
9502,
|
|
1,
|
|
0,
|
|
(EffectLayer)255,
|
|
0x100
|
|
);
|
|
}
|
|
}
|
|
}
|