199 lines
No EOL
4 KiB
C#
199 lines
No EOL
4 KiB
C#
using System;
|
|
using Server;
|
|
using Server.Engines.Craft;
|
|
|
|
namespace Server.Items
|
|
{
|
|
public enum PotionEffect
|
|
{
|
|
Nightsight,
|
|
CureLesser,
|
|
Cure,
|
|
CureGreater,
|
|
Agility,
|
|
AgilityGreater,
|
|
Strength,
|
|
StrengthGreater,
|
|
PoisonLesser,
|
|
Poison,
|
|
PoisonGreater,
|
|
PoisonDeadly,
|
|
Refresh,
|
|
RefreshTotal,
|
|
HealLesser,
|
|
Heal,
|
|
HealGreater,
|
|
ExplosionLesser,
|
|
Explosion,
|
|
ExplosionGreater
|
|
}
|
|
|
|
public abstract class BasePotion : Item, ICraftable
|
|
{
|
|
private PotionEffect m_PotionEffect;
|
|
|
|
public PotionEffect PotionEffect
|
|
{
|
|
get
|
|
{
|
|
return m_PotionEffect;
|
|
}
|
|
set
|
|
{
|
|
m_PotionEffect = value;
|
|
InvalidateProperties();
|
|
}
|
|
}
|
|
|
|
public override int LabelNumber{ get{ return 1041314 + (int)m_PotionEffect; } }
|
|
|
|
public BasePotion( int itemID, PotionEffect effect ) : base( itemID )
|
|
{
|
|
m_PotionEffect = effect;
|
|
|
|
Stackable = false;
|
|
Weight = 1.0;
|
|
}
|
|
|
|
public BasePotion( Serial serial ) : base( serial )
|
|
{
|
|
}
|
|
|
|
public virtual bool RequireFreeHand{ get{ return true; } }
|
|
|
|
public static bool HasFreeHand( Mobile m )
|
|
{
|
|
Item handOne = m.FindItemOnLayer( Layer.OneHanded );
|
|
Item handTwo = m.FindItemOnLayer( Layer.TwoHanded );
|
|
|
|
if ( handTwo is BaseWeapon )
|
|
handOne = handTwo;
|
|
|
|
return ( handOne == null || handTwo == null );
|
|
}
|
|
|
|
public override void OnDoubleClick( Mobile from )
|
|
{
|
|
if ( !Movable )
|
|
return;
|
|
|
|
if ( from.InRange( this.GetWorldLocation(), 1 ) )
|
|
{
|
|
if ( !RequireFreeHand || HasFreeHand( from ) )
|
|
Drink( from );
|
|
else
|
|
from.SendLocalizedMessage( 502172 ); // You must have a free hand to drink a potion.
|
|
}
|
|
else
|
|
{
|
|
from.SendLocalizedMessage( 502138 ); // That is too far away for you to use
|
|
}
|
|
}
|
|
|
|
public override void Serialize( GenericWriter writer )
|
|
{
|
|
base.Serialize( writer );
|
|
|
|
writer.Write( (int) 0 ); // version
|
|
|
|
writer.Write( (int) m_PotionEffect );
|
|
}
|
|
|
|
public override void Deserialize( GenericReader reader )
|
|
{
|
|
base.Deserialize( reader );
|
|
|
|
int version = reader.ReadInt();
|
|
|
|
switch ( version )
|
|
{
|
|
case 0:
|
|
{
|
|
m_PotionEffect = (PotionEffect)reader.ReadInt();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
public abstract void Drink( Mobile from );
|
|
|
|
public static void PlayDrinkEffect( Mobile m )
|
|
{
|
|
m.RevealingAction();
|
|
|
|
m.PlaySound( 0x2D6 );
|
|
|
|
m.AddToBackpack( new Bottle() );
|
|
|
|
if ( m.Body.IsHuman /*&& !m.Mounted*/ )
|
|
m.Animate( 34, 5, 1, true, false, 0 );
|
|
}
|
|
|
|
public static TimeSpan Scale( Mobile m, TimeSpan v )
|
|
{
|
|
if ( !Core.AOS )
|
|
return v;
|
|
|
|
double scalar = 1.0 + (0.01 * AosAttributes.GetValue( m, AosAttribute.EnhancePotions ));
|
|
|
|
return TimeSpan.FromSeconds( v.TotalSeconds * scalar );
|
|
}
|
|
|
|
public static double Scale( Mobile m, double v )
|
|
{
|
|
if ( !Core.AOS )
|
|
return v;
|
|
|
|
double scalar = 1.0 + (0.01 * AosAttributes.GetValue( m, AosAttribute.EnhancePotions ));
|
|
|
|
return v * scalar;
|
|
}
|
|
|
|
public static int Scale( Mobile m, int v )
|
|
{
|
|
if ( !Core.AOS )
|
|
return v;
|
|
|
|
return AOS.Scale( v, 100 + AosAttributes.GetValue( m, AosAttribute.EnhancePotions ) );
|
|
}
|
|
#region ICraftable Members
|
|
|
|
public int OnCraft( int quality, bool makersMark, Mobile from, CraftSystem craftSystem, Type typeRes, BaseTool tool, CraftItem craftItem, int resHue )
|
|
{
|
|
if ( craftSystem is DefAlchemy )
|
|
{
|
|
Container pack = from.Backpack;
|
|
|
|
if ( pack != null )
|
|
{
|
|
Item[] kegs = pack.FindItemsByType( typeof( PotionKeg ), true );
|
|
|
|
for ( int i = 0; i < kegs.Length; ++i )
|
|
{
|
|
PotionKeg keg = kegs[i] as PotionKeg;
|
|
|
|
if ( keg == null )
|
|
continue;
|
|
|
|
if ( keg.Held <= 0 || keg.Held >= 100 )
|
|
continue;
|
|
|
|
if ( keg.Type != PotionEffect )
|
|
continue;
|
|
|
|
++keg.Held;
|
|
|
|
Delete();
|
|
from.AddToBackpack( new Bottle() );
|
|
|
|
return -1; // signal placed in keg
|
|
}
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
} |