AvatarsConquest/Scripts/Skills/Poisoning.cs

154 lines
No EOL
4.3 KiB
C#

using System;
using Server.Targeting;
using Server.Items;
using Server.Network;
namespace Server.SkillHandlers
{
public class Poisoning
{
public static void Initialize()
{
SkillInfo.Table[(int)SkillName.Poisoning].Callback = new SkillUseCallback( OnUse );
}
public static TimeSpan OnUse( Mobile m )
{
m.Target = new InternalTargetPoison();
m.SendLocalizedMessage( 502137 ); // Select the poison you wish to use
return TimeSpan.FromSeconds( 10.0 ); // 10 second delay before beign able to re-use a skill
}
private class InternalTargetPoison : Target
{
public InternalTargetPoison() : base ( 2, false, TargetFlags.None )
{
}
protected override void OnTarget( Mobile from, object targeted )
{
if ( targeted is BasePoisonPotion )
{
from.SendLocalizedMessage( 502142 ); // To what do you wish to apply the poison?
from.Target = new InternalTarget( (BasePoisonPotion)targeted );
}
else // Not a Poison Potion
{
from.SendLocalizedMessage( 502139 ); // That is not a poison potion.
}
}
private class InternalTarget : Target
{
private BasePoisonPotion m_Potion;
public InternalTarget( BasePoisonPotion potion ) : base ( 2, false, TargetFlags.None )
{
m_Potion = potion;
}
protected override void OnTarget( Mobile from, object targeted )
{
if ( m_Potion.Deleted )
return;
bool startTimer = false;
if ( targeted is Food )
{
startTimer = true;
}
else if ( targeted is BaseWeapon )
{
BaseWeapon weapon = (BaseWeapon)targeted;
if ( weapon.Layer == Layer.OneHanded )
{
// Only Bladed or Piercing weapon can be poisoned
startTimer = ( weapon.Type == WeaponType.Slashing || weapon.Type == WeaponType.Piercing );
}
}
if ( startTimer )
{
new InternalTimer( from, (Item)targeted, m_Potion ).Start();
from.PlaySound( 0x4F );
m_Potion.Consume();
from.AddToBackpack( new Bottle() );
}
else // Target can't be poisoned
{
from.SendLocalizedMessage( 502145 ); // You cannot poison that! You can only poison bladed or piercing weapons, food or drink.
}
}
private class InternalTimer : Timer
{
private Mobile m_From;
private Item m_Target;
private Poison m_Poison;
private double m_MinSkill, m_MaxSkill;
public InternalTimer( Mobile from, Item target, BasePoisonPotion potion ) : base( TimeSpan.FromSeconds( 2.0 ) )
{
m_From = from;
m_Target = target;
m_Poison = potion.Poison;
m_MinSkill = potion.MinPoisoningSkill;
m_MaxSkill = potion.MaxPoisoningSkill;
Priority = TimerPriority.TwoFiftyMS;
}
protected override void OnTick()
{
if ( m_From.CheckTargetSkill( SkillName.Poisoning, m_Target, m_MinSkill, m_MaxSkill ) )
{
if ( m_Target is Food )
{
((Food)m_Target).Poison = m_Poison;
}
else if ( m_Target is BaseWeapon )
{
((BaseWeapon)m_Target).Poison = m_Poison;
((BaseWeapon)m_Target).PoisonCharges = 18 - (m_Poison.Level * 2);
}
m_From.SendLocalizedMessage( 1010517 ); // You apply the poison
Misc.Titles.AwardKarma( m_From, -20, true );
}
else // Failed
{
// 5% of chance of getting poisoned if failed
if ( m_From.Skills[SkillName.Poisoning].Base < 80.0 && Utility.Random( 20 ) == 0 )
{
m_From.SendLocalizedMessage( 502148 ); // You make a grave mistake while applying the poison.
m_From.ApplyPoison( m_From, m_Poison );
}
else
{
if ( m_Target is BaseWeapon )
{
BaseWeapon weapon = (BaseWeapon)m_Target;
if ( weapon.Type == WeaponType.Slashing )
m_From.SendLocalizedMessage( 1010516 ); // You fail to apply a sufficient dose of poison on the blade
else
m_From.SendLocalizedMessage( 1010518 ); // You fail to apply a sufficient dose of poison
}
else
{
m_From.SendLocalizedMessage( 1010518 ); // You fail to apply a sufficient dose of poison
}
}
}
}
}
}
}
}
}