using System; using Server; using Server.Engines.Craft; using System.Collections.Generic; 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, InvisibilityWeak, Invisibility, InvisibilityStrong, VigorWeak, Vigor, VigorStrong, ManaWeak, Mana, ManaStrong } 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 Server.Misc.Settings.CannotDrinkPotionsWhileHoldingThings(); } } 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)) { if (this is BaseExplosionPotion && Amount > 1) { BasePotion pot = (BasePotion)Activator.CreateInstance(this.GetType()); if (pot != null) { Amount--; if (from.Backpack != null && !from.Backpack.Deleted) { from.Backpack.DropItem(pot); } else { pot.MoveToWorld(from.Location, from.Map); } pot.Drink( from ); } } else { this.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) 1 ); // version writer.Write( (int) m_PotionEffect ); } public override void Deserialize( GenericReader reader ) { base.Deserialize( reader ); int version = reader.ReadInt(); switch ( version ) { case 1: case 0: { m_PotionEffect = (PotionEffect)reader.ReadInt(); break; } } if( version == 0 ) Stackable = false; } 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 ) { return v; } public static double Scale( Mobile m, double v ) { return v; } public static int Scale( Mobile m, int v ) { return v; } public override bool StackWith( Mobile from, Item dropped, bool playSound ) { if( dropped is BasePotion && ((BasePotion)dropped).m_PotionEffect == m_PotionEffect ) return base.StackWith( from, dropped, playSound ); return false; } #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 ) { List kegs = pack.FindItemsByType(); for ( int i = 0; i < kegs.Count; ++i ) { PotionKeg keg = kegs[i]; if ( keg == null ) continue; if ( keg.Held <= 0 || keg.Held >= 100 ) continue; if ( keg.Type != PotionEffect ) continue; ++keg.Held; Consume(); from.AddToBackpack( new Bottle() ); return -1; // signal placed in keg } } } return 1; } #endregion } }