Overwrite

Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
This commit is contained in:
Unstable Kitsune
2023-11-28 23:20:26 -05:00
parent 3cd54811de
commit b918192e4e
11608 changed files with 2644205 additions and 47 deletions

View File

@@ -0,0 +1,47 @@
using System;
using Server.Mobiles;
namespace Server.Items
{
public class BODRewardTitleDeed : BaseRewardTitleDeed
{
public override int LabelNumber { get { return 1155604; } } // A Deed for a Reward Title
public override TextDefinition Title { get { return _Title; } }
private TextDefinition _Title;
[Constructable]
public BODRewardTitleDeed(int title)
{
_Title = new TextDefinition(1157181 + title);
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
list.Add(1114057, Title.ToString()); // ~1_NOTHING~
}
public BODRewardTitleDeed(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
TextDefinition.Serialize(writer, _Title);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int v = reader.ReadInt();
_Title = TextDefinition.Deserialize(reader);
}
}
}

View File

@@ -0,0 +1,45 @@
using System;
namespace Server.Items
{
public class DrSpectorsLenses : Glasses
{
public override int LabelNumber { get { return 1156991; } } // Dr. Spector's lenses
public override bool IsArtifact { get { return true; } }
[Constructable]
public DrSpectorsLenses()
{
Attributes.BonusInt = 8;
Attributes.RegenMana = 4;
Attributes.SpellDamage = 12;
Attributes.LowerManaCost = 8;
Attributes.LowerRegCost = 10;
}
public override int BasePhysicalResistance { get { return 5; } }
public override int BaseFireResistance { get { return 10; } }
public override int BaseColdResistance { get { return 14; } }
public override int BasePoisonResistance { get { return 20; } }
public override int BaseEnergyResistance { get { return 20; } }
public override int InitMinHits { get { return 255; } }
public override int InitMaxHits { get { return 255; } }
public DrSpectorsLenses(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View File

@@ -0,0 +1,456 @@
using System;
using Server.Mobiles;
using Server.ContextMenus;
using System.Collections.Generic;
using Server.Gumps;
namespace Server.Items
{
public enum FruitType
{
None,
Grape,
Apple,
Peach,
Pear,
Plum
}
[FlipableAttribute(0x9E36, 0x9E37)]
public class FermentationBarrel : Item
{
private static readonly int MinFruit = 20;
private static readonly int MaxFruit = 80;
private FruitType _FruitType;
private int _Fruit;
private int _BacterialResistance;
private bool _Fermenting;
private DateTime _FermentingEnds;
private bool _Fermented;
private bool _BadBatch;
private int _BottlesRemaining;
public string _Vintage;
public Mobile _Maker;
[CommandProperty(AccessLevel.GameMaster)]
public FruitType FruitType { get { return _FruitType; } set { _FruitType = value; InvalidateProperties(); } }
[CommandProperty(AccessLevel.GameMaster)]
public int Fruit { get { return _Fruit; } set { _Fruit = value; InvalidateProperties(); } }
[CommandProperty(AccessLevel.GameMaster)]
public int BacterialResistance { get { return _BacterialResistance; } set { _BacterialResistance = value; InvalidateProperties(); } }
[CommandProperty(AccessLevel.GameMaster)]
public bool Fermenting { get { return _Fermenting; } set { _Fermenting = value; InvalidateProperties(); } }
[CommandProperty(AccessLevel.GameMaster)]
public DateTime FermentingEnds { get { return _FermentingEnds; } set { _FermentingEnds = value; InvalidateProperties(); } }
[CommandProperty(AccessLevel.GameMaster)]
public bool Fermented { get { return _Fermented; } set { _Fermented = value; InvalidateProperties(); } }
[CommandProperty(AccessLevel.GameMaster)]
public bool BadBatch { get { return _BadBatch; } }
[CommandProperty(AccessLevel.GameMaster)]
public int BottlesRemaining { get { return _BottlesRemaining; } set { _BottlesRemaining = value; InvalidateProperties(); } }
[CommandProperty(AccessLevel.GameMaster)]
public string Vintage { get { return _Vintage; } set { _Vintage = value; InvalidateProperties(); } }
[CommandProperty(AccessLevel.GameMaster)]
public Mobile Maker { get { return _Maker; } set { _Maker = value; } }
public bool HasYeast { get { return _BacterialResistance > 0; } }
public override int LabelNumber { get { return 1124526; } } // Fermentation Barrel
public override double DefaultWeight
{
get
{
if (BottlesRemaining <= 0)
return 1.0;
return (double)BottlesRemaining;
}
}
[Constructable]
public FermentationBarrel()
: base(0x9E36)
{
}
public override void OnDoubleClick(Mobile from)
{
if (from.InRange(this.GetWorldLocation(), 2))
{
if (_Fermenting && _FermentingEnds < DateTime.UtcNow)
{
_Fermented = true;
int skill = (int)((from.Skills[SkillName.Cooking].Value + from.Skills[SkillName.Alchemy].Value) / 2);
skill *= _BacterialResistance / 4;
_BadBatch = skill < Utility.Random(225);
if (!_BadBatch)
{
BottlesRemaining = _Fruit / 4;
}
}
if (_Fermented)
{
if (_BadBatch)
{
from.PrivateOverheadMessage(Server.Network.MessageType.Regular, 1154, 1157258, from.NetState); // *You gently taste the fermentation...it's spoiled! You should probably empty the barrel*
}
else if (_BottlesRemaining > 0)
{
BottleOfWine bottle = new BottleOfWine(_FruitType, _Vintage, _Maker);
if (from.Backpack != null && from.Backpack.TryDropItem(from, bottle, false))
{
from.PlaySound(0x240);
from.SendMessage("You pour the wine into a bottle and place it in your backpack.");
BottlesRemaining--;
}
else
{
from.SendLocalizedMessage(500720); // You don't have enough room in your backpack!
bottle.Delete();
}
}
}
}
}
public override bool OnDragDrop(Mobile from, Item dropped)
{
if (_Fermented)
{
from.SendLocalizedMessage(1157245); // The fermentation barrel is not empty. Empty it first to add fruit and yeast.
}
else if (_Fermenting)
{
from.SendLocalizedMessage(1157244); // You may not add anything to the fermentation barrel after fermentation has begun.
}
else if (dropped is Yeast)
{
if (HasYeast)
{
from.SendLocalizedMessage(1157256); // You have already added yeast to the barrel.
}
else
{
BacterialResistance = ((Yeast)dropped).BacterialResistance;
dropped.Delete();
}
}
else
{
FruitType type = GetFruitType(dropped.GetType());
if (_FruitType != FruitType.None && _FruitType != type)
{
from.SendLocalizedMessage(1157243); // You may only put one type of fruit in the fermentation barrel at one time. Empty the barrel first.
}
else if (type != FruitType.None)
{
if (_FruitType == FruitType.None)
_FruitType = type;
if (_Fruit + dropped.Amount <= MaxFruit)
{
Fruit += dropped.Amount;
dropped.Delete();
}
else
{
dropped.Amount -= MaxFruit - _Fruit;
Fruit = MaxFruit;
}
}
else if (!(dropped is Yeast))
{
from.SendLocalizedMessage(1157246); // You may only put fruit and yeast in the fermentation barrel.
}
}
return false;
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
if (_Vintage != null)
{
list.Add(1157254, _Vintage); // <BASEFONT COLOR=#0099cc>~1_VAL~<BASEFONT COLOR=#FFFFFF>
}
if (_FruitType != FruitType.None)
{
list.Add(1157248 + (int)_FruitType);
}
if (_Fermented)
{
list.Add(1157259, _BottlesRemaining.ToString()); // Bottles Remaining: ~1_VAL~
}
}
public override void GetContextMenuEntries(Mobile from, List<ContextMenuEntry> entries)
{
base.GetContextMenuEntries(from, entries);
entries.Add(new SimpleContextMenuEntry(from, 1157231, m => // Begin Fermentation
{
if (_Fermenting)
{
m.SendLocalizedMessage(1157237); // The fermentation process has already begun.
}
else if (!HasYeast || _Fruit < MinFruit)
{
m.SendLocalizedMessage(1157255); // You do not have enough fruit or yeast to begin fermentation.
}
else
{
m.SendGump(new ConfirmCallbackGump(m as PlayerMobile, 1157234, 1157240, null, confirm: StartFermentation, close: CancelFermentation)); // Are you sure you wish to start the fermentation process?
}
}, 3, !_Fermented && (HasYeast || _Fruit > 0)));
entries.Add(new SimpleContextMenuEntry(from, 1157232, m => // Empty Barrel
{
m.SendGump(new ConfirmCallbackGump(m as PlayerMobile, 1157234, 1157235, null, confirm: DoEmpty)); // Are you sure you wish to end the fermentation process? All progress and materials will be lost!
}, 3, HasYeast || _Fruit > 0));
entries.Add(new SimpleContextMenuEntry(from, 1157233, m => // Rename Vintage
{
if (_Fermenting)
{
m.SendLocalizedMessage(1157238); // You may not rename the vintage once the fermentation process has begun.
}
else
{
m.SendLocalizedMessage(1157242); // What do you wish to call this vintage?
m.BeginPrompt((mob, text) =>
{
if (text != null)
{
text = text.Trim();
text = Utility.FixHtml(text);
if (text.Length > 15 || !Server.Guilds.BaseGuildGump.CheckProfanity(text))
{
mob.SendMessage("That label is unacceptable. Please try again.");
}
else
{
Vintage = text;
}
}
}, null);
}
}, 3, !_Fermented));
}
private void StartFermentation(Mobile m, object state)
{
m.SendLocalizedMessage(1157239); // The fermentation process has begun.
_Fermenting = true;
_FermentingEnds = DateTime.UtcNow + TimeSpan.FromHours(24);
}
private void CancelFermentation(Mobile m, object state)
{
m.SendLocalizedMessage(1157241); // The fermentation process has not been started.
}
private void DoEmpty(Mobile m, object state)
{
m.SendLocalizedMessage(1157236); // You empty the contents of the barrel.
Reset();
}
private void Reset()
{
_FruitType = FruitType.None;
_Fruit = 0;
_BacterialResistance = 0;
_Fermenting = false;
_FermentingEnds = DateTime.MinValue;
_Fermented = false;
_BottlesRemaining = 0;
_Vintage = null;
_Maker = null;
InvalidateProperties();
}
private FruitType GetFruitType(Type t)
{
for(int i = 0; i < _FruitTypes.Length; i++)
{
foreach (var type in _FruitTypes[i])
{
if (type == t)
return (FruitType)i + 1;
}
}
return FruitType.None;
}
private Type[][] _FruitTypes =
{
new Type[] { typeof(GrapeBunch), typeof(Grapes) },
new Type[] { typeof(Apple) },
new Type[] { typeof(Peach) },
new Type[] { typeof(Pear) },
new Type[] { typeof(Plum) }
};
public FermentationBarrel(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
writer.Write((int)_FruitType);
writer.Write(_Fruit);
writer.Write(_BacterialResistance);
writer.Write(_Fermenting);
writer.Write(_FermentingEnds);
writer.Write(_Fermented);
writer.Write(_BadBatch);
writer.Write(_BottlesRemaining);
writer.Write(_Vintage);
writer.Write(_Maker);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
_FruitType = (FruitType)reader.ReadInt();
_Fruit = reader.ReadInt();
_BacterialResistance = reader.ReadInt();
_Fermenting = reader.ReadBool();
_FermentingEnds = reader.ReadDateTime();
_Fermented = reader.ReadBool();
_BadBatch = reader.ReadBool();
_BottlesRemaining = reader.ReadInt();
_Vintage = reader.ReadString();
_Maker = reader.ReadMobile();
}
}
public class BottleOfWine : BeverageBottle
{
private FruitType _FruitType;
private string _Vintage;
private Mobile _Maker;
[CommandProperty(AccessLevel.GameMaster)]
public FruitType FruitType { get { return _FruitType; } set { _FruitType = value; InvalidateProperties(); } }
[CommandProperty(AccessLevel.GameMaster)]
public string Vintage { get { return _Vintage; } set { _Vintage = value; InvalidateProperties(); } }
[CommandProperty(AccessLevel.GameMaster)]
public Mobile Maker { get { return _Maker; } set { _Maker = value; InvalidateProperties(); } }
[Constructable]
public BottleOfWine()
: this(FruitType.Grape, null, null)
{
}
[Constructable]
public BottleOfWine(FruitType type, string vintage, Mobile maker)
: base(BeverageType.Wine)
{
Quantity = MaxQuantity;
_FruitType = type;
_Vintage = vintage;
_Maker = maker;
}
public override void AddNameProperty(ObjectPropertyList list)
{
list.Add(1049519, String.Format("#{0}", (1157248 + (int)_FruitType).ToString())); // a bottle of ~1_DRINK_NAME~
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
if (_Vintage != null)
{
list.Add(1157254, _Vintage); // <BASEFONT COLOR=#0099cc>~1_VAL~<BASEFONT COLOR=#FFFFFF>
}
if (_Maker != null)
{
list.Add(1150679, _Maker.Name); // Distiller: ~1_NAME~
}
list.Add(GetQuantityDescription());
}
public BottleOfWine(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
writer.Write((int)_FruitType);
writer.Write(_Vintage);
writer.Write(_Maker);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
_FruitType = (FruitType)reader.ReadInt();
_Vintage = reader.ReadString();
_Maker = reader.ReadMobile();
}
}
}

View File

@@ -0,0 +1,54 @@
using System;
using Server.Mobiles;
namespace Server.Items
{
public class GuaranteedSpellbookImprovementTalisman : BaseTalisman
{
[Constructable]
public GuaranteedSpellbookImprovementTalisman()
: this(10)
{
}
[Constructable]
public GuaranteedSpellbookImprovementTalisman(int charges)
: base(0x9E28)
{
Charges = charges;
Skill = TalismanSkill.Inscription;
SuccessBonus = BaseTalisman.GetRandomSuccessful();
ExceptionalBonus = BaseTalisman.GetRandomExceptional();
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
if (Charges > 0)
list.Add(1049116, Charges.ToString()); // [ Charges: ~1_CHARGES~ ]
list.Add(1157212); // Crafting Failure Protection
}
public GuaranteedSpellbookImprovementTalisman(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View File

@@ -0,0 +1,80 @@
using System;
namespace Server.Items
{
public class KotlBlackRod : QuarterStaff
{
public override int LabelNumber { get { return 1156990; } } // kotl black rod
public override bool IsArtifact { get { return true; } }
[Constructable]
public KotlBlackRod()
{
Hue = 1150;
WeaponAttributes.MageWeapon = 30;
Attributes.SpellChanneling = 1;
Attributes.CastSpeed = 2;
Attributes.LowerManaCost = 5;
Attributes.LowerRegCost = 10;
}
public override int InitMinHits { get { return 255; } }
public override int InitMaxHits { get { return 255; } }
public KotlBlackRod(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class GargishKotlBlackRod : GargishGnarledStaff
{
public override int LabelNumber { get { return 1156994; } } // gargish kotl black rod
public override bool IsArtifact { get { return true; } }
[Constructable]
public GargishKotlBlackRod()
{
Hue = 1150;
WeaponAttributes.MageWeapon = 30;
Attributes.SpellChanneling = 1;
Attributes.CastSpeed = 2;
Attributes.LowerManaCost = 5;
Attributes.LowerRegCost = 10;
}
public override int InitMinHits { get { return 255; } }
public override int InitMaxHits { get { return 255; } }
public GargishKotlBlackRod(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View File

@@ -0,0 +1,54 @@
using System;
using Server.Mobiles;
namespace Server.Items
{
public class MasterChefsApron : FullApron
{
private int _Bonus;
[CommandProperty(AccessLevel.GameMaster)]
public int Bonus { get { return _Bonus; } set { _Bonus = value; InvalidateProperties(); } }
public override int LabelNumber { get { return 1157228; } } // Master Chef's Apron
[Constructable]
public MasterChefsApron()
{
Hue = 1990;
while(_Bonus == 0)
_Bonus = BaseTalisman.GetRandomExceptional();
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
list.Add(1072395, "#{0}\t{1}", AosSkillBonuses.GetLabel(SkillName.Cooking), _Bonus); // ~1_NAME~ Exceptional Bonus: ~2_val~%
}
public MasterChefsApron(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
writer.Write(_Bonus);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
_Bonus = reader.ReadInt();
}
}
}

View File

@@ -0,0 +1,82 @@
using System;
using Server.Mobiles;
namespace Server.Items
{
public class MasterCraftsmanTalisman : BaseTalisman
{
public override bool IsArtifact { get { return true; } }
private int _Type;
public virtual int Type { get { return _Type; } }
[Constructable]
public MasterCraftsmanTalisman(int charges, int itemID, TalismanSkill skill)
: base(itemID)
{
Skill = skill;
SuccessBonus = GetRandomSuccessful();
ExceptionalBonus = BaseTalisman.GetRandomExceptional();
Blessed = GetRandomBlessed();
_Type = charges;
Charges = charges;
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
list.Add(1157213); // Crafting Failure Protection
if (Charges > 0)
list.Add(1049116, Charges.ToString()); // [ Charges: ~1_CHARGES~ ]
}
public MasterCraftsmanTalisman(Serial serial)
: base(serial)
{
}
public override int LabelNumber
{
get
{
return 1157217;
}
}// MasterCraftsmanTalisman
public override bool ForceShowName
{
get
{
return true;
}
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)1); // version
writer.Write(_Type);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
switch (version)
{
case 1:
_Type = reader.ReadInt();
break;
case 0:
_Type = 10;
break;
}
}
}
}

View File

@@ -0,0 +1,74 @@
using System;
using Server.Mobiles;
namespace Server.Items
{
public class PlumTreeAddon : BaseFruitTreeAddon
{
public override BaseAddonDeed Deed { get { return new PlumTreeAddonDeed(); } }
[Constructable]
public PlumTreeAddon()
{
AddComponent(new LocalizedAddonComponent(0x9E38, 1029965), 0, 0, 0);
AddComponent(new LocalizedAddonComponent(0x9E39, 1029965), 0, 0, 0);
}
public override Item Fruit
{
get
{
return new Plum();
}
}
public PlumTreeAddon(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class PlumTreeAddonDeed : BaseAddonDeed
{
public override int LabelNumber { get { return 1157312; } } // Plum Tree
public override BaseAddon Addon { get { return new PlumTreeAddon(); } }
[Constructable]
public PlumTreeAddonDeed()
{
}
public PlumTreeAddonDeed(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View File

@@ -0,0 +1,155 @@
using System;
using Server.Mobiles;
using Server.Items;
using Server.Engines.Harvest;
namespace Server.Items
{
public class PowderOfFortKeg : Item
{
private int _Charges;
[CommandProperty(AccessLevel.GameMaster)]
public int Charges { get { return _Charges; } set { _Charges = value; InvalidateProperties(); } }
public override int LabelNumber { get { return 1157221; } } // A specially lined keg for powder of fortification.
[Constructable]
public PowderOfFortKeg()
: this(0)
{
}
[Constructable]
public PowderOfFortKeg(int uses)
: base(0x1940)
{
_Charges = uses;
Hue = 2419;
this.Weight = 15.0;
}
public override bool OnDragDrop(Mobile m, Item dropped)
{
if (dropped is PowderOfTemperament)
{
var powder = dropped as PowderOfTemperament;
if (_Charges < 250)
{
if (powder.UsesRemaining + _Charges > 250)
{
int add = 250 - _Charges;
powder.UsesRemaining -= add;
Charges = 250;
}
else
{
Charges += powder.UsesRemaining;
powder.Delete();
}
m.PlaySound(0x247);
}
}
return false;
}
public override void OnDoubleClick(Mobile from)
{
if (from.Backpack != null && IsChildOf(from.Backpack) && Charges > 0)
{
PowderOfTemperament powder = from.Backpack.FindItemByType(typeof(PowderOfTemperament)) as PowderOfTemperament;
if (powder != null)
{
powder.UsesRemaining++;
Charges--;
}
else
{
powder = new PowderOfTemperament(1);
if (!from.Backpack.TryDropItem(from, powder, false))
{
from.SendLocalizedMessage(1080016); // That container cannot hold more weight.
powder.Delete();
return;
}
Charges--;
}
from.PlaySound(0x247);
}
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
list.Add(1060584, _Charges.ToString());
int perc = (int)(((double)_Charges / 250) * 100);
int number = 0;
if (perc <= 0)
number = 502246; // The keg is empty.
else if (perc < 5)
number = 502248; // The keg is nearly empty.
else if (perc < 20)
number = 502249; // The keg is not very full.
else if (perc < 30)
number = 502250; // The keg is about one quarter full.
else if (perc < 40)
number = 502251; // The keg is about one third full.
else if (perc < 47)
number = 502252; // The keg is almost half full.
else if (perc < 54)
number = 502254; // The keg is approximately half full.
else if (perc < 70)
number = 502253; // The keg is more than half full.
else if (perc < 80)
number = 502255; // The keg is about three quarters full.
else if (perc < 90)
number = 502256; // The keg is very full.
else if (perc < 100)
number = 502257; // The liquid is almost to the top of the keg.
else
number = 502258; // The keg is completely full.
list.Add(number);
}
public PowderOfFortKeg(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)1); // version
writer.Write(_Charges);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
_Charges = reader.ReadInt();
if (version == 0)
ItemID = 0x1940;
}
}
}

View File

@@ -0,0 +1,51 @@
using System;
using Server.Mobiles;
using Server.Engines.Harvest;
namespace Server.Items
{
[FlipableAttribute(0x9E7E, 0x9E7F)]
public class RockHammer : BaseHarvestTool
{
public override int LabelNumber { get { return 1124598; } }
[Constructable]
public RockHammer()
: this(500)
{
}
[Constructable]
public RockHammer(int uses)
: base(uses, 0x9E7E)
{
this.Weight = 5.0;
}
public RockHammer(Serial serial)
: base(serial)
{
}
public override HarvestSystem HarvestSystem
{
get
{
return Mining.System;
}
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View File

@@ -0,0 +1,268 @@
using System;
using Server.Engines.Plants;
using Server.Multis;
using Server.Targeting;
using System.Collections.Generic;
namespace Server.Items
{
public enum DyeType
{
None,
WindAzul,
DullRuby,
PoppieWhite,
ZentoOrchid,
UmbranViolet
}
public class SpecialNaturalDye : Item
{
private DyeType m_DyeType;
private int m_UsesRemaining;
private bool m_BooksOnly;
[CommandProperty(AccessLevel.GameMaster)]
public DyeType DyeType
{
get { return m_DyeType; }
set
{
DyeType old = m_DyeType;
m_DyeType = value;
if (m_DyeType != old)
ValidateHue();
}
}
[CommandProperty(AccessLevel.GameMaster)]
public int UsesRemaining
{
get
{
return this.m_UsesRemaining;
}
set
{
this.m_UsesRemaining = value;
this.InvalidateProperties();
}
}
[CommandProperty(AccessLevel.GameMaster)]
public bool BooksOnly
{
get
{
return this.m_BooksOnly;
}
set
{
this.m_BooksOnly = value;
this.InvalidateProperties();
}
}
[Constructable]
public SpecialNaturalDye(DyeType type)
: this(type, false)
{
}
[Constructable]
public SpecialNaturalDye(DyeType type, bool booksonly)
: base(0x182B)
{
Weight = 1.0;
DyeType = type;
UsesRemaining = 5;
BooksOnly = booksonly;
}
public void ValidateHue()
{
if (HueInfo.ContainsKey(this.DyeType))
{
Hue = HueInfo[this.DyeType].Item1;
}
}
public SpecialNaturalDye(Serial serial)
: base(serial)
{
}
public override int LabelNumber
{
get
{
return 1112136;
}
}
public override bool ForceShowProperties
{
get
{
return ObjectPropertyList.Enabled;
}
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
list.Add(1060584, this.m_UsesRemaining.ToString()); // uses remaining: ~1_val~
if (m_BooksOnly)
list.Add(1157205); // Spellbook Only Dye
}
public override void AddNameProperty(ObjectPropertyList list)
{
if (this.DyeType == DyeType.None)
{
base.AddNameProperty(list);
}
else if (this.Amount > 1)
{
list.Add(1113276, "{0}\t{1}", this.Amount, String.Format("#{0}", HueInfo[this.DyeType].Item2)); // ~1_AMOUNT~ ~2_COLOR~ natural dyes
}
else
{
list.Add(1112137, String.Format("#{0}", HueInfo[this.DyeType].Item2)); // ~1_COLOR~ natural dye
}
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
writer.Write((int)this.m_DyeType);
writer.Write((int)this.m_UsesRemaining);
writer.Write(m_BooksOnly);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
this.m_DyeType = (DyeType)reader.ReadInt();
this.m_UsesRemaining = reader.ReadInt();
this.m_BooksOnly = reader.ReadBool();
}
public override void OnDoubleClick(Mobile from)
{
from.SendLocalizedMessage(1112139); // Select the item you wish to dye.
from.Target = new InternalTarget(this);
}
private class InternalTarget : Target
{
private readonly SpecialNaturalDye m_Item;
public InternalTarget(SpecialNaturalDye item)
: base(1, false, TargetFlags.None)
{
this.m_Item = item;
}
protected override void OnTarget(Mobile from, object targeted)
{
if (this.m_Item.Deleted)
return;
Item item = targeted as Item;
bool valid = false;
if (item != null)
{
if (m_Item.BooksOnly && !(item is Spellbook))
{
valid = false;
}
else
{
valid = (item is IDyable ||
item is BaseBook || item is BaseClothing ||
item is BaseJewel || item is BaseStatuette ||
item is BaseWeapon || item is Runebook ||
item is BaseTalisman || item is Spellbook ||
item.IsArtifact || BasePigmentsOfTokuno.IsValidItem(item));
if (!valid && item is BaseArmor)
{
CraftResourceType restype = CraftResources.GetType(((BaseArmor)item).Resource);
if ((CraftResourceType.Leather == restype || CraftResourceType.Metal == restype) &&
ArmorMaterialType.Bone != ((BaseArmor)item).MaterialType)
{
valid = true;
}
}
if (!valid && FurnitureAttribute.Check(item))
{
if (!from.InRange(this.m_Item.GetWorldLocation(), 1) || !from.InRange(item.GetWorldLocation(), 1))
{
from.SendLocalizedMessage(500446); // That is too far away.
return;
}
else
{
BaseHouse house = BaseHouse.FindHouseAt(item);
if (house == null || (!house.IsLockedDown(item) && !house.IsSecure(item)))
{
from.SendLocalizedMessage(501022); // Furniture must be locked down to paint it.
return;
}
else if (!house.IsCoOwner(from))
{
from.SendLocalizedMessage(501023); // You must be the owner to use this item.
return;
}
else
valid = true;
}
}
}
if (valid)
{
item.Hue = m_Item.Hue;
from.PlaySound(0x23E);
if (--this.m_Item.UsesRemaining > 0)
this.m_Item.InvalidateProperties();
else
this.m_Item.Delete();
return;
}
}
from.SendLocalizedMessage(1042083); // You cannot dye that.
}
}
public static Dictionary<DyeType, Tuple<int, int>> HueInfo;
public static void Configure()
{
HueInfo = new Dictionary<DyeType, Tuple<int, int>>();
HueInfo[DyeType.WindAzul] = new Tuple<int, int>(2741, 1157277);
HueInfo[DyeType.DullRuby] = new Tuple<int, int>(2731, 1157267);
HueInfo[DyeType.PoppieWhite] = new Tuple<int, int>(2735, 1157271);
HueInfo[DyeType.ZentoOrchid] = new Tuple<int, int>(2732, 1157268);
HueInfo[DyeType.UmbranViolet] = new Tuple<int, int>(2740, 1157276);
}
}
}