using System;
using Server.Engines.Craft;
using System.Linq;
using Server.ContextMenus;
using System.Collections.Generic;
namespace Server.Items
{
public interface IRangeDamage
{
void AlterRangedDamage(ref int phys, ref int fire, ref int cold, ref int pois, ref int nrgy, ref int chaos, ref int direct);
}
[Alterable(typeof(DefTailoring), typeof(GargishLeatherWingArmor), true)]
public class BaseQuiver : Container, ICraftable, ISetItem, IVvVItem, IOwnerRestricted, IRangeDamage, IArtifact
{
private bool _VvVItem;
private Mobile _Owner;
private string _OwnerName;
[CommandProperty(AccessLevel.GameMaster)]
public bool IsVvVItem
{
get { return _VvVItem; }
set { _VvVItem = value; InvalidateProperties(); }
}
[CommandProperty(AccessLevel.GameMaster)]
public Mobile Owner
{
get { return _Owner; }
set { _Owner = value; if (_Owner != null) _OwnerName = _Owner.Name; InvalidateProperties(); }
}
public virtual string OwnerName
{
get { return _OwnerName; }
set { _OwnerName = value; InvalidateProperties(); }
}
public override int DefaultGumpID
{
get
{
return 0x108;
}
}
public override int DefaultMaxItems
{
get
{
return 1;
}
}
public override int DefaultMaxWeight
{
get
{
return 50;
}
}
public override double DefaultWeight
{
get
{
return 2.0;
}
}
public override bool DisplayWeight
{
get
{
if (IsVvVItem)
return true;
return base.DisplayWeight;
}
}
public virtual int ArtifactRarity { get { return 0; } }
private AosAttributes m_Attributes;
private AosSkillBonuses m_AosSkillBonuses;
private AosElementAttributes m_Resistances;
private int m_Capacity;
//private int m_LowerAmmoCost;
private int m_WeightReduction;
private int m_DamageIncrease;
public virtual bool CanAlter { get { return true; } }
[CommandProperty(AccessLevel.GameMaster)]
public bool IsArrowAmmo { get; set; }
[CommandProperty(AccessLevel.GameMaster)]
public AosAttributes Attributes
{
get
{
return m_Attributes;
}
set
{
}
}
[CommandProperty(AccessLevel.GameMaster)]
public AosSkillBonuses SkillBonuses
{
get
{
return m_AosSkillBonuses;
}
set
{
}
}
[CommandProperty(AccessLevel.GameMaster)]
public AosElementAttributes Resistances
{
get
{
return m_Resistances;
}
set
{
}
}
[CommandProperty(AccessLevel.GameMaster)]
public int Capacity
{
get
{
return m_Capacity;
}
set
{
m_Capacity = value;
InvalidateProperties();
}
}
[CommandProperty(AccessLevel.GameMaster)]
public int LowerAmmoCost
{
get
{
return m_Attributes.LowerAmmoCost;
}
set
{
m_Attributes.LowerAmmoCost = value;
InvalidateProperties();
}
}
[CommandProperty(AccessLevel.GameMaster)]
public int WeightReduction
{
get
{
return m_WeightReduction;
}
set
{
m_WeightReduction = value;
InvalidateProperties();
}
}
[CommandProperty(AccessLevel.GameMaster)]
public int DamageIncrease
{
get
{
return m_DamageIncrease;
}
set
{
m_DamageIncrease = value;
InvalidateProperties();
}
}
private Mobile m_Crafter;
private ItemQuality m_Quality;
private bool m_PlayerConstructed;
[CommandProperty(AccessLevel.GameMaster)]
public Mobile Crafter
{
get
{
return m_Crafter;
}
set
{
m_Crafter = value;
InvalidateProperties();
}
}
[CommandProperty(AccessLevel.GameMaster)]
public ItemQuality Quality
{
get
{
return m_Quality;
}
set
{
m_Quality = value;
InvalidateProperties();
}
}
[CommandProperty(AccessLevel.GameMaster)]
public bool PlayerConstructed
{
get
{
return m_PlayerConstructed;
}
set
{
m_PlayerConstructed = value;
}
}
public Item Ammo
{
get
{
return Items.Count > 0 ? Items[0] : null;
}
}
public BaseQuiver()
: this(0x2FB7)
{
}
public BaseQuiver(int itemID)
: base(itemID)
{
Weight = 2.0;
Capacity = 500;
Layer = Layer.Cloak;
m_Attributes = new AosAttributes(this);
m_AosSkillBonuses = new AosSkillBonuses(this);
m_Resistances = new AosElementAttributes(this);
m_SetAttributes = new AosAttributes(this);
m_SetSkillBonuses = new AosSkillBonuses(this);
DamageIncrease = 10;
IsArrowAmmo = true;
}
public BaseQuiver(Serial serial)
: base(serial)
{
}
public override bool DisplaysContent { get { return false; } }
public override void OnAfterDuped(Item newItem)
{
var quiver = newItem as BaseQuiver;
if (quiver != null)
{
quiver.m_Attributes = new AosAttributes(newItem, m_Attributes);
quiver.m_AosSkillBonuses = new AosSkillBonuses(newItem, m_AosSkillBonuses);
quiver.m_Resistances = new AosElementAttributes(newItem, m_Resistances);
quiver.m_SetAttributes = new AosAttributes(newItem, m_SetAttributes);
quiver.m_SetSkillBonuses = new AosSkillBonuses(newItem, m_SetSkillBonuses);
}
var wing = newItem as GargishLeatherWingArmor;
if (wing != null)
{
int phys, fire, cold, pois, nrgy, chaos, direct;
phys = fire = cold = pois = nrgy = chaos = direct = 0;
AlterRangedDamage(ref phys, ref fire, ref cold, ref pois, ref nrgy, ref chaos, ref direct);
wing.AosElementDamages.Physical = phys;
wing.AosElementDamages.Fire = fire;
wing.AosElementDamages.Cold = cold;
wing.AosElementDamages.Poison = pois;
wing.AosElementDamages.Energy = nrgy;
wing.AosElementDamages.Chaos = chaos;
wing.AosElementDamages.Direct = direct;
}
base.OnAfterDuped(newItem);
}
public override void UpdateTotal(Item sender, TotalType type, int delta)
{
InvalidateProperties();
base.UpdateTotal(sender, type, delta);
}
public override int GetTotal(TotalType type)
{
int total = base.GetTotal(type);
if (type == TotalType.Weight)
total -= total * m_WeightReduction / 100;
return total;
}
private static readonly Type[] m_Ammo = new Type[]
{
typeof(Arrow), typeof(Bolt)
};
public bool CheckType(Item item)
{
Type type = item.GetType();
Item ammo = Ammo;
if (ammo != null)
{
if (ammo.GetType() == type)
return true;
}
else
{
for (int i = 0; i < m_Ammo.Length; i++)
{
if (type == m_Ammo[i])
return true;
}
}
return false;
}
public override bool CheckHold(Mobile m, Item item, bool message, bool checkItems, int plusItems, int plusWeight)
{
if (!Movable)
return false;
if (!CheckType(item))
{
if (message)
m.SendLocalizedMessage(1074836); // The container can not hold that type of object.
return false;
}
Item ammo = Ammo;
if(ammo != null && ammo.Amount > 0)
{
if (IsArrowAmmo && item is Bolt)
return false;
if (!IsArrowAmmo && item is Arrow)
return false;
}
if (!checkItems || Items.Count < DefaultMaxItems)
{
int currentAmount = 0;
Items.ForEach(i => currentAmount += i.Amount);
if (item.Amount + currentAmount <= m_Capacity)
return base.CheckHold(m, item, message, checkItems, plusItems, plusWeight);
}
return false;
}
public override bool CheckStack(Mobile from, Item item)
{
if (!CheckType(item))
{
return false;
}
Item ammo = Ammo;
if (ammo != null)
{
int currentAmount = Items.Sum(i => i.Amount);
if (item.Amount + currentAmount <= m_Capacity)
return base.CheckStack(from, item);
}
return false;
}
public override void AddItem(Item dropped)
{
base.AddItem(dropped);
InvalidateWeight();
IsArrowAmmo = dropped is Arrow;
}
public override void RemoveItem(Item dropped)
{
base.RemoveItem(dropped);
InvalidateWeight();
}
public override void OnAdded(object parent)
{
if (parent is Mobile)
{
Mobile mob = (Mobile)parent;
m_Attributes.AddStatBonuses(mob);
m_AosSkillBonuses.AddTo(mob);
BaseRanged ranged = mob.Weapon as BaseRanged;
if (ranged != null)
ranged.InvalidateProperties();
#region Mondain's Legacy Sets
if (IsSetItem)
{
m_SetEquipped = SetHelper.FullSetEquipped(mob, SetID, Pieces);
if (m_SetEquipped)
{
m_LastEquipped = true;
SetHelper.AddSetBonus(mob, SetID);
}
}
#endregion
}
}
public override void OnRemoved(object parent)
{
if (parent is Mobile)
{
Mobile mob = (Mobile)parent;
m_Attributes.RemoveStatBonuses(mob);
m_AosSkillBonuses.Remove();
#region Mondain's Legacy Sets
if (IsSetItem && m_SetEquipped)
SetHelper.RemoveSetBonus(mob, SetID, this);
#endregion
}
}
public override bool OnDragLift(Mobile from)
{
#region Mondain's Legacy Sets
if (Parent is Mobile && from == Parent)
{
if (IsSetItem && m_SetEquipped)
SetHelper.RemoveSetBonus(from, SetID, this);
}
#endregion
return base.OnDragLift(from);
}
public override bool CanEquip(Mobile m)
{
#region Stygian Abyss
if (m.Race == Race.Gargoyle)
{
m.SendLocalizedMessage(1111708); // Gargoyles can't wear
return false;
}
#endregion
if (m.IsPlayer())
{
if (_Owner != null && m != _Owner)
{
m.SendLocalizedMessage(501023); // You must be the owner to use this item.
return false;
}
if (this is IAccountRestricted && ((IAccountRestricted)this).Account != null)
{
Accounting.Account acct = m.Account as Accounting.Account;
if (acct == null || acct.Username != ((IAccountRestricted)this).Account)
{
m.SendLocalizedMessage(1071296); // This item is Account Bound and your character is not bound to it. You cannot use this item.
return false;
}
}
if (IsVvVItem && !Engines.VvV.ViceVsVirtueSystem.IsVvV(m))
{
m.SendLocalizedMessage(1155496); // This item can only be used by VvV participants!
return false;
}
}
if (m.NetState != null && !m.NetState.SupportsExpansion(Expansion.ML))
{
m.SendLocalizedMessage(1072791); // You must upgrade to Mondain's Legacy in order to use that item.
return false;
}
return true;
}
public virtual int BasePhysicalResistance { get { return 0; } }
public virtual int BaseFireResistance { get { return 0; } }
public virtual int BaseColdResistance { get { return 0; } }
public virtual int BasePoisonResistance { get { return 0; } }
public virtual int BaseEnergyResistance { get { return 0; } }
public override int PhysicalResistance { get { return BasePhysicalResistance + m_Resistances.Physical; } }
public override int FireResistance { get { return BaseFireResistance + m_Resistances.Fire; } }
public override int ColdResistance { get { return BaseColdResistance + m_Resistances.Cold; } }
public override int PoisonResistance { get { return BasePoisonResistance + m_Resistances.Poison; } }
public override int EnergyResistance { get { return BaseEnergyResistance + m_Resistances.Energy; } }
public override void AddWeightProperty(ObjectPropertyList list)
{
base.AddWeightProperty(list);
if (IsVvVItem)
list.Add(1154937); // VvV Item
}
public override void AddCraftedProperties(ObjectPropertyList list)
{
if (OwnerName != null)
{
list.Add(1153213, OwnerName);
}
if (m_Crafter != null)
{
list.Add(1050043, m_Crafter.TitleName); // crafted by ~1_NAME~
}
if (m_Quality == ItemQuality.Exceptional)
list.Add(1063341); // exceptional
}
public override void AddNameProperties(ObjectPropertyList list)
{
base.AddNameProperties(list);
m_AosSkillBonuses.GetProperties(list);
Item ammo = Ammo;
if (ammo != null)
{
if (ammo is Arrow)
list.Add(1075265, "{0}\t{1}", ammo.Amount, Capacity); // Ammo: ~1_QUANTITY~/~2_CAPACITY~ arrows
else if (ammo is Bolt)
list.Add(1075266, "{0}\t{1}", ammo.Amount, Capacity); // Ammo: ~1_QUANTITY~/~2_CAPACITY~ bolts
}
else
list.Add(1075265, "{0}\t{1}", 0, Capacity); // Ammo: ~1_QUANTITY~/~2_CAPACITY~ arrows
if (ArtifactRarity > 0)
{
list.Add(1061078, ArtifactRarity.ToString()); // artifact rarity ~1_val~
}
int prop;
if ((prop = m_DamageIncrease) != 0)
list.Add(1074762, prop.ToString()); // Damage modifier: ~1_PERCENT~%
int phys, fire, cold, pois, nrgy, chaos, direct;
phys = fire = cold = pois = nrgy = chaos = direct = 0;
AlterRangedDamage(ref phys, ref fire, ref cold, ref pois, ref nrgy, ref chaos, ref direct);
if (phys != 0)
list.Add(1060403, phys.ToString()); // physical damage ~1_val~%
if (fire != 0)
list.Add(1060405, fire.ToString()); // fire damage ~1_val~%
if (cold != 0)
list.Add(1060404, cold.ToString()); // cold damage ~1_val~%
if (pois != 0)
list.Add(1060406, pois.ToString()); // poison damage ~1_val~%
if (nrgy != 0)
list.Add(1060407, nrgy.ToString()); // energy damage ~1_val
if (chaos != 0)
list.Add(1072846, chaos.ToString()); // chaos damage ~1_val~%
if (direct != 0)
list.Add(1079978, direct.ToString()); // Direct Damage: ~1_PERCENT~%
if ((prop = m_Attributes.DefendChance) != 0)
list.Add(1060408, prop.ToString()); // defense chance increase ~1_val~%
if ((prop = m_Attributes.BonusDex) != 0)
list.Add(1060409, prop.ToString()); // dexterity bonus ~1_val~
if ((prop = m_Attributes.EnhancePotions) != 0)
list.Add(1060411, prop.ToString()); // enhance potions ~1_val~%
if ((prop = m_Attributes.CastRecovery) != 0)
list.Add(1060412, prop.ToString()); // faster cast recovery ~1_val~
if ((prop = m_Attributes.CastSpeed) != 0)
list.Add(1060413, prop.ToString()); // faster casting ~1_val~
if ((prop = m_Attributes.AttackChance) != 0)
list.Add(1060415, prop.ToString()); // hit chance increase ~1_val~%
if ((prop = m_Attributes.BonusHits) != 0)
list.Add(1060431, prop.ToString()); // hit point increase ~1_val~
if ((prop = m_Attributes.BonusInt) != 0)
list.Add(1060432, prop.ToString()); // intelligence bonus ~1_val~
if ((prop = m_Attributes.LowerManaCost) != 0)
list.Add(1060433, prop.ToString()); // lower mana cost ~1_val~%
if ((prop = m_Attributes.LowerRegCost) != 0)
list.Add(1060434, prop.ToString()); // lower reagent cost ~1_val~%
if ((prop = m_Attributes.Luck) != 0)
list.Add(1060436, prop.ToString()); // luck ~1_val~
if ((prop = m_Attributes.BonusMana) != 0)
list.Add(1060439, prop.ToString()); // mana increase ~1_val~
if ((prop = m_Attributes.RegenMana) != 0)
list.Add(1060440, prop.ToString()); // mana regeneration ~1_val~
if ((prop = m_Attributes.NightSight) != 0)
list.Add(1060441); // night sight
if ((prop = m_Attributes.ReflectPhysical) != 0)
list.Add(1060442, prop.ToString()); // reflect physical damage ~1_val~%
if ((prop = m_Attributes.RegenStam) != 0)
list.Add(1060443, prop.ToString()); // stamina regeneration ~1_val~
if ((prop = m_Attributes.RegenHits) != 0)
list.Add(1060444, prop.ToString()); // hit point regeneration ~1_val~
if ((prop = m_Attributes.SpellDamage) != 0)
list.Add(1060483, prop.ToString()); // spell damage increase ~1_val~%
if ((prop = m_Attributes.BonusStam) != 0)
list.Add(1060484, prop.ToString()); // stamina increase ~1_val~
if ((prop = m_Attributes.BonusStr) != 0)
list.Add(1060485, prop.ToString()); // strength bonus ~1_val~
if ((prop = m_Attributes.WeaponSpeed) != 0)
list.Add(1060486, prop.ToString()); // swing speed increase ~1_val~%
if ((prop = m_Attributes.LowerAmmoCost) > 0)
list.Add(1075208, prop.ToString()); // Lower Ammo Cost ~1_Percentage~%
#region Mondain's Legacy Sets
if (IsSetItem)
{
list.Add(1073491, Pieces.ToString()); // Part of a Weapon/Armor Set (~1_val~ pieces)
if (SetID == SetItem.Bestial)
list.Add(1151541, BestialSetHelper.GetTotalBerserk(this).ToString()); // Berserk ~1_VAL~
if (BardMasteryBonus)
list.Add(1151553); // Activate: Bard Mastery Bonus x2
(Effect: 1 min. Cooldown: 30 min.)
if (m_SetEquipped)
{
list.Add(1073492); // Full Weapon/Armor Set Present
SetHelper.GetSetProperties(list, this);
}
}
#endregion
base.AddResistanceProperties(list);
double weight = 0;
if (ammo != null)
weight = ammo.Weight * ammo.Amount;
list.Add(1072241, "{0}\t{1}\t{2}\t{3}", Items.Count, DefaultMaxItems, (int)weight, DefaultMaxWeight); // Contents: ~1_COUNT~/~2_MAXCOUNT items, ~3_WEIGHT~/~4_MAXWEIGHT~ stones
if ((prop = m_WeightReduction) != 0)
list.Add(1072210, prop.ToString()); // Weight reduction: ~1_PERCENTAGE~%
#region Mondain's Legacy Sets
if (IsSetItem && !m_SetEquipped)
{
list.Add(1072378); //
Only when full set is present:
SetHelper.GetSetProperties(list, this);
}
#endregion
}
public override void OnSingleClick(Mobile from)
{
base.OnSingleClick(from);
if (m_Crafter != null)
{
LabelTo(from, 1050043, m_Crafter.TitleName); // crafted by ~1_NAME~
}
}
public int SetResistBonus(ResistanceType resist)
{
switch (resist)
{
case ResistanceType.Physical: return PhysicalResistance;
case ResistanceType.Fire: return FireResistance;
case ResistanceType.Cold: return ColdResistance;
case ResistanceType.Poison: return PoisonResistance;
case ResistanceType.Energy: return EnergyResistance;
}
return 0;
}
private static void SetSaveFlag(ref SaveFlag flags, SaveFlag toSet, bool setIf)
{
if (setIf)
flags |= toSet;
}
private static bool GetSaveFlag(SaveFlag flags, SaveFlag toGet)
{
return ((flags & toGet) != 0);
}
[Flags]
private enum SaveFlag
{
None = 0x00000000,
Attributes = 0x00000001,
DamageModifier = 0x00000002,
LowerAmmoCost = 0x00000004,
WeightReduction = 0x00000008,
Crafter = 0x00000010,
Quality = 0x00000020,
Capacity = 0x00000040,
#region Mondain's Legacy Sets
SetAttributes = 0x00000100,
SetHue = 0x00000200,
LastEquipped = 0x00000400,
SetEquipped = 0x00000800,
SetSkillAttributes = 0x00002000,
SetPhysical = 0x00004000,
SetFire = 0x00008000,
SetCold = 0x00010000,
SetPoison = 0x00020000,
SetEnergy = 0x00040000,
#endregion
DamageIncrease = 0x00000080
}
public override void GetContextMenuEntries(Mobile from, List list)
{
base.GetContextMenuEntries(from, list);
if(from.Items.Contains(this) || (from.Backpack != null && IsChildOf(from.Backpack)))
list.Add(new RefillQuiverEntry(this));
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(4); // version
writer.Write(_VvVItem);
writer.Write(_Owner);
writer.Write(_OwnerName);
// Version 3 takes out LowerAmmoCost
SaveFlag flags = SaveFlag.None;
// Version 2
writer.Write(IsArrowAmmo);
// Version 1
m_AosSkillBonuses.Serialize(writer);
m_Resistances.Serialize(writer);
SetSaveFlag(ref flags, SaveFlag.Attributes, !m_Attributes.IsEmpty);
//SetSaveFlag(ref flags, SaveFlag.LowerAmmoCost, m_LowerAmmoCost != 0);
SetSaveFlag(ref flags, SaveFlag.WeightReduction, m_WeightReduction != 0);
SetSaveFlag(ref flags, SaveFlag.DamageIncrease, m_DamageIncrease != 0);
SetSaveFlag(ref flags, SaveFlag.Crafter, m_Crafter != null);
SetSaveFlag(ref flags, SaveFlag.Quality, true);
SetSaveFlag(ref flags, SaveFlag.Capacity, m_Capacity > 0);
#region Mondain's Legacy Sets
SetSaveFlag(ref flags, SaveFlag.SetAttributes, !m_SetAttributes.IsEmpty);
SetSaveFlag(ref flags, SaveFlag.SetSkillAttributes, !m_SetSkillBonuses.IsEmpty);
SetSaveFlag(ref flags, SaveFlag.SetHue, m_SetHue != 0);
SetSaveFlag(ref flags, SaveFlag.LastEquipped, m_LastEquipped);
SetSaveFlag(ref flags, SaveFlag.SetEquipped, m_SetEquipped);
SetSaveFlag(ref flags, SaveFlag.SetPhysical, m_SetPhysicalBonus != 0);
SetSaveFlag(ref flags, SaveFlag.SetFire, m_SetFireBonus != 0);
SetSaveFlag(ref flags, SaveFlag.SetCold, m_SetColdBonus != 0);
SetSaveFlag(ref flags, SaveFlag.SetPoison, m_SetPoisonBonus != 0);
SetSaveFlag(ref flags, SaveFlag.SetEnergy, m_SetEnergyBonus != 0);
#endregion
writer.WriteEncodedInt((int)flags);
if (GetSaveFlag(flags, SaveFlag.Attributes))
m_Attributes.Serialize(writer);
//if (GetSaveFlag(flags, SaveFlag.LowerAmmoCost))
// writer.Write((int)m_LowerAmmoCost);
if (GetSaveFlag(flags, SaveFlag.WeightReduction))
writer.Write((int)m_WeightReduction);
if (GetSaveFlag(flags, SaveFlag.DamageIncrease))
writer.Write((int)m_DamageIncrease);
if (GetSaveFlag(flags, SaveFlag.Crafter))
writer.Write((Mobile)m_Crafter);
if (GetSaveFlag(flags, SaveFlag.Quality))
writer.Write((int)m_Quality);
if (GetSaveFlag(flags, SaveFlag.Capacity))
writer.Write((int)m_Capacity);
#region Mondain's Legacy Sets
if (GetSaveFlag(flags, SaveFlag.SetPhysical))
writer.WriteEncodedInt((int)m_SetPhysicalBonus);
if (GetSaveFlag(flags, SaveFlag.SetFire))
writer.WriteEncodedInt((int)m_SetFireBonus);
if (GetSaveFlag(flags, SaveFlag.SetCold))
writer.WriteEncodedInt((int)m_SetColdBonus);
if (GetSaveFlag(flags, SaveFlag.SetPoison))
writer.WriteEncodedInt((int)m_SetPoisonBonus);
if (GetSaveFlag(flags, SaveFlag.SetEnergy))
writer.WriteEncodedInt((int)m_SetEnergyBonus);
if (GetSaveFlag(flags, SaveFlag.SetAttributes))
m_SetAttributes.Serialize(writer);
if (GetSaveFlag(flags, SaveFlag.SetSkillAttributes))
m_SetSkillBonuses.Serialize(writer);
if (GetSaveFlag(flags, SaveFlag.SetHue))
writer.Write((int)m_SetHue);
if (GetSaveFlag(flags, SaveFlag.LastEquipped))
writer.Write((bool)m_LastEquipped);
if (GetSaveFlag(flags, SaveFlag.SetEquipped))
writer.Write((bool)m_SetEquipped);
#endregion
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
switch (version)
{
case 4:
{
_VvVItem = reader.ReadBool();
_Owner = reader.ReadMobile();
_OwnerName = reader.ReadString();
goto case 3;
}
case 3:
case 2:
IsArrowAmmo = reader.ReadBool();
goto case 1;
case 1:
{
if(version == 1)
{
IsArrowAmmo = (Ammo == null || Ammo is Arrow);
}
m_AosSkillBonuses = new AosSkillBonuses(this, reader);
m_Resistances = new AosElementAttributes(this, reader);
goto case 0;
}
case 0:
{
if (version == 0)
{
m_AosSkillBonuses = new AosSkillBonuses(this);
m_Resistances = new AosElementAttributes(this);
}
SaveFlag flags = (SaveFlag)reader.ReadEncodedInt();
if (GetSaveFlag(flags, SaveFlag.Attributes))
m_Attributes = new AosAttributes(this, reader);
else
m_Attributes = new AosAttributes(this);
if (version < 3 && GetSaveFlag(flags, SaveFlag.LowerAmmoCost))
m_Attributes.LowerAmmoCost = reader.ReadInt();
if (GetSaveFlag(flags, SaveFlag.WeightReduction))
m_WeightReduction = reader.ReadInt();
if (GetSaveFlag(flags, SaveFlag.DamageIncrease))
m_DamageIncrease = reader.ReadInt();
if (GetSaveFlag(flags, SaveFlag.Crafter))
m_Crafter = reader.ReadMobile();
if (GetSaveFlag(flags, SaveFlag.Quality))
m_Quality = (ItemQuality)reader.ReadInt();
if (GetSaveFlag(flags, SaveFlag.Capacity))
m_Capacity = reader.ReadInt();
#region Mondain's Legacy Sets
if (GetSaveFlag(flags, SaveFlag.SetPhysical))
m_SetPhysicalBonus = reader.ReadEncodedInt();
if (GetSaveFlag(flags, SaveFlag.SetFire))
m_SetFireBonus = reader.ReadEncodedInt();
if (GetSaveFlag(flags, SaveFlag.SetCold))
m_SetColdBonus = reader.ReadEncodedInt();
if (GetSaveFlag(flags, SaveFlag.SetPoison))
m_SetPoisonBonus = reader.ReadEncodedInt();
if (GetSaveFlag(flags, SaveFlag.SetEnergy))
m_SetEnergyBonus = reader.ReadEncodedInt();
if (GetSaveFlag(flags, SaveFlag.SetAttributes))
m_SetAttributes = new AosAttributes(this, reader);
else
m_SetAttributes = new AosAttributes(this);
if (GetSaveFlag(flags, SaveFlag.SetSkillAttributes))
m_SetSkillBonuses = new AosSkillBonuses(this, reader);
else
m_SetSkillBonuses = new AosSkillBonuses(this);
if (GetSaveFlag(flags, SaveFlag.SetHue))
m_SetHue = reader.ReadInt();
if (GetSaveFlag(flags, SaveFlag.LastEquipped))
m_LastEquipped = reader.ReadBool();
if (GetSaveFlag(flags, SaveFlag.SetEquipped))
m_SetEquipped = reader.ReadBool();
#endregion
break;
}
}
int strBonus = ComputeStatBonus(StatType.Str);
int dexBonus = ComputeStatBonus(StatType.Dex);
int intBonus = ComputeStatBonus(StatType.Int);
if (Parent is Mobile && (strBonus != 0 || dexBonus != 0 || intBonus != 0))
{
Mobile m = (Mobile)Parent;
string modName = Serial.ToString();
if (strBonus != 0)
m.AddStatMod(new StatMod(StatType.Str, modName + "Str", strBonus, TimeSpan.Zero));
if (dexBonus != 0)
m.AddStatMod(new StatMod(StatType.Dex, modName + "Dex", dexBonus, TimeSpan.Zero));
if (intBonus != 0)
m.AddStatMod(new StatMod(StatType.Int, modName + "Int", intBonus, TimeSpan.Zero));
}
if (Parent is Mobile)
{
m_AosSkillBonuses.AddTo((Mobile)Parent);
((Mobile)Parent).CheckStatTimers();
}
}
public int ComputeStatBonus(StatType type)
{
switch (type)
{
case StatType.Str: return Attributes.BonusStr;
case StatType.Dex: return Attributes.BonusDex;
case StatType.Int: return Attributes.BonusInt;
}
return 0;
}
public virtual void AlterBowDamage(ref int phys, ref int fire, ref int cold, ref int pois, ref int nrgy, ref int chaos, ref int direct)
{
}
public virtual void AlterRangedDamage(ref int phys, ref int fire, ref int cold, ref int pois, ref int nrgy, ref int chaos, ref int direct)
{
AlterBowDamage(ref phys, ref fire, ref cold, ref pois, ref nrgy, ref chaos, ref direct);
}
public void InvalidateWeight()
{
if (RootParent is Mobile)
{
Mobile m = (Mobile)RootParent;
m.UpdateTotals();
}
}
#region ICraftable
public virtual int OnCraft(int quality, bool makersMark, Mobile from, CraftSystem craftSystem, Type typeRes, ITool tool, CraftItem craftItem, int resHue)
{
Quality = (ItemQuality)quality;
if (makersMark)
Crafter = from;
return quality;
}
#endregion
#region Mondain's Legacy Sets
public virtual SetItem SetID
{
get
{
return SetItem.None;
}
}
public virtual int Pieces
{
get
{
return 0;
}
}
public virtual bool BardMasteryBonus
{
get
{
return (SetID == SetItem.Virtuoso);
}
}
public bool IsSetItem
{
get
{
return SetID != SetItem.None;
}
}
private int m_SetHue;
private bool m_SetEquipped;
private bool m_LastEquipped;
[CommandProperty(AccessLevel.GameMaster)]
public int SetHue
{
get
{
return m_SetHue;
}
set
{
m_SetHue = value;
InvalidateProperties();
}
}
public bool SetEquipped
{
get
{
return m_SetEquipped;
}
set
{
m_SetEquipped = value;
}
}
public bool LastEquipped
{
get
{
return m_LastEquipped;
}
set
{
m_LastEquipped = value;
}
}
private int m_SetPhysicalBonus, m_SetFireBonus, m_SetColdBonus, m_SetPoisonBonus, m_SetEnergyBonus;
[CommandProperty(AccessLevel.GameMaster)]
public int SetPhysicalBonus
{
get
{
return m_SetPhysicalBonus;
}
set
{
m_SetPhysicalBonus = value;
InvalidateProperties();
}
}
[CommandProperty(AccessLevel.GameMaster)]
public int SetFireBonus
{
get
{
return m_SetFireBonus;
}
set
{
m_SetFireBonus = value;
InvalidateProperties();
}
}
[CommandProperty(AccessLevel.GameMaster)]
public int SetColdBonus
{
get
{
return m_SetColdBonus;
}
set
{
m_SetColdBonus = value;
InvalidateProperties();
}
}
[CommandProperty(AccessLevel.GameMaster)]
public int SetPoisonBonus
{
get
{
return m_SetPoisonBonus;
}
set
{
m_SetPoisonBonus = value;
InvalidateProperties();
}
}
[CommandProperty(AccessLevel.GameMaster)]
public int SetEnergyBonus
{
get
{
return m_SetEnergyBonus;
}
set
{
m_SetEnergyBonus = value;
InvalidateProperties();
}
}
private AosAttributes m_SetAttributes;
private AosSkillBonuses m_SetSkillBonuses;
[CommandProperty(AccessLevel.GameMaster)]
public AosAttributes SetAttributes
{
get
{
return m_SetAttributes;
}
set
{
}
}
[CommandProperty(AccessLevel.GameMaster)]
public AosSkillBonuses SetSkillBonuses
{
get
{
return m_SetSkillBonuses;
}
set
{
}
}
#endregion
public class RefillQuiverEntry : ContextMenuEntry
{
private readonly BaseQuiver m_quiver;
public RefillQuiverEntry(BaseQuiver bq)
: base(6230)
{
m_quiver = bq;
Enabled = m_quiver.Ammo == null || m_quiver.Ammo.Amount < m_quiver.Capacity;
}
bool Refill(Mobile m, Container c) where T : Item
{
List list = c.FindItemsByType(true).ToList();
if (list.Count > 0)
{
int amt = 0;
list = list.OrderByDescending(e => e.Amount).ToList();
int famount = m_quiver.Ammo == null ? 0 : m_quiver.Ammo.Amount;
if (m_quiver.Ammo != null)
m_quiver.Ammo.Delete();
while ((famount < m_quiver.Capacity) && (list.Count > 0))
{
T data = list[list.Count - 1];
int remaining = m_quiver.Capacity - famount;
if (data.Amount > remaining)
{
famount += remaining;
amt += remaining;
data.Amount -= remaining;
}
else
{
famount += data.Amount;
amt += data.Amount;
data.Delete();
list.RemoveAt(list.Count - 1);
}
}
if ((amt > 0) && (m != null))
{
T obj = (T)Activator.CreateInstance(typeof(T));
obj.Amount = famount;
m_quiver.DropItem(obj);
m.SendLocalizedMessage(1072664, amt.ToString());
return true;
}
}
return false;
}
public override void OnClick()
{
if ((m_quiver == null) || m_quiver.Deleted || (m_quiver.Ammo != null && m_quiver.Ammo.Amount >= m_quiver.Capacity))
return;
object owner = m_quiver.Parent;
while(owner != null)
{
if (owner is Mobile)
break;
if (owner is Item)
{
owner = ((Item)owner).Parent;
continue;
}
owner = null;
}
if (owner == null)
return;
if (!(owner is Mobile))
return;
Mobile m = (Mobile)owner;
if (m.Backpack == null)
return;
if (!(m.Items.Contains(m_quiver) || m_quiver.IsChildOf(m.Backpack)))
return;
// Try to fill from the bank box
if ((m.BankBox != null) && (m.BankBox.Opened))
{
if (m_quiver.IsArrowAmmo ? Refill(m, m.BankBox) : Refill(m, m.BankBox))
return;
}
// Otherwise look for secure containers within two tiles
var items = m.Map.GetItemsInRange(m.Location, 1);
foreach(Item i in items)
{
if (!(i is Container))
continue;
Container c = (Container)i;
if (!c.IsSecure || !c.IsAccessibleTo(m))
continue;
if (m_quiver.IsArrowAmmo ? Refill(m, c) : Refill(m, c))
return;
}
m.SendLocalizedMessage(1072673); //There are no source containers nearby.
}
}
}
}