Macil
Initiate
Trying to make potions not consume when used only if the player is a staff member. I know it will need some code along the lines of "
. But I'm not entirely sure where to add it at in the BasePotion script (presumably it WOULD go in BasePotion, right?
Code:
if ( from.AccessLevel >= AccessLevel.GameMaster )
Code:
using System;
using System.Collections.Generic;
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,
Conflagration,
ConflagrationGreater,
MaskOfDeath, // Mask of Death is not available in OSI but does exist in cliloc files
MaskOfDeathGreater, // included in enumeration for compatability if later enabled by OSI
ConfusionBlast,
ConfusionBlastGreater,
Invisibility,
Parasitic,
Darkglow,
ExplodingTarPotion,
#region TOL Publish 93
Barrab,
Jukari,
Kurak,
Barako,
Urali,
Sakkhra,
#endregion
}
public abstract class BasePotion : Item, ICraftable, ICommodity
{
private PotionEffect m_PotionEffect;
public PotionEffect PotionEffect
{
get
{
return this.m_PotionEffect;
}
set
{
this.m_PotionEffect = value;
this.InvalidateProperties();
}
}
TextDefinition ICommodity.Description
{
get
{
return this.LabelNumber;
}
}
bool ICommodity.IsDeedable
{
get
{
return (Core.ML);
}
}
public override int LabelNumber
{
get
{
return 1041314 + (int)this.m_PotionEffect;
}
}
public BasePotion(int itemID, PotionEffect effect)
: base(itemID)
{
this.m_PotionEffect = effect;
this.Stackable = Core.ML;
this.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;
if (handTwo is BaseWeapon)
{
BaseWeapon wep = (BaseWeapon)handTwo;
if (wep.Attributes.BalancedWeapon > 0)
return true;
}
return (handOne == null || handTwo == null);
}
public override void OnDoubleClick(Mobile from)
{
if (!this.Movable)
return;
if (!from.BeginAction(this.GetType()))
{
from.SendLocalizedMessage(500119); // You must wait to perform another action.
return;
}
Timer.DelayCall(TimeSpan.FromMilliseconds(500), () => from.EndAction(this.GetType()));
if (from.InRange(this.GetWorldLocation(), 1))
{
if (!this.RequireFreeHand || HasFreeHand(from))
{
if (this is BaseExplosionPotion && this.Amount > 1)
{
BasePotion pot = (BasePotion)Activator.CreateInstance(this.GetType());
if (pot != null)
{
this.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)this.m_PotionEffect);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
switch ( version )
{
case 1:
case 0:
{
this.m_PotionEffect = (PotionEffect)reader.ReadInt();
break;
}
}
if (version == 0)
this.Stackable = Core.ML;
}
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)
{
if (Core.SA)
{
m.Animate(AnimationType.Eat, 0);
}
else
{
m.Animate(34, 5, 1, true, false, 0);
}
}
}
public static int EnhancePotions(Mobile m)
{
int EP = AosAttributes.GetValue(m, AosAttribute.EnhancePotions);
int skillBonus = m.Skills.Alchemy.Fixed / 330 * 10;
if (Core.ML && EP > 50 && m.IsPlayer())
EP = 50;
return (EP + skillBonus);
}
public static TimeSpan Scale(Mobile m, TimeSpan v)
{
if (!Core.AOS)
return v;
double scalar = 1.0 + (0.01 * EnhancePotions(m));
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 * EnhancePotions(m));
return v * scalar;
}
public static int Scale(Mobile m, int v)
{
if (!Core.AOS)
return v;
return AOS.Scale(v, 100 + EnhancePotions(m));
}
public override bool WillStack(Mobile from, Item dropped)
{
return dropped is BasePotion && ((BasePotion)dropped).m_PotionEffect == this.m_PotionEffect && base.WillStack(from, dropped);
}
#region ICraftable Members
public int OnCraft(int quality, bool makersMark, Mobile from, CraftSystem craftSystem, Type typeRes, ITool tool, CraftItem craftItem, int resHue)
{
if (craftSystem is DefAlchemy)
{
Container pack = from.Backpack;
if (pack != null)
{
if ((int)this.PotionEffect >= (int)PotionEffect.Invisibility)
return 1;
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 != this.PotionEffect)
continue;
++keg.Held;
this.Consume();
from.AddToBackpack(new Bottle());
return -1; // signal placed in keg
}
}
}
return 1;
}
#endregion
}
}