AvatarsConquest/Scripts/Items/Skill Items/Potions/BasePotion.cs

235 lines
No EOL
4.5 KiB
C#

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<PotionKeg> kegs = pack.FindItemsByType<PotionKeg>();
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
}
}