diff --git a/Projects/UOContent/Engines/ConPVP/Trophy.cs b/Projects/UOContent/Engines/ConPVP/Trophy.cs index 4c554bf33..56e92daf3 100644 --- a/Projects/UOContent/Engines/ConPVP/Trophy.cs +++ b/Projects/UOContent/Engines/ConPVP/Trophy.cs @@ -1,121 +1,124 @@ using System; +using ModernUO.Serialization; -namespace Server.Items +namespace Server.Items; + +public enum TrophyRank { - public enum TrophyRank + Bronze, + Silver, + Gold +} + +[Flippable(5020, 4647)] +[SerializationGenerator(2, false)] +public partial class Trophy : Item +{ + [SerializableField(0)] + [SerializedCommandProperty(AccessLevel.GameMaster)] + private string _title; + + [SerializableField(2)] + [SerializedCommandProperty(AccessLevel.GameMaster)] + private Mobile _owner; + + [SerializableField(3, setter: "private")] + [SerializedCommandProperty(AccessLevel.GameMaster)] + private DateTime _date; + + public override string DefaultName => $"{GetRankName(_rank)} trophy"; + + private static string GetRankName(TrophyRank rank) => + rank switch + { + TrophyRank.Silver => "silver", + TrophyRank.Gold => "gold", + _ => "bronze" + }; + + [Constructible] + public Trophy(string title, TrophyRank rank) : base(5020) { - Bronze, - Silver, - Gold + _title = title; + _rank = rank; + _date = Core.Now; + + LootType = LootType.Blessed; + + UpdateStyle(); } - [Flippable(5020, 4647)] - public class Trophy : Item + [SerializableProperty(1)] + [CommandProperty(AccessLevel.GameMaster)] + public TrophyRank Rank { - private TrophyRank m_Rank; - - [Constructible] - public Trophy(string title, TrophyRank rank) : base(5020) + get => _rank; + set { - Title = title; - m_Rank = rank; - Date = Core.Now; - - LootType = LootType.Blessed; - + _rank = value; UpdateStyle(); + this.MarkDirty(); } + } - public Trophy(Serial serial) : base(serial) + private void Deserialize(IGenericReader reader, int version) + { + _title = reader.ReadString(); + _rank = (TrophyRank)reader.ReadInt(); + _owner = reader.ReadEntity(); + _date = reader.ReadDateTime(); + } + + public override void OnAdded(IEntity parent) + { + base.OnAdded(parent); + + Owner ??= RootParent as Mobile; + } + + public override void GetProperties(IPropertyList list) + { + if (Owner != null) { + list.Add($"{Title} -- {Owner.RawName}"); } - - [CommandProperty(AccessLevel.GameMaster)] - public string Title { get; set; } - - [CommandProperty(AccessLevel.GameMaster)] - public TrophyRank Rank + else if (Title != null) { - get => m_Rank; - set - { - m_Rank = value; - UpdateStyle(); - } + list.Add(Title); } - [CommandProperty(AccessLevel.GameMaster)] - public Mobile Owner { get; set; } - - [CommandProperty(AccessLevel.GameMaster)] - public DateTime Date { get; private set; } - - public override void Serialize(IGenericWriter writer) + if (Date != DateTime.MinValue) { - base.Serialize(writer); - - writer.Write(1); // version - - writer.Write(Title); - writer.Write((int)m_Rank); - writer.Write(Owner); - writer.Write(Date); + list.Add(Date.ToString("d")); } + } - public override void Deserialize(IGenericReader reader) + public override void OnSingleClick(Mobile from) + { + base.OnSingleClick(from); + + if (Owner != null) { - base.Deserialize(reader); - - var version = reader.ReadInt(); - - Title = reader.ReadString(); - m_Rank = (TrophyRank)reader.ReadInt(); - Owner = reader.ReadEntity(); - Date = reader.ReadDateTime(); - - if (version == 0) - { - LootType = LootType.Blessed; - } + LabelTo(from, $"{Title} -- {Owner.RawName}"); } - - public override void OnAdded(IEntity parent) + else if (Title != null) { - base.OnAdded(parent); - - Owner ??= RootParent as Mobile; + LabelTo(from, Title); } - public override void OnSingleClick(Mobile from) + if (Date != DateTime.MinValue) { - base.OnSingleClick(from); - - if (Owner != null) - { - LabelTo(from, $"{Title} -- {Owner.RawName}"); - } - else if (Title != null) - { - LabelTo(from, Title); - } - - if (Date != DateTime.MinValue) - { - LabelTo(from, Date.ToString("d")); - } + LabelTo(from, Date.ToString("d")); } + } - public void UpdateStyle() + public void UpdateStyle() + { + Hue = _rank switch { - Name = $"{m_Rank.ToString().ToLower()} trophy"; - - Hue = m_Rank switch - { - TrophyRank.Gold => 2213, - TrophyRank.Silver => 0, - TrophyRank.Bronze => 2206, - _ => Hue - }; - } + TrophyRank.Gold => 2213, + TrophyRank.Silver => 0, + _ => 2206, // bronze + }; } } diff --git a/Projects/UOContent/Engines/Ethics/Evil/Mobiles/UnholyFamiliar.cs b/Projects/UOContent/Engines/Ethics/Evil/Mobiles/UnholyFamiliar.cs index 2b05632e9..84632e394 100644 --- a/Projects/UOContent/Engines/Ethics/Evil/Mobiles/UnholyFamiliar.cs +++ b/Projects/UOContent/Engines/Ethics/Evil/Mobiles/UnholyFamiliar.cs @@ -1,86 +1,68 @@ +using ModernUO.Serialization; using Server.Ethics; -namespace Server.Mobiles +namespace Server.Mobiles; + +[SerializationGenerator(0, false)] +public partial class UnholyFamiliar : BaseCreature { - public class UnholyFamiliar : BaseCreature + [Constructible] + public UnholyFamiliar() : base(AIType.AI_Melee) { - [Constructible] - public UnholyFamiliar() : base(AIType.AI_Melee) + Body = 99; + BaseSoundID = 0xE5; + + SetStr(96, 120); + SetDex(81, 105); + SetInt(36, 60); + + SetHits(58, 72); + SetMana(0); + + SetDamage(11, 17); + + SetDamageType(ResistanceType.Physical, 100); + + SetResistance(ResistanceType.Physical, 20, 25); + SetResistance(ResistanceType.Fire, 10, 20); + SetResistance(ResistanceType.Cold, 5, 10); + SetResistance(ResistanceType.Poison, 5, 10); + SetResistance(ResistanceType.Energy, 10, 15); + + SetSkill(SkillName.MagicResist, 57.6, 75.0); + SetSkill(SkillName.Tactics, 50.1, 70.0); + SetSkill(SkillName.Wrestling, 60.1, 80.0); + + Fame = 2500; + Karma = 2500; + + VirtualArmor = 22; + + Tamable = false; + ControlSlots = 1; + } + + public override string CorpseName => "an evil corpse"; + public override bool IsDispellable => false; + public override bool IsBondable => false; + public override string DefaultName => "a dark wolf"; + + public override int Meat => 1; + public override int Hides => 7; + public override FoodType FavoriteFood => FoodType.Meat; + public override PackInstinct PackInstinct => PackInstinct.Canine; + + public override string ApplyNameSuffix(string suffix) + { + if (suffix.Length == 0) { - Body = 99; - BaseSoundID = 0xE5; - - SetStr(96, 120); - SetDex(81, 105); - SetInt(36, 60); - - SetHits(58, 72); - SetMana(0); - - SetDamage(11, 17); - - SetDamageType(ResistanceType.Physical, 100); - - SetResistance(ResistanceType.Physical, 20, 25); - SetResistance(ResistanceType.Fire, 10, 20); - SetResistance(ResistanceType.Cold, 5, 10); - SetResistance(ResistanceType.Poison, 5, 10); - SetResistance(ResistanceType.Energy, 10, 15); - - SetSkill(SkillName.MagicResist, 57.6, 75.0); - SetSkill(SkillName.Tactics, 50.1, 70.0); - SetSkill(SkillName.Wrestling, 60.1, 80.0); - - Fame = 2500; - Karma = 2500; - - VirtualArmor = 22; - - Tamable = false; - ControlSlots = 1; + suffix = Ethic.Evil.Definition.Adjunct.String; + } + else + { + suffix = $"{suffix} {Ethic.Evil.Definition.Adjunct.String}"; } - public UnholyFamiliar(Serial serial) - : base(serial) - { - } - - public override string CorpseName => "an evil corpse"; - public override bool IsDispellable => false; - public override bool IsBondable => false; - public override string DefaultName => "a dark wolf"; - - public override int Meat => 1; - public override int Hides => 7; - public override FoodType FavoriteFood => FoodType.Meat; - public override PackInstinct PackInstinct => PackInstinct.Canine; - - public override string ApplyNameSuffix(string suffix) - { - if (suffix.Length == 0) - { - suffix = Ethic.Evil.Definition.Adjunct.String; - } - else - { - suffix = $"{suffix} {Ethic.Evil.Definition.Adjunct.String}"; - } - - return base.ApplyNameSuffix(suffix); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } + return base.ApplyNameSuffix(suffix); } } diff --git a/Projects/UOContent/Engines/Ethics/Hero/Mobiles/HolyFamiliar.cs b/Projects/UOContent/Engines/Ethics/Hero/Mobiles/HolyFamiliar.cs index 7f67f8f06..37dc99fba 100644 --- a/Projects/UOContent/Engines/Ethics/Hero/Mobiles/HolyFamiliar.cs +++ b/Projects/UOContent/Engines/Ethics/Hero/Mobiles/HolyFamiliar.cs @@ -1,88 +1,69 @@ +using ModernUO.Serialization; using Server.Ethics; -namespace Server.Mobiles +namespace Server.Mobiles; + +[SerializationGenerator(0, false)] +public partial class HolyFamiliar : BaseCreature { - public class HolyFamiliar : BaseCreature + [Constructible] + public HolyFamiliar() : base(AIType.AI_Melee) { - [Constructible] - public HolyFamiliar() - : base(AIType.AI_Melee) + Body = 100; + BaseSoundID = 0xE5; + + SetStr(96, 120); + SetDex(81, 105); + SetInt(36, 60); + + SetHits(58, 72); + SetMana(0); + + SetDamage(11, 17); + + SetDamageType(ResistanceType.Physical, 100); + + SetResistance(ResistanceType.Physical, 20, 25); + SetResistance(ResistanceType.Fire, 10, 20); + SetResistance(ResistanceType.Cold, 5, 10); + SetResistance(ResistanceType.Poison, 5, 10); + SetResistance(ResistanceType.Energy, 10, 15); + + SetSkill(SkillName.MagicResist, 57.6, 75.0); + SetSkill(SkillName.Tactics, 50.1, 70.0); + SetSkill(SkillName.Wrestling, 60.1, 80.0); + + Fame = 2500; + Karma = 2500; + + VirtualArmor = 22; + + Tamable = false; + ControlSlots = 1; + } + + public override string CorpseName => "a holy corpse"; + public override bool IsDispellable => false; + public override bool IsBondable => false; + + public override string DefaultName => "a silver wolf"; + + public override int Meat => 1; + public override int Hides => 7; + public override FoodType FavoriteFood => FoodType.Meat; + public override PackInstinct PackInstinct => PackInstinct.Canine; + + public override string ApplyNameSuffix(string suffix) + { + if (suffix.Length == 0) { - Body = 100; - BaseSoundID = 0xE5; - - SetStr(96, 120); - SetDex(81, 105); - SetInt(36, 60); - - SetHits(58, 72); - SetMana(0); - - SetDamage(11, 17); - - SetDamageType(ResistanceType.Physical, 100); - - SetResistance(ResistanceType.Physical, 20, 25); - SetResistance(ResistanceType.Fire, 10, 20); - SetResistance(ResistanceType.Cold, 5, 10); - SetResistance(ResistanceType.Poison, 5, 10); - SetResistance(ResistanceType.Energy, 10, 15); - - SetSkill(SkillName.MagicResist, 57.6, 75.0); - SetSkill(SkillName.Tactics, 50.1, 70.0); - SetSkill(SkillName.Wrestling, 60.1, 80.0); - - Fame = 2500; - Karma = 2500; - - VirtualArmor = 22; - - Tamable = false; - ControlSlots = 1; + suffix = Ethic.Hero.Definition.Adjunct.String; + } + else + { + suffix = $"{suffix} {Ethic.Hero.Definition.Adjunct.String}"; } - public HolyFamiliar(Serial serial) - : base(serial) - { - } - - public override string CorpseName => "a holy corpse"; - public override bool IsDispellable => false; - public override bool IsBondable => false; - - public override string DefaultName => "a silver wolf"; - - public override int Meat => 1; - public override int Hides => 7; - public override FoodType FavoriteFood => FoodType.Meat; - public override PackInstinct PackInstinct => PackInstinct.Canine; - - public override string ApplyNameSuffix(string suffix) - { - if (suffix.Length == 0) - { - suffix = Ethic.Hero.Definition.Adjunct.String; - } - else - { - suffix = $"{suffix} {Ethic.Hero.Definition.Adjunct.String}"; - } - - return base.ApplyNameSuffix(suffix); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } + return base.ApplyNameSuffix(suffix); } } diff --git a/Projects/UOContent/Engines/Factions/Items/Power Faction Items/BloodRose.cs b/Projects/UOContent/Engines/Factions/Items/Power Faction Items/BloodRose.cs index 6823b3d16..7e0f7f9ac 100644 --- a/Projects/UOContent/Engines/Factions/Items/Power Faction Items/BloodRose.cs +++ b/Projects/UOContent/Engines/Factions/Items/Power Faction Items/BloodRose.cs @@ -1,60 +1,40 @@ using System; +using ModernUO.Serialization; -namespace Server +namespace Server; + +[SerializationGenerator(0)] +public sealed partial class BloodRose : PowerFactionItem { - public sealed class BloodRose : PowerFactionItem + public BloodRose() : base(Utility.RandomBool() ? 6378 : 9035) => Hue = 2118; + + public override string DefaultName => "blood rose"; + + public override bool Use(Mobile from) { - public BloodRose() - : base(Utility.RandomList(6378, 9035)) => - Hue = 2118; - - public BloodRose(Serial serial) - : base(serial) + if (from.GetStatMod("blood-rose") == null) { - } + from.PlaySound(Utility.Random(0x3A, 3)); - public override string DefaultName => "blood rose"; - - public override bool Use(Mobile from) - { - if (from.GetStatMod("blood-rose") == null) + if (from.Body.IsHuman && !from.Mounted) { - from.PlaySound(Utility.Random(0x3A, 3)); - - if (from.Body.IsHuman && !from.Mounted) - { - from.Animate(34, 5, 1, true, false, 0); - } - - var amount = Utility.Dice(3, 3, 3); - var time = Utility.RandomMinMax(5, 30); - - from.FixedParticles(0x373A, 10, 15, 5018, EffectLayer.Waist); - - from.PlaySound(0x1EE); - from.AddStatMod(new StatMod(StatType.All, "blood-rose", amount, TimeSpan.FromMinutes(time))); - - return true; + from.Animate(34, 5, 1, true, false, 0); } - // You have eaten one of these recently and eating another would provide no benefit. - from.SendLocalizedMessage(1062927); + var amount = Utility.Dice(3, 3, 3); + var time = Utility.RandomMinMax(5, 30); - return false; + from.FixedParticles(0x373A, 10, 15, 5018, EffectLayer.Waist); + + from.PlaySound(0x1EE); + from.AddStatMod(new StatMod(StatType.All, "blood-rose", amount, TimeSpan.FromMinutes(time))); + + return true; } - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); + // You have eaten one of these recently and eating another would provide no benefit. + from.SendLocalizedMessage(1062927); - writer.WriteEncodedInt(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadEncodedInt(); - } + return false; } } diff --git a/Projects/UOContent/Engines/Factions/Items/Power Faction Items/ClarityPotion.cs b/Projects/UOContent/Engines/Factions/Items/Power Faction Items/ClarityPotion.cs index 9429c20a1..9632f7550 100644 --- a/Projects/UOContent/Engines/Factions/Items/Power Faction Items/ClarityPotion.cs +++ b/Projects/UOContent/Engines/Factions/Items/Power Faction Items/ClarityPotion.cs @@ -1,68 +1,48 @@ using System; +using ModernUO.Serialization; -namespace Server +namespace Server; + +[SerializationGenerator(0)] +public sealed partial class ClarityPotion : PowerFactionItem { - public sealed class ClarityPotion : PowerFactionItem + public ClarityPotion() : base(3628) => Hue = 1154; + + public override string DefaultName => "clarity potion"; + + public override bool Use(Mobile from) { - public ClarityPotion() - : base(3628) => - Hue = 1154; - - public ClarityPotion(Serial serial) - : base(serial) + if (!from.BeginAction()) { - } - - public override string DefaultName => "clarity potion"; - - public override bool Use(Mobile from) - { - if (from.BeginAction()) - { - var amount = Utility.Dice(3, 3, 3); - var time = Utility.RandomMinMax(5, 30); - - from.PlaySound(0x2D6); - - if (from.Body.IsHuman) - { - from.Animate(34, 5, 1, true, false, 0); - } - - from.FixedParticles(0x375A, 10, 15, 5011, EffectLayer.Head); - from.PlaySound(0x1EB); - - var mod = from.GetStatMod("Concussion"); - - if (mod != null) - { - from.RemoveStatMod("Concussion"); - from.Mana -= mod.Offset; - } - - from.PlaySound(0x1EE); - from.AddStatMod(new StatMod(StatType.Int, "clarity-potion", amount, TimeSpan.FromMinutes(time))); - - Timer.StartTimer(TimeSpan.FromMinutes(time), from.EndAction); - - return true; - } - return false; } - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); + var amount = Utility.Dice(3, 3, 3); + var time = Utility.RandomMinMax(5, 30); - writer.WriteEncodedInt(0); // version + from.PlaySound(0x2D6); + + if (from.Body.IsHuman) + { + from.Animate(34, 5, 1, true, false, 0); } - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); + from.FixedParticles(0x375A, 10, 15, 5011, EffectLayer.Head); + from.PlaySound(0x1EB); - var version = reader.ReadEncodedInt(); + var mod = from.GetStatMod("Concussion"); + + if (mod != null) + { + from.RemoveStatMod("Concussion"); + from.Mana -= mod.Offset; } + + from.PlaySound(0x1EE); + from.AddStatMod(new StatMod(StatType.Int, "clarity-potion", amount, TimeSpan.FromMinutes(time))); + + Timer.StartTimer(TimeSpan.FromMinutes(time), from.EndAction); + + return true; } } diff --git a/Projects/UOContent/Engines/Factions/Items/Power Faction Items/GemOfEmpowerment.cs b/Projects/UOContent/Engines/Factions/Items/Power Faction Items/GemOfEmpowerment.cs index 7435412c8..6324314aa 100644 --- a/Projects/UOContent/Engines/Factions/Items/Power Faction Items/GemOfEmpowerment.cs +++ b/Projects/UOContent/Engines/Factions/Items/Power Faction Items/GemOfEmpowerment.cs @@ -1,48 +1,28 @@ +using ModernUO.Serialization; using Server.Factions; -namespace Server +namespace Server; + +[SerializationGenerator(0)] +public sealed partial class GemOfEmpowerment : PowerFactionItem { - public sealed class GemOfEmpowerment : PowerFactionItem + public GemOfEmpowerment() : base(7955) => Hue = 1154; + + public override string DefaultName => "gem of empowerment"; + + public override bool Use(Mobile from) { - public GemOfEmpowerment() - : base(7955) => - Hue = 1154; - - public GemOfEmpowerment(Serial serial) - : base(serial) + if (Faction.ClearSkillLoss(from)) { + from.LocalOverheadMessage(MessageType.Regular, 2219, false, "The gem shatters as you invoke its power."); + from.PlaySound(909); + + from.FixedEffect(0x373A, 10, 30); + from.PlaySound(0x209); + + return true; } - public override string DefaultName => "gem of empowerment"; - - public override bool Use(Mobile from) - { - if (Faction.ClearSkillLoss(from)) - { - from.LocalOverheadMessage(MessageType.Regular, 2219, false, "The gem shatters as you invoke its power."); - from.PlaySound(909); - - from.FixedEffect(0x373A, 10, 30); - from.PlaySound(0x209); - - return true; - } - - return false; - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.WriteEncodedInt(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadEncodedInt(); - } + return false; } } diff --git a/Projects/UOContent/Engines/Factions/Items/Power Faction Items/PowerFactionItem.cs b/Projects/UOContent/Engines/Factions/Items/Power Faction Items/PowerFactionItem.cs index 4097fedcc..fbc4db7d8 100644 --- a/Projects/UOContent/Engines/Factions/Items/Power Faction Items/PowerFactionItem.cs +++ b/Projects/UOContent/Engines/Factions/Items/Power Faction Items/PowerFactionItem.cs @@ -1,191 +1,162 @@ using System; using System.IO; +using ModernUO.Serialization; using Server.Factions; using Server.Mobiles; +using Server.Random; -namespace Server +namespace Server; + +[SerializationGenerator(0, false)] +public abstract partial class PowerFactionItem : Item { - public abstract class PowerFactionItem : Item + private static readonly WeightedValue[] _items = { - private static readonly WeightedItem[] _items = - { - new(30, typeof(GemOfEmpowerment)), - new(25, typeof(BloodRose)), - new(20, typeof(ClarityPotion)), - new(15, typeof(UrnOfAscension)), - new(10, typeof(StormsEye)) - }; + new(30, typeof(GemOfEmpowerment)), + new(25, typeof(BloodRose)), + new(20, typeof(ClarityPotion)), + new(15, typeof(UrnOfAscension)), + new(10, typeof(StormsEye)) + }; - public PowerFactionItem(int itemId) - : base(itemId) + private const int TotalWeight = 30 + 25 + 20 + 15 + 10; + + public PowerFactionItem(int itemId) : base(itemId) + { + } + + public abstract bool Use(Mobile mob); + + public static void CheckSpawn(Mobile killer, Mobile victim) + { + if (killer == null || victim == null) { + return; } - public PowerFactionItem(Serial serial) - : base(serial) + var ps = PlayerState.Find(victim); + + if (ps == null) { + return; } - public abstract bool Use(Mobile mob); + var chance = ps.Rank.Rank; - public static void CheckSpawn(Mobile killer, Mobile victim) + if (chance <= Utility.Random(100)) { - if (killer != null && victim != null) + return; + } + + var weight = Utility.Random(TotalWeight); + + foreach (var item in _items) + { + if (weight < item.Weight) { - var ps = PlayerState.Find(victim); + var obj = item.Value.CreateInstance(); - if (ps != null) + if (obj != null) { - var chance = ps.Rank.Rank; + killer.AddToBackpack(obj); - if (chance > Utility.Random(100)) - { - var weight = 0; - - foreach (var item in _items) - { - weight += item.Weight; - } - - weight = Utility.Random(weight); - - foreach (var item in _items) - { - if (weight < item.Weight) - { - var obj = item.Type.CreateInstance(); - - if (obj != null) - { - killer.AddToBackpack(obj); - - killer.SendSound(1470); - killer.LocalOverheadMessage( - MessageType.Regular, - 2119, - false, - "You notice a strange item on the corpse, and decide to pick it up." - ); - - try - { - using var op = new StreamWriter("faction-power-items.log", true); - op.WriteLine("{0}\t{1}\t{2}\t{3}", Core.Now, killer, victim, obj); - } - catch - { - // ignored - } - } - - break; - } - - weight -= item.Weight; - } - } - } - } - } - - public override void OnDoubleClick(Mobile from) - { - if (!IsChildOf(from.Backpack)) - { - from.SendLocalizedMessage(1042038); // You must have the object in your backpack to use it. - } - else if (from is PlayerMobile mobile && mobile.DuelContext != null) - { - mobile.SendMessage("You can't use that."); - } - else if (Faction.Find(from) == null) - { - from.LocalOverheadMessage( - MessageType.Regular, - 2119, - false, - "The object vanishes from your hands as you touch it." - ); - - Timer.StartTimer( - TimeSpan.FromSeconds(1.0), - () => from.LocalOverheadMessage( + killer.SendSound(1470); + killer.LocalOverheadMessage( MessageType.Regular, - 2118, + 2119, false, - "You feel a strange tingling sensation throughout your body." - ) - ); + "You notice a strange item on the corpse, and decide to pick it up." + ); - Timer.StartTimer( - TimeSpan.FromSeconds(4.0), - () => { from.LocalOverheadMessage(MessageType.Regular, 2118, false, "Your skin begins to burn."); } - ); - - new DestructionTimer(from).Start(); - Delete(); - - // from.SendMessage( "You must be in a faction to use this item." ); - } - else if (Use(from)) - { - from.RevealingAction(); - Consume(); - } - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.WriteEncodedInt(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadEncodedInt(); - } - - private sealed class DestructionTimer : Timer - { - private readonly Mobile _mobile; - - private bool _screamed; - - public DestructionTimer(Mobile mob) - : base(TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(0.1), 10) => - _mobile = mob; - - protected override void OnTick() - { - if (_mobile.Alive) - { - if (!_screamed) + try { - _screamed = true; - - _mobile.PlaySound(_mobile.Female ? 814 : 1088); - _mobile.PublicOverheadMessage(MessageType.Regular, 2118, false, "Aaaaah!"); + using var op = new StreamWriter("faction-power-items.log", true); + op.WriteLine($"{Core.Now}\t{killer}\t{victim}\t{obj}"); + } + catch + { + // ignored } - - _mobile.Damage(Utility.Dice(2, 6, 0)); } + + break; } + + weight -= item.Weight; } + } - private sealed class WeightedItem + public override void OnDoubleClick(Mobile from) + { + if (!IsChildOf(from.Backpack)) { - public WeightedItem(int weight, Type type) + from.SendLocalizedMessage(1042038); // You must have the object in your backpack to use it. + } + else if (from is PlayerMobile mobile && mobile.DuelContext != null) + { + mobile.SendMessage("You can't use that."); + } + else if (Faction.Find(from) == null) + { + from.LocalOverheadMessage( + MessageType.Regular, + 2119, + false, + "The object vanishes from your hands as you touch it." + ); + + Timer.StartTimer( + TimeSpan.FromSeconds(1.0), + () => from.LocalOverheadMessage( + MessageType.Regular, + 2118, + false, + "You feel a strange tingling sensation throughout your body." + ) + ); + + Timer.StartTimer( + TimeSpan.FromSeconds(4.0), + () => { from.LocalOverheadMessage(MessageType.Regular, 2118, false, "Your skin begins to burn."); } + ); + + new DestructionTimer(from).Start(); + Delete(); + + // from.SendMessage( "You must be in a faction to use this item." ); + } + else if (Use(from)) + { + from.RevealingAction(); + Consume(); + } + } + + private sealed class DestructionTimer : Timer + { + private readonly Mobile _mobile; + + private bool _screamed; + + public DestructionTimer(Mobile mob) : base(TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(0.1), 10) => + _mobile = mob; + + protected override void OnTick() + { + if (!_mobile.Alive) { - Weight = weight; - Type = type; + return; } - public int Weight { get; } + if (!_screamed) + { + _screamed = true; - public Type Type { get; } + _mobile.PlaySound(_mobile.Female ? 814 : 1088); + _mobile.PublicOverheadMessage(MessageType.Regular, 2118, false, "Aaaaah!"); + } + + _mobile.Damage(Utility.Dice(2, 6, 0)); } } } diff --git a/Projects/UOContent/Engines/Factions/Items/Power Faction Items/StormsEye.cs b/Projects/UOContent/Engines/Factions/Items/Power Faction Items/StormsEye.cs index 06319c84f..31bda7e06 100644 --- a/Projects/UOContent/Engines/Factions/Items/Power Faction Items/StormsEye.cs +++ b/Projects/UOContent/Engines/Factions/Items/Power Faction Items/StormsEye.cs @@ -1,185 +1,165 @@ using System; +using ModernUO.Serialization; using Server.Collections; using Server.Factions; using Server.Spells; using Server.Targeting; -namespace Server +namespace Server; + +[SerializationGenerator(0)] +public sealed partial class StormsEye : PowerFactionItem { - public sealed class StormsEye : PowerFactionItem + public StormsEye() : base(3967) => Hue = 1165; + + public override string DefaultName => "storms eye"; + + public override bool Use(Mobile user) { - public StormsEye() - : base(3967) => - Hue = 1165; - - public StormsEye(Serial serial) - : base(serial) + if (!Movable) { - } - - public override string DefaultName => "storms eye"; - - public override bool Use(Mobile user) - { - if (!Movable) - { - return false; - } - - user.BeginTarget( - 12, - true, - TargetFlags.None, - (from, obj, stormsEye) => - { - if (!stormsEye.Movable || stormsEye.Deleted || obj is not IPoint3D pt) - { - return; - } - - SpellHelper.GetSurfaceTop(ref pt); - - var origin = new Point3D(pt); - var facet = from.Map; - - if (facet?.CanFit(pt.X, pt.Y, pt.Z, 16, false, false) != true) - { - return; - } - - stormsEye.Movable = false; - - Effects.SendMovingEffect( - from, - new Entity(Serial.Zero, origin, facet), - ItemID & 0x3FFF, - 7, - 0, - false, - false, - Hue - 1 - ); - - Timer.StartTimer(TimeSpan.FromSeconds(0.5), () => OnDelay(from, stormsEye, origin, facet)); - }, - this - ); - return false; } - private static void OnDelay(Mobile from, StormsEye stormsEye, Point3D origin, Map facet) + user.BeginTarget( + 12, + true, + TargetFlags.None, + (from, obj, stormsEye) => + { + if (!stormsEye.Movable || stormsEye.Deleted || obj is not IPoint3D pt) + { + return; + } + + SpellHelper.GetSurfaceTop(ref pt); + + var origin = new Point3D(pt); + var facet = from.Map; + + if (facet?.CanFit(pt.X, pt.Y, pt.Z, 16, false, false) != true) + { + return; + } + + stormsEye.Movable = false; + + Effects.SendMovingEffect( + from, + new Entity(Serial.Zero, origin, facet), + ItemID & 0x3FFF, + 7, + 0, + false, + false, + Hue - 1 + ); + + Timer.StartTimer(TimeSpan.FromSeconds(0.5), () => OnDelay(from, stormsEye, origin, facet)); + }, + this + ); + + return false; + } + + private static void OnDelay(Mobile from, StormsEye stormsEye, Point3D origin, Map facet) + { + stormsEye.Delete(); + + Effects.PlaySound(origin, facet, 530); + Effects.PlaySound(origin, facet, 263); + + Effects.SendLocationEffect( + origin, + facet, + 14284, + 96, + 1, + 0, + 2 + ); + + Timer.StartTimer(TimeSpan.FromSeconds(1.0), () => OnHit(from, origin, facet)); + } + + private static void OnHit(Mobile from, Point3D origin, Map facet) + { + using var queue = PooledRefQueue.Create(); + foreach (var m in facet.GetMobilesInRange(origin, 12)) { - stormsEye.Delete(); + if (from.CanBeHarmful(m, false) && + m.InLOS(new Point3D(origin.X, origin.Y, origin.Z + 1)) && + Faction.Find(m) != null) + { + queue.Enqueue(from); + } + } - Effects.PlaySound(origin, facet, 530); - Effects.PlaySound(origin, facet, 263); + while (queue.Count > 0) + { + var mob = queue.Dequeue(); - Effects.SendLocationEffect( - origin, - facet, - 14284, - 96, + var damage = mob.Hits * 6 / 10; + + if (!mob.Player && damage < 10) + { + damage = 10; + } + else if (damage > 75) + { + damage = 75; + } + + Effects.SendMovingEffect( + new Entity(Serial.Zero, new Point3D(origin.X, origin.Y, origin.Z + 4), facet), + mob, + 14068, 1, - 0, + 32, + false, + false, + 1111, 2 ); - Timer.StartTimer(TimeSpan.FromSeconds(1.0), () => OnHit(from, origin, facet)); - } + from.DoHarmful(mob); - private static void OnHit(Mobile from, Point3D origin, Map facet) - { - using var queue = PooledRefQueue.Create(); - foreach (var m in facet.GetMobilesInRange(origin, 12)) - { - if (from.CanBeHarmful(m, false) && - m.InLOS(new Point3D(origin.X, origin.Y, origin.Z + 1)) && - Faction.Find(m) != null) - { - queue.Enqueue(from); - } - } + SpellHelper.Damage( + TimeSpan.FromSeconds(0.50), + mob, + from, + damage / 3.0, + 0, + 0, + 0, + 0, + 100 + ); + SpellHelper.Damage( + TimeSpan.FromSeconds(0.70), + mob, + from, + damage / 3.0, + 0, + 0, + 0, + 0, + 100 + ); + SpellHelper.Damage( + TimeSpan.FromSeconds(1.00), + mob, + from, + damage / 3.0, + 0, + 0, + 0, + 0, + 100 + ); - while (queue.Count > 0) - { - var mob = queue.Dequeue(); - - var damage = mob.Hits * 6 / 10; - - if (!mob.Player && damage < 10) - { - damage = 10; - } - else if (damage > 75) - { - damage = 75; - } - - Effects.SendMovingEffect( - new Entity(Serial.Zero, new Point3D(origin.X, origin.Y, origin.Z + 4), facet), - mob, - 14068, - 1, - 32, - false, - false, - 1111, - 2 - ); - - from.DoHarmful(mob); - - SpellHelper.Damage( - TimeSpan.FromSeconds(0.50), - mob, - from, - damage / 3.0, - 0, - 0, - 0, - 0, - 100 - ); - SpellHelper.Damage( - TimeSpan.FromSeconds(0.70), - mob, - from, - damage / 3.0, - 0, - 0, - 0, - 0, - 100 - ); - SpellHelper.Damage( - TimeSpan.FromSeconds(1.00), - mob, - from, - damage / 3.0, - 0, - 0, - 0, - 0, - 100 - ); - - Timer.StartTimer(TimeSpan.FromSeconds(0.50), () => mob.PlaySound(0x1FB)); - } - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.WriteEncodedInt(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadEncodedInt(); + Timer.StartTimer(TimeSpan.FromSeconds(0.50), () => mob.PlaySound(0x1FB)); } } } diff --git a/Projects/UOContent/Engines/Factions/Items/Power Faction Items/UrnOfAscension.cs b/Projects/UOContent/Engines/Factions/Items/Power Faction Items/UrnOfAscension.cs index ad670089a..6e056bc26 100644 --- a/Projects/UOContent/Engines/Factions/Items/Power Faction Items/UrnOfAscension.cs +++ b/Projects/UOContent/Engines/Factions/Items/Power Faction Items/UrnOfAscension.cs @@ -1,73 +1,54 @@ +using ModernUO.Serialization; using Server.Factions; using Server.Gumps; using Server.Multis; -namespace Server +namespace Server; + +[SerializationGenerator(0)] +public sealed partial class UrnOfAscension : PowerFactionItem { - public sealed class UrnOfAscension : PowerFactionItem + public UrnOfAscension() : base(9246) { - public UrnOfAscension() - : base(9246) + } + + public override string DefaultName => "urn of ascension"; + + public override bool Use(Mobile from) + { + var ourFaction = Faction.Find(from); + + var used = false; + + foreach (var mob in from.GetMobilesInRange(8)) { - } - - public UrnOfAscension(Serial serial) - : base(serial) - { - } - - public override string DefaultName => "urn of ascension"; - - public override bool Use(Mobile from) - { - var ourFaction = Faction.Find(from); - - var used = false; - - foreach (var mob in from.GetMobilesInRange(8)) + if (mob.Player && !mob.Alive && from.InLOS(mob)) { - if (mob.Player && !mob.Alive && from.InLOS(mob)) + if (Faction.Find(mob) != ourFaction) { - if (Faction.Find(mob) != ourFaction) - { - continue; - } + continue; + } - var house = BaseHouse.FindHouseAt(mob); + var house = BaseHouse.FindHouseAt(mob); - if (house?.IsFriend(from) != false || house.IsFriend(mob)) - { - Faction.ClearSkillLoss(mob); + if (house?.IsFriend(from) != false || house.IsFriend(mob)) + { + Faction.ClearSkillLoss(mob); - mob.SendGump(new ResurrectGump(mob, from)); - used = true; - } + mob.SendGump(new ResurrectGump(mob, from)); + used = true; } } - - if (used) - { - from.LocalOverheadMessage(MessageType.Regular, 2219, false, "The urn shatters as you invoke its power."); - from.PlaySound(64); - - Effects.PlaySound(from.Location, from.Map, 1481); - } - - return used; } - public override void Serialize(IGenericWriter writer) + if (used) { - base.Serialize(writer); + from.LocalOverheadMessage(MessageType.Regular, 2219, false, "The urn shatters as you invoke its power."); + from.PlaySound(64); - writer.WriteEncodedInt(0); // version + Effects.PlaySound(from.Location, from.Map, 1481); } - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadEncodedInt(); - } + return used; } } diff --git a/Projects/UOContent/Engines/Factions/Items/Silver.cs b/Projects/UOContent/Engines/Factions/Items/Silver.cs index e55388305..d9b5e4d63 100644 --- a/Projects/UOContent/Engines/Factions/Items/Silver.cs +++ b/Projects/UOContent/Engines/Factions/Items/Silver.cs @@ -1,57 +1,34 @@ -namespace Server.Factions +using ModernUO.Serialization; + +namespace Server.Factions; + +[SerializationGenerator(0)] +public partial class Silver : Item { - public class Silver : Item + [Constructible] + public Silver() : this(1) { - [Constructible] - public Silver() : this(1) - { - } - - [Constructible] - public Silver(int amountFrom, int amountTo) : this(Utility.RandomMinMax(amountFrom, amountTo)) - { - } - - [Constructible] - public Silver(int amount) : base(0xEF0) - { - Stackable = true; - Amount = amount; - } - - public Silver(Serial serial) : base(serial) - { - } - - public override double DefaultWeight => 0.02; - - public override int GetDropSound() - { - if (Amount <= 1) - { - return 0x2E4; - } - - if (Amount <= 5) - { - return 0x2E5; - } - - return 0x2E6; - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } } + + [Constructible] + public Silver(int amountFrom, int amountTo) : this(Utility.RandomMinMax(amountFrom, amountTo)) + { + } + + [Constructible] + public Silver(int amount) : base(0xEF0) + { + Stackable = true; + Amount = amount; + } + + public override double DefaultWeight => 0.02; + + public override int GetDropSound() => + Amount switch + { + <= 1 => 0x2E4, + <= 5 => 0x2E5, + _ => 0x2E6 + }; } diff --git a/Projects/UOContent/Engines/Factions/Items/Traps/FactionExplosionTrap.cs b/Projects/UOContent/Engines/Factions/Items/Traps/FactionExplosionTrap.cs index c0e57e65a..3dbd63de2 100644 --- a/Projects/UOContent/Engines/Factions/Items/Traps/FactionExplosionTrap.cs +++ b/Projects/UOContent/Engines/Factions/Items/Traps/FactionExplosionTrap.cs @@ -1,76 +1,43 @@ using System; +using ModernUO.Serialization; -namespace Server.Factions +namespace Server.Factions; + +[SerializationGenerator(0, false)] +public partial class FactionExplosionTrap : BaseFactionTrap { - public class FactionExplosionTrap : BaseFactionTrap + [Constructible] + public FactionExplosionTrap(Faction f = null, Mobile m = null) : base(f, m, 0x11C1) { - [Constructible] - public FactionExplosionTrap(Faction f = null, Mobile m = null) : base(f, m, 0x11C1) - { - } - - public FactionExplosionTrap(Serial serial) : base(serial) - { - } - - public override int LabelNumber => 1044599; // faction explosion trap - - public override int AttackMessage => 1010543; // You are enveloped in an explosion of fire! - public override int DisarmMessage => 1010539; // You carefully remove the pressure trigger and disable the trap. - public override int EffectSound => 0x307; - public override int MessageHue => 0x78; - - public override AllowedPlacing AllowedPlacing => AllowedPlacing.AnyFactionTown; - - public override void DoVisibleEffect() - { - Effects.SendLocationEffect(GetWorldLocation(), Map, 0x36BD, 15); - } - - public override void DoAttackEffect(Mobile m) - { - m.Damage(Utility.Dice(6, 10, 40), m); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } } - public class FactionExplosionTrapDeed : BaseFactionTrapDeed + public override int LabelNumber => 1044599; // faction explosion trap + + public override int AttackMessage => 1010543; // You are enveloped in an explosion of fire! + public override int DisarmMessage => 1010539; // You carefully remove the pressure trigger and disable the trap. + public override int EffectSound => 0x307; + public override int MessageHue => 0x78; + + public override AllowedPlacing AllowedPlacing => AllowedPlacing.AnyFactionTown; + + public override void DoVisibleEffect() { - public FactionExplosionTrapDeed() : base(0x36D2) - { - } + Effects.SendLocationEffect(GetWorldLocation(), Map, 0x36BD, 15); + } - public FactionExplosionTrapDeed(Serial serial) : base(serial) - { - } - - public override Type TrapType => typeof(FactionExplosionTrap); - public override int LabelNumber => 1044603; // faction explosion trap deed - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - var version = reader.ReadInt(); - } + public override void DoAttackEffect(Mobile m) + { + m.Damage(Utility.Dice(6, 10, 40), m); } } + +[SerializationGenerator(0, false)] +public partial class FactionExplosionTrapDeed : BaseFactionTrapDeed +{ + public FactionExplosionTrapDeed() : base(0x36D2) + { + } + + public override Type TrapType => typeof(FactionExplosionTrap); + public override int LabelNumber => 1044603; // faction explosion trap deed +} diff --git a/Projects/UOContent/Engines/Factions/Items/Traps/FactionGasTrap.cs b/Projects/UOContent/Engines/Factions/Items/Traps/FactionGasTrap.cs index cc2e70fb0..905edb68a 100644 --- a/Projects/UOContent/Engines/Factions/Items/Traps/FactionGasTrap.cs +++ b/Projects/UOContent/Engines/Factions/Items/Traps/FactionGasTrap.cs @@ -1,76 +1,43 @@ using System; +using ModernUO.Serialization; -namespace Server.Factions +namespace Server.Factions; + +[SerializationGenerator(0, false)] +public partial class FactionGasTrap : BaseFactionTrap { - public class FactionGasTrap : BaseFactionTrap + [Constructible] + public FactionGasTrap(Faction f = null, Mobile m = null) : base(f, m, 0x113C) { - [Constructible] - public FactionGasTrap(Faction f = null, Mobile m = null) : base(f, m, 0x113C) - { - } - - public FactionGasTrap(Serial serial) : base(serial) - { - } - - public override int LabelNumber => 1044598; // faction gas trap - - public override int AttackMessage => 1010542; // A noxious green cloud of poison gas envelops you! - public override int DisarmMessage => 502376; // The poison leaks harmlessly away due to your deft touch. - public override int EffectSound => 0x230; - public override int MessageHue => 0x44; - - public override AllowedPlacing AllowedPlacing => AllowedPlacing.FactionStronghold; - - public override void DoVisibleEffect() - { - Effects.SendLocationEffect(Location, Map, 0x3709, 28, 10, 0x1D3, 5); - } - - public override void DoAttackEffect(Mobile m) - { - m.ApplyPoison(m, Poison.Lethal); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } } - public class FactionGasTrapDeed : BaseFactionTrapDeed + public override int LabelNumber => 1044598; // faction gas trap + + public override int AttackMessage => 1010542; // A noxious green cloud of poison gas envelops you! + public override int DisarmMessage => 502376; // The poison leaks harmlessly away due to your deft touch. + public override int EffectSound => 0x230; + public override int MessageHue => 0x44; + + public override AllowedPlacing AllowedPlacing => AllowedPlacing.FactionStronghold; + + public override void DoVisibleEffect() { - public FactionGasTrapDeed() : base(0x11AB) - { - } + Effects.SendLocationEffect(Location, Map, 0x3709, 28, 10, 0x1D3, 5); + } - public FactionGasTrapDeed(Serial serial) : base(serial) - { - } - - public override Type TrapType => typeof(FactionGasTrap); - public override int LabelNumber => 1044602; // faction gas trap deed - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - var version = reader.ReadInt(); - } + public override void DoAttackEffect(Mobile m) + { + m.ApplyPoison(m, Poison.Lethal); } } + +[SerializationGenerator(0, false)] +public partial class FactionGasTrapDeed : BaseFactionTrapDeed +{ + public FactionGasTrapDeed() : base(0x11AB) + { + } + + public override Type TrapType => typeof(FactionGasTrap); + public override int LabelNumber => 1044602; // faction gas trap deed +} diff --git a/Projects/UOContent/Engines/Factions/Items/Traps/FactionSawTrap.cs b/Projects/UOContent/Engines/Factions/Items/Traps/FactionSawTrap.cs index aeaf7dc3b..a1ac1bf57 100644 --- a/Projects/UOContent/Engines/Factions/Items/Traps/FactionSawTrap.cs +++ b/Projects/UOContent/Engines/Factions/Items/Traps/FactionSawTrap.cs @@ -1,76 +1,43 @@ using System; +using ModernUO.Serialization; -namespace Server.Factions +namespace Server.Factions; + +[SerializationGenerator(0, false)] +public partial class FactionSawTrap : BaseFactionTrap { - public class FactionSawTrap : BaseFactionTrap + [Constructible] + public FactionSawTrap(Faction f = null, Mobile m = null) : base(f, m, 0x11AC) { - [Constructible] - public FactionSawTrap(Faction f = null, Mobile m = null) : base(f, m, 0x11AC) - { - } - - public FactionSawTrap(Serial serial) : base(serial) - { - } - - public override int LabelNumber => 1041047; // faction saw trap - - public override int AttackMessage => 1010544; // The blade cuts deep into your skin! - public override int DisarmMessage => 1010540; // You carefully dismantle the saw mechanism and disable the trap. - public override int EffectSound => 0x218; - public override int MessageHue => 0x5A; - - public override AllowedPlacing AllowedPlacing => AllowedPlacing.ControlledFactionTown; - - public override void DoVisibleEffect() - { - Effects.SendLocationEffect(Location, Map, 0x11AD, 25); - } - - public override void DoAttackEffect(Mobile m) - { - m.Damage(Utility.Dice(6, 10, 40), m); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } } - public class FactionSawTrapDeed : BaseFactionTrapDeed + public override int LabelNumber => 1041047; // faction saw trap + + public override int AttackMessage => 1010544; // The blade cuts deep into your skin! + public override int DisarmMessage => 1010540; // You carefully dismantle the saw mechanism and disable the trap. + public override int EffectSound => 0x218; + public override int MessageHue => 0x5A; + + public override AllowedPlacing AllowedPlacing => AllowedPlacing.ControlledFactionTown; + + public override void DoVisibleEffect() { - public FactionSawTrapDeed() : base(0x1107) - { - } + Effects.SendLocationEffect(Location, Map, 0x11AD, 25); + } - public FactionSawTrapDeed(Serial serial) : base(serial) - { - } - - public override Type TrapType => typeof(FactionSawTrap); - public override int LabelNumber => 1044604; // faction saw trap deed - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - var version = reader.ReadInt(); - } + public override void DoAttackEffect(Mobile m) + { + m.Damage(Utility.Dice(6, 10, 40), m); } } + +[SerializationGenerator(0, false)] +public partial class FactionSawTrapDeed : BaseFactionTrapDeed +{ + public FactionSawTrapDeed() : base(0x1107) + { + } + + public override Type TrapType => typeof(FactionSawTrap); + public override int LabelNumber => 1044604; // faction saw trap deed +} diff --git a/Projects/UOContent/Engines/Factions/Items/Traps/FactionSpikeTrap.cs b/Projects/UOContent/Engines/Factions/Items/Traps/FactionSpikeTrap.cs index b861ee738..bb4fb85ba 100644 --- a/Projects/UOContent/Engines/Factions/Items/Traps/FactionSpikeTrap.cs +++ b/Projects/UOContent/Engines/Factions/Items/Traps/FactionSpikeTrap.cs @@ -1,79 +1,46 @@ using System; +using ModernUO.Serialization; -namespace Server.Factions +namespace Server.Factions; + +[SerializationGenerator(0, false)] +public partial class FactionSpikeTrap : BaseFactionTrap { - public class FactionSpikeTrap : BaseFactionTrap + [Constructible] + public FactionSpikeTrap(Faction f = null, Mobile m = null) : base(f, m, 0x11A0) { - [Constructible] - public FactionSpikeTrap(Faction f = null, Mobile m = null) : base(f, m, 0x11A0) - { - } - - public FactionSpikeTrap(Serial serial) : base(serial) - { - } - - public override int LabelNumber => 1044601; // faction spike trap - - public override int AttackMessage => 1010545; // Large spikes in the ground spring up piercing your skin! - - public override int DisarmMessage => - 1010541; // You carefully dismantle the trigger on the spikes and disable the trap. - - public override int EffectSound => 0x22E; - public override int MessageHue => 0x5A; - - public override AllowedPlacing AllowedPlacing => AllowedPlacing.ControlledFactionTown; - - public override void DoVisibleEffect() - { - Effects.SendLocationEffect(Location, Map, 0x11A4, 12, 6); - } - - public override void DoAttackEffect(Mobile m) - { - m.Damage(Utility.Dice(6, 10, 40), m); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } } - public class FactionSpikeTrapDeed : BaseFactionTrapDeed + public override int LabelNumber => 1044601; // faction spike trap + + public override int AttackMessage => 1010545; // Large spikes in the ground spring up piercing your skin! + + public override int DisarmMessage => + 1010541; // You carefully dismantle the trigger on the spikes and disable the trap. + + public override int EffectSound => 0x22E; + public override int MessageHue => 0x5A; + + public override AllowedPlacing AllowedPlacing => AllowedPlacing.ControlledFactionTown; + + public override void DoVisibleEffect() { - public FactionSpikeTrapDeed() : base(0x11A5) - { - } + Effects.SendLocationEffect(Location, Map, 0x11A4, 12, 6); + } - public FactionSpikeTrapDeed(Serial serial) : base(serial) - { - } - - public override Type TrapType => typeof(FactionSpikeTrap); - public override int LabelNumber => 1044605; // faction spike trap deed - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - var version = reader.ReadInt(); - } + public override void DoAttackEffect(Mobile m) + { + m.Damage(Utility.Dice(6, 10, 40), m); } } + +[SerializationGenerator(0, false)] +public partial class FactionSpikeTrapDeed : BaseFactionTrapDeed +{ + public FactionSpikeTrapDeed() : base(0x11A5) + { + } + + public override Type TrapType => typeof(FactionSpikeTrap); + public override int LabelNumber => 1044605; // faction spike trap deed +} diff --git a/Projects/UOContent/Engines/Factions/Items/Traps/FactionTrapRemovalKit.cs b/Projects/UOContent/Engines/Factions/Items/Traps/FactionTrapRemovalKit.cs index 0ee8d8ebb..7d1ed7a26 100644 --- a/Projects/UOContent/Engines/Factions/Items/Traps/FactionTrapRemovalKit.cs +++ b/Projects/UOContent/Engines/Factions/Items/Traps/FactionTrapRemovalKit.cs @@ -1,71 +1,38 @@ -namespace Server.Factions +using ModernUO.Serialization; + +namespace Server.Factions; + +[SerializationGenerator(0, false)] +public partial class FactionTrapRemovalKit : Item { - public class FactionTrapRemovalKit : Item + [EncodedInt] + [SerializableField(0)] + [SerializedCommandProperty(AccessLevel.GameMaster)] + private int _charges; + + [Constructible] + public FactionTrapRemovalKit() : base(7867) { - [Constructible] - public FactionTrapRemovalKit() : base(7867) + LootType = LootType.Blessed; + _charges = 25; + } + + public override int LabelNumber => 1041508; // a faction trap removal kit + + public void ConsumeCharge(Mobile consumer) + { + if (--Charges <= 0) { - LootType = LootType.Blessed; - Charges = 25; - } - - public FactionTrapRemovalKit(Serial serial) : base(serial) - { - } - - [CommandProperty(AccessLevel.GameMaster)] - public int Charges { get; set; } - - public override int LabelNumber => 1041508; // a faction trap removal kit - - public void ConsumeCharge(Mobile consumer) - { - --Charges; - - if (Charges <= 0) - { - Delete(); - - consumer?.SendLocalizedMessage(1042531); // You have used all of the parts in your trap removal kit. - } - } - - public override void GetProperties(IPropertyList list) - { - base.GetProperties(list); - - // NOTE: OSI does not list uses remaining; intentional difference - list.Add(1060584, Charges); // uses remaining: ~1_val~ - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(1); // version - - writer.WriteEncodedInt(Charges); - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - - switch (version) - { - case 1: - { - Charges = reader.ReadEncodedInt(); - break; - } - case 0: - { - Charges = 25; - break; - } - } + Delete(); + consumer?.SendLocalizedMessage(1042531); // You have used all of the parts in your trap removal kit. } } + + public override void GetProperties(IPropertyList list) + { + base.GetProperties(list); + + // NOTE: OSI does not list uses remaining; intentional difference + list.Add(1060584, Charges); // uses remaining: ~1_val~ + } } diff --git a/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionBerserker.cs b/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionBerserker.cs index e40d60a1a..f4e464823 100644 --- a/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionBerserker.cs +++ b/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionBerserker.cs @@ -1,72 +1,55 @@ +using ModernUO.Serialization; using Server.Items; -namespace Server.Factions +namespace Server.Factions; + +[SerializationGenerator(0, false)] +public partial class FactionBerserker : BaseFactionGuard { - public class FactionBerserker : BaseFactionGuard + [Constructible] + public FactionBerserker() : base("the berserker") { - [Constructible] - public FactionBerserker() : base("the berserker") - { - GenerateBody(false, false); + GenerateBody(false, false); - SetStr(126, 150); - SetDex(61, 85); - SetInt(81, 95); + SetStr(126, 150); + SetDex(61, 85); + SetInt(81, 95); - SetDamageType(ResistanceType.Physical, 100); + SetDamageType(ResistanceType.Physical, 100); - SetResistance(ResistanceType.Physical, 30, 50); - SetResistance(ResistanceType.Fire, 30, 50); - SetResistance(ResistanceType.Cold, 30, 50); - SetResistance(ResistanceType.Energy, 30, 50); - SetResistance(ResistanceType.Poison, 30, 50); + SetResistance(ResistanceType.Physical, 30, 50); + SetResistance(ResistanceType.Fire, 30, 50); + SetResistance(ResistanceType.Cold, 30, 50); + SetResistance(ResistanceType.Energy, 30, 50); + SetResistance(ResistanceType.Poison, 30, 50); - VirtualArmor = 24; + VirtualArmor = 24; - SetSkill(SkillName.Swords, 100.0, 110.0); - SetSkill(SkillName.Wrestling, 100.0, 110.0); - SetSkill(SkillName.Tactics, 100.0, 110.0); - SetSkill(SkillName.MagicResist, 100.0, 110.0); - SetSkill(SkillName.Healing, 100.0, 110.0); - SetSkill(SkillName.Anatomy, 100.0, 110.0); + SetSkill(SkillName.Swords, 100.0, 110.0); + SetSkill(SkillName.Wrestling, 100.0, 110.0); + SetSkill(SkillName.Tactics, 100.0, 110.0); + SetSkill(SkillName.MagicResist, 100.0, 110.0); + SetSkill(SkillName.Healing, 100.0, 110.0); + SetSkill(SkillName.Anatomy, 100.0, 110.0); - SetSkill(SkillName.Magery, 100.0, 110.0); - SetSkill(SkillName.EvalInt, 100.0, 110.0); - SetSkill(SkillName.Meditation, 100.0, 110.0); + SetSkill(SkillName.Magery, 100.0, 110.0); + SetSkill(SkillName.EvalInt, 100.0, 110.0); + SetSkill(SkillName.Meditation, 100.0, 110.0); - AddItem(Immovable(Rehued(new BodySash(), 1645))); - AddItem(Immovable(Rehued(new Kilt(), 1645))); - AddItem(Immovable(Rehued(new Sandals(), 1645))); - AddItem(Newbied(new DoubleAxe())); + AddItem(Immovable(Rehued(new BodySash(), 1645))); + AddItem(Immovable(Rehued(new Kilt(), 1645))); + AddItem(Immovable(Rehued(new Sandals(), 1645))); + AddItem(Newbied(new DoubleAxe())); - HairItemID = 0x2047; // Afro - HairHue = 0x29; + HairItemID = 0x2047; // Afro + HairHue = 0x29; - FacialHairItemID = 0x204B; // Medium Short Beard - FacialHairHue = 0x29; + FacialHairItemID = 0x204B; // Medium Short Beard + FacialHairHue = 0x29; - PackItem(new Bandage(Utility.RandomMinMax(30, 40))); - PackStrongPotions(6, 12); - } - - public FactionBerserker(Serial serial) : base(serial) - { - } - - public override GuardAI GuardAI => GuardAI.Melee | GuardAI.Curse | GuardAI.Bless; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } + PackItem(new Bandage(Utility.RandomMinMax(30, 40))); + PackStrongPotions(6, 12); } + + public override GuardAI GuardAI => GuardAI.Melee | GuardAI.Curse | GuardAI.Bless; } diff --git a/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionDeathKnight.cs b/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionDeathKnight.cs index 37b3b4e2e..1dfcb773a 100644 --- a/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionDeathKnight.cs +++ b/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionDeathKnight.cs @@ -1,68 +1,51 @@ +using ModernUO.Serialization; using Server.Items; -namespace Server.Factions +namespace Server.Factions; + +[SerializationGenerator(0, false)] +public partial class FactionDeathKnight : BaseFactionGuard { - public class FactionDeathKnight : BaseFactionGuard + [Constructible] + public FactionDeathKnight() : base("the death knight") { - [Constructible] - public FactionDeathKnight() : base("the death knight") - { - GenerateBody(false, false); - Hue = 1; + GenerateBody(false, false); + Hue = 1; - SetStr(126, 150); - SetDex(61, 85); - SetInt(81, 95); + SetStr(126, 150); + SetDex(61, 85); + SetInt(81, 95); - SetDamageType(ResistanceType.Physical, 100); + SetDamageType(ResistanceType.Physical, 100); - SetResistance(ResistanceType.Physical, 30, 50); - SetResistance(ResistanceType.Fire, 30, 50); - SetResistance(ResistanceType.Cold, 30, 50); - SetResistance(ResistanceType.Energy, 30, 50); - SetResistance(ResistanceType.Poison, 30, 50); + SetResistance(ResistanceType.Physical, 30, 50); + SetResistance(ResistanceType.Fire, 30, 50); + SetResistance(ResistanceType.Cold, 30, 50); + SetResistance(ResistanceType.Energy, 30, 50); + SetResistance(ResistanceType.Poison, 30, 50); - VirtualArmor = 24; + VirtualArmor = 24; - SetSkill(SkillName.Swords, 100.0, 110.0); - SetSkill(SkillName.Wrestling, 100.0, 110.0); - SetSkill(SkillName.Tactics, 100.0, 110.0); - SetSkill(SkillName.MagicResist, 100.0, 110.0); - SetSkill(SkillName.Healing, 100.0, 110.0); - SetSkill(SkillName.Anatomy, 100.0, 110.0); + SetSkill(SkillName.Swords, 100.0, 110.0); + SetSkill(SkillName.Wrestling, 100.0, 110.0); + SetSkill(SkillName.Tactics, 100.0, 110.0); + SetSkill(SkillName.MagicResist, 100.0, 110.0); + SetSkill(SkillName.Healing, 100.0, 110.0); + SetSkill(SkillName.Anatomy, 100.0, 110.0); - SetSkill(SkillName.Magery, 100.0, 110.0); - SetSkill(SkillName.EvalInt, 100.0, 110.0); - SetSkill(SkillName.Meditation, 100.0, 110.0); + SetSkill(SkillName.Magery, 100.0, 110.0); + SetSkill(SkillName.EvalInt, 100.0, 110.0); + SetSkill(SkillName.Meditation, 100.0, 110.0); - var shroud = new Item(0x204E); - shroud.Layer = Layer.OuterTorso; + var shroud = new Item(0x204E); + shroud.Layer = Layer.OuterTorso; - AddItem(Immovable(Rehued(shroud, 1109))); - AddItem(Newbied(Rehued(new ExecutionersAxe(), 2211))); + AddItem(Immovable(Rehued(shroud, 1109))); + AddItem(Newbied(Rehued(new ExecutionersAxe(), 2211))); - PackItem(new Bandage(Utility.RandomMinMax(30, 40))); - PackStrongPotions(6, 12); - } - - public FactionDeathKnight(Serial serial) : base(serial) - { - } - - public override GuardAI GuardAI => GuardAI.Melee | GuardAI.Curse | GuardAI.Bless; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } + PackItem(new Bandage(Utility.RandomMinMax(30, 40))); + PackStrongPotions(6, 12); } + + public override GuardAI GuardAI => GuardAI.Melee | GuardAI.Curse | GuardAI.Bless; } diff --git a/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionDragoon.cs b/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionDragoon.cs index f78faf3c7..5de127315 100644 --- a/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionDragoon.cs +++ b/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionDragoon.cs @@ -1,73 +1,56 @@ +using ModernUO.Serialization; using Server.Items; using Server.Mobiles; -namespace Server.Factions +namespace Server.Factions; + +[SerializationGenerator(0, false)] +public partial class FactionDragoon : BaseFactionGuard { - public class FactionDragoon : BaseFactionGuard + [Constructible] + public FactionDragoon() : base("the dragoon") { - [Constructible] - public FactionDragoon() : base("the dragoon") - { - GenerateBody(false, false); + GenerateBody(false, false); - SetStr(151, 175); - SetDex(61, 85); - SetInt(151, 175); + SetStr(151, 175); + SetDex(61, 85); + SetInt(151, 175); - SetResistance(ResistanceType.Physical, 40, 60); - SetResistance(ResistanceType.Fire, 40, 60); - SetResistance(ResistanceType.Cold, 40, 60); - SetResistance(ResistanceType.Energy, 40, 60); - SetResistance(ResistanceType.Poison, 40, 60); + SetResistance(ResistanceType.Physical, 40, 60); + SetResistance(ResistanceType.Fire, 40, 60); + SetResistance(ResistanceType.Cold, 40, 60); + SetResistance(ResistanceType.Energy, 40, 60); + SetResistance(ResistanceType.Poison, 40, 60); - VirtualArmor = 32; + VirtualArmor = 32; - SetSkill(SkillName.Macing, 110.0, 120.0); - SetSkill(SkillName.Wrestling, 110.0, 120.0); - SetSkill(SkillName.Tactics, 110.0, 120.0); - SetSkill(SkillName.MagicResist, 110.0, 120.0); - SetSkill(SkillName.Healing, 110.0, 120.0); - SetSkill(SkillName.Anatomy, 110.0, 120.0); + SetSkill(SkillName.Macing, 110.0, 120.0); + SetSkill(SkillName.Wrestling, 110.0, 120.0); + SetSkill(SkillName.Tactics, 110.0, 120.0); + SetSkill(SkillName.MagicResist, 110.0, 120.0); + SetSkill(SkillName.Healing, 110.0, 120.0); + SetSkill(SkillName.Anatomy, 110.0, 120.0); - SetSkill(SkillName.Magery, 110.0, 120.0); - SetSkill(SkillName.EvalInt, 110.0, 120.0); - SetSkill(SkillName.Meditation, 110.0, 120.0); + SetSkill(SkillName.Magery, 110.0, 120.0); + SetSkill(SkillName.EvalInt, 110.0, 120.0); + SetSkill(SkillName.Meditation, 110.0, 120.0); - AddItem(Immovable(Rehued(new Cloak(), 1645))); + AddItem(Immovable(Rehued(new Cloak(), 1645))); - AddItem(Immovable(Rehued(new PlateChest(), 1645))); - AddItem(Immovable(Rehued(new PlateLegs(), 1109))); - AddItem(Immovable(Rehued(new PlateArms(), 1109))); - AddItem(Immovable(Rehued(new PlateGloves(), 1109))); - AddItem(Immovable(Rehued(new PlateGorget(), 1109))); - AddItem(Immovable(Rehued(new PlateHelm(), 1109))); + AddItem(Immovable(Rehued(new PlateChest(), 1645))); + AddItem(Immovable(Rehued(new PlateLegs(), 1109))); + AddItem(Immovable(Rehued(new PlateArms(), 1109))); + AddItem(Immovable(Rehued(new PlateGloves(), 1109))); + AddItem(Immovable(Rehued(new PlateGorget(), 1109))); + AddItem(Immovable(Rehued(new PlateHelm(), 1109))); - AddItem(Newbied(new WarHammer())); + AddItem(Newbied(new WarHammer())); - AddItem(Immovable(Rehued(new VirtualMountItem(this), 1109))); + AddItem(Immovable(Rehued(new VirtualMountItem(this), 1109))); - PackItem(new Bandage(Utility.RandomMinMax(30, 40))); - PackStrongPotions(6, 12); - } - - public FactionDragoon(Serial serial) : base(serial) - { - } - - public override GuardAI GuardAI => GuardAI.Magic | GuardAI.Melee | GuardAI.Smart | GuardAI.Bless | GuardAI.Curse; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } + PackItem(new Bandage(Utility.RandomMinMax(30, 40))); + PackStrongPotions(6, 12); } + + public override GuardAI GuardAI => GuardAI.Magic | GuardAI.Melee | GuardAI.Smart | GuardAI.Bless | GuardAI.Curse; } diff --git a/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionHenchman.cs b/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionHenchman.cs index aecaf84af..9111b79b3 100644 --- a/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionHenchman.cs +++ b/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionHenchman.cs @@ -1,65 +1,48 @@ +using ModernUO.Serialization; using Server.Items; -namespace Server.Factions +namespace Server.Factions; + +[SerializationGenerator(0, false)] +public partial class FactionHenchman : BaseFactionGuard { - public class FactionHenchman : BaseFactionGuard + [Constructible] + public FactionHenchman() : base("the henchman") { - [Constructible] - public FactionHenchman() : base("the henchman") - { - GenerateBody(false, true); + GenerateBody(false, true); - SetStr(91, 115); - SetDex(61, 85); - SetInt(81, 95); + SetStr(91, 115); + SetDex(61, 85); + SetInt(81, 95); - SetDamage(10, 14); + SetDamage(10, 14); - SetResistance(ResistanceType.Physical, 10, 30); - SetResistance(ResistanceType.Fire, 10, 30); - SetResistance(ResistanceType.Cold, 10, 30); - SetResistance(ResistanceType.Energy, 10, 30); - SetResistance(ResistanceType.Poison, 10, 30); + SetResistance(ResistanceType.Physical, 10, 30); + SetResistance(ResistanceType.Fire, 10, 30); + SetResistance(ResistanceType.Cold, 10, 30); + SetResistance(ResistanceType.Energy, 10, 30); + SetResistance(ResistanceType.Poison, 10, 30); - VirtualArmor = 8; + VirtualArmor = 8; - SetSkill(SkillName.Fencing, 80.0, 90.0); - SetSkill(SkillName.Wrestling, 80.0, 90.0); - SetSkill(SkillName.Tactics, 80.0, 90.0); - SetSkill(SkillName.MagicResist, 80.0, 90.0); - SetSkill(SkillName.Healing, 80.0, 90.0); - SetSkill(SkillName.Anatomy, 80.0, 90.0); + SetSkill(SkillName.Fencing, 80.0, 90.0); + SetSkill(SkillName.Wrestling, 80.0, 90.0); + SetSkill(SkillName.Tactics, 80.0, 90.0); + SetSkill(SkillName.MagicResist, 80.0, 90.0); + SetSkill(SkillName.Healing, 80.0, 90.0); + SetSkill(SkillName.Anatomy, 80.0, 90.0); - AddItem(new StuddedChest()); - AddItem(new StuddedLegs()); - AddItem(new StuddedArms()); - AddItem(new StuddedGloves()); - AddItem(new StuddedGorget()); - AddItem(new Boots()); - AddItem(Newbied(new Spear())); + AddItem(new StuddedChest()); + AddItem(new StuddedLegs()); + AddItem(new StuddedArms()); + AddItem(new StuddedGloves()); + AddItem(new StuddedGorget()); + AddItem(new Boots()); + AddItem(Newbied(new Spear())); - PackItem(new Bandage(Utility.RandomMinMax(10, 20))); - PackWeakPotions(1, 4); - } - - public FactionHenchman(Serial serial) : base(serial) - { - } - - public override GuardAI GuardAI => GuardAI.Melee; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } + PackItem(new Bandage(Utility.RandomMinMax(10, 20))); + PackWeakPotions(1, 4); } + + public override GuardAI GuardAI => GuardAI.Melee; } diff --git a/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionKnight.cs b/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionKnight.cs index e193bcb3d..a8e48c1ce 100644 --- a/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionKnight.cs +++ b/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionKnight.cs @@ -1,73 +1,56 @@ +using ModernUO.Serialization; using Server.Items; -namespace Server.Factions +namespace Server.Factions; + +[SerializationGenerator(0, false)] +public partial class FactionKnight : BaseFactionGuard { - public class FactionKnight : BaseFactionGuard + [Constructible] + public FactionKnight() : base("the knight") { - [Constructible] - public FactionKnight() : base("the knight") - { - GenerateBody(false, false); + GenerateBody(false, false); - SetStr(126, 150); - SetDex(61, 85); - SetInt(81, 95); + SetStr(126, 150); + SetDex(61, 85); + SetInt(81, 95); - SetDamageType(ResistanceType.Physical, 100); + SetDamageType(ResistanceType.Physical, 100); - SetResistance(ResistanceType.Physical, 30, 50); - SetResistance(ResistanceType.Fire, 30, 50); - SetResistance(ResistanceType.Cold, 30, 50); - SetResistance(ResistanceType.Energy, 30, 50); - SetResistance(ResistanceType.Poison, 30, 50); + SetResistance(ResistanceType.Physical, 30, 50); + SetResistance(ResistanceType.Fire, 30, 50); + SetResistance(ResistanceType.Cold, 30, 50); + SetResistance(ResistanceType.Energy, 30, 50); + SetResistance(ResistanceType.Poison, 30, 50); - VirtualArmor = 24; + VirtualArmor = 24; - SetSkill(SkillName.Swords, 100.0, 110.0); - SetSkill(SkillName.Wrestling, 100.0, 110.0); - SetSkill(SkillName.Tactics, 100.0, 110.0); - SetSkill(SkillName.MagicResist, 100.0, 110.0); - SetSkill(SkillName.Healing, 100.0, 110.0); - SetSkill(SkillName.Anatomy, 100.0, 110.0); + SetSkill(SkillName.Swords, 100.0, 110.0); + SetSkill(SkillName.Wrestling, 100.0, 110.0); + SetSkill(SkillName.Tactics, 100.0, 110.0); + SetSkill(SkillName.MagicResist, 100.0, 110.0); + SetSkill(SkillName.Healing, 100.0, 110.0); + SetSkill(SkillName.Anatomy, 100.0, 110.0); - SetSkill(SkillName.Magery, 100.0, 110.0); - SetSkill(SkillName.EvalInt, 100.0, 110.0); - SetSkill(SkillName.Meditation, 100.0, 110.0); + SetSkill(SkillName.Magery, 100.0, 110.0); + SetSkill(SkillName.EvalInt, 100.0, 110.0); + SetSkill(SkillName.Meditation, 100.0, 110.0); - AddItem(Immovable(Rehued(new ChainChest(), 2125))); - AddItem(Immovable(Rehued(new ChainLegs(), 2125))); - AddItem(Immovable(Rehued(new ChainCoif(), 2125))); - AddItem(Immovable(Rehued(new PlateArms(), 2125))); - AddItem(Immovable(Rehued(new PlateGloves(), 2125))); + AddItem(Immovable(Rehued(new ChainChest(), 2125))); + AddItem(Immovable(Rehued(new ChainLegs(), 2125))); + AddItem(Immovable(Rehued(new ChainCoif(), 2125))); + AddItem(Immovable(Rehued(new PlateArms(), 2125))); + AddItem(Immovable(Rehued(new PlateGloves(), 2125))); - AddItem(Immovable(Rehued(new BodySash(), 1254))); - AddItem(Immovable(Rehued(new Kilt(), 1254))); - AddItem(Immovable(Rehued(new Sandals(), 1254))); + AddItem(Immovable(Rehued(new BodySash(), 1254))); + AddItem(Immovable(Rehued(new Kilt(), 1254))); + AddItem(Immovable(Rehued(new Sandals(), 1254))); - AddItem(Newbied(new Bardiche())); + AddItem(Newbied(new Bardiche())); - PackItem(new Bandage(Utility.RandomMinMax(30, 40))); - PackStrongPotions(6, 12); - } - - public FactionKnight(Serial serial) : base(serial) - { - } - - public override GuardAI GuardAI => GuardAI.Magic | GuardAI.Melee | GuardAI.Smart | GuardAI.Curse | GuardAI.Bless; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } + PackItem(new Bandage(Utility.RandomMinMax(30, 40))); + PackStrongPotions(6, 12); } + + public override GuardAI GuardAI => GuardAI.Magic | GuardAI.Melee | GuardAI.Smart | GuardAI.Curse | GuardAI.Bless; } diff --git a/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionMercenary.cs b/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionMercenary.cs index b48221677..a32e00091 100644 --- a/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionMercenary.cs +++ b/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionMercenary.cs @@ -1,63 +1,46 @@ +using ModernUO.Serialization; using Server.Items; -namespace Server.Factions +namespace Server.Factions; + +[SerializationGenerator(0, false)] +public partial class FactionMercenary : BaseFactionGuard { - public class FactionMercenary : BaseFactionGuard + [Constructible] + public FactionMercenary() : base("the mercenary") { - [Constructible] - public FactionMercenary() : base("the mercenary") - { - GenerateBody(false, true); + GenerateBody(false, true); - SetStr(116, 125); - SetDex(61, 85); - SetInt(81, 95); + SetStr(116, 125); + SetDex(61, 85); + SetInt(81, 95); - SetResistance(ResistanceType.Physical, 20, 40); - SetResistance(ResistanceType.Fire, 20, 40); - SetResistance(ResistanceType.Cold, 20, 40); - SetResistance(ResistanceType.Energy, 20, 40); - SetResistance(ResistanceType.Poison, 20, 40); + SetResistance(ResistanceType.Physical, 20, 40); + SetResistance(ResistanceType.Fire, 20, 40); + SetResistance(ResistanceType.Cold, 20, 40); + SetResistance(ResistanceType.Energy, 20, 40); + SetResistance(ResistanceType.Poison, 20, 40); - VirtualArmor = 16; + VirtualArmor = 16; - SetSkill(SkillName.Fencing, 90.0, 100.0); - SetSkill(SkillName.Wrestling, 90.0, 100.0); - SetSkill(SkillName.Tactics, 90.0, 100.0); - SetSkill(SkillName.MagicResist, 90.0, 100.0); - SetSkill(SkillName.Healing, 90.0, 100.0); - SetSkill(SkillName.Anatomy, 90.0, 100.0); + SetSkill(SkillName.Fencing, 90.0, 100.0); + SetSkill(SkillName.Wrestling, 90.0, 100.0); + SetSkill(SkillName.Tactics, 90.0, 100.0); + SetSkill(SkillName.MagicResist, 90.0, 100.0); + SetSkill(SkillName.Healing, 90.0, 100.0); + SetSkill(SkillName.Anatomy, 90.0, 100.0); - AddItem(new ChainChest()); - AddItem(new ChainLegs()); - AddItem(new RingmailArms()); - AddItem(new RingmailGloves()); - AddItem(new ChainCoif()); - AddItem(new Boots()); - AddItem(Newbied(new ShortSpear())); + AddItem(new ChainChest()); + AddItem(new ChainLegs()); + AddItem(new RingmailArms()); + AddItem(new RingmailGloves()); + AddItem(new ChainCoif()); + AddItem(new Boots()); + AddItem(Newbied(new ShortSpear())); - PackItem(new Bandage(Utility.RandomMinMax(20, 30))); - PackStrongPotions(3, 8); - } - - public FactionMercenary(Serial serial) : base(serial) - { - } - - public override GuardAI GuardAI => GuardAI.Melee | GuardAI.Smart; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } + PackItem(new Bandage(Utility.RandomMinMax(20, 30))); + PackStrongPotions(3, 8); } + + public override GuardAI GuardAI => GuardAI.Melee | GuardAI.Smart; } diff --git a/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionNecromancer.cs b/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionNecromancer.cs index 37d718e7e..204722fe7 100644 --- a/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionNecromancer.cs +++ b/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionNecromancer.cs @@ -1,66 +1,49 @@ +using ModernUO.Serialization; using Server.Items; -namespace Server.Factions +namespace Server.Factions; + +[SerializationGenerator(0, false)] +public partial class FactionNecromancer : BaseFactionGuard { - public class FactionNecromancer : BaseFactionGuard + [Constructible] + public FactionNecromancer() : base("the necromancer") { - [Constructible] - public FactionNecromancer() : base("the necromancer") - { - GenerateBody(false, false); - Hue = 1; + GenerateBody(false, false); + Hue = 1; - SetStr(151, 175); - SetDex(61, 85); - SetInt(151, 175); + SetStr(151, 175); + SetDex(61, 85); + SetInt(151, 175); - SetResistance(ResistanceType.Physical, 40, 60); - SetResistance(ResistanceType.Fire, 40, 60); - SetResistance(ResistanceType.Cold, 40, 60); - SetResistance(ResistanceType.Energy, 40, 60); - SetResistance(ResistanceType.Poison, 40, 60); + SetResistance(ResistanceType.Physical, 40, 60); + SetResistance(ResistanceType.Fire, 40, 60); + SetResistance(ResistanceType.Cold, 40, 60); + SetResistance(ResistanceType.Energy, 40, 60); + SetResistance(ResistanceType.Poison, 40, 60); - VirtualArmor = 32; + VirtualArmor = 32; - SetSkill(SkillName.Macing, 110.0, 120.0); - SetSkill(SkillName.Wrestling, 110.0, 120.0); - SetSkill(SkillName.Tactics, 110.0, 120.0); - SetSkill(SkillName.MagicResist, 110.0, 120.0); - SetSkill(SkillName.Healing, 110.0, 120.0); - SetSkill(SkillName.Anatomy, 110.0, 120.0); + SetSkill(SkillName.Macing, 110.0, 120.0); + SetSkill(SkillName.Wrestling, 110.0, 120.0); + SetSkill(SkillName.Tactics, 110.0, 120.0); + SetSkill(SkillName.MagicResist, 110.0, 120.0); + SetSkill(SkillName.Healing, 110.0, 120.0); + SetSkill(SkillName.Anatomy, 110.0, 120.0); - SetSkill(SkillName.Magery, 110.0, 120.0); - SetSkill(SkillName.EvalInt, 110.0, 120.0); - SetSkill(SkillName.Meditation, 110.0, 120.0); + SetSkill(SkillName.Magery, 110.0, 120.0); + SetSkill(SkillName.EvalInt, 110.0, 120.0); + SetSkill(SkillName.Meditation, 110.0, 120.0); - var shroud = new Item(0x204E); - shroud.Layer = Layer.OuterTorso; + var shroud = new Item(0x204E); + shroud.Layer = Layer.OuterTorso; - AddItem(Immovable(Rehued(shroud, 1109))); - AddItem(Newbied(Rehued(new GnarledStaff(), 2211))); + AddItem(Immovable(Rehued(shroud, 1109))); + AddItem(Newbied(Rehued(new GnarledStaff(), 2211))); - PackItem(new Bandage(Utility.RandomMinMax(30, 40))); - PackStrongPotions(6, 12); - } - - public FactionNecromancer(Serial serial) : base(serial) - { - } - - public override GuardAI GuardAI => GuardAI.Magic | GuardAI.Smart | GuardAI.Bless | GuardAI.Curse; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } + PackItem(new Bandage(Utility.RandomMinMax(30, 40))); + PackStrongPotions(6, 12); } + + public override GuardAI GuardAI => GuardAI.Magic | GuardAI.Smart | GuardAI.Bless | GuardAI.Curse; } diff --git a/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionPaladin.cs b/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionPaladin.cs index 9e0f96bc5..716895ea2 100644 --- a/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionPaladin.cs +++ b/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionPaladin.cs @@ -1,74 +1,57 @@ +using ModernUO.Serialization; using Server.Items; using Server.Mobiles; -namespace Server.Factions +namespace Server.Factions; + +[SerializationGenerator(0, false)] +public partial class FactionPaladin : BaseFactionGuard { - public class FactionPaladin : BaseFactionGuard + [Constructible] + public FactionPaladin() : base("the paladin") { - [Constructible] - public FactionPaladin() : base("the paladin") - { - GenerateBody(false, false); + GenerateBody(false, false); - SetStr(151, 175); - SetDex(61, 85); - SetInt(81, 95); + SetStr(151, 175); + SetDex(61, 85); + SetInt(81, 95); - SetResistance(ResistanceType.Physical, 40, 60); - SetResistance(ResistanceType.Fire, 40, 60); - SetResistance(ResistanceType.Cold, 40, 60); - SetResistance(ResistanceType.Energy, 40, 60); - SetResistance(ResistanceType.Poison, 40, 60); + SetResistance(ResistanceType.Physical, 40, 60); + SetResistance(ResistanceType.Fire, 40, 60); + SetResistance(ResistanceType.Cold, 40, 60); + SetResistance(ResistanceType.Energy, 40, 60); + SetResistance(ResistanceType.Poison, 40, 60); - VirtualArmor = 32; + VirtualArmor = 32; - SetSkill(SkillName.Swords, 110.0, 120.0); - SetSkill(SkillName.Wrestling, 110.0, 120.0); - SetSkill(SkillName.Tactics, 110.0, 120.0); - SetSkill(SkillName.MagicResist, 110.0, 120.0); - SetSkill(SkillName.Healing, 110.0, 120.0); - SetSkill(SkillName.Anatomy, 110.0, 120.0); + SetSkill(SkillName.Swords, 110.0, 120.0); + SetSkill(SkillName.Wrestling, 110.0, 120.0); + SetSkill(SkillName.Tactics, 110.0, 120.0); + SetSkill(SkillName.MagicResist, 110.0, 120.0); + SetSkill(SkillName.Healing, 110.0, 120.0); + SetSkill(SkillName.Anatomy, 110.0, 120.0); - SetSkill(SkillName.Magery, 110.0, 120.0); - SetSkill(SkillName.EvalInt, 110.0, 120.0); - SetSkill(SkillName.Meditation, 110.0, 120.0); + SetSkill(SkillName.Magery, 110.0, 120.0); + SetSkill(SkillName.EvalInt, 110.0, 120.0); + SetSkill(SkillName.Meditation, 110.0, 120.0); - AddItem(Immovable(Rehued(new PlateChest(), 2125))); - AddItem(Immovable(Rehued(new PlateLegs(), 2125))); - AddItem(Immovable(Rehued(new PlateHelm(), 2125))); - AddItem(Immovable(Rehued(new PlateGorget(), 2125))); - AddItem(Immovable(Rehued(new PlateArms(), 2125))); - AddItem(Immovable(Rehued(new PlateGloves(), 2125))); + AddItem(Immovable(Rehued(new PlateChest(), 2125))); + AddItem(Immovable(Rehued(new PlateLegs(), 2125))); + AddItem(Immovable(Rehued(new PlateHelm(), 2125))); + AddItem(Immovable(Rehued(new PlateGorget(), 2125))); + AddItem(Immovable(Rehued(new PlateArms(), 2125))); + AddItem(Immovable(Rehued(new PlateGloves(), 2125))); - AddItem(Immovable(Rehued(new BodySash(), 1254))); - AddItem(Immovable(Rehued(new Cloak(), 1254))); + AddItem(Immovable(Rehued(new BodySash(), 1254))); + AddItem(Immovable(Rehued(new Cloak(), 1254))); - AddItem(Newbied(new Halberd())); + AddItem(Newbied(new Halberd())); - AddItem(Immovable(Rehued(new VirtualMountItem(this), 1254))); + AddItem(Immovable(Rehued(new VirtualMountItem(this), 1254))); - PackItem(new Bandage(Utility.RandomMinMax(30, 40))); - PackStrongPotions(6, 12); - } - - public FactionPaladin(Serial serial) : base(serial) - { - } - - public override GuardAI GuardAI => GuardAI.Magic | GuardAI.Melee | GuardAI.Smart | GuardAI.Curse | GuardAI.Bless; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } + PackItem(new Bandage(Utility.RandomMinMax(30, 40))); + PackStrongPotions(6, 12); } + + public override GuardAI GuardAI => GuardAI.Magic | GuardAI.Melee | GuardAI.Smart | GuardAI.Curse | GuardAI.Bless; } diff --git a/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionSorceress.cs b/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionSorceress.cs index ae80882a4..d78dd549c 100644 --- a/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionSorceress.cs +++ b/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionSorceress.cs @@ -1,70 +1,53 @@ +using ModernUO.Serialization; using Server.Items; -namespace Server.Factions +namespace Server.Factions; + +[SerializationGenerator(0, false)] +public partial class FactionSorceress : BaseFactionGuard { - public class FactionSorceress : BaseFactionGuard + [Constructible] + public FactionSorceress() : base("the sorceress") { - [Constructible] - public FactionSorceress() : base("the sorceress") - { - GenerateBody(true, false); + GenerateBody(true, false); - SetStr(126, 150); - SetDex(61, 85); - SetInt(126, 150); + SetStr(126, 150); + SetDex(61, 85); + SetInt(126, 150); - SetDamageType(ResistanceType.Physical, 100); + SetDamageType(ResistanceType.Physical, 100); - SetResistance(ResistanceType.Physical, 30, 50); - SetResistance(ResistanceType.Fire, 30, 50); - SetResistance(ResistanceType.Cold, 30, 50); - SetResistance(ResistanceType.Energy, 30, 50); - SetResistance(ResistanceType.Poison, 30, 50); + SetResistance(ResistanceType.Physical, 30, 50); + SetResistance(ResistanceType.Fire, 30, 50); + SetResistance(ResistanceType.Cold, 30, 50); + SetResistance(ResistanceType.Energy, 30, 50); + SetResistance(ResistanceType.Poison, 30, 50); - VirtualArmor = 24; + VirtualArmor = 24; - SetSkill(SkillName.Macing, 100.0, 110.0); - SetSkill(SkillName.Wrestling, 100.0, 110.0); - SetSkill(SkillName.Tactics, 100.0, 110.0); - SetSkill(SkillName.MagicResist, 100.0, 110.0); - SetSkill(SkillName.Healing, 100.0, 110.0); - SetSkill(SkillName.Anatomy, 100.0, 110.0); + SetSkill(SkillName.Macing, 100.0, 110.0); + SetSkill(SkillName.Wrestling, 100.0, 110.0); + SetSkill(SkillName.Tactics, 100.0, 110.0); + SetSkill(SkillName.MagicResist, 100.0, 110.0); + SetSkill(SkillName.Healing, 100.0, 110.0); + SetSkill(SkillName.Anatomy, 100.0, 110.0); - SetSkill(SkillName.Magery, 100.0, 110.0); - SetSkill(SkillName.EvalInt, 100.0, 110.0); - SetSkill(SkillName.Meditation, 100.0, 110.0); + SetSkill(SkillName.Magery, 100.0, 110.0); + SetSkill(SkillName.EvalInt, 100.0, 110.0); + SetSkill(SkillName.Meditation, 100.0, 110.0); - AddItem(Immovable(Rehued(new WizardsHat(), 1325))); - AddItem(Immovable(Rehued(new Sandals(), 1325))); - AddItem(Immovable(Rehued(new LeatherGorget(), 1325))); - AddItem(Immovable(Rehued(new LeatherGloves(), 1325))); - AddItem(Immovable(Rehued(new LeatherLegs(), 1325))); - AddItem(Immovable(Rehued(new Skirt(), 1325))); - AddItem(Immovable(Rehued(new FemaleLeatherChest(), 1325))); - AddItem(Newbied(Rehued(new QuarterStaff(), 1310))); + AddItem(Immovable(Rehued(new WizardsHat(), 1325))); + AddItem(Immovable(Rehued(new Sandals(), 1325))); + AddItem(Immovable(Rehued(new LeatherGorget(), 1325))); + AddItem(Immovable(Rehued(new LeatherGloves(), 1325))); + AddItem(Immovable(Rehued(new LeatherLegs(), 1325))); + AddItem(Immovable(Rehued(new Skirt(), 1325))); + AddItem(Immovable(Rehued(new FemaleLeatherChest(), 1325))); + AddItem(Newbied(Rehued(new QuarterStaff(), 1310))); - PackItem(new Bandage(Utility.RandomMinMax(30, 40))); - PackStrongPotions(6, 12); - } - - public FactionSorceress(Serial serial) : base(serial) - { - } - - public override GuardAI GuardAI => GuardAI.Magic | GuardAI.Bless | GuardAI.Curse; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } + PackItem(new Bandage(Utility.RandomMinMax(30, 40))); + PackStrongPotions(6, 12); } + + public override GuardAI GuardAI => GuardAI.Magic | GuardAI.Bless | GuardAI.Curse; } diff --git a/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionWizard.cs b/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionWizard.cs index 21231dcca..49dc398f5 100644 --- a/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionWizard.cs +++ b/Projects/UOContent/Engines/Factions/Mobiles/Guards/Types/FactionWizard.cs @@ -1,67 +1,50 @@ +using ModernUO.Serialization; using Server.Items; -namespace Server.Factions +namespace Server.Factions; + +[SerializationGenerator(0, false)] +public partial class FactionWizard : BaseFactionGuard { - public class FactionWizard : BaseFactionGuard + [Constructible] + public FactionWizard() : base("the wizard") { - [Constructible] - public FactionWizard() : base("the wizard") - { - GenerateBody(false, false); + GenerateBody(false, false); - SetStr(151, 175); - SetDex(61, 85); - SetInt(151, 175); + SetStr(151, 175); + SetDex(61, 85); + SetInt(151, 175); - SetDamageType(ResistanceType.Physical, 100); + SetDamageType(ResistanceType.Physical, 100); - SetResistance(ResistanceType.Physical, 40, 60); - SetResistance(ResistanceType.Fire, 40, 60); - SetResistance(ResistanceType.Cold, 40, 60); - SetResistance(ResistanceType.Energy, 40, 60); - SetResistance(ResistanceType.Poison, 40, 60); + SetResistance(ResistanceType.Physical, 40, 60); + SetResistance(ResistanceType.Fire, 40, 60); + SetResistance(ResistanceType.Cold, 40, 60); + SetResistance(ResistanceType.Energy, 40, 60); + SetResistance(ResistanceType.Poison, 40, 60); - VirtualArmor = 32; + VirtualArmor = 32; - SetSkill(SkillName.Macing, 110.0, 120.0); - SetSkill(SkillName.Wrestling, 110.0, 120.0); - SetSkill(SkillName.Tactics, 110.0, 120.0); - SetSkill(SkillName.MagicResist, 110.0, 120.0); - SetSkill(SkillName.Healing, 110.0, 120.0); - SetSkill(SkillName.Anatomy, 110.0, 120.0); + SetSkill(SkillName.Macing, 110.0, 120.0); + SetSkill(SkillName.Wrestling, 110.0, 120.0); + SetSkill(SkillName.Tactics, 110.0, 120.0); + SetSkill(SkillName.MagicResist, 110.0, 120.0); + SetSkill(SkillName.Healing, 110.0, 120.0); + SetSkill(SkillName.Anatomy, 110.0, 120.0); - SetSkill(SkillName.Magery, 110.0, 120.0); - SetSkill(SkillName.EvalInt, 110.0, 120.0); - SetSkill(SkillName.Meditation, 110.0, 120.0); + SetSkill(SkillName.Magery, 110.0, 120.0); + SetSkill(SkillName.EvalInt, 110.0, 120.0); + SetSkill(SkillName.Meditation, 110.0, 120.0); - AddItem(Immovable(Rehued(new WizardsHat(), 1325))); - AddItem(Immovable(Rehued(new Sandals(), 1325))); - AddItem(Immovable(Rehued(new Robe(), 1310))); - AddItem(Immovable(Rehued(new LeatherGloves(), 1325))); - AddItem(Newbied(Rehued(new GnarledStaff(), 1310))); + AddItem(Immovable(Rehued(new WizardsHat(), 1325))); + AddItem(Immovable(Rehued(new Sandals(), 1325))); + AddItem(Immovable(Rehued(new Robe(), 1310))); + AddItem(Immovable(Rehued(new LeatherGloves(), 1325))); + AddItem(Newbied(Rehued(new GnarledStaff(), 1310))); - PackItem(new Bandage(Utility.RandomMinMax(30, 40))); - PackStrongPotions(6, 12); - } - - public FactionWizard(Serial serial) : base(serial) - { - } - - public override GuardAI GuardAI => GuardAI.Magic | GuardAI.Smart | GuardAI.Bless | GuardAI.Curse; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } + PackItem(new Bandage(Utility.RandomMinMax(30, 40))); + PackStrongPotions(6, 12); } + + public override GuardAI GuardAI => GuardAI.Magic | GuardAI.Smart | GuardAI.Bless | GuardAI.Curse; } diff --git a/Projects/UOContent/Engines/Factions/Mobiles/Vendors/FactionBoardVendor.cs b/Projects/UOContent/Engines/Factions/Mobiles/Vendors/FactionBoardVendor.cs index 8a86fca55..722ac8b4a 100644 --- a/Projects/UOContent/Engines/Factions/Mobiles/Vendors/FactionBoardVendor.cs +++ b/Projects/UOContent/Engines/Factions/Mobiles/Vendors/FactionBoardVendor.cs @@ -1,68 +1,49 @@ using System.Collections.Generic; +using ModernUO.Serialization; using Server.Items; using Server.Mobiles; -namespace Server.Factions +namespace Server.Factions; + +[SerializationGenerator(0, false)] +public partial class FactionBoardVendor : BaseFactionVendor { - public class FactionBoardVendor : BaseFactionVendor + public FactionBoardVendor(Town town, Faction faction) : + base(town, faction, "the LumberMan") // NOTE: title inconsistent, as OSI { - public FactionBoardVendor(Town town, Faction faction) : - base(town, faction, "the LumberMan") // NOTE: title inconsistant, as OSI - { - SetSkill(SkillName.Carpentry, 85.0, 100.0); - SetSkill(SkillName.Lumberjacking, 60.0, 83.0); - } - - public FactionBoardVendor(Serial serial) : base(serial) - { - } - - public override void InitSBInfo() - { - SBInfos.Add(new SBFactionBoard()); - } - - public override void InitOutfit() - { - base.InitOutfit(); - - AddItem(new HalfApron()); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } + SetSkill(SkillName.Carpentry, 85.0, 100.0); + SetSkill(SkillName.Lumberjacking, 60.0, 83.0); } - public class SBFactionBoard : SBInfo + public override void InitSBInfo() { - public override IShopSellInfo SellInfo { get; } = new InternalSellInfo(); + SBInfos.Add(new SBFactionBoard()); + } - public override List BuyInfo { get; } = new InternalBuyInfo(); + public override void InitOutfit() + { + base.InitOutfit(); - public class InternalBuyInfo : List - { - public InternalBuyInfo() - { - for (var i = 0; i < 5; ++i) - { - Add(new GenericBuyInfo(typeof(Board), 3, 20, 0x1BD7, 0)); - } - } - } - - public class InternalSellInfo : GenericSellInfo - { - } + AddItem(new HalfApron()); } } + +public class SBFactionBoard : SBInfo +{ + public override IShopSellInfo SellInfo { get; } = new InternalSellInfo(); + + public override List BuyInfo { get; } = new InternalBuyInfo(); + + public class InternalBuyInfo : List + { + public InternalBuyInfo() + { + for (var i = 0; i < 5; ++i) + { + Add(new GenericBuyInfo(typeof(Board), 3, 20, 0x1BD7, 0)); + } + } + } + + public class InternalSellInfo : GenericSellInfo; +} diff --git a/Projects/UOContent/Engines/Factions/Mobiles/Vendors/FactionBottleVendor.cs b/Projects/UOContent/Engines/Factions/Mobiles/Vendors/FactionBottleVendor.cs index df7944311..1ade8cc0e 100644 --- a/Projects/UOContent/Engines/Factions/Mobiles/Vendors/FactionBottleVendor.cs +++ b/Projects/UOContent/Engines/Factions/Mobiles/Vendors/FactionBottleVendor.cs @@ -1,69 +1,50 @@ using System.Collections.Generic; +using ModernUO.Serialization; using Server.Items; using Server.Mobiles; -namespace Server.Factions +namespace Server.Factions; + +[SerializationGenerator(0, false)] +public partial class FactionBottleVendor : BaseFactionVendor { - public class FactionBottleVendor : BaseFactionVendor + public FactionBottleVendor(Town town, Faction faction) : base(town, faction, "the Bottle Seller") { - public FactionBottleVendor(Town town, Faction faction) : base(town, faction, "the Bottle Seller") - { - SetSkill(SkillName.Alchemy, 85.0, 100.0); - SetSkill(SkillName.TasteID, 65.0, 88.0); - } - - public FactionBottleVendor(Serial serial) : base(serial) - { - } - - public override VendorShoeType ShoeType => Utility.RandomBool() ? VendorShoeType.Shoes : VendorShoeType.Sandals; - - public override void InitSBInfo() - { - SBInfos.Add(new SBFactionBottle()); - } - - public override void InitOutfit() - { - base.InitOutfit(); - - AddItem(new Robe(Utility.RandomPinkHue())); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } + SetSkill(SkillName.Alchemy, 85.0, 100.0); + SetSkill(SkillName.TasteID, 65.0, 88.0); } - public class SBFactionBottle : SBInfo + public override VendorShoeType ShoeType => Utility.RandomBool() ? VendorShoeType.Shoes : VendorShoeType.Sandals; + + public override void InitSBInfo() { - public override IShopSellInfo SellInfo { get; } = new InternalSellInfo(); + SBInfos.Add(new SBFactionBottle()); + } - public override List BuyInfo { get; } = new InternalBuyInfo(); + public override void InitOutfit() + { + base.InitOutfit(); - public class InternalBuyInfo : List - { - public InternalBuyInfo() - { - for (var i = 0; i < 5; ++i) - { - Add(new GenericBuyInfo(typeof(Bottle), 5, 20, 0xF0E, 0)); - } - } - } - - public class InternalSellInfo : GenericSellInfo - { - } + AddItem(new Robe(Utility.RandomPinkHue())); } } + +public class SBFactionBottle : SBInfo +{ + public override IShopSellInfo SellInfo { get; } = new InternalSellInfo(); + + public override List BuyInfo { get; } = new InternalBuyInfo(); + + public class InternalBuyInfo : List + { + public InternalBuyInfo() + { + for (var i = 0; i < 5; ++i) + { + Add(new GenericBuyInfo(typeof(Bottle), 5, 20, 0xF0E, 0)); + } + } + } + + public class InternalSellInfo : GenericSellInfo; +} diff --git a/Projects/UOContent/Engines/Factions/Mobiles/Vendors/FactionHorseVendor.cs b/Projects/UOContent/Engines/Factions/Mobiles/Vendors/FactionHorseVendor.cs index d028da169..3bacb042c 100644 --- a/Projects/UOContent/Engines/Factions/Mobiles/Vendors/FactionHorseVendor.cs +++ b/Projects/UOContent/Engines/Factions/Mobiles/Vendors/FactionHorseVendor.cs @@ -1,78 +1,61 @@ using System.Collections.Generic; +using ModernUO.Serialization; using Server.Items; using Server.Mobiles; -namespace Server.Factions +namespace Server.Factions; + +[SerializationGenerator(0, false)] +public partial class FactionHorseVendor : BaseFactionVendor { - public class FactionHorseVendor : BaseFactionVendor + public FactionHorseVendor(Town town, Faction faction) : base(town, faction, "the Horse Breeder") { - public FactionHorseVendor(Town town, Faction faction) : base(town, faction, "the Horse Breeder") + SetSkill(SkillName.AnimalLore, 64.0, 100.0); + SetSkill(SkillName.AnimalTaming, 90.0, 100.0); + SetSkill(SkillName.Veterinary, 65.0, 88.0); + } + + public override VendorShoeType ShoeType => Female ? VendorShoeType.ThighBoots : VendorShoeType.Boots; + + public override void InitSBInfo() + { + } + + public override int GetShoeHue() => 0; + + public override void InitOutfit() + { + base.InitOutfit(); + + AddItem(Utility.RandomBool() ? new QuarterStaff() : new ShepherdsCrook()); + } + + public override void VendorBuy(Mobile from) + { + if (Faction == null || Faction.Find(from, true) != Faction) { - SetSkill(SkillName.AnimalLore, 64.0, 100.0); - SetSkill(SkillName.AnimalTaming, 90.0, 100.0); - SetSkill(SkillName.Veterinary, 65.0, 88.0); + PrivateOverheadMessage( + MessageType.Regular, + 0x3B2, + 1042201, // You are not in my faction, I cannot sell you a horse! + from.NetState + ); } - - public FactionHorseVendor(Serial serial) : base(serial) + else if (FactionGump.Exists(from)) { + from.SendLocalizedMessage(1042160); // You already have a faction menu open. } - - public override VendorShoeType ShoeType => Female ? VendorShoeType.ThighBoots : VendorShoeType.Boots; - - public override void InitSBInfo() + else if (from is PlayerMobile mobile) { - } - - public override int GetShoeHue() => 0; - - public override void InitOutfit() - { - base.InitOutfit(); - - AddItem(Utility.RandomBool() ? new QuarterStaff() : new ShepherdsCrook()); - } - - public override void VendorBuy(Mobile from) - { - if (Faction == null || Faction.Find(from, true) != Faction) - { - PrivateOverheadMessage( - MessageType.Regular, - 0x3B2, - 1042201, // You are not in my faction, I cannot sell you a horse! - from.NetState - ); - } - else if (FactionGump.Exists(from)) - { - from.SendLocalizedMessage(1042160); // You already have a faction menu open. - } - else if (from is PlayerMobile mobile) - { - mobile.SendGump(new HorseBreederGump(mobile, Faction)); - } - } - - public override void VendorSell(Mobile from) - { - } - - public override bool OnBuyItems(Mobile buyer, List list) => false; - - public override bool OnSellItems(Mobile seller, List list) => false; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); + mobile.SendGump(new HorseBreederGump(mobile, Faction)); } } + + public override void VendorSell(Mobile from) + { + } + + public override bool OnBuyItems(Mobile buyer, List list) => false; + + public override bool OnSellItems(Mobile seller, List list) => false; } diff --git a/Projects/UOContent/Engines/Factions/Mobiles/Vendors/FactionOreVendor.cs b/Projects/UOContent/Engines/Factions/Mobiles/Vendors/FactionOreVendor.cs index 8f87055b0..e03da935b 100644 --- a/Projects/UOContent/Engines/Factions/Mobiles/Vendors/FactionOreVendor.cs +++ b/Projects/UOContent/Engines/Factions/Mobiles/Vendors/FactionOreVendor.cs @@ -1,70 +1,51 @@ using System.Collections.Generic; +using ModernUO.Serialization; using Server.Items; using Server.Mobiles; -namespace Server.Factions +namespace Server.Factions; + +[SerializationGenerator(0, false)] +public partial class FactionOreVendor : BaseFactionVendor { - public class FactionOreVendor : BaseFactionVendor + public FactionOreVendor(Town town, Faction faction) : base(town, faction, "the Ore Man") { - public FactionOreVendor(Town town, Faction faction) : base(town, faction, "the Ore Man") - { - // NOTE: Skills verified - SetSkill(SkillName.Carpentry, 85.0, 100.0); - SetSkill(SkillName.Lumberjacking, 60.0, 83.0); - } - - public FactionOreVendor(Serial serial) : base(serial) - { - } - - public override void InitSBInfo() - { - SBInfos.Add(new SBFactionOre()); - } - - public override void InitOutfit() - { - base.InitOutfit(); - - AddItem(new HalfApron()); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } + // NOTE: Skills verified + SetSkill(SkillName.Carpentry, 85.0, 100.0); + SetSkill(SkillName.Lumberjacking, 60.0, 83.0); } - public class SBFactionOre : SBInfo + public override void InitSBInfo() { - private static readonly object[] m_FixedSizeArgs = { true }; + SBInfos.Add(new SBFactionOre()); + } - public override IShopSellInfo SellInfo { get; } = new InternalSellInfo(); + public override void InitOutfit() + { + base.InitOutfit(); - public override List BuyInfo { get; } = new InternalBuyInfo(); - - public class InternalBuyInfo : List - { - public InternalBuyInfo() - { - for (var i = 0; i < 5; ++i) - { - Add(new GenericBuyInfo(typeof(IronOre), 16, 20, 0x19B8, 0, m_FixedSizeArgs)); - } - } - } - - public class InternalSellInfo : GenericSellInfo - { - } + AddItem(new HalfApron()); } } + +public class SBFactionOre : SBInfo +{ + private static readonly object[] m_FixedSizeArgs = { true }; + + public override IShopSellInfo SellInfo { get; } = new InternalSellInfo(); + + public override List BuyInfo { get; } = new InternalBuyInfo(); + + public class InternalBuyInfo : List + { + public InternalBuyInfo() + { + for (var i = 0; i < 5; ++i) + { + Add(new GenericBuyInfo(typeof(IronOre), 16, 20, 0x19B8, 0, m_FixedSizeArgs)); + } + } + } + + public class InternalSellInfo : GenericSellInfo; +} diff --git a/Projects/UOContent/Engines/Factions/Mobiles/Vendors/FactionReagentVendor.cs b/Projects/UOContent/Engines/Factions/Mobiles/Vendors/FactionReagentVendor.cs index d593be05a..3b1a867d0 100644 --- a/Projects/UOContent/Engines/Factions/Mobiles/Vendors/FactionReagentVendor.cs +++ b/Projects/UOContent/Engines/Factions/Mobiles/Vendors/FactionReagentVendor.cs @@ -1,81 +1,62 @@ using System.Collections.Generic; +using ModernUO.Serialization; using Server.Items; using Server.Mobiles; -namespace Server.Factions +namespace Server.Factions; + +[SerializationGenerator(0, false)] +public partial class FactionReagentVendor : BaseFactionVendor { - public class FactionReagentVendor : BaseFactionVendor + public FactionReagentVendor(Town town, Faction faction) : base(town, faction, "the Reagent Man") { - public FactionReagentVendor(Town town, Faction faction) : base(town, faction, "the Reagent Man") - { - SetSkill(SkillName.EvalInt, 65.0, 88.0); - SetSkill(SkillName.Inscribe, 60.0, 83.0); - SetSkill(SkillName.Magery, 64.0, 100.0); - SetSkill(SkillName.Meditation, 60.0, 83.0); - SetSkill(SkillName.MagicResist, 65.0, 88.0); - SetSkill(SkillName.Wrestling, 36.0, 68.0); - } - - public FactionReagentVendor(Serial serial) : base(serial) - { - } - - public override VendorShoeType ShoeType => Utility.RandomBool() ? VendorShoeType.Shoes : VendorShoeType.Sandals; - - public override void InitSBInfo() - { - SBInfos.Add(new SBFactionReagent()); - } - - public override void InitOutfit() - { - base.InitOutfit(); - - AddItem(new Robe(Utility.RandomBlueHue())); - AddItem(new GnarledStaff()); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } + SetSkill(SkillName.EvalInt, 65.0, 88.0); + SetSkill(SkillName.Inscribe, 60.0, 83.0); + SetSkill(SkillName.Magery, 64.0, 100.0); + SetSkill(SkillName.Meditation, 60.0, 83.0); + SetSkill(SkillName.MagicResist, 65.0, 88.0); + SetSkill(SkillName.Wrestling, 36.0, 68.0); } - public class SBFactionReagent : SBInfo + public override VendorShoeType ShoeType => Utility.RandomBool() ? VendorShoeType.Shoes : VendorShoeType.Sandals; + + public override void InitSBInfo() { - public override IShopSellInfo SellInfo { get; } = new InternalSellInfo(); + SBInfos.Add(new SBFactionReagent()); + } - public override List BuyInfo { get; } = new InternalBuyInfo(); + public override void InitOutfit() + { + base.InitOutfit(); - public class InternalBuyInfo : List - { - public InternalBuyInfo() - { - for (var i = 0; i < 2; ++i) - { - Add(new GenericBuyInfo(typeof(BlackPearl), 5, 20, 0xF7A, 0)); - Add(new GenericBuyInfo(typeof(Bloodmoss), 5, 20, 0xF7B, 0)); - Add(new GenericBuyInfo(typeof(MandrakeRoot), 3, 20, 0xF86, 0)); - Add(new GenericBuyInfo(typeof(Garlic), 3, 20, 0xF84, 0)); - Add(new GenericBuyInfo(typeof(Ginseng), 3, 20, 0xF85, 0)); - Add(new GenericBuyInfo(typeof(Nightshade), 3, 20, 0xF88, 0)); - Add(new GenericBuyInfo(typeof(SpidersSilk), 3, 20, 0xF8D, 0)); - Add(new GenericBuyInfo(typeof(SulfurousAsh), 3, 20, 0xF8C, 0)); - } - } - } - - public class InternalSellInfo : GenericSellInfo - { - } + AddItem(new Robe(Utility.RandomBlueHue())); + AddItem(new GnarledStaff()); } } + +public class SBFactionReagent : SBInfo +{ + public override IShopSellInfo SellInfo { get; } = new InternalSellInfo(); + + public override List BuyInfo { get; } = new InternalBuyInfo(); + + public class InternalBuyInfo : List + { + public InternalBuyInfo() + { + for (var i = 0; i < 2; ++i) + { + Add(new GenericBuyInfo(typeof(BlackPearl), 5, 20, 0xF7A, 0)); + Add(new GenericBuyInfo(typeof(Bloodmoss), 5, 20, 0xF7B, 0)); + Add(new GenericBuyInfo(typeof(MandrakeRoot), 3, 20, 0xF86, 0)); + Add(new GenericBuyInfo(typeof(Garlic), 3, 20, 0xF84, 0)); + Add(new GenericBuyInfo(typeof(Ginseng), 3, 20, 0xF85, 0)); + Add(new GenericBuyInfo(typeof(Nightshade), 3, 20, 0xF88, 0)); + Add(new GenericBuyInfo(typeof(SpidersSilk), 3, 20, 0xF8D, 0)); + Add(new GenericBuyInfo(typeof(SulfurousAsh), 3, 20, 0xF8C, 0)); + } + } + } + + public class InternalSellInfo : GenericSellInfo; +} diff --git a/Projects/UOContent/Engines/ML Quests/Definitions/AGhostOfCovetous.cs b/Projects/UOContent/Engines/ML Quests/Definitions/AGhostOfCovetous.cs index d8e567687..7b64c7f3b 100644 --- a/Projects/UOContent/Engines/ML Quests/Definitions/AGhostOfCovetous.cs +++ b/Projects/UOContent/Engines/ML Quests/Definitions/AGhostOfCovetous.cs @@ -1,268 +1,196 @@ using System; +using ModernUO.Serialization; using Server.Engines.MLQuests.Objectives; using Server.Engines.MLQuests.Rewards; using Server.Items; using Server.Mobiles; -namespace Server.Engines.MLQuests.Definitions +namespace Server.Engines.MLQuests.Definitions; + +public class AGhostOfCovetous : MLQuest { - public class AGhostOfCovetous : MLQuest + public AGhostOfCovetous() { - public AGhostOfCovetous() - { - Activated = true; - Title = 1075287; // A Ghost of Covetous - // What? Oh, you startled me! Sorry, I'm a little jumpy. - // My master Griswolt learned that a ghost has recently taken up residence in the Covetous dungeon. - // He sent me to capture it, but I . . . well, it terrified me, to be perfectly honest. - // If you think yourself courageous enough, I'll give you my Spirit Bottle, and you can try to capture it yourself. - // I'm certain my master would reward you richly for such service. - Description = 1075286; - // That's okay, I'm sure someone with more courage than either of us will come along eventually. - RefusalMessage = 1075288; - InProgressMessage = 1075290; // You'll find that ghost in the mountain pass above the Covetous dungeon. - // (As you try to use the Spirit Bottle, the ghost snatches it out of your hand and smashes it on the rocks) - // Please, don't be frightened. I need your help! - CompletionMessage = 1075291; - CompletionNotice = CompletionNoticeShort; + Activated = true; + Title = 1075287; // A Ghost of Covetous + // What? Oh, you startled me! Sorry, I'm a little jumpy. + // My master Griswolt learned that a ghost has recently taken up residence in the Covetous dungeon. + // He sent me to capture it, but I . . . well, it terrified me, to be perfectly honest. + // If you think yourself courageous enough, I'll give you my Spirit Bottle, and you can try to capture it yourself. + // I'm certain my master would reward you richly for such service. + Description = 1075286; + // That's okay, I'm sure someone with more courage than either of us will come along eventually. + RefusalMessage = 1075288; + InProgressMessage = 1075290; // You'll find that ghost in the mountain pass above the Covetous dungeon. + // (As you try to use the Spirit Bottle, the ghost snatches it out of your hand and smashes it on the rocks) + // Please, don't be frightened. I need your help! + CompletionMessage = 1075291; + CompletionNotice = CompletionNoticeShort; - Objectives.Add(new DeliverObjective(typeof(SpiritBottle), 1, "Spirit Bottle", typeof(Frederic))); + Objectives.Add(new DeliverObjective(typeof(SpiritBottle), 1, "Spirit Bottle", typeof(Frederic))); - // Return the filled Spirit Bottle to Griswolt the Master Necromancer to receive a reward. - Rewards.Add(new DummyReward(1075284)); - } - - public override Type NextQuest => typeof(SaveHisDad); + // Return the filled Spirit Bottle to Griswolt the Master Necromancer to receive a reward. + Rewards.Add(new DummyReward(1075284)); } - public class SaveHisDad : MLQuest - { - public SaveHisDad() - { - Activated = true; - Title = 1075337; // Save His Dad - Description = - 1075338; // My father, Andros, is a smith in Minoc. Last week his forge overturned and he was splashed by molten steel. He was horribly burned, and we feared he would die. An alchemist in Vesper promised to make a bandage that could heal him, but he needed the silk of a dread spider. I came here to get some, but I was careless, and succumbed to their poison. Please, won't you help my father? - RefusalMessage = 1075340; // Oh . . . that's your decision . . . OooOoooOOoo . . . - InProgressMessage = - 1075341; // Thank you! Deliver it to Leon the Alchemist in Vesper. The silk crumbles easily, and much time has already passed since I died. Please! Hurry! - CompletionMessage = - 1075342; // How may I help thee? You have the silk of a dread spider? Of course I can make you a bandage, but what happened to Frederic? - CompletionNotice = CompletionNoticeShort; - - Objectives.Add( - new TimedDeliverObjective( - TimeSpan.FromSeconds(600), - typeof(DreadSpiderSilk), - 1, - "Dread Spider Silk", - typeof(Leon) - ) - ); - - // Hurry! You must get the silk to Leon the Alchemist quickly, or it will crumble and become useless! - Rewards.Add(new DummyReward(1075339)); - } - - public override Type NextQuest => typeof(AFathersGratitude); - public override bool IsChainTriggered => true; - } - - public class AFathersGratitude : MLQuest - { - public AFathersGratitude() - { - Activated = true; - OneTimeOnly = true; - Title = 1075343; // A Father's Gratitude - Description = - 1075344; // That is simply terrible. First Andros, and now his son. Well, let's make sure Frederic's sacrifice wasn't in vain. Will you take the bandages to his father? You can probably deliver them faster than I can, can't you? - RefusalMessage = - 1075346; // Well I'm sorry to hear you say that. Without your help, I don't know if I can get these to Andros quickly enough to help him. - InProgressMessage = - 1075347; // I don't know how much longer Andros will survive. You'd better get this to him as quick as you can. Every second counts! - CompletionMessage = - 1075348; // Sorry, I'm not accepting commissions at the moment. What? You have the bandage I need from Leon? Thank you so much! But why didn't my son bring this to me himself? . . . Oh, no! You can't be serious! *sag* My Freddie, my son! Thank you for carrying out his last wish. Here -- I made this for my son, to give to him when he became a journeyman. I want you to have it. - CompletionNotice = CompletionNoticeShort; - - Objectives.Add(new DeliverObjective(typeof(AlchemistsBandage), 1, "Alchemist's Bandage", typeof(Andros))); - - Rewards.Add(new ItemReward(1075345, typeof(AndrosGratitude))); // Andros' Gratitude - } - - public override bool IsChainTriggered => true; - } - - public class Ben : BaseCreature - { - [Constructible] - public Ben() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Apprentice Necromancer"; - Body = 0x190; - Hue = 0x83FD; - HairItemID = 0x2048; - HairHue = 0x463; - FacialHairItemID = 0x204C; - FacialHairHue = 0x463; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - AddItem(new Backpack()); - AddItem(new Shoes(0x901)); - AddItem(new LongPants(0x1BB)); - AddItem(new FancyShirt(0x756)); - } - - public Ben(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Ben"; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - [QuesterName("The Ghost of Frederic Smithson")] - public class Frederic : BaseCreature - { - [Constructible] - public Frederic() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Body = 0x1A; - Hue = 0x455; - Frozen = true; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - } - - public Frederic(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "The Ghost of Frederic Smithson"; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Leon : BaseCreature - { - [Constructible] - public Leon() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Alchemist"; - Race = Race.Human; - Body = 0x190; - Female = false; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - AddItem(new Backpack()); - AddItem(new Shoes(0x901)); - AddItem(new Robe(0x657)); - } - - public Leon(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Leon"; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Andros : BaseCreature - { - [Constructible] - public Andros() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Blacksmith"; - Body = 0x190; - Hue = 0x8409; - FacialHairItemID = 0x2041; - FacialHairHue = 0x45E; - HairItemID = 0x2049; - HairHue = 0x45E; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - AddItem(new Backpack()); - AddItem(new Boots(0x901)); - AddItem(new FancyShirt(0x60B)); - AddItem(new LongPants(0x1BB)); - AddItem(new FullApron(0x901)); - AddItem(new SmithHammer()); - } - - public Andros(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Andros"; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } + public override Type NextQuest => typeof(SaveHisDad); +} + +public class SaveHisDad : MLQuest +{ + public SaveHisDad() + { + Activated = true; + Title = 1075337; // Save His Dad + Description = + 1075338; // My father, Andros, is a smith in Minoc. Last week his forge overturned and he was splashed by molten steel. He was horribly burned, and we feared he would die. An alchemist in Vesper promised to make a bandage that could heal him, but he needed the silk of a dread spider. I came here to get some, but I was careless, and succumbed to their poison. Please, won't you help my father? + RefusalMessage = 1075340; // Oh . . . that's your decision . . . OooOoooOOoo . . . + InProgressMessage = + 1075341; // Thank you! Deliver it to Leon the Alchemist in Vesper. The silk crumbles easily, and much time has already passed since I died. Please! Hurry! + CompletionMessage = + 1075342; // How may I help thee? You have the silk of a dread spider? Of course I can make you a bandage, but what happened to Frederic? + CompletionNotice = CompletionNoticeShort; + + Objectives.Add( + new TimedDeliverObjective( + TimeSpan.FromSeconds(600), + typeof(DreadSpiderSilk), + 1, + "Dread Spider Silk", + typeof(Leon) + ) + ); + + // Hurry! You must get the silk to Leon the Alchemist quickly, or it will crumble and become useless! + Rewards.Add(new DummyReward(1075339)); + } + + public override Type NextQuest => typeof(AFathersGratitude); + public override bool IsChainTriggered => true; +} + +public class AFathersGratitude : MLQuest +{ + public AFathersGratitude() + { + Activated = true; + OneTimeOnly = true; + Title = 1075343; // A Father's Gratitude + Description = + 1075344; // That is simply terrible. First Andros, and now his son. Well, let's make sure Frederic's sacrifice wasn't in vain. Will you take the bandages to his father? You can probably deliver them faster than I can, can't you? + RefusalMessage = + 1075346; // Well I'm sorry to hear you say that. Without your help, I don't know if I can get these to Andros quickly enough to help him. + InProgressMessage = + 1075347; // I don't know how much longer Andros will survive. You'd better get this to him as quick as you can. Every second counts! + CompletionMessage = + 1075348; // Sorry, I'm not accepting commissions at the moment. What? You have the bandage I need from Leon? Thank you so much! But why didn't my son bring this to me himself? . . . Oh, no! You can't be serious! *sag* My Freddie, my son! Thank you for carrying out his last wish. Here -- I made this for my son, to give to him when he became a journeyman. I want you to have it. + CompletionNotice = CompletionNoticeShort; + + Objectives.Add(new DeliverObjective(typeof(AlchemistsBandage), 1, "Alchemist's Bandage", typeof(Andros))); + + Rewards.Add(new ItemReward(1075345, typeof(AndrosGratitude))); // Andros' Gratitude + } + + public override bool IsChainTriggered => true; +} + +[SerializationGenerator(0, false)] +public partial class Ben : BaseCreature +{ + [Constructible] + public Ben() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Apprentice Necromancer"; + Body = 0x190; + Hue = 0x83FD; + HairItemID = 0x2048; + HairHue = 0x463; + FacialHairItemID = 0x204C; + FacialHairHue = 0x463; + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + AddItem(new Backpack()); + AddItem(new Shoes(0x901)); + AddItem(new LongPants(0x1BB)); + AddItem(new FancyShirt(0x756)); + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "Ben"; +} + +[QuesterName("The Ghost of Frederic Smithson")] +[SerializationGenerator(0, false)] +public partial class Frederic : BaseCreature +{ + [Constructible] + public Frederic() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Body = 0x1A; + Hue = 0x455; + Frozen = true; + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "The Ghost of Frederic Smithson"; +} + +[SerializationGenerator(0, false)] +public partial class Leon : BaseCreature +{ + [Constructible] + public Leon() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Alchemist"; + Race = Race.Human; + Body = 0x190; + Female = false; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + AddItem(new Backpack()); + AddItem(new Shoes(0x901)); + AddItem(new Robe(0x657)); + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "Leon"; +} + +[SerializationGenerator(0, false)] +public partial class Andros : BaseCreature +{ + [Constructible] + public Andros() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Blacksmith"; + Body = 0x190; + Hue = 0x8409; + FacialHairItemID = 0x2041; + FacialHairHue = 0x45E; + HairItemID = 0x2049; + HairHue = 0x45E; + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + AddItem(new Backpack()); + AddItem(new Boots(0x901)); + AddItem(new FancyShirt(0x60B)); + AddItem(new LongPants(0x1BB)); + AddItem(new FullApron(0x901)); + AddItem(new SmithHammer()); + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "Andros"; } diff --git a/Projects/UOContent/Engines/ML Quests/Definitions/Bedlam.cs b/Projects/UOContent/Engines/ML Quests/Definitions/Bedlam.cs index fe4fbdcec..4d49085fe 100644 --- a/Projects/UOContent/Engines/ML Quests/Definitions/Bedlam.cs +++ b/Projects/UOContent/Engines/ML Quests/Definitions/Bedlam.cs @@ -1,210 +1,156 @@ +using ModernUO.Serialization; using Server.Engines.MLQuests.Objectives; using Server.Engines.MLQuests.Rewards; using Server.Items; using Server.Mobiles; -namespace Server.Engines.MLQuests.Definitions +namespace Server.Engines.MLQuests.Definitions; + +public class Momento : MLQuest { - public class Momento : MLQuest + public Momento() { - public Momento() - { - Activated = true; - Title = 1074750; // Momento! - Description = - 1074751; // I was going to march right out there and get it myself, but no ... Master Gnosos won't let me. But you see, that bridle means so much to me. A momento of happier, less-dead ... well undead horseback riding. Could you fetch it for me? I think my horse, formerly known as 'Resolve', may still be wearing it. - RefusalMessage = 1074752; // Hrmph. - InProgressMessage = - 1074753; // The bridle would be hard to miss on him now ... since he's skeletal. Please do what you need to do to retrieve it for me. - CompletionMessage = 1074754; // I'd know that jingling sound anywhere! You have recovered my bridle. Thank you. + Activated = true; + Title = 1074750; // Momento! + Description = + 1074751; // I was going to march right out there and get it myself, but no ... Master Gnosos won't let me. But you see, that bridle means so much to me. A momento of happier, less-dead ... well undead horseback riding. Could you fetch it for me? I think my horse, formerly known as 'Resolve', may still be wearing it. + RefusalMessage = 1074752; // Hrmph. + InProgressMessage = + 1074753; // The bridle would be hard to miss on him now ... since he's skeletal. Please do what you need to do to retrieve it for me. + CompletionMessage = 1074754; // I'd know that jingling sound anywhere! You have recovered my bridle. Thank you. - Objectives.Add(new CollectObjective(1, typeof(ResolvesBridle), "Resolve's Bridle")); + Objectives.Add(new CollectObjective(1, typeof(ResolvesBridle), "Resolve's Bridle")); - Rewards.Add(ItemReward.LargeBagOfTreasure); - } - } - - public class CulinaryCrisis : MLQuest - { - public CulinaryCrisis() - { - Activated = true; - Title = 1074755; // Culinary Crisis - Description = - 1074756; // You have NO idea how impossible this is. Simply intolerable! How can one expect an artiste' like me to create masterpieces of culinary delight without the best, fresh ingredients? Ever since this whositwhatsit started this uproar, my thrice-daily produce deliveries have ended. I can't survive another hour without produce! - RefusalMessage = 1074757; // You have no artistry in your soul. - InProgressMessage = 1074758; // I must have fresh produce and cheese at once! - CompletionMessage = - 1074759; // Those dates look bruised! Oh no, and you fetched a soft cheese. *deep pained sigh* Well, even I can only do so much with inferior ingredients. BAM! - - Objectives.Add(new CollectObjective(20, typeof(Dates), 1025927)); // bunch of dates - Objectives.Add(new CollectObjective(5, typeof(CheeseWheel), 1022430)); // wheel of cheese - - Rewards.Add(ItemReward.BagOfTreasure); - } - } - - public class GoneNative : MLQuest - { - public GoneNative() - { - Activated = true; - Title = 1074855; // Gone Native - Description = - 1074856; // Pathetic really. I must say, a senior instructor going native -- forgetting about his students and peers and engaging in such disgraceful behavior! I'm speaking, of course, of Theophilus. Master Theophilus to you. He may have gone native but he still holds a Mastery Degree from Bedlam College! But, well, that's neither here nor there. I need you to take care of my colleague. Convince him of the error of his ways. He may resist. In fact, assume he will and kill him. We'll get him resurrected and be ready to cure his folly. What do you say? - RefusalMessage = - 1074857; // I understand. A Master of Bedlam, even one entirely off his rocker, is too much for you to handle. - InProgressMessage = - 1074858; // You had better get going. Master Theophilus isn't likely to kill himself just to save me this embarrassment. - CompletionMessage = - 1074859; // You look a bit worse for wear! He put up a good fight did he? Hah! That's the spirit … a Master of Bedlam is a match for most. - - Objectives.Add(new KillObjective(1, new[] { typeof(MasterTheophilus) }, "Master Theophilus")); - - Rewards.Add(ItemReward.LargeBagOfTreasure); - } - } - - [QuesterName("Kia (Bedlam)")] - public class Kia : BaseCreature - { - [Constructible] - public Kia() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the student"; - Race = Race.Human; - Body = 0x191; - Female = true; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - AddItem(new Backpack()); - AddItem(new Sandals(0x709)); - AddItem(new Robe(0x497)); - } - - public Kia(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Kia"; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - [QuesterName("Emerillo (Bedlam)")] - public class Emerillo : BaseCreature - { - [Constructible] - public Emerillo() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the cook"; - Race = Race.Human; - Body = 0x190; - Female = false; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - AddItem(new Backpack()); - AddItem(new Sandals(Utility.RandomNeutralHue())); - AddItem(new ShortPants(Utility.RandomPinkHue())); - AddItem(new Shirt()); - AddItem(new HalfApron(0x8FD)); - } - - public Emerillo(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Emerillo"; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1074222); // Could I trouble you for some assistance? - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Nythalia : BaseCreature - { - [Constructible] - public Nythalia() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the student"; - Race = Race.Human; - Body = 0x191; - Female = true; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - AddItem(new Backpack()); - AddItem(new Shoes(Utility.RandomNeutralHue())); - AddItem(new Robe(Utility.RandomBool() ? 0x497 : 0x498)); - } - - public Nythalia(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Mythalia"; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } + Rewards.Add(ItemReward.LargeBagOfTreasure); } } + +public class CulinaryCrisis : MLQuest +{ + public CulinaryCrisis() + { + Activated = true; + Title = 1074755; // Culinary Crisis + Description = + 1074756; // You have NO idea how impossible this is. Simply intolerable! How can one expect an artiste' like me to create masterpieces of culinary delight without the best, fresh ingredients? Ever since this whositwhatsit started this uproar, my thrice-daily produce deliveries have ended. I can't survive another hour without produce! + RefusalMessage = 1074757; // You have no artistry in your soul. + InProgressMessage = 1074758; // I must have fresh produce and cheese at once! + CompletionMessage = + 1074759; // Those dates look bruised! Oh no, and you fetched a soft cheese. *deep pained sigh* Well, even I can only do so much with inferior ingredients. BAM! + + Objectives.Add(new CollectObjective(20, typeof(Dates), 1025927)); // bunch of dates + Objectives.Add(new CollectObjective(5, typeof(CheeseWheel), 1022430)); // wheel of cheese + + Rewards.Add(ItemReward.BagOfTreasure); + } +} + +public class GoneNative : MLQuest +{ + public GoneNative() + { + Activated = true; + Title = 1074855; // Gone Native + Description = + 1074856; // Pathetic really. I must say, a senior instructor going native -- forgetting about his students and peers and engaging in such disgraceful behavior! I'm speaking, of course, of Theophilus. Master Theophilus to you. He may have gone native but he still holds a Mastery Degree from Bedlam College! But, well, that's neither here nor there. I need you to take care of my colleague. Convince him of the error of his ways. He may resist. In fact, assume he will and kill him. We'll get him resurrected and be ready to cure his folly. What do you say? + RefusalMessage = + 1074857; // I understand. A Master of Bedlam, even one entirely off his rocker, is too much for you to handle. + InProgressMessage = + 1074858; // You had better get going. Master Theophilus isn't likely to kill himself just to save me this embarrassment. + CompletionMessage = + 1074859; // You look a bit worse for wear! He put up a good fight did he? Hah! That's the spirit … a Master of Bedlam is a match for most. + + Objectives.Add(new KillObjective(1, new[] { typeof(MasterTheophilus) }, "Master Theophilus")); + + Rewards.Add(ItemReward.LargeBagOfTreasure); + } +} + +[QuesterName("Kia (Bedlam)")] +[SerializationGenerator(0, false)] +public partial class Kia : BaseCreature +{ + [Constructible] + public Kia() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the student"; + Race = Race.Human; + Body = 0x191; + Female = true; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + AddItem(new Backpack()); + AddItem(new Sandals(0x709)); + AddItem(new Robe(0x497)); + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "Kia"; +} + +[QuesterName("Emerillo (Bedlam)")] +[SerializationGenerator(0, false)] +public partial class Emerillo : BaseCreature +{ + [Constructible] + public Emerillo() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the cook"; + Race = Race.Human; + Body = 0x190; + Female = false; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + AddItem(new Backpack()); + AddItem(new Sandals(Utility.RandomNeutralHue())); + AddItem(new ShortPants(Utility.RandomPinkHue())); + AddItem(new Shirt()); + AddItem(new HalfApron(0x8FD)); + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "Emerillo"; + + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1074222); // Could I trouble you for some assistance? + } +} + +[SerializationGenerator(0, false)] +public partial class Nythalia : BaseCreature +{ + [Constructible] + public Nythalia() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the student"; + Race = Race.Human; + Body = 0x191; + Female = true; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + AddItem(new Backpack()); + AddItem(new Shoes(Utility.RandomNeutralHue())); + AddItem(new Robe(Utility.RandomBool() ? 0x497 : 0x498)); + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "Mythalia"; +} diff --git a/Projects/UOContent/Engines/ML Quests/Definitions/Heritage.cs b/Projects/UOContent/Engines/ML Quests/Definitions/Heritage.cs index b1e23a95b..e87626844 100644 --- a/Projects/UOContent/Engines/ML Quests/Definitions/Heritage.cs +++ b/Projects/UOContent/Engines/ML Quests/Definitions/Heritage.cs @@ -1,751 +1,607 @@ using System; +using ModernUO.Serialization; using Server.Engines.MLQuests.Objectives; using Server.Engines.MLQuests.Rewards; using Server.Items; using Server.Mobiles; -namespace Server.Engines.MLQuests.Definitions +namespace Server.Engines.MLQuests.Definitions; + +public class Seasons : MLQuest { - public class Seasons : MLQuest + public Seasons() { - public Seasons() - { - Activated = true; - Title = 1072782; // Seasons - Description = - 1072802; // *rumbling growl* *sniff* ... not-smell ... seek-fight ... not-smell ... fear-stench ... *rumble* ... cold-soon-time comes ... hungry ... eat-fish ... sleep-soon-time ... *deep fang-filled yawn* ... much-fish. - RefusalMessage = 1072810; // *yawn* ... cold-soon-time ... *growl* - InProgressMessage = 1072811; // *sniff* *sniff* ... not-much-fish ... hungry ... *grumble* - CompletionMessage = 1074174; // *sniff* fish! much-fish! + Activated = true; + Title = 1072782; // Seasons + Description = + 1072802; // *rumbling growl* *sniff* ... not-smell ... seek-fight ... not-smell ... fear-stench ... *rumble* ... cold-soon-time comes ... hungry ... eat-fish ... sleep-soon-time ... *deep fang-filled yawn* ... much-fish. + RefusalMessage = 1072810; // *yawn* ... cold-soon-time ... *growl* + InProgressMessage = 1072811; // *sniff* *sniff* ... not-much-fish ... hungry ... *grumble* + CompletionMessage = 1074174; // *sniff* fish! much-fish! - Objectives.Add(new CollectObjective(20, typeof(RawFishSteak), 1022426)); // raw fish steak + Objectives.Add(new CollectObjective(20, typeof(RawFishSteak), 1022426)); // raw fish steak - Rewards.Add(new DummyReward(1072803)); // The boon of Maul. - } - - public override bool RecordCompletion => true; - - public override void GetRewards(MLQuestInstance instance) - { - // You have gained the boon of Maul! Your understanding of the seasons grows. - // You are one step closer to claiming your elven heritage. - instance.Player.SendLocalizedMessage(1074940, "", 0x2A); - instance.ClaimRewards(); // skip gump - } + Rewards.Add(new DummyReward(1072803)); // The boon of Maul. } - public class CaretakerOfTheLand : MLQuest + public override bool RecordCompletion => true; + + public override void GetRewards(MLQuestInstance instance) { - public CaretakerOfTheLand() - { - Activated = true; - Title = 1072783; // Caretaker of the Land - Description = - 1072812; // Hrrrrr. Hurrrr. Huuuman. *creaking branches* Suuun on baaark, roooooots diiig deeeeeep, wiiind caaaresses leeeaves … Hrrrrr. Saaap of Sooosaria feeeeeeds us. Hrrrrr. Huuuman leeearn. Caaaretaker of plaaants … teeend … prooove.
- RefusalMessage = 1072813; // Hrrrrr. Hrrrrr. Huuuman. - InProgressMessage = - 1072814; // Hrrrr. Hrrrr. Roooooots neeeeeed saaap of Sooosaria. Hrrrrr. Roooooots tiiingle neeeaaar Yeeew. Seeeaaarch. Hrrrr! - CompletionMessage = 1074175; // Thiiirsty. Hurrr. Hurrr. - - Objectives.Add(new CollectObjective(1, typeof(SapOfSosaria), "sap of sosaria")); - - Rewards.Add(new DummyReward(1072804)); // The boon of Strongroot. - } - - public override bool RecordCompletion => true; - - public override void GetRewards(MLQuestInstance instance) - { - // You have gained the boon of Strongroot! You have been approved by one whose roots touch the bones of Sosaria. - // You are one step closer to claiming your elven heritage. - instance.Player.SendLocalizedMessage(1074941, "", 0x2A); - instance.ClaimRewards(); // skip gump - } - } - - public class WisdomOfTheSphynx : MLQuest - { - public WisdomOfTheSphynx() - { - Activated = true; - Title = 1072784; // Wisdom of the Sphynx - Description = - 1072822; // I greet thee human and divine my boon thou seek. Convey hence the object of my riddle and I shall reward thee with thy desire.

Three lives have I.
Gentle enough to soothe the skin,
Light enough to caress the sky,
Hard enough to crack rocks
What am I? - RefusalMessage = 1072823; // As thou wish, human. - InProgressMessage = - 1072824; // I give thee a hint then human. The answer to my riddle must be held carefully or it cannot be contained at all. Bring this elusive item to me in a suitable container. - CompletionMessage = 1074176; // Ah, thus it ends. - - Objectives.Add(new InternalObjective()); - - Rewards.Add(new DummyReward(1072805)); // The boon of Enigma. - } - - public override bool RecordCompletion => true; - - public override void GetRewards(MLQuestInstance instance) - { - // You have gained the boon of Enigma! You are wise enough to know how little you know. - // You are one step closer to claiming your elven heritage. - instance.Player.SendLocalizedMessage(1074945, "", 0x2A); - instance.ClaimRewards(); // skip gump - } - - private class InternalObjective : CollectObjective - { - public InternalObjective() - : base(1, typeof(Pitcher), 1074869) // The answer to the riddle. - { - } - - public override bool ShowDetailed => false; - - public override bool CheckItem(Item item) => - item is Pitcher pitcher && pitcher.Content == BeverageType.Water && pitcher.Quantity > 0; - } - } - - public class DefendingTheHerd : MLQuest - { - public DefendingTheHerd() - { - Activated = true; - Title = 1072785; // Defending the Herd - Description = - 1072825; // *snort* ... guard-mates ... guard-herd *hoof stomp* ... defend-with-hoof-and-horn ... thirsty-drink. *proud head-toss* - RefusalMessage = 1072826; // *snort* - InProgressMessage = 1072827; // *impatient hoof stomp* ... thirsty herd ... water scent. - CompletionNotice = CompletionNoticeShort; - - Objectives.Add( - new EscortObjective(new QuestArea(1074779, "Bravehorn's drinking pool")) - ); - - Rewards.Add(new DummyReward(1072806)); // The boon of Bravehorn. - } - - public override bool RecordCompletion => true; - - public override void GetRewards(MLQuestInstance instance) - { - // You have gained the boon of Bravehorn! - // You have glimpsed the nobility of those that sacrifice themselves for their people. - // You are one step closer to claiming your elven heritage. - instance.Player.SendLocalizedMessage(1074942, "", 0x2A); - instance.ClaimRewards(); // skip gump - } - } - - public class TheBalanceOfNature : MLQuest - { - public TheBalanceOfNature() - { - Activated = true; - Title = 1072786; // The Balance of Nature - Description = - 1072829; // Ho, there human. Why do you seek out the Huntsman? The hunter serves the land by culling both predators and prey. The hunter maintains the essential balance of life and does not kill for sport or glory. If you seek my favor, human, then demonstrate you are capable of the duty. Cull the wolves nearby. - RefusalMessage = 1072830; // Then begone. I have no time to waste on you, human. - InProgressMessage = 1072831; // The timber wolves are easily tracked, human. - - Objectives.Add( - new KillObjective( - 15, - new[] { typeof(TimberWolf) }, - "timber wolves", - new QuestArea(1074833, "Huntsman's Forest") - ) - ); - - Rewards.Add(new DummyReward(1072807)); // The boon of the Huntsman. - } - - public override bool RecordCompletion => true; - - public override void GetRewards(MLQuestInstance instance) - { - // You have gained the boon of the Huntsman! - // You have been given a taste of the bittersweet duty of those who guard the balance. - // You are one step closer to claiming your elven heritage. - instance.Player.SendLocalizedMessage(1074943, "", 0x2A); - instance.ClaimRewards(); // skip gump - } - } - - public class TheJoysOfLife : MLQuest - { - public TheJoysOfLife() - { - Activated = true; - Title = 1072787; // The Joys of Life - Description = - 1072832; // *giggle* So serious, so grim! *tickle* Enjoy life! Have fun! Laugh! Be merry! *giggle* Find three of my baubles ... *giggle* I hid them! *giggles hysterically* Hid them! La la la! Bring them quickly! They are magical and will hide themselves again if you are too slow. - RefusalMessage = 1072833; // *giggle* Too serious. Too thinky! - InProgressMessage = 1072834; // Magical baubles hidden, find them as you're bidden! *giggle* - CompletionMessage = 1074177; // *giggle* So pretty! - - Objectives.Add(new CollectObjective(3, typeof(ABauble), "arielle's baubles")); - - Rewards.Add(new DummyReward(1072809)); // The boon of Arielle. - } - - public override bool RecordCompletion => true; - - public override void GetRewards(MLQuestInstance instance) - { - // You have gained the boon of Arielle! - // You have been taught the importance of laughter and light spirits. - // You are one step closer to claiming your elven heritage. - instance.Player.SendLocalizedMessage(1074944, "", 0x2A); - instance.ClaimRewards(); // skip gump - } - } - - [QuesterName("Maul")] - public class MaulTheBear : GrizzlyBear - { - [Constructible] - public MaulTheBear() - { - AI = AIType.AI_Vendor; - FightMode = FightMode.None; - Tamable = false; - } - - public MaulTheBear(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Maul"; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Strongroot : Treefellow - { - [Constructible] - public Strongroot() - { - AI = AIType.AI_Vendor; - FightMode = FightMode.None; - } - - public Strongroot(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Strongroot"; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Enigma : BaseCreature - { - [Constructible] - public Enigma() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Body = 788; - BaseSoundID = 0x3EE; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - } - - public Enigma(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Enigma"; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Bravehorn : BaseEscortable - { - [Constructible] - public Bravehorn() - { - } - - public Bravehorn(Serial serial) - : base(serial) - { - } - - public override bool StaticMLQuester => true; - public override bool InitialInnocent => true; - public override string DefaultName => "Bravehorn"; - - public override void InitBody() - { - Body = 0xEA; - - SetStr(41, 71); - SetDex(47, 77); - SetInt(27, 57); - - SetHits(27, 41); - SetMana(0); - - SetDamage(5, 9); - - SetDamageType(ResistanceType.Physical, 100); - - SetResistance(ResistanceType.Physical, 20, 25); - SetResistance(ResistanceType.Cold, 5, 10); - - SetSkill(SkillName.MagicResist, 26.8, 44.5); - SetSkill(SkillName.Tactics, 29.8, 47.5); - SetSkill(SkillName.Wrestling, 29.8, 47.5); - - Fame = 300; - Karma = 0; - - VirtualArmor = 24; - } - - public override void InitOutfit() - { - } - - public override int GetAttackSound() => 0x82; - - public override int GetHurtSound() => 0x83; - - public override int GetDeathSound() => 0x84; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class BravehornsMate : Hind - { - [Constructible] - public BravehornsMate() => Tamable = false; - - public BravehornsMate(Serial serial) - : base(serial) - { - } - - public override string DefaultName => "bravehorn's mate"; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Huntsman : Centaur - { - [Constructible] - public Huntsman() - { - AI = AIType.AI_Vendor; - FightMode = FightMode.None; - } - - public Huntsman(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Huntsman"; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Arielle : Pixie - { - [Constructible] - public Arielle() - { - AI = AIType.AI_Vendor; - FightMode = FightMode.None; - } - - public Arielle(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Arielle"; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Ingenuity : MLQuest - { - public Ingenuity() - { - Activated = true; - Title = 1074350; // Ingenuity - Description = - 1074462; // The best thing about my job is that I do a little bit of everything, every day. It's what we're good at really. Just picking up something and making it do something else. Listen, I'm really low on parts. Are you interested in fetching me some supplies? - RefusalMessage = 1074508; // Okay. Best of luck with your other endeavors. - InProgressMessage = - 1074509; // Lord overseers are the best source I know for power crystals of the type I need. Iron golems too, can have them but they're harder to find. - CompletionMessage = - 1074510; // Do you have those power crystals? I'm ready to put the finishing touches on my latest experiment. - CompletionNotice = CompletionNoticeShortReturn; - - Objectives.Add(new CollectObjective(10, typeof(PowerCrystal), "Power Crystals")); - - Rewards.Add(new DummyReward(1074875)); // Another step closer to becoming human. - } - - public override bool RecordCompletion => true; - - public override void GetRewards(MLQuestInstance instance) - { - // You have demonstrated your ingenuity! - // Humans are jacks of all trades and know a little about a lot of things. - // You are one step closer to achieving humanity. - instance.Player.SendLocalizedMessage(1074946, "", 0x2A); - instance.ClaimRewards(); // skip gump - } - } - - public class HeaveHo : MLQuest - { - public HeaveHo() - { - Activated = true; - Title = 1074351; // Heave Ho! - Description = - 1074519; // Ho there! There's nothing quite like a day's honest labor to make you appreciate being alive. Hey, maybe you'd like to help out with this project? These crates need to be delivered to Sledge. The only thing is -- it's a bit of a rush job and if you don't make it in time, he won't take them. Can I trust you to help out? - RefusalMessage = 1074521; // Oh yah, if you're too busy, no problem. - InProgressMessage = - 1074522; // Sledge can be found in Buc's Den. Better hurry, he won't take those crates if you take too long with them. - CompletionMessage = 1074523; // Hey, if you have cargo for me, you can start unloading over here. - CompletionNotice = CompletionNoticeShort; - - Objectives.Add( - new TimedDeliverObjective( - TimeSpan.FromHours(1), - typeof(CrateForSledge), - 5, - "Crates for Sledge", - typeof(Sledge) - ) - ); - - Rewards.Add(new DummyReward(1074875)); // Another step closer to becoming human. - } - - public override bool RecordCompletion => true; - - public override void GetRewards(MLQuestInstance instance) - { - // You have demonstrated your physical strength! - // Humans can carry vast loads without complaint. You are one step closer to achieving humanity. - instance.Player.SendLocalizedMessage(1074948, "", 0x2A); - instance.ClaimRewards(); // skip gump - } - } - - // This is not a real quest, it is only used as a reference - public class HumanInNeed : MLQuest - { - public HumanInNeed() - { - Title = 1075011; // A quest that asks you to defend a human in need. - Description = 0; - RefusalMessage = 0; - InProgressMessage = 0; - } - - public override bool RecordCompletion => true; - - public static void AwardTo(PlayerMobile pm) - { - MLQuestSystem.GetOrCreateContext(pm).SetDoneQuest(MLQuestSystem.FindQuest(typeof(HumanInNeed))); - // You have demonstrated your compassion! Your kind actions have been noted. - pm.SendLocalizedMessage(1074949, "", 0x2A); - } - } - - public class AllSeasonAdventurer : MLQuest - { - public AllSeasonAdventurer() - { - Activated = true; - Title = 1074353; // All Season Adventurer - Description = - 1074527; // It's all about hardship, suffering, struggle and pain. Without challenges, you've got nothing to test yourself against -- and that's what life is all about. Self improvement! Honing your body and mind! Overcoming obstacles ... You'll see what I mean if you take on my challenge. - RefusalMessage = 1074528; // My way of life isn't for everyone, that's true enough. - InProgressMessage = 1074529; // You're not making much progress in the honing-mind-and-body department, are you? - CompletionNotice = CompletionNoticeShortReturn; - - Objectives.Add( - new KillObjective( - 5, - new[] { typeof(Efreet) }, - "efreets", - new QuestArea(1074808, "Fire") - ) - ); - Objectives.Add( - new KillObjective( - 5, - new[] { typeof(IceFiend) }, - "ice fiends", - new QuestArea(1074809, "Ice") - ) - ); - - Rewards.Add(new DummyReward(1074875)); // Another step closer to becoming human. - } - - public override bool RecordCompletion => true; - - public override void GetRewards(MLQuestInstance instance) - { - // You have demonstrated your toughness! - // Humans are able to endure unimaginable hardships in pursuit of their goals. - // You are one step closer to achieving humanity. - instance.Player.SendLocalizedMessage(1074947, "", 0x2A); - instance.ClaimRewards(); // skip gump - } - } - - [QuesterName("Sledge (Buc's Den)")] - public class Sledge : BaseCreature - { - [Constructible] - public Sledge() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Versatile"; - Body = 400; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - AddItem(new Tunic(Utility.RandomNeutralHue())); - AddItem(new LongPants(Utility.RandomBlueHue())); - AddItem(new Cloak(Utility.RandomBrightHue())); - AddItem(new ElvenBoots(Utility.RandomNeutralHue())); - AddItem(new Backpack()); - } - - public Sledge(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Sledge"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell( - this, - pm, - Utility.RandomList( - 1074188, // Weakling! You are not up to the task I have. - 1074195 // You there, in the stupid hat! Come here. - ) - ); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - [QuesterName("Patricus (Vesper)")] - public class Patricus : BaseCreature - { - [Constructible] - public Patricus() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Trader"; - Body = 400; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - AddItem(new FancyShirt(Utility.RandomNeutralHue())); - AddItem(new LongPants(Utility.RandomBrightHue())); - AddItem(new Cloak(0x1BB)); - AddItem(new Shoes(Utility.RandomNeutralHue())); - AddItem(new Backpack()); - } - - public Patricus(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Patricus"; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - [QuesterName("Belulah (Nujel'm)")] // On OSI it's "Belulah (Nu'Jelm)" (incorrect spelling) - public class Belulah : BaseCreature - { - [Constructible] - public Belulah() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the scorned"; - Female = true; - Body = 401; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - AddItem(new FancyShirt(Utility.RandomBlueHue())); - AddItem(new LongPants(Utility.RandomNondyedHue())); - AddItem(new Boots()); - } - - public Belulah(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Belulah"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - /* - * 1074205 - Oh great adventurer, would you please assist a weak soul in need of aid? - * 1074206 - Excuse me please traveler, might I have a little of your time? - */ - MLQuestSystem.Tell(this, pm, Utility.Random(1074205, 2)); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } + // You have gained the boon of Maul! Your understanding of the seasons grows. + // You are one step closer to claiming your elven heritage. + instance.Player.SendLocalizedMessage(1074940, "", 0x2A); + instance.ClaimRewards(); // skip gump + } +} + +public class CaretakerOfTheLand : MLQuest +{ + public CaretakerOfTheLand() + { + Activated = true; + Title = 1072783; // Caretaker of the Land + Description = + 1072812; // Hrrrrr. Hurrrr. Huuuman. *creaking branches* Suuun on baaark, roooooots diiig deeeeeep, wiiind caaaresses leeeaves … Hrrrrr. Saaap of Sooosaria feeeeeeds us. Hrrrrr. Huuuman leeearn. Caaaretaker of plaaants … teeend … prooove.
+ RefusalMessage = 1072813; // Hrrrrr. Hrrrrr. Huuuman. + InProgressMessage = + 1072814; // Hrrrr. Hrrrr. Roooooots neeeeeed saaap of Sooosaria. Hrrrrr. Roooooots tiiingle neeeaaar Yeeew. Seeeaaarch. Hrrrr! + CompletionMessage = 1074175; // Thiiirsty. Hurrr. Hurrr. + + Objectives.Add(new CollectObjective(1, typeof(SapOfSosaria), "sap of sosaria")); + + Rewards.Add(new DummyReward(1072804)); // The boon of Strongroot. + } + + public override bool RecordCompletion => true; + + public override void GetRewards(MLQuestInstance instance) + { + // You have gained the boon of Strongroot! You have been approved by one whose roots touch the bones of Sosaria. + // You are one step closer to claiming your elven heritage. + instance.Player.SendLocalizedMessage(1074941, "", 0x2A); + instance.ClaimRewards(); // skip gump + } +} + +public class WisdomOfTheSphynx : MLQuest +{ + public WisdomOfTheSphynx() + { + Activated = true; + Title = 1072784; // Wisdom of the Sphynx + Description = + 1072822; // I greet thee human and divine my boon thou seek. Convey hence the object of my riddle and I shall reward thee with thy desire.

Three lives have I.
Gentle enough to soothe the skin,
Light enough to caress the sky,
Hard enough to crack rocks
What am I? + RefusalMessage = 1072823; // As thou wish, human. + InProgressMessage = + 1072824; // I give thee a hint then human. The answer to my riddle must be held carefully or it cannot be contained at all. Bring this elusive item to me in a suitable container. + CompletionMessage = 1074176; // Ah, thus it ends. + + Objectives.Add(new InternalObjective()); + + Rewards.Add(new DummyReward(1072805)); // The boon of Enigma. + } + + public override bool RecordCompletion => true; + + public override void GetRewards(MLQuestInstance instance) + { + // You have gained the boon of Enigma! You are wise enough to know how little you know. + // You are one step closer to claiming your elven heritage. + instance.Player.SendLocalizedMessage(1074945, "", 0x2A); + instance.ClaimRewards(); // skip gump + } + + private class InternalObjective : CollectObjective + { + public InternalObjective() + : base(1, typeof(Pitcher), 1074869) // The answer to the riddle. + { + } + + public override bool ShowDetailed => false; + + public override bool CheckItem(Item item) => + item is Pitcher pitcher && pitcher.Content == BeverageType.Water && pitcher.Quantity > 0; + } +} + +public class DefendingTheHerd : MLQuest +{ + public DefendingTheHerd() + { + Activated = true; + Title = 1072785; // Defending the Herd + Description = + 1072825; // *snort* ... guard-mates ... guard-herd *hoof stomp* ... defend-with-hoof-and-horn ... thirsty-drink. *proud head-toss* + RefusalMessage = 1072826; // *snort* + InProgressMessage = 1072827; // *impatient hoof stomp* ... thirsty herd ... water scent. + CompletionNotice = CompletionNoticeShort; + + Objectives.Add( + new EscortObjective(new QuestArea(1074779, "Bravehorn's drinking pool")) + ); + + Rewards.Add(new DummyReward(1072806)); // The boon of Bravehorn. + } + + public override bool RecordCompletion => true; + + public override void GetRewards(MLQuestInstance instance) + { + // You have gained the boon of Bravehorn! + // You have glimpsed the nobility of those that sacrifice themselves for their people. + // You are one step closer to claiming your elven heritage. + instance.Player.SendLocalizedMessage(1074942, "", 0x2A); + instance.ClaimRewards(); // skip gump + } +} + +public class TheBalanceOfNature : MLQuest +{ + public TheBalanceOfNature() + { + Activated = true; + Title = 1072786; // The Balance of Nature + Description = + 1072829; // Ho, there human. Why do you seek out the Huntsman? The hunter serves the land by culling both predators and prey. The hunter maintains the essential balance of life and does not kill for sport or glory. If you seek my favor, human, then demonstrate you are capable of the duty. Cull the wolves nearby. + RefusalMessage = 1072830; // Then begone. I have no time to waste on you, human. + InProgressMessage = 1072831; // The timber wolves are easily tracked, human. + + Objectives.Add( + new KillObjective( + 15, + new[] { typeof(TimberWolf) }, + "timber wolves", + new QuestArea(1074833, "Huntsman's Forest") + ) + ); + + Rewards.Add(new DummyReward(1072807)); // The boon of the Huntsman. + } + + public override bool RecordCompletion => true; + + public override void GetRewards(MLQuestInstance instance) + { + // You have gained the boon of the Huntsman! + // You have been given a taste of the bittersweet duty of those who guard the balance. + // You are one step closer to claiming your elven heritage. + instance.Player.SendLocalizedMessage(1074943, "", 0x2A); + instance.ClaimRewards(); // skip gump + } +} + +public class TheJoysOfLife : MLQuest +{ + public TheJoysOfLife() + { + Activated = true; + Title = 1072787; // The Joys of Life + Description = + 1072832; // *giggle* So serious, so grim! *tickle* Enjoy life! Have fun! Laugh! Be merry! *giggle* Find three of my baubles ... *giggle* I hid them! *giggles hysterically* Hid them! La la la! Bring them quickly! They are magical and will hide themselves again if you are too slow. + RefusalMessage = 1072833; // *giggle* Too serious. Too thinky! + InProgressMessage = 1072834; // Magical baubles hidden, find them as you're bidden! *giggle* + CompletionMessage = 1074177; // *giggle* So pretty! + + Objectives.Add(new CollectObjective(3, typeof(ABauble), "arielle's baubles")); + + Rewards.Add(new DummyReward(1072809)); // The boon of Arielle. + } + + public override bool RecordCompletion => true; + + public override void GetRewards(MLQuestInstance instance) + { + // You have gained the boon of Arielle! + // You have been taught the importance of laughter and light spirits. + // You are one step closer to claiming your elven heritage. + instance.Player.SendLocalizedMessage(1074944, "", 0x2A); + instance.ClaimRewards(); // skip gump + } +} + +[QuesterName("Maul")] +public class MaulTheBear : GrizzlyBear +{ + [Constructible] + public MaulTheBear() + { + AI = AIType.AI_Vendor; + FightMode = FightMode.None; + Tamable = false; + } + + public MaulTheBear(Serial serial) + : base(serial) + { + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "Maul"; + + public override void Serialize(IGenericWriter writer) + { + base.Serialize(writer); + + writer.Write(0); // version + } + + public override void Deserialize(IGenericReader reader) + { + base.Deserialize(reader); + + var version = reader.ReadInt(); + } +} + +public class Strongroot : Treefellow +{ + [Constructible] + public Strongroot() + { + AI = AIType.AI_Vendor; + FightMode = FightMode.None; + } + + public Strongroot(Serial serial) + : base(serial) + { + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "Strongroot"; + + public override void Serialize(IGenericWriter writer) + { + base.Serialize(writer); + + writer.Write(0); // version + } + + public override void Deserialize(IGenericReader reader) + { + base.Deserialize(reader); + + var version = reader.ReadInt(); + } +} + +[SerializationGenerator(0, false)] +public partial class Enigma : BaseCreature +{ + [Constructible] + public Enigma() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Body = 788; + BaseSoundID = 0x3EE; + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "Enigma"; +} + +[SerializationGenerator(0, false)] +public partial class Bravehorn : BaseEscortable +{ + [Constructible] + public Bravehorn() + { + } + + public override bool StaticMLQuester => true; + public override bool InitialInnocent => true; + public override string DefaultName => "Bravehorn"; + + public override void InitBody() + { + Body = 0xEA; + + SetStr(41, 71); + SetDex(47, 77); + SetInt(27, 57); + + SetHits(27, 41); + SetMana(0); + + SetDamage(5, 9); + + SetDamageType(ResistanceType.Physical, 100); + + SetResistance(ResistanceType.Physical, 20, 25); + SetResistance(ResistanceType.Cold, 5, 10); + + SetSkill(SkillName.MagicResist, 26.8, 44.5); + SetSkill(SkillName.Tactics, 29.8, 47.5); + SetSkill(SkillName.Wrestling, 29.8, 47.5); + + Fame = 300; + Karma = 0; + + VirtualArmor = 24; + } + + public override void InitOutfit() + { + } + + public override int GetAttackSound() => 0x82; + + public override int GetHurtSound() => 0x83; + + public override int GetDeathSound() => 0x84; +} + +[SerializationGenerator(0, false)] +public partial class BravehornsMate : Hind +{ + [Constructible] + public BravehornsMate() => Tamable = false; + + public override string DefaultName => "bravehorn's mate"; +} + +[SerializationGenerator(0, false)] +public partial class Huntsman : Centaur +{ + [Constructible] + public Huntsman() + { + AI = AIType.AI_Vendor; + FightMode = FightMode.None; + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "Huntsman"; +} + +[SerializationGenerator(0, false)] +public partial class Arielle : Pixie +{ + [Constructible] + public Arielle() + { + AI = AIType.AI_Vendor; + FightMode = FightMode.None; + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "Arielle"; +} + +public class Ingenuity : MLQuest +{ + public Ingenuity() + { + Activated = true; + Title = 1074350; // Ingenuity + Description = + 1074462; // The best thing about my job is that I do a little bit of everything, every day. It's what we're good at really. Just picking up something and making it do something else. Listen, I'm really low on parts. Are you interested in fetching me some supplies? + RefusalMessage = 1074508; // Okay. Best of luck with your other endeavors. + InProgressMessage = + 1074509; // Lord overseers are the best source I know for power crystals of the type I need. Iron golems too, can have them but they're harder to find. + CompletionMessage = + 1074510; // Do you have those power crystals? I'm ready to put the finishing touches on my latest experiment. + CompletionNotice = CompletionNoticeShortReturn; + + Objectives.Add(new CollectObjective(10, typeof(PowerCrystal), "Power Crystals")); + + Rewards.Add(new DummyReward(1074875)); // Another step closer to becoming human. + } + + public override bool RecordCompletion => true; + + public override void GetRewards(MLQuestInstance instance) + { + // You have demonstrated your ingenuity! + // Humans are jacks of all trades and know a little about a lot of things. + // You are one step closer to achieving humanity. + instance.Player.SendLocalizedMessage(1074946, "", 0x2A); + instance.ClaimRewards(); // skip gump + } +} + +public class HeaveHo : MLQuest +{ + public HeaveHo() + { + Activated = true; + Title = 1074351; // Heave Ho! + Description = + 1074519; // Ho there! There's nothing quite like a day's honest labor to make you appreciate being alive. Hey, maybe you'd like to help out with this project? These crates need to be delivered to Sledge. The only thing is -- it's a bit of a rush job and if you don't make it in time, he won't take them. Can I trust you to help out? + RefusalMessage = 1074521; // Oh yah, if you're too busy, no problem. + InProgressMessage = + 1074522; // Sledge can be found in Buc's Den. Better hurry, he won't take those crates if you take too long with them. + CompletionMessage = 1074523; // Hey, if you have cargo for me, you can start unloading over here. + CompletionNotice = CompletionNoticeShort; + + Objectives.Add( + new TimedDeliverObjective( + TimeSpan.FromHours(1), + typeof(CrateForSledge), + 5, + "Crates for Sledge", + typeof(Sledge) + ) + ); + + Rewards.Add(new DummyReward(1074875)); // Another step closer to becoming human. + } + + public override bool RecordCompletion => true; + + public override void GetRewards(MLQuestInstance instance) + { + // You have demonstrated your physical strength! + // Humans can carry vast loads without complaint. You are one step closer to achieving humanity. + instance.Player.SendLocalizedMessage(1074948, "", 0x2A); + instance.ClaimRewards(); // skip gump + } +} + +// This is not a real quest, it is only used as a reference +public class HumanInNeed : MLQuest +{ + public HumanInNeed() + { + Title = 1075011; // A quest that asks you to defend a human in need. + Description = 0; + RefusalMessage = 0; + InProgressMessage = 0; + } + + public override bool RecordCompletion => true; + + public static void AwardTo(PlayerMobile pm) + { + MLQuestSystem.GetOrCreateContext(pm).SetDoneQuest(MLQuestSystem.FindQuest(typeof(HumanInNeed))); + // You have demonstrated your compassion! Your kind actions have been noted. + pm.SendLocalizedMessage(1074949, "", 0x2A); + } +} + +public class AllSeasonAdventurer : MLQuest +{ + public AllSeasonAdventurer() + { + Activated = true; + Title = 1074353; // All Season Adventurer + Description = + 1074527; // It's all about hardship, suffering, struggle and pain. Without challenges, you've got nothing to test yourself against -- and that's what life is all about. Self improvement! Honing your body and mind! Overcoming obstacles ... You'll see what I mean if you take on my challenge. + RefusalMessage = 1074528; // My way of life isn't for everyone, that's true enough. + InProgressMessage = 1074529; // You're not making much progress in the honing-mind-and-body department, are you? + CompletionNotice = CompletionNoticeShortReturn; + + Objectives.Add( + new KillObjective( + 5, + new[] { typeof(Efreet) }, + "efreets", + new QuestArea(1074808, "Fire") + ) + ); + Objectives.Add( + new KillObjective( + 5, + new[] { typeof(IceFiend) }, + "ice fiends", + new QuestArea(1074809, "Ice") + ) + ); + + Rewards.Add(new DummyReward(1074875)); // Another step closer to becoming human. + } + + public override bool RecordCompletion => true; + + public override void GetRewards(MLQuestInstance instance) + { + // You have demonstrated your toughness! + // Humans are able to endure unimaginable hardships in pursuit of their goals. + // You are one step closer to achieving humanity. + instance.Player.SendLocalizedMessage(1074947, "", 0x2A); + instance.ClaimRewards(); // skip gump + } +} + +[QuesterName("Sledge (Buc's Den)")] +[SerializationGenerator(0, false)] +public partial class Sledge : BaseCreature +{ + [Constructible] + public Sledge() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Versatile"; + Body = 400; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + AddItem(new Tunic(Utility.RandomNeutralHue())); + AddItem(new LongPants(Utility.RandomBlueHue())); + AddItem(new Cloak(Utility.RandomBrightHue())); + AddItem(new ElvenBoots(Utility.RandomNeutralHue())); + AddItem(new Backpack()); + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "Sledge"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell( + this, + pm, + Utility.RandomList( + 1074188, // Weakling! You are not up to the task I have. + 1074195 // You there, in the stupid hat! Come here. + ) + ); + } +} + +[QuesterName("Patricus (Vesper)")] +[SerializationGenerator(0, false)] +public partial class Patricus : BaseCreature +{ + [Constructible] + public Patricus() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Trader"; + Body = 400; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + AddItem(new FancyShirt(Utility.RandomNeutralHue())); + AddItem(new LongPants(Utility.RandomBrightHue())); + AddItem(new Cloak(0x1BB)); + AddItem(new Shoes(Utility.RandomNeutralHue())); + AddItem(new Backpack()); + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "Patricus"; +} + +[QuesterName("Belulah (Nujel'm)")] // On OSI it's "Belulah (Nu'Jelm)" (incorrect spelling) +[SerializationGenerator(0, false)] +public partial class Belulah : BaseCreature +{ + [Constructible] + public Belulah() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the scorned"; + Female = true; + Body = 401; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + AddItem(new FancyShirt(Utility.RandomBlueHue())); + AddItem(new LongPants(Utility.RandomNondyedHue())); + AddItem(new Boots()); + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "Belulah"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + /* + * 1074205 - Oh great adventurer, would you please assist a weak soul in need of aid? + * 1074206 - Excuse me please traveler, might I have a little of your time? + */ + MLQuestSystem.Tell(this, pm, Utility.Random(1074205, 2)); } } diff --git a/Projects/UOContent/Engines/ML Quests/Definitions/HonestBeggar.cs b/Projects/UOContent/Engines/ML Quests/Definitions/HonestBeggar.cs index 717fd723d..add2bbc3c 100644 --- a/Projects/UOContent/Engines/ML Quests/Definitions/HonestBeggar.cs +++ b/Projects/UOContent/Engines/ML Quests/Definitions/HonestBeggar.cs @@ -1,143 +1,107 @@ using System; +using ModernUO.Serialization; using Server.Engines.MLQuests.Objectives; using Server.Engines.MLQuests.Rewards; using Server.Items; using Server.Mobiles; -namespace Server.Engines.MLQuests.Definitions +namespace Server.Engines.MLQuests.Definitions; + +public class HonestBeggar : MLQuest { - public class HonestBeggar : MLQuest + public HonestBeggar() { - public HonestBeggar() - { - Activated = true; - Title = 1075392; // Honest Beggar - // Beg pardon, sir. I mean, madam. Uh, can I ask a favor of you? I found this jeweled ring. Most people would sell it and keep the money, but not me. I ain't never stole nothing, and I ain't about to start. I tried to take it over to Brit castle, figgerin' it must belong to some highborn lady, but the guards threw me out. You look like they might let you pass. Will you take the ring over there and see if you can find the owner? + Activated = true; + Title = 1075392; // Honest Beggar + // Beg pardon, sir. I mean, madam. Uh, can I ask a favor of you? I found this jeweled ring. Most people would sell it and keep the money, but not me. I ain't never stole nothing, and I ain't about to start. I tried to take it over to Brit castle, figgerin' it must belong to some highborn lady, but the guards threw me out. You look like they might let you pass. Will you take the ring over there and see if you can find the owner? - Description = 1075393; - RefusalMessage = 1075395; // I see. Too good to help an honest beggar like me, eh? - // A jewel like this must be worth a lot, so it must belong to some noble or another. I would show it around the castle. Someone's bound to recognize it. - InProgressMessage = 1075396; - // Didst thou find my ring? I thank thee very much! It is an old ring, and a gift from my husband. I was most distraught when I realized it was missing. - CompletionMessage = 1075397; - CompletionNotice = CompletionNoticeShort; + Description = 1075393; + RefusalMessage = 1075395; // I see. Too good to help an honest beggar like me, eh? + // A jewel like this must be worth a lot, so it must belong to some noble or another. I would show it around the castle. Someone's bound to recognize it. + InProgressMessage = 1075396; + // Didst thou find my ring? I thank thee very much! It is an old ring, and a gift from my husband. I was most distraught when I realized it was missing. + CompletionMessage = 1075397; + CompletionNotice = CompletionNoticeShort; - Objectives.Add(new DeliverObjective(typeof(ReginasRing), 1, "Regina's Ring", typeof(Regina))); + Objectives.Add(new DeliverObjective(typeof(ReginasRing), 1, "Regina's Ring", typeof(Regina))); - Rewards.Add(new DummyReward(1075394)); // Find the ring's owner. - } - - public override Type NextQuest => typeof(ReginasThanks); + Rewards.Add(new DummyReward(1075394)); // Find the ring's owner. } - public class ReginasThanks : MLQuest - { - public ReginasThanks() - { - Activated = true; - OneTimeOnly = true; - Title = 1075398; // Regina's Thanks - Description = - 1075399; // What's that you say? It was a humble beggar that found my ring? Such honesty must be rewarded. Here, take this packet and return it to him, and I will be in your debt. - RefusalMessage = 1075401; // Hmph. Very well. What did you say his name was? - InProgressMessage = 1075402; // Take the packet and return it to the beggar who found my ring. - CompletionMessage = - 1075403; // What? For me? Let me see . . . these sapphire earrings are for you, it says. Oh, she wants to offer me a job! This is the most wonderful thing that ever happened to me! - CompletionNotice = CompletionNoticeShort; - - Objectives.Add(new DeliverObjective(typeof(ReginasLetter), 1, "Regina's Letter", typeof(Evan))); - - Rewards.Add(new ItemReward(1075400, typeof(TransparentHeart))); // Transparent Heart - } - - public override bool IsChainTriggered => true; - } - - public class Evan : BaseCreature - { - [Constructible] - public Evan() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Beggar"; - Race = Race.Human; - Body = 0x190; - Female = false; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - AddItem(new Backpack()); - AddItem(new Doublet()); - AddItem(new ShortPants(0x755)); - } - - public Evan(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Evan"; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Regina : BaseCreature - { - [Constructible] - public Regina() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Noble"; - Race = Race.Human; - Body = 0x191; - Female = true; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - AddItem(new Backpack()); - AddItem(new GildedDress()); - AddItem(new Boots()); - } - - public Regina(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Regina"; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } + public override Type NextQuest => typeof(ReginasThanks); +} + +public class ReginasThanks : MLQuest +{ + public ReginasThanks() + { + Activated = true; + OneTimeOnly = true; + Title = 1075398; // Regina's Thanks + Description = + 1075399; // What's that you say? It was a humble beggar that found my ring? Such honesty must be rewarded. Here, take this packet and return it to him, and I will be in your debt. + RefusalMessage = 1075401; // Hmph. Very well. What did you say his name was? + InProgressMessage = 1075402; // Take the packet and return it to the beggar who found my ring. + CompletionMessage = + 1075403; // What? For me? Let me see . . . these sapphire earrings are for you, it says. Oh, she wants to offer me a job! This is the most wonderful thing that ever happened to me! + CompletionNotice = CompletionNoticeShort; + + Objectives.Add(new DeliverObjective(typeof(ReginasLetter), 1, "Regina's Letter", typeof(Evan))); + + Rewards.Add(new ItemReward(1075400, typeof(TransparentHeart))); // Transparent Heart + } + + public override bool IsChainTriggered => true; +} + +[SerializationGenerator(0, false)] +public partial class Evan : BaseCreature +{ + [Constructible] + public Evan() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Beggar"; + Race = Race.Human; + Body = 0x190; + Female = false; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + AddItem(new Backpack()); + AddItem(new Doublet()); + AddItem(new ShortPants(0x755)); + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "Evan"; +} + +[SerializationGenerator(0, false)] +public partial class Regina : BaseCreature +{ + [Constructible] + public Regina() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Noble"; + Race = Race.Human; + Body = 0x191; + Female = true; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + AddItem(new Backpack()); + AddItem(new GildedDress()); + AddItem(new Boots()); + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "Regina"; } diff --git a/Projects/UOContent/Engines/ML Quests/Definitions/Ilshenar.cs b/Projects/UOContent/Engines/ML Quests/Definitions/Ilshenar.cs index ec47551af..ad86f9645 100644 --- a/Projects/UOContent/Engines/ML Quests/Definitions/Ilshenar.cs +++ b/Projects/UOContent/Engines/ML Quests/Definitions/Ilshenar.cs @@ -1,328 +1,274 @@ -using Server.Engines.MLQuests.Objectives; +using ModernUO.Serialization; +using Server.Engines.MLQuests.Objectives; using Server.Engines.MLQuests.Rewards; using Server.Items; using Server.Mobiles; -namespace Server.Engines.MLQuests.Definitions +namespace Server.Engines.MLQuests.Definitions; + +public class Responsibility : BaseEscort { - public class Responsibility : BaseEscort + public Responsibility() { - public Responsibility() - { - Activated = true; - Title = 1074352; // Responsibility - Description = - 1074524; // Oh! I just don't know what to do. My mother is away and my father told me not to talk to strangers ... *worried frown* But my grandfather has sent word that he has been hurt and needs me to tend his wounds. He has a small farm southeast of here. Would you ... could you ... escort me there safely? - RefusalMessage = 1074525; // I hope my grandfather will be alright. - InProgressMessage = - 1074526; // Grandfather's farm is a ways west of the Shrine of Spirituality. So, we're not quite there yet. Thank you again for keeping me safe. + Activated = true; + Title = 1074352; // Responsibility + Description = + 1074524; // Oh! I just don't know what to do. My mother is away and my father told me not to talk to strangers ... *worried frown* But my grandfather has sent word that he has been hurt and needs me to tend his wounds. He has a small farm southeast of here. Would you ... could you ... escort me there safely? + RefusalMessage = 1074525; // I hope my grandfather will be alright. + InProgressMessage = + 1074526; // Grandfather's farm is a ways west of the Shrine of Spirituality. So, we're not quite there yet. Thank you again for keeping me safe. - Objectives.Add(new EscortObjective(new QuestArea(1074781, "Sheep Farm"))); // Sheep Farm + Objectives.Add(new EscortObjective(new QuestArea(1074781, "Sheep Farm"))); // Sheep Farm - Rewards.Add(ItemReward.BagOfTrinkets); - } - - // OSI sends this instead, but it doesn't make sense for an escortable - // public override void OnComplete( MLQuestInstance instance ) - // { - // instance.Player.SendLocalizedMessage( 1073775, "", 0x23 ); // Your quest is complete. Return for your reward. - // } + Rewards.Add(ItemReward.BagOfTrinkets); } - public class SomethingToWailAbout : MLQuest + // OSI sends this instead, but it doesn't make sense for an escortable + // public override void OnComplete( MLQuestInstance instance ) + // { + // instance.Player.SendLocalizedMessage( 1073775, "", 0x23 ); // Your quest is complete. Return for your reward. + // } +} + +public class SomethingToWailAbout : MLQuest +{ + public SomethingToWailAbout() { - public SomethingToWailAbout() - { - Activated = true; - Title = 1073071; // Something to Wail About - Description = - 1073561; // Can you hear them? The never-ending howling? The incessant wailing? These banshees, they never cease! Never! They haunt my nights. Please, I beg you -- will you silence them? I would be ever so grateful. - RefusalMessage = 1073580; // I hope you'll reconsider. Until then, farwell. - InProgressMessage = 1073581; // Until you kill 12 Wailing Banshees, there will be no peace. + Activated = true; + Title = 1073071; // Something to Wail About + Description = + 1073561; // Can you hear them? The never-ending howling? The incessant wailing? These banshees, they never cease! Never! They haunt my nights. Please, I beg you -- will you silence them? I would be ever so grateful. + RefusalMessage = 1073580; // I hope you'll reconsider. Until then, farwell. + InProgressMessage = 1073581; // Until you kill 12 Wailing Banshees, there will be no peace. - Objectives.Add(new KillObjective(12, new[] { typeof(WailingBanshee) }, "wailing banshees")); + Objectives.Add(new KillObjective(12, new[] { typeof(WailingBanshee) }, "wailing banshees")); - Rewards.Add(ItemReward.BagOfTreasure); - } - } - - public class Runaways : MLQuest - { - public Runaways() - { - Activated = true; - Title = 1072993; // Runaways! - Description = - 1073026; // You've got to help me out! Those wild ostards have been causing absolute havok around here. Kill them off before they destroy my land. There are around twelve of them. - RefusalMessage = 1072270; // Well, okay. But if you decide you are up for it after all, c'mon back and see me. - InProgressMessage = 1072271; // You're not quite done yet. Get back to work! - - Objectives.Add(new KillObjective(12, new[] { typeof(FrenziedOstard) }, "frenzied ostards")); - - Rewards.Add(ItemReward.BagOfTrinkets); - } - } - - public class ViciousPredator : MLQuest - { - public ViciousPredator() - { - Activated = true; - Title = 1072994; // Vicious Predator - Description = - 1073028; // You've got to help me out! Those dire wolves have been causing absolute havok around here. Kill them off before they destroy my land. They run around in a pack of around ten. - RefusalMessage = 1072270; // Well, okay. But if you decide you are up for it after all, c'mon back and see me. - InProgressMessage = 1072271; // You're not quite done yet. Get back to work! - - Objectives.Add(new KillObjective(10, new[] { typeof(DireWolf) }, "dire wolves")); - - Rewards.Add(ItemReward.BagOfTrinkets); - } - } - - public class GuileIrkAndSpite : MLQuest - { - public GuileIrkAndSpite() - { - Activated = true; - Title = 1074739; // Guile, Irk and Spite - Description = - 1074740; // You know them, don't you. The three? They look like you, you'll see. They looked like me, I remember, they looked like, well, you'll see. The three. They'll drive you mad too, if you let them. They are trouble, and they need to be slain. Seek them out. - RefusalMessage = - 1074745; // You just don't understand the gravity of the situation. If you did, you'd agree to my task. - InProgressMessage = - 1074746; // Perhaps I was unclear. You'll know them when you see them, because you'll see you, and you, and you. Hurry now. - CompletionMessage = - 1074747; // Are you one of THEM? Ahhhh! Oh, wait, if you were them, then you'd be me. So you're -- you. Good job! - - Objectives.Add(new KillObjective(1, new[] { typeof(Guile) }, "Guile")); - Objectives.Add(new KillObjective(1, new[] { typeof(Irk) }, "Irk")); - Objectives.Add(new KillObjective(1, new[] { typeof(Spite) }, "Spite")); - - Rewards.Add(ItemReward.Strongbox); - } - } - - public class Lissbet : BaseEscortable - { - [Constructible] - public Lissbet() - { - } - - public Lissbet(Serial serial) - : base(serial) - { - } - - public override bool StaticMLQuester => true; - public override bool InitialInnocent => true; - public override string DefaultName => "Lissbet"; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell( - this, - pm, - Utility.RandomList( - 1074204, // Greetings seeker. I have an urgent matter for you, if you are willing. - 1074222 // Could I trouble you for some assistance? - ) - ); - } - - public override void InitBody() - { - SetStr(40, 50); - SetDex(70, 80); - SetInt(80, 90); - - Hue = Race.Human.RandomSkinHue(); - Female = true; - Body = 401; - - Title = "the flower girl"; - - HairItemID = 0x203D; - HairHue = 0x1BB; - } - - public override void InitOutfit() - { - AddItem(new Kilt(Utility.RandomYellowHue())); - AddItem(new FancyShirt(Utility.RandomYellowHue())); - AddItem(new Sandals()); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class GrandpaCharley : BaseCreature - { - [Constructible] - public GrandpaCharley() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the farmer"; - Body = 400; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - var hairHue = 0x3B2 + Utility.Random(2); - Utility.AssignRandomHair(this, hairHue); - - FacialHairItemID = 0x203E; // Long Beard - FacialHairHue = hairHue; - - SetSkill(SkillName.ItemID, 80, 90); - - AddItem(new WideBrimHat(Utility.RandomNondyedHue())); - AddItem(new FancyShirt(Utility.RandomNondyedHue())); - AddItem(new LongPants(Utility.RandomNondyedHue())); - AddItem(new Sandals(Utility.RandomNeutralHue())); - AddItem(new ShepherdsCrook()); - AddItem(new Backpack()); - } - - public GrandpaCharley(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Grandpa Charley"; - public override bool CanTeach => true; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - [QuesterName("Jelrice (Ilshenar)")] - public class Jelrice : BaseCreature - { - [Constructible] - public Jelrice() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the trader"; - Race = Race.Human; - Body = 0x191; - Female = true; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - AddItem(new Shoes(Utility.RandomNeutralHue())); - AddItem(new Skirt(Utility.RandomBlueHue())); - AddItem(new FancyShirt(Utility.RandomRedHue())); - } - - public Jelrice(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Jelrice"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1074221); // Greetings! I have a small task for you good traveler. - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - [QuesterName("Yorus (Ilshenar)")] - public class Yorus : BaseCreature - { - [Constructible] - public Yorus() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the tinker"; - Race = Race.Human; - Body = 0x190; - Female = false; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - AddItem(new Shoes(Utility.RandomNeutralHue())); - AddItem(new LongPants(Utility.RandomBlueHue())); - AddItem(new FancyShirt(Utility.RandomOrangeHue())); - AddItem(new Cloak(Utility.RandomBrightHue())); - } - - public Yorus(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Yorus"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1074218); // Hey! I want to talk to you, now. - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } + Rewards.Add(ItemReward.BagOfTreasure); + } +} + +public class Runaways : MLQuest +{ + public Runaways() + { + Activated = true; + Title = 1072993; // Runaways! + Description = + 1073026; // You've got to help me out! Those wild ostards have been causing absolute havok around here. Kill them off before they destroy my land. There are around twelve of them. + RefusalMessage = 1072270; // Well, okay. But if you decide you are up for it after all, c'mon back and see me. + InProgressMessage = 1072271; // You're not quite done yet. Get back to work! + + Objectives.Add(new KillObjective(12, new[] { typeof(FrenziedOstard) }, "frenzied ostards")); + + Rewards.Add(ItemReward.BagOfTrinkets); + } +} + +public class ViciousPredator : MLQuest +{ + public ViciousPredator() + { + Activated = true; + Title = 1072994; // Vicious Predator + Description = + 1073028; // You've got to help me out! Those dire wolves have been causing absolute havok around here. Kill them off before they destroy my land. They run around in a pack of around ten. + RefusalMessage = 1072270; // Well, okay. But if you decide you are up for it after all, c'mon back and see me. + InProgressMessage = 1072271; // You're not quite done yet. Get back to work! + + Objectives.Add(new KillObjective(10, new[] { typeof(DireWolf) }, "dire wolves")); + + Rewards.Add(ItemReward.BagOfTrinkets); + } +} + +public class GuileIrkAndSpite : MLQuest +{ + public GuileIrkAndSpite() + { + Activated = true; + Title = 1074739; // Guile, Irk and Spite + Description = + 1074740; // You know them, don't you. The three? They look like you, you'll see. They looked like me, I remember, they looked like, well, you'll see. The three. They'll drive you mad too, if you let them. They are trouble, and they need to be slain. Seek them out. + RefusalMessage = + 1074745; // You just don't understand the gravity of the situation. If you did, you'd agree to my task. + InProgressMessage = + 1074746; // Perhaps I was unclear. You'll know them when you see them, because you'll see you, and you, and you. Hurry now. + CompletionMessage = + 1074747; // Are you one of THEM? Ahhhh! Oh, wait, if you were them, then you'd be me. So you're -- you. Good job! + + Objectives.Add(new KillObjective(1, new[] { typeof(Guile) }, "Guile")); + Objectives.Add(new KillObjective(1, new[] { typeof(Irk) }, "Irk")); + Objectives.Add(new KillObjective(1, new[] { typeof(Spite) }, "Spite")); + + Rewards.Add(ItemReward.Strongbox); + } +} + +public class Lissbet : BaseEscortable +{ + [Constructible] + public Lissbet() + { + } + + public Lissbet(Serial serial) + : base(serial) + { + } + + public override bool StaticMLQuester => true; + public override bool InitialInnocent => true; + public override string DefaultName => "Lissbet"; + + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell( + this, + pm, + Utility.RandomList( + 1074204, // Greetings seeker. I have an urgent matter for you, if you are willing. + 1074222 // Could I trouble you for some assistance? + ) + ); + } + + public override void InitBody() + { + SetStr(40, 50); + SetDex(70, 80); + SetInt(80, 90); + + Hue = Race.Human.RandomSkinHue(); + Female = true; + Body = 401; + + Title = "the flower girl"; + + HairItemID = 0x203D; + HairHue = 0x1BB; + } + + public override void InitOutfit() + { + AddItem(new Kilt(Utility.RandomYellowHue())); + AddItem(new FancyShirt(Utility.RandomYellowHue())); + AddItem(new Sandals()); + } + + public override void Serialize(IGenericWriter writer) + { + base.Serialize(writer); + + writer.Write(0); // version + } + + public override void Deserialize(IGenericReader reader) + { + base.Deserialize(reader); + + var version = reader.ReadInt(); + } +} + +[SerializationGenerator(0, false)] +public partial class GrandpaCharley : BaseCreature +{ + [Constructible] + public GrandpaCharley() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the farmer"; + Body = 400; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + var hairHue = 0x3B2 + Utility.Random(2); + Utility.AssignRandomHair(this, hairHue); + + FacialHairItemID = 0x203E; // Long Beard + FacialHairHue = hairHue; + + SetSkill(SkillName.ItemID, 80, 90); + + AddItem(new WideBrimHat(Utility.RandomNondyedHue())); + AddItem(new FancyShirt(Utility.RandomNondyedHue())); + AddItem(new LongPants(Utility.RandomNondyedHue())); + AddItem(new Sandals(Utility.RandomNeutralHue())); + AddItem(new ShepherdsCrook()); + AddItem(new Backpack()); + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "Grandpa Charley"; + public override bool CanTeach => true; +} + +[QuesterName("Jelrice (Ilshenar)")] +[SerializationGenerator(0, false)] +public partial class Jelrice : BaseCreature +{ + [Constructible] + public Jelrice() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the trader"; + Race = Race.Human; + Body = 0x191; + Female = true; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + AddItem(new Shoes(Utility.RandomNeutralHue())); + AddItem(new Skirt(Utility.RandomBlueHue())); + AddItem(new FancyShirt(Utility.RandomRedHue())); + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "Jelrice"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1074221); // Greetings! I have a small task for you good traveler. + } +} + +[QuesterName("Yorus (Ilshenar)")] +[SerializationGenerator(0, false)] +public partial class Yorus : BaseCreature +{ + [Constructible] + public Yorus() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the tinker"; + Race = Race.Human; + Body = 0x190; + Female = false; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + AddItem(new Shoes(Utility.RandomNeutralHue())); + AddItem(new LongPants(Utility.RandomBlueHue())); + AddItem(new FancyShirt(Utility.RandomOrangeHue())); + AddItem(new Cloak(Utility.RandomBrightHue())); + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "Yorus"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1074218); // Hey! I want to talk to you, now. } } diff --git a/Projects/UOContent/Engines/ML Quests/Definitions/Malas.cs b/Projects/UOContent/Engines/ML Quests/Definitions/Malas.cs index 56a595140..f10b02d09 100644 --- a/Projects/UOContent/Engines/ML Quests/Definitions/Malas.cs +++ b/Projects/UOContent/Engines/ML Quests/Definitions/Malas.cs @@ -1,79 +1,61 @@ +using ModernUO.Serialization; using Server.Engines.MLQuests.Objectives; using Server.Engines.MLQuests.Rewards; using Server.Items; using Server.Mobiles; -namespace Server.Engines.MLQuests.Definitions +namespace Server.Engines.MLQuests.Definitions; + +public class PointyEars : MLQuest { - public class PointyEars : MLQuest + public PointyEars() { - public PointyEars() - { - Activated = true; - Title = 1074640; // Pointy Ears - Description = - 1074641; // I've heard ... there's some that will pay a good bounty for pointed ears, much like we used to pay for each wolf skin. I've got nothing personal against these elves. It's just business. You want in on this? I'm not fussy who I work with. - RefusalMessage = 1074642; // Suit yourself. - InProgressMessage = 1074643; // I can't pay a bounty if you don't bring bag the ears. - CompletionMessage = 1074644; // Here to collect on a bounty? + Activated = true; + Title = 1074640; // Pointy Ears + Description = + 1074641; // I've heard ... there's some that will pay a good bounty for pointed ears, much like we used to pay for each wolf skin. I've got nothing personal against these elves. It's just business. You want in on this? I'm not fussy who I work with. + RefusalMessage = 1074642; // Suit yourself. + InProgressMessage = 1074643; // I can't pay a bounty if you don't bring bag the ears. + CompletionMessage = 1074644; // Here to collect on a bounty? - Objectives.Add(new CollectObjective(20, typeof(SeveredElfEars), 1032590)); // severed elf ears + Objectives.Add(new CollectObjective(20, typeof(SeveredElfEars), 1032590)); // severed elf ears - Rewards.Add(ItemReward.BagOfTrinkets); - } - } - - [QuesterName("Drithen (Umbra)")] - public class Drithen : BaseCreature - { - [Constructible] - public Drithen() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Fierce"; - Race = Race.Human; - Body = 0x190; - Female = false; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - AddItem(new Backpack()); - AddItem(new ElvenBoots(Utility.RandomNeutralHue())); - AddItem(new LongPants(Utility.RandomBlueHue())); - AddItem(new Tunic(Utility.RandomNeutralHue())); - AddItem(new Cloak(Utility.RandomBrightHue())); - - SetSkill(SkillName.Focus, 60.0, 80.0); - } - - public Drithen(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Drithen"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1074188); // Weakling! You are not up to the task I have. - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } + Rewards.Add(ItemReward.BagOfTrinkets); + } +} + +[QuesterName("Drithen (Umbra)")] +[SerializationGenerator(0, false)] +public partial class Drithen : BaseCreature +{ + [Constructible] + public Drithen() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Fierce"; + Race = Race.Human; + Body = 0x190; + Female = false; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + AddItem(new Backpack()); + AddItem(new ElvenBoots(Utility.RandomNeutralHue())); + AddItem(new LongPants(Utility.RandomBlueHue())); + AddItem(new Tunic(Utility.RandomNeutralHue())); + AddItem(new Cloak(Utility.RandomBrightHue())); + + SetSkill(SkillName.Focus, 60.0, 80.0); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Drithen"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1074188); // Weakling! You are not up to the task I have. } } diff --git a/Projects/UOContent/Engines/ML Quests/Definitions/MistakenIdentity.cs b/Projects/UOContent/Engines/ML Quests/Definitions/MistakenIdentity.cs index 42b2eed73..963c2df42 100644 --- a/Projects/UOContent/Engines/ML Quests/Definitions/MistakenIdentity.cs +++ b/Projects/UOContent/Engines/ML Quests/Definitions/MistakenIdentity.cs @@ -1,358 +1,304 @@ using System; +using ModernUO.Serialization; using Server.Engines.MLQuests.Items; using Server.Engines.MLQuests.Objectives; using Server.Engines.MLQuests.Rewards; using Server.Items; using Server.Mobiles; -namespace Server.Engines.MLQuests.Definitions +namespace Server.Engines.MLQuests.Definitions; + +public class MistakenIdentity : MLQuest { - public class MistakenIdentity : MLQuest + public MistakenIdentity() { - public MistakenIdentity() - { - Activated = true; - Title = 1074573; // Mistaken Identity - Description = - 1074574; // What do you want? Wonderful, another whining request for a refund on tuition. You know, experiences like that are invaluable ... and infrequent. Having the opportunity to test yourself under such realistic situations isn't something the college offers all students. Fine. Fine. You'll need to submit a refund request form in triplicate before I can return your 1,000,000 gold tuition. You'll need to get some signatures and a few other odds and ends. - RefusalMessage = 1074606; // If you're not willing to follow the proper process then go away. - InProgressMessage = 1074605; // You're not getting a refund without the proper forms and signatures. - CompletionMessage = 1074607; // Oh blast! Not another of those forms. I'm so sick of this endless paperwork. - CompletionNotice = CompletionNoticeShort; + Activated = true; + Title = 1074573; // Mistaken Identity + Description = + 1074574; // What do you want? Wonderful, another whining request for a refund on tuition. You know, experiences like that are invaluable ... and infrequent. Having the opportunity to test yourself under such realistic situations isn't something the college offers all students. Fine. Fine. You'll need to submit a refund request form in triplicate before I can return your 1,000,000 gold tuition. You'll need to get some signatures and a few other odds and ends. + RefusalMessage = 1074606; // If you're not willing to follow the proper process then go away. + InProgressMessage = 1074605; // You're not getting a refund without the proper forms and signatures. + CompletionMessage = 1074607; // Oh blast! Not another of those forms. I'm so sick of this endless paperwork. + CompletionNotice = CompletionNoticeShort; - Objectives.Add( - new DeliverObjective( - typeof(TuitionReimbursementForm), - 1, - "Tuition Reimbursement Form", - typeof(Gorrow) - ) - ); + Objectives.Add( + new DeliverObjective( + typeof(TuitionReimbursementForm), + 1, + "Tuition Reimbursement Form", + typeof(Gorrow) + ) + ); - Rewards.Add(new DummyReward(1074634)); // Tuition Reimbursement - } - - public override Type NextQuest => typeof(YouScratchMyBack); + Rewards.Add(new DummyReward(1074634)); // Tuition Reimbursement } - public class YouScratchMyBack : MLQuest + public override Type NextQuest => typeof(YouScratchMyBack); +} + +public class YouScratchMyBack : MLQuest +{ + public YouScratchMyBack() { - public YouScratchMyBack() - { - Activated = true; - Title = 1074608; // You Scratch My Back - Description = - 1074609; // Heh. Heheheh. Good one. You're not a Bedlam student and you're definitely not eligible for a tuition refund. Heheheh. That old witch Aernya doesn't see as well as she used to you know. Otherwise, she would have ... hmmm, wait a minute. I sense a certain 'opportunity' here. I'll sign your forms in return for a little help with a project of my own. What do you say? - RefusalMessage = 1074615; // Hehehe. Your choice. - InProgressMessage = - 1074616; // I'm something of a gourmet, you see. It's tough getting some of the ingredients, though. Bring me back some pixie legs, unicorn ribs and ki-rin brains and I'll sign your form. - CompletionMessage = - 1074617; // Oh excellent, you're back. I'll get the oven going. That thing about pixie legs, you see, is that they burn and dry out if you're not really careful. Taste just like chicken too! - CompletionNotice = CompletionNoticeShortReturn; + Activated = true; + Title = 1074608; // You Scratch My Back + Description = + 1074609; // Heh. Heheheh. Good one. You're not a Bedlam student and you're definitely not eligible for a tuition refund. Heheheh. That old witch Aernya doesn't see as well as she used to you know. Otherwise, she would have ... hmmm, wait a minute. I sense a certain 'opportunity' here. I'll sign your forms in return for a little help with a project of my own. What do you say? + RefusalMessage = 1074615; // Hehehe. Your choice. + InProgressMessage = + 1074616; // I'm something of a gourmet, you see. It's tough getting some of the ingredients, though. Bring me back some pixie legs, unicorn ribs and ki-rin brains and I'll sign your form. + CompletionMessage = + 1074617; // Oh excellent, you're back. I'll get the oven going. That thing about pixie legs, you see, is that they burn and dry out if you're not really careful. Taste just like chicken too! + CompletionNotice = CompletionNoticeShortReturn; - Objectives.Add(new CollectObjective(1, typeof(UnicornRibs), "Unicorn Ribs")); - Objectives.Add(new CollectObjective(2, typeof(KirinBrains), "Ki-Rin Brains")); - Objectives.Add(new CollectObjective(5, typeof(PixieLeg), "Pixie Leg")); + Objectives.Add(new CollectObjective(1, typeof(UnicornRibs), "Unicorn Ribs")); + Objectives.Add(new CollectObjective(2, typeof(KirinBrains), "Ki-Rin Brains")); + Objectives.Add(new CollectObjective(5, typeof(PixieLeg), "Pixie Leg")); - Rewards.Add(new DummyReward(1074634)); // Tuition Reimbursement - } - - public override Type NextQuest => typeof(FoolingAernya); - public override bool IsChainTriggered => true; + Rewards.Add(new DummyReward(1074634)); // Tuition Reimbursement } - public class FoolingAernya : MLQuest + public override Type NextQuest => typeof(FoolingAernya); + public override bool IsChainTriggered => true; +} + +public class FoolingAernya : MLQuest +{ + public FoolingAernya() { - public FoolingAernya() - { - Activated = true; - Title = 1074618; // Fooling Aernya - Description = - 1074619; // Now that I've signed your papers you'd better get back to that witch Aernya. Mmmm mmm smell those ribs! - RefusalMessage = 1074620; // Giving up on your scheme eh? Suit yourself. - InProgressMessage = - 1074621; // You better hurry back to Mistress Aernya with that signed form. The college only has so much money and with enough claims you may find yourself unable to get your tuition refunded. *wink* - CompletionMessage = 1074622; // What? Hrmph. Gorrow signed your form did he? Let me see that. *squint* - CompletionNotice = CompletionNoticeShort; + Activated = true; + Title = 1074618; // Fooling Aernya + Description = + 1074619; // Now that I've signed your papers you'd better get back to that witch Aernya. Mmmm mmm smell those ribs! + RefusalMessage = 1074620; // Giving up on your scheme eh? Suit yourself. + InProgressMessage = + 1074621; // You better hurry back to Mistress Aernya with that signed form. The college only has so much money and with enough claims you may find yourself unable to get your tuition refunded. *wink* + CompletionMessage = 1074622; // What? Hrmph. Gorrow signed your form did he? Let me see that. *squint* + CompletionNotice = CompletionNoticeShort; - Objectives.Add( - new DeliverObjective( - typeof(SignedTuitionReimbursementForm), - 1, - "Signed Tuition Reimbursement Form", - typeof(Aernya) - ) - ); + Objectives.Add( + new DeliverObjective( + typeof(SignedTuitionReimbursementForm), + 1, + "Signed Tuition Reimbursement Form", + typeof(Aernya) + ) + ); - Rewards.Add(new DummyReward(1074634)); // Tuition Reimbursement - } - - public override Type NextQuest => typeof(NotQuiteThatEasy); - public override bool IsChainTriggered => true; + Rewards.Add(new DummyReward(1074634)); // Tuition Reimbursement } - public class NotQuiteThatEasy : MLQuest + public override Type NextQuest => typeof(NotQuiteThatEasy); + public override bool IsChainTriggered => true; +} + +public class NotQuiteThatEasy : MLQuest +{ + public NotQuiteThatEasy() { - public NotQuiteThatEasy() - { - Activated = true; - Title = 1074623; // Not Quite That Easy - Description = - 1074624; // I wouldn't be too smug just yet, whiner. You still need Master Gnosos' signature before I can cut your refund. Last I heard, he's coordinating the recovery of the portions of the college that are currently overrun. *nasty smile* Off with you. - RefusalMessage = 1074626; // Coward. - InProgressMessage = 1074627; // What are you waiting for? The iron maiden is still the portal to Bedlam. - CompletionMessage = - 1074628; // Made it through did you? Did you happen to see Red Death out there? Big horse, skeletal ... burning eyes? No? What's this? Forms? FORMS? I'm up to my eyebrows in ravenous out-of-control undead and you want a signature? - CompletionNotice = CompletionNoticeShort; + Activated = true; + Title = 1074623; // Not Quite That Easy + Description = + 1074624; // I wouldn't be too smug just yet, whiner. You still need Master Gnosos' signature before I can cut your refund. Last I heard, he's coordinating the recovery of the portions of the college that are currently overrun. *nasty smile* Off with you. + RefusalMessage = 1074626; // Coward. + InProgressMessage = 1074627; // What are you waiting for? The iron maiden is still the portal to Bedlam. + CompletionMessage = + 1074628; // Made it through did you? Did you happen to see Red Death out there? Big horse, skeletal ... burning eyes? No? What's this? Forms? FORMS? I'm up to my eyebrows in ravenous out-of-control undead and you want a signature? + CompletionNotice = CompletionNoticeShort; - Objectives.Add( - new DeliverObjective( - typeof(SignedTuitionReimbursementForm), - 1, - "Signed Tuition Reimbursement Form", - typeof(MasterGnosos) - ) - ); + Objectives.Add( + new DeliverObjective( + typeof(SignedTuitionReimbursementForm), + 1, + "Signed Tuition Reimbursement Form", + typeof(MasterGnosos) + ) + ); - Rewards.Add(new DummyReward(1074634)); // Tuition Reimbursement - } - - public override Type NextQuest => typeof(ConvinceMe); - public override bool IsChainTriggered => true; - - public override void Generate() - { - base.Generate(); - - PutDeco(new BedlamTeleporter(), new Point3D(2067, 1371, -75), Map.Malas); - } - - public override void OnAccepted(MLQuestInstance instance) - { - instance.PlayerContext.BedlamAccess = true; // Permanent access - } + Rewards.Add(new DummyReward(1074634)); // Tuition Reimbursement } - public class ConvinceMe : MLQuest + public override Type NextQuest => typeof(ConvinceMe); + public override bool IsChainTriggered => true; + + public override void Generate() { - public ConvinceMe() - { - Activated = true; - Title = 1074629; // Convince Me - Description = - 1074630; // I'm not signing any forms until the situation here is under control. So, you can either help out or you can forget getting your tuition refund. Which will it be? Help control the shambling dead? - RefusalMessage = 1074631; // No signature for you. - InProgressMessage = - 1074632; // No signature for you until you kill off some of the shambling dead out there and destroy that blasted horse. - CompletionMessage = 1074633; // Pulled it off huh? Well then you've earned this signature! - CompletionNotice = CompletionNoticeShortReturn; + base.Generate(); - var bedlam = new QuestArea(1074835, "Bedlam"); // Bedlam - - Objectives.Add(new KillObjective(1, new[] { typeof(RedDeath) }, "Red Death", bedlam)); - Objectives.Add(new KillObjective(10, new[] { typeof(GoreFiend) }, "gore fiends", bedlam)); - Objectives.Add(new KillObjective(8, new[] { typeof(RottingCorpse) }, "rotting corpses", bedlam)); - - Rewards.Add(new DummyReward(1074634)); // Tuition Reimbursement - } - - public override Type NextQuest => typeof(TuitionReimbursement); - public override bool IsChainTriggered => true; + PutDeco(new BedlamTeleporter(), new Point3D(2067, 1371, -75), Map.Malas); } - public class TuitionReimbursement : MLQuest + public override void OnAccepted(MLQuestInstance instance) { - public TuitionReimbursement() - { - Activated = true; - Title = 1074634; // Tuition Reimbursement - Description = - 1074635; // Well, there you are. I've added my signature to that of Gorrow, so you should be set to return to Mistress Aernya and get your tuition refunded. - RefusalMessage = - 1074636; // Great! If you're going to stick around here, I know we have more tasks for you to perform. - InProgressMessage = - 1074637; // Just head out the main gates there and you'll find yourself embracing the iron maiden in the Bloodletter's Guild. - CompletionMessage = - 1074638; // *disinterested stare* What? Oh, you've gotten your form filled in. How nice. *glare* And I'd hoped you'd drop this charade before I was forced to rub your nose in it. *nasty smile* You're not even a student and as such, you're not eligible for a refund -- you've never paid tuition. For your services, Master Gnosos has recommended you receive pay. So here. Now go away. - CompletionNotice = CompletionNoticeShort; - - Objectives.Add( - new DeliverObjective( - typeof(CompletedTuitionReimbursementForm), - 1, - "Completed Tuition Reimbursement Form", - typeof(Aernya) - ) - ); - - Rewards.Add(ItemReward.Strongbox); - } - - public override bool IsChainTriggered => true; - } - - [QuesterName("Aernya (Umbra)")] - public class Aernya : BaseCreature - { - [Constructible] - public Aernya() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Mistress of Admissions"; - Race = Race.Human; - Body = 0x191; - Female = true; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - AddItem(new Backpack()); - AddItem(new Sandals(Utility.RandomNeutralHue())); - AddItem(new Skirt(Utility.RandomBool() ? 0x1 : 0x0)); - AddItem(new Cloak(Utility.RandomBrightHue())); - AddItem(new FancyShirt(Utility.RandomBool() ? 0x3B2 : 0x3B3)); - } - - public Aernya(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Aernya"; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - [QuesterName("Gorrow (Luna)")] - public class Gorrow : BaseCreature - { - [Constructible] - public Gorrow() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Mayor"; - Race = Race.Human; - Body = 0x190; - Female = false; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - AddItem(new Backpack()); - AddItem(new Shoes(0x1BB)); - AddItem(new Tunic(Utility.RandomNeutralHue())); - AddItem(new LongPants(0x901)); - AddItem(new Cloak(Utility.RandomRedHue())); - } - - public Gorrow(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Gorrow"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell( - this, - pm, - Utility.RandomList( - 1074200, // Thank goodness you are here, there's no time to lose. - 1074203 // Hello friend. I realize you are busy but if you would be willing to render me a service I can assure you that you will be judiciously renumerated. - ) - ); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - [QuesterName("Master Gnosos (Bedlam)")] - public class MasterGnosos : BaseCreature - { - [Constructible] - public MasterGnosos() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the necromancer"; - Race = Race.Human; - Body = 0x190; - Female = false; - Hue = 0x83E8; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - HairItemID = 0x2049; - FacialHairItemID = 0x204B; - - AddItem(new Backpack()); - AddItem(new Shoes(0x485)); - AddItem(new Robe(0x497)); - - SetSkill(SkillName.EvalInt, 60.0, 80.0); - SetSkill(SkillName.Inscribe, 60.0, 80.0); - SetSkill(SkillName.MagicResist, 60.0, 80.0); - SetSkill(SkillName.SpiritSpeak, 60.0, 80.0); - SetSkill(SkillName.Meditation, 60.0, 80.0); - SetSkill(SkillName.Necromancy, 60.0, 80.0); - } - - public MasterGnosos(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Master Gnosos"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1074186); // Come here, I have a task. - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } + instance.PlayerContext.BedlamAccess = true; // Permanent access + } +} + +public class ConvinceMe : MLQuest +{ + public ConvinceMe() + { + Activated = true; + Title = 1074629; // Convince Me + Description = + 1074630; // I'm not signing any forms until the situation here is under control. So, you can either help out or you can forget getting your tuition refund. Which will it be? Help control the shambling dead? + RefusalMessage = 1074631; // No signature for you. + InProgressMessage = + 1074632; // No signature for you until you kill off some of the shambling dead out there and destroy that blasted horse. + CompletionMessage = 1074633; // Pulled it off huh? Well then you've earned this signature! + CompletionNotice = CompletionNoticeShortReturn; + + var bedlam = new QuestArea(1074835, "Bedlam"); // Bedlam + + Objectives.Add(new KillObjective(1, new[] { typeof(RedDeath) }, "Red Death", bedlam)); + Objectives.Add(new KillObjective(10, new[] { typeof(GoreFiend) }, "gore fiends", bedlam)); + Objectives.Add(new KillObjective(8, new[] { typeof(RottingCorpse) }, "rotting corpses", bedlam)); + + Rewards.Add(new DummyReward(1074634)); // Tuition Reimbursement + } + + public override Type NextQuest => typeof(TuitionReimbursement); + public override bool IsChainTriggered => true; +} + +public class TuitionReimbursement : MLQuest +{ + public TuitionReimbursement() + { + Activated = true; + Title = 1074634; // Tuition Reimbursement + Description = + 1074635; // Well, there you are. I've added my signature to that of Gorrow, so you should be set to return to Mistress Aernya and get your tuition refunded. + RefusalMessage = + 1074636; // Great! If you're going to stick around here, I know we have more tasks for you to perform. + InProgressMessage = + 1074637; // Just head out the main gates there and you'll find yourself embracing the iron maiden in the Bloodletter's Guild. + CompletionMessage = + 1074638; // *disinterested stare* What? Oh, you've gotten your form filled in. How nice. *glare* And I'd hoped you'd drop this charade before I was forced to rub your nose in it. *nasty smile* You're not even a student and as such, you're not eligible for a refund -- you've never paid tuition. For your services, Master Gnosos has recommended you receive pay. So here. Now go away. + CompletionNotice = CompletionNoticeShort; + + Objectives.Add( + new DeliverObjective( + typeof(CompletedTuitionReimbursementForm), + 1, + "Completed Tuition Reimbursement Form", + typeof(Aernya) + ) + ); + + Rewards.Add(ItemReward.Strongbox); + } + + public override bool IsChainTriggered => true; +} + +[QuesterName("Aernya (Umbra)")] +[SerializationGenerator(0, false)] +public partial class Aernya : BaseCreature +{ + [Constructible] + public Aernya() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Mistress of Admissions"; + Race = Race.Human; + Body = 0x191; + Female = true; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + AddItem(new Backpack()); + AddItem(new Sandals(Utility.RandomNeutralHue())); + AddItem(new Skirt(Utility.RandomBool() ? 0x1 : 0x0)); + AddItem(new Cloak(Utility.RandomBrightHue())); + AddItem(new FancyShirt(Utility.RandomBool() ? 0x3B2 : 0x3B3)); + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "Aernya"; +} + +[QuesterName("Gorrow (Luna)")] +[SerializationGenerator(0, false)] +public partial class Gorrow : BaseCreature +{ + [Constructible] + public Gorrow() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Mayor"; + Race = Race.Human; + Body = 0x190; + Female = false; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + AddItem(new Backpack()); + AddItem(new Shoes(0x1BB)); + AddItem(new Tunic(Utility.RandomNeutralHue())); + AddItem(new LongPants(0x901)); + AddItem(new Cloak(Utility.RandomRedHue())); + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "Gorrow"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell( + this, + pm, + Utility.RandomList( + 1074200, // Thank goodness you are here, there's no time to lose. + 1074203 // Hello friend. I realize you are busy but if you would be willing to render me a service I can assure you that you will be judiciously renumerated. + ) + ); + } +} + +[QuesterName("Master Gnosos (Bedlam)")] +[SerializationGenerator(0, false)] +public partial class MasterGnosos : BaseCreature +{ + [Constructible] + public MasterGnosos() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the necromancer"; + Race = Race.Human; + Body = 0x190; + Female = false; + Hue = 0x83E8; + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + HairItemID = 0x2049; + FacialHairItemID = 0x204B; + + AddItem(new Backpack()); + AddItem(new Shoes(0x485)); + AddItem(new Robe(0x497)); + + SetSkill(SkillName.EvalInt, 60.0, 80.0); + SetSkill(SkillName.Inscribe, 60.0, 80.0); + SetSkill(SkillName.MagicResist, 60.0, 80.0); + SetSkill(SkillName.SpiritSpeak, 60.0, 80.0); + SetSkill(SkillName.Meditation, 60.0, 80.0); + SetSkill(SkillName.Necromancy, 60.0, 80.0); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Master Gnosos"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1074186); // Come here, I have a task. } } diff --git a/Projects/UOContent/Engines/ML Quests/Definitions/NewHavenSkillTraining.cs b/Projects/UOContent/Engines/ML Quests/Definitions/NewHavenSkillTraining.cs index 04a1a2f59..fd0401b94 100644 --- a/Projects/UOContent/Engines/ML Quests/Definitions/NewHavenSkillTraining.cs +++ b/Projects/UOContent/Engines/ML Quests/Definitions/NewHavenSkillTraining.cs @@ -1,2352 +1,1885 @@ using System.Collections.Generic; +using ModernUO.Serialization; using Server.Engines.MLQuests.Objectives; using Server.Engines.MLQuests.Rewards; using Server.Items; using Server.Mobiles; -namespace Server.Engines.MLQuests.Definitions +namespace Server.Engines.MLQuests.Definitions; + +public class CleansingOldHaven : MLQuest { - public class CleansingOldHaven : MLQuest + public CleansingOldHaven() { - public CleansingOldHaven() - { - Activated = true; - OneTimeOnly = true; - Title = 1077719; // Cleansing Old Haven - Description = - 1077722; // Head East out of town to Old Haven. Consecrate your weapon, cast Divine Fury, and battle monsters there until you have raised your Chivalry skill to 50.
------

Hail, friend. The life of a Paladin is a life of much sacrifice, humility, bravery, and righteousness. If you wish to pursue such a life, I have an assignment for you. Adventure east to Old Haven, consecrate your weapon, and lay to rest the undead that inhabit there.

Each ability a Paladin wishes to invoke will require a certain amount of "tithing points" to use. A Paladin can earn these tithing points by donating gold at a shrine or holy place. You may tithe at this shrine.

Return to me once you feel that you are worthy of the rank of Apprentice Paladin. - RefusalMessage = 1077723; // Farewell to you my friend. Return to me if you wish to live the life of a Paladin. - InProgressMessage = - 1077724; // There are still more undead to lay to rest. You still have more to learn. Return to me once you have done so. - CompletionMessage = - 1077726; // Well done, friend. While I know you understand Chivalry is its own reward, I would like to reward you with something that will protect you in battle. It was passed down to me when I was a lad. Now, I am passing it on you. It is called the Bulwark Leggings. Thank you for your service. - CompletionNotice = - 1077725; // You have achieved the rank of Apprentice Paladin. Return to Aelorn in New Haven to report your progress. + Activated = true; + OneTimeOnly = true; + Title = 1077719; // Cleansing Old Haven + Description = + 1077722; // Head East out of town to Old Haven. Consecrate your weapon, cast Divine Fury, and battle monsters there until you have raised your Chivalry skill to 50.
------

Hail, friend. The life of a Paladin is a life of much sacrifice, humility, bravery, and righteousness. If you wish to pursue such a life, I have an assignment for you. Adventure east to Old Haven, consecrate your weapon, and lay to rest the undead that inhabit there.

Each ability a Paladin wishes to invoke will require a certain amount of "tithing points" to use. A Paladin can earn these tithing points by donating gold at a shrine or holy place. You may tithe at this shrine.

Return to me once you feel that you are worthy of the rank of Apprentice Paladin. + RefusalMessage = 1077723; // Farewell to you my friend. Return to me if you wish to live the life of a Paladin. + InProgressMessage = + 1077724; // There are still more undead to lay to rest. You still have more to learn. Return to me once you have done so. + CompletionMessage = + 1077726; // Well done, friend. While I know you understand Chivalry is its own reward, I would like to reward you with something that will protect you in battle. It was passed down to me when I was a lad. Now, I am passing it on you. It is called the Bulwark Leggings. Thank you for your service. + CompletionNotice = + 1077725; // You have achieved the rank of Apprentice Paladin. Return to Aelorn in New Haven to report your progress. - Objectives.Add(new GainSkillObjective(SkillName.Chivalry, 500, true, true)); + Objectives.Add(new GainSkillObjective(SkillName.Chivalry, 500, true, true)); - Rewards.Add(new ItemReward(1077727, typeof(BulwarkLeggings))); // Bulwark Leggings - } + Rewards.Add(new ItemReward(1077727, typeof(BulwarkLeggings))); // Bulwark Leggings + } +} + +public class TheRudimentsOfSelfDefense : MLQuest +{ + public TheRudimentsOfSelfDefense() + { + Activated = true; + OneTimeOnly = true; + Title = 1077609; // The Rudiments of Self Defense + Description = + 1077610; // Head East out of town and go to Old Haven. Battle monster there until you have raised your Wrestling skill to 50.Listen up! If you want to learn the rudiments of self-defense, you need toughening up, and there's no better way to toughen up than engaging in combat. Head East out of town to Old Haven and battle the undead there in hand to hand combat. Afraid of dying, you say? Well, you should be! Being an adventurer isn't a bed of posies, or roses, or however that saying goes. If you take a dirt nap, go to one of the nearby wandering healers and they'll get you back on your feet.Come back to me once you feel that you are worthy of the rank Apprentice Wrestler and i will reward you wit a prize. + RefusalMessage = + 1077611; // Ok, featherweight. come back to me if you want to learn the rudiments of self-defense. + InProgressMessage = + 1077630; // You have not achived the rank of Apprentice Wrestler. Come back to me once you feel that you are worthy of the rank Apprentice Wrestler and i will reward you with something useful. + CompletionMessage = + 1077613; // It's about time! Looks like you managed to make it through your self-defense training. As i promised, here's a little something for you. When worn, these Gloves of Safeguarding will increase your awareness and resistances to most elements except poison. Oh yeah, they also increase your natural health regeneration aswell. Pretty handy gloves, indeed. Oh, if you are wondering if your meditation will be hinered while wearing these gloves, it won't be. Mages can wear cloth and leather items without needing to worry about that. Now get out of here and make something of yourself. + CompletionNotice = + 1077612; // You have achieved the rank of Apprentice Wrestler. Return to Dimethro in New Haven to receive your prize. + + Objectives.Add(new GainSkillObjective(SkillName.Wrestling, 500, true, true)); + + Rewards.Add(new ItemReward(1077614, typeof(GlovesOfSafeguarding))); // Gloves Of Safeguarding + } +} + +public class CrushingBonesAndTakingNames : MLQuest +{ + public CrushingBonesAndTakingNames() + { + Activated = true; + OneTimeOnly = true; + Title = 1078070; // Crushing Bones and Taking Names + Description = + 1078065; // Head East out of town and go to Old Haven. While wielding your mace,battle monster there until you have raised your Mace Fighting skill to 50. I see you want to learn a real weapon skill and not that toothpick training Jockles hasto offer. Real warriors are called Armsmen, and they wield mace weapons. No doubt about it. Nothing is more satisfying than knocking the wind out of your enemies, smashing there armor, crushing their bones, and taking there names. Want to learn how to wield a mace? Well i have an assignment for you. Head East out of town and go to Old Haven. Undead have plagued the town, so there are plenty of bones for you to smash there. Come back to me after you have ahcived the rank of Apprentice Armsman, and i will reward you with a real weapon. + RefusalMessage = + 1078068; // I thought you wanted to be an Armsman and really make something of yourself. You have potential, kid, but if you want to play with toothpicks, run to Jockles and he will teach you how to clean your teeth with a sword. If you change your mind, come back to me, and i will show you how to wield a real weapon. + InProgressMessage = + 1078067; // Listen kid. There are a lot of undead in Old Haven, and you haven't smashed enough of them yet. So get back there and do some more cleansing. + CompletionMessage = + 1078069; // Now that's what I'm talking about! Well done! Don't you like crushing bones and taking names? As i promised, here is a war mace for you. It hits hard. It swings fast. It hits often. What more do you need? Now get out of here and crush some more enemies! + CompletionNotice = + 1078068; // You have achieved the rank of Apprentice Armsman. Return to Churchill in New Haven to claim your reward. + + Objectives.Add(new GainSkillObjective(SkillName.Macing, 500, true, true)); + + Rewards.Add(new ItemReward(1078062, typeof(ChurchillsWarMace))); // Churchill's War Mace + } +} + +public class SwiftAsAnArrow : MLQuest +{ + public SwiftAsAnArrow() + { + Activated = true; + OneTimeOnly = true; + Title = 1078201; // Swift as an Arrow + Description = + 1078205; // Head East out of town and go to Old Haven. While wielding your bow or crossbow, battle monster there until you have raised your Archery skill to 50. Well met, friend. Imagine yourself in a distant grove of trees, You raise your bow, take slow, careful aim, and with the twitch of a finger, you impale your prey with a deadly arrow. You look like you would make a excellent archer, but you will need practice. There is no better way to practice Archery than when you life is on the line. I have a challenge for you. Head East out of town and go to Old Haven. While wielding your bow or crossbow, battle the undead that reside there. Make sure you bring a healthy supply of arrows (or bolts if you prefer a crossbow). If you wish to purchase a bow, crossbow, arrows, or bolts, you can purchase them from me or the Archery shop in town. You can also make your own arrows with the Bowcraft/Fletching skill. You will need fletcher's tools, wood to turn into sharft's, and feathers to make arrows or bolts. Come back to me after you have achived the rank of Apprentice Archer, and i will reward you with a fine Archery weapon. + RefusalMessage = + 1078206; // I understand that Archery may not be for you. Feel free to visit me in the future if you change your mind. + InProgressMessage = 1078207; // You're doing great as an Archer! however, you need more practice. + CompletionMessage = + 1078209; // Congratulation! I want to reward you for your accomplishment. Take this composite bow. It is called " Heartseeker". With it, you will shoot with swiftness, precision, and power. I hope "Heartseeker" serves you well. + CompletionNotice = + 1078208; // You have achieved the rank of Apprentice Archer. Return to Robyn in New Haven to claim your reward. + + Objectives.Add(new GainSkillObjective(SkillName.Archery, 500, true, true)); + + Rewards.Add(new ItemReward(1078210, typeof(Heartseeker))); // Heartseeker + } +} + +public class EnGuarde : MLQuest +{ + public EnGuarde() + { + Activated = true; + OneTimeOnly = true; + Title = 1078186; // En Guarde! + Description = + 1078190; // Head East out of town to Old Haven. Battle monsters there until you have raised your Fencing skill to 50.
------

Well hello there, lad. Fighting with elegance and precision is far more enriching than slugging an enemy with a club or butchering an enemy with a sword. Learn the art of Fencing if you want to master combat and look good doing it!

The key to being a successful fencer is to be the complement and not the opposition to your opponent's strength. Watch for your opponent to become off balance. Then finish him off with finesse and flair.

There are some undead that need cleansing out in Old Haven towards the East. Head over there and slay them, but remember, do it with style!

Come back to me once you have achieved the rank of Apprentice Fencer, and I will reward you with a prize. + RefusalMessage = + 1078191; // I understand, lad. Being a hero isn't for everyone. Run along, then. Come back to me if you change your mind. + InProgressMessage = + 1078192; // You're doing well so far, but you're not quite ready yet. Head back to Old Haven, to the East, and kill some more undead. + CompletionMessage = + 1078194; // Excellent! You are beginning to appreciate the art of Fencing. I told you fighting with elegance and precision is more enriching than fighting like an ogre.

Since you have returned victorious, please take this war fork and use it well. The war fork is a finesse weapon, and this one is magical! I call it "Recaro's Riposte". With it, you will be able to parry and counterstrike with ease! Your enemies will bask in your greatness and glory! Good luck to you, lad, and keep practicing! + CompletionNotice = + 1078193; // You have achieved the rank of Apprentice Fencer. Return to Recaro in New Haven to claim your reward. + + Objectives.Add(new GainSkillObjective(SkillName.Fencing, 500, true, true)); + + Rewards.Add(new ItemReward(1078195, typeof(RecarosRiposte))); // Recaro's Riposte + } +} + +public class TheArtOfWar : MLQuest +{ + public TheArtOfWar() + { + Activated = true; + OneTimeOnly = true; + Title = 1077667; // The Art of War + Description = + 1077670; // Head East out of town to Old Haven. Battle monsters there until you have raised your Tactics skill to 50.
------

Knowing how to hold a weapon is only half of the battle. The other half is knowing how to use it against an opponent. It's one thing to kill a few bunnies now and then for fun, but a true warrior knows that the right moves to use against a lich will pretty much get your arse fried by a dragon.

I'll help teach you how to fight so that when you do come up against that dragon, maybe you won't have to walk out of there "OooOOooOOOooOO'ing" and looking for a healer.

There are some undead that need cleaning out in Old Haven towards the east. Why don't you head on over there and practice killing things?

When you feel like you've got the basics down, come back to me and I'll see if I can scrounge up an item to help you in your adventures later on. + RefusalMessage = + 1077671; // That's too bad. I really thought you had it in you. Well, I'm sure those undead will still be there later, so if you change your mind, feel free to stop on by and I'll help you the best I can. + InProgressMessage = + 1077672; // You're making some progress, that i can tell, but you're not quite good enough to last for very long out there by yourself. Head back to Old Haven, to the east, and kill some more undead. + CompletionMessage = + 1077674; // Hey, good job killing those undead! Hopefully someone will come along and clean up the mess. All that blood and guts tends to stink after a few days, and when the wind blows in from the east, it can raise a mighty stink!

Since you performed valiantly, please take these arms and use them well. I've seen a few too many harvests to be running around out there myself, so you might as well take it.

There is a lot left for you to learn, but I think you'll do fine. Remember to keep your elbows in and stick'em where it hurts the most! + CompletionNotice = + 1077673; // You have achieved the rank of Apprentice Warrior. Return to Alden Armstrong in New Haven to claim your reward. + + Objectives.Add(new GainSkillObjective(SkillName.Tactics, 500, true, true)); + + Rewards.Add(new ItemReward(1077675, typeof(ArmsOfArmstrong))); // Arms of Armstrong + } +} + +public class TheWayOfTheBlade : MLQuest +{ + public TheWayOfTheBlade() + { + Activated = true; + OneTimeOnly = true; + Title = 1077658; // The way of The Blade + Description = + 1077661; // Head East out of town and go to Old Haven. While wielding your sword, battle monster there until you have raised your Swordsmanship skill to 50. *as you approach, you notice Jockles sizing you up with a skeptical look on his face* i can see you want to learn how to handle a blade. It's a lot harder than it looks, and you're going to have to put alot of time and effort if you ever want to be half as good as i am. I'll tell you what, kid, I'll help you get started, but you're going to have to do all the work if you want to learn something. East of here, outside of town, is Old Haven. It's been overrun with the nastiest of undead you've seen, which makes it a perfect place for you to turn that sloppy grin on your face into actual skill at handling a sword. Make sure you have a sturdy Swordsmanship weapon in good repair before you leave. 'tis no fun to travel all the way down there just to find out you forgot your blade! When you feel that you've cut down enough of those foul smelling things to learn how to handle a blade without hurting yourself, come back to me. If i think you've improved enough, I'll give you something suited for a real warrior. + RefusalMessage = + 1077662; // Ha! I had a feeling you were a lily-livered pansy. You might have potential, but you're scared by a few smelly undead, maybe it's better that you stay away from sharp objects. After all, you wouldn't want to hurt yourself swinging a sword. If you change your mind, I might give you another chance...maybe. + InProgressMessage = + 1077663; // *Jockles looks you up and down* Come on! You've got to work harder than that to get better. Now get out of here, go kill some more of those undead to the east in Old Haven, and don't come back till you've got real skill. + CompletionMessage = + 1077665; // Well, well, look at what we have here! You managed to do it after all. I have to say, I'm a little surprised that you came back in one piece, but since you did. I've got a little something for you. This is a fine blade that served me well in my younger days. Of course I've got much better swords at my disposal now, so I'll let you go ahead and use it under one condition. Take goodcare of it and treat it with the respect that a fine sword deserves. You're one of the quickers learners I've seen, but you still have a long way to go. Keep at it, and you'll get there someday. Happy hunting, kid. + CompletionNotice = + 1077664; // You have achieved the rank of Apprentice Swordsman. Return to Jockles in New Haven to see what kind of reward he has waiting for you. Hopefully he'll be a little nicer this time! + + Objectives.Add(new GainSkillObjective(SkillName.Swords, 500, true, true)); + + Rewards.Add(new ItemReward(1077666, typeof(JocklesQuicksword))); // Jockles' Quicksword + } +} + +public class ThouAndThineShield : MLQuest +{ + public ThouAndThineShield() + { + Activated = true; + OneTimeOnly = true; + Title = 1077704; // Thou and Thine Shield + Description = + 1077707; // Head East out of town and go to Old Haven. Battle monsters, or simply let them hit you, while holding a shield or a weapon until you have raised your Parrying skill to 50. Oh, hello. You probably want me to teach you how to parry, don't you? Very Well. First, you'll need a weapon or a shield. Obviously shields work best of all, but you can parry with a 2-handed weapon. Or if you're feeling particularly brave, a 1-handed weapon will do in a pinch, I'd advise you to go to Old Haven, which you'll find to the East, and practice blocking incoming blows from the undead there. You'll learn quickly if you have more than one opponent attacking you at the same time to practice parrying lots of blows at once. That's the quickest way to master the art of parrying. If you manage to improve your skill enough, i have a shield that you might find useful. Come back to me when you've trained to an apprentice level. + RefusalMessage = + 1077708; // It's your choice, obviously, but I'd highly suggest that you learn to parry before adventuring out into the world. Come talk to me again when you get tired of being beat on by your opponents + InProgressMessage = + 1077709; // You're doing well, but in my opinion, I Don't think you really want to continue on without improving your parrying skill a bit more. Go to Old Haven, to the East, and practice blocking blows with a shield. + CompletionMessage = + 1077711; // Well done! You're much better at parrying blows than you were when we first met. You should be proud of your new ability and I bet your body is greatful to you aswell. *Tyl Ariadne laughs loudly at his ownn (mostly lame) joke* Oh yes, I did promise you a shield if I thought you were worthy of having it, so here you go. My father made these shields for the guards who served my father faithfully for many years, and I just happen to have obe that i can part with. You should find it useful as you explore the lands.Good luck, and may the Virtues be your guide. + CompletionNotice = + 1077710; // You have achieved the rank of Apprentice Warrior (for Parrying). Return to Tyl Ariadne in New Haven as soon as you can to claim your reward. + + Objectives.Add(new GainSkillObjective(SkillName.Parry, 500, true, true)); + + Rewards.Add(new ItemReward(1077694, typeof(EscutcheonDeAriadne))); // Escutcheon de Ariadne + } +} + +public class DefyingTheArcane : MLQuest +{ + public DefyingTheArcane() + { + Activated = true; + OneTimeOnly = true; + Title = 1077621; // Defying the Arcane + Description = + 1077623; // Head East out of town and go to Old Haven. Battle spell casting monsters there until you have raised your Resisting Spells skill to 50.
------

Hail and well met! To become a true master of the arcane art of Magery, I suggest learning the complementary skill known as Resisting Spells. While the name of this skill may suggest that it helps with resisting all spells, this is not the case. This skill helps you lessen the severity of spells that lower your stats or ones that last for a specific duration of time. It does not lessen damage from spells such as Energy Bolt or Flamestrike.

The Magery spells that can be resisted are Clumsy, Curse, Feeblemind, Mana Drain, Mana Vampire, Paralyze, Paralyze Field, Poison, Poison Field, and Weaken.

The Necromancy spells that can be resisted are Blood Oath, Corpse Skin, Mind Rot, and Pain Spike.

At higher ranks, the Resisting Spells skill also benefits you by adding a bonus to your minimum elemental resists. This bonus is only applied after all other resist modifications - such as from equipment - has been calculated. It's also not cumulative. It compares the number of your minimum resists to the calculated value of your modifications and uses the higher of the two values.

As you can see, Resisting Spells is a difficult skill to understand, and even more difficult to master. This is because in order to improve it, you will have to put yourself in harm's way - as in the path of one of the above spells.

Undead have plagued the town of Old Haven. We need your assistance in cleansing the town of this evil influence. Old Haven is located east of here. Battle the undead spell casters that inhabit there.

Comeback to me once you feel that you are worthy of the rank of Apprentice Mage and I will reward you with an arcane prize. + RefusalMessage = + 1077624; // The ability to resist powerful spells is a taxing experience. I understand your resistance in wanting to pursue it. If you wish to reconsider, feel free to return to me for Resisting Spells training. Good journey to you! + InProgressMessage = + 1077632; // You have not achieved the rank of Apprentice Mage. Come back to me once you feel that you are worthy of the rank of Apprentice Mage and I will reward you with an arcane prize. + CompletionMessage = + 1077626; // You have successfully begun your journey in becoming a true master of Magery. On behalf of the New Haven Mage Council I wish to present you with this bracelet. When worn, the Bracelet of Resilience will enhance your resistances vs. the elements, physical, and poison harm. The Bracelet of Resilience also magically enhances your ability fend off ranged and melee attacks. I hope it serves you well. + CompletionNotice = + 1077625; // You have achieved the rank of Apprentice Mage (for Resisting Spells). Return to Alefian in New Haven to receive your arcane prize. + + Objectives.Add(new GainSkillObjective(SkillName.MagicResist, 500, true, true)); + + Rewards.Add(new ItemReward(1077627, typeof(BraceletOfResilience))); // Bracelet of Resilience + } +} + +public class StoppingTheWorld : MLQuest +{ + public StoppingTheWorld() + { + Activated = true; + OneTimeOnly = true; + Title = 1077597; // Stopping the World + Description = + 1077598; // Head East out of town and go to Old Haven. Use spells and abilities to deplete your mana and meditate there until you have raised your Meditation skill to 50. Well met! I can teach you how to 'Stop the World' around you and focus your inner energies on replenishing you mana. What is mana? Mana is the life force for everyone who practices arcane arts. When a practitioner of magic invokes a spell or scribes a scroll. It consumes mana. Having a abundant supply of mana is vital to excelling as a practitioner of the arcane. Those of us who study the art of Meditation are also known as stotics. The Meditation skill allows stoics to increase the rate at which they regenerate mana A Stoic needs to perform abilities or cast spells to deplete mana before he can meditate to replenish it. Meditation can occur passively or actively. Actively Meditation is more difficult to master but allows for the stoic to replenish mana at a significantly faster rate. Metal armor inerferes with the regenerative properties of Meditation. It is wise to wear leather or cloth protection when meditating. Head east out of town and go to Old Haven. Use spells and abilities to deplete your mana and actively meditate to replenish it. Come back once you feel you are at the worthy rank of Apprentice Stoic and i will reward you with a arcane prize. + RefusalMessage = 1077599; // Seek me out if you ever wish to study the art of Meditation. Good journey. + InProgressMessage = + 1077628; // You have not achieved the rank of Apprentice Stoic. Come back to me once you feel that you are worthy of the rank Apprentice Stoic and i will reward you with a arcane prize. + CompletionMessage = + 1077626; // You have successfully begun your journey in becoming a true master of Magery. On behalf of the New Haven Mage Council I wish to present you with this bracelet. When worn, the Bracelet of Resilience will enhance your resistances vs. the elements, physical, and poison harm. The Bracelet of Resilience also magically enhances your ability fend off ranged and melee attacks. I hope it serves you well. + CompletionNotice = + 1077600; // You have achieved the rank of Apprentice Stoic (for Meditation). Return to Gustar in New Haven to receive your arcane prize. + + Objectives.Add(new GainSkillObjective(SkillName.Meditation, 500, true, true)); + + Rewards.Add(new ItemReward(1077602, typeof(PhilosophersHat))); // Philosopher's Hat + } +} + +public class ScribingArcaneKnowledge : MLQuest +{ + public ScribingArcaneKnowledge() + { + Activated = true; + OneTimeOnly = true; + Title = 1077615; // Scribing Arcane Knowledge + Description = + 1077616; // While here at the New Haven Magery Library, use a scribe's pen and scribe and 3rd and 4th circle Magery scrolls that you have in your spellbook. Remember, you will need blank scrolls as well. Do this until you have raised your Inscription skill to 50.
------

Greetings and welcome to the New Haven Magery Library! You wish to learn how to scribe spell scrolls? You have come to the right place! Inscribed in a steady hand and imbued with the power of reagents, a scroll can mean the difference between life and death in a perilous situation. Those knowledgeable in Inscription may transcribe spells to create useful and valuable magical scrolls.

Before you inscribe a spell, you must first be able to cast the spell without the aid of a scroll. This means that you need the appropriate level of proficiency as a mage, the required mana, and the required reagents. Second, you will need a blank scroll to write on and a scribe's pen. Then, you will need to decide which particular spell you wish to scribe. It may sound easy, but there is a bit more to it. As with the development of all skills, you need to practice Inscription of lower level spells before you can move onto the more difficult ones.

The most important aspect of Inscription is mana. Inscribing a scroll with a magic spell drains your mana. When inscribing 3rd circle or lower spells this will not be much of a problem for these spells consume a small amount of mana. However, when you are inscribing higher circle spells, you may see your mana drain rapidly. When this happens, pause or meditate before continuing.

I suggest you begin scribing any 3rd and 4th circle spells that you know. If you don't possess any, you can always barter with one of the local mage merchants or a fellow adventurer that is a seasoned Scribe.

Come back to me once you feel that you are worthy of the rank of Apprentice Scribe and I will reward you with an arcane prize. + RefusalMessage = + 1077617; // I understand. When you are ready, feel free to return to me for Inscription training. Thanks for stopping by! + InProgressMessage = + 1077631; // You have not achieved the rank of Apprentice Scribe. Come back to me once you feel that you are worthy of the rank Apprentice Scribe and i will reward you with a arcane prize. + CompletionMessage = + 1077619; // Scribing is a very fulfilling pursuit. I am pleased to see you embark on this journey. You sling a pen well! On behalf of the New Haven Mage Council I wish to present you with this spellbook. When equipped, the Hallowed Spellbook greatly enhances the potency of your offensive spells when used against Undead. Be mindful, though. While this book is equipped, when you invoke your powerful spells and abilities vs. Humanoids such as other humans, orcs, ettins, trolls, and the like, your offensive spells will diminish in effectiveness. I suggest unequipping the Hallowed Spellbook when battling Humanoids. I hope this spellbook serves you well. + CompletionNotice = + 1077618; // You have achieved the rank of Apprentice Scribe. Return to Jillian in New Haven to receive your arcane prize. + + Objectives.Add(new GainSkillObjective(SkillName.Inscribe, 500, true, true)); + + Rewards.Add(new ItemReward(1077620, typeof(HallowedSpellbook))); // Hallowed Spellbook + } +} + +public class TheMagesApprentice : MLQuest +{ + public TheMagesApprentice() + { + Activated = true; + OneTimeOnly = true; + Title = 1077576; // The Mage's Apprentice + Description = + 1077577; // Head East out of town and go to Old Haven. Cast fireballs and lightning bolts against monsters there until you have raised your Magery skill to 50. Greetings. You seek to unlock the secrets of the arcane art of Magery. The New Haven Mage Council has an assignment for you. Undead have plagued the town of Old Haven. We need your assistance in cleansing the town of this evil influence. Old Haven is located east of here. I suggest using your offensive Magery spells such as Fireball and Lightning Bolt against the Undead that inhabit there. Make sure you have plenty of reagents before embarking on your journey. Reagents are required to cast Magery spells. You can purchase extra reagents at the nearby Reagent shop, or you can find reagents growing in the nearby wooded areas. You can see which reagents are required for each spell by looking in your spellbook. Come back to me once you feel that you are worthy of the rank of Apprentice Mage and I will reward you with an arcane prize. + RefusalMessage = + 1077578; // Very well, come back to me when you are ready to practice Magery. You have so much arcane potential. 'Tis a shame to see it go to waste. The New Haven Mage Council could really use your help. + InProgressMessage = + 1077579; // You have not achieved the rank of Apprentice Mage. Come back to me once you feel that you are worthy of the rank of Apprentice Mage and I will reward you with an arcane prize. + CompletionMessage = + 1077581; // Well done! On behalf of the New Haven Mage Council I wish to present you with this staff. Normally a mage must unequip weapons before spell casting. While wielding your new Ember Staff, however, you will be able to invoke your Magery spells. Even if you do not currently possess skill in Mace Fighting, the Ember Staff will allow you to fight as if you do. However, your Magery skill will be temporarily reduced while doing so. Finally, the Ember Staff occasionally smites a foe with a Fireball while wielding it in melee combat. I hope the Ember Staff serves you well. + CompletionNotice = + 1077580; // You have achieved the rank of Apprentice Mage. Return to Kaelynna in New Haven to receive your arcane prize. + + Objectives.Add(new GainSkillObjective(SkillName.Magery, 500, true, true)); + + Rewards.Add(new ItemReward(1077582, typeof(EmberStaff))); // Ember Staff + } +} + +public class ScholarlyTask : MLQuest +{ + public ScholarlyTask() + { + Activated = true; + OneTimeOnly = true; + Title = 1077603; // A Scholarly Task + Description = + 1077604; // Head East out of town and go to Old Haven. Use Evaluating Intelligence on all creatures you see there. You can also cast Magery spells as well to raise Evaluating Intelligence. Do these activities until you have raised your Evaluating Intelligence skill to 50.
------

Hello. Truly knowing your opponent is essential for landing your offensive spells with precision. I can teach you how to enhance the effectiveness of your offensive spells, but first you must learn how to size up your opponents intellectually. I have a scholarly task for you. Head East out of town and go to Old Haven. Use Evaluating Intelligence on all creatures you see there. You can also cast Magery spells as well to raise Evaluating Intelligence.

Come back to me once you feel that you are worthy of the rank of Apprentice Scholar and I will reward you with an arcane prize. + RefusalMessage = 1077605; // Return to me if you reconsider and wish to become an Apprentice Scholar. + InProgressMessage = + 1077629; // You have not achieved the rank of Apprentice Scholar. Come back to me once you feel that you are worthy of the rank of Apprentice Scholar and I will reward you with an arcane prize. + CompletionMessage = + 1077607; // You have completed the task. Well done. On behalf of the New Haven Mage Council I wish to present you with this ring. When worn, the Ring of the Savant enhances your intellectual aptitude and increases your mana pool. Your spell casting abilities will take less time to invoke and recovering from such spell casting will be hastened. I hope the Ring of the Savant serves you well. + CompletionNotice = + 1077606; // You have achieved the rank of Apprentice Scholar. Return to Mithneral in New Haven to receive your arcane prize. + + Objectives.Add(new GainSkillObjective(SkillName.EvalInt, 500, true, true)); + + Rewards.Add(new ItemReward(1077608, typeof(RingOfTheSavant))); // Ring of the Savant + } +} + +public class TheRightToolForTheJob : MLQuest +{ + public TheRightToolForTheJob() + { + Activated = true; + OneTimeOnly = true; + Title = 1077741; // The Right Tool for the Job + Description = + 1077744; // Create new scissors and hammers while inside Amelia's workshop. Try making scissors up to 45 skill, the switch to making hammers until 50 skill.
-----

Hello! I guess you're here to learn something about Tinkering, eh? You've come to the right place, as Tinkering is what I've dedicated my life to.

You'll need two things to get started: a supply of ingots and the right tools for the job. You can either buy ingots from the market, or go mine them yourself. As for tools, you can try making your own set of Tinker's Tools, or if you'd prefer to buy them, I have some for sale.

Working here in my shop will let me give you pointers as you go, so you'll be able to learn faster than anywhere else. Start off making scissors until you reach 45 tinkering skill, then switch to hammers until you've achieved 50. Once you've done that, come talk to me and I'll give you something for your hard work. + RefusalMessage = + 1077745; // I’m disappointed that you aren’t interested in learning more about Tinkering. It’s really such a useful skill!

*Amelia smiles*

At least you know where to find me if you change your mind, since I rarely spend time outside of this shop. + InProgressMessage = + 1077746; // Nice going! You're not quite at Apprentice Tinkering yet, though, so you better get back to work. Remember that the quickest way to learn is to make scissors up until 45 skill, and then switch to hammers. Also, don't forget that working here in my shop will let me give you tips so you can learn faster. + CompletionMessage = + 1077748; // You've done it! Look at our brand new Apprentice Tinker! You've still got quite a lot to learn if you want to be a Grandmaster Tinker, but I believe you can do it! Just keep in mind that if you're tinkering just to practice and improve your skill, make items that are moderately difficult (60-80% success chance), and try to stick to ones that use less ingots.

Come here, my brand new Apprentice Tinker, I want to give you something special. I created this just for you, so I hope you like it. It's a set of Tinker's Tools that contains a bit of magic. These tools have more charges than any Tinker's Tools a Tinker can make. You can even use them to make a normal set of tools, so that way you won't ever find yourself stuck somewhere with no tools! + CompletionNotice = + 1077747; // You have achieved the rank of Apprentice Tinker. Talk to Amelia Youngstone in New Haven to see what kind of reward she has waiting for you. + + Objectives.Add(new GainSkillObjective(SkillName.Tinkering, 500, true, true)); + + Rewards.Add(new ItemReward(1077749, typeof(AmeliasToolbox))); // Amelia’s Toolbox + } +} + +public class KnowThineEnemy : MLQuest +{ + public KnowThineEnemy() + { + Activated = true; + OneTimeOnly = true; + Title = 1077685; // Know Thine Enemy + Description = + 1077688; // Head East out of town to Old Haven. Battle monsters there, or heal yourself and other players, until you have raised your Anatomy skill to 50.
------

Hail and well met. You must be here to improve your knowledge of Anatomy. Well, you've come to the right place because I can teach you what you need to know. At least all you'll need to know for now. Haha!

Knowing about how living things work inside can be a very useful skill. Not only can you learn where to strike an opponent to hurt him the most, but you can use what you learn to heal wounds better as well. Just walking around town, you can even tell if someone is strong or weak or if they happen to be particularly dexterous or not.

If you're interested in learning more, I'd advise you to head out to Old Haven, just to the east, and jump into the fray. You'll learn best by engaging in combat while keeping you and your fellow adventurers healed, or you can even try sizing up your opponents.

While you're gone, I'll dig up something you may find useful. + RefusalMessage = + 1077689; // It's your choice, but I wouldn't head out there without knowing what makes those things tick inside! If you change your mind, you can find me right here dissecting frogs, cats or even the occasional unlucky adventurer. + InProgressMessage = + 1077690; // I'm surprised to see you back so soon. You've still got a ways to go if you want to really understand the science of Anatomy. Head out to Old Haven and practice combat and healing yourself or other adventurers. + CompletionMessage = + 1077692; // By the Virtues, you've done it! Congratulations mate! You still have quite a ways to go if you want to perfect your knowledge of Anatomy, but I know you'll get there someday. Just keep at it.

In the meantime, here's a piece of armor that you might find useful. It's not fancy, but it'll serve you well if you choose to wear it.

Happy adventuring, and remember to keep your cranium separate from your clavicle! + CompletionNotice = + 1077691; // You have achieved the rank of Apprentice Healer (for Anatomy). Return to Andreas Vesalius in New Haven as soon as you can to claim your reward. + + Objectives.Add(new GainSkillObjective(SkillName.Anatomy, 500, true, true)); + + Rewards.Add(new ItemReward(1077693, typeof(TunicOfGuarding))); // Tunic of Guarding + } +} + +public class BruisesBandagesAndBlood : MLQuest +{ + public BruisesBandagesAndBlood() + { + Activated = true; + OneTimeOnly = true; + Title = 1077676; // Bruises, Bandages and Blood + Description = + 1077679; // Head East out of town and go to Old Haven. Heal yourself and other players until you have raised your Healing skill to 50.
------

Ah, welcome to my humble practice. I am Avicenna, New Haven's resident Healer. A lot of adventurers head out into the wild from here, so I keep rather busy when they come back bruised, bleeding, or worse.

I can teach you how to bandage a wound, sure, but it's not a job for the queasy! For some folks, the mere sight of blood is too much for them, but it's something you'll get used to over time. It is one thing to cut open a living thing, but it's quite another to sew it back up and save it from sure death. 'Tis noble work, healing.

Best way for you to practice fixing up wounds is to head east out to Old Haven and either practice binding up your own wounds, or practice on someone else. Surely they'll be grateful for the assistance.

Make sure to take enough bandages with you! You don't want to run out in the middle of a tough fight. + RefusalMessage = + 1077680; // No? Are you sure? Well, when you feel that you're ready to practice your healing, come back to me. I'll be right here, fixing up adventurers and curing the occasional cold! + InProgressMessage = + 1077681; // Hail! 'Tis good to see you again. Unfortunately, you're not quite ready to call yourself an Apprentice Healer quite yet. Head back out to Old Haven, due east from here, and bandage up some wounds. Yours or someone else's, it doesn't much matter. + CompletionMessage = + 1077683; // Hello there, friend. I see you've returned in one piece, and you're an Apprentice Healer to boot! You should be proud of your accomplishment, as not everyone has "the touch" when it comes to healing.

I can't stand to see such good work go unrewarded, so I have something I'd like you to have. It's not much, but it'll help you heal just a little faster, and maybe keep you alive.

Good luck out there, friend, and don't forget to help your fellow adventurer whenever possible! + CompletionNotice = + 1077682; // You have achieved the rank of Apprentice Healer. Return to Avicenna in New Haven as soon as you can to claim your reward. + + Objectives.Add(new GainSkillObjective(SkillName.Healing, 500, true, true)); + + Rewards.Add(new ItemReward(1077684, typeof(HealersTouch))); // Healer's Touch + } +} + +public class TheInnerWarrior : MLQuest +{ + public TheInnerWarrior() + { + Activated = true; + OneTimeOnly = true; + Title = 1077696; // The Inner Warrior + Description = + 1077699; // Head East out of town to Old Haven. Expend stamina and mana until you have raised your Focus skill to 50.
------

Well, hello there. Don't you look like quite the adventurer!

You want to learn more about Focus, do you? I can teach you something about that, but first you should know that not everyone can be disciplined enough to excel at it. Focus is the ability to achieve inner balance in both body and spirit, so that you recover from physical and mental exertion faster than you otherwise would.

If you want to practice Focus, the best place to do that is east of here, in Old Haven, where you'll find an undead infestation. Exert yourself physically by engaging in combat and moving quickly. For testing your mental balance, expend mana in whatever way you find most suitable to your abilities. Casting spells and using abilities work well for consuming your mana.

Go. Train hard, and you will find that your concentration will improve naturally. When you've improved your ability to focus yourself at an Apprentice level, come back to me and I shall give you something worthy of your new ability. + RefusalMessage = + 1077700; // I'm disappointed. You have a lot of inner potential, and it would pain me greatly to see you waste that. Oh well. If you change your mind, I'll be right here. + InProgressMessage = + 1077701; // Hello again. I see you've returned, but it seems that your Focus skill hasn't improved as much as it could have. Just head east, to Old Haven, and exert yourself physically and mentally as much as possible. To do this physically, engage in combat and move as quickly as you can. For exerting yourself mentally, expend mana in whatever way you find most suitable to your abilities. Casting spells and using abilities work well for consuming your mana.

Return to me when you have gained enough Focus skill to be considered an Apprentice Stoic. + CompletionMessage = + 1077703; // Look who it is! I knew you could do it if you just had the discipline to apply yourself. It feels good to recover from battle so quickly, doesn't it? Just wait until you become a Grandmaster, it's amazing!

Please take this gift, as you've more than earned it with your hard work. It will help you recover even faster during battle, and provides a bit of protection as well.

You have so much more potential, so don't stop trying to improve your Focus now! Safe travels! + CompletionNotice = + 1077702; // You have achieved the rank of Apprentice Stoic (for Focus). Return to Sarsmea Smythe in New Haven to see what kind of reward she has waiting for you. + + Objectives.Add(new GainSkillObjective(SkillName.Focus, 500, true, true)); + + Rewards.Add(new ItemReward(1077695, typeof(ClaspOfConcentration))); // Clasp of Concentration + } +} + +public class TheArtOfStealth : MLQuest +{ + public TheArtOfStealth() + { + Activated = true; + OneTimeOnly = true; + Title = 1078154; // The Art of Stealth + Description = + 1078158; // Head East out of town and go to Old Haven. While wielding your fencing weapon, battle monsters with focus attack and summon mirror images up to 40 Ninjitsu skill, and continue practicing focus attack on monsters until 50 Ninjitsu skill.
------

Welcome, young one. You seek to learn Ninjitsu. With it, and the book of Ninjitsu, a Ninja can evoke a number of special abilities including transforming into a variety of creatures that give unique bonuses, using stealth to attack unsuspecting opponents or just plain disappear into thin air! If you do not have a book of Ninjitsu, you can purchase one from me.

I have an assignment for you. Head East out of town and go to Old Haven. While wielding your fencing weapon, battle monsters with focus attack and summon mirror images up to Novice rank, and continue focusing your attacks for greater damage on monsters until you become an Apprentice Ninja. Each image will absorb one attack. The art of deception is a strong defense. Use it wisely.

Come back to me once you have achieved the rank of Apprentice Ninja, and I shall reward you with something useful. + RefusalMessage = 1078159; // Come back to me if you with to learn Ninjitsu in the future. + InProgressMessage = + 1078160; // You have not achieved the rank of Apprentice Ninja. Come back to me once you have done so. + CompletionMessage = + 1078162; // You have done well, young one. Please accept this kryss as a gift. It is called the "Silver Serpent Blade". With it, you will strike with precision and power. This should aid you in your journey as a Ninja. Farewell. + CompletionNotice = + 1078161; // You have achieved the rank of Apprentice Ninja. Return to Ryuichi in New Haven to see what kind of reward he has waiting for you. + + Objectives.Add(new GainSkillObjective(SkillName.Ninjitsu, 500, true, true)); + + Rewards.Add(new ItemReward(1078163, typeof(SilverSerpentBlade))); // Silver Serpent Blade + } +} + +public class BecomingOneWithTheShadows : MLQuest +{ + public BecomingOneWithTheShadows() + { + Activated = true; + OneTimeOnly = true; + Title = 1078164; // Becoming One with the Shadows + Description = + 1078168; // Practice hiding in the Ninja Dojo until you reach 50 Hiding skill.
------

Come closer. Don't be afraid. The shadows will not harm you. To be a successful Ninja, you must learn to become one with the shadows. The Ninja Dojo is the ideal place to learn the art of concealment. Practice hiding here.

Talk to me once you have achieved the rank of Apprentice Rogue (for Hiding), and I shall reward you. + RefusalMessage = 1078169; // If you wish to become one with the shadows, come back and talk to me. + InProgressMessage = + 1078170; // You have not achieved the rank of Apprentice Rogue (for Hiding). Talk to me when you feel you have accomplished this. + CompletionMessage = + 1078172; // Not bad at all. You have learned to control your fear of the dark and you are becoming one with the shadows. If you haven't already talked to Jun, I advise you do so. Jun can teach you how to stealth undetected. Hiding and Stealth are essential skills to master when becoming a Ninja.

As promised, I have a reward for you. Here are some smokebombs. As long as you are an Apprentice Ninja and have mana available you will be able to use them. They will allow you to hide while in the middle of combat. I hope these serve you well. + CompletionNotice = + 1078171; // You have achieved the rank of Apprentice Rogue (for Hiding). Return to Chiyo in New Haven to claim your reward. + + Objectives.Add(new GainSkillObjective(SkillName.Hiding, 500, true, true)); + + Rewards.Add(new ItemReward(1078173, typeof(BagOfSmokeBombs))); // Bag of Smoke Bombs + } +} + +public class WalkingSilently : MLQuest +{ + public WalkingSilently() + { + Activated = true; + OneTimeOnly = true; + Title = 1078174; // Walking Silently + Description = + 1078178; // Head East out of town and go to Old Haven. While wearing normal clothes, practice Stealth there until you reach 50 Stealth skill.
------

You there. You're not very quiet in your movements. I can help you with that. Not only must you must learn to become one with the shadows, but also you must learn to quiet your movements. Old Haven is the ideal place to learn how to Stealth.

Head East out of town and go to Old Haven. While wearing normal clothes, practice Stealth there. Stealth becomes more difficult as you wear heavier pieces of armor, so for now, only wear clothes while practicing Stealth.

You can only Stealth once you are hidden. If you become visible, use your Hiding skill, and begin slowing walking.

Come back to me once you have achieved the rank of Apprentice Rogue (for Stealth), and I will reward you with something useful. + RefusalMessage = 1078179; // If you want to learn to quiet your movements, talk to me, and I will help you. + InProgressMessage = + 1078180; // You have not achieved the rank of Apprentice Rogue (for Stealth). Come back to me when you feel you have accomplished this. + CompletionMessage = + 1078182; // Good. You have learned to quiet your movements. If you haven't already talked to Chiyo, I advise you do so. Chiyo can teach you how to become one with the shadows. Hiding and Stealth are essential skills to master when becoming a Ninja.

Here is your reward. This leather Ninja jacket is called "Twilight Jacket". It will offer greater protection to you. I hope this serve you well. + CompletionNotice = + 1078181; // You have achieved the rank of Apprentice Rogue (for Stealth). Return to Jun in New Haven to claim your reward. + + Objectives.Add(new GainSkillObjective(SkillName.Stealth, 500, true, true)); + + Rewards.Add(new ItemReward(1078183, typeof(TwilightJacket))); // Twilight Jacket + } +} + +public class EyesOfARanger : MLQuest +{ + public EyesOfARanger() + { + Activated = true; + OneTimeOnly = true; + Title = 1078211; // Eyes of a Ranger + Description = + 1078217; // Track animals, monsters, and people on Haven Island until you have raised your Tracking skill to 50.
------

Hello friend. I am Walker, Grandmaster Ranger. An adventurer needs to keep alive in the wilderness. Being able to track those around you is essential to surviving in dangerous places. Certain Ninja abilities are more potent when the Ninja possesses Tracking knowledge. If you want to be a Ninja, or if you simply want to get a leg up on the creatures that habit these parts, I advise you learn how to track them.

You can track any animals, monsters, or people on Haven Island. Clear your mind, focus, and note any tracks in the ground or sounds in the air that can help you find your mark. You can do it, friend. I have faith in you.

Come back to me once you have achieved the rank of Apprentice Ranger (for Tracking), and I will give you something that may help you in your travels. Take care, friend. + RefusalMessage = + 1078218; // Farewell, friend. Be careful out here. If you change your mind and want to learn Tracking, come back and talk to me. + InProgressMessage = + 1078219; // So far so good, kid. You are still alive, and you are getting the hang of Tracking. There are many more animals, monsters, and people to track. Come back to me once you have tracked them. + CompletionMessage = + 1078221; // I knew you could do it! You have become a fine Ranger. Just keep practicing, and one day you will become a Grandmaster Ranger. Just like me.

I have a little something for you that will hopefully aid you in your journeys. These leggings offer some resistances that will hopefully protect you from harm. I hope these serve you well. Farewell, friend. + CompletionNotice = + 1078220; // You have achieved the rank of Apprentice Ranger (for Tracking). Return to Walker in New Haven to claim your reward. + + Objectives.Add(new GainSkillObjective(SkillName.Tracking, 500, true, true)); + + Rewards.Add(new ItemReward(1078222, typeof(WalkersLeggings))); // Walker's Leggings + } +} + +public class TheWayOfTheSamurai : MLQuest +{ + public TheWayOfTheSamurai() + { + Activated = true; + OneTimeOnly = true; + Title = 1078007; // The Way of the Samurai + Description = + 1078010; // Head East out of town and go to Old Haven. use the Confidence defensive stance and attempt to honorably execute monsters there until you have raised your Bushido skill to 50.
------

Greetings. I see you wish to learn the Way of the Samurai. Wielding a blade is easy. Anyone can grasp a sword's hilt. Learning how to fight properly and skillfully is to become an Armsman. Learning how to master weapons, and even more importantly when not to use them, is the Way of the Warrior. The Way of the Samurai. The Code of the Bushido. That is why you are here.

Adventure East to Old Haven. Use the Confidence defensive stance and attempt to honorably execute the undead that inhabit there. You will need a book of Bushido to perform these abilities. If you do not possess a book of Bushido, you can purchase one from me.

If you fail to honorably execute the undead, your defenses will be greatly weakened: Resistances will suffer and Resisting Spells will suffer. A successful parry instantly ends the weakness. If you succeed, however, you will be infused with strength and healing. Your swing speed will also be boosted for a short duration. With practice, you will learn how to master your Bushido abilities.

Return to me once you feel that you have become an Apprentice Samurai. + RefusalMessage = 1078011; // Good journey to you. Return to me if you wish to live the life of a Samurai. + InProgressMessage = + 1078012; // You are not ready to become an Apprentice Samurai. There are still more undead to lay to rest. Return to me once you have done so. + CompletionMessage = + 1078014; // You have proven yourself young one. You will continue to improve as your skills are honed with age. You are an honorable warrior, worthy of the rank of Apprentice Samurai. Please accept this no-dachi as a gift. It is called "The Dragon's Tail". Upon a successful strike in combat, there is a chance this mighty weapon will replenish your stamina equal to the damage of your attack. I hope "The Dragon's Tail" serves you well. You have earned it. Farewell for now. + CompletionNotice = + 1078013; // You have achieved the rank of Apprentice Samurai. Return to Hamato in New Haven to report your progress. + + Objectives.Add(new GainSkillObjective(SkillName.Bushido, 500, true, true)); + + Rewards.Add(new ItemReward(1078015, typeof(TheDragonsTail))); // The Dragon's Tail + } +} + +public class TheAllureOfDarkMagic : MLQuest +{ + public TheAllureOfDarkMagic() + { + Activated = true; + OneTimeOnly = true; + Title = 1078036; // The Allure of Dark Magic + Description = + 1078039; // Head East out of town and go to Old Haven. Cast Evil Omen and Pain Spike against monsters there until you have raised your Necromancy skill to 50.
------

Welcome! I see you are allured by the dark magic of Necromancy. First, you must prove yourself worthy of such knowledge. Undead currently occupy the town of Old Haven. Practice your harmful Necromancy spells on them such as Evil Omen and Pain Spike.

Make sure you have plenty of reagents before embarking on your journey. Reagents are required to cast Necromancy spells. You can purchase extra reagents from me, or you can find reagents growing in the nearby wooded areas. You can see which reagents are required for each spell by looking in your spellbook.

Come back to me once you feel that you are worthy of the rank of Apprentice Necromancer and I will reward you with the knowledge you desire. + RefusalMessage = 1078040; // You are weak after all. Come back to me when you are ready to practice Necromancy. + InProgressMessage = + 1078041; // You have not achieved the rank of Apprentice Necromancer. Come back to me once you feel that you are worthy of the rank of Apprentice Necromancer and I will reward you with the knowledge you desire. + CompletionMessage = + 1078043; // You have done well, my young apprentice. Behold! I now present to you the knowledge you desire. This spellbook contains all the Necromancer spells. The power is intoxicating, isn't it? + CompletionNotice = + 1078042; // You have achieved the rank of Apprentice Necromancer. Return to Mulcivikh in New Haven to receive the knowledge you desire. + + Objectives.Add(new GainSkillObjective(SkillName.Necromancy, 500, true, true)); + + Rewards.Add(new InternalReward()); } - public class TheRudimentsOfSelfDefense : MLQuest + private class InternalReward : ItemReward { - public TheRudimentsOfSelfDefense() + public InternalReward() + : base(1078052, typeof(NecromancerSpellbook)) // Complete Necromancer Spellbook { - Activated = true; - OneTimeOnly = true; - Title = 1077609; // The Rudiments of Self Defense - Description = - 1077610; // Head East out of town and go to Old Haven. Battle monster there until you have raised your Wrestling skill to 50.Listen up! If you want to learn the rudiments of self-defense, you need toughening up, and there's no better way to toughen up than engaging in combat. Head East out of town to Old Haven and battle the undead there in hand to hand combat. Afraid of dying, you say? Well, you should be! Being an adventurer isn't a bed of posies, or roses, or however that saying goes. If you take a dirt nap, go to one of the nearby wandering healers and they'll get you back on your feet.Come back to me once you feel that you are worthy of the rank Apprentice Wrestler and i will reward you wit a prize. - RefusalMessage = - 1077611; // Ok, featherweight. come back to me if you want to learn the rudiments of self-defense. - InProgressMessage = - 1077630; // You have not achived the rank of Apprentice Wrestler. Come back to me once you feel that you are worthy of the rank Apprentice Wrestler and i will reward you with something useful. - CompletionMessage = - 1077613; // It's about time! Looks like you managed to make it through your self-defense training. As i promised, here's a little something for you. When worn, these Gloves of Safeguarding will increase your awareness and resistances to most elements except poison. Oh yeah, they also increase your natural health regeneration aswell. Pretty handy gloves, indeed. Oh, if you are wondering if your meditation will be hinered while wearing these gloves, it won't be. Mages can wear cloth and leather items without needing to worry about that. Now get out of here and make something of yourself. - CompletionNotice = - 1077612; // You have achieved the rank of Apprentice Wrestler. Return to Dimethro in New Haven to receive your prize. - - Objectives.Add(new GainSkillObjective(SkillName.Wrestling, 500, true, true)); - - Rewards.Add(new ItemReward(1077614, typeof(GlovesOfSafeguarding))); // Gloves Of Safeguarding - } - } - - public class CrushingBonesAndTakingNames : MLQuest - { - public CrushingBonesAndTakingNames() - { - Activated = true; - OneTimeOnly = true; - Title = 1078070; // Crushing Bones and Taking Names - Description = - 1078065; // Head East out of town and go to Old Haven. While wielding your mace,battle monster there until you have raised your Mace Fighting skill to 50. I see you want to learn a real weapon skill and not that toothpick training Jockles hasto offer. Real warriors are called Armsmen, and they wield mace weapons. No doubt about it. Nothing is more satisfying than knocking the wind out of your enemies, smashing there armor, crushing their bones, and taking there names. Want to learn how to wield a mace? Well i have an assignment for you. Head East out of town and go to Old Haven. Undead have plagued the town, so there are plenty of bones for you to smash there. Come back to me after you have ahcived the rank of Apprentice Armsman, and i will reward you with a real weapon. - RefusalMessage = - 1078068; // I thought you wanted to be an Armsman and really make something of yourself. You have potential, kid, but if you want to play with toothpicks, run to Jockles and he will teach you how to clean your teeth with a sword. If you change your mind, come back to me, and i will show you how to wield a real weapon. - InProgressMessage = - 1078067; // Listen kid. There are a lot of undead in Old Haven, and you haven't smashed enough of them yet. So get back there and do some more cleansing. - CompletionMessage = - 1078069; // Now that's what I'm talking about! Well done! Don't you like crushing bones and taking names? As i promised, here is a war mace for you. It hits hard. It swings fast. It hits often. What more do you need? Now get out of here and crush some more enemies! - CompletionNotice = - 1078068; // You have achieved the rank of Apprentice Armsman. Return to Churchill in New Haven to claim your reward. - - Objectives.Add(new GainSkillObjective(SkillName.Macing, 500, true, true)); - - Rewards.Add(new ItemReward(1078062, typeof(ChurchillsWarMace))); // Churchill's War Mace - } - } - - public class SwiftAsAnArrow : MLQuest - { - public SwiftAsAnArrow() - { - Activated = true; - OneTimeOnly = true; - Title = 1078201; // Swift as an Arrow - Description = - 1078205; // Head East out of town and go to Old Haven. While wielding your bow or crossbow, battle monster there until you have raised your Archery skill to 50. Well met, friend. Imagine yourself in a distant grove of trees, You raise your bow, take slow, careful aim, and with the twitch of a finger, you impale your prey with a deadly arrow. You look like you would make a excellent archer, but you will need practice. There is no better way to practice Archery than when you life is on the line. I have a challenge for you. Head East out of town and go to Old Haven. While wielding your bow or crossbow, battle the undead that reside there. Make sure you bring a healthy supply of arrows (or bolts if you prefer a crossbow). If you wish to purchase a bow, crossbow, arrows, or bolts, you can purchase them from me or the Archery shop in town. You can also make your own arrows with the Bowcraft/Fletching skill. You will need fletcher's tools, wood to turn into sharft's, and feathers to make arrows or bolts. Come back to me after you have achived the rank of Apprentice Archer, and i will reward you with a fine Archery weapon. - RefusalMessage = - 1078206; // I understand that Archery may not be for you. Feel free to visit me in the future if you change your mind. - InProgressMessage = 1078207; // You're doing great as an Archer! however, you need more practice. - CompletionMessage = - 1078209; // Congratulation! I want to reward you for your accomplishment. Take this composite bow. It is called " Heartseeker". With it, you will shoot with swiftness, precision, and power. I hope "Heartseeker" serves you well. - CompletionNotice = - 1078208; // You have achieved the rank of Apprentice Archer. Return to Robyn in New Haven to claim your reward. - - Objectives.Add(new GainSkillObjective(SkillName.Archery, 500, true, true)); - - Rewards.Add(new ItemReward(1078210, typeof(Heartseeker))); // Heartseeker - } - } - - public class EnGuarde : MLQuest - { - public EnGuarde() - { - Activated = true; - OneTimeOnly = true; - Title = 1078186; // En Guarde! - Description = - 1078190; // Head East out of town to Old Haven. Battle monsters there until you have raised your Fencing skill to 50.
------

Well hello there, lad. Fighting with elegance and precision is far more enriching than slugging an enemy with a club or butchering an enemy with a sword. Learn the art of Fencing if you want to master combat and look good doing it!

The key to being a successful fencer is to be the complement and not the opposition to your opponent's strength. Watch for your opponent to become off balance. Then finish him off with finesse and flair.

There are some undead that need cleansing out in Old Haven towards the East. Head over there and slay them, but remember, do it with style!

Come back to me once you have achieved the rank of Apprentice Fencer, and I will reward you with a prize. - RefusalMessage = - 1078191; // I understand, lad. Being a hero isn't for everyone. Run along, then. Come back to me if you change your mind. - InProgressMessage = - 1078192; // You're doing well so far, but you're not quite ready yet. Head back to Old Haven, to the East, and kill some more undead. - CompletionMessage = - 1078194; // Excellent! You are beginning to appreciate the art of Fencing. I told you fighting with elegance and precision is more enriching than fighting like an ogre.

Since you have returned victorious, please take this war fork and use it well. The war fork is a finesse weapon, and this one is magical! I call it "Recaro's Riposte". With it, you will be able to parry and counterstrike with ease! Your enemies will bask in your greatness and glory! Good luck to you, lad, and keep practicing! - CompletionNotice = - 1078193; // You have achieved the rank of Apprentice Fencer. Return to Recaro in New Haven to claim your reward. - - Objectives.Add(new GainSkillObjective(SkillName.Fencing, 500, true, true)); - - Rewards.Add(new ItemReward(1078195, typeof(RecarosRiposte))); // Recaro's Riposte - } - } - - public class TheArtOfWar : MLQuest - { - public TheArtOfWar() - { - Activated = true; - OneTimeOnly = true; - Title = 1077667; // The Art of War - Description = - 1077670; // Head East out of town to Old Haven. Battle monsters there until you have raised your Tactics skill to 50.
------

Knowing how to hold a weapon is only half of the battle. The other half is knowing how to use it against an opponent. It's one thing to kill a few bunnies now and then for fun, but a true warrior knows that the right moves to use against a lich will pretty much get your arse fried by a dragon.

I'll help teach you how to fight so that when you do come up against that dragon, maybe you won't have to walk out of there "OooOOooOOOooOO'ing" and looking for a healer.

There are some undead that need cleaning out in Old Haven towards the east. Why don't you head on over there and practice killing things?

When you feel like you've got the basics down, come back to me and I'll see if I can scrounge up an item to help you in your adventures later on. - RefusalMessage = - 1077671; // That's too bad. I really thought you had it in you. Well, I'm sure those undead will still be there later, so if you change your mind, feel free to stop on by and I'll help you the best I can. - InProgressMessage = - 1077672; // You're making some progress, that i can tell, but you're not quite good enough to last for very long out there by yourself. Head back to Old Haven, to the east, and kill some more undead. - CompletionMessage = - 1077674; // Hey, good job killing those undead! Hopefully someone will come along and clean up the mess. All that blood and guts tends to stink after a few days, and when the wind blows in from the east, it can raise a mighty stink!

Since you performed valiantly, please take these arms and use them well. I've seen a few too many harvests to be running around out there myself, so you might as well take it.

There is a lot left for you to learn, but I think you'll do fine. Remember to keep your elbows in and stick'em where it hurts the most! - CompletionNotice = - 1077673; // You have achieved the rank of Apprentice Warrior. Return to Alden Armstrong in New Haven to claim your reward. - - Objectives.Add(new GainSkillObjective(SkillName.Tactics, 500, true, true)); - - Rewards.Add(new ItemReward(1077675, typeof(ArmsOfArmstrong))); // Arms of Armstrong - } - } - - public class TheWayOfTheBlade : MLQuest - { - public TheWayOfTheBlade() - { - Activated = true; - OneTimeOnly = true; - Title = 1077658; // The way of The Blade - Description = - 1077661; // Head East out of town and go to Old Haven. While wielding your sword, battle monster there until you have raised your Swordsmanship skill to 50. *as you approach, you notice Jockles sizing you up with a skeptical look on his face* i can see you want to learn how to handle a blade. It's a lot harder than it looks, and you're going to have to put alot of time and effort if you ever want to be half as good as i am. I'll tell you what, kid, I'll help you get started, but you're going to have to do all the work if you want to learn something. East of here, outside of town, is Old Haven. It's been overrun with the nastiest of undead you've seen, which makes it a perfect place for you to turn that sloppy grin on your face into actual skill at handling a sword. Make sure you have a sturdy Swordsmanship weapon in good repair before you leave. 'tis no fun to travel all the way down there just to find out you forgot your blade! When you feel that you've cut down enough of those foul smelling things to learn how to handle a blade without hurting yourself, come back to me. If i think you've improved enough, I'll give you something suited for a real warrior. - RefusalMessage = - 1077662; // Ha! I had a feeling you were a lily-livered pansy. You might have potential, but you're scared by a few smelly undead, maybe it's better that you stay away from sharp objects. After all, you wouldn't want to hurt yourself swinging a sword. If you change your mind, I might give you another chance...maybe. - InProgressMessage = - 1077663; // *Jockles looks you up and down* Come on! You've got to work harder than that to get better. Now get out of here, go kill some more of those undead to the east in Old Haven, and don't come back till you've got real skill. - CompletionMessage = - 1077665; // Well, well, look at what we have here! You managed to do it after all. I have to say, I'm a little surprised that you came back in one piece, but since you did. I've got a little something for you. This is a fine blade that served me well in my younger days. Of course I've got much better swords at my disposal now, so I'll let you go ahead and use it under one condition. Take goodcare of it and treat it with the respect that a fine sword deserves. You're one of the quickers learners I've seen, but you still have a long way to go. Keep at it, and you'll get there someday. Happy hunting, kid. - CompletionNotice = - 1077664; // You have achieved the rank of Apprentice Swordsman. Return to Jockles in New Haven to see what kind of reward he has waiting for you. Hopefully he'll be a little nicer this time! - - Objectives.Add(new GainSkillObjective(SkillName.Swords, 500, true, true)); - - Rewards.Add(new ItemReward(1077666, typeof(JocklesQuicksword))); // Jockles' Quicksword - } - } - - public class ThouAndThineShield : MLQuest - { - public ThouAndThineShield() - { - Activated = true; - OneTimeOnly = true; - Title = 1077704; // Thou and Thine Shield - Description = - 1077707; // Head East out of town and go to Old Haven. Battle monsters, or simply let them hit you, while holding a shield or a weapon until you have raised your Parrying skill to 50. Oh, hello. You probably want me to teach you how to parry, don't you? Very Well. First, you'll need a weapon or a shield. Obviously shields work best of all, but you can parry with a 2-handed weapon. Or if you're feeling particularly brave, a 1-handed weapon will do in a pinch, I'd advise you to go to Old Haven, which you'll find to the East, and practice blocking incoming blows from the undead there. You'll learn quickly if you have more than one opponent attacking you at the same time to practice parrying lots of blows at once. That's the quickest way to master the art of parrying. If you manage to improve your skill enough, i have a shield that you might find useful. Come back to me when you've trained to an apprentice level. - RefusalMessage = - 1077708; // It's your choice, obviously, but I'd highly suggest that you learn to parry before adventuring out into the world. Come talk to me again when you get tired of being beat on by your opponents - InProgressMessage = - 1077709; // You're doing well, but in my opinion, I Don't think you really want to continue on without improving your parrying skill a bit more. Go to Old Haven, to the East, and practice blocking blows with a shield. - CompletionMessage = - 1077711; // Well done! You're much better at parrying blows than you were when we first met. You should be proud of your new ability and I bet your body is greatful to you aswell. *Tyl Ariadne laughs loudly at his ownn (mostly lame) joke* Oh yes, I did promise you a shield if I thought you were worthy of having it, so here you go. My father made these shields for the guards who served my father faithfully for many years, and I just happen to have obe that i can part with. You should find it useful as you explore the lands.Good luck, and may the Virtues be your guide. - CompletionNotice = - 1077710; // You have achieved the rank of Apprentice Warrior (for Parrying). Return to Tyl Ariadne in New Haven as soon as you can to claim your reward. - - Objectives.Add(new GainSkillObjective(SkillName.Parry, 500, true, true)); - - Rewards.Add(new ItemReward(1077694, typeof(EscutcheonDeAriadne))); // Escutcheon de Ariadne - } - } - - public class DefyingTheArcane : MLQuest - { - public DefyingTheArcane() - { - Activated = true; - OneTimeOnly = true; - Title = 1077621; // Defying the Arcane - Description = - 1077623; // Head East out of town and go to Old Haven. Battle spell casting monsters there until you have raised your Resisting Spells skill to 50.
------

Hail and well met! To become a true master of the arcane art of Magery, I suggest learning the complementary skill known as Resisting Spells. While the name of this skill may suggest that it helps with resisting all spells, this is not the case. This skill helps you lessen the severity of spells that lower your stats or ones that last for a specific duration of time. It does not lessen damage from spells such as Energy Bolt or Flamestrike.

The Magery spells that can be resisted are Clumsy, Curse, Feeblemind, Mana Drain, Mana Vampire, Paralyze, Paralyze Field, Poison, Poison Field, and Weaken.

The Necromancy spells that can be resisted are Blood Oath, Corpse Skin, Mind Rot, and Pain Spike.

At higher ranks, the Resisting Spells skill also benefits you by adding a bonus to your minimum elemental resists. This bonus is only applied after all other resist modifications - such as from equipment - has been calculated. It's also not cumulative. It compares the number of your minimum resists to the calculated value of your modifications and uses the higher of the two values.

As you can see, Resisting Spells is a difficult skill to understand, and even more difficult to master. This is because in order to improve it, you will have to put yourself in harm's way - as in the path of one of the above spells.

Undead have plagued the town of Old Haven. We need your assistance in cleansing the town of this evil influence. Old Haven is located east of here. Battle the undead spell casters that inhabit there.

Comeback to me once you feel that you are worthy of the rank of Apprentice Mage and I will reward you with an arcane prize. - RefusalMessage = - 1077624; // The ability to resist powerful spells is a taxing experience. I understand your resistance in wanting to pursue it. If you wish to reconsider, feel free to return to me for Resisting Spells training. Good journey to you! - InProgressMessage = - 1077632; // You have not achieved the rank of Apprentice Mage. Come back to me once you feel that you are worthy of the rank of Apprentice Mage and I will reward you with an arcane prize. - CompletionMessage = - 1077626; // You have successfully begun your journey in becoming a true master of Magery. On behalf of the New Haven Mage Council I wish to present you with this bracelet. When worn, the Bracelet of Resilience will enhance your resistances vs. the elements, physical, and poison harm. The Bracelet of Resilience also magically enhances your ability fend off ranged and melee attacks. I hope it serves you well. - CompletionNotice = - 1077625; // You have achieved the rank of Apprentice Mage (for Resisting Spells). Return to Alefian in New Haven to receive your arcane prize. - - Objectives.Add(new GainSkillObjective(SkillName.MagicResist, 500, true, true)); - - Rewards.Add(new ItemReward(1077627, typeof(BraceletOfResilience))); // Bracelet of Resilience - } - } - - public class StoppingTheWorld : MLQuest - { - public StoppingTheWorld() - { - Activated = true; - OneTimeOnly = true; - Title = 1077597; // Stopping the World - Description = - 1077598; // Head East out of town and go to Old Haven. Use spells and abilities to deplete your mana and meditate there until you have raised your Meditation skill to 50. Well met! I can teach you how to 'Stop the World' around you and focus your inner energies on replenishing you mana. What is mana? Mana is the life force for everyone who practices arcane arts. When a practitioner of magic invokes a spell or scribes a scroll. It consumes mana. Having a abundant supply of mana is vital to excelling as a practitioner of the arcane. Those of us who study the art of Meditation are also known as stotics. The Meditation skill allows stoics to increase the rate at which they regenerate mana A Stoic needs to perform abilities or cast spells to deplete mana before he can meditate to replenish it. Meditation can occur passively or actively. Actively Meditation is more difficult to master but allows for the stoic to replenish mana at a significantly faster rate. Metal armor inerferes with the regenerative properties of Meditation. It is wise to wear leather or cloth protection when meditating. Head east out of town and go to Old Haven. Use spells and abilities to deplete your mana and actively meditate to replenish it. Come back once you feel you are at the worthy rank of Apprentice Stoic and i will reward you with a arcane prize. - RefusalMessage = 1077599; // Seek me out if you ever wish to study the art of Meditation. Good journey. - InProgressMessage = - 1077628; // You have not achieved the rank of Apprentice Stoic. Come back to me once you feel that you are worthy of the rank Apprentice Stoic and i will reward you with a arcane prize. - CompletionMessage = - 1077626; // You have successfully begun your journey in becoming a true master of Magery. On behalf of the New Haven Mage Council I wish to present you with this bracelet. When worn, the Bracelet of Resilience will enhance your resistances vs. the elements, physical, and poison harm. The Bracelet of Resilience also magically enhances your ability fend off ranged and melee attacks. I hope it serves you well. - CompletionNotice = - 1077600; // You have achieved the rank of Apprentice Stoic (for Meditation). Return to Gustar in New Haven to receive your arcane prize. - - Objectives.Add(new GainSkillObjective(SkillName.Meditation, 500, true, true)); - - Rewards.Add(new ItemReward(1077602, typeof(PhilosophersHat))); // Philosopher's Hat - } - } - - public class ScribingArcaneKnowledge : MLQuest - { - public ScribingArcaneKnowledge() - { - Activated = true; - OneTimeOnly = true; - Title = 1077615; // Scribing Arcane Knowledge - Description = - 1077616; // While here at the New Haven Magery Library, use a scribe's pen and scribe and 3rd and 4th circle Magery scrolls that you have in your spellbook. Remember, you will need blank scrolls as well. Do this until you have raised your Inscription skill to 50.
------

Greetings and welcome to the New Haven Magery Library! You wish to learn how to scribe spell scrolls? You have come to the right place! Inscribed in a steady hand and imbued with the power of reagents, a scroll can mean the difference between life and death in a perilous situation. Those knowledgeable in Inscription may transcribe spells to create useful and valuable magical scrolls.

Before you inscribe a spell, you must first be able to cast the spell without the aid of a scroll. This means that you need the appropriate level of proficiency as a mage, the required mana, and the required reagents. Second, you will need a blank scroll to write on and a scribe's pen. Then, you will need to decide which particular spell you wish to scribe. It may sound easy, but there is a bit more to it. As with the development of all skills, you need to practice Inscription of lower level spells before you can move onto the more difficult ones.

The most important aspect of Inscription is mana. Inscribing a scroll with a magic spell drains your mana. When inscribing 3rd circle or lower spells this will not be much of a problem for these spells consume a small amount of mana. However, when you are inscribing higher circle spells, you may see your mana drain rapidly. When this happens, pause or meditate before continuing.

I suggest you begin scribing any 3rd and 4th circle spells that you know. If you don't possess any, you can always barter with one of the local mage merchants or a fellow adventurer that is a seasoned Scribe.

Come back to me once you feel that you are worthy of the rank of Apprentice Scribe and I will reward you with an arcane prize. - RefusalMessage = - 1077617; // I understand. When you are ready, feel free to return to me for Inscription training. Thanks for stopping by! - InProgressMessage = - 1077631; // You have not achieved the rank of Apprentice Scribe. Come back to me once you feel that you are worthy of the rank Apprentice Scribe and i will reward you with a arcane prize. - CompletionMessage = - 1077619; // Scribing is a very fulfilling pursuit. I am pleased to see you embark on this journey. You sling a pen well! On behalf of the New Haven Mage Council I wish to present you with this spellbook. When equipped, the Hallowed Spellbook greatly enhances the potency of your offensive spells when used against Undead. Be mindful, though. While this book is equipped, when you invoke your powerful spells and abilities vs. Humanoids such as other humans, orcs, ettins, trolls, and the like, your offensive spells will diminish in effectiveness. I suggest unequipping the Hallowed Spellbook when battling Humanoids. I hope this spellbook serves you well. - CompletionNotice = - 1077618; // You have achieved the rank of Apprentice Scribe. Return to Jillian in New Haven to receive your arcane prize. - - Objectives.Add(new GainSkillObjective(SkillName.Inscribe, 500, true, true)); - - Rewards.Add(new ItemReward(1077620, typeof(HallowedSpellbook))); // Hallowed Spellbook - } - } - - public class TheMagesApprentice : MLQuest - { - public TheMagesApprentice() - { - Activated = true; - OneTimeOnly = true; - Title = 1077576; // The Mage's Apprentice - Description = - 1077577; // Head East out of town and go to Old Haven. Cast fireballs and lightning bolts against monsters there until you have raised your Magery skill to 50. Greetings. You seek to unlock the secrets of the arcane art of Magery. The New Haven Mage Council has an assignment for you. Undead have plagued the town of Old Haven. We need your assistance in cleansing the town of this evil influence. Old Haven is located east of here. I suggest using your offensive Magery spells such as Fireball and Lightning Bolt against the Undead that inhabit there. Make sure you have plenty of reagents before embarking on your journey. Reagents are required to cast Magery spells. You can purchase extra reagents at the nearby Reagent shop, or you can find reagents growing in the nearby wooded areas. You can see which reagents are required for each spell by looking in your spellbook. Come back to me once you feel that you are worthy of the rank of Apprentice Mage and I will reward you with an arcane prize. - RefusalMessage = - 1077578; // Very well, come back to me when you are ready to practice Magery. You have so much arcane potential. 'Tis a shame to see it go to waste. The New Haven Mage Council could really use your help. - InProgressMessage = - 1077579; // You have not achieved the rank of Apprentice Mage. Come back to me once you feel that you are worthy of the rank of Apprentice Mage and I will reward you with an arcane prize. - CompletionMessage = - 1077581; // Well done! On behalf of the New Haven Mage Council I wish to present you with this staff. Normally a mage must unequip weapons before spell casting. While wielding your new Ember Staff, however, you will be able to invoke your Magery spells. Even if you do not currently possess skill in Mace Fighting, the Ember Staff will allow you to fight as if you do. However, your Magery skill will be temporarily reduced while doing so. Finally, the Ember Staff occasionally smites a foe with a Fireball while wielding it in melee combat. I hope the Ember Staff serves you well. - CompletionNotice = - 1077580; // You have achieved the rank of Apprentice Mage. Return to Kaelynna in New Haven to receive your arcane prize. - - Objectives.Add(new GainSkillObjective(SkillName.Magery, 500, true, true)); - - Rewards.Add(new ItemReward(1077582, typeof(EmberStaff))); // Ember Staff - } - } - - public class ScholarlyTask : MLQuest - { - public ScholarlyTask() - { - Activated = true; - OneTimeOnly = true; - Title = 1077603; // A Scholarly Task - Description = - 1077604; // Head East out of town and go to Old Haven. Use Evaluating Intelligence on all creatures you see there. You can also cast Magery spells as well to raise Evaluating Intelligence. Do these activities until you have raised your Evaluating Intelligence skill to 50.
------

Hello. Truly knowing your opponent is essential for landing your offensive spells with precision. I can teach you how to enhance the effectiveness of your offensive spells, but first you must learn how to size up your opponents intellectually. I have a scholarly task for you. Head East out of town and go to Old Haven. Use Evaluating Intelligence on all creatures you see there. You can also cast Magery spells as well to raise Evaluating Intelligence.

Come back to me once you feel that you are worthy of the rank of Apprentice Scholar and I will reward you with an arcane prize. - RefusalMessage = 1077605; // Return to me if you reconsider and wish to become an Apprentice Scholar. - InProgressMessage = - 1077629; // You have not achieved the rank of Apprentice Scholar. Come back to me once you feel that you are worthy of the rank of Apprentice Scholar and I will reward you with an arcane prize. - CompletionMessage = - 1077607; // You have completed the task. Well done. On behalf of the New Haven Mage Council I wish to present you with this ring. When worn, the Ring of the Savant enhances your intellectual aptitude and increases your mana pool. Your spell casting abilities will take less time to invoke and recovering from such spell casting will be hastened. I hope the Ring of the Savant serves you well. - CompletionNotice = - 1077606; // You have achieved the rank of Apprentice Scholar. Return to Mithneral in New Haven to receive your arcane prize. - - Objectives.Add(new GainSkillObjective(SkillName.EvalInt, 500, true, true)); - - Rewards.Add(new ItemReward(1077608, typeof(RingOfTheSavant))); // Ring of the Savant - } - } - - public class TheRightToolForTheJob : MLQuest - { - public TheRightToolForTheJob() - { - Activated = true; - OneTimeOnly = true; - Title = 1077741; // The Right Tool for the Job - Description = - 1077744; // Create new scissors and hammers while inside Amelia's workshop. Try making scissors up to 45 skill, the switch to making hammers until 50 skill.
-----

Hello! I guess you're here to learn something about Tinkering, eh? You've come to the right place, as Tinkering is what I've dedicated my life to.

You'll need two things to get started: a supply of ingots and the right tools for the job. You can either buy ingots from the market, or go mine them yourself. As for tools, you can try making your own set of Tinker's Tools, or if you'd prefer to buy them, I have some for sale.

Working here in my shop will let me give you pointers as you go, so you'll be able to learn faster than anywhere else. Start off making scissors until you reach 45 tinkering skill, then switch to hammers until you've achieved 50. Once you've done that, come talk to me and I'll give you something for your hard work. - RefusalMessage = - 1077745; // I’m disappointed that you aren’t interested in learning more about Tinkering. It’s really such a useful skill!

*Amelia smiles*

At least you know where to find me if you change your mind, since I rarely spend time outside of this shop. - InProgressMessage = - 1077746; // Nice going! You're not quite at Apprentice Tinkering yet, though, so you better get back to work. Remember that the quickest way to learn is to make scissors up until 45 skill, and then switch to hammers. Also, don't forget that working here in my shop will let me give you tips so you can learn faster. - CompletionMessage = - 1077748; // You've done it! Look at our brand new Apprentice Tinker! You've still got quite a lot to learn if you want to be a Grandmaster Tinker, but I believe you can do it! Just keep in mind that if you're tinkering just to practice and improve your skill, make items that are moderately difficult (60-80% success chance), and try to stick to ones that use less ingots.

Come here, my brand new Apprentice Tinker, I want to give you something special. I created this just for you, so I hope you like it. It's a set of Tinker's Tools that contains a bit of magic. These tools have more charges than any Tinker's Tools a Tinker can make. You can even use them to make a normal set of tools, so that way you won't ever find yourself stuck somewhere with no tools! - CompletionNotice = - 1077747; // You have achieved the rank of Apprentice Tinker. Talk to Amelia Youngstone in New Haven to see what kind of reward she has waiting for you. - - Objectives.Add(new GainSkillObjective(SkillName.Tinkering, 500, true, true)); - - Rewards.Add(new ItemReward(1077749, typeof(AmeliasToolbox))); // Amelia’s Toolbox - } - } - - public class KnowThineEnemy : MLQuest - { - public KnowThineEnemy() - { - Activated = true; - OneTimeOnly = true; - Title = 1077685; // Know Thine Enemy - Description = - 1077688; // Head East out of town to Old Haven. Battle monsters there, or heal yourself and other players, until you have raised your Anatomy skill to 50.
------

Hail and well met. You must be here to improve your knowledge of Anatomy. Well, you've come to the right place because I can teach you what you need to know. At least all you'll need to know for now. Haha!

Knowing about how living things work inside can be a very useful skill. Not only can you learn where to strike an opponent to hurt him the most, but you can use what you learn to heal wounds better as well. Just walking around town, you can even tell if someone is strong or weak or if they happen to be particularly dexterous or not.

If you're interested in learning more, I'd advise you to head out to Old Haven, just to the east, and jump into the fray. You'll learn best by engaging in combat while keeping you and your fellow adventurers healed, or you can even try sizing up your opponents.

While you're gone, I'll dig up something you may find useful. - RefusalMessage = - 1077689; // It's your choice, but I wouldn't head out there without knowing what makes those things tick inside! If you change your mind, you can find me right here dissecting frogs, cats or even the occasional unlucky adventurer. - InProgressMessage = - 1077690; // I'm surprised to see you back so soon. You've still got a ways to go if you want to really understand the science of Anatomy. Head out to Old Haven and practice combat and healing yourself or other adventurers. - CompletionMessage = - 1077692; // By the Virtues, you've done it! Congratulations mate! You still have quite a ways to go if you want to perfect your knowledge of Anatomy, but I know you'll get there someday. Just keep at it.

In the meantime, here's a piece of armor that you might find useful. It's not fancy, but it'll serve you well if you choose to wear it.

Happy adventuring, and remember to keep your cranium separate from your clavicle! - CompletionNotice = - 1077691; // You have achieved the rank of Apprentice Healer (for Anatomy). Return to Andreas Vesalius in New Haven as soon as you can to claim your reward. - - Objectives.Add(new GainSkillObjective(SkillName.Anatomy, 500, true, true)); - - Rewards.Add(new ItemReward(1077693, typeof(TunicOfGuarding))); // Tunic of Guarding - } - } - - public class BruisesBandagesAndBlood : MLQuest - { - public BruisesBandagesAndBlood() - { - Activated = true; - OneTimeOnly = true; - Title = 1077676; // Bruises, Bandages and Blood - Description = - 1077679; // Head East out of town and go to Old Haven. Heal yourself and other players until you have raised your Healing skill to 50.
------

Ah, welcome to my humble practice. I am Avicenna, New Haven's resident Healer. A lot of adventurers head out into the wild from here, so I keep rather busy when they come back bruised, bleeding, or worse.

I can teach you how to bandage a wound, sure, but it's not a job for the queasy! For some folks, the mere sight of blood is too much for them, but it's something you'll get used to over time. It is one thing to cut open a living thing, but it's quite another to sew it back up and save it from sure death. 'Tis noble work, healing.

Best way for you to practice fixing up wounds is to head east out to Old Haven and either practice binding up your own wounds, or practice on someone else. Surely they'll be grateful for the assistance.

Make sure to take enough bandages with you! You don't want to run out in the middle of a tough fight. - RefusalMessage = - 1077680; // No? Are you sure? Well, when you feel that you're ready to practice your healing, come back to me. I'll be right here, fixing up adventurers and curing the occasional cold! - InProgressMessage = - 1077681; // Hail! 'Tis good to see you again. Unfortunately, you're not quite ready to call yourself an Apprentice Healer quite yet. Head back out to Old Haven, due east from here, and bandage up some wounds. Yours or someone else's, it doesn't much matter. - CompletionMessage = - 1077683; // Hello there, friend. I see you've returned in one piece, and you're an Apprentice Healer to boot! You should be proud of your accomplishment, as not everyone has "the touch" when it comes to healing.

I can't stand to see such good work go unrewarded, so I have something I'd like you to have. It's not much, but it'll help you heal just a little faster, and maybe keep you alive.

Good luck out there, friend, and don't forget to help your fellow adventurer whenever possible! - CompletionNotice = - 1077682; // You have achieved the rank of Apprentice Healer. Return to Avicenna in New Haven as soon as you can to claim your reward. - - Objectives.Add(new GainSkillObjective(SkillName.Healing, 500, true, true)); - - Rewards.Add(new ItemReward(1077684, typeof(HealersTouch))); // Healer's Touch - } - } - - public class TheInnerWarrior : MLQuest - { - public TheInnerWarrior() - { - Activated = true; - OneTimeOnly = true; - Title = 1077696; // The Inner Warrior - Description = - 1077699; // Head East out of town to Old Haven. Expend stamina and mana until you have raised your Focus skill to 50.
------

Well, hello there. Don't you look like quite the adventurer!

You want to learn more about Focus, do you? I can teach you something about that, but first you should know that not everyone can be disciplined enough to excel at it. Focus is the ability to achieve inner balance in both body and spirit, so that you recover from physical and mental exertion faster than you otherwise would.

If you want to practice Focus, the best place to do that is east of here, in Old Haven, where you'll find an undead infestation. Exert yourself physically by engaging in combat and moving quickly. For testing your mental balance, expend mana in whatever way you find most suitable to your abilities. Casting spells and using abilities work well for consuming your mana.

Go. Train hard, and you will find that your concentration will improve naturally. When you've improved your ability to focus yourself at an Apprentice level, come back to me and I shall give you something worthy of your new ability. - RefusalMessage = - 1077700; // I'm disappointed. You have a lot of inner potential, and it would pain me greatly to see you waste that. Oh well. If you change your mind, I'll be right here. - InProgressMessage = - 1077701; // Hello again. I see you've returned, but it seems that your Focus skill hasn't improved as much as it could have. Just head east, to Old Haven, and exert yourself physically and mentally as much as possible. To do this physically, engage in combat and move as quickly as you can. For exerting yourself mentally, expend mana in whatever way you find most suitable to your abilities. Casting spells and using abilities work well for consuming your mana.

Return to me when you have gained enough Focus skill to be considered an Apprentice Stoic. - CompletionMessage = - 1077703; // Look who it is! I knew you could do it if you just had the discipline to apply yourself. It feels good to recover from battle so quickly, doesn't it? Just wait until you become a Grandmaster, it's amazing!

Please take this gift, as you've more than earned it with your hard work. It will help you recover even faster during battle, and provides a bit of protection as well.

You have so much more potential, so don't stop trying to improve your Focus now! Safe travels! - CompletionNotice = - 1077702; // You have achieved the rank of Apprentice Stoic (for Focus). Return to Sarsmea Smythe in New Haven to see what kind of reward she has waiting for you. - - Objectives.Add(new GainSkillObjective(SkillName.Focus, 500, true, true)); - - Rewards.Add(new ItemReward(1077695, typeof(ClaspOfConcentration))); // Clasp of Concentration - } - } - - public class TheArtOfStealth : MLQuest - { - public TheArtOfStealth() - { - Activated = true; - OneTimeOnly = true; - Title = 1078154; // The Art of Stealth - Description = - 1078158; // Head East out of town and go to Old Haven. While wielding your fencing weapon, battle monsters with focus attack and summon mirror images up to 40 Ninjitsu skill, and continue practicing focus attack on monsters until 50 Ninjitsu skill.
------

Welcome, young one. You seek to learn Ninjitsu. With it, and the book of Ninjitsu, a Ninja can evoke a number of special abilities including transforming into a variety of creatures that give unique bonuses, using stealth to attack unsuspecting opponents or just plain disappear into thin air! If you do not have a book of Ninjitsu, you can purchase one from me.

I have an assignment for you. Head East out of town and go to Old Haven. While wielding your fencing weapon, battle monsters with focus attack and summon mirror images up to Novice rank, and continue focusing your attacks for greater damage on monsters until you become an Apprentice Ninja. Each image will absorb one attack. The art of deception is a strong defense. Use it wisely.

Come back to me once you have achieved the rank of Apprentice Ninja, and I shall reward you with something useful. - RefusalMessage = 1078159; // Come back to me if you with to learn Ninjitsu in the future. - InProgressMessage = - 1078160; // You have not achieved the rank of Apprentice Ninja. Come back to me once you have done so. - CompletionMessage = - 1078162; // You have done well, young one. Please accept this kryss as a gift. It is called the "Silver Serpent Blade". With it, you will strike with precision and power. This should aid you in your journey as a Ninja. Farewell. - CompletionNotice = - 1078161; // You have achieved the rank of Apprentice Ninja. Return to Ryuichi in New Haven to see what kind of reward he has waiting for you. - - Objectives.Add(new GainSkillObjective(SkillName.Ninjitsu, 500, true, true)); - - Rewards.Add(new ItemReward(1078163, typeof(SilverSerpentBlade))); // Silver Serpent Blade - } - } - - public class BecomingOneWithTheShadows : MLQuest - { - public BecomingOneWithTheShadows() - { - Activated = true; - OneTimeOnly = true; - Title = 1078164; // Becoming One with the Shadows - Description = - 1078168; // Practice hiding in the Ninja Dojo until you reach 50 Hiding skill.
------

Come closer. Don't be afraid. The shadows will not harm you. To be a successful Ninja, you must learn to become one with the shadows. The Ninja Dojo is the ideal place to learn the art of concealment. Practice hiding here.

Talk to me once you have achieved the rank of Apprentice Rogue (for Hiding), and I shall reward you. - RefusalMessage = 1078169; // If you wish to become one with the shadows, come back and talk to me. - InProgressMessage = - 1078170; // You have not achieved the rank of Apprentice Rogue (for Hiding). Talk to me when you feel you have accomplished this. - CompletionMessage = - 1078172; // Not bad at all. You have learned to control your fear of the dark and you are becoming one with the shadows. If you haven't already talked to Jun, I advise you do so. Jun can teach you how to stealth undetected. Hiding and Stealth are essential skills to master when becoming a Ninja.

As promised, I have a reward for you. Here are some smokebombs. As long as you are an Apprentice Ninja and have mana available you will be able to use them. They will allow you to hide while in the middle of combat. I hope these serve you well. - CompletionNotice = - 1078171; // You have achieved the rank of Apprentice Rogue (for Hiding). Return to Chiyo in New Haven to claim your reward. - - Objectives.Add(new GainSkillObjective(SkillName.Hiding, 500, true, true)); - - Rewards.Add(new ItemReward(1078173, typeof(BagOfSmokeBombs))); // Bag of Smoke Bombs - } - } - - public class WalkingSilently : MLQuest - { - public WalkingSilently() - { - Activated = true; - OneTimeOnly = true; - Title = 1078174; // Walking Silently - Description = - 1078178; // Head East out of town and go to Old Haven. While wearing normal clothes, practice Stealth there until you reach 50 Stealth skill.
------

You there. You're not very quiet in your movements. I can help you with that. Not only must you must learn to become one with the shadows, but also you must learn to quiet your movements. Old Haven is the ideal place to learn how to Stealth.

Head East out of town and go to Old Haven. While wearing normal clothes, practice Stealth there. Stealth becomes more difficult as you wear heavier pieces of armor, so for now, only wear clothes while practicing Stealth.

You can only Stealth once you are hidden. If you become visible, use your Hiding skill, and begin slowing walking.

Come back to me once you have achieved the rank of Apprentice Rogue (for Stealth), and I will reward you with something useful. - RefusalMessage = 1078179; // If you want to learn to quiet your movements, talk to me, and I will help you. - InProgressMessage = - 1078180; // You have not achieved the rank of Apprentice Rogue (for Stealth). Come back to me when you feel you have accomplished this. - CompletionMessage = - 1078182; // Good. You have learned to quiet your movements. If you haven't already talked to Chiyo, I advise you do so. Chiyo can teach you how to become one with the shadows. Hiding and Stealth are essential skills to master when becoming a Ninja.

Here is your reward. This leather Ninja jacket is called "Twilight Jacket". It will offer greater protection to you. I hope this serve you well. - CompletionNotice = - 1078181; // You have achieved the rank of Apprentice Rogue (for Stealth). Return to Jun in New Haven to claim your reward. - - Objectives.Add(new GainSkillObjective(SkillName.Stealth, 500, true, true)); - - Rewards.Add(new ItemReward(1078183, typeof(TwilightJacket))); // Twilight Jacket - } - } - - public class EyesOfARanger : MLQuest - { - public EyesOfARanger() - { - Activated = true; - OneTimeOnly = true; - Title = 1078211; // Eyes of a Ranger - Description = - 1078217; // Track animals, monsters, and people on Haven Island until you have raised your Tracking skill to 50.
------

Hello friend. I am Walker, Grandmaster Ranger. An adventurer needs to keep alive in the wilderness. Being able to track those around you is essential to surviving in dangerous places. Certain Ninja abilities are more potent when the Ninja possesses Tracking knowledge. If you want to be a Ninja, or if you simply want to get a leg up on the creatures that habit these parts, I advise you learn how to track them.

You can track any animals, monsters, or people on Haven Island. Clear your mind, focus, and note any tracks in the ground or sounds in the air that can help you find your mark. You can do it, friend. I have faith in you.

Come back to me once you have achieved the rank of Apprentice Ranger (for Tracking), and I will give you something that may help you in your travels. Take care, friend. - RefusalMessage = - 1078218; // Farewell, friend. Be careful out here. If you change your mind and want to learn Tracking, come back and talk to me. - InProgressMessage = - 1078219; // So far so good, kid. You are still alive, and you are getting the hang of Tracking. There are many more animals, monsters, and people to track. Come back to me once you have tracked them. - CompletionMessage = - 1078221; // I knew you could do it! You have become a fine Ranger. Just keep practicing, and one day you will become a Grandmaster Ranger. Just like me.

I have a little something for you that will hopefully aid you in your journeys. These leggings offer some resistances that will hopefully protect you from harm. I hope these serve you well. Farewell, friend. - CompletionNotice = - 1078220; // You have achieved the rank of Apprentice Ranger (for Tracking). Return to Walker in New Haven to claim your reward. - - Objectives.Add(new GainSkillObjective(SkillName.Tracking, 500, true, true)); - - Rewards.Add(new ItemReward(1078222, typeof(WalkersLeggings))); // Walker's Leggings - } - } - - public class TheWayOfTheSamurai : MLQuest - { - public TheWayOfTheSamurai() - { - Activated = true; - OneTimeOnly = true; - Title = 1078007; // The Way of the Samurai - Description = - 1078010; // Head East out of town and go to Old Haven. use the Confidence defensive stance and attempt to honorably execute monsters there until you have raised your Bushido skill to 50.
------

Greetings. I see you wish to learn the Way of the Samurai. Wielding a blade is easy. Anyone can grasp a sword's hilt. Learning how to fight properly and skillfully is to become an Armsman. Learning how to master weapons, and even more importantly when not to use them, is the Way of the Warrior. The Way of the Samurai. The Code of the Bushido. That is why you are here.

Adventure East to Old Haven. Use the Confidence defensive stance and attempt to honorably execute the undead that inhabit there. You will need a book of Bushido to perform these abilities. If you do not possess a book of Bushido, you can purchase one from me.

If you fail to honorably execute the undead, your defenses will be greatly weakened: Resistances will suffer and Resisting Spells will suffer. A successful parry instantly ends the weakness. If you succeed, however, you will be infused with strength and healing. Your swing speed will also be boosted for a short duration. With practice, you will learn how to master your Bushido abilities.

Return to me once you feel that you have become an Apprentice Samurai. - RefusalMessage = 1078011; // Good journey to you. Return to me if you wish to live the life of a Samurai. - InProgressMessage = - 1078012; // You are not ready to become an Apprentice Samurai. There are still more undead to lay to rest. Return to me once you have done so. - CompletionMessage = - 1078014; // You have proven yourself young one. You will continue to improve as your skills are honed with age. You are an honorable warrior, worthy of the rank of Apprentice Samurai. Please accept this no-dachi as a gift. It is called "The Dragon's Tail". Upon a successful strike in combat, there is a chance this mighty weapon will replenish your stamina equal to the damage of your attack. I hope "The Dragon's Tail" serves you well. You have earned it. Farewell for now. - CompletionNotice = - 1078013; // You have achieved the rank of Apprentice Samurai. Return to Hamato in New Haven to report your progress. - - Objectives.Add(new GainSkillObjective(SkillName.Bushido, 500, true, true)); - - Rewards.Add(new ItemReward(1078015, typeof(TheDragonsTail))); // The Dragon's Tail - } - } - - public class TheAllureOfDarkMagic : MLQuest - { - public TheAllureOfDarkMagic() - { - Activated = true; - OneTimeOnly = true; - Title = 1078036; // The Allure of Dark Magic - Description = - 1078039; // Head East out of town and go to Old Haven. Cast Evil Omen and Pain Spike against monsters there until you have raised your Necromancy skill to 50.
------

Welcome! I see you are allured by the dark magic of Necromancy. First, you must prove yourself worthy of such knowledge. Undead currently occupy the town of Old Haven. Practice your harmful Necromancy spells on them such as Evil Omen and Pain Spike.

Make sure you have plenty of reagents before embarking on your journey. Reagents are required to cast Necromancy spells. You can purchase extra reagents from me, or you can find reagents growing in the nearby wooded areas. You can see which reagents are required for each spell by looking in your spellbook.

Come back to me once you feel that you are worthy of the rank of Apprentice Necromancer and I will reward you with the knowledge you desire. - RefusalMessage = 1078040; // You are weak after all. Come back to me when you are ready to practice Necromancy. - InProgressMessage = - 1078041; // You have not achieved the rank of Apprentice Necromancer. Come back to me once you feel that you are worthy of the rank of Apprentice Necromancer and I will reward you with the knowledge you desire. - CompletionMessage = - 1078043; // You have done well, my young apprentice. Behold! I now present to you the knowledge you desire. This spellbook contains all the Necromancer spells. The power is intoxicating, isn't it? - CompletionNotice = - 1078042; // You have achieved the rank of Apprentice Necromancer. Return to Mulcivikh in New Haven to receive the knowledge you desire. - - Objectives.Add(new GainSkillObjective(SkillName.Necromancy, 500, true, true)); - - Rewards.Add(new InternalReward()); } - private class InternalReward : ItemReward + public override Item CreateItem() { - public InternalReward() - : base(1078052, typeof(NecromancerSpellbook)) // Complete Necromancer Spellbook + var item = base.CreateItem(); + + if (item is Spellbook book) { + book.Content = (1ul << book.BookCount) - 1; } - public override Item CreateItem() - { - var item = base.CreateItem(); - - if (item is Spellbook book) - { - book.Content = (1ul << book.BookCount) - 1; - } - - return item; - } - } - } - - public class ChannelingTheSupernatural : MLQuest - { - public ChannelingTheSupernatural() - { - Activated = true; - OneTimeOnly = true; - Title = 1078044; // Channeling the Supernatural - Description = - 1078047; // Head East out of town and go to Old Haven. Use Spirit Speak and channel energy from either yourself or nearby corpses there. You can also cast Necromancy spells as well to raise Spirit Speak. Do these activities until you have raised your Spirit Speak skill to 50.
------

How do you do? Channeling the supernatural through Spirit Speak allows you heal your wounds. Such channeling expends your mana, so be mindful of this. Spirit Speak enhances the potency of your Necromancy spells. The channeling powers of a Medium are quite useful when practicing the dark magic of Necromancy.

It is best to practice Spirit Speak where there are a lot of corpses. Head East out of town and go to Old Haven. Undead currently reside there. Use Spirit Speak and channel energy from either yourself or nearby corpses. You can also cast Necromancy spells as well to raise Spirit Speak.

Come back to me once you feel that you are worthy of the rank of Apprentice Medium and I will reward you with something useful. - RefusalMessage = - 1078048; // Channeling the supernatural isn't for everyone. It is a dark art. See me if you ever wish to pursue the life of a Medium. - InProgressMessage = - 1078049; // Back so soon? You have not achieved the rank of Apprentice Medium. Come back to me once you feel that you are worthy of the rank of Apprentice Medium and I will reward you with something useful. - CompletionMessage = - 1078051; // Well done! Channeling the supernatural is taxing, indeed. As promised, I will reward you with this bag of Necromancer reagents. You will need these if you wish to also pursue the dark magic of Necromancy. Good journey to you. - CompletionNotice = - 1078050; // You have achieved the rank of Apprentice Medium. Return to Morganna in New Haven to receive your reward. - - Objectives.Add(new GainSkillObjective(SkillName.SpiritSpeak, 500, true, true)); - - Rewards.Add(new ItemReward(1078053, typeof(BagOfNecromancerReagents))); // Bag of Necromancer Reagents - } - } - - public class TheDeluciansLostMine : MLQuest - { - public TheDeluciansLostMine() - { - Activated = true; - OneTimeOnly = true; - Title = 1077750; // The Delucian’s Lost Mine - Description = - 1077753; // Find Jacob's Lost Mine and mine iron ore there, using a pickaxe or shovel. Bring it back to Jacob's forge and smelt the ore into ingots, until you have raised your Mining skill to 50. You may find a packhorse useful for hauling the ore around. The animal trainer in New Haven has packhorses for sale.
-----

Howdy! Welcome to my camp. It's not much, I know, but it's all I'll be needin' up here. I don't need them fancy things those townspeople have down there in New Haven. Nope, not one bit. Just me, Bessie, my pick and a thick vein 'o valorite.

Anyhows, I'm guessin' that you're up here to ask me about minin', aren't ya? Well, don't be expectin' me to tell you where the valorite's at, cause I ain't gonna tell the King of Britannia, much less the likes of you. But I will show ya how to mine and smelt iron, cause there certainly is a 'nough of up in these hills.

*Jacob looks around, with a perplexed look on his face*

Problem is, I can't remember where my iron mine's at, so you'll have to find it yourself. Once you're there, have at it with a pickaxe or shovel, then haul it back to camp and I'll show ya how to smelt it. Ya look a bit wimpy, so you might wanna go buy yourself a packhorse in town from the animal trainer to help you haul around all that ore.

When you're an Apprentice Miner, talk to me and I'll give ya a little somethin' I've got layin' around here... somewhere. - RefusalMessage = - 1077754; // Couldn’t find my iron mine, could ya? Well, neither can I!

*Jacob laughs*

Oh, ya don’t wanna find it? Well, allrighty then, ya might as well head on back down to town then and stop cluttering up my camp. Come back and talk to me if you’re interested in learnin’ ‘bout minin’. - InProgressMessage = - 1077755; // Where ya been off a gallivantin’ all day, pilgrim? You ain’t seen no hard work yet! Get yer arse back out there to my mine and dig up some more iron. Don’t forget to take a pickaxe or shovel, and if you’re so inclined, a packhorse too. - CompletionMessage = - 1077757; // Dang gun it! If that don't beat all! Ya went and did it, didn’t ya? What we got ourselves here is a mighty fine brand spankin’ new Apprentice Miner!

I can see ya put some meat on them bones too while you were at it!

Here’s that little somethin’ I told ya I had for ya. It’s a pickaxe with some high falutin’ magic inside that’ll help you find the good stuff when you’re off minin’. It wears out fast, though, so you can only use it a few times a day.

Welp, I’ve got some smeltin’ to do, so off with ya. Good luck, pilgrim! - CompletionNotice = - 1077756; // You have achieved the rank of Apprentice Miner. Return to Jacob Waltz in at his camp in the hills above New Haven as soon as you can to claim your reward. - - Objectives.Add(new GainSkillObjective(SkillName.Mining, 500, true, true)); - - Rewards.Add(new ItemReward(1077758, typeof(JacobsPickaxe))); // Jacob's Pickaxe - } - } - - public class ItsHammerTime : MLQuest - { - public ItsHammerTime() - { - Activated = true; - OneTimeOnly = true; - Title = 1077732; // It’s Hammer Time! - Description = - 1077735; // Create new daggers and maces using the forge and anvil in George's shop. Try making daggers up to 45 skill, the switch to making maces until 50 skill.
-----

Hail, and welcome to my humble shop. I'm George Hephaestus, New Haven's blacksmith. I assume that you're here to ask me to train you to be an Apprentice Blacksmith. I certainly can do that, but you're going to have to supply your own ingots.

You can always buy them at the market, but I highly suggest that you mine your own. That way, any items you sell will be pure profit!

So, once you have a supply of ingots, use my forge and anvil here to create items. You'll also need a supply of the proper tools; you can use a smith's hammer, a sledgehammer or tongs. You can either make them yourself if you have the tinkering skill, or buy them from a tinker at the market.

Since I'll be around to give you advice, you'll learn faster here than anywhere else. Start off making daggers until you reach 45 blacksmithing skill, then switch to maces until you've achieved 50. Once you've done that, come talk to me and I'll give you something for your hard work. - RefusalMessage = - 1077736; // You're not interested in learning to be a smith, eh? I thought for sure that's why you were here. Oh well, if you change your mind, you can always come back and talk to me. - InProgressMessage = - 1077737; // You’re doing well, but you’re not quite there yet. Remember that the quickest way to learn is to make daggers up until 45 skill, and then switch to maces. Also, don’t forget that using my forge and anvil will help you learn faster. - CompletionMessage = - 1077739; // I've been watching you get better and better as you've been smithing, and I have to say, you're a natural! It's a long road to being a Grandmaster Blacksmith, but I have no doubt that if you put your mind to it you'll get there someday. Let me give you one final piece of advice. If you're smithing just to practice and improve your skill, make items that are moderately difficult (60-80% success chance), and try to stick to ones that use less ingots.

Now that you're an Apprentice Blacksmith, I have something for you. While you were busy practicing, I was crafting this hammer for you. It's finely balanced, and has a bit of magic imbued within that will help you craft better items. However, that magic needs to restore itself over time, so you can only use it so many times per day. I hope you find it useful! - CompletionNotice = - 1077738; // You have achieved the rank of Apprentice Blacksmith. Return to George Hephaestus in New Haven to see what kind of reward he has waiting for you. - - Objectives.Add(new GainSkillObjective(SkillName.Blacksmith, 500, true, true)); - - Rewards.Add(new ItemReward(1077740, typeof(HammerOfHephaestus))); // Hammer of Hephaestus - } - } - - public class Aelorn : KeeperOfChivalry - { - [Constructible] - public Aelorn() - { - Title = "the Chivalry Instructor"; - Body = 0x190; - Hue = 0x83EA; - HairItemID = 0x203C; - HairHue = 0x47D; - FacialHairItemID = 0x204D; - FacialHairHue = 0x47D; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - SetSkill(SkillName.Anatomy, 120.0); - SetSkill(SkillName.MagicResist, 120.0); - SetSkill(SkillName.Tactics, 120.0); - SetSkill(SkillName.Swords, 120.0); - SetSkill(SkillName.Meditation, 120.0); - SetSkill(SkillName.Focus, 120.0); - SetSkill(SkillName.Chivalry, 120.0); - } - - public Aelorn(Serial serial) - : base(serial) - { - } - - public override string DefaultName => "Aelorn"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1078133); // Hail, friend. Want to live the life of a paladin? - } - - public override void InitOutfit() - { - AddItem(new Backpack()); - AddItem(new VikingSword()); - AddItem(new PlateChest()); - AddItem(new PlateLegs()); - AddItem(new PlateGloves()); - AddItem(new PlateArms()); - AddItem(new PlateGorget()); - AddItem(new OrderShield()); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Dimethro : BaseCreature - { - [Constructible] - public Dimethro() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Wrestling Instructor"; - Body = 0x190; - Hue = 0x83EA; - HairItemID = 0x203D; - HairHue = 0x455; - FacialHairItemID = 0x204D; - FacialHairHue = 0x455; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - SetSkill(SkillName.EvalInt, 120.0); - SetSkill(SkillName.Inscribe, 120.0); - SetSkill(SkillName.Magery, 120.0); - SetSkill(SkillName.MagicResist, 120.0); - SetSkill(SkillName.Wrestling, 120.0); - SetSkill(SkillName.Meditation, 120.0); - - AddItem(new Backpack()); - AddItem(new Sandals(0x455)); - AddItem(new BodySash(0x455)); - AddItem(new LongPants(0x455)); - } - - public Dimethro(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Dimethro"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1078128); // You there! Wanna master hand to hand defense? Of course you do! - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Churchill : BaseCreature - { - [Constructible] - public Churchill() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Mace Fighting Instructor"; - Body = 0x190; - Hue = 0x83EA; - HairItemID = 0x203C; - HairHue = 0x455; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - SetSkill(SkillName.Anatomy, 120.0); - SetSkill(SkillName.Parry, 120.0); - SetSkill(SkillName.Healing, 120.0); - SetSkill(SkillName.Tactics, 120.0); - SetSkill(SkillName.Macing, 120.0); - SetSkill(SkillName.Focus, 120.0); - - AddItem(new Backpack()); - AddItem(new OrderShield()); - AddItem(new WarMace()); - - Item item; - - item = new PlateLegs(); - item.Hue = 0x966; - AddItem(item); - - item = new PlateGloves(); - item.Hue = 0x966; - AddItem(item); - - item = new PlateGorget(); - item.Hue = 0x966; - AddItem(item); - - item = new PlateChest(); - item.Hue = 0x966; - AddItem(item); - - item = new PlateArms(); - item.Hue = 0x966; - AddItem(item); - } - - public Churchill(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Churchill"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1078141); // Don't listen to Jockles. Real warriors wield mace weapons! - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Robyn : Bowyer - { - [Constructible] - public Robyn() - { - Title = "the Archery Instructor"; - Body = 0x191; - Hue = 0x83EA; - HairItemID = 0x203C; - HairHue = 0x47D; - Female = true; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - SetSkill(SkillName.Anatomy, 120.0); - SetSkill(SkillName.Parry, 120.0); - SetSkill(SkillName.Fletching, 120.0); - SetSkill(SkillName.Healing, 120.0); - SetSkill(SkillName.Tactics, 120.0); - SetSkill(SkillName.Archery, 120.0); - SetSkill(SkillName.Focus, 120.0); - } - - public Robyn(Serial serial) - : base(serial) - { - } - - public override string DefaultName => "Robyn"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1078202); // Archery requires a steady aim and dexterous fingers. - } - - public override void InitOutfit() - { - AddItem(new Backpack()); - AddItem(new Boots(0x592)); - AddItem(new Cloak(0x592)); - AddItem(new Bandana(0x592)); - AddItem(new CompositeBow()); - - Item item; - - item = new StuddedLegs(); - item.Hue = 0x592; - AddItem(item); - - item = new StuddedGloves(); - item.Hue = 0x592; - AddItem(item); - - item = new StuddedGorget(); - item.Hue = 0x592; - AddItem(item); - - item = new StuddedChest(); - item.Hue = 0x592; - AddItem(item); - - item = new StuddedArms(); - item.Hue = 0x592; - AddItem(item); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Recaro : BaseCreature - { - [Constructible] - public Recaro() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Fencer Instructor"; - Body = 0x190; - Hue = 0x83EA; - HairItemID = 0x203C; - HairHue = 0x455; - FacialHairItemID = 0x204D; - FacialHairHue = 0x455; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - SetSkill(SkillName.Anatomy, 120.0); - SetSkill(SkillName.Parry, 120.0); - SetSkill(SkillName.Healing, 120.0); - SetSkill(SkillName.Tactics, 120.0); - SetSkill(SkillName.Fencing, 120.0); - SetSkill(SkillName.Focus, 120.0); - - AddItem(new Backpack()); - AddItem(new Shoes(0x455)); - AddItem(new WarFork()); - - Item item; - - item = new StuddedLegs(); - item.Hue = 0x455; - AddItem(item); - - item = new StuddedGloves(); - item.Hue = 0x455; - AddItem(item); - - item = new StuddedGorget(); - item.Hue = 0x455; - AddItem(item); - - item = new StuddedChest(); - item.Hue = 0x455; - AddItem(item); - - item = new StuddedArms(); - item.Hue = 0x455; - AddItem(item); - } - - public Recaro(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Recaro"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - // The art of fencing requires a dexterous hand, a quick wit and fleet feet. - MLQuestSystem.Tell(this, pm, 1078187); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class AldenArmstrong : BaseCreature - { - [Constructible] - public AldenArmstrong() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Tactics Instructor"; - Body = 0x190; - Hue = 0x83EA; - HairItemID = 0x203B; - HairHue = 0x44E; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - SetSkill(SkillName.Anatomy, 120.0); - SetSkill(SkillName.Parry, 120.0); - SetSkill(SkillName.Healing, 120.0); - SetSkill(SkillName.Tactics, 120.0); - SetSkill(SkillName.Swords, 120.0); - SetSkill(SkillName.Focus, 120.0); - - AddItem(new Backpack()); - AddItem(new Shoes()); - AddItem(new StuddedLegs()); - AddItem(new StuddedGloves()); - AddItem(new StuddedGorget()); - AddItem(new StuddedChest()); - AddItem(new StuddedArms()); - AddItem(new Katana()); - } - - public AldenArmstrong(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Alden Armstrong"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - // There is an art to slaying your enemies swiftly. It's called tactics, and I can teach it to you. - MLQuestSystem.Tell(this, pm, 1078136); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Jockles : BaseCreature - { - [Constructible] - public Jockles() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Swordsmanship Instructor"; - Body = 0x190; - Hue = 0x83FA; - HairItemID = 0x203C; - HairHue = 0x8A7; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - SetSkill(SkillName.Anatomy, 120.0); - SetSkill(SkillName.Parry, 120.0); - SetSkill(SkillName.Healing, 120.0); - SetSkill(SkillName.Tactics, 120.0); - SetSkill(SkillName.Swords, 120.0); - SetSkill(SkillName.Focus, 120.0); - - AddItem(new Backpack()); - AddItem(new Broadsword()); - AddItem(new PlateChest()); - AddItem(new PlateLegs()); - AddItem(new PlateGloves()); - AddItem(new PlateArms()); - AddItem(new PlateGorget()); - AddItem(new OrderShield()); - } - - public Jockles(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Jockles"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1078135); // Talk to me to learn the way of the blade. - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class TylAriadne : BaseCreature - { - [Constructible] - public TylAriadne() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Parrying Instructor"; - Body = 0x190; - Hue = 0x8374; - HairItemID = 0; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - SetSkill(SkillName.Anatomy, 120.0); - SetSkill(SkillName.Parry, 120.0); - SetSkill(SkillName.Healing, 120.0); - SetSkill(SkillName.Tactics, 120.0); - SetSkill(SkillName.Swords, 120.0); - SetSkill(SkillName.Meditation, 120.0); - SetSkill(SkillName.Focus, 120.0); - - AddItem(new Backpack()); - AddItem(new ElvenBoots(0x96D)); - - Item item; - - item = new StuddedLegs(); - item.Hue = 0x96D; - AddItem(item); - - item = new StuddedGloves(); - item.Hue = 0x96D; - AddItem(item); - - item = new StuddedGorget(); - item.Hue = 0x96D; - AddItem(item); - - item = new StuddedChest(); - item.Hue = 0x96D; - AddItem(item); - - item = new StuddedArms(); - item.Hue = 0x96D; - AddItem(item); - - item = new DiamondMace(); - item.Hue = 0x96D; - AddItem(item); - } - - public TylAriadne(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Tyl Ariadne"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1078140); // Want to learn how to parry blows? - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Alefian : BaseCreature - { - [Constructible] - public Alefian() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Resisting Spells Instructor"; - Body = 0x190; - Hue = 0x83EA; - HairItemID = 0x203D; - HairHue = 0x457; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - SetSkill(SkillName.EvalInt, 120.0); - SetSkill(SkillName.Inscribe, 120.0); - SetSkill(SkillName.Magery, 120.0); - SetSkill(SkillName.MagicResist, 120.0); - SetSkill(SkillName.Wrestling, 120.0); - SetSkill(SkillName.Meditation, 120.0); - - AddItem(new Backpack()); - AddItem(new Robe()); - AddItem(new Sandals()); - } - - public Alefian(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Alefian"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1078130); // A mage should learn how to resist spells. - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Gustar : BaseCreature - { - [Constructible] - public Gustar() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Meditation Instructor"; - Body = 0x190; - Hue = 0x83F5; - HairItemID = 0x203B; - HairHue = 0x455; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - SetSkill(SkillName.EvalInt, 120.0); - SetSkill(SkillName.Inscribe, 120.0); - SetSkill(SkillName.Magery, 120.0); - SetSkill(SkillName.MagicResist, 120.0); - SetSkill(SkillName.Wrestling, 120.0); - SetSkill(SkillName.Meditation, 120.0); - - AddItem(new Backpack()); - AddItem(new GustarShroud()); - AddItem(new Sandals()); - } - - public Gustar(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Gustar"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1078126); // Meditation allows a mage to replenish mana quickly. I can teach you. - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class GustarShroud : BaseOuterTorso - { - [Constructible] - public GustarShroud() : base(0x2684) => Hue = 0x479; - - public GustarShroud(Serial serial) : base(serial) - { - } - - public override string DefaultName => " "; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // Version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Jillian : BaseCreature - { - [Constructible] - public Jillian() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Inscription Instructor"; - Body = 0x191; - Female = true; - Hue = 0x83EA; - HairItemID = 0x203D; - HairHue = 0x455; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - SetSkill(SkillName.EvalInt, 120.0); - SetSkill(SkillName.Inscribe, 120.0); - SetSkill(SkillName.Magery, 120.0); - SetSkill(SkillName.MagicResist, 120.0); - SetSkill(SkillName.Wrestling, 120.0); - SetSkill(SkillName.Meditation, 120.0); - - AddItem(new Backpack()); - AddItem(new Robe(0x479)); - AddItem(new Sandals()); - } - - public Jillian(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Jillian"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1078129); // I can teach you how to scribe magic scrolls. - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Kaelynna : BaseCreature - { - [Constructible] - public Kaelynna() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Magery Instructor"; - Body = 0x191; - Female = true; - Hue = 0x83EA; - HairItemID = 0x203C; - HairHue = 0x47D; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - SetSkill(SkillName.EvalInt, 120.0); - SetSkill(SkillName.Inscribe, 120.0); - SetSkill(SkillName.Magery, 120.0); - SetSkill(SkillName.MagicResist, 120.0); - SetSkill(SkillName.Wrestling, 120.0); - SetSkill(SkillName.Meditation, 120.0); - - AddItem(new Backpack()); - AddItem(new Robe(0x592)); - AddItem(new Sandals()); - } - - public Kaelynna(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Kaelynna"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1078125); // Want to unlock the secrets of magery? - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Mithneral : BaseCreature - { - [Constructible] - public Mithneral() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Evaluating Intelligence Instructor"; - Body = 0x190; - Hue = 0x83EA; - HairItemID = 0x203C; - HairHue = 0x455; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - SetSkill(SkillName.EvalInt, 120.0); - SetSkill(SkillName.Inscribe, 120.0); - SetSkill(SkillName.Magery, 120.0); - SetSkill(SkillName.MagicResist, 120.0); - SetSkill(SkillName.Wrestling, 120.0); - SetSkill(SkillName.Meditation, 120.0); - - AddItem(new Backpack()); - AddItem(new Sandals()); - - Item item; - - item = new GustarShroud(); - item.Hue = 0x51C; - AddItem(item); - } - - public Mithneral(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Mithneral"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1078127); // Want to maximize your spell damage? I have a scholarly task for you! - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class AmeliaYoungstone : Tinker - { - [Constructible] - public AmeliaYoungstone() - { - Title = "the Tinkering Instructor"; - Body = 0x191; - Female = true; - Hue = 0x83EA; - HairItemID = 0x203D; - HairHue = 0x46C; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - SetSkill(SkillName.ArmsLore, 120.0); - SetSkill(SkillName.Blacksmith, 120.0); - SetSkill(SkillName.Magery, 120.0); - SetSkill(SkillName.Tactics, 120.0); - SetSkill(SkillName.Swords, 120.0); - SetSkill(SkillName.Tinkering, 120.0); - SetSkill(SkillName.Mining, 120.0); - } - - public AmeliaYoungstone(Serial serial) - : base(serial) - { - } - - public override string DefaultName => "Amelia Youngstone"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1078123); // Tinkering is very useful for a blacksmith. You can make your own tools. - } - - public override void InitOutfit() - { - AddItem(new Backpack()); - AddItem(new Sandals()); - AddItem(new Doublet()); - AddItem(new ShortPants()); - AddItem(new HalfApron(0x8AB)); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class AndreasVesalius : BaseCreature - { - [Constructible] - public AndreasVesalius() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Anatomy Instructor"; - Body = 0x190; - Hue = 0x83EC; - HairItemID = 0x203C; - HairHue = 0x477; - FacialHairItemID = 0x203E; - FacialHairHue = 0x477; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - SetSkill(SkillName.Anatomy, 120.0); - SetSkill(SkillName.Parry, 120.0); - SetSkill(SkillName.Healing, 120.0); - SetSkill(SkillName.Tactics, 120.0); - SetSkill(SkillName.Swords, 120.0); - SetSkill(SkillName.Focus, 120.0); - - AddItem(new Backpack()); - AddItem(new Boots()); - AddItem(new BlackStaff()); - AddItem(new LongPants()); - AddItem(new Tunic(0x66D)); - } - - public AndreasVesalius(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Andreas Vesalius"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1078138); // Learning of the body will allow you to excel in combat. - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Avicenna : BaseCreature - { - [Constructible] - public Avicenna() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Healing Instructor"; - Body = 0x190; - Hue = 0x83EA; - HairItemID = 0x203B; - HairHue = 0x477; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - SetSkill(SkillName.Anatomy, 120.0); - SetSkill(SkillName.Parry, 120.0); - SetSkill(SkillName.Healing, 120.0); - SetSkill(SkillName.Tactics, 120.0); - SetSkill(SkillName.Swords, 120.0); - SetSkill(SkillName.Focus, 120.0); - - AddItem(new Backpack()); - AddItem(new Robe(0x66D)); - AddItem(new Boots()); - AddItem(new GnarledStaff()); - } - - public Avicenna(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Avicenna"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1078137); // A warrior needs to learn how to apply bandages to wounds. - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class SarsmeaSmythe : BaseCreature - { - [Constructible] - public SarsmeaSmythe() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Focus Instructor"; - Body = 0x191; - Female = true; - Hue = 0x83EA; - HairItemID = 0x203C; - HairHue = 0x456; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - SetSkill(SkillName.Anatomy, 120.0); - SetSkill(SkillName.Parry, 120.0); - SetSkill(SkillName.Healing, 120.0); - SetSkill(SkillName.Tactics, 120.0); - SetSkill(SkillName.Swords, 120.0); - SetSkill(SkillName.Focus, 120.0); - - AddItem(new Backpack()); - AddItem(new ThighBoots()); - AddItem(new StuddedGorget()); - AddItem(new LeatherLegs()); - AddItem(new FemaleLeatherChest()); - AddItem(new StuddedGloves()); - AddItem(new LeatherNinjaBelt()); - AddItem(new LightPlateJingasa()); - } - - public SarsmeaSmythe(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Sarsmea Smythe"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1078139); // Know yourself, and you will become a true warrior. - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Ryuichi : BaseVendor - { - private readonly List m_SBInfos = new(); - - [Constructible] - public Ryuichi() - : base("the Ninjitsu Instructor") - { - Hue = 0x8403; - - SetSkill(SkillName.Hiding, 120.0); - SetSkill(SkillName.Tactics, 120.0); - SetSkill(SkillName.Tracking, 120.0); - SetSkill(SkillName.Fencing, 120.0); - SetSkill(SkillName.Stealth, 120.0); - SetSkill(SkillName.Ninjitsu, 120.0); - } - - public Ryuichi(Serial serial) - : base(serial) - { - } - - protected override List SBInfos => m_SBInfos; - - public override string DefaultName => "Ryuichi"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1078155); // I can teach you Ninjitsu. The Art of Stealth. - } - - public override void InitSBInfo() - { - m_SBInfos.Add(new SBNinja()); - } - - public override bool GetGender() => false; - - public override void InitOutfit() - { - HairItemID = 0x203B; - HairHue = 0x455; - - AddItem(new SamuraiTabi()); - AddItem(new LeatherNinjaPants()); - AddItem(new LeatherNinjaMitts()); - AddItem(new LeatherNinjaHood()); - AddItem(new LeatherNinjaJacket()); - AddItem(new LeatherNinjaBelt()); - - PackGold(100, 200); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Chiyo : BaseCreature - { - [Constructible] - public Chiyo() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Hiding Instructor"; - Body = 0xF7; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - SetSkill(SkillName.Hiding, 120.0); - SetSkill(SkillName.Tactics, 120.0); - SetSkill(SkillName.Tracking, 120.0); - SetSkill(SkillName.Fencing, 120.0); - SetSkill(SkillName.Stealth, 120.0); - SetSkill(SkillName.Ninjitsu, 120.0); - } - - public Chiyo(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Chiyo"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1078165); // To be undetected means you cannot be harmed. - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Jun : BaseCreature - { - [Constructible] - public Jun() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Stealth Instructor"; - Body = 0x190; - Hue = 0x8403; - HairItemID = 0x203B; - HairHue = 0x455; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - SetSkill(SkillName.Hiding, 120.0); - SetSkill(SkillName.Tactics, 120.0); - SetSkill(SkillName.Tracking, 120.0); - SetSkill(SkillName.Fencing, 120.0); - SetSkill(SkillName.Stealth, 120.0); - SetSkill(SkillName.Ninjitsu, 120.0); - - AddItem(new Backpack()); - AddItem(new SamuraiTabi()); - AddItem(new LeatherNinjaPants()); - AddItem(new LeatherNinjaMitts()); - AddItem(new LeatherNinjaHood()); - AddItem(new LeatherNinjaJacket()); - AddItem(new LeatherNinjaBelt()); - } - - public Jun(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Jun"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1078175); // Walk Silently. Remain unseen. I can teach you. - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Walker : BaseCreature - { - [Constructible] - public Walker() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Tracking Instructor"; - Body = 0x190; - Hue = 0x83EA; - HairItemID = 0x203B; - HairHue = 0x47D; - FacialHairItemID = 0x204B; - FacialHairHue = 0x47D; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - SetSkill(SkillName.Hiding, 120.0); - SetSkill(SkillName.Tactics, 120.0); - SetSkill(SkillName.Tracking, 120.0); - SetSkill(SkillName.Fencing, 120.0); - SetSkill(SkillName.Wrestling, 120.0); - SetSkill(SkillName.Stealth, 120.0); - SetSkill(SkillName.Ninjitsu, 120.0); - - AddItem(new Backpack()); - AddItem(new Boots(0x455)); - AddItem(new LongPants(0x455)); - AddItem(new FancyShirt(0x47D)); - AddItem(new FloppyHat(0x455)); - } - - public Walker(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Walker"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell( - this, - pm, - Utility.RandomList( - 1078213, // I don't sleep. I wait. - 1078212, // There is no theory of evolution. Just a list of creatures I allow to live. - 1078214 // I can lead a horse to water and make it drink. - ) - ); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Hamato : BaseVendor - { - private readonly List m_SBInfos = new(); - - [Constructible] - public Hamato() - : base("the Bushido Instructor") - { - Hue = 0x8403; - - SetSkill(SkillName.Anatomy, 120.0); - SetSkill(SkillName.Parry, 120.0); - SetSkill(SkillName.Healing, 120.0); - SetSkill(SkillName.Tactics, 120.0); - SetSkill(SkillName.Swords, 120.0); - SetSkill(SkillName.Bushido, 120.0); - } - - public Hamato(Serial serial) - : base(serial) - { - } - - protected override List SBInfos => m_SBInfos; - - public override string DefaultName => "Hamato"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1078134); // Seek me to learn the way of the samurai. - } - - public override void InitSBInfo() - { - m_SBInfos.Add(new SBSamurai()); - } - - public override bool GetGender() => false; - - public override void InitOutfit() - { - HairItemID = 0x203D; - HairHue = 0x497; - - AddItem(new Backpack()); - AddItem(new NoDachi()); - AddItem(new NinjaTabi()); - AddItem(new PlateSuneate()); - AddItem(new LightPlateJingasa()); - AddItem(new LeatherDo()); - AddItem(new LeatherHiroSode()); - - PackGold(100, 200); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Mulcivikh : Mage - { - [Constructible] - public Mulcivikh() - { - Title = "the Necromancy Instructor"; - Body = 0x190; - Hue = 0x83EA; - HairItemID = 0x203D; - HairHue = 0x457; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - SetSkill(SkillName.Magery, 120.0); - SetSkill(SkillName.MagicResist, 120.0); - SetSkill(SkillName.SpiritSpeak, 120.0); - SetSkill(SkillName.Swords, 120.0); - SetSkill(SkillName.Meditation, 120.0); - SetSkill(SkillName.Necromancy, 120.0); - } - - public Mulcivikh(Serial serial) - : base(serial) - { - } - - public override string DefaultName => "Mulcivikh"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1078131); // Allured by dark magic, aren't you? - } - - public override void InitOutfit() - { - AddItem(new Backpack()); - AddItem(new Sandals(0x8FD)); - AddItem(new BoneHelm()); - - Item item; - - item = new LeatherLegs(); - item.Hue = 0x2C3; - AddItem(item); - - item = new LeatherGloves(); - item.Hue = 0x2C3; - AddItem(item); - - item = new LeatherGorget(); - item.Hue = 0x2C3; - AddItem(item); - - item = new LeatherChest(); - item.Hue = 0x2C3; - AddItem(item); - - item = new LeatherArms(); - item.Hue = 0x2C3; - AddItem(item); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Morganna : Mage - { - [Constructible] - public Morganna() - { - Title = "the Spirit Speak Instructor"; - Body = 0x191; - Female = true; - Hue = 0x83EA; - HairItemID = 0x203C; - HairHue = 0x455; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - SetSkill(SkillName.Magery, 120.0); - SetSkill(SkillName.MagicResist, 120.0); - SetSkill(SkillName.SpiritSpeak, 120.0); - SetSkill(SkillName.Swords, 120.0); - SetSkill(SkillName.Meditation, 120.0); - SetSkill(SkillName.Necromancy, 120.0); - } - - public Morganna(Serial serial) - : base(serial) - { - } - - public override string DefaultName => "Morganna"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1078132); // Want to learn how to channel the supernatural? - } - - public override void InitOutfit() - { - AddItem(new Backpack()); - AddItem(new Sandals()); - AddItem(new Robe(0x47D)); - AddItem(new SkullCap(0x455)); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class JacobWaltz : BaseCreature - { - [Constructible] - public JacobWaltz() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Miner Instructor"; - Body = 0x190; - Hue = 0x83EA; - HairItemID = 0x2048; - HairHue = 0x44E; - FacialHairItemID = 0x204D; - FacialHairHue = 0x44E; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - SetSkill(SkillName.ArmsLore, 120.0); - SetSkill(SkillName.Blacksmith, 120.0); - SetSkill(SkillName.Magery, 120.0); - SetSkill(SkillName.Tactics, 120.0); - SetSkill(SkillName.Tinkering, 120.0); - SetSkill(SkillName.Swords, 120.0); - SetSkill(SkillName.Mining, 120.0); - - AddItem(new Backpack()); - AddItem(new Pickaxe()); - AddItem(new Boots()); - AddItem(new WideBrimHat(0x966)); - AddItem(new ShortPants(0x370)); - AddItem(new Shirt(0x966)); - AddItem(new HalfApron(0x1BB)); - } - - public JacobWaltz(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Jacob Waltz"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1078124); // You there! I can use some help mining these rocks! - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class GeorgeHephaestus : Blacksmith - { - [Constructible] - public GeorgeHephaestus() - { - Title = "the Blacksmith Instructor"; - Body = 0x190; - Hue = 0x83EA; - HairItemID = 0x203B; - HairHue = 0x47B; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - SetSkill(SkillName.ArmsLore, 120.0); - SetSkill(SkillName.Blacksmith, 120.0); - SetSkill(SkillName.Magery, 120.0); - SetSkill(SkillName.Tactics, 120.0); - SetSkill(SkillName.Tinkering, 120.0); - SetSkill(SkillName.Swords, 120.0); - SetSkill(SkillName.Mining, 120.0); - } - - public GeorgeHephaestus(Serial serial) - : base(serial) - { - } - - public override string DefaultName => "George Hephaestus"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1078122); // Wanna learn how to make powerful weapons and armor? Talk to me. - } - - public override void InitOutfit() - { - AddItem(new Backpack()); - AddItem(new Boots(0x973)); - AddItem(new LongPants()); - AddItem(new Bascinet()); - AddItem(new FullApron(0x8AB)); - - Item item; - - item = new SmithHammer(); - item.Hue = 0x8AB; - AddItem(item); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); + return item; } } } + +public class ChannelingTheSupernatural : MLQuest +{ + public ChannelingTheSupernatural() + { + Activated = true; + OneTimeOnly = true; + Title = 1078044; // Channeling the Supernatural + Description = + 1078047; // Head East out of town and go to Old Haven. Use Spirit Speak and channel energy from either yourself or nearby corpses there. You can also cast Necromancy spells as well to raise Spirit Speak. Do these activities until you have raised your Spirit Speak skill to 50.
------

How do you do? Channeling the supernatural through Spirit Speak allows you heal your wounds. Such channeling expends your mana, so be mindful of this. Spirit Speak enhances the potency of your Necromancy spells. The channeling powers of a Medium are quite useful when practicing the dark magic of Necromancy.

It is best to practice Spirit Speak where there are a lot of corpses. Head East out of town and go to Old Haven. Undead currently reside there. Use Spirit Speak and channel energy from either yourself or nearby corpses. You can also cast Necromancy spells as well to raise Spirit Speak.

Come back to me once you feel that you are worthy of the rank of Apprentice Medium and I will reward you with something useful. + RefusalMessage = + 1078048; // Channeling the supernatural isn't for everyone. It is a dark art. See me if you ever wish to pursue the life of a Medium. + InProgressMessage = + 1078049; // Back so soon? You have not achieved the rank of Apprentice Medium. Come back to me once you feel that you are worthy of the rank of Apprentice Medium and I will reward you with something useful. + CompletionMessage = + 1078051; // Well done! Channeling the supernatural is taxing, indeed. As promised, I will reward you with this bag of Necromancer reagents. You will need these if you wish to also pursue the dark magic of Necromancy. Good journey to you. + CompletionNotice = + 1078050; // You have achieved the rank of Apprentice Medium. Return to Morganna in New Haven to receive your reward. + + Objectives.Add(new GainSkillObjective(SkillName.SpiritSpeak, 500, true, true)); + + Rewards.Add(new ItemReward(1078053, typeof(BagOfNecromancerReagents))); // Bag of Necromancer Reagents + } +} + +public class TheDeluciansLostMine : MLQuest +{ + public TheDeluciansLostMine() + { + Activated = true; + OneTimeOnly = true; + Title = 1077750; // The Delucian’s Lost Mine + Description = + 1077753; // Find Jacob's Lost Mine and mine iron ore there, using a pickaxe or shovel. Bring it back to Jacob's forge and smelt the ore into ingots, until you have raised your Mining skill to 50. You may find a packhorse useful for hauling the ore around. The animal trainer in New Haven has packhorses for sale.
-----

Howdy! Welcome to my camp. It's not much, I know, but it's all I'll be needin' up here. I don't need them fancy things those townspeople have down there in New Haven. Nope, not one bit. Just me, Bessie, my pick and a thick vein 'o valorite.

Anyhows, I'm guessin' that you're up here to ask me about minin', aren't ya? Well, don't be expectin' me to tell you where the valorite's at, cause I ain't gonna tell the King of Britannia, much less the likes of you. But I will show ya how to mine and smelt iron, cause there certainly is a 'nough of up in these hills.

*Jacob looks around, with a perplexed look on his face*

Problem is, I can't remember where my iron mine's at, so you'll have to find it yourself. Once you're there, have at it with a pickaxe or shovel, then haul it back to camp and I'll show ya how to smelt it. Ya look a bit wimpy, so you might wanna go buy yourself a packhorse in town from the animal trainer to help you haul around all that ore.

When you're an Apprentice Miner, talk to me and I'll give ya a little somethin' I've got layin' around here... somewhere. + RefusalMessage = + 1077754; // Couldn’t find my iron mine, could ya? Well, neither can I!

*Jacob laughs*

Oh, ya don’t wanna find it? Well, allrighty then, ya might as well head on back down to town then and stop cluttering up my camp. Come back and talk to me if you’re interested in learnin’ ‘bout minin’. + InProgressMessage = + 1077755; // Where ya been off a gallivantin’ all day, pilgrim? You ain’t seen no hard work yet! Get yer arse back out there to my mine and dig up some more iron. Don’t forget to take a pickaxe or shovel, and if you’re so inclined, a packhorse too. + CompletionMessage = + 1077757; // Dang gun it! If that don't beat all! Ya went and did it, didn’t ya? What we got ourselves here is a mighty fine brand spankin’ new Apprentice Miner!

I can see ya put some meat on them bones too while you were at it!

Here’s that little somethin’ I told ya I had for ya. It’s a pickaxe with some high falutin’ magic inside that’ll help you find the good stuff when you’re off minin’. It wears out fast, though, so you can only use it a few times a day.

Welp, I’ve got some smeltin’ to do, so off with ya. Good luck, pilgrim! + CompletionNotice = + 1077756; // You have achieved the rank of Apprentice Miner. Return to Jacob Waltz in at his camp in the hills above New Haven as soon as you can to claim your reward. + + Objectives.Add(new GainSkillObjective(SkillName.Mining, 500, true, true)); + + Rewards.Add(new ItemReward(1077758, typeof(JacobsPickaxe))); // Jacob's Pickaxe + } +} + +public class ItsHammerTime : MLQuest +{ + public ItsHammerTime() + { + Activated = true; + OneTimeOnly = true; + Title = 1077732; // It’s Hammer Time! + Description = + 1077735; // Create new daggers and maces using the forge and anvil in George's shop. Try making daggers up to 45 skill, the switch to making maces until 50 skill.
-----

Hail, and welcome to my humble shop. I'm George Hephaestus, New Haven's blacksmith. I assume that you're here to ask me to train you to be an Apprentice Blacksmith. I certainly can do that, but you're going to have to supply your own ingots.

You can always buy them at the market, but I highly suggest that you mine your own. That way, any items you sell will be pure profit!

So, once you have a supply of ingots, use my forge and anvil here to create items. You'll also need a supply of the proper tools; you can use a smith's hammer, a sledgehammer or tongs. You can either make them yourself if you have the tinkering skill, or buy them from a tinker at the market.

Since I'll be around to give you advice, you'll learn faster here than anywhere else. Start off making daggers until you reach 45 blacksmithing skill, then switch to maces until you've achieved 50. Once you've done that, come talk to me and I'll give you something for your hard work. + RefusalMessage = + 1077736; // You're not interested in learning to be a smith, eh? I thought for sure that's why you were here. Oh well, if you change your mind, you can always come back and talk to me. + InProgressMessage = + 1077737; // You’re doing well, but you’re not quite there yet. Remember that the quickest way to learn is to make daggers up until 45 skill, and then switch to maces. Also, don’t forget that using my forge and anvil will help you learn faster. + CompletionMessage = + 1077739; // I've been watching you get better and better as you've been smithing, and I have to say, you're a natural! It's a long road to being a Grandmaster Blacksmith, but I have no doubt that if you put your mind to it you'll get there someday. Let me give you one final piece of advice. If you're smithing just to practice and improve your skill, make items that are moderately difficult (60-80% success chance), and try to stick to ones that use less ingots.

Now that you're an Apprentice Blacksmith, I have something for you. While you were busy practicing, I was crafting this hammer for you. It's finely balanced, and has a bit of magic imbued within that will help you craft better items. However, that magic needs to restore itself over time, so you can only use it so many times per day. I hope you find it useful! + CompletionNotice = + 1077738; // You have achieved the rank of Apprentice Blacksmith. Return to George Hephaestus in New Haven to see what kind of reward he has waiting for you. + + Objectives.Add(new GainSkillObjective(SkillName.Blacksmith, 500, true, true)); + + Rewards.Add(new ItemReward(1077740, typeof(HammerOfHephaestus))); // Hammer of Hephaestus + } +} + +public class Aelorn : KeeperOfChivalry +{ + [Constructible] + public Aelorn() + { + Title = "the Chivalry Instructor"; + Body = 0x190; + Hue = 0x83EA; + HairItemID = 0x203C; + HairHue = 0x47D; + FacialHairItemID = 0x204D; + FacialHairHue = 0x47D; + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + SetSkill(SkillName.Anatomy, 120.0); + SetSkill(SkillName.MagicResist, 120.0); + SetSkill(SkillName.Tactics, 120.0); + SetSkill(SkillName.Swords, 120.0); + SetSkill(SkillName.Meditation, 120.0); + SetSkill(SkillName.Focus, 120.0); + SetSkill(SkillName.Chivalry, 120.0); + } + + public Aelorn(Serial serial) + : base(serial) + { + } + + public override string DefaultName => "Aelorn"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1078133); // Hail, friend. Want to live the life of a paladin? + } + + public override void InitOutfit() + { + AddItem(new Backpack()); + AddItem(new VikingSword()); + AddItem(new PlateChest()); + AddItem(new PlateLegs()); + AddItem(new PlateGloves()); + AddItem(new PlateArms()); + AddItem(new PlateGorget()); + AddItem(new OrderShield()); + } + + public override void Serialize(IGenericWriter writer) + { + base.Serialize(writer); + + writer.Write(0); // version + } + + public override void Deserialize(IGenericReader reader) + { + base.Deserialize(reader); + + var version = reader.ReadInt(); + } +} + +[SerializationGenerator(0, false)] +public partial class Dimethro : BaseCreature +{ + [Constructible] + public Dimethro() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Wrestling Instructor"; + Body = 0x190; + Hue = 0x83EA; + HairItemID = 0x203D; + HairHue = 0x455; + FacialHairItemID = 0x204D; + FacialHairHue = 0x455; + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + SetSkill(SkillName.EvalInt, 120.0); + SetSkill(SkillName.Inscribe, 120.0); + SetSkill(SkillName.Magery, 120.0); + SetSkill(SkillName.MagicResist, 120.0); + SetSkill(SkillName.Wrestling, 120.0); + SetSkill(SkillName.Meditation, 120.0); + + AddItem(new Backpack()); + AddItem(new Sandals(0x455)); + AddItem(new BodySash(0x455)); + AddItem(new LongPants(0x455)); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Dimethro"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1078128); // You there! Wanna master hand to hand defense? Of course you do! + } +} + +[SerializationGenerator(0, false)] +public partial class Churchill : BaseCreature +{ + [Constructible] + public Churchill() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Mace Fighting Instructor"; + Body = 0x190; + Hue = 0x83EA; + HairItemID = 0x203C; + HairHue = 0x455; + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + SetSkill(SkillName.Anatomy, 120.0); + SetSkill(SkillName.Parry, 120.0); + SetSkill(SkillName.Healing, 120.0); + SetSkill(SkillName.Tactics, 120.0); + SetSkill(SkillName.Macing, 120.0); + SetSkill(SkillName.Focus, 120.0); + + AddItem(new Backpack()); + AddItem(new OrderShield()); + AddItem(new WarMace()); + + Item item; + + item = new PlateLegs(); + item.Hue = 0x966; + AddItem(item); + + item = new PlateGloves(); + item.Hue = 0x966; + AddItem(item); + + item = new PlateGorget(); + item.Hue = 0x966; + AddItem(item); + + item = new PlateChest(); + item.Hue = 0x966; + AddItem(item); + + item = new PlateArms(); + item.Hue = 0x966; + AddItem(item); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Churchill"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1078141); // Don't listen to Jockles. Real warriors wield mace weapons! + } +} + +[SerializationGenerator(0, false)] +public partial class Robyn : Bowyer +{ + [Constructible] + public Robyn() + { + Title = "the Archery Instructor"; + Body = 0x191; + Hue = 0x83EA; + HairItemID = 0x203C; + HairHue = 0x47D; + Female = true; + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + SetSkill(SkillName.Anatomy, 120.0); + SetSkill(SkillName.Parry, 120.0); + SetSkill(SkillName.Fletching, 120.0); + SetSkill(SkillName.Healing, 120.0); + SetSkill(SkillName.Tactics, 120.0); + SetSkill(SkillName.Archery, 120.0); + SetSkill(SkillName.Focus, 120.0); + } + + public override string DefaultName => "Robyn"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1078202); // Archery requires a steady aim and dexterous fingers. + } + + public override void InitOutfit() + { + AddItem(new Backpack()); + AddItem(new Boots(0x592)); + AddItem(new Cloak(0x592)); + AddItem(new Bandana(0x592)); + AddItem(new CompositeBow()); + + Item item; + + item = new StuddedLegs(); + item.Hue = 0x592; + AddItem(item); + + item = new StuddedGloves(); + item.Hue = 0x592; + AddItem(item); + + item = new StuddedGorget(); + item.Hue = 0x592; + AddItem(item); + + item = new StuddedChest(); + item.Hue = 0x592; + AddItem(item); + + item = new StuddedArms(); + item.Hue = 0x592; + AddItem(item); + } +} + +[SerializationGenerator(0, false)] +public partial class Recaro : BaseCreature +{ + [Constructible] + public Recaro() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Fencer Instructor"; + Body = 0x190; + Hue = 0x83EA; + HairItemID = 0x203C; + HairHue = 0x455; + FacialHairItemID = 0x204D; + FacialHairHue = 0x455; + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + SetSkill(SkillName.Anatomy, 120.0); + SetSkill(SkillName.Parry, 120.0); + SetSkill(SkillName.Healing, 120.0); + SetSkill(SkillName.Tactics, 120.0); + SetSkill(SkillName.Fencing, 120.0); + SetSkill(SkillName.Focus, 120.0); + + AddItem(new Backpack()); + AddItem(new Shoes(0x455)); + AddItem(new WarFork()); + + Item item; + + item = new StuddedLegs(); + item.Hue = 0x455; + AddItem(item); + + item = new StuddedGloves(); + item.Hue = 0x455; + AddItem(item); + + item = new StuddedGorget(); + item.Hue = 0x455; + AddItem(item); + + item = new StuddedChest(); + item.Hue = 0x455; + AddItem(item); + + item = new StuddedArms(); + item.Hue = 0x455; + AddItem(item); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Recaro"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + // The art of fencing requires a dexterous hand, a quick wit and fleet feet. + MLQuestSystem.Tell(this, pm, 1078187); + } +} + +[SerializationGenerator(0, false)] +public partial class AldenArmstrong : BaseCreature +{ + [Constructible] + public AldenArmstrong() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Tactics Instructor"; + Body = 0x190; + Hue = 0x83EA; + HairItemID = 0x203B; + HairHue = 0x44E; + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + SetSkill(SkillName.Anatomy, 120.0); + SetSkill(SkillName.Parry, 120.0); + SetSkill(SkillName.Healing, 120.0); + SetSkill(SkillName.Tactics, 120.0); + SetSkill(SkillName.Swords, 120.0); + SetSkill(SkillName.Focus, 120.0); + + AddItem(new Backpack()); + AddItem(new Shoes()); + AddItem(new StuddedLegs()); + AddItem(new StuddedGloves()); + AddItem(new StuddedGorget()); + AddItem(new StuddedChest()); + AddItem(new StuddedArms()); + AddItem(new Katana()); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Alden Armstrong"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + // There is an art to slaying your enemies swiftly. It's called tactics, and I can teach it to you. + MLQuestSystem.Tell(this, pm, 1078136); + } +} + +[SerializationGenerator(0, false)] +public partial class Jockles : BaseCreature +{ + [Constructible] + public Jockles() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Swordsmanship Instructor"; + Body = 0x190; + Hue = 0x83FA; + HairItemID = 0x203C; + HairHue = 0x8A7; + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + SetSkill(SkillName.Anatomy, 120.0); + SetSkill(SkillName.Parry, 120.0); + SetSkill(SkillName.Healing, 120.0); + SetSkill(SkillName.Tactics, 120.0); + SetSkill(SkillName.Swords, 120.0); + SetSkill(SkillName.Focus, 120.0); + + AddItem(new Backpack()); + AddItem(new Broadsword()); + AddItem(new PlateChest()); + AddItem(new PlateLegs()); + AddItem(new PlateGloves()); + AddItem(new PlateArms()); + AddItem(new PlateGorget()); + AddItem(new OrderShield()); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Jockles"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1078135); // Talk to me to learn the way of the blade. + } +} + +[SerializationGenerator(0, false)] +public partial class TylAriadne : BaseCreature +{ + [Constructible] + public TylAriadne() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Parrying Instructor"; + Body = 0x190; + Hue = 0x8374; + HairItemID = 0; + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + SetSkill(SkillName.Anatomy, 120.0); + SetSkill(SkillName.Parry, 120.0); + SetSkill(SkillName.Healing, 120.0); + SetSkill(SkillName.Tactics, 120.0); + SetSkill(SkillName.Swords, 120.0); + SetSkill(SkillName.Meditation, 120.0); + SetSkill(SkillName.Focus, 120.0); + + AddItem(new Backpack()); + AddItem(new ElvenBoots(0x96D)); + + Item item; + + item = new StuddedLegs(); + item.Hue = 0x96D; + AddItem(item); + + item = new StuddedGloves(); + item.Hue = 0x96D; + AddItem(item); + + item = new StuddedGorget(); + item.Hue = 0x96D; + AddItem(item); + + item = new StuddedChest(); + item.Hue = 0x96D; + AddItem(item); + + item = new StuddedArms(); + item.Hue = 0x96D; + AddItem(item); + + item = new DiamondMace(); + item.Hue = 0x96D; + AddItem(item); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Tyl Ariadne"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1078140); // Want to learn how to parry blows? + } +} + +[SerializationGenerator(0, false)] +public partial class Alefian : BaseCreature +{ + [Constructible] + public Alefian() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Resisting Spells Instructor"; + Body = 0x190; + Hue = 0x83EA; + HairItemID = 0x203D; + HairHue = 0x457; + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + SetSkill(SkillName.EvalInt, 120.0); + SetSkill(SkillName.Inscribe, 120.0); + SetSkill(SkillName.Magery, 120.0); + SetSkill(SkillName.MagicResist, 120.0); + SetSkill(SkillName.Wrestling, 120.0); + SetSkill(SkillName.Meditation, 120.0); + + AddItem(new Backpack()); + AddItem(new Robe()); + AddItem(new Sandals()); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Alefian"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1078130); // A mage should learn how to resist spells. + } +} + +[SerializationGenerator(0, false)] +public partial class Gustar : BaseCreature +{ + [Constructible] + public Gustar() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Meditation Instructor"; + Body = 0x190; + Hue = 0x83F5; + HairItemID = 0x203B; + HairHue = 0x455; + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + SetSkill(SkillName.EvalInt, 120.0); + SetSkill(SkillName.Inscribe, 120.0); + SetSkill(SkillName.Magery, 120.0); + SetSkill(SkillName.MagicResist, 120.0); + SetSkill(SkillName.Wrestling, 120.0); + SetSkill(SkillName.Meditation, 120.0); + + AddItem(new Backpack()); + AddItem(new GustarShroud()); + AddItem(new Sandals()); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Gustar"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1078126); // Meditation allows a mage to replenish mana quickly. I can teach you. + } +} + +[SerializationGenerator(0, false)] +public partial class GustarShroud : BaseOuterTorso +{ + [Constructible] + public GustarShroud() : base(0x2684) => Hue = 0x479; + + public override string DefaultName => " "; +} + +[SerializationGenerator(0, false)] +public partial class Jillian : BaseCreature +{ + [Constructible] + public Jillian() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Inscription Instructor"; + Body = 0x191; + Female = true; + Hue = 0x83EA; + HairItemID = 0x203D; + HairHue = 0x455; + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + SetSkill(SkillName.EvalInt, 120.0); + SetSkill(SkillName.Inscribe, 120.0); + SetSkill(SkillName.Magery, 120.0); + SetSkill(SkillName.MagicResist, 120.0); + SetSkill(SkillName.Wrestling, 120.0); + SetSkill(SkillName.Meditation, 120.0); + + AddItem(new Backpack()); + AddItem(new Robe(0x479)); + AddItem(new Sandals()); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Jillian"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1078129); // I can teach you how to scribe magic scrolls. + } +} + +[SerializationGenerator(0, false)] +public partial class Kaelynna : BaseCreature +{ + [Constructible] + public Kaelynna() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Magery Instructor"; + Body = 0x191; + Female = true; + Hue = 0x83EA; + HairItemID = 0x203C; + HairHue = 0x47D; + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + SetSkill(SkillName.EvalInt, 120.0); + SetSkill(SkillName.Inscribe, 120.0); + SetSkill(SkillName.Magery, 120.0); + SetSkill(SkillName.MagicResist, 120.0); + SetSkill(SkillName.Wrestling, 120.0); + SetSkill(SkillName.Meditation, 120.0); + + AddItem(new Backpack()); + AddItem(new Robe(0x592)); + AddItem(new Sandals()); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Kaelynna"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1078125); // Want to unlock the secrets of magery? + } +} + +[SerializationGenerator(0, false)] +public partial class Mithneral : BaseCreature +{ + [Constructible] + public Mithneral() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Evaluating Intelligence Instructor"; + Body = 0x190; + Hue = 0x83EA; + HairItemID = 0x203C; + HairHue = 0x455; + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + SetSkill(SkillName.EvalInt, 120.0); + SetSkill(SkillName.Inscribe, 120.0); + SetSkill(SkillName.Magery, 120.0); + SetSkill(SkillName.MagicResist, 120.0); + SetSkill(SkillName.Wrestling, 120.0); + SetSkill(SkillName.Meditation, 120.0); + + AddItem(new Backpack()); + AddItem(new Sandals()); + + Item item; + + item = new GustarShroud(); + item.Hue = 0x51C; + AddItem(item); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Mithneral"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1078127); // Want to maximize your spell damage? I have a scholarly task for you! + } +} + +[SerializationGenerator(0, false)] +public partial class AmeliaYoungstone : Tinker +{ + [Constructible] + public AmeliaYoungstone() + { + Title = "the Tinkering Instructor"; + Body = 0x191; + Female = true; + Hue = 0x83EA; + HairItemID = 0x203D; + HairHue = 0x46C; + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + SetSkill(SkillName.ArmsLore, 120.0); + SetSkill(SkillName.Blacksmith, 120.0); + SetSkill(SkillName.Magery, 120.0); + SetSkill(SkillName.Tactics, 120.0); + SetSkill(SkillName.Swords, 120.0); + SetSkill(SkillName.Tinkering, 120.0); + SetSkill(SkillName.Mining, 120.0); + } + + public override string DefaultName => "Amelia Youngstone"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1078123); // Tinkering is very useful for a blacksmith. You can make your own tools. + } + + public override void InitOutfit() + { + AddItem(new Backpack()); + AddItem(new Sandals()); + AddItem(new Doublet()); + AddItem(new ShortPants()); + AddItem(new HalfApron(0x8AB)); + } +} + +[SerializationGenerator(0, false)] +public partial class AndreasVesalius : BaseCreature +{ + [Constructible] + public AndreasVesalius() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Anatomy Instructor"; + Body = 0x190; + Hue = 0x83EC; + HairItemID = 0x203C; + HairHue = 0x477; + FacialHairItemID = 0x203E; + FacialHairHue = 0x477; + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + SetSkill(SkillName.Anatomy, 120.0); + SetSkill(SkillName.Parry, 120.0); + SetSkill(SkillName.Healing, 120.0); + SetSkill(SkillName.Tactics, 120.0); + SetSkill(SkillName.Swords, 120.0); + SetSkill(SkillName.Focus, 120.0); + + AddItem(new Backpack()); + AddItem(new Boots()); + AddItem(new BlackStaff()); + AddItem(new LongPants()); + AddItem(new Tunic(0x66D)); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Andreas Vesalius"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1078138); // Learning of the body will allow you to excel in combat. + } +} + +[SerializationGenerator(0, false)] +public partial class Avicenna : BaseCreature +{ + [Constructible] + public Avicenna() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Healing Instructor"; + Body = 0x190; + Hue = 0x83EA; + HairItemID = 0x203B; + HairHue = 0x477; + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + SetSkill(SkillName.Anatomy, 120.0); + SetSkill(SkillName.Parry, 120.0); + SetSkill(SkillName.Healing, 120.0); + SetSkill(SkillName.Tactics, 120.0); + SetSkill(SkillName.Swords, 120.0); + SetSkill(SkillName.Focus, 120.0); + + AddItem(new Backpack()); + AddItem(new Robe(0x66D)); + AddItem(new Boots()); + AddItem(new GnarledStaff()); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Avicenna"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1078137); // A warrior needs to learn how to apply bandages to wounds. + } +} + +[SerializationGenerator(0, false)] +public partial class SarsmeaSmythe : BaseCreature +{ + [Constructible] + public SarsmeaSmythe() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Focus Instructor"; + Body = 0x191; + Female = true; + Hue = 0x83EA; + HairItemID = 0x203C; + HairHue = 0x456; + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + SetSkill(SkillName.Anatomy, 120.0); + SetSkill(SkillName.Parry, 120.0); + SetSkill(SkillName.Healing, 120.0); + SetSkill(SkillName.Tactics, 120.0); + SetSkill(SkillName.Swords, 120.0); + SetSkill(SkillName.Focus, 120.0); + + AddItem(new Backpack()); + AddItem(new ThighBoots()); + AddItem(new StuddedGorget()); + AddItem(new LeatherLegs()); + AddItem(new FemaleLeatherChest()); + AddItem(new StuddedGloves()); + AddItem(new LeatherNinjaBelt()); + AddItem(new LightPlateJingasa()); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Sarsmea Smythe"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1078139); // Know yourself, and you will become a true warrior. + } +} + +[SerializationGenerator(0, false)] +public partial class Ryuichi : BaseVendor +{ + private readonly List m_SBInfos = new(); + + [Constructible] + public Ryuichi() + : base("the Ninjitsu Instructor") + { + Hue = 0x8403; + + SetSkill(SkillName.Hiding, 120.0); + SetSkill(SkillName.Tactics, 120.0); + SetSkill(SkillName.Tracking, 120.0); + SetSkill(SkillName.Fencing, 120.0); + SetSkill(SkillName.Stealth, 120.0); + SetSkill(SkillName.Ninjitsu, 120.0); + } + + protected override List SBInfos => m_SBInfos; + + public override string DefaultName => "Ryuichi"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1078155); // I can teach you Ninjitsu. The Art of Stealth. + } + + public override void InitSBInfo() + { + m_SBInfos.Add(new SBNinja()); + } + + public override bool GetGender() => false; + + public override void InitOutfit() + { + HairItemID = 0x203B; + HairHue = 0x455; + + AddItem(new SamuraiTabi()); + AddItem(new LeatherNinjaPants()); + AddItem(new LeatherNinjaMitts()); + AddItem(new LeatherNinjaHood()); + AddItem(new LeatherNinjaJacket()); + AddItem(new LeatherNinjaBelt()); + + PackGold(100, 200); + } +} + +[SerializationGenerator(0, false)] +public partial class Chiyo : BaseCreature +{ + [Constructible] + public Chiyo() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Hiding Instructor"; + Body = 0xF7; + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + SetSkill(SkillName.Hiding, 120.0); + SetSkill(SkillName.Tactics, 120.0); + SetSkill(SkillName.Tracking, 120.0); + SetSkill(SkillName.Fencing, 120.0); + SetSkill(SkillName.Stealth, 120.0); + SetSkill(SkillName.Ninjitsu, 120.0); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Chiyo"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1078165); // To be undetected means you cannot be harmed. + } +} + +[SerializationGenerator(0, false)] +public partial class Jun : BaseCreature +{ + [Constructible] + public Jun() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Stealth Instructor"; + Body = 0x190; + Hue = 0x8403; + HairItemID = 0x203B; + HairHue = 0x455; + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + SetSkill(SkillName.Hiding, 120.0); + SetSkill(SkillName.Tactics, 120.0); + SetSkill(SkillName.Tracking, 120.0); + SetSkill(SkillName.Fencing, 120.0); + SetSkill(SkillName.Stealth, 120.0); + SetSkill(SkillName.Ninjitsu, 120.0); + + AddItem(new Backpack()); + AddItem(new SamuraiTabi()); + AddItem(new LeatherNinjaPants()); + AddItem(new LeatherNinjaMitts()); + AddItem(new LeatherNinjaHood()); + AddItem(new LeatherNinjaJacket()); + AddItem(new LeatherNinjaBelt()); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Jun"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1078175); // Walk Silently. Remain unseen. I can teach you. + } +} + +[SerializationGenerator(0, false)] +public partial class Walker : BaseCreature +{ + [Constructible] + public Walker() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Tracking Instructor"; + Body = 0x190; + Hue = 0x83EA; + HairItemID = 0x203B; + HairHue = 0x47D; + FacialHairItemID = 0x204B; + FacialHairHue = 0x47D; + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + SetSkill(SkillName.Hiding, 120.0); + SetSkill(SkillName.Tactics, 120.0); + SetSkill(SkillName.Tracking, 120.0); + SetSkill(SkillName.Fencing, 120.0); + SetSkill(SkillName.Wrestling, 120.0); + SetSkill(SkillName.Stealth, 120.0); + SetSkill(SkillName.Ninjitsu, 120.0); + + AddItem(new Backpack()); + AddItem(new Boots(0x455)); + AddItem(new LongPants(0x455)); + AddItem(new FancyShirt(0x47D)); + AddItem(new FloppyHat(0x455)); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Walker"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell( + this, + pm, + Utility.RandomList( + 1078213, // I don't sleep. I wait. + 1078212, // There is no theory of evolution. Just a list of creatures I allow to live. + 1078214 // I can lead a horse to water and make it drink. + ) + ); + } +} + +[SerializationGenerator(0, false)] +public partial class Hamato : BaseVendor +{ + private readonly List m_SBInfos = new(); + + [Constructible] + public Hamato() : base("the Bushido Instructor") + { + Hue = 0x8403; + + SetSkill(SkillName.Anatomy, 120.0); + SetSkill(SkillName.Parry, 120.0); + SetSkill(SkillName.Healing, 120.0); + SetSkill(SkillName.Tactics, 120.0); + SetSkill(SkillName.Swords, 120.0); + SetSkill(SkillName.Bushido, 120.0); + } + + protected override List SBInfos => m_SBInfos; + + public override string DefaultName => "Hamato"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1078134); // Seek me to learn the way of the samurai. + } + + public override void InitSBInfo() + { + m_SBInfos.Add(new SBSamurai()); + } + + public override bool GetGender() => false; + + public override void InitOutfit() + { + HairItemID = 0x203D; + HairHue = 0x497; + + AddItem(new Backpack()); + AddItem(new NoDachi()); + AddItem(new NinjaTabi()); + AddItem(new PlateSuneate()); + AddItem(new LightPlateJingasa()); + AddItem(new LeatherDo()); + AddItem(new LeatherHiroSode()); + + PackGold(100, 200); + } +} + +[SerializationGenerator(0, false)] +public partial class Mulcivikh : Mage +{ + [Constructible] + public Mulcivikh() + { + Title = "the Necromancy Instructor"; + Body = 0x190; + Hue = 0x83EA; + HairItemID = 0x203D; + HairHue = 0x457; + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + SetSkill(SkillName.Magery, 120.0); + SetSkill(SkillName.MagicResist, 120.0); + SetSkill(SkillName.SpiritSpeak, 120.0); + SetSkill(SkillName.Swords, 120.0); + SetSkill(SkillName.Meditation, 120.0); + SetSkill(SkillName.Necromancy, 120.0); + } + + public override string DefaultName => "Mulcivikh"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1078131); // Allured by dark magic, aren't you? + } + + public override void InitOutfit() + { + AddItem(new Backpack()); + AddItem(new Sandals(0x8FD)); + AddItem(new BoneHelm()); + + Item item; + + item = new LeatherLegs(); + item.Hue = 0x2C3; + AddItem(item); + + item = new LeatherGloves(); + item.Hue = 0x2C3; + AddItem(item); + + item = new LeatherGorget(); + item.Hue = 0x2C3; + AddItem(item); + + item = new LeatherChest(); + item.Hue = 0x2C3; + AddItem(item); + + item = new LeatherArms(); + item.Hue = 0x2C3; + AddItem(item); + } +} + +[SerializationGenerator(0, false)] +public partial class Morganna : Mage +{ + [Constructible] + public Morganna() + { + Title = "the Spirit Speak Instructor"; + Body = 0x191; + Female = true; + Hue = 0x83EA; + HairItemID = 0x203C; + HairHue = 0x455; + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + SetSkill(SkillName.Magery, 120.0); + SetSkill(SkillName.MagicResist, 120.0); + SetSkill(SkillName.SpiritSpeak, 120.0); + SetSkill(SkillName.Swords, 120.0); + SetSkill(SkillName.Meditation, 120.0); + SetSkill(SkillName.Necromancy, 120.0); + } + + public override string DefaultName => "Morganna"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1078132); // Want to learn how to channel the supernatural? + } + + public override void InitOutfit() + { + AddItem(new Backpack()); + AddItem(new Sandals()); + AddItem(new Robe(0x47D)); + AddItem(new SkullCap(0x455)); + } +} + +[SerializationGenerator(0, false)] +public partial class JacobWaltz : BaseCreature +{ + [Constructible] + public JacobWaltz() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Miner Instructor"; + Body = 0x190; + Hue = 0x83EA; + HairItemID = 0x2048; + HairHue = 0x44E; + FacialHairItemID = 0x204D; + FacialHairHue = 0x44E; + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + SetSkill(SkillName.ArmsLore, 120.0); + SetSkill(SkillName.Blacksmith, 120.0); + SetSkill(SkillName.Magery, 120.0); + SetSkill(SkillName.Tactics, 120.0); + SetSkill(SkillName.Tinkering, 120.0); + SetSkill(SkillName.Swords, 120.0); + SetSkill(SkillName.Mining, 120.0); + + AddItem(new Backpack()); + AddItem(new Pickaxe()); + AddItem(new Boots()); + AddItem(new WideBrimHat(0x966)); + AddItem(new ShortPants(0x370)); + AddItem(new Shirt(0x966)); + AddItem(new HalfApron(0x1BB)); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Jacob Waltz"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1078124); // You there! I can use some help mining these rocks! + } + +} + +[SerializationGenerator(0, false)] +public partial class GeorgeHephaestus : Blacksmith +{ + [Constructible] + public GeorgeHephaestus() + { + Title = "the Blacksmith Instructor"; + Body = 0x190; + Hue = 0x83EA; + HairItemID = 0x203B; + HairHue = 0x47B; + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + SetSkill(SkillName.ArmsLore, 120.0); + SetSkill(SkillName.Blacksmith, 120.0); + SetSkill(SkillName.Magery, 120.0); + SetSkill(SkillName.Tactics, 120.0); + SetSkill(SkillName.Tinkering, 120.0); + SetSkill(SkillName.Swords, 120.0); + SetSkill(SkillName.Mining, 120.0); + } + + public override string DefaultName => "George Hephaestus"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1078122); // Wanna learn how to make powerful weapons and armor? Talk to me. + } + + public override void InitOutfit() + { + AddItem(new Backpack()); + AddItem(new Boots(0x973)); + AddItem(new LongPants()); + AddItem(new Bascinet()); + AddItem(new FullApron(0x8AB)); + + Item item; + + item = new SmithHammer(); + item.Hue = 0x8AB; + AddItem(item); + } +} diff --git a/Projects/UOContent/Engines/ML Quests/Definitions/NewHavenTraining.cs b/Projects/UOContent/Engines/ML Quests/Definitions/NewHavenTraining.cs index f3d9b8ba9..67cf71bb1 100644 --- a/Projects/UOContent/Engines/ML Quests/Definitions/NewHavenTraining.cs +++ b/Projects/UOContent/Engines/ML Quests/Definitions/NewHavenTraining.cs @@ -1,992 +1,775 @@ +using ModernUO.Serialization; using Server.Engines.MLQuests.Objectives; using Server.Engines.MLQuests.Rewards; using Server.Items; using Server.Mobiles; -namespace Server.Engines.MLQuests.Definitions +namespace Server.Engines.MLQuests.Definitions; + +public class SplitEnds : MLQuest { - public class SplitEnds : MLQuest + public SplitEnds() { - public SplitEnds() - { - Activated = true; - HasRestartDelay = true; - Title = 1075506; // Split Ends - Description = - 1075507; // *sighs* I think bowcrafting is a might beyond my talents. Say there, you look a bit more confident with tools. Can I persuade thee to make a few arrows? You could have my satchel in return... 'tis useless to me! You'll need a fletching kit to start, some feathers, and a few arrow shafts. Just use the fletching kit while you have the other things, and I'm sure you'll figure out the rest. - RefusalMessage = 1075508; // Oh. Well. I'll just keep trying alone, I suppose... - InProgressMessage = 1072271; // You're not quite done yet. Get back to work! - CompletionMessage = 1072272; // Thanks for helping me out. Here's the reward I promised you. - - Objectives.Add(new CollectObjective(20, typeof(Arrow), 1023902)); // arrow - - Rewards.Add(new ItemReward(1074282, typeof(AndricSatchel))); // Craftsmans's Satchel - } - } - - public class IShotAnArrowIntoTheAir : MLQuest - { - public IShotAnArrowIntoTheAir() - { - Activated = true; - Title = 1075486; // I Shot an Arrow Into the Air... - Description = - 1075482; // Truth be told, the only way to get a feel for the bow is to shoot one and there's no better practice target than a sheep. If ye can shoot ten of them I think ye will have proven yer abilities. Just grab a bow and make sure to take enough ammunition. Bows tend to use arrows and crossbows use bolts. Ye can buy 'em or have someone craft 'em. How about it then? Come back here when ye are done. - RefusalMessage = 1075483; // Fair enough, the bow isn't for everyone. Good day then. - InProgressMessage = 1075484; // Return once ye have killed ten sheep with a bow and not a moment before. - - Objectives.Add(new KillObjective(10, new[] { typeof(Sheep) }, 1018270)); // sheep - - Rewards.Add(ItemReward.BagOfTrinkets); - } - } - - public class BakersDozen : MLQuest - { - public BakersDozen() - { - Activated = true; - HasRestartDelay = true; - Title = 1075478; // Baker's Dozen - Description = - 1075479; // You there! Do you know much about the ways of cooking? If you help me out, I'll show you a thing or two about how it's done. Bring me some cookie mix, about 5 batches will do it, and I will reward you. Although, I don't think you can buy it, you can make some in a snap! First get a rolling pin or frying pan or even a flour sifter. Then you mix one pinch of flour with some water and you've got some dough! Take that dough and add one dollop of honey and you've got sweet dough. add one more drop of honey and you've got cookie mix. See? Nothing to it! Now get to work! - RefusalMessage = - 1075480; // Argh, I absolutely must have more of these 'cookies!' Come back if you change your mind. - InProgressMessage = 1072271; // You're not quite done yet. Get back to work! - CompletionMessage = 1075481; // Thank you! I haven't been this excited about food in months! - - Objectives.Add(new CollectObjective(5, typeof(CookieMix), 1024159)); // cookie mix - - Rewards.Add(new ItemReward(1074282, typeof(AsandosSatchel))); // Craftsmans's Satchel - } - } - - public class AStitchInTime : MLQuest - { - public AStitchInTime() - { - Activated = true; - HasRestartDelay = true; - Title = 1075523; // A Stitch in Time - Description = - 1075522; // Oh how I wish I had a fancy dress like the noble ladies of Castle British! I don't have much... but I have a few trinkets I might trade for it. It would mean the world to me to go to a fancy ball and dance the night away. Oh, and I could tell you how to make one! You just need to use your sewing kit on enough cut cloth, that's all. - RefusalMessage = 1075526; // Won't you reconsider? It'd mean the world to me, it would! - InProgressMessage = - 1075527; // Hello again! Do you need anything? You may want to visit the tailor's shop for cloth and a sewing kit, if you don't already have them. - CompletionMessage = - 1075528; // It's gorgeous! I only have a few things to give you in return, but I can't thank you enough! Maybe I'll even catch Uzeraan's eye at the, er, *blushes* I mean, I can't wait to wear it to the next town dance! - - Objectives.Add(new CollectObjective(1, typeof(FancyDress), 1027935)); // fancy dress - - Rewards.Add(new ItemReward(1075524, typeof(AnOldRing))); // an old ring - Rewards.Add(new ItemReward(1075525, typeof(AnOldNecklace))); // an old necklace - } - } - - public class BatteredBucklers : MLQuest - { - public BatteredBucklers() - { - Activated = true; - HasRestartDelay = true; - Title = 1075511; // Battered Bucklers - Description = - 1075512; // Hey there! Yeah... you! Ya' any good with a hammer? Tell ya what, if yer thinking about tryin' some metal work, and have a bit of skill, I can show ya how to bend it into shape. Just get some of those ingots there, and grab a hammer and use it over here at this forge. I need a few more bucklers hammered out to fill this here order with... hmmm about ten more. that'll give some taste of how to work the metal. - RefusalMessage = - 1075514; // Not enough muscle on yer bones to use it? hmph, probably afraid of the sparks markin' up yer loverly skin... to good for some honest labor... ha!... off with ya! - InProgressMessage = 1075515; // Come On! Whats that... a bucket? We need ten bucklers... not spitoons. - CompletionMessage = 1075516; // Thanks for the help. Here's something for ya to remember me by. - - Objectives.Add(new CollectObjective(10, typeof(Buckler), 1027027)); // buckler - - Rewards.Add(new ItemReward(1074282, typeof(GervisSatchel))); // Craftsmans's Satchel - } - } - - public class MoreOrePlease : MLQuest - { - public MoreOrePlease() - { - Activated = true; - HasRestartDelay = true; - Title = 1075530; // More Ore Please - Description = - 1075529; // Have a pickaxe? My supplier is late and I need some iron ore so I can complete a bulk order for another merchant. If you can get me some soon I'll pay you double what it's worth on the market. Just find a cave or mountainside and try to use your pickaxe there, maybe you'll strike a good vein! 5 large pieces should do it. - RefusalMessage = - 1075531; // Not feeling strong enough today? Its alright, I didn't need a bucket of rocks anyway. - InProgressMessage = 1075532; // Hmmm' we need some more Ore. Try finding a mountain or cave, and give it a whack. - CompletionMessage = - 1075533; // I see you found a good vien! Great! This will help get this order out on time. Good work! - - Objectives.Add(new InternalObjective()); - - Rewards.Add(new ItemReward(1074282, typeof(MuggSatchel))); // Craftsmans's Satchel - } - - private class InternalObjective : CollectObjective - { - // Any type of ore is allowed - public InternalObjective() - : base(5, typeof(BaseOre), 1026585) // ore - { - } - - public override bool CheckItem(Item item) => item.ItemID == 6585; - } - } - - public class ComfortableSeating : MLQuest - { - public ComfortableSeating() - { - Activated = true; - HasRestartDelay = true; - Title = 1075517; // Comfortable Seating - Description = - 1075518; // Hail friend, hast thou a moment? A mishap with a saw hath left me in a sorry state, for it shall be a while before I canst return to carpentry. In the meantime, I need a comfortable chair that I may rest. Could thou craft a straw chair? Only a tool, such as a dovetail saw, a few boards, and some skill as a carpenter is needed. Remember, this is a piece of furniture, so please pay attention to detail. - RefusalMessage = 1072687; // I quite understand your reluctance. If you reconsider, I'll be here. - InProgressMessage = 1075509; // Is all going well? I look forward to the simple comforts in my very own home. - CompletionMessage = 1074720; // This is perfect! - - Objectives.Add(new CollectObjective(1, typeof(BambooChair), "straw chair")); - - Rewards.Add(new ItemReward(1074282, typeof(LowelSatchel))); // Craftsmans's Satchel - } - } - - public class ThePenIsMightier : MLQuest - { - public ThePenIsMightier() - { - Activated = true; - HasRestartDelay = true; - Title = 1075542; // The Pen is Mightier - Description = - 1075543; // Do you know anything about 'Inscription?' I've been trying to get my hands on some hand crafted Recall scrolls for a while now, and I could really use some help. I don't have a scribe's pen, let alone a spellbook with Recall in it, or blank scrolls, so there's no way I can do it on my own. How about you though? I could trade you one of my old leather bound books for some. - RefusalMessage = - 1075546; // Hmm, thought I had your interest there for a moment. It's not everyday you see a book made from real daemon skin, after all! - InProgressMessage = - 1075547; // Inscribing... yes, you'll need a scribe's pen, some reagents, some blank scroll, and of course your own magery book. You might want to visit the magery shop if you're lacking some materials. - CompletionMessage = - 1075548; // Ha! Finally! I've had a rune to the waterfalls near Justice Isle that I've been wanting to use for the longest time, and now I can visit at last. Here's that book I promised you... glad to be rid of it, to be honest. - - Objectives.Add(new CollectObjective(5, typeof(RecallScroll), "recall scroll")); - - Rewards.Add(new ItemReward(1075545, typeof(RedLeatherBook))); // a book bound in red leather - } - } - - public class AClockworkPuzzle : MLQuest - { - public AClockworkPuzzle() - { - Activated = true; - HasRestartDelay = true; - Title = 1075535; // A clockwork puzzle - Description = - 1075534; // 'Tis a riddle, you see! "What kind of clock is only right twice per day? A broken one!" *laughs heartily* Ah, yes *wipes eye*, that's one of my favorites! Ah... to business. Could you fashion me some clock parts? I wish my own clocks to be right all the day long! You'll need some tinker's tools and some iron ingots, I think, but from there it should be just a matter of working the metal. - RefusalMessage = 1072981; // Or perhaps you'd rather not. - InProgressMessage = 1072271; // You're not quite done yet. Get back to work! - CompletionMessage = 1075536; // Wonderful! Tick tock, tick tock, soon all shall be well with grandfather's clock! - - Objectives.Add(new CollectObjective(5, typeof(ClockParts), 1024175)); // clock parts - - Rewards.Add(new ItemReward(1074282, typeof(NibbetSatchel))); // Craftsmans's Satchel - } - } - - public class DeliciousFishes : MLQuest - { - public DeliciousFishes() - { - Activated = true; - HasRestartDelay = true; - Title = 1075555; // Delicious Fishes - Description = - 1075556; // Ello there, looking for a good place on the dock to fish? I like the southeast corner meself. What's that? Oh, no, *sighs* me pole is broken and in for fixin'. My grandpappy gave me that pole, means a lot you see. Miss the taste of fish though... Oh say, since you're here, could you catch me a few fish? I can cook a mean fish steak, and I'll split 'em with you! But make sure it's one of the green kind, they're the best for seasoning! - RefusalMessage = - 1075558; // Ah, you're missin' out my friend, you're missing out. My peppercorn fishsteaks are famous on this little isle of ours! - InProgressMessage = - 1075559; // Eh? Find yerself a pole and get close to some water. Just toss the line on in and hopefully you won't snag someone's old boots! Remember, that's twenty of them green fish we'll be needin', so come back when you've got em, 'aight? - CompletionMessage = - 1075560; // Just a moment my friend, just a moment! *rummages in his pack* Here we are! My secret blend of peppers always does the trick, never fails, no not once. These'll fill you up much faster than that tripe they sell in the market! - - Objectives.Add(new CollectObjective(5, typeof(Fish), 1022508)); // fish - - Rewards.Add(new ItemReward(1075557, typeof(PeppercornFishsteak), 3)); // peppercorn fishsteak - } - } - - public class FleeAndFatigue : MLQuest - { - public FleeAndFatigue() - { - Activated = true; - HasRestartDelay = true; - Title = 1075487; // Flee and Fatigue - Description = - 1075488; // I was just *coughs* ambushed near the moongate. *wheeze* Why do I pay my taxes? Where were the guards? You then, you an Alchemist? If you can make me a few Refresh potions, I will be back on my feet and can give those lizards the what for! Find a mortar and pestle, a good amount of black pearl, and ten empty bottles to store the finished potions in. Just use the mortar and pestle and the rest will surely come to you. When you return, the favor will be repaid. - RefusalMessage = - 1075489; // Fine fine, off with *cough* thee then! The next time you see a lizardman though, give him a whallop for me, eh? - InProgressMessage = - 1075490; // Just remember you need to use your mortar and pestle while you have empty bottles and some black pearl. Refresh potions are what I need. - CompletionMessage = - 1075491; // *glug* *glug* Ahh... Yes! Yes! That feels great! Those lizardmen will never know what hit 'em! Here, take this, I can get more from the lizards. - - Objectives.Add(new CollectObjective(10, typeof(RefreshPotion), "refresh potions")); - - Rewards.Add(new ItemReward(1074282, typeof(SadrahSatchel))); // Craftsmans's Satchel - } - } - - public class ChopChopOnTheDouble : MLQuest - { - public ChopChopOnTheDouble() - { - Activated = true; - HasRestartDelay = true; - Title = 1075537; // Chop Chop, On The Double! - Description = - 1075538; // That's right, move it! I need sixty logs on the double, and they need to be freshly cut! If you can get them to me fast I'll have your payment in your hands before you have the scent of pine out from beneath your nostrils. Just get a sharp axe and hack away at some of the trees in the land and your lumberjacking skill will rise in no time. - RefusalMessage = 1072981; // Or perhaps you'd rather not. - InProgressMessage = 1072271; // You're not quite done yet. Get back to work! - CompletionMessage = - 1075539; // Ahhh! The smell of fresh cut lumber. And look at you, all strong and proud, as if you had done an honest days work! - - Objectives.Add(new CollectObjective(60, typeof(Log), 1027133)); // log - - Rewards.Add(new ItemReward(1074282, typeof(HargroveSatchel))); // Craftsmans's Satchel - } - } - - public class Andric : BaseCreature - { - [Constructible] - public Andric() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the archer trainer"; - Race = Race.Human; - Body = 0x190; - Female = false; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - SetSkill(SkillName.Archery, 60.0, 80.0); - - AddItem(new Backpack()); - - Item item; - - item = new LeatherChest(); - item.Hue = 0x1BB; - AddItem(item); - - item = new LeatherLegs(); - item.Hue = 0x6AD; - AddItem(item); - - item = new LeatherArms(); - item.Hue = 0x6AD; - AddItem(item); - - item = new LeatherGloves(); - item.Hue = 0x1BB; - AddItem(item); - - AddItem(new Boots(0x1BB)); - AddItem(new CompositeBow()); - } - - public Andric(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Andric"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell( - this, - pm, - Utility.RandomList( - 1074205, // Oh great adventurer, would you please assist a weak soul in need of aid? - 1074213 // Hey buddy. Looking for work? - ) - ); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Kashiel : BaseCreature - { - [Constructible] - public Kashiel() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the archer"; - Race = Race.Human; - Body = 0x191; - Female = true; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - AddItem(new Backpack()); - - Item item; - - item = new LeatherChest(); - item.Hue = 0x1BB; - AddItem(item); - - item = new LeatherLegs(); - item.Hue = 0x901; - AddItem(item); - - item = new LeatherArms(); - item.Hue = 0x901; - AddItem(item); - - item = new LeatherGloves(); - item.Hue = 0x1BB; - AddItem(item); - - AddItem(new Boots(0x1BB)); - AddItem(new CompositeBow()); - } - - public Kashiel(Serial serial) - : base(serial) - { - } - - public override string DefaultName => "Kashiel"; - public override bool IsInvulnerable => true; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Asandos : BaseCreature - { - [Constructible] - public Asandos() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the chef"; - Race = Race.Human; - Body = 0x190; - Female = false; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - AddItem(new Backpack()); - AddItem(new Boots(0x901)); - AddItem(new ShortPants()); - AddItem(new Shirt()); - AddItem(new Cap()); - AddItem(new HalfApron(0x28)); - } - - public Asandos(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Asandos"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell( - this, - pm, - Utility.RandomList( - 1074205, // Oh great adventurer, would you please assist a weak soul in need of aid? - 1074213 // Hey buddy. Looking for work? - ) - ); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - // [QuesterName( "Clarisse" )] // On OSI the gumps refer to her as this, different from actual name - public class Clairesse : BaseCreature - { - [Constructible] - public Clairesse() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the servant"; - Race = Race.Human; - Body = 0x191; - Female = true; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - AddItem(new Backpack()); - AddItem(new Shoes(Utility.RandomNeutralHue())); - AddItem(new PlainDress(0x3C9)); - } - - public Clairesse(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Clairesse"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell( - this, - pm, - Utility.RandomList( - 1074205, // Oh great adventurer, would you please assist a weak soul in need of aid? - 1074213 // Hey buddy. Looking for work? - ) - ); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Gervis : BaseCreature - { - [Constructible] - public Gervis() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the blacksmith trainer"; - Race = Race.Human; - Body = 0x190; - Female = false; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - SetSkill(SkillName.Blacksmith, 60.0, 80.0); - - AddItem(new Backpack()); - AddItem(new Boots(0x3B3)); - AddItem(new ShortPants(0x1BB)); - AddItem(new Doublet(0x652)); - AddItem(new SmithHammer()); - - Item item; - - item = new LeatherGloves(); - item.Hue = 0x3B2; - AddItem(item); - } - - public Gervis(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Gervis"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell( - this, - pm, - Utility.RandomList( - 1074205, // Oh great adventurer, would you please assist a weak soul in need of aid? - 1074213, // Hey buddy. Looking for work? - 1074211 // I could use some help. - ) - ); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Mugg : BaseCreature - { - [Constructible] - public Mugg() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the miner"; - Race = Race.Human; - Body = 0x190; - Female = false; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - AddItem(new Backpack()); - AddItem(new Boots(0x901)); - AddItem(new ShortPants(0x3B3)); - AddItem(new Shirt(0x22B)); - AddItem(new HalfApron(0x5F1)); - AddItem(new SkullCap(0x177)); - AddItem(new Pickaxe()); - } - - public Mugg(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Mugg"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1074211); // I could use some help. - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Lowel : BaseCreature - { - [Constructible] - public Lowel() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the carpenter"; - Race = Race.Human; - Body = 0x190; - Female = false; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - AddItem(new Backpack()); - AddItem(new Boots(0x543)); - AddItem(new ShortPants(0x758)); - AddItem(new FancyShirt(0x53A)); - AddItem(new HalfApron(0x6D2)); - } - - public Lowel(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Lowel"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell( - this, - pm, - Utility.RandomList( - 1074205, // Oh great adventurer, would you please assist a weak soul in need of aid? - 1074213 // Hey buddy. Looking for work? - ) - ); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Lyle : BaseCreature - { - [Constructible] - public Lyle() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the mage"; - Race = Race.Human; - Body = 0x190; - Female = false; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - AddItem(new Backpack()); - AddItem(new Robe(0x2FD)); - AddItem(new ThighBoots()); - } - - public Lyle(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Lyle"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell( - this, - pm, - Utility.RandomList( - 1074205, // Oh great adventurer, would you please assist a weak soul in need of aid? - 1074213 // Hey buddy. Looking for work? - ) - ); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Nibbet : BaseCreature - { - [Constructible] - public Nibbet() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the tinker"; - Race = Race.Human; - Body = 0x190; - Female = false; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - AddItem(new Backpack()); - AddItem(new Boots(0x591)); - AddItem(new ShortPants(0xF8)); - AddItem(new Shirt(0x2D)); - AddItem(new FullApron(0x288)); - } - - public Nibbet(Serial serial) - : base(serial) - { - } - - public override string DefaultName => "Nibbet"; - public override bool IsInvulnerable => true; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Norton : BaseCreature - { - [Constructible] - public Norton() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the fisher"; - Race = Race.Human; - Body = 0x190; - Female = false; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - AddItem(new Backpack()); - AddItem(new ThighBoots()); - AddItem(new LongPants(0x6C2)); - AddItem(new Shirt(0x11D)); - } - - public Norton(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Norton"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell( - this, - pm, - Utility.RandomList( - 1074205, // Oh great adventurer, would you please assist a weak soul in need of aid? - 1074213, // Hey buddy. Looking for work? - 1074211 // I could use some help. - ) - ); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Sadrah : BaseCreature - { - [Constructible] - public Sadrah() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the courier"; - Race = Race.Human; - Body = 0x191; - Female = true; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - AddItem(new Backpack()); - AddItem(new Boots(0x901)); - AddItem(new Skirt(0x52)); - AddItem(new Shirt(0x127)); - AddItem(new Cloak(0x65)); - AddItem(new Longsword()); - } - - public Sadrah(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Sadrah"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell( - this, - pm, - Utility.RandomList( - 1074205, // Oh great adventurer, would you please assist a weak soul in need of aid? - 1074213, // Hey buddy. Looking for work? - 1074211 // I could use some help. - ) - ); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Hargrove : BaseCreature - { - [Constructible] - public Hargrove() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Lumberjack"; - Race = Race.Human; - Body = 0x190; - Female = false; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - AddItem(new Backpack()); - AddItem(new Boots(0x901)); - AddItem(new StuddedLegs()); - AddItem(new Shirt(0x288)); - AddItem(new Bandana(0x20)); - AddItem(new BattleAxe()); - - Item item; - - item = new PlateGloves(); - item.Hue = 0x21E; - AddItem(item); - } - - public Hargrove(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Hargrove"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell( - this, - pm, - Utility.RandomList( - 1074213, // Hey buddy. Looking for work? - 1074211 // I could use some help. - ) - ); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } + Activated = true; + HasRestartDelay = true; + Title = 1075506; // Split Ends + Description = + 1075507; // *sighs* I think bowcrafting is a might beyond my talents. Say there, you look a bit more confident with tools. Can I persuade thee to make a few arrows? You could have my satchel in return... 'tis useless to me! You'll need a fletching kit to start, some feathers, and a few arrow shafts. Just use the fletching kit while you have the other things, and I'm sure you'll figure out the rest. + RefusalMessage = 1075508; // Oh. Well. I'll just keep trying alone, I suppose... + InProgressMessage = 1072271; // You're not quite done yet. Get back to work! + CompletionMessage = 1072272; // Thanks for helping me out. Here's the reward I promised you. + + Objectives.Add(new CollectObjective(20, typeof(Arrow), 1023902)); // arrow + + Rewards.Add(new ItemReward(1074282, typeof(AndricSatchel))); // Craftsmans's Satchel + } +} + +public class IShotAnArrowIntoTheAir : MLQuest +{ + public IShotAnArrowIntoTheAir() + { + Activated = true; + Title = 1075486; // I Shot an Arrow Into the Air... + Description = + 1075482; // Truth be told, the only way to get a feel for the bow is to shoot one and there's no better practice target than a sheep. If ye can shoot ten of them I think ye will have proven yer abilities. Just grab a bow and make sure to take enough ammunition. Bows tend to use arrows and crossbows use bolts. Ye can buy 'em or have someone craft 'em. How about it then? Come back here when ye are done. + RefusalMessage = 1075483; // Fair enough, the bow isn't for everyone. Good day then. + InProgressMessage = 1075484; // Return once ye have killed ten sheep with a bow and not a moment before. + + Objectives.Add(new KillObjective(10, new[] { typeof(Sheep) }, 1018270)); // sheep + + Rewards.Add(ItemReward.BagOfTrinkets); + } +} + +public class BakersDozen : MLQuest +{ + public BakersDozen() + { + Activated = true; + HasRestartDelay = true; + Title = 1075478; // Baker's Dozen + Description = + 1075479; // You there! Do you know much about the ways of cooking? If you help me out, I'll show you a thing or two about how it's done. Bring me some cookie mix, about 5 batches will do it, and I will reward you. Although, I don't think you can buy it, you can make some in a snap! First get a rolling pin or frying pan or even a flour sifter. Then you mix one pinch of flour with some water and you've got some dough! Take that dough and add one dollop of honey and you've got sweet dough. add one more drop of honey and you've got cookie mix. See? Nothing to it! Now get to work! + RefusalMessage = + 1075480; // Argh, I absolutely must have more of these 'cookies!' Come back if you change your mind. + InProgressMessage = 1072271; // You're not quite done yet. Get back to work! + CompletionMessage = 1075481; // Thank you! I haven't been this excited about food in months! + + Objectives.Add(new CollectObjective(5, typeof(CookieMix), 1024159)); // cookie mix + + Rewards.Add(new ItemReward(1074282, typeof(AsandosSatchel))); // Craftsmans's Satchel + } +} + +public class AStitchInTime : MLQuest +{ + public AStitchInTime() + { + Activated = true; + HasRestartDelay = true; + Title = 1075523; // A Stitch in Time + Description = + 1075522; // Oh how I wish I had a fancy dress like the noble ladies of Castle British! I don't have much... but I have a few trinkets I might trade for it. It would mean the world to me to go to a fancy ball and dance the night away. Oh, and I could tell you how to make one! You just need to use your sewing kit on enough cut cloth, that's all. + RefusalMessage = 1075526; // Won't you reconsider? It'd mean the world to me, it would! + InProgressMessage = + 1075527; // Hello again! Do you need anything? You may want to visit the tailor's shop for cloth and a sewing kit, if you don't already have them. + CompletionMessage = + 1075528; // It's gorgeous! I only have a few things to give you in return, but I can't thank you enough! Maybe I'll even catch Uzeraan's eye at the, er, *blushes* I mean, I can't wait to wear it to the next town dance! + + Objectives.Add(new CollectObjective(1, typeof(FancyDress), 1027935)); // fancy dress + + Rewards.Add(new ItemReward(1075524, typeof(AnOldRing))); // an old ring + Rewards.Add(new ItemReward(1075525, typeof(AnOldNecklace))); // an old necklace + } +} + +public class BatteredBucklers : MLQuest +{ + public BatteredBucklers() + { + Activated = true; + HasRestartDelay = true; + Title = 1075511; // Battered Bucklers + Description = + 1075512; // Hey there! Yeah... you! Ya' any good with a hammer? Tell ya what, if yer thinking about tryin' some metal work, and have a bit of skill, I can show ya how to bend it into shape. Just get some of those ingots there, and grab a hammer and use it over here at this forge. I need a few more bucklers hammered out to fill this here order with... hmmm about ten more. that'll give some taste of how to work the metal. + RefusalMessage = + 1075514; // Not enough muscle on yer bones to use it? hmph, probably afraid of the sparks markin' up yer loverly skin... to good for some honest labor... ha!... off with ya! + InProgressMessage = 1075515; // Come On! Whats that... a bucket? We need ten bucklers... not spitoons. + CompletionMessage = 1075516; // Thanks for the help. Here's something for ya to remember me by. + + Objectives.Add(new CollectObjective(10, typeof(Buckler), 1027027)); // buckler + + Rewards.Add(new ItemReward(1074282, typeof(GervisSatchel))); // Craftsmans's Satchel + } +} + +public class MoreOrePlease : MLQuest +{ + public MoreOrePlease() + { + Activated = true; + HasRestartDelay = true; + Title = 1075530; // More Ore Please + Description = + 1075529; // Have a pickaxe? My supplier is late and I need some iron ore so I can complete a bulk order for another merchant. If you can get me some soon I'll pay you double what it's worth on the market. Just find a cave or mountainside and try to use your pickaxe there, maybe you'll strike a good vein! 5 large pieces should do it. + RefusalMessage = + 1075531; // Not feeling strong enough today? Its alright, I didn't need a bucket of rocks anyway. + InProgressMessage = 1075532; // Hmmm' we need some more Ore. Try finding a mountain or cave, and give it a whack. + CompletionMessage = + 1075533; // I see you found a good vien! Great! This will help get this order out on time. Good work! + + Objectives.Add(new InternalObjective()); + + Rewards.Add(new ItemReward(1074282, typeof(MuggSatchel))); // Craftsmans's Satchel + } + + private class InternalObjective : CollectObjective + { + // Any type of ore is allowed + public InternalObjective() + : base(5, typeof(BaseOre), 1026585) // ore + { + } + + public override bool CheckItem(Item item) => item.ItemID == 6585; + } +} + +public class ComfortableSeating : MLQuest +{ + public ComfortableSeating() + { + Activated = true; + HasRestartDelay = true; + Title = 1075517; // Comfortable Seating + Description = + 1075518; // Hail friend, hast thou a moment? A mishap with a saw hath left me in a sorry state, for it shall be a while before I canst return to carpentry. In the meantime, I need a comfortable chair that I may rest. Could thou craft a straw chair? Only a tool, such as a dovetail saw, a few boards, and some skill as a carpenter is needed. Remember, this is a piece of furniture, so please pay attention to detail. + RefusalMessage = 1072687; // I quite understand your reluctance. If you reconsider, I'll be here. + InProgressMessage = 1075509; // Is all going well? I look forward to the simple comforts in my very own home. + CompletionMessage = 1074720; // This is perfect! + + Objectives.Add(new CollectObjective(1, typeof(BambooChair), "straw chair")); + + Rewards.Add(new ItemReward(1074282, typeof(LowelSatchel))); // Craftsmans's Satchel + } +} + +public class ThePenIsMightier : MLQuest +{ + public ThePenIsMightier() + { + Activated = true; + HasRestartDelay = true; + Title = 1075542; // The Pen is Mightier + Description = + 1075543; // Do you know anything about 'Inscription?' I've been trying to get my hands on some hand crafted Recall scrolls for a while now, and I could really use some help. I don't have a scribe's pen, let alone a spellbook with Recall in it, or blank scrolls, so there's no way I can do it on my own. How about you though? I could trade you one of my old leather bound books for some. + RefusalMessage = + 1075546; // Hmm, thought I had your interest there for a moment. It's not everyday you see a book made from real daemon skin, after all! + InProgressMessage = + 1075547; // Inscribing... yes, you'll need a scribe's pen, some reagents, some blank scroll, and of course your own magery book. You might want to visit the magery shop if you're lacking some materials. + CompletionMessage = + 1075548; // Ha! Finally! I've had a rune to the waterfalls near Justice Isle that I've been wanting to use for the longest time, and now I can visit at last. Here's that book I promised you... glad to be rid of it, to be honest. + + Objectives.Add(new CollectObjective(5, typeof(RecallScroll), "recall scroll")); + + Rewards.Add(new ItemReward(1075545, typeof(RedLeatherBook))); // a book bound in red leather + } +} + +public class AClockworkPuzzle : MLQuest +{ + public AClockworkPuzzle() + { + Activated = true; + HasRestartDelay = true; + Title = 1075535; // A clockwork puzzle + Description = + 1075534; // 'Tis a riddle, you see! "What kind of clock is only right twice per day? A broken one!" *laughs heartily* Ah, yes *wipes eye*, that's one of my favorites! Ah... to business. Could you fashion me some clock parts? I wish my own clocks to be right all the day long! You'll need some tinker's tools and some iron ingots, I think, but from there it should be just a matter of working the metal. + RefusalMessage = 1072981; // Or perhaps you'd rather not. + InProgressMessage = 1072271; // You're not quite done yet. Get back to work! + CompletionMessage = 1075536; // Wonderful! Tick tock, tick tock, soon all shall be well with grandfather's clock! + + Objectives.Add(new CollectObjective(5, typeof(ClockParts), 1024175)); // clock parts + + Rewards.Add(new ItemReward(1074282, typeof(NibbetSatchel))); // Craftsmans's Satchel + } +} + +public class DeliciousFishes : MLQuest +{ + public DeliciousFishes() + { + Activated = true; + HasRestartDelay = true; + Title = 1075555; // Delicious Fishes + Description = + 1075556; // Ello there, looking for a good place on the dock to fish? I like the southeast corner meself. What's that? Oh, no, *sighs* me pole is broken and in for fixin'. My grandpappy gave me that pole, means a lot you see. Miss the taste of fish though... Oh say, since you're here, could you catch me a few fish? I can cook a mean fish steak, and I'll split 'em with you! But make sure it's one of the green kind, they're the best for seasoning! + RefusalMessage = + 1075558; // Ah, you're missin' out my friend, you're missing out. My peppercorn fishsteaks are famous on this little isle of ours! + InProgressMessage = + 1075559; // Eh? Find yerself a pole and get close to some water. Just toss the line on in and hopefully you won't snag someone's old boots! Remember, that's twenty of them green fish we'll be needin', so come back when you've got em, 'aight? + CompletionMessage = + 1075560; // Just a moment my friend, just a moment! *rummages in his pack* Here we are! My secret blend of peppers always does the trick, never fails, no not once. These'll fill you up much faster than that tripe they sell in the market! + + Objectives.Add(new CollectObjective(5, typeof(Fish), 1022508)); // fish + + Rewards.Add(new ItemReward(1075557, typeof(PeppercornFishsteak), 3)); // peppercorn fishsteak + } +} + +public class FleeAndFatigue : MLQuest +{ + public FleeAndFatigue() + { + Activated = true; + HasRestartDelay = true; + Title = 1075487; // Flee and Fatigue + Description = + 1075488; // I was just *coughs* ambushed near the moongate. *wheeze* Why do I pay my taxes? Where were the guards? You then, you an Alchemist? If you can make me a few Refresh potions, I will be back on my feet and can give those lizards the what for! Find a mortar and pestle, a good amount of black pearl, and ten empty bottles to store the finished potions in. Just use the mortar and pestle and the rest will surely come to you. When you return, the favor will be repaid. + RefusalMessage = + 1075489; // Fine fine, off with *cough* thee then! The next time you see a lizardman though, give him a whallop for me, eh? + InProgressMessage = + 1075490; // Just remember you need to use your mortar and pestle while you have empty bottles and some black pearl. Refresh potions are what I need. + CompletionMessage = + 1075491; // *glug* *glug* Ahh... Yes! Yes! That feels great! Those lizardmen will never know what hit 'em! Here, take this, I can get more from the lizards. + + Objectives.Add(new CollectObjective(10, typeof(RefreshPotion), "refresh potions")); + + Rewards.Add(new ItemReward(1074282, typeof(SadrahSatchel))); // Craftsmans's Satchel + } +} + +public class ChopChopOnTheDouble : MLQuest +{ + public ChopChopOnTheDouble() + { + Activated = true; + HasRestartDelay = true; + Title = 1075537; // Chop Chop, On The Double! + Description = + 1075538; // That's right, move it! I need sixty logs on the double, and they need to be freshly cut! If you can get them to me fast I'll have your payment in your hands before you have the scent of pine out from beneath your nostrils. Just get a sharp axe and hack away at some of the trees in the land and your lumberjacking skill will rise in no time. + RefusalMessage = 1072981; // Or perhaps you'd rather not. + InProgressMessage = 1072271; // You're not quite done yet. Get back to work! + CompletionMessage = + 1075539; // Ahhh! The smell of fresh cut lumber. And look at you, all strong and proud, as if you had done an honest days work! + + Objectives.Add(new CollectObjective(60, typeof(Log), 1027133)); // log + + Rewards.Add(new ItemReward(1074282, typeof(HargroveSatchel))); // Craftsmans's Satchel + } +} + +[SerializationGenerator(0, false)] +public partial class Andric : BaseCreature +{ + [Constructible] + public Andric() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the archer trainer"; + Race = Race.Human; + Body = 0x190; + Female = false; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + SetSkill(SkillName.Archery, 60.0, 80.0); + + AddItem(new Backpack()); + + Item item; + + item = new LeatherChest(); + item.Hue = 0x1BB; + AddItem(item); + + item = new LeatherLegs(); + item.Hue = 0x6AD; + AddItem(item); + + item = new LeatherArms(); + item.Hue = 0x6AD; + AddItem(item); + + item = new LeatherGloves(); + item.Hue = 0x1BB; + AddItem(item); + + AddItem(new Boots(0x1BB)); + AddItem(new CompositeBow()); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Andric"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell( + this, + pm, + Utility.RandomList( + 1074205, // Oh great adventurer, would you please assist a weak soul in need of aid? + 1074213 // Hey buddy. Looking for work? + ) + ); + } +} + +[SerializationGenerator(0, false)] +public partial class Kashiel : BaseCreature +{ + [Constructible] + public Kashiel() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the archer"; + Race = Race.Human; + Body = 0x191; + Female = true; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + AddItem(new Backpack()); + + Item item; + + item = new LeatherChest(); + item.Hue = 0x1BB; + AddItem(item); + + item = new LeatherLegs(); + item.Hue = 0x901; + AddItem(item); + + item = new LeatherArms(); + item.Hue = 0x901; + AddItem(item); + + item = new LeatherGloves(); + item.Hue = 0x1BB; + AddItem(item); + + AddItem(new Boots(0x1BB)); + AddItem(new CompositeBow()); + } + + public override string DefaultName => "Kashiel"; + public override bool IsInvulnerable => true; +} + +[SerializationGenerator(0, false)] +public partial class Asandos : BaseCreature +{ + [Constructible] + public Asandos() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the chef"; + Race = Race.Human; + Body = 0x190; + Female = false; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + AddItem(new Backpack()); + AddItem(new Boots(0x901)); + AddItem(new ShortPants()); + AddItem(new Shirt()); + AddItem(new Cap()); + AddItem(new HalfApron(0x28)); + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "Asandos"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell( + this, + pm, + Utility.RandomList( + 1074205, // Oh great adventurer, would you please assist a weak soul in need of aid? + 1074213 // Hey buddy. Looking for work? + ) + ); + } +} + +[SerializationGenerator(0, false)] +public partial class Clairesse : BaseCreature +{ + [Constructible] + public Clairesse() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the servant"; + Race = Race.Human; + Body = 0x191; + Female = true; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + AddItem(new Backpack()); + AddItem(new Shoes(Utility.RandomNeutralHue())); + AddItem(new PlainDress(0x3C9)); + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "Clarisse"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell( + this, + pm, + Utility.RandomList( + 1074205, // Oh great adventurer, would you please assist a weak soul in need of aid? + 1074213 // Hey buddy. Looking for work? + ) + ); + } +} + +[SerializationGenerator(0, false)] +public partial class Gervis : BaseCreature +{ + [Constructible] + public Gervis() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the blacksmith trainer"; + Race = Race.Human; + Body = 0x190; + Female = false; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + SetSkill(SkillName.Blacksmith, 60.0, 80.0); + + AddItem(new Backpack()); + AddItem(new Boots(0x3B3)); + AddItem(new ShortPants(0x1BB)); + AddItem(new Doublet(0x652)); + AddItem(new SmithHammer()); + + Item item; + + item = new LeatherGloves(); + item.Hue = 0x3B2; + AddItem(item); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Gervis"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell( + this, + pm, + Utility.RandomList( + 1074205, // Oh great adventurer, would you please assist a weak soul in need of aid? + 1074213, // Hey buddy. Looking for work? + 1074211 // I could use some help. + ) + ); + } +} + +[SerializationGenerator(0, false)] +public partial class Mugg : BaseCreature +{ + [Constructible] + public Mugg() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the miner"; + Race = Race.Human; + Body = 0x190; + Female = false; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + AddItem(new Backpack()); + AddItem(new Boots(0x901)); + AddItem(new ShortPants(0x3B3)); + AddItem(new Shirt(0x22B)); + AddItem(new HalfApron(0x5F1)); + AddItem(new SkullCap(0x177)); + AddItem(new Pickaxe()); + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "Mugg"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1074211); // I could use some help. + } +} + +[SerializationGenerator(0, false)] +public partial class Lowel : BaseCreature +{ + [Constructible] + public Lowel() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the carpenter"; + Race = Race.Human; + Body = 0x190; + Female = false; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + AddItem(new Backpack()); + AddItem(new Boots(0x543)); + AddItem(new ShortPants(0x758)); + AddItem(new FancyShirt(0x53A)); + AddItem(new HalfApron(0x6D2)); + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "Lowel"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell( + this, + pm, + Utility.RandomList( + 1074205, // Oh great adventurer, would you please assist a weak soul in need of aid? + 1074213 // Hey buddy. Looking for work? + ) + ); + } +} + +[SerializationGenerator(0, false)] +public partial class Lyle : BaseCreature +{ + [Constructible] + public Lyle() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the mage"; + Race = Race.Human; + Body = 0x190; + Female = false; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + AddItem(new Backpack()); + AddItem(new Robe(0x2FD)); + AddItem(new ThighBoots()); + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "Lyle"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell( + this, + pm, + Utility.RandomList( + 1074205, // Oh great adventurer, would you please assist a weak soul in need of aid? + 1074213 // Hey buddy. Looking for work? + ) + ); + } +} + +[SerializationGenerator(0, false)] +public partial class Nibbet : BaseCreature +{ + [Constructible] + public Nibbet() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the tinker"; + Race = Race.Human; + Body = 0x190; + Female = false; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + AddItem(new Backpack()); + AddItem(new Boots(0x591)); + AddItem(new ShortPants(0xF8)); + AddItem(new Shirt(0x2D)); + AddItem(new FullApron(0x288)); + } + + public override string DefaultName => "Nibbet"; + public override bool IsInvulnerable => true; +} + +[SerializationGenerator(0, false)] +public partial class Norton : BaseCreature +{ + [Constructible] + public Norton() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the fisher"; + Race = Race.Human; + Body = 0x190; + Female = false; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + AddItem(new Backpack()); + AddItem(new ThighBoots()); + AddItem(new LongPants(0x6C2)); + AddItem(new Shirt(0x11D)); + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "Norton"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell( + this, + pm, + Utility.RandomList( + 1074205, // Oh great adventurer, would you please assist a weak soul in need of aid? + 1074213, // Hey buddy. Looking for work? + 1074211 // I could use some help. + ) + ); + } +} + +[SerializationGenerator(0, false)] +public partial class Sadrah : BaseCreature +{ + [Constructible] + public Sadrah() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the courier"; + Race = Race.Human; + Body = 0x191; + Female = true; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + AddItem(new Backpack()); + AddItem(new Boots(0x901)); + AddItem(new Skirt(0x52)); + AddItem(new Shirt(0x127)); + AddItem(new Cloak(0x65)); + AddItem(new Longsword()); + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "Sadrah"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell( + this, + pm, + Utility.RandomList( + 1074205, // Oh great adventurer, would you please assist a weak soul in need of aid? + 1074213, // Hey buddy. Looking for work? + 1074211 // I could use some help. + ) + ); + } +} + +[SerializationGenerator(0, false)] +public partial class Hargrove : BaseCreature +{ + [Constructible] + public Hargrove() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Lumberjack"; + Race = Race.Human; + Body = 0x190; + Female = false; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + AddItem(new Backpack()); + AddItem(new Boots(0x901)); + AddItem(new StuddedLegs()); + AddItem(new Shirt(0x288)); + AddItem(new Bandana(0x20)); + AddItem(new BattleAxe()); + + Item item; + + item = new PlateGloves(); + item.Hue = 0x21E; + AddItem(item); + } + + public override bool IsInvulnerable => true; + public override string DefaultName => "Hargrove"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell( + this, + pm, + Utility.RandomList( + 1074213, // Hey buddy. Looking for work? + 1074211 // I could use some help. + ) + ); } } diff --git a/Projects/UOContent/Engines/ML Quests/Definitions/Sanctuary.cs b/Projects/UOContent/Engines/ML Quests/Definitions/Sanctuary.cs index 172946515..1e03fc986 100644 --- a/Projects/UOContent/Engines/ML Quests/Definitions/Sanctuary.cs +++ b/Projects/UOContent/Engines/ML Quests/Definitions/Sanctuary.cs @@ -1,1383 +1,1203 @@ using System; +using ModernUO.Serialization; using Server.Engines.MLQuests.Objectives; using Server.Engines.MLQuests.Rewards; using Server.Items; using Server.Mobiles; -namespace Server.Engines.MLQuests.Definitions +namespace Server.Engines.MLQuests.Definitions; + +public class BrokenShaft : MLQuest { - public class BrokenShaft : MLQuest + public BrokenShaft() { - public BrokenShaft() - { - Activated = true; - HasRestartDelay = true; - Title = 1074018; // Broken Shaft - Description = - 1074112; // What do humans know of archery? Humans can barely shoot straight. Why, your efforts are absurd. In fact, I will make a wager - if these so called human arrows I've heard about are really as effective and innovative as human braggarts would have me believe, then I'll trade you something useful. I might even teach you something of elven craftsmanship. - RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. - InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! - CompletionMessage = - 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! - - Objectives.Add(new CollectObjective(10, typeof(Arrow), 1023902)); // arrow - - Rewards.Add(ItemReward.FletchingSatchel); - } - } - - public class BendingTheBow : MLQuest - { - public BendingTheBow() - { - Activated = true; - HasRestartDelay = true; - Title = 1074019; // Bending the Bow - Description = - 1074113; // Human craftsmanship! Ha! Why, take an elven bow. It will last for a lifetime, never break and always shoot an arrow straight and true. Can't say the same for a human, can you? Bring me some of these human made bows, and I will show you. - RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. - InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! - CompletionMessage = - 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! - - Objectives.Add(new CollectObjective(10, typeof(Bow), 1025041)); // bow - - Rewards.Add(ItemReward.FletchingSatchel); - } - } - - public class ArmsRace : MLQuest - { - public ArmsRace() - { - Activated = true; - HasRestartDelay = true; - Title = 1074020; // Arms Race - Description = - 1074114; // Leave it to a human to try and improve upon perfection. To take a bow and turn it into a mechanical contraption like a crossbow. I wish to see more of this sort of "invention". Fetch for me a crossbow, human. - RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. - InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! - CompletionMessage = - 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! - - Objectives.Add(new CollectObjective(10, typeof(Crossbow), 1023919)); // crossbow - - Rewards.Add(ItemReward.FletchingSatchel); - } - } - - public class ImprovedCrossbows : MLQuest - { - public ImprovedCrossbows() - { - Activated = true; - HasRestartDelay = true; - Title = 1074021; // Improved Crossbows - Description = - 1074115; // How lazy is man! You cannot even be bothered to pull your own drawstring and hold an arrow ready? You must invent a device to do it for you? I cannot understand, but perhaps if I examine a heavy crossbow for myself, I will see their appeal. Go and bring me such a device and I will repay your meager favor. - RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. - InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! - CompletionMessage = - 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! - - Objectives.Add(new CollectObjective(10, typeof(HeavyCrossbow), 1025116)); // heavy crossbow - - Rewards.Add(ItemReward.FletchingSatchel); - } - } - - public class BuildingTheBetterCrossbow : MLQuest - { - public BuildingTheBetterCrossbow() - { - Activated = true; - HasRestartDelay = true; - Title = 1074022; // Building the Better Crossbow - Description = - 1074116; // More is always better for a human, eh? Take these repeating crossbows. What sort of mind invents such a thing? I must look at it more closely. Bring such a contraption to me and you'll receive a token for your efforts. - RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. - InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! - CompletionMessage = - 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! - - Objectives.Add(new CollectObjective(10, typeof(RepeatingCrossbow), 1029923)); // repeating crossbow - - Rewards.Add(ItemReward.FletchingSatchel); - } - } - - public class InstrumentOfWar : MLQuest - { - public InstrumentOfWar() - { - Activated = true; - HasRestartDelay = true; - Title = 1074055; // Instrument of War - Description = - 1074149; // Pathetic, this human craftsmanship! Take their broadswords - overgrown butter knives, in reality. No, I cannot do them justice - you must see for yourself. Bring me broadswords and I will demonstrate their feebleness. - RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. - InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! - CompletionMessage = - 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! - - Objectives.Add(new CollectObjective(12, typeof(Broadsword), 1023934)); // broadsword - - Rewards.Add(ItemReward.BlacksmithSatchel); - } - } - - public class TheShield : MLQuest - { - public TheShield() - { - Activated = true; - HasRestartDelay = true; - Title = 1074054; // The Shield - Description = - 1074148; // I doubt very much a human shield would stop a good stout elven arrow. You doubt me? I will show you - get me some of these heater shields and I will piece them with sharp elven arrows! - RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. - InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! - CompletionMessage = - 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! - - Objectives.Add(new CollectObjective(10, typeof(HeaterShield), 1027030)); // heater shield - - Rewards.Add(ItemReward.BlacksmithSatchel); - } - } - - public class MusicToMyEars : MLQuest - { - public MusicToMyEars() - { - Activated = true; - HasRestartDelay = true; - Title = 1074023; // Music to my Ears - Description = - 1074117; // You think you know something of music? Laughable! Take your lap harp. Crude, indelicate instruments that make a noise not unlike the wailing of a choleric child or a dying cat. I will show you - bring lap harps, and I will demonstrate. - RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. - InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! - CompletionMessage = - 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! - - Objectives.Add(new CollectObjective(10, typeof(LapHarp), 1023762)); // lap harp - - Rewards.Add(ItemReward.CarpentrySatchel); - } - } - - public class TheGlassEye : MLQuest - { - public TheGlassEye() - { - Activated = true; - HasRestartDelay = true; - Title = 1074050; // The Glass Eye - Description = - 1074144; // Humans are so pathetically weak, they must be augmented by glass and metal! Imagine such a thing! I must see one of these spyglasses for myself, to understand the pathetic limits of human sight! - RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. - InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! - CompletionMessage = - 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! - - Objectives.Add(new CollectObjective(10, typeof(Spyglass), 1025365)); // spyglass - - Rewards.Add(ItemReward.TinkerSatchel); - } - } - - public class LazyHumans : MLQuest - { - public LazyHumans() - { - Activated = true; - HasRestartDelay = true; - Title = 1074024; // Lazy Humans - Description = - 1074118; // Human fancy knows no bounds! It's pathetic that they are so weak that they must create a special stool upon which to rest their feet when they recline! Humans don't have any clue how to live. Bring me some of these foot stools to examine and I may teach you something worthwhile. - RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. - InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! - CompletionMessage = - 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! - - Objectives.Add(new CollectObjective(10, typeof(FootStool), 1022910)); // foot stool - - Rewards.Add(ItemReward.CarpentrySatchel); - } - } - - public class InventiveTools : MLQuest - { - public InventiveTools() - { - Activated = true; - HasRestartDelay = true; - Title = 1074048; // Inventive Tools - Description = - 1074142; // Bring me some of these tinker's tools! I am certain, in the hands of an elf, they will fashion objects of ingenuity and delight that will shame all human invention! Hurry, do this quickly and I might deign to show you my skill. - RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. - InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! - CompletionMessage = - 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! - - Objectives.Add(new CollectObjective(10, typeof(TinkerTools), 1027868)); // tinker's tools - - Rewards.Add(ItemReward.TinkerSatchel); - } - } - - public class PixieDustToDust : MLQuest - { - public PixieDustToDust() - { - Activated = true; - Title = 1073661; // Pixie dust to dust - Description = - 1073700; // Is there anything more foul than a pixie? They have cruel eyes and a mind for mischief, I say. I don't care if some think they're cute -- I say kill them and let the Avatar sort them out. In fact, if you were to kill a few pixies, I'd make sure you had a few coins to rub together, if you get my meaning. - RefusalMessage = 1073733; // Perhaps you'll change your mind and return at some point. - InProgressMessage = 1073741; // There's too much cuteness in the world -- kill those pixies! - - Objectives.Add(new KillObjective(10, new[] { typeof(Pixie) }, "pixies")); - - Rewards.Add(ItemReward.LargeBagOfTreasure); - } - } - - public class AnImpressivePlaid : MLQuest - { - public AnImpressivePlaid() - { - Activated = true; - HasRestartDelay = true; - Title = 1074044; // An Impressive Plaid - Description = - 1074138; // I do not believe humans are so ridiculous as to wear something called a "kilt". Bring for me some of these kilts, if they truly exist, and I will offer you meager reward. - RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. - InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! - CompletionMessage = - 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! - - Objectives.Add(new CollectObjective(10, typeof(Kilt), 1025431)); // kilt - - Rewards.Add(ItemReward.TailorSatchel); - } - } - - public class ANiceShirt : MLQuest - { - public ANiceShirt() - { - Activated = true; - HasRestartDelay = true; - Title = 1074045; // A Nice Shirt - Description = - 1074139; // Humans call that a fancy shirt? I would wager the ends are frayed, the collar worn, the buttons loosely stitched. Bring me fancy shirts and I will demonstrate the many ways in which they are inferior. - RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. - InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! - CompletionMessage = - 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! - - Objectives.Add(new CollectObjective(10, typeof(FancyShirt), 1027933)); // fancy shirt - - Rewards.Add(ItemReward.TailorSatchel); - } - } - - public class LeatherAndLace : MLQuest - { - public LeatherAndLace() - { - Activated = true; - HasRestartDelay = true; - Title = 1074047; // Leather and Lace - Description = - 1074141; // No self respecting elf female would ever wear a studded bustier! I will prove it - bring me such clothing and I will show you how ridiculous they are! - RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. - InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! - CompletionMessage = - 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! - - Objectives.Add(new CollectObjective(10, typeof(StuddedBustierArms), 1027180)); // studded bustier - - Rewards.Add(ItemReward.TailorSatchel); - } - } - - public class FeyHeadgear : MLQuest - { - public FeyHeadgear() - { - Activated = true; - HasRestartDelay = true; - Title = 1074043; // Fey Headgear - Description = - 1074137; // Humans do not deserve to wear a thing such as a flower garland. Help me prevent such things from falling into the clumsy hands of humans -- bring me flower garlands! - RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. - InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! - CompletionMessage = - 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! - - Objectives.Add(new CollectObjective(10, typeof(FlowerGarland), 1028965)); // flower garland - - Rewards.Add(ItemReward.TailorSatchel); - } - } - - public class NewCloak : MLQuest - { - public NewCloak() - { - Activated = true; - Title = 1074684; // New Cloak - Description = - 1074685; // I have created a masterpiece! And all I need to finish it off is the soft fur of a wolf. But not just ANY wolf -- oh no, no, that wouldn't do. I've heard tales of a mighty beast, Grobu, who is bonded to the leader of the troglodytes. Only Grobu's fur will do. Will you retrieve it for me? - RefusalMessage = 1074655; // Perhaps I thought too highly of you. - InProgressMessage = - 1074686; // I've told you all I know of the creature. Until you return with Grobu's fur I can't finish my cloak. - CompletionMessage = 1074687; // Ah! So soft, so supple. What a wonderful texture. Here you are ... my thanks. - - Objectives.Add(new CollectObjective(1, typeof(GrobusFur), "Grobu's Fur")); - - Rewards.Add(ItemReward.TailorSatchel); - } - } - - public class ADishBestServedCold : MLQuest - { - public ADishBestServedCold() - { - Activated = true; - Title = 1072372; // A Dish Best Served Cold - Description = - 1072657; // *mutter* I'll have my revenge. Oh! You there. Fancy some orc extermination? I despise them all. Bombers, brutes -- you name it, if it's orcish I want it killed. - RefusalMessage = 1072667; // Hrmph. Well maybe another time then. - InProgressMessage = 1072668; // Shouldn't you be slaying orcs? - - Objectives.Add( - new KillObjective( - 10, - new[] { typeof(Orc) }, - "orcs", - new QuestArea(1074807, "Sanctuary") - ) - ); - Objectives.Add( - new KillObjective( - 5, - new[] { typeof(OrcBomber) }, - "orc bombers", - new QuestArea(1074807, "Sanctuary") - ) - ); - Objectives.Add( - new KillObjective( - 3, - new[] { typeof(OrcBrute) }, - "orc brutes", - new QuestArea(1074807, "Sanctuary") - ) - ); - - Rewards.Add(ItemReward.BagOfTreasure); - } - } - - public class ArchEnemies : MLQuest - { - public ArchEnemies() - { - Activated = true; - Title = 1073085; // Arch Enemies - Description = - 1073575; // Vermin! They get into everything! I told the boy to leave out some poisoned cheese -- and they shot him. What else can I do? Unless these ratmen are skilled with a bow, but I'd lay a wager you're better, eh? Could you skin a few of the wretches for me? - RefusalMessage = 1073580; // I hope you'll reconsider. Until then, farwell. - InProgressMessage = - 1073595; // I don't see 10 tails from Ratman Archers on your belt -- and until I do, no reward for you. - - Objectives.Add(new KillObjective(10, new[] { typeof(RatmanArcher) }, "ratman archers")); - - Rewards.Add(ItemReward.BagOfTreasure); - } - } - - public class Vermin : MLQuest - { - public Vermin() - { - Activated = true; - Title = 1072995; // Vermin - Description = - 1073029; // You've got to help me out! Those ratmen have been causing absolute havok around here. Kill them off before they destroy my land. I'll pay you if you kill off twelve of those dirty rats. - RefusalMessage = 1072270; // Well, okay. But if you decide you are up for it after all, c'mon back and see me. - InProgressMessage = 1072271; // You're not quite done yet. Get back to work! - - Objectives.Add(new KillObjective(12, new[] { typeof(Ratman) }, "ratmen")); - - Rewards.Add(ItemReward.BagOfTrinkets); - } - } - - public class MougGuurMustDie : MLQuest - { - public MougGuurMustDie() - { - Activated = true; - Title = 1072368; // Moug-Guur Must Die - Description = - 1072561; // You there! Yes, you. Kill Moug-Guur, the leader of the orcs in this depressing place, and I'll make it worth your while. - RefusalMessage = 1072571; // Fine. It's no skin off my teeth. - InProgressMessage = 1072572; // Small words. Kill Moug-Guur. Go. Now! - CompletionMessage = - 1072573; // You're better than I thought you'd be. Not particularly bad, but not entirely inept. - - Objectives.Add( - new KillObjective( - 1, - new[] { typeof(MougGuur) }, - "Moug-Guur", - new QuestArea(1074807, "Sanctuary") - ) - ); - - Rewards.Add(ItemReward.BagOfTreasure); - } - - public override Type NextQuest => typeof(LeaderOfThePack); - } - - public class LeaderOfThePack : MLQuest - { - public LeaderOfThePack() - { - Activated = true; - Title = 1072560; // Leader of the Pack - Description = - 1072574; // Well now that Moug-Guur is no more -- and I can't say I'm weeping for his demise -- it's time for the ratmen to experience a similar loss of leadership. Slay Chiikkaha. In return, I'll satisfy your greed temporarily. - RefusalMessage = - 1072575; // Alright, if you'd rather not, then run along and do whatever worthless things you do when I'm not giving you direction. - InProgressMessage = - 1072576; // How difficult is this? The rats live in the tunnels. Go into the tunnels and find the biggest, meanest rat and execute him. Loitering around here won't get the task done. - CompletionMessage = 1072577; // It's about time! Could you have taken longer? - - Objectives.Add( - new KillObjective( - 1, - new[] { typeof(Chiikkaha) }, - "Chiikkaha", - new QuestArea(1074807, "Sanctuary") - ) - ); - - Rewards.Add(ItemReward.BagOfTreasure); - } - - public override Type NextQuest => typeof(SayonaraSzavetra); - public override bool IsChainTriggered => true; - } - - public class SayonaraSzavetra : MLQuest - { - public SayonaraSzavetra() - { - Activated = true; - Title = 1072375; // Sayonara, Szavetra - Description = - 1072578; // Hmm, maybe you aren't entirely worthless. I suspect a demoness of Szavetra's calibre will tear you apart ... We might as well find out. Kill the succubus, yada yada, and you'll be richly rewarded. - RefusalMessage = 1072579; // Hah! I knew you couldn't handle it. - InProgressMessage = - 1072581; // Hahahaha! I can see the fear in your eyes. Pathetic. Szavetra is waiting for you. - CompletionMessage = - 1072582; // Amazing! Simply astonishing ... you survived. Well, I supposed I should indulge your avarice with a reward. - - Objectives.Add( - new KillObjective( - 1, - new[] { typeof(Szavetra) }, - "Szavetra", - new QuestArea(1074807, "Sanctuary") - ) - ); - - Rewards.Add(ItemReward.Strongbox); - } - - public override bool IsChainTriggered => true; - } - - public class TappingTheKeg : MLQuest - { - public TappingTheKeg() - { - Activated = true; - HasRestartDelay = true; - Title = 1074037; // Tapping the Keg - Description = - 1074131; // I have acquired a barrel of human brewed beer. I am loathe to drink it, but how else to prove how inferior it is? I suppose I shall need a barrel tap to drink. Go, bring me a barrel tap quickly, so I might get this over with. - RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. - InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! - CompletionMessage = - 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! - - Objectives.Add(new CollectObjective(10, typeof(BarrelTap), 1024100)); // barrel tap - - Rewards.Add(ItemReward.TinkerSatchel); - } - } - - public class WaitingToBeFilled : MLQuest - { - public WaitingToBeFilled() - { - Activated = true; - HasRestartDelay = true; - Title = 1074036; // Waiting to be Filled - Description = - 1074130; // The only good thing I can say about human made bottles is that they are empty and may yet still be filled with elven wine. Go now, fetch a number of empty bottles so that I might save them from the fate of carrying human-made wine. - RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. - InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! - CompletionMessage = - 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! - - Objectives.Add(new CollectObjective(20, typeof(Bottle), 1023854)); // empty bottle - - Rewards.Add(ItemReward.TinkerSatchel); - } - } - - public class BreezesSong : MLQuest - { - public BreezesSong() - { - Activated = true; - HasRestartDelay = true; - Title = 1074052; // Breeze's Song - Description = - 1074146; // I understand humans cruely enslave the very wind to their selfish whims! Fancy wind chimes, what a monstrous idea! You must bring me proof of this terrible depredation - hurry, bring me wind chimes! - RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. - InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! - CompletionMessage = - 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! - - Objectives.Add(new CollectObjective(10, typeof(FancyWindChimes), 1030291)); // fancy wind chimes - - Rewards.Add(ItemReward.TinkerSatchel); - } - } - - public class ProofOfTheDeed : MLQuest - { - public ProofOfTheDeed() - { - Activated = true; - Title = 1072339; // Proof of the Deed - Description = - 1072340; // These human vermin must be erradicated! They despoil fair Sosaria with their every footfall upon her soil, every exhalation of breath upon her pristine air. Prove yourself an ally of Sosaria and bring me 20 human ears as proof of your devotion to our cause. - RefusalMessage = - 1072342; // Do you find the task distasteful? Are you too weak to shoulder the duty of cleansing Sosaria? So be it. - InProgressMessage = - 1072343; // Well, where is the proof of your deed? I will honor your actions when you have brought me the ears of the human scum. - CompletionMessage = - 1072344; // Ah, well done. You have chosen the path of duty and fulfilled your task with honor. - - Objectives.Add(new CollectObjective(20, typeof(SeveredHumanEars), 1032591)); // severed human ears - - Rewards.Add(ItemReward.BagOfTrinkets); - } - } - - public class Marauders : MLQuest - { - public Marauders() - { - Activated = true; - Title = 1072374; // Marauders - Description = - 1072686; // What a miserable place we live in. Look around you at the changes we've wrought. The trees are sprouting leaves once more and the grass is reclaiming the blood-soaked soil. Who would have imagined we'd find ourselves here? Our "neighbors" are anything but friendly and those ogres are the worst of the lot. Maybe you'd be interested in helping our community by disposing of some of our least amiable neighbors? - RefusalMessage = 1072687; // I quite understand your reluctance. If you reconsider, I'll be here. - InProgressMessage = 1072688; // You can't miss those ogres, they're huge and just outside the gates here. - - Objectives.Add( - new KillObjective( - 10, - new[] { typeof(Ogre) }, - "ogres", - new QuestArea(1074807, "Sanctuary") - ) - ); - - Rewards.Add(ItemReward.BagOfTreasure); - } - - public override Type NextQuest => typeof(TheBrainsOfTheOperation); - } - - public class TheBrainsOfTheOperation : MLQuest - { - public TheBrainsOfTheOperation() - { - Activated = true; - Title = 1072692; // The Brains of the Operation - Description = - 1072707; // *sigh* We have so much to do to clean this area up. Even the fine work you did on those ogres didn't have much of an impact on the community. It's the ogre lords that direct the actions of the other ogres, let's strike at the leaders and perhaps that will thwart the miserable curs. - RefusalMessage = 1072708; // Reluctance doesn't become a hero like you. But, as you wish. - InProgressMessage = - 1072709; // Ogre Lords are pretty easy to recognize. They're the ones ordering the other ogres about in a lordly manner. Striking down their leadership will throw the ogres into confusion and dismay! - - Objectives.Add( - new KillObjective( - 10, - new[] { typeof(OgreLord) }, - "ogre lords", - new QuestArea(1074807, "Sanctuary") - ) - ); - - Rewards.Add(ItemReward.LargeBagOfTreasure); - } - - public override Type NextQuest => typeof(TheBrawn); - public override bool IsChainTriggered => true; - } - - public class TheBrawn : MLQuest - { - public TheBrawn() - { - Activated = true; - Title = 1072693; // The Brawn - Description = - 1072710; // Inconceiveable! We've learned that the ogre leadership has recruited some heavy-duty guards to their cause. I've never personally fought a cyclopian warrior, but I'm sure you could easily best a few and report back how much trouble they'll cause to our growing community? - RefusalMessage = 1072711; // Oh, I see. *sigh* Perhaps I overestimated your abilities. - InProgressMessage = 1072712; // Make sure you fully assess all of the cyclopian tactical abilities! - - Objectives.Add( - new KillObjective( - 6, - new[] { typeof(Cyclops) }, - "cyclops", - new QuestArea(1074807, "Sanctuary") - ) - ); - - Rewards.Add(ItemReward.LargeBagOfTreasure); - } - - public override Type NextQuest => typeof(TheBiggerTheyAre); - public override bool IsChainTriggered => true; - } - - public class TheBiggerTheyAre : MLQuest - { - public TheBiggerTheyAre() - { - Activated = true; - Title = 1072694; // The Bigger They Are ... - Description = - 1072713; // The ogre insurgency has taken a turn for the worse! I've just been advised that the titans have concluded their discussions with the ogres and they've allied. We have virtually no information about titans. Engage them and appraise their mettle. - RefusalMessage = - 1072714; // Certainly. You've done enough to merit a breather. When you're ready for more, report back to me. - InProgressMessage = - 1072715; // Those titans don't skulk very well. You should be able to track them easily ... their footsteps are easily the largest around. - - Objectives.Add( - new KillObjective( - 3, - new[] { typeof(Titan) }, - "titans", - new QuestArea(1074807, "Sanctuary") - ) - ); - - Rewards.Add(ItemReward.LargeBagOfTreasure); - } - - public override bool IsChainTriggered => true; - } - - public class TroubleOnTheWing : MLQuest - { - public TroubleOnTheWing() - { - Activated = true; - Title = 1072371; // Trouble on the Wing - Description = - 1072593; // Those gargoyles need to get knocked down a peg or two, if you ask me. They're always flying over here and lobbing things at us. What a nuisance. Drop a dozen of them for me, would you? - RefusalMessage = 1072594; // Don't tell me you're a gargoyle sympathizer? *spits* - InProgressMessage = - 1072595; // Those blasted gargoyles hang around the old tower. That's the best place to hunt them down. - - Objectives.Add( - new KillObjective( - 12, - new[] { typeof(Gargoyle) }, - "gargoyles", - new QuestArea(1074807, "Sanctuary") - ) - ); - - Rewards.Add(ItemReward.BagOfTrinkets); - } - } - - public class BrotherlyLove : MLQuest - { - public BrotherlyLove() - { - Activated = true; - OneTimeOnly = true; - Title = 1072369; // Brotherly Love - Description = - 1072585; // *looks around nervously* Do you travel to The Heartwood? I have an urgent letter that must be delivered there in the next 30 minutes -- to Ahie the Cloth Weaver. Will you undertake this journey? - RefusalMessage = 1072587; // *looks disappointed* Let me know if you change your mind. - InProgressMessage = - 1072588; // You haven't lost the letter have you? It must be delivered to Ahie directly. Give it into no other hands. - CompletionMessage = 1074579; // Yes, can I help you? - CompletionNotice = CompletionNoticeShort; - - Objectives.Add(new DeliverObjective(typeof(APersonalLetterAddressedToAhie), 1, "letter", typeof(Ahie))); - - Rewards.Add(ItemReward.BagOfTrinkets); - } - } - - public class CommonBrigands : MLQuest - { - public CommonBrigands() - { - Activated = true; - Title = 1073082; // Common Brigands - Description = - 1073572; // Thank goodness, a hero like you has arrived! Brigands have descended upon this area like locusts, stealing and looting where ever they go. We need someone to put these vile curs where they belong -- in their graves. Are you up to the task? - RefusalMessage = 1073580; // I hope you'll reconsider. Until then, farwell. - InProgressMessage = 1073592; // The Brigands still plague us. Have you killed 20 of their number?
- - Objectives.Add(new KillObjective(20, new[] { typeof(Brigand) }, 1074894)); // Common brigands - - Rewards.Add(ItemReward.BagOfTreasure); - } - } - - [QuesterName("Beotham (Sanctuary)")] - public class Beotham : BaseCreature - { - [Constructible] - public Beotham() - : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the bowcrafter"; - Race = Race.Elf; - Body = 0x25D; - Female = false; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - SetSkill(SkillName.Meditation, 60.0, 80.0); - SetSkill(SkillName.Focus, 60.0, 80.0); - - AddItem(new Sandals(0x901)); - AddItem(new ShortPants(0x522)); - AddItem(new FancyShirt(0x515)); - - Item item; - - item = new LeafGloves(); - item.Hue = 0x901; - AddItem(item); - } - - public Beotham(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Beotham"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell( - this, - pm, - Utility.RandomList( - 1074187, // Want a job? - 1074184 // Come here, I have work for you. - ) - ); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - [QuesterName("Danoel (Sanctuary)")] - public class Danoel : BaseCreature - { - [Constructible] - public Danoel() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the metal weaver"; - Race = Race.Elf; - Body = 0x25D; - Female = false; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - SetSkill(SkillName.Meditation, 60.0, 80.0); - SetSkill(SkillName.Focus, 60.0, 80.0); - - AddItem(new ElvenBoots(0x901)); - AddItem(new ElvenPants(0x386)); - AddItem(new ElvenShirt(0x75F)); - AddItem(new FullApron(0x1BB)); - AddItem(new RoyalCirclet()); - AddItem(new SmithHammer()); - } - - public Danoel(Serial serial) - : base(serial) - { - } - // TODO: Add quests: Spring Cleaning - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Danoel"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1074197); // Pardon me, but if you could spare some time I'd greatly appreciate it. - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - [QuesterName("Tallinin (Sanctuary)")] - public class Tallinin : BaseCreature - { - [Constructible] - public Tallinin() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the cloth weaver"; - Race = Race.Elf; - Body = 0x25E; - Female = true; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - SetSkill(SkillName.Meditation, 60.0, 80.0); - SetSkill(SkillName.Focus, 60.0, 80.0); - - AddItem(new ElvenBoots(0x901)); - AddItem(new Tunic(0x37)); - AddItem(new Cloak(0x735)); - } - - public Tallinin(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Tallinin"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell( - this, - pm, - Utility.RandomList( - 1074188, // Weakling! You are not up to the task I have. - 1074211 // I could use some help. - ) - ); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - [QuesterName("Tiana (Sanctuary)")] - public class Tiana : BaseCreature - { - [Constructible] - public Tiana() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the guard"; - Race = Race.Elf; - Body = 0x25E; - Female = true; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - SetSkill(SkillName.Meditation, 60.0, 80.0); - SetSkill(SkillName.Focus, 60.0, 80.0); - - AddItem(new ElvenBoots()); - AddItem(new HidePants()); - AddItem(new HideFemaleChest()); - AddItem(new HidePauldrons()); - - Item item; - - item = new WoodlandBelt(); - item.Hue = 0x673; - AddItem(item); - - item = new RavenHelm(); - item.Hue = 0x443; - AddItem(item); - } - - public Tiana(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Tiana"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell( - this, - pm, - // Knave! Come here right now! - // Hey! I want to talk to you, now. - 1074214 + Utility.Random(2) - ); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - [QuesterName("Oolua (Sanctuary)")] - public class LorekeeperOolua : BaseCreature - { - [Constructible] - public LorekeeperOolua() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the keeper of tradition"; - Race = Race.Elf; - Body = 0x25E; - Female = true; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - SetSkill(SkillName.Meditation, 60.0, 80.0); - SetSkill(SkillName.Focus, 60.0, 80.0); - - AddItem(new ElvenBoots(0x75A)); - AddItem(new Skirt(Utility.RandomBrightHue())); - AddItem(new FancyShirt(0x742)); - AddItem(new Cloak(0x1BB)); - AddItem(new WildStaff()); - } - - public LorekeeperOolua(Serial serial) - : base(serial) - { - } - // TODO: Add quest Dreadhorn - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Lorekeeper Oolua"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1074187); // Want a job? - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - [QuesterName("Rollarn (Sanctuary)")] - public class LorekeeperRollarn : BaseCreature - { - [Constructible] - public LorekeeperRollarn() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the keeper of tradition"; - Race = Race.Elf; - Body = 0x25D; - Female = false; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - SetSkill(SkillName.Meditation, 60.0, 80.0); - SetSkill(SkillName.Focus, 60.0, 80.0); - - AddItem(new Sandals(0x1BB)); - AddItem(new Cloak(0x296)); - AddItem(new Circlet()); - AddItem(new LeafChest()); - - Item item; - - item = new LeafLegs(); - item.Hue = 0x71A; - AddItem(item); - } - - public LorekeeperRollarn(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Lorekeeper Rollarn"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell( - this, - pm, - Utility.RandomList( - 1074196, // Excuse me! I'm sorry to interrupt but I urgently need some assistance. - 1074197 // Pardon me, but if you could spare some time I'd greatly appreciate it. - ) - ); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - [QuesterName("Dallid (Sanctuary)")] - public class Dallid : BaseCreature - { - [Constructible] - public Dallid() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the cook"; - Race = Race.Elf; - Body = 0x25D; - Female = false; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - SetSkill(SkillName.Meditation, 60.0, 80.0); - SetSkill(SkillName.Focus, 60.0, 80.0); - - AddItem(new Boots(0x901)); - AddItem(new ShortPants(0x73C)); - AddItem(new Shirt(0x744)); - AddItem(new FullApron(0x1BE)); - AddItem(new Cleaver()); - } - - public Dallid(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Dallid"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell( - this, - pm, - Utility.RandomList( - 1074185, // Hey you! Want to help me out? - 1074195 // You there, in the stupid hat! Come here. - ) - ); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - [QuesterName("Canir (Sanctuary)")] - public class Canir : BaseCreature - { - [Constructible] - public Canir() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the thaumaturgist"; - Race = Race.Elf; - Body = 0x25E; - Female = true; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - SetSkill(SkillName.Meditation, 60.0, 80.0); - SetSkill(SkillName.Focus, 60.0, 80.0); - - AddItem(new Sandals(0x1BB)); - AddItem(new FemaleElvenRobe(0x5A7)); - AddItem(new GemmedCirclet()); - AddItem(new MagicWand()); - } - - public Canir(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Canir"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell( - this, - pm, - Utility.RandomList( - 1074193, // You there! Yes you. Stop looking about like a toadie and come here. - 1074186 // Come here, I have a task. - ) - ); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Yellienir : BaseCreature - { - [Constructible] - public Yellienir() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the bark weaver"; - Race = Race.Elf; - Body = 0x25E; - Female = true; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - AddItem(new ElvenBoots()); - AddItem(new LeafTonlet()); - AddItem(new FemaleLeafChest()); - AddItem(new LeafArms()); - AddItem(new Cloak(0x3B2)); - } - - public Yellienir(Serial serial) - : base(serial) - { - } - - public override string DefaultName => "Yellienir"; - public override bool IsInvulnerable => true; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - [QuesterName("Elder Onallan (Sanctuary)")] - public class ElderOnallan : BaseCreature - { - [Constructible] - public ElderOnallan() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the wise"; - Race = Race.Elf; - Body = 0x25D; - Female = false; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - SetSkill(SkillName.Meditation, 60.0, 80.0); - SetSkill(SkillName.Focus, 60.0, 80.0); - - AddItem(new Shoes(0x729)); - AddItem(new WildStaff()); - AddItem(new Cloak(0x64E)); - } - - public ElderOnallan(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Elder Onallan"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell( - this, - pm, - Utility.RandomList( - 1074217, // I want to make you an offer you'd be a fool to 'refuse. - 1074218 // Hey! I want to talk to you, now. - ) - ); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } + Activated = true; + HasRestartDelay = true; + Title = 1074018; // Broken Shaft + Description = + 1074112; // What do humans know of archery? Humans can barely shoot straight. Why, your efforts are absurd. In fact, I will make a wager - if these so called human arrows I've heard about are really as effective and innovative as human braggarts would have me believe, then I'll trade you something useful. I might even teach you something of elven craftsmanship. + RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. + InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! + CompletionMessage = + 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! + + Objectives.Add(new CollectObjective(10, typeof(Arrow), 1023902)); // arrow + + Rewards.Add(ItemReward.FletchingSatchel); + } +} + +public class BendingTheBow : MLQuest +{ + public BendingTheBow() + { + Activated = true; + HasRestartDelay = true; + Title = 1074019; // Bending the Bow + Description = + 1074113; // Human craftsmanship! Ha! Why, take an elven bow. It will last for a lifetime, never break and always shoot an arrow straight and true. Can't say the same for a human, can you? Bring me some of these human made bows, and I will show you. + RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. + InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! + CompletionMessage = + 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! + + Objectives.Add(new CollectObjective(10, typeof(Bow), 1025041)); // bow + + Rewards.Add(ItemReward.FletchingSatchel); + } +} + +public class ArmsRace : MLQuest +{ + public ArmsRace() + { + Activated = true; + HasRestartDelay = true; + Title = 1074020; // Arms Race + Description = + 1074114; // Leave it to a human to try and improve upon perfection. To take a bow and turn it into a mechanical contraption like a crossbow. I wish to see more of this sort of "invention". Fetch for me a crossbow, human. + RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. + InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! + CompletionMessage = + 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! + + Objectives.Add(new CollectObjective(10, typeof(Crossbow), 1023919)); // crossbow + + Rewards.Add(ItemReward.FletchingSatchel); + } +} + +public class ImprovedCrossbows : MLQuest +{ + public ImprovedCrossbows() + { + Activated = true; + HasRestartDelay = true; + Title = 1074021; // Improved Crossbows + Description = + 1074115; // How lazy is man! You cannot even be bothered to pull your own drawstring and hold an arrow ready? You must invent a device to do it for you? I cannot understand, but perhaps if I examine a heavy crossbow for myself, I will see their appeal. Go and bring me such a device and I will repay your meager favor. + RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. + InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! + CompletionMessage = + 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! + + Objectives.Add(new CollectObjective(10, typeof(HeavyCrossbow), 1025116)); // heavy crossbow + + Rewards.Add(ItemReward.FletchingSatchel); + } +} + +public class BuildingTheBetterCrossbow : MLQuest +{ + public BuildingTheBetterCrossbow() + { + Activated = true; + HasRestartDelay = true; + Title = 1074022; // Building the Better Crossbow + Description = + 1074116; // More is always better for a human, eh? Take these repeating crossbows. What sort of mind invents such a thing? I must look at it more closely. Bring such a contraption to me and you'll receive a token for your efforts. + RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. + InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! + CompletionMessage = + 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! + + Objectives.Add(new CollectObjective(10, typeof(RepeatingCrossbow), 1029923)); // repeating crossbow + + Rewards.Add(ItemReward.FletchingSatchel); + } +} + +public class InstrumentOfWar : MLQuest +{ + public InstrumentOfWar() + { + Activated = true; + HasRestartDelay = true; + Title = 1074055; // Instrument of War + Description = + 1074149; // Pathetic, this human craftsmanship! Take their broadswords - overgrown butter knives, in reality. No, I cannot do them justice - you must see for yourself. Bring me broadswords and I will demonstrate their feebleness. + RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. + InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! + CompletionMessage = + 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! + + Objectives.Add(new CollectObjective(12, typeof(Broadsword), 1023934)); // broadsword + + Rewards.Add(ItemReward.BlacksmithSatchel); + } +} + +public class TheShield : MLQuest +{ + public TheShield() + { + Activated = true; + HasRestartDelay = true; + Title = 1074054; // The Shield + Description = + 1074148; // I doubt very much a human shield would stop a good stout elven arrow. You doubt me? I will show you - get me some of these heater shields and I will piece them with sharp elven arrows! + RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. + InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! + CompletionMessage = + 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! + + Objectives.Add(new CollectObjective(10, typeof(HeaterShield), 1027030)); // heater shield + + Rewards.Add(ItemReward.BlacksmithSatchel); + } +} + +public class MusicToMyEars : MLQuest +{ + public MusicToMyEars() + { + Activated = true; + HasRestartDelay = true; + Title = 1074023; // Music to my Ears + Description = + 1074117; // You think you know something of music? Laughable! Take your lap harp. Crude, indelicate instruments that make a noise not unlike the wailing of a choleric child or a dying cat. I will show you - bring lap harps, and I will demonstrate. + RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. + InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! + CompletionMessage = + 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! + + Objectives.Add(new CollectObjective(10, typeof(LapHarp), 1023762)); // lap harp + + Rewards.Add(ItemReward.CarpentrySatchel); + } +} + +public class TheGlassEye : MLQuest +{ + public TheGlassEye() + { + Activated = true; + HasRestartDelay = true; + Title = 1074050; // The Glass Eye + Description = + 1074144; // Humans are so pathetically weak, they must be augmented by glass and metal! Imagine such a thing! I must see one of these spyglasses for myself, to understand the pathetic limits of human sight! + RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. + InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! + CompletionMessage = + 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! + + Objectives.Add(new CollectObjective(10, typeof(Spyglass), 1025365)); // spyglass + + Rewards.Add(ItemReward.TinkerSatchel); + } +} + +public class LazyHumans : MLQuest +{ + public LazyHumans() + { + Activated = true; + HasRestartDelay = true; + Title = 1074024; // Lazy Humans + Description = + 1074118; // Human fancy knows no bounds! It's pathetic that they are so weak that they must create a special stool upon which to rest their feet when they recline! Humans don't have any clue how to live. Bring me some of these foot stools to examine and I may teach you something worthwhile. + RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. + InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! + CompletionMessage = + 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! + + Objectives.Add(new CollectObjective(10, typeof(FootStool), 1022910)); // foot stool + + Rewards.Add(ItemReward.CarpentrySatchel); + } +} + +public class InventiveTools : MLQuest +{ + public InventiveTools() + { + Activated = true; + HasRestartDelay = true; + Title = 1074048; // Inventive Tools + Description = + 1074142; // Bring me some of these tinker's tools! I am certain, in the hands of an elf, they will fashion objects of ingenuity and delight that will shame all human invention! Hurry, do this quickly and I might deign to show you my skill. + RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. + InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! + CompletionMessage = + 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! + + Objectives.Add(new CollectObjective(10, typeof(TinkerTools), 1027868)); // tinker's tools + + Rewards.Add(ItemReward.TinkerSatchel); + } +} + +public class PixieDustToDust : MLQuest +{ + public PixieDustToDust() + { + Activated = true; + Title = 1073661; // Pixie dust to dust + Description = + 1073700; // Is there anything more foul than a pixie? They have cruel eyes and a mind for mischief, I say. I don't care if some think they're cute -- I say kill them and let the Avatar sort them out. In fact, if you were to kill a few pixies, I'd make sure you had a few coins to rub together, if you get my meaning. + RefusalMessage = 1073733; // Perhaps you'll change your mind and return at some point. + InProgressMessage = 1073741; // There's too much cuteness in the world -- kill those pixies! + + Objectives.Add(new KillObjective(10, new[] { typeof(Pixie) }, "pixies")); + + Rewards.Add(ItemReward.LargeBagOfTreasure); + } +} + +public class AnImpressivePlaid : MLQuest +{ + public AnImpressivePlaid() + { + Activated = true; + HasRestartDelay = true; + Title = 1074044; // An Impressive Plaid + Description = + 1074138; // I do not believe humans are so ridiculous as to wear something called a "kilt". Bring for me some of these kilts, if they truly exist, and I will offer you meager reward. + RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. + InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! + CompletionMessage = + 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! + + Objectives.Add(new CollectObjective(10, typeof(Kilt), 1025431)); // kilt + + Rewards.Add(ItemReward.TailorSatchel); + } +} + +public class ANiceShirt : MLQuest +{ + public ANiceShirt() + { + Activated = true; + HasRestartDelay = true; + Title = 1074045; // A Nice Shirt + Description = + 1074139; // Humans call that a fancy shirt? I would wager the ends are frayed, the collar worn, the buttons loosely stitched. Bring me fancy shirts and I will demonstrate the many ways in which they are inferior. + RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. + InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! + CompletionMessage = + 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! + + Objectives.Add(new CollectObjective(10, typeof(FancyShirt), 1027933)); // fancy shirt + + Rewards.Add(ItemReward.TailorSatchel); + } +} + +public class LeatherAndLace : MLQuest +{ + public LeatherAndLace() + { + Activated = true; + HasRestartDelay = true; + Title = 1074047; // Leather and Lace + Description = + 1074141; // No self respecting elf female would ever wear a studded bustier! I will prove it - bring me such clothing and I will show you how ridiculous they are! + RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. + InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! + CompletionMessage = + 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! + + Objectives.Add(new CollectObjective(10, typeof(StuddedBustierArms), 1027180)); // studded bustier + + Rewards.Add(ItemReward.TailorSatchel); + } +} + +public class FeyHeadgear : MLQuest +{ + public FeyHeadgear() + { + Activated = true; + HasRestartDelay = true; + Title = 1074043; // Fey Headgear + Description = + 1074137; // Humans do not deserve to wear a thing such as a flower garland. Help me prevent such things from falling into the clumsy hands of humans -- bring me flower garlands! + RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. + InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! + CompletionMessage = + 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! + + Objectives.Add(new CollectObjective(10, typeof(FlowerGarland), 1028965)); // flower garland + + Rewards.Add(ItemReward.TailorSatchel); + } +} + +public class NewCloak : MLQuest +{ + public NewCloak() + { + Activated = true; + Title = 1074684; // New Cloak + Description = + 1074685; // I have created a masterpiece! And all I need to finish it off is the soft fur of a wolf. But not just ANY wolf -- oh no, no, that wouldn't do. I've heard tales of a mighty beast, Grobu, who is bonded to the leader of the troglodytes. Only Grobu's fur will do. Will you retrieve it for me? + RefusalMessage = 1074655; // Perhaps I thought too highly of you. + InProgressMessage = + 1074686; // I've told you all I know of the creature. Until you return with Grobu's fur I can't finish my cloak. + CompletionMessage = 1074687; // Ah! So soft, so supple. What a wonderful texture. Here you are ... my thanks. + + Objectives.Add(new CollectObjective(1, typeof(GrobusFur), "Grobu's Fur")); + + Rewards.Add(ItemReward.TailorSatchel); + } +} + +public class ADishBestServedCold : MLQuest +{ + public ADishBestServedCold() + { + Activated = true; + Title = 1072372; // A Dish Best Served Cold + Description = + 1072657; // *mutter* I'll have my revenge. Oh! You there. Fancy some orc extermination? I despise them all. Bombers, brutes -- you name it, if it's orcish I want it killed. + RefusalMessage = 1072667; // Hrmph. Well maybe another time then. + InProgressMessage = 1072668; // Shouldn't you be slaying orcs? + + Objectives.Add( + new KillObjective( + 10, + new[] { typeof(Orc) }, + "orcs", + new QuestArea(1074807, "Sanctuary") + ) + ); + Objectives.Add( + new KillObjective( + 5, + new[] { typeof(OrcBomber) }, + "orc bombers", + new QuestArea(1074807, "Sanctuary") + ) + ); + Objectives.Add( + new KillObjective( + 3, + new[] { typeof(OrcBrute) }, + "orc brutes", + new QuestArea(1074807, "Sanctuary") + ) + ); + + Rewards.Add(ItemReward.BagOfTreasure); + } +} + +public class ArchEnemies : MLQuest +{ + public ArchEnemies() + { + Activated = true; + Title = 1073085; // Arch Enemies + Description = + 1073575; // Vermin! They get into everything! I told the boy to leave out some poisoned cheese -- and they shot him. What else can I do? Unless these ratmen are skilled with a bow, but I'd lay a wager you're better, eh? Could you skin a few of the wretches for me? + RefusalMessage = 1073580; // I hope you'll reconsider. Until then, farwell. + InProgressMessage = + 1073595; // I don't see 10 tails from Ratman Archers on your belt -- and until I do, no reward for you. + + Objectives.Add(new KillObjective(10, new[] { typeof(RatmanArcher) }, "ratman archers")); + + Rewards.Add(ItemReward.BagOfTreasure); + } +} + +public class Vermin : MLQuest +{ + public Vermin() + { + Activated = true; + Title = 1072995; // Vermin + Description = + 1073029; // You've got to help me out! Those ratmen have been causing absolute havok around here. Kill them off before they destroy my land. I'll pay you if you kill off twelve of those dirty rats. + RefusalMessage = 1072270; // Well, okay. But if you decide you are up for it after all, c'mon back and see me. + InProgressMessage = 1072271; // You're not quite done yet. Get back to work! + + Objectives.Add(new KillObjective(12, new[] { typeof(Ratman) }, "ratmen")); + + Rewards.Add(ItemReward.BagOfTrinkets); + } +} + +public class MougGuurMustDie : MLQuest +{ + public MougGuurMustDie() + { + Activated = true; + Title = 1072368; // Moug-Guur Must Die + Description = + 1072561; // You there! Yes, you. Kill Moug-Guur, the leader of the orcs in this depressing place, and I'll make it worth your while. + RefusalMessage = 1072571; // Fine. It's no skin off my teeth. + InProgressMessage = 1072572; // Small words. Kill Moug-Guur. Go. Now! + CompletionMessage = + 1072573; // You're better than I thought you'd be. Not particularly bad, but not entirely inept. + + Objectives.Add( + new KillObjective( + 1, + new[] { typeof(MougGuur) }, + "Moug-Guur", + new QuestArea(1074807, "Sanctuary") + ) + ); + + Rewards.Add(ItemReward.BagOfTreasure); + } + + public override Type NextQuest => typeof(LeaderOfThePack); +} + +public class LeaderOfThePack : MLQuest +{ + public LeaderOfThePack() + { + Activated = true; + Title = 1072560; // Leader of the Pack + Description = + 1072574; // Well now that Moug-Guur is no more -- and I can't say I'm weeping for his demise -- it's time for the ratmen to experience a similar loss of leadership. Slay Chiikkaha. In return, I'll satisfy your greed temporarily. + RefusalMessage = + 1072575; // Alright, if you'd rather not, then run along and do whatever worthless things you do when I'm not giving you direction. + InProgressMessage = + 1072576; // How difficult is this? The rats live in the tunnels. Go into the tunnels and find the biggest, meanest rat and execute him. Loitering around here won't get the task done. + CompletionMessage = 1072577; // It's about time! Could you have taken longer? + + Objectives.Add( + new KillObjective( + 1, + new[] { typeof(Chiikkaha) }, + "Chiikkaha", + new QuestArea(1074807, "Sanctuary") + ) + ); + + Rewards.Add(ItemReward.BagOfTreasure); + } + + public override Type NextQuest => typeof(SayonaraSzavetra); + public override bool IsChainTriggered => true; +} + +public class SayonaraSzavetra : MLQuest +{ + public SayonaraSzavetra() + { + Activated = true; + Title = 1072375; // Sayonara, Szavetra + Description = + 1072578; // Hmm, maybe you aren't entirely worthless. I suspect a demoness of Szavetra's calibre will tear you apart ... We might as well find out. Kill the succubus, yada yada, and you'll be richly rewarded. + RefusalMessage = 1072579; // Hah! I knew you couldn't handle it. + InProgressMessage = + 1072581; // Hahahaha! I can see the fear in your eyes. Pathetic. Szavetra is waiting for you. + CompletionMessage = + 1072582; // Amazing! Simply astonishing ... you survived. Well, I supposed I should indulge your avarice with a reward. + + Objectives.Add( + new KillObjective( + 1, + new[] { typeof(Szavetra) }, + "Szavetra", + new QuestArea(1074807, "Sanctuary") + ) + ); + + Rewards.Add(ItemReward.Strongbox); + } + + public override bool IsChainTriggered => true; +} + +public class TappingTheKeg : MLQuest +{ + public TappingTheKeg() + { + Activated = true; + HasRestartDelay = true; + Title = 1074037; // Tapping the Keg + Description = + 1074131; // I have acquired a barrel of human brewed beer. I am loathe to drink it, but how else to prove how inferior it is? I suppose I shall need a barrel tap to drink. Go, bring me a barrel tap quickly, so I might get this over with. + RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. + InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! + CompletionMessage = + 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! + + Objectives.Add(new CollectObjective(10, typeof(BarrelTap), 1024100)); // barrel tap + + Rewards.Add(ItemReward.TinkerSatchel); + } +} + +public class WaitingToBeFilled : MLQuest +{ + public WaitingToBeFilled() + { + Activated = true; + HasRestartDelay = true; + Title = 1074036; // Waiting to be Filled + Description = + 1074130; // The only good thing I can say about human made bottles is that they are empty and may yet still be filled with elven wine. Go now, fetch a number of empty bottles so that I might save them from the fate of carrying human-made wine. + RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. + InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! + CompletionMessage = + 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! + + Objectives.Add(new CollectObjective(20, typeof(Bottle), 1023854)); // empty bottle + + Rewards.Add(ItemReward.TinkerSatchel); + } +} + +public class BreezesSong : MLQuest +{ + public BreezesSong() + { + Activated = true; + HasRestartDelay = true; + Title = 1074052; // Breeze's Song + Description = + 1074146; // I understand humans cruely enslave the very wind to their selfish whims! Fancy wind chimes, what a monstrous idea! You must bring me proof of this terrible depredation - hurry, bring me wind chimes! + RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. + InProgressMessage = 1074064; // Hurry up! I don't have all day to wait for you to bring what I desire! + CompletionMessage = + 1074065; // These human made goods are laughable! It offends so -- I must show you what elven skill is capable of! + + Objectives.Add(new CollectObjective(10, typeof(FancyWindChimes), 1030291)); // fancy wind chimes + + Rewards.Add(ItemReward.TinkerSatchel); + } +} + +public class ProofOfTheDeed : MLQuest +{ + public ProofOfTheDeed() + { + Activated = true; + Title = 1072339; // Proof of the Deed + Description = + 1072340; // These human vermin must be erradicated! They despoil fair Sosaria with their every footfall upon her soil, every exhalation of breath upon her pristine air. Prove yourself an ally of Sosaria and bring me 20 human ears as proof of your devotion to our cause. + RefusalMessage = + 1072342; // Do you find the task distasteful? Are you too weak to shoulder the duty of cleansing Sosaria? So be it. + InProgressMessage = + 1072343; // Well, where is the proof of your deed? I will honor your actions when you have brought me the ears of the human scum. + CompletionMessage = + 1072344; // Ah, well done. You have chosen the path of duty and fulfilled your task with honor. + + Objectives.Add(new CollectObjective(20, typeof(SeveredHumanEars), 1032591)); // severed human ears + + Rewards.Add(ItemReward.BagOfTrinkets); + } +} + +public class Marauders : MLQuest +{ + public Marauders() + { + Activated = true; + Title = 1072374; // Marauders + Description = + 1072686; // What a miserable place we live in. Look around you at the changes we've wrought. The trees are sprouting leaves once more and the grass is reclaiming the blood-soaked soil. Who would have imagined we'd find ourselves here? Our "neighbors" are anything but friendly and those ogres are the worst of the lot. Maybe you'd be interested in helping our community by disposing of some of our least amiable neighbors? + RefusalMessage = 1072687; // I quite understand your reluctance. If you reconsider, I'll be here. + InProgressMessage = 1072688; // You can't miss those ogres, they're huge and just outside the gates here. + + Objectives.Add( + new KillObjective( + 10, + new[] { typeof(Ogre) }, + "ogres", + new QuestArea(1074807, "Sanctuary") + ) + ); + + Rewards.Add(ItemReward.BagOfTreasure); + } + + public override Type NextQuest => typeof(TheBrainsOfTheOperation); +} + +public class TheBrainsOfTheOperation : MLQuest +{ + public TheBrainsOfTheOperation() + { + Activated = true; + Title = 1072692; // The Brains of the Operation + Description = + 1072707; // *sigh* We have so much to do to clean this area up. Even the fine work you did on those ogres didn't have much of an impact on the community. It's the ogre lords that direct the actions of the other ogres, let's strike at the leaders and perhaps that will thwart the miserable curs. + RefusalMessage = 1072708; // Reluctance doesn't become a hero like you. But, as you wish. + InProgressMessage = + 1072709; // Ogre Lords are pretty easy to recognize. They're the ones ordering the other ogres about in a lordly manner. Striking down their leadership will throw the ogres into confusion and dismay! + + Objectives.Add( + new KillObjective( + 10, + new[] { typeof(OgreLord) }, + "ogre lords", + new QuestArea(1074807, "Sanctuary") + ) + ); + + Rewards.Add(ItemReward.LargeBagOfTreasure); + } + + public override Type NextQuest => typeof(TheBrawn); + public override bool IsChainTriggered => true; +} + +public class TheBrawn : MLQuest +{ + public TheBrawn() + { + Activated = true; + Title = 1072693; // The Brawn + Description = + 1072710; // Inconceiveable! We've learned that the ogre leadership has recruited some heavy-duty guards to their cause. I've never personally fought a cyclopian warrior, but I'm sure you could easily best a few and report back how much trouble they'll cause to our growing community? + RefusalMessage = 1072711; // Oh, I see. *sigh* Perhaps I overestimated your abilities. + InProgressMessage = 1072712; // Make sure you fully assess all of the cyclopian tactical abilities! + + Objectives.Add( + new KillObjective( + 6, + new[] { typeof(Cyclops) }, + "cyclops", + new QuestArea(1074807, "Sanctuary") + ) + ); + + Rewards.Add(ItemReward.LargeBagOfTreasure); + } + + public override Type NextQuest => typeof(TheBiggerTheyAre); + public override bool IsChainTriggered => true; +} + +public class TheBiggerTheyAre : MLQuest +{ + public TheBiggerTheyAre() + { + Activated = true; + Title = 1072694; // The Bigger They Are ... + Description = + 1072713; // The ogre insurgency has taken a turn for the worse! I've just been advised that the titans have concluded their discussions with the ogres and they've allied. We have virtually no information about titans. Engage them and appraise their mettle. + RefusalMessage = + 1072714; // Certainly. You've done enough to merit a breather. When you're ready for more, report back to me. + InProgressMessage = + 1072715; // Those titans don't skulk very well. You should be able to track them easily ... their footsteps are easily the largest around. + + Objectives.Add( + new KillObjective( + 3, + new[] { typeof(Titan) }, + "titans", + new QuestArea(1074807, "Sanctuary") + ) + ); + + Rewards.Add(ItemReward.LargeBagOfTreasure); + } + + public override bool IsChainTriggered => true; +} + +public class TroubleOnTheWing : MLQuest +{ + public TroubleOnTheWing() + { + Activated = true; + Title = 1072371; // Trouble on the Wing + Description = + 1072593; // Those gargoyles need to get knocked down a peg or two, if you ask me. They're always flying over here and lobbing things at us. What a nuisance. Drop a dozen of them for me, would you? + RefusalMessage = 1072594; // Don't tell me you're a gargoyle sympathizer? *spits* + InProgressMessage = + 1072595; // Those blasted gargoyles hang around the old tower. That's the best place to hunt them down. + + Objectives.Add( + new KillObjective( + 12, + new[] { typeof(Gargoyle) }, + "gargoyles", + new QuestArea(1074807, "Sanctuary") + ) + ); + + Rewards.Add(ItemReward.BagOfTrinkets); + } +} + +public class BrotherlyLove : MLQuest +{ + public BrotherlyLove() + { + Activated = true; + OneTimeOnly = true; + Title = 1072369; // Brotherly Love + Description = + 1072585; // *looks around nervously* Do you travel to The Heartwood? I have an urgent letter that must be delivered there in the next 30 minutes -- to Ahie the Cloth Weaver. Will you undertake this journey? + RefusalMessage = 1072587; // *looks disappointed* Let me know if you change your mind. + InProgressMessage = + 1072588; // You haven't lost the letter have you? It must be delivered to Ahie directly. Give it into no other hands. + CompletionMessage = 1074579; // Yes, can I help you? + CompletionNotice = CompletionNoticeShort; + + Objectives.Add(new DeliverObjective(typeof(APersonalLetterAddressedToAhie), 1, "letter", typeof(Ahie))); + + Rewards.Add(ItemReward.BagOfTrinkets); + } +} + +public class CommonBrigands : MLQuest +{ + public CommonBrigands() + { + Activated = true; + Title = 1073082; // Common Brigands + Description = + 1073572; // Thank goodness, a hero like you has arrived! Brigands have descended upon this area like locusts, stealing and looting where ever they go. We need someone to put these vile curs where they belong -- in their graves. Are you up to the task? + RefusalMessage = 1073580; // I hope you'll reconsider. Until then, farwell. + InProgressMessage = 1073592; // The Brigands still plague us. Have you killed 20 of their number?
+ + Objectives.Add(new KillObjective(20, new[] { typeof(Brigand) }, 1074894)); // Common brigands + + Rewards.Add(ItemReward.BagOfTreasure); + } +} + +[QuesterName("Beotham (Sanctuary)")] +[SerializationGenerator(0, false)] +public partial class Beotham : BaseCreature +{ + [Constructible] + public Beotham() + : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the bowcrafter"; + Race = Race.Elf; + Body = 0x25D; + Female = false; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + SetSkill(SkillName.Meditation, 60.0, 80.0); + SetSkill(SkillName.Focus, 60.0, 80.0); + + AddItem(new Sandals(0x901)); + AddItem(new ShortPants(0x522)); + AddItem(new FancyShirt(0x515)); + + Item item; + + item = new LeafGloves(); + item.Hue = 0x901; + AddItem(item); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Beotham"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell( + this, + pm, + Utility.RandomList( + 1074187, // Want a job? + 1074184 // Come here, I have work for you. + ) + ); + } +} + +[QuesterName("Danoel (Sanctuary)")] +[SerializationGenerator(0, false)] +public partial class Danoel : BaseCreature +{ + [Constructible] + public Danoel() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the metal weaver"; + Race = Race.Elf; + Body = 0x25D; + Female = false; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + SetSkill(SkillName.Meditation, 60.0, 80.0); + SetSkill(SkillName.Focus, 60.0, 80.0); + + AddItem(new ElvenBoots(0x901)); + AddItem(new ElvenPants(0x386)); + AddItem(new ElvenShirt(0x75F)); + AddItem(new FullApron(0x1BB)); + AddItem(new RoyalCirclet()); + AddItem(new SmithHammer()); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Danoel"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1074197); // Pardon me, but if you could spare some time I'd greatly appreciate it. + } +} + +[QuesterName("Tallinin (Sanctuary)")] +[SerializationGenerator(0, false)] +public partial class Tallinin : BaseCreature +{ + [Constructible] + public Tallinin() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the cloth weaver"; + Race = Race.Elf; + Body = 0x25E; + Female = true; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + SetSkill(SkillName.Meditation, 60.0, 80.0); + SetSkill(SkillName.Focus, 60.0, 80.0); + + AddItem(new ElvenBoots(0x901)); + AddItem(new Tunic(0x37)); + AddItem(new Cloak(0x735)); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Tallinin"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell( + this, + pm, + Utility.RandomList( + 1074188, // Weakling! You are not up to the task I have. + 1074211 // I could use some help. + ) + ); + } +} + +[QuesterName("Tiana (Sanctuary)")] +[SerializationGenerator(0, false)] +public partial class Tiana : BaseCreature +{ + [Constructible] + public Tiana() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the guard"; + Race = Race.Elf; + Body = 0x25E; + Female = true; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + SetSkill(SkillName.Meditation, 60.0, 80.0); + SetSkill(SkillName.Focus, 60.0, 80.0); + + AddItem(new ElvenBoots()); + AddItem(new HidePants()); + AddItem(new HideFemaleChest()); + AddItem(new HidePauldrons()); + + Item item; + + item = new WoodlandBelt(); + item.Hue = 0x673; + AddItem(item); + + item = new RavenHelm(); + item.Hue = 0x443; + AddItem(item); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Tiana"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell( + this, + pm, + // Knave! Come here right now! + // Hey! I want to talk to you, now. + 1074214 + Utility.Random(2) + ); + } +} + +[QuesterName("Oolua (Sanctuary)")] +[SerializationGenerator(0, false)] +public partial class LorekeeperOolua : BaseCreature +{ + [Constructible] + public LorekeeperOolua() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the keeper of tradition"; + Race = Race.Elf; + Body = 0x25E; + Female = true; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + SetSkill(SkillName.Meditation, 60.0, 80.0); + SetSkill(SkillName.Focus, 60.0, 80.0); + + AddItem(new ElvenBoots(0x75A)); + AddItem(new Skirt(Utility.RandomBrightHue())); + AddItem(new FancyShirt(0x742)); + AddItem(new Cloak(0x1BB)); + AddItem(new WildStaff()); + } + + // TODO: Add quest Dreadhorn + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Lorekeeper Oolua"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1074187); // Want a job? + } +} + +[QuesterName("Rollarn (Sanctuary)")] +[SerializationGenerator(0, false)] +public partial class LorekeeperRollarn : BaseCreature +{ + [Constructible] + public LorekeeperRollarn() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the keeper of tradition"; + Race = Race.Elf; + Body = 0x25D; + Female = false; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + SetSkill(SkillName.Meditation, 60.0, 80.0); + SetSkill(SkillName.Focus, 60.0, 80.0); + + AddItem(new Sandals(0x1BB)); + AddItem(new Cloak(0x296)); + AddItem(new Circlet()); + AddItem(new LeafChest()); + + Item item; + + item = new LeafLegs(); + item.Hue = 0x71A; + AddItem(item); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Lorekeeper Rollarn"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell( + this, + pm, + Utility.RandomList( + 1074196, // Excuse me! I'm sorry to interrupt but I urgently need some assistance. + 1074197 // Pardon me, but if you could spare some time I'd greatly appreciate it. + ) + ); + } +} + +[QuesterName("Dallid (Sanctuary)")] +[SerializationGenerator(0, false)] +public partial class Dallid : BaseCreature +{ + [Constructible] + public Dallid() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the cook"; + Race = Race.Elf; + Body = 0x25D; + Female = false; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + SetSkill(SkillName.Meditation, 60.0, 80.0); + SetSkill(SkillName.Focus, 60.0, 80.0); + + AddItem(new Boots(0x901)); + AddItem(new ShortPants(0x73C)); + AddItem(new Shirt(0x744)); + AddItem(new FullApron(0x1BE)); + AddItem(new Cleaver()); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Dallid"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell( + this, + pm, + Utility.RandomList( + 1074185, // Hey you! Want to help me out? + 1074195 // You there, in the stupid hat! Come here. + ) + ); + } +} + +[QuesterName("Canir (Sanctuary)")] +[SerializationGenerator(0, false)] +public partial class Canir : BaseCreature +{ + [Constructible] + public Canir() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the thaumaturgist"; + Race = Race.Elf; + Body = 0x25E; + Female = true; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + SetSkill(SkillName.Meditation, 60.0, 80.0); + SetSkill(SkillName.Focus, 60.0, 80.0); + + AddItem(new Sandals(0x1BB)); + AddItem(new FemaleElvenRobe(0x5A7)); + AddItem(new GemmedCirclet()); + AddItem(new MagicWand()); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Canir"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell( + this, + pm, + Utility.RandomList( + 1074193, // You there! Yes you. Stop looking about like a toadie and come here. + 1074186 // Come here, I have a task. + ) + ); + } +} + +[SerializationGenerator(0, false)] +public partial class Yellienir : BaseCreature +{ + [Constructible] + public Yellienir() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the bark weaver"; + Race = Race.Elf; + Body = 0x25E; + Female = true; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + AddItem(new ElvenBoots()); + AddItem(new LeafTonlet()); + AddItem(new FemaleLeafChest()); + AddItem(new LeafArms()); + AddItem(new Cloak(0x3B2)); + } + + public override string DefaultName => "Yellienir"; + public override bool IsInvulnerable => true; +} + +[QuesterName("Elder Onallan (Sanctuary)")] +[SerializationGenerator(0, false)] +public partial class ElderOnallan : BaseCreature +{ + [Constructible] + public ElderOnallan() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the wise"; + Race = Race.Elf; + Body = 0x25D; + Female = false; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + SetSkill(SkillName.Meditation, 60.0, 80.0); + SetSkill(SkillName.Focus, 60.0, 80.0); + + AddItem(new Shoes(0x729)); + AddItem(new WildStaff()); + AddItem(new Cloak(0x64E)); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Elder Onallan"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell( + this, + pm, + Utility.RandomList( + 1074217, // I want to make you an offer you'd be a fool to 'refuse. + 1074218 // Hey! I want to talk to you, now. + ) + ); } } diff --git a/Projects/UOContent/Engines/ML Quests/Definitions/Spellweaving.cs b/Projects/UOContent/Engines/ML Quests/Definitions/Spellweaving.cs index c99ad9935..fabd58935 100644 --- a/Projects/UOContent/Engines/ML Quests/Definitions/Spellweaving.cs +++ b/Projects/UOContent/Engines/ML Quests/Definitions/Spellweaving.cs @@ -1,738 +1,666 @@ using System; +using ModernUO.Serialization; using Server.Engines.MLQuests.Objectives; using Server.Engines.MLQuests.Rewards; using Server.Items; using Server.Mobiles; -namespace Server.Engines.MLQuests.Definitions +namespace Server.Engines.MLQuests.Definitions; + +public static class Spellweaving { - public static class Spellweaving + public static void AwardTo(PlayerMobile pm) { - public static void AwardTo(PlayerMobile pm) + if (pm == null) { - if (pm == null) - { - return; - } - - var context = MLQuestSystem.GetOrCreateContext(pm); - - if (!context.Spellweaving) - { - context.Spellweaving = true; - - Effects.SendLocationParticles( - EffectItem.Create(pm.Location, pm.Map, EffectItem.DefaultDuration), - 0, - 0, - 0, - 0, - 0, - 5060, - 0 - ); - Effects.PlaySound(pm.Location, pm.Map, 0x243); - - Effects.SendMovingParticles( - new Entity(Serial.Zero, new Point3D(pm.X - 6, pm.Y - 6, pm.Z + 15), pm.Map), - pm, - 0x36D4, - 7, - 0, - false, - true, - 0x497, - 0, - 9502, - 1, - 0, - (EffectLayer)255, - 0x100 - ); - Effects.SendMovingParticles( - new Entity(Serial.Zero, new Point3D(pm.X - 4, pm.Y - 6, pm.Z + 15), pm.Map), - pm, - 0x36D4, - 7, - 0, - false, - true, - 0x497, - 0, - 9502, - 1, - 0, - (EffectLayer)255, - 0x100 - ); - Effects.SendMovingParticles( - new Entity(Serial.Zero, new Point3D(pm.X - 6, pm.Y - 4, pm.Z + 15), pm.Map), - pm, - 0x36D4, - 7, - 0, - false, - true, - 0x497, - 0, - 9502, - 1, - 0, - (EffectLayer)255, - 0x100 - ); - - Effects.SendTargetParticles(pm, 0x375A, 35, 90, 0x00, 0x00, 9502, (EffectLayer)255, 0x100); - } + return; } - } - public class Patience : MLQuest - { - public Patience() + var context = MLQuestSystem.GetOrCreateContext(pm); + + if (!context.Spellweaving) { - Activated = true; - Title = 1072753; // Patience - Description = - 1072762; // Learning to weave spells and control the forces of nature requires sacrifice, discipline, focus, and an unwavering dedication to Sosaria herself. We do not teach the unworthy. They do not comprehend the lessons nor the dedication required. If you would walk the path of the Arcanist, then you must do as I require without hesitation or question. Your first task is to gather miniature mushrooms ... 20 of them from the branches of our mighty home. I give you one hour to complete the task. - RefusalMessage = 1072767; // *nods* Not everyone has the temperment to undertake the way of the Arcanist. - InProgressMessage = - 1072774; // The mushrooms I seek can be found growing here in The Heartwood. Seek them out and gather them. You are running out of time. - CompletionMessage = 1074166; // Have you gathered the mushrooms? + context.Spellweaving = true; - Objectives.Add( - new TimedCollectObjective( - TimeSpan.FromHours(1), - 20, - typeof(MiniatureMushroom), - "miniature mushrooms" - ) + Effects.SendLocationParticles( + EffectItem.Create(pm.Location, pm.Map, EffectItem.DefaultDuration), + 0, + 0, + 0, + 0, + 0, + 5060, + 0 ); + Effects.PlaySound(pm.Location, pm.Map, 0x243); - Rewards.Add(new DummyReward(1074872)); // The opportunity to learn the ways of the Arcanist. - } - - public override Type NextQuest => typeof(NeedsOfTheManyHeartwood1); - } - - public class NeedsOfTheManyHeartwood1 : MLQuest - { - public NeedsOfTheManyHeartwood1() - { - Activated = true; - Title = 1072797; // Needs of the Many - The Heartwood - Description = - 1072763; // The way of the Arcanist involves cooperation with others and a strong commitment to the community of your people. We have run low on the cotton we use to pack wounds and our people have need. Bring 10 bales of cotton to me. - RefusalMessage = 1072768; // You endanger your progress along the path with your unwillingness. - InProgressMessage = 1072775; // I care not where you acquire the cotton, merely that you provide it. - CompletionMessage = 1074110; // Well, where are the cotton bales? - - Objectives.Add(new CollectObjective(10, typeof(Cotton), 1023577)); // bale of cotton - - Rewards.Add(new DummyReward(1074872)); // The opportunity to learn the ways of the Arcanist. - } - - public override Type NextQuest => typeof(NeedsOfTheManyHeartwood2); - public override bool IsChainTriggered => true; - } - - public class NeedsOfTheManyHeartwood2 : MLQuest - { - public NeedsOfTheManyHeartwood2() - { - Activated = true; - Title = 1072797; // Needs of the Many - The Heartwood - Description = 1072764; // We must look to the defense of our people! Bring boards for new arrows. - RefusalMessage = - 1072769; // The people have need of these items. You are proving yourself inadequate to the demands of a member of this community. - InProgressMessage = 1072776; // The requirements are simple -- 250 boards. - CompletionMessage = 1074152; // Well, where are the boards? - - Objectives.Add(new CollectObjective(250, typeof(Board), 1027127)); // board - - Rewards.Add(new DummyReward(1074872)); // The opportunity to learn the ways of the Arcanist. - } - - public override Type NextQuest => typeof(MakingAContributionHeartwood); - public override bool IsChainTriggered => true; - } - - public class MakingAContributionHeartwood : MLQuest - { - public MakingAContributionHeartwood() - { - Activated = true; - Title = 1072798; // Making a Contribution - The Heartwood - Description = - 1072765; // With health and defense assured, we need look to the need of the community for food and drink. We will feast on fish steaks, sweets, and wine. You will supply the ingredients, the cooks will prepare the meal. As a Arcanist relies upon others to build focus and lend their power to her workings, the community needs the effort of all to survive. - RefusalMessage = 1072770; // Do not falter now. You have begun to show promise. - InProgressMessage = 1072777; // Where are the items you've been tasked to supply for the feast? - CompletionMessage = 1074158; // Ah good, you're back. We're eager for the feast. - - Objectives.Add(new CollectObjective(1, typeof(SackFlour), 1024153)); // sack of flour - Objectives.Add(new CollectObjective(10, typeof(JarHoney), 1022540)); // jar of honey - Objectives.Add(new CollectObjective(20, typeof(FishSteak), 1022427)); // fish steak - - Rewards.Add(new DummyReward(1074872)); // The opportunity to learn the ways of the Arcanist. - } - - public override Type NextQuest => typeof(UnnaturalCreations); - public override bool IsChainTriggered => true; - } - - public class UnnaturalCreations : MLQuest - { - public UnnaturalCreations() - { - Activated = true; - Title = 1072758; // Unnatural Creations - Description = - 1072780; // You have proven your desire to contribute to the community and serve the people. Now you must demonstrate your willingness to defend Sosaria from the greatest blight that plagues her. Unnatural creatures, brought to a sort of perverted life, despoil our fair world. Destroy them -- 5 Exodus Overseers and 2 Exodus Minions. - RefusalMessage = - 1072771; // You must serve Sosaria with all your heart and strength. Your unwillingness does not reflect favorably upon you. - InProgressMessage = 1072779; // Every moment you procrastinate, these unnatural creatures damage Sosaria. - CompletionMessage = 1074167; // Well done! Well done, indeed. You are worthy to become an arcanist! - - Objectives.Add(new KillObjective(5, new[] { typeof(ExodusOverseer) }, "Exodus Overseers")); - Objectives.Add(new KillObjective(2, new[] { typeof(ExodusMinion) }, "Exodus Minions")); - - Rewards.Add(new ItemReward(1031601, typeof(ArcaneCircleScroll))); // Arcane Circle - Rewards.Add(new ItemReward(1031600, typeof(SpellweavingBook))); // Spellweaving Spellbook - Rewards.Add(new ItemReward(1031602, typeof(GiftOfRenewalScroll))); // Gift of Renewal - } - - public override bool IsChainTriggered => true; - - public override void GetRewards(MLQuestInstance instance) - { - Spellweaving.AwardTo(instance.Player); - base.GetRewards(instance); - } - } - - public class Discipline : MLQuest - { - public Discipline() - { - Activated = true; - Title = 1072752; // Discipline - Description = - 1072761; // Learning to weave spells and control the forces of nature requires sacrifice, discipline, focus, and an unwavering dedication to Sosaria herself. We do not teach the unworthy. They do not comprehend the lessons nor the dedication required. If you would walk the path of the Arcanist, then you must do as I require without hesitation or question. Your first task is to rid our home of rats ... 50 of them in the next hour. - RefusalMessage = 1072767; // *nods* Not everyone has the temperament to undertake the way of the Arcanist. - InProgressMessage = 1072773; // You waste my time. The task is simple. Kill 50 rats in an hour. - // No completion message - - Objectives.Add( - new TimedKillObjective( - TimeSpan.FromHours(1), - 50, - new[] { typeof(Rat) }, - "rats", - new QuestArea(1074807, "Sanctuary") - ) - ); - - Rewards.Add(new DummyReward(1074872)); // The opportunity to learn the ways of the Arcanist. - } - - public override Type NextQuest => typeof(NeedsOfTheManySanctuary); - } - - public class NeedsOfTheManySanctuary : MLQuest - { - public NeedsOfTheManySanctuary() - { - Activated = true; - Title = 1072754; // Needs of the Many - Sanctuary - Description = - 1072763; // The way of the Arcanist involves cooperation with others and a strong commitment to the community of your people. We have run low on the cotton we use to pack wounds and our people have need. Bring 10 bales of cotton to me. - RefusalMessage = 1072768; // You endanger your progress along the path with your unwillingness. - InProgressMessage = 1072775; // I care not where you acquire the cotton, merely that you provide it. - CompletionMessage = 1074110; // Well, where are the cotton bales? - - Objectives.Add(new CollectObjective(10, typeof(Cotton), 1023577)); // bale of cotton - - Rewards.Add(new DummyReward(1074872)); // The opportunity to learn the ways of the Arcanist. - } - - public override Type NextQuest => typeof(MakingAContributionSanctuary); - public override bool IsChainTriggered => true; - } - - public class MakingAContributionSanctuary : MLQuest - { - public MakingAContributionSanctuary() - { - Activated = true; - Title = 1072755; // Making a Contribution - Sanctuary - Description = 1072764; // We must look to the defense of our people! Bring boards for new arrows. - RefusalMessage = - 1072769; // The people have need of these items. You are proving yourself inadequate to the demands of a member of this community. - InProgressMessage = 1072776; // The requirements are simple -- 250 boards. - CompletionMessage = 1074152; // Well, where are the boards? - - Objectives.Add(new CollectObjective(250, typeof(Board), 1027127)); // board - - Rewards.Add(new DummyReward(1074872)); // The opportunity to learn the ways of the Arcanist. - } - - public override Type NextQuest => typeof(SuppliesForSanctuary); - public override bool IsChainTriggered => true; - } - - public class SuppliesForSanctuary : MLQuest - { - public SuppliesForSanctuary() - { - Activated = true; - Title = 1072756; // Supplies for Sanctuary - Description = - 1072765; // With health and defense assured, we need look to the need of the community for food and drink. We will feast on fish steaks, sweets, and wine. You will supply the ingredients, the cooks will prepare the meal. As a Arcanist relies upon others to build focus and lend their power to her workings, the community needs the effort of all to survive. - RefusalMessage = 1072770; // Do not falter now. You have begun to show promise. - InProgressMessage = 1072777; // Where are the items you've been tasked to supply for the feast? - CompletionMessage = 1074158; // Ah good, you're back. We're eager for the feast. - - Objectives.Add(new CollectObjective(1, typeof(SackFlour), 1024153)); // sack of flour - Objectives.Add(new CollectObjective(10, typeof(JarHoney), 1022540)); // jar of honey - Objectives.Add(new CollectObjective(20, typeof(FishSteak), 1022427)); // fish steak - - Rewards.Add(new DummyReward(1074872)); // The opportunity to learn the ways of the Arcanist. - } - - public override Type NextQuest => typeof(TheHumanBlight); - public override bool IsChainTriggered => true; - } - - public class TheHumanBlight : MLQuest - { - public TheHumanBlight() - { - Activated = true; - Title = 1072757; // The Human Blight - Description = - 1072766; // You have proven your desire to contribute to the community and serve the people. Now you must demonstrate your willingness to defend Sosaria from the greatest blight that plagues her. The human vermin that have spread as a disease, despoiling the land are the greatest blight we face. Kill humans and return to me the proof of your actions. Bring me 30 human ears. - RefusalMessage = - 1072771; // You must serve Sosaria with all your heart and strength. Your unwillingness does not reflect favorably upon you. - InProgressMessage = 1072778; // Why do you delay? The human blight must be averted. - CompletionMessage = 1074160; // I will take the ears you have collected now. Hand them here. - - Objectives.Add(new CollectObjective(30, typeof(SeveredHumanEars), 1032591)); // severed human ears - - Rewards.Add(new ItemReward(1031601, typeof(ArcaneCircleScroll))); // Arcane Circle - Rewards.Add(new ItemReward(1031600, typeof(SpellweavingBook))); // Spellweaving Spellbook - Rewards.Add(new ItemReward(1031602, typeof(GiftOfRenewalScroll))); // Gift of Renewal - } - - public override bool IsChainTriggered => true; - - public override void GetRewards(MLQuestInstance instance) - { - Spellweaving.AwardTo(instance.Player); - base.GetRewards(instance); - } - } - - public class FriendOfTheFey : MLQuest - { - public FriendOfTheFey() - { - Activated = true; - Title = 1074284; // Friend of the Fey - Description = - 1074286; // The children of Sosaria understand the dedication and committment of an arcanist -- and will, from time to time offer their friendship. If you would forge such a bond, first seek out a goodwill offering to present. Pixies enjoy sweets and pretty things. - RefusalMessage = 1074288; // There's always time to make new friends. - InProgressMessage = 1074290; // I think honey and some sparkly beads would please a pixie. - CompletionMessage = 1074292; // What have we here? Oh yes, gifts for a pixie. - - Objectives.Add(new CollectObjective(1, typeof(Beads), 1024235)); // beads - Objectives.Add(new CollectObjective(1, typeof(JarHoney), 1022540)); // jar of honey - - // The opportunity to prove yourself worthy of learning to Summon Fey. (Sufficient spellweaving skill is required to cast the spell) - Rewards.Add(new DummyReward(1074874)); - } - - public override Type NextQuest => typeof(TokenOfFriendship); - } - - public class TokenOfFriendship : MLQuest - { - public TokenOfFriendship() - { - Activated = true; - Title = 1074293; // Token of Friendship - Description = - 1074297; // I've wrapped your gift suitably to present to a pixie of discriminating taste. Seek out Arielle and give her your offering. - RefusalMessage = 1074310; // I'll hold onto this gift in case you change your mind. - InProgressMessage = - 1074315; // Arielle wanders quite a bit, so I'm not sure exactly where to find her. I'm sure she's going to love your gift. - CompletionMessage = 1074319; // *giggle* Oooh! For me? - - Objectives.Add(new DeliverObjective(typeof(GiftForArielle), 1, "gift for Arielle", typeof(Arielle))); - - // The opportunity to prove yourself worthy of learning to Summon Fey. (Sufficient spellweaving skill is required to cast the spell) - Rewards.Add(new DummyReward(1074874)); - } - - public override Type NextQuest => typeof(Alliance); - public override bool IsChainTriggered => true; - } - - public class Alliance : MLQuest - { - public Alliance() - { - Activated = true; - Title = 1074294; // Alliance - Description = 1074298; // *giggle* Mean reapers make pixies unhappy. *light-hearted giggle* You could fix them! - RefusalMessage = 1074311; // *giggle* Okies! - InProgressMessage = 1074316; // Mean reapers are all around trees! *giggle* You fix them up, please. - CompletionNotice = CompletionNoticeShortReturn; - - Objectives.Add(new KillObjective(20, new[] { typeof(Reaper) }, "reapers")); - - Rewards.Add(new ItemReward(1031607, typeof(SummonFeyScroll))); // Summon Fey - } - - public override bool IsChainTriggered => true; - - public override void GetRewards(MLQuestInstance instance) - { - instance.PlayerContext.SummonFey = true; - // *giggle* Mean reapers got fixed! Pixie friend now! *giggle* When mean thingies bother you, a brave pixie will help. - instance.Player.SendLocalizedMessage(1074320, "", 0x2A); - - base.GetRewards(instance); - } - } - - public class FiendishFriends : MLQuest - { - public FiendishFriends() - { - Activated = true; - Title = 1074283; // Fiendish Friends - Description = - 1074285; // It is true that a skilled arcanist can summon and dominate an imp to serve at their pleasure. To do such at thing though, you must master the miserable little fiends utterly by demonstrating your superiority. Rough them up some -- kill a few. That will do the trick. - RefusalMessage = 1074287; // You're probably right. They're not worth the effort. - InProgressMessage = 1074289; // Surely you're not having difficulties swatting down those annoying pests? - // TODO: Verify - CompletionMessage = 1074291; // Hah! You showed them! - - Objectives.Add(new KillObjective(50, new[] { typeof(Imp) }, "imps")); - - // The opportunity to prove yourself worthy of learning to Summon Fiends. - // (Sufficient spellweaving skill is required to cast the spell) - Rewards.Add(new DummyReward(107487)); - } - - public override Type NextQuest => typeof(CrackingTheWhipI); - } - - // TODO: Verify - public class CrackingTheWhipI : MLQuest - { - public CrackingTheWhipI() - { - Activated = true; - Title = 1074295; // Cracking the Whip - Description = - 1074300; // Now that you've shown those mini pests your might, you should collect suitable implements to use to train your summoned pet. I suggest a stout whip. - RefusalMessage = 1074313; // Heh. Changed your mind, eh? - InProgressMessage = - 1074317; // Well, hurry up. If you don't get a whip how do you expect to control the little devil? - CompletionMessage = 1074321; // That's a well-made whip. No imp will ignore the sting of that lash. - - Objectives.Add(new CollectObjective(1, typeof(StoutWhip), "Stout Whip")); - - // The opportunity to prove yourself worthy of learning to Summon Fiends. (Sufficient spellweaving skill is required to cast the spell) - Rewards.Add(new DummyReward(1074873)); - } - - public override Type NextQuest => typeof(CrackingTheWhipII); - public override bool IsChainTriggered => true; - } - - // TODO: Verify - public class CrackingTheWhipII : MLQuest - { - public CrackingTheWhipII() - { - Activated = true; - Title = 1074295; // Cracking the Whip - Description = - 1074302; // Now you just need to make the little buggers fear you -- if you can slay an arcane daemon, you'll earn their subservience. - RefusalMessage = 1074314; // If you're not up for it, so be it. - InProgressMessage = 1074318; // You need to vanquish an arcane daemon before the imps will fear you properly. - - Objectives.Add(new KillObjective(1, new[] { typeof(ArcaneDaemon) }, 1029733)); // arcane demon - - Rewards.Add(new ItemReward(1031608, typeof(SummonFiendScroll))); // Summon Fiend - } - - public override bool IsChainTriggered => true; - - public override void GetRewards(MLQuestInstance instance) - { - instance.PlayerContext.SummonFiend = true; - // You've demonstrated your strength, got a means of control, and taught the imps to fear you. - // You're ready now to summon them. - instance.Player.SendLocalizedMessage(1074322, "", 0x2A); - - base.GetRewards(instance); - } - } - - [QuesterName("Aeluva (The Heartwood)")] - public class Aeluva : BaseCreature - { - [Constructible] - public Aeluva() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the arcanist"; - Race = Race.Elf; - Female = true; - Body = 606; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - SetSkill(SkillName.Meditation, 60.0, 80.0); - SetSkill(SkillName.Focus, 60.0, 80.0); - - AddItem(new ElvenShirt()); - AddItem(new Kilt(Utility.RandomNondyedHue())); // Note: OSI hue = 0x1516, typo? - AddItem(new ElvenBoots()); - AddItem(new Circlet()); - } - - public Aeluva(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Aeluva"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - /* - * 1074206 - Excuse me please traveler, might I have a little of your time? - * 1074207 - Good day to you friend! Allow me to offer you a fabulous opportunity! Thrills and adventure await! - */ - MLQuestSystem.Tell(this, pm, Utility.Random(1074206, 2)); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - [QuesterName("Koole (Sanctuary)")] - public class Koole : BaseCreature - { - [Constructible] - public Koole() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the arcanist"; - Race = Race.Elf; - Body = 605; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - SetSkill(SkillName.Meditation, 60.0, 80.0); - SetSkill(SkillName.Focus, 60.0, 80.0); - - Item item; - - item = new LeafChest(); - item.Hue = 443; - AddItem(item); - - item = new LeafArms(); - item.Hue = 443; - AddItem(item); - - AddItem(new LeafTonlet()); - AddItem(new ThighBoots(Utility.RandomAnimalHue())); - AddItem(new RoyalCirclet()); - } - - public Koole(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Koole"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell( - this, + Effects.SendMovingParticles( + new Entity(Serial.Zero, new Point3D(pm.X - 6, pm.Y - 6, pm.Z + 15), pm.Map), pm, - Utility.RandomList( - 1074186, // Come here, I have a task. - 1074218 // Hey! I want to talk to you, now. - ) + 0x36D4, + 7, + 0, + false, + true, + 0x497, + 0, + 9502, + 1, + 0, + (EffectLayer)255, + 0x100 ); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - [QuesterName("Synaeva (The Heartwood)")] - public class Synaeva : BaseCreature - { - [Constructible] - public Synaeva() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the arcanist"; - Race = Race.Elf; - Female = true; - Body = 606; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - SetSkill(SkillName.Meditation, 60.0, 80.0); - SetSkill(SkillName.Focus, 60.0, 80.0); - - Item item = new RavenHelm(); - item.Hue = Utility.RandomGreenHue(); - AddItem(item); - - AddItem(new FemaleLeafChest()); - AddItem(new LeafArms()); - AddItem(new LeafTonlet()); - AddItem(new ElvenBoots()); - AddItem(new WildStaff()); - } - - public Synaeva(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Synaeva"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1074223); // Have you done it yet?  Oh, I haven’t told you, have I? - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - [QuesterName("Elder Brae (Sanctuary)")] - public class ElderBrae : BaseCreature - { - [Constructible] - public ElderBrae() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the wise"; - Race = Race.Elf; - Female = true; - Body = 606; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - SetSkill(SkillName.Meditation, 60.0, 80.0); - SetSkill(SkillName.Focus, 60.0, 80.0); - - AddItem(new GemmedCirclet()); - AddItem(new FemaleElvenRobe(Utility.RandomBrightHue())); - AddItem(new ElvenBoots(Utility.RandomAnimalHue())); - } - - public ElderBrae(Serial serial) - : base(serial) - { - } - - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Elder Brae"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell( - this, + Effects.SendMovingParticles( + new Entity(Serial.Zero, new Point3D(pm.X - 4, pm.Y - 6, pm.Z + 15), pm.Map), pm, - Utility.RandomList( - 1074215, // Don’t test my patience you sniveling worm! - 1074218 // Hey! I want to talk to you, now. - ) + 0x36D4, + 7, + 0, + false, + true, + 0x497, + 0, + 9502, + 1, + 0, + (EffectLayer)255, + 0x100 + ); + Effects.SendMovingParticles( + new Entity(Serial.Zero, new Point3D(pm.X - 6, pm.Y - 4, pm.Z + 15), pm.Map), + pm, + 0x36D4, + 7, + 0, + false, + true, + 0x497, + 0, + 9502, + 1, + 0, + (EffectLayer)255, + 0x100 ); - } - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); + Effects.SendTargetParticles(pm, 0x375A, 35, 90, 0x00, 0x00, 9502, (EffectLayer)255, 0x100); } } } + +public class Patience : MLQuest +{ + public Patience() + { + Activated = true; + Title = 1072753; // Patience + Description = + 1072762; // Learning to weave spells and control the forces of nature requires sacrifice, discipline, focus, and an unwavering dedication to Sosaria herself. We do not teach the unworthy. They do not comprehend the lessons nor the dedication required. If you would walk the path of the Arcanist, then you must do as I require without hesitation or question. Your first task is to gather miniature mushrooms ... 20 of them from the branches of our mighty home. I give you one hour to complete the task. + RefusalMessage = 1072767; // *nods* Not everyone has the temperment to undertake the way of the Arcanist. + InProgressMessage = + 1072774; // The mushrooms I seek can be found growing here in The Heartwood. Seek them out and gather them. You are running out of time. + CompletionMessage = 1074166; // Have you gathered the mushrooms? + + Objectives.Add( + new TimedCollectObjective( + TimeSpan.FromHours(1), + 20, + typeof(MiniatureMushroom), + "miniature mushrooms" + ) + ); + + Rewards.Add(new DummyReward(1074872)); // The opportunity to learn the ways of the Arcanist. + } + + public override Type NextQuest => typeof(NeedsOfTheManyHeartwood1); +} + +public class NeedsOfTheManyHeartwood1 : MLQuest +{ + public NeedsOfTheManyHeartwood1() + { + Activated = true; + Title = 1072797; // Needs of the Many - The Heartwood + Description = + 1072763; // The way of the Arcanist involves cooperation with others and a strong commitment to the community of your people. We have run low on the cotton we use to pack wounds and our people have need. Bring 10 bales of cotton to me. + RefusalMessage = 1072768; // You endanger your progress along the path with your unwillingness. + InProgressMessage = 1072775; // I care not where you acquire the cotton, merely that you provide it. + CompletionMessage = 1074110; // Well, where are the cotton bales? + + Objectives.Add(new CollectObjective(10, typeof(Cotton), 1023577)); // bale of cotton + + Rewards.Add(new DummyReward(1074872)); // The opportunity to learn the ways of the Arcanist. + } + + public override Type NextQuest => typeof(NeedsOfTheManyHeartwood2); + public override bool IsChainTriggered => true; +} + +public class NeedsOfTheManyHeartwood2 : MLQuest +{ + public NeedsOfTheManyHeartwood2() + { + Activated = true; + Title = 1072797; // Needs of the Many - The Heartwood + Description = 1072764; // We must look to the defense of our people! Bring boards for new arrows. + RefusalMessage = + 1072769; // The people have need of these items. You are proving yourself inadequate to the demands of a member of this community. + InProgressMessage = 1072776; // The requirements are simple -- 250 boards. + CompletionMessage = 1074152; // Well, where are the boards? + + Objectives.Add(new CollectObjective(250, typeof(Board), 1027127)); // board + + Rewards.Add(new DummyReward(1074872)); // The opportunity to learn the ways of the Arcanist. + } + + public override Type NextQuest => typeof(MakingAContributionHeartwood); + public override bool IsChainTriggered => true; +} + +public class MakingAContributionHeartwood : MLQuest +{ + public MakingAContributionHeartwood() + { + Activated = true; + Title = 1072798; // Making a Contribution - The Heartwood + Description = + 1072765; // With health and defense assured, we need look to the need of the community for food and drink. We will feast on fish steaks, sweets, and wine. You will supply the ingredients, the cooks will prepare the meal. As a Arcanist relies upon others to build focus and lend their power to her workings, the community needs the effort of all to survive. + RefusalMessage = 1072770; // Do not falter now. You have begun to show promise. + InProgressMessage = 1072777; // Where are the items you've been tasked to supply for the feast? + CompletionMessage = 1074158; // Ah good, you're back. We're eager for the feast. + + Objectives.Add(new CollectObjective(1, typeof(SackFlour), 1024153)); // sack of flour + Objectives.Add(new CollectObjective(10, typeof(JarHoney), 1022540)); // jar of honey + Objectives.Add(new CollectObjective(20, typeof(FishSteak), 1022427)); // fish steak + + Rewards.Add(new DummyReward(1074872)); // The opportunity to learn the ways of the Arcanist. + } + + public override Type NextQuest => typeof(UnnaturalCreations); + public override bool IsChainTriggered => true; +} + +public class UnnaturalCreations : MLQuest +{ + public UnnaturalCreations() + { + Activated = true; + Title = 1072758; // Unnatural Creations + Description = + 1072780; // You have proven your desire to contribute to the community and serve the people. Now you must demonstrate your willingness to defend Sosaria from the greatest blight that plagues her. Unnatural creatures, brought to a sort of perverted life, despoil our fair world. Destroy them -- 5 Exodus Overseers and 2 Exodus Minions. + RefusalMessage = + 1072771; // You must serve Sosaria with all your heart and strength. Your unwillingness does not reflect favorably upon you. + InProgressMessage = 1072779; // Every moment you procrastinate, these unnatural creatures damage Sosaria. + CompletionMessage = 1074167; // Well done! Well done, indeed. You are worthy to become an arcanist! + + Objectives.Add(new KillObjective(5, new[] { typeof(ExodusOverseer) }, "Exodus Overseers")); + Objectives.Add(new KillObjective(2, new[] { typeof(ExodusMinion) }, "Exodus Minions")); + + Rewards.Add(new ItemReward(1031601, typeof(ArcaneCircleScroll))); // Arcane Circle + Rewards.Add(new ItemReward(1031600, typeof(SpellweavingBook))); // Spellweaving Spellbook + Rewards.Add(new ItemReward(1031602, typeof(GiftOfRenewalScroll))); // Gift of Renewal + } + + public override bool IsChainTriggered => true; + + public override void GetRewards(MLQuestInstance instance) + { + Spellweaving.AwardTo(instance.Player); + base.GetRewards(instance); + } +} + +public class Discipline : MLQuest +{ + public Discipline() + { + Activated = true; + Title = 1072752; // Discipline + Description = + 1072761; // Learning to weave spells and control the forces of nature requires sacrifice, discipline, focus, and an unwavering dedication to Sosaria herself. We do not teach the unworthy. They do not comprehend the lessons nor the dedication required. If you would walk the path of the Arcanist, then you must do as I require without hesitation or question. Your first task is to rid our home of rats ... 50 of them in the next hour. + RefusalMessage = 1072767; // *nods* Not everyone has the temperament to undertake the way of the Arcanist. + InProgressMessage = 1072773; // You waste my time. The task is simple. Kill 50 rats in an hour. + // No completion message + + Objectives.Add( + new TimedKillObjective( + TimeSpan.FromHours(1), + 50, + new[] { typeof(Rat) }, + "rats", + new QuestArea(1074807, "Sanctuary") + ) + ); + + Rewards.Add(new DummyReward(1074872)); // The opportunity to learn the ways of the Arcanist. + } + + public override Type NextQuest => typeof(NeedsOfTheManySanctuary); +} + +public class NeedsOfTheManySanctuary : MLQuest +{ + public NeedsOfTheManySanctuary() + { + Activated = true; + Title = 1072754; // Needs of the Many - Sanctuary + Description = + 1072763; // The way of the Arcanist involves cooperation with others and a strong commitment to the community of your people. We have run low on the cotton we use to pack wounds and our people have need. Bring 10 bales of cotton to me. + RefusalMessage = 1072768; // You endanger your progress along the path with your unwillingness. + InProgressMessage = 1072775; // I care not where you acquire the cotton, merely that you provide it. + CompletionMessage = 1074110; // Well, where are the cotton bales? + + Objectives.Add(new CollectObjective(10, typeof(Cotton), 1023577)); // bale of cotton + + Rewards.Add(new DummyReward(1074872)); // The opportunity to learn the ways of the Arcanist. + } + + public override Type NextQuest => typeof(MakingAContributionSanctuary); + public override bool IsChainTriggered => true; +} + +public class MakingAContributionSanctuary : MLQuest +{ + public MakingAContributionSanctuary() + { + Activated = true; + Title = 1072755; // Making a Contribution - Sanctuary + Description = 1072764; // We must look to the defense of our people! Bring boards for new arrows. + RefusalMessage = + 1072769; // The people have need of these items. You are proving yourself inadequate to the demands of a member of this community. + InProgressMessage = 1072776; // The requirements are simple -- 250 boards. + CompletionMessage = 1074152; // Well, where are the boards? + + Objectives.Add(new CollectObjective(250, typeof(Board), 1027127)); // board + + Rewards.Add(new DummyReward(1074872)); // The opportunity to learn the ways of the Arcanist. + } + + public override Type NextQuest => typeof(SuppliesForSanctuary); + public override bool IsChainTriggered => true; +} + +public class SuppliesForSanctuary : MLQuest +{ + public SuppliesForSanctuary() + { + Activated = true; + Title = 1072756; // Supplies for Sanctuary + Description = + 1072765; // With health and defense assured, we need look to the need of the community for food and drink. We will feast on fish steaks, sweets, and wine. You will supply the ingredients, the cooks will prepare the meal. As a Arcanist relies upon others to build focus and lend their power to her workings, the community needs the effort of all to survive. + RefusalMessage = 1072770; // Do not falter now. You have begun to show promise. + InProgressMessage = 1072777; // Where are the items you've been tasked to supply for the feast? + CompletionMessage = 1074158; // Ah good, you're back. We're eager for the feast. + + Objectives.Add(new CollectObjective(1, typeof(SackFlour), 1024153)); // sack of flour + Objectives.Add(new CollectObjective(10, typeof(JarHoney), 1022540)); // jar of honey + Objectives.Add(new CollectObjective(20, typeof(FishSteak), 1022427)); // fish steak + + Rewards.Add(new DummyReward(1074872)); // The opportunity to learn the ways of the Arcanist. + } + + public override Type NextQuest => typeof(TheHumanBlight); + public override bool IsChainTriggered => true; +} + +public class TheHumanBlight : MLQuest +{ + public TheHumanBlight() + { + Activated = true; + Title = 1072757; // The Human Blight + Description = + 1072766; // You have proven your desire to contribute to the community and serve the people. Now you must demonstrate your willingness to defend Sosaria from the greatest blight that plagues her. The human vermin that have spread as a disease, despoiling the land are the greatest blight we face. Kill humans and return to me the proof of your actions. Bring me 30 human ears. + RefusalMessage = + 1072771; // You must serve Sosaria with all your heart and strength. Your unwillingness does not reflect favorably upon you. + InProgressMessage = 1072778; // Why do you delay? The human blight must be averted. + CompletionMessage = 1074160; // I will take the ears you have collected now. Hand them here. + + Objectives.Add(new CollectObjective(30, typeof(SeveredHumanEars), 1032591)); // severed human ears + + Rewards.Add(new ItemReward(1031601, typeof(ArcaneCircleScroll))); // Arcane Circle + Rewards.Add(new ItemReward(1031600, typeof(SpellweavingBook))); // Spellweaving Spellbook + Rewards.Add(new ItemReward(1031602, typeof(GiftOfRenewalScroll))); // Gift of Renewal + } + + public override bool IsChainTriggered => true; + + public override void GetRewards(MLQuestInstance instance) + { + Spellweaving.AwardTo(instance.Player); + base.GetRewards(instance); + } +} + +public class FriendOfTheFey : MLQuest +{ + public FriendOfTheFey() + { + Activated = true; + Title = 1074284; // Friend of the Fey + Description = + 1074286; // The children of Sosaria understand the dedication and committment of an arcanist -- and will, from time to time offer their friendship. If you would forge such a bond, first seek out a goodwill offering to present. Pixies enjoy sweets and pretty things. + RefusalMessage = 1074288; // There's always time to make new friends. + InProgressMessage = 1074290; // I think honey and some sparkly beads would please a pixie. + CompletionMessage = 1074292; // What have we here? Oh yes, gifts for a pixie. + + Objectives.Add(new CollectObjective(1, typeof(Beads), 1024235)); // beads + Objectives.Add(new CollectObjective(1, typeof(JarHoney), 1022540)); // jar of honey + + // The opportunity to prove yourself worthy of learning to Summon Fey. (Sufficient spellweaving skill is required to cast the spell) + Rewards.Add(new DummyReward(1074874)); + } + + public override Type NextQuest => typeof(TokenOfFriendship); +} + +public class TokenOfFriendship : MLQuest +{ + public TokenOfFriendship() + { + Activated = true; + Title = 1074293; // Token of Friendship + Description = + 1074297; // I've wrapped your gift suitably to present to a pixie of discriminating taste. Seek out Arielle and give her your offering. + RefusalMessage = 1074310; // I'll hold onto this gift in case you change your mind. + InProgressMessage = + 1074315; // Arielle wanders quite a bit, so I'm not sure exactly where to find her. I'm sure she's going to love your gift. + CompletionMessage = 1074319; // *giggle* Oooh! For me? + + Objectives.Add(new DeliverObjective(typeof(GiftForArielle), 1, "gift for Arielle", typeof(Arielle))); + + // The opportunity to prove yourself worthy of learning to Summon Fey. (Sufficient spellweaving skill is required to cast the spell) + Rewards.Add(new DummyReward(1074874)); + } + + public override Type NextQuest => typeof(Alliance); + public override bool IsChainTriggered => true; +} + +public class Alliance : MLQuest +{ + public Alliance() + { + Activated = true; + Title = 1074294; // Alliance + Description = 1074298; // *giggle* Mean reapers make pixies unhappy. *light-hearted giggle* You could fix them! + RefusalMessage = 1074311; // *giggle* Okies! + InProgressMessage = 1074316; // Mean reapers are all around trees! *giggle* You fix them up, please. + CompletionNotice = CompletionNoticeShortReturn; + + Objectives.Add(new KillObjective(20, new[] { typeof(Reaper) }, "reapers")); + + Rewards.Add(new ItemReward(1031607, typeof(SummonFeyScroll))); // Summon Fey + } + + public override bool IsChainTriggered => true; + + public override void GetRewards(MLQuestInstance instance) + { + instance.PlayerContext.SummonFey = true; + // *giggle* Mean reapers got fixed! Pixie friend now! *giggle* When mean thingies bother you, a brave pixie will help. + instance.Player.SendLocalizedMessage(1074320, "", 0x2A); + + base.GetRewards(instance); + } +} + +public class FiendishFriends : MLQuest +{ + public FiendishFriends() + { + Activated = true; + Title = 1074283; // Fiendish Friends + Description = + 1074285; // It is true that a skilled arcanist can summon and dominate an imp to serve at their pleasure. To do such at thing though, you must master the miserable little fiends utterly by demonstrating your superiority. Rough them up some -- kill a few. That will do the trick. + RefusalMessage = 1074287; // You're probably right. They're not worth the effort. + InProgressMessage = 1074289; // Surely you're not having difficulties swatting down those annoying pests? + // TODO: Verify + CompletionMessage = 1074291; // Hah! You showed them! + + Objectives.Add(new KillObjective(50, new[] { typeof(Imp) }, "imps")); + + // The opportunity to prove yourself worthy of learning to Summon Fiends. + // (Sufficient spellweaving skill is required to cast the spell) + Rewards.Add(new DummyReward(107487)); + } + + public override Type NextQuest => typeof(CrackingTheWhipI); +} + +// TODO: Verify +public class CrackingTheWhipI : MLQuest +{ + public CrackingTheWhipI() + { + Activated = true; + Title = 1074295; // Cracking the Whip + Description = + 1074300; // Now that you've shown those mini pests your might, you should collect suitable implements to use to train your summoned pet. I suggest a stout whip. + RefusalMessage = 1074313; // Heh. Changed your mind, eh? + InProgressMessage = + 1074317; // Well, hurry up. If you don't get a whip how do you expect to control the little devil? + CompletionMessage = 1074321; // That's a well-made whip. No imp will ignore the sting of that lash. + + Objectives.Add(new CollectObjective(1, typeof(StoutWhip), "Stout Whip")); + + // The opportunity to prove yourself worthy of learning to Summon Fiends. (Sufficient spellweaving skill is required to cast the spell) + Rewards.Add(new DummyReward(1074873)); + } + + public override Type NextQuest => typeof(CrackingTheWhipII); + public override bool IsChainTriggered => true; +} + +// TODO: Verify +public class CrackingTheWhipII : MLQuest +{ + public CrackingTheWhipII() + { + Activated = true; + Title = 1074295; // Cracking the Whip + Description = + 1074302; // Now you just need to make the little buggers fear you -- if you can slay an arcane daemon, you'll earn their subservience. + RefusalMessage = 1074314; // If you're not up for it, so be it. + InProgressMessage = 1074318; // You need to vanquish an arcane daemon before the imps will fear you properly. + + Objectives.Add(new KillObjective(1, new[] { typeof(ArcaneDaemon) }, 1029733)); // arcane demon + + Rewards.Add(new ItemReward(1031608, typeof(SummonFiendScroll))); // Summon Fiend + } + + public override bool IsChainTriggered => true; + + public override void GetRewards(MLQuestInstance instance) + { + instance.PlayerContext.SummonFiend = true; + // You've demonstrated your strength, got a means of control, and taught the imps to fear you. + // You're ready now to summon them. + instance.Player.SendLocalizedMessage(1074322, "", 0x2A); + + base.GetRewards(instance); + } +} + +[QuesterName("Aeluva (The Heartwood)")] +[SerializationGenerator(0, false)] +public partial class Aeluva : BaseCreature +{ + [Constructible] + public Aeluva() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the arcanist"; + Race = Race.Elf; + Female = true; + Body = 606; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + SetSkill(SkillName.Meditation, 60.0, 80.0); + SetSkill(SkillName.Focus, 60.0, 80.0); + + AddItem(new ElvenShirt()); + AddItem(new Kilt(Utility.RandomNondyedHue())); // Note: OSI hue = 0x1516, typo? + AddItem(new ElvenBoots()); + AddItem(new Circlet()); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Aeluva"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + /* + * 1074206 - Excuse me please traveler, might I have a little of your time? + * 1074207 - Good day to you friend! Allow me to offer you a fabulous opportunity! Thrills and adventure await! + */ + MLQuestSystem.Tell(this, pm, Utility.Random(1074206, 2)); + } +} + +[QuesterName("Koole (Sanctuary)")] +[SerializationGenerator(0, false)] +public partial class Koole : BaseCreature +{ + [Constructible] + public Koole() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the arcanist"; + Race = Race.Elf; + Body = 605; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + SetSkill(SkillName.Meditation, 60.0, 80.0); + SetSkill(SkillName.Focus, 60.0, 80.0); + + Item item; + + item = new LeafChest(); + item.Hue = 443; + AddItem(item); + + item = new LeafArms(); + item.Hue = 443; + AddItem(item); + + AddItem(new LeafTonlet()); + AddItem(new ThighBoots(Utility.RandomAnimalHue())); + AddItem(new RoyalCirclet()); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Koole"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell( + this, + pm, + Utility.RandomList( + 1074186, // Come here, I have a task. + 1074218 // Hey! I want to talk to you, now. + ) + ); + } +} + +[QuesterName("Synaeva (The Heartwood)")] +[SerializationGenerator(0, false)] +public partial class Synaeva : BaseCreature +{ + [Constructible] + public Synaeva() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the arcanist"; + Race = Race.Elf; + Female = true; + Body = 606; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + SetSkill(SkillName.Meditation, 60.0, 80.0); + SetSkill(SkillName.Focus, 60.0, 80.0); + + Item item = new RavenHelm(); + item.Hue = Utility.RandomGreenHue(); + AddItem(item); + + AddItem(new FemaleLeafChest()); + AddItem(new LeafArms()); + AddItem(new LeafTonlet()); + AddItem(new ElvenBoots()); + AddItem(new WildStaff()); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Synaeva"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1074223); // Have you done it yet?  Oh, I haven’t told you, have I? + } +} + +[QuesterName("Elder Brae (Sanctuary)")] +[SerializationGenerator(0, false)] +public partial class ElderBrae : BaseCreature +{ + [Constructible] + public ElderBrae() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the wise"; + Race = Race.Elf; + Female = true; + Body = 606; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + SetSkill(SkillName.Meditation, 60.0, 80.0); + SetSkill(SkillName.Focus, 60.0, 80.0); + + AddItem(new GemmedCirclet()); + AddItem(new FemaleElvenRobe(Utility.RandomBrightHue())); + AddItem(new ElvenBoots(Utility.RandomAnimalHue())); + } + + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Elder Brae"; + public override bool CanShout => true; + + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell( + this, + pm, + Utility.RandomList( + 1074215, // Don’t test my patience you sniveling worm! + 1074218 // Hey! I want to talk to you, now. + ) + ); + } +} diff --git a/Projects/UOContent/Engines/ML Quests/Definitions/TheAncientWorld.cs b/Projects/UOContent/Engines/ML Quests/Definitions/TheAncientWorld.cs index 37d732311..89de165db 100644 --- a/Projects/UOContent/Engines/ML Quests/Definitions/TheAncientWorld.cs +++ b/Projects/UOContent/Engines/ML Quests/Definitions/TheAncientWorld.cs @@ -1,151 +1,133 @@ using System; +using ModernUO.Serialization; using Server.Engines.MLQuests.Objectives; using Server.Engines.MLQuests.Rewards; using Server.Items; using Server.Mobiles; -namespace Server.Engines.MLQuests.Definitions +namespace Server.Engines.MLQuests.Definitions; + +public class TheAncientWorld : MLQuest { - public class TheAncientWorld : MLQuest + public TheAncientWorld() { - public TheAncientWorld() - { - Activated = true; - Title = 1074534; // The Ancient World - Description = - 1074535; // The lore of my people mentions Mondain many times. In one tale, it is revealed that he created and enslaved a race -- a sort of man bull, known as a 'minotaur'. The tales speak of mighty warriors who charged with blood-soaked horns into the heat of battle. But, alas, the fate of the bull-men is unknown after the rupture. Will you seek information about their civilization? - RefusalMessage = 1074538; // I am disappointed, but I respect your decision. - InProgressMessage = - 1074539; // A traveler has told me that worshippers of Mondain still exist and wander the land. Perhaps their lore speaks of whether the bull-men survived. I do not think they share their secrets gladly. You may need to be 'persuasive'. - CompletionMessage = 1074542; // What have you found? + Activated = true; + Title = 1074534; // The Ancient World + Description = + 1074535; // The lore of my people mentions Mondain many times. In one tale, it is revealed that he created and enslaved a race -- a sort of man bull, known as a 'minotaur'. The tales speak of mighty warriors who charged with blood-soaked horns into the heat of battle. But, alas, the fate of the bull-men is unknown after the rupture. Will you seek information about their civilization? + RefusalMessage = 1074538; // I am disappointed, but I respect your decision. + InProgressMessage = + 1074539; // A traveler has told me that worshippers of Mondain still exist and wander the land. Perhaps their lore speaks of whether the bull-men survived. I do not think they share their secrets gladly. You may need to be 'persuasive'. + CompletionMessage = 1074542; // What have you found? - Objectives.Add(new CollectObjective(1, typeof(FragmentOfAMap), "fragment of a map")); + Objectives.Add(new CollectObjective(1, typeof(FragmentOfAMap), "fragment of a map")); - Rewards.Add(new DummyReward(1074876)); // Knowledge of the legendary minotaur. - } - - public override Type NextQuest => typeof(TheGoldenHorn); + Rewards.Add(new DummyReward(1074876)); // Knowledge of the legendary minotaur. } - public class TheGoldenHorn : MLQuest + public override Type NextQuest => typeof(TheGoldenHorn); +} + +public class TheGoldenHorn : MLQuest +{ + public TheGoldenHorn() { - public TheGoldenHorn() - { - Activated = true; - Title = 1074543; // The Golden Horn - Description = - 1074545; // Ah ha! You see here ... and over here ... The map fragment places the city of the bull-men, Labyrinth, on that piece of Sosaria that was thrown into the sky. Hmmm, I would have you go there and find any artifacts that remain that help tell the story. But, legend speaks of a mighty barrier to prevent invasion of the city. Take this map to Braen and explain the problem. Perhaps he can devise a solution. - RefusalMessage = 1074538; // I am disappointed, but I respect your decision. - InProgressMessage = 1074547; // Braen is nearby, run and speak with him. - CompletionMessage = 1074549; // Yes? What do you want? I'm very busy. + Activated = true; + Title = 1074543; // The Golden Horn + Description = + 1074545; // Ah ha! You see here ... and over here ... The map fragment places the city of the bull-men, Labyrinth, on that piece of Sosaria that was thrown into the sky. Hmmm, I would have you go there and find any artifacts that remain that help tell the story. But, legend speaks of a mighty barrier to prevent invasion of the city. Take this map to Braen and explain the problem. Perhaps he can devise a solution. + RefusalMessage = 1074538; // I am disappointed, but I respect your decision. + InProgressMessage = 1074547; // Braen is nearby, run and speak with him. + CompletionMessage = 1074549; // Yes? What do you want? I'm very busy. - Objectives.Add(new DeliverObjective(typeof(FragmentOfAMapDelivery), 1, "fragment of a map", typeof(Braen))); + Objectives.Add(new DeliverObjective(typeof(FragmentOfAMapDelivery), 1, "fragment of a map", typeof(Braen))); - Rewards.Add(new DummyReward(1074876)); // Knowledge of the legendary minotaur. - } - - public override Type NextQuest => typeof(Bullish); - public override bool IsChainTriggered => true; + Rewards.Add(new DummyReward(1074876)); // Knowledge of the legendary minotaur. } - public class Bullish : MLQuest + public override Type NextQuest => typeof(Bullish); + public override bool IsChainTriggered => true; +} + +public class Bullish : MLQuest +{ + public Bullish() { - public Bullish() - { - Activated = true; - Title = 1074550; // Bullish - Description = - 1074552; // Oh, I see. I will need some materials to infuse you with the essence of a bull-man, so you can fool their defenses. The most similar beast to the original Baratarian bull that the minotaur were bred from is undoubtedly the mighty Gaman, native to the Lands of the Feudal Lords. I need horns, in great quantity to undertake this magic. - RefusalMessage = 1074554; // Oh come now, don't be afraid. The magic won't harm you. - InProgressMessage = - 1074555; // I cannot grant you the ability to pass through the bull-men's defenses without the gaman horns. - CompletionMessage = - 1074556; // You've returned at last! Give me just a moment to examine what you've brought and I can perform the magic that will allow you enter the Labyrinth. + Activated = true; + Title = 1074550; // Bullish + Description = + 1074552; // Oh, I see. I will need some materials to infuse you with the essence of a bull-man, so you can fool their defenses. The most similar beast to the original Baratarian bull that the minotaur were bred from is undoubtedly the mighty Gaman, native to the Lands of the Feudal Lords. I need horns, in great quantity to undertake this magic. + RefusalMessage = 1074554; // Oh come now, don't be afraid. The magic won't harm you. + InProgressMessage = + 1074555; // I cannot grant you the ability to pass through the bull-men's defenses without the gaman horns. + CompletionMessage = + 1074556; // You've returned at last! Give me just a moment to examine what you've brought and I can perform the magic that will allow you enter the Labyrinth. - Objectives.Add(new CollectObjective(20, typeof(GamanHorns), "gaman horns")); + Objectives.Add(new CollectObjective(20, typeof(GamanHorns), "gaman horns")); - Rewards.Add(new DummyReward(1074876)); // Knowledge of the legendary minotaur. - } - - public override Type NextQuest => typeof(LostCivilization); - public override bool IsChainTriggered => true; + Rewards.Add(new DummyReward(1074876)); // Knowledge of the legendary minotaur. } - public class LostCivilization : MLQuest + public override Type NextQuest => typeof(LostCivilization); + public override bool IsChainTriggered => true; +} + +public class LostCivilization : MLQuest +{ + public LostCivilization() { - public LostCivilization() - { - Activated = true; - Title = 1074823; // Lost Civilization - Description = - 1074825; // *whew* It is done! The fierce essence of the bull has been infused into your aura. You are able now to breach the ancient defenses of the city. Go forth and seek the minotaur -- and then return with wonderous tales and evidence of your visit to the Labyrinth. - RefusalMessage = - 1074827; // As you wish. I can't understand why you'd pass up such a remarkable opportunity. Think of the adventures you would have. - InProgressMessage = - 1074828; // You won't reach the minotaur city by loitering around here! What are you waiting for? You need to get to Malas and find the access point for the island. You'll be renowned for your discovery! - CompletionMessage = - 1074829; // Oh! You've returned at last! I can't wait to hear the tales ... but first, let me see those artifacts. You've certainly earned this reward. + Activated = true; + Title = 1074823; // Lost Civilization + Description = + 1074825; // *whew* It is done! The fierce essence of the bull has been infused into your aura. You are able now to breach the ancient defenses of the city. Go forth and seek the minotaur -- and then return with wonderous tales and evidence of your visit to the Labyrinth. + RefusalMessage = + 1074827; // As you wish. I can't understand why you'd pass up such a remarkable opportunity. Think of the adventures you would have. + InProgressMessage = + 1074828; // You won't reach the minotaur city by loitering around here! What are you waiting for? You need to get to Malas and find the access point for the island. You'll be renowned for your discovery! + CompletionMessage = + 1074829; // Oh! You've returned at last! I can't wait to hear the tales ... but first, let me see those artifacts. You've certainly earned this reward. - Objectives.Add(new CollectObjective(3, typeof(MinotaurArtifact), "minotaur artifacts")); + Objectives.Add(new CollectObjective(3, typeof(MinotaurArtifact), "minotaur artifacts")); - Rewards.Add(ItemReward.Strongbox); - } - - public override bool IsChainTriggered => true; + Rewards.Add(ItemReward.Strongbox); } - [QuesterName("Broolol (The Heartwood)")] - public class LorekeeperBroolol : BaseCreature + public override bool IsChainTriggered => true; +} + +[QuesterName("Broolol (The Heartwood)")] +[SerializationGenerator(0, false)] +public partial class LorekeeperBroolol : BaseCreature +{ + [Constructible] + public LorekeeperBroolol() : base(AIType.AI_Vendor, FightMode.None, 2) { - [Constructible] - public LorekeeperBroolol() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the keeper of tradition"; - Race = Race.Elf; - Body = 0x25E; - Female = true; - Hue = Race.RandomSkinHue(); + Title = "the keeper of tradition"; + Race = Race.Elf; + Body = 0x25E; + Female = true; + Hue = Race.RandomSkinHue(); - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); - Utility.AssignRandomHair(this); + Utility.AssignRandomHair(this); - SetSkill(SkillName.Meditation, 60.0, 80.0); - SetSkill(SkillName.Focus, 60.0, 80.0); + SetSkill(SkillName.Meditation, 60.0, 80.0); + SetSkill(SkillName.Focus, 60.0, 80.0); - AddItem(new ElvenBoots(0x70D)); - AddItem(new FemaleElvenRobe(0x3A)); - AddItem(new WildStaff()); - } + AddItem(new ElvenBoots(0x70D)); + AddItem(new FemaleElvenRobe(0x3A)); + AddItem(new WildStaff()); + } - public LorekeeperBroolol(Serial serial) - : base(serial) - { - } + public override bool IsInvulnerable => true; + public override bool CanTeach => true; + public override string DefaultName => "Lorekeeper Broolol"; + public override bool CanShout => true; - public override bool IsInvulnerable => true; - public override bool CanTeach => true; - public override string DefaultName => "Lorekeeper Broolol"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1074200); // Thank goodness you are here, there's no time to lose. - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } + public override void Shout(PlayerMobile pm) + { + MLQuestSystem.Tell(this, pm, 1074200); // Thank goodness you are here, there's no time to lose. } } diff --git a/Projects/UOContent/Engines/ML Quests/Definitions/UnfadingMemories.cs b/Projects/UOContent/Engines/ML Quests/Definitions/UnfadingMemories.cs index fec2e21be..fb2b56319 100644 --- a/Projects/UOContent/Engines/ML Quests/Definitions/UnfadingMemories.cs +++ b/Projects/UOContent/Engines/ML Quests/Definitions/UnfadingMemories.cs @@ -1,174 +1,138 @@ using System; +using ModernUO.Serialization; using Server.Engines.MLQuests.Objectives; using Server.Engines.MLQuests.Rewards; using Server.Items; using Server.Mobiles; -namespace Server.Engines.MLQuests.Definitions +namespace Server.Engines.MLQuests.Definitions; + +public class UnfadingMemoriesPartOne : MLQuest { - public class UnfadingMemoriesPartOne : MLQuest + public UnfadingMemoriesPartOne() { - public UnfadingMemoriesPartOne() - { - Activated = true; - Title = 1075355; // Unfading Memories - // Aargh! It's just not right! It doesn't capture the unique color of her hair at all! If only I had some Prismatic Amber. That would be perfect. They used to mine it in Malas, but alas, those veins ran dry some time ago. I hear it may have been found in the Prism of Light. Oh, if only there were a bold adventurer within earshot who would go to the Prism of Light and retrieve some for me! - Description = 1075356; - RefusalMessage = 1075358; // Is there no one who can help a humble artist pursue his Muse? - // You can find Prismatic Amber in the Prism of Light, located just north of the city of Nujel'm. - InProgressMessage = 1075359; - // I knew it! See, it's just the color I needed! Look how it brings out the highlights of her wheaten tresses! - CompletionMessage = 1075360; - CompletionNotice = CompletionNoticeShort; + Activated = true; + Title = 1075355; // Unfading Memories + // Aargh! It's just not right! It doesn't capture the unique color of her hair at all! If only I had some Prismatic Amber. That would be perfect. They used to mine it in Malas, but alas, those veins ran dry some time ago. I hear it may have been found in the Prism of Light. Oh, if only there were a bold adventurer within earshot who would go to the Prism of Light and retrieve some for me! + Description = 1075356; + RefusalMessage = 1075358; // Is there no one who can help a humble artist pursue his Muse? + // You can find Prismatic Amber in the Prism of Light, located just north of the city of Nujel'm. + InProgressMessage = 1075359; + // I knew it! See, it's just the color I needed! Look how it brings out the highlights of her wheaten tresses! + CompletionMessage = 1075360; + CompletionNotice = CompletionNoticeShort; - Objectives.Add(new CollectObjective(1, typeof(PrismaticAmber), "Prismatic Amber")); + Objectives.Add(new CollectObjective(1, typeof(PrismaticAmber), "Prismatic Amber")); - // The joy of contributing to a noble artistic effort, however paltry the end product. - Rewards.Add(new DummyReward(1075357)); - } - - public override Type NextQuest => typeof(UnfadingMemoriesPartTwo); + // The joy of contributing to a noble artistic effort, however paltry the end product. + Rewards.Add(new DummyReward(1075357)); } - public class UnfadingMemoriesPartTwo : MLQuest - { - public UnfadingMemoriesPartTwo() - { - Activated = true; - Title = 1075367; // Unfading Memories - // Finished! With the pigment I was able to create from the Prismatic Amber you brought me, I was able to complete my humble work. I should explain. Once, I loved a noble lady of gentleness and refinement, who possessed such beauty that I have found myself unable to love another to this day. But it was from afar that I admired her, for it is not for one so lowly as I to pay court to the likes of her. You have heard of the fair Thalia, Lady of Nujel'm? No? Well, she was my Muse, my inspiration, and when I heard she was to be married, I lost whatever pitiful talent I possessed. I felt I must compose a portrait of her, my masterpiece, or I would never be able to paint again. You, my friend, have helped me complete my work. Now I ask another favor of you. Will you take it to her as a wedding gift? She will probably reject it, but I must make the offer. - Description = 1075368; - // Alright then, you have already helped me more than I deserved. I shall find someone else to undertake this task. - RefusalMessage = 1075370; - // The wedding is taking place in the palace in Nujel'm. You will likely find her there. - InProgressMessage = 1075371; - // I'm sorry, I'm getting ready to be married. I don't have time to . . . what's that you say? - CompletionMessage = 1075372; - CompletionNotice = CompletionNoticeShort; - - Objectives.Add(new DeliverObjective(typeof(PortraitOfTheBride), 1, "Portrait of the Bride", typeof(Thalia))); - - Rewards.Add(new DummyReward(1075369)); // The Artist's gratitude. - } - - public override Type NextQuest => typeof(UnfadingMemoriesPartThree); - public override bool IsChainTriggered => true; - } - - public class UnfadingMemoriesPartThree : MLQuest - { - public UnfadingMemoriesPartThree() - { - Activated = true; - OneTimeOnly = true; - Title = 1075373; // Unfading Memories - // Emilio painted this? It is absolutely wonderful! I used to love looking at his paintings, but I don't remember him creating anything like this before. Would you be so kind as to carry a letter to him? Fate may have it that I am to marry another, yet I am compelled to reveal to him that his love was not entirely unrequited. - Description = 1075374; - RefusalMessage = 1075376; // Very well, then. If you will excuse me, I need to get ready. - // Take the letter back to the Artist's Guild in Britain, if you would do me this kindness. - InProgressMessage = 1075377; - // She said what? She thinks what of me? I . . . I can't believe it! All this time, I never knew how she truly felt. Thank you, my friend. I believe now I will be able to paint once again. Here, take this bleach. I was going to use it to destroy all of my works. Perhaps you can find a better use for it now. - CompletionMessage = 1075378; - CompletionNotice = CompletionNoticeShort; - - Objectives.Add(new DeliverObjective(typeof(BridesLetter), 1, "Bride's Letter", typeof(Emilio))); - - Rewards.Add(new ItemReward(1075375, typeof(Bleach))); // Bleach - } - - public override bool IsChainTriggered => true; - } - - [QuesterName("Emilio (Britain)")] // OSI's description is "Artist", not very helpful - public class Emilio : BaseCreature - { - [Constructible] - public Emilio() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Tortured Artist"; - Race = Race.Human; - Body = 0x190; - Female = false; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - AddItem(new Backpack()); - AddItem(new Sandals(0x72B)); - AddItem(new LongPants(0x525)); - AddItem(new FancyShirt(0x53F)); - AddItem(new FloppyHat(0x58C)); - AddItem(new BodySash(0x1C)); - } - - public Emilio(Serial serial) - : base(serial) - { - } - - public override string DefaultName => "Emilio"; - public override bool IsInvulnerable => true; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - [QuesterName("Thalia (Nujel'm)")] // OSI's description is "Bride", not very helpful - public class Thalia : BaseCreature - { - [Constructible] - public Thalia() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Bride"; - Race = Race.Human; - Body = 0x191; - Female = true; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - AddItem(new Backpack()); - AddItem(new Sandals(0x8FD)); - AddItem(new FancyDress(0x8FD)); - } - - public Thalia(Serial serial) - : base(serial) - { - } - - public override string DefaultName => "Thalia"; - public override bool IsInvulnerable => true; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } + public override Type NextQuest => typeof(UnfadingMemoriesPartTwo); +} + +public class UnfadingMemoriesPartTwo : MLQuest +{ + public UnfadingMemoriesPartTwo() + { + Activated = true; + Title = 1075367; // Unfading Memories + // Finished! With the pigment I was able to create from the Prismatic Amber you brought me, I was able to complete my humble work. I should explain. Once, I loved a noble lady of gentleness and refinement, who possessed such beauty that I have found myself unable to love another to this day. But it was from afar that I admired her, for it is not for one so lowly as I to pay court to the likes of her. You have heard of the fair Thalia, Lady of Nujel'm? No? Well, she was my Muse, my inspiration, and when I heard she was to be married, I lost whatever pitiful talent I possessed. I felt I must compose a portrait of her, my masterpiece, or I would never be able to paint again. You, my friend, have helped me complete my work. Now I ask another favor of you. Will you take it to her as a wedding gift? She will probably reject it, but I must make the offer. + Description = 1075368; + // Alright then, you have already helped me more than I deserved. I shall find someone else to undertake this task. + RefusalMessage = 1075370; + // The wedding is taking place in the palace in Nujel'm. You will likely find her there. + InProgressMessage = 1075371; + // I'm sorry, I'm getting ready to be married. I don't have time to . . . what's that you say? + CompletionMessage = 1075372; + CompletionNotice = CompletionNoticeShort; + + Objectives.Add(new DeliverObjective(typeof(PortraitOfTheBride), 1, "Portrait of the Bride", typeof(Thalia))); + + Rewards.Add(new DummyReward(1075369)); // The Artist's gratitude. + } + + public override Type NextQuest => typeof(UnfadingMemoriesPartThree); + public override bool IsChainTriggered => true; +} + +public class UnfadingMemoriesPartThree : MLQuest +{ + public UnfadingMemoriesPartThree() + { + Activated = true; + OneTimeOnly = true; + Title = 1075373; // Unfading Memories + // Emilio painted this? It is absolutely wonderful! I used to love looking at his paintings, but I don't remember him creating anything like this before. Would you be so kind as to carry a letter to him? Fate may have it that I am to marry another, yet I am compelled to reveal to him that his love was not entirely unrequited. + Description = 1075374; + RefusalMessage = 1075376; // Very well, then. If you will excuse me, I need to get ready. + // Take the letter back to the Artist's Guild in Britain, if you would do me this kindness. + InProgressMessage = 1075377; + // She said what? She thinks what of me? I . . . I can't believe it! All this time, I never knew how she truly felt. Thank you, my friend. I believe now I will be able to paint once again. Here, take this bleach. I was going to use it to destroy all of my works. Perhaps you can find a better use for it now. + CompletionMessage = 1075378; + CompletionNotice = CompletionNoticeShort; + + Objectives.Add(new DeliverObjective(typeof(BridesLetter), 1, "Bride's Letter", typeof(Emilio))); + + Rewards.Add(new ItemReward(1075375, typeof(Bleach))); // Bleach + } + + public override bool IsChainTriggered => true; +} + +[QuesterName("Emilio (Britain)")] // OSI's description is "Artist", not very helpful +[SerializationGenerator(0, false)] +public partial class Emilio : BaseCreature +{ + [Constructible] + public Emilio() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Tortured Artist"; + Race = Race.Human; + Body = 0x190; + Female = false; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + AddItem(new Backpack()); + AddItem(new Sandals(0x72B)); + AddItem(new LongPants(0x525)); + AddItem(new FancyShirt(0x53F)); + AddItem(new FloppyHat(0x58C)); + AddItem(new BodySash(0x1C)); + } + + public override string DefaultName => "Emilio"; + public override bool IsInvulnerable => true; +} + +[QuesterName("Thalia (Nujel'm)")] // OSI's description is "Bride", not very helpful +[SerializationGenerator(0, false)] +public partial class Thalia : BaseCreature +{ + [Constructible] + public Thalia() : base(AIType.AI_Vendor, FightMode.None, 2) + { + Title = "the Bride"; + Race = Race.Human; + Body = 0x191; + Female = true; + Hue = Race.RandomSkinHue(); + + SetSpeed(0.5, 2.0); + InitStats(100, 100, 25); + + Utility.AssignRandomHair(this); + + AddItem(new Backpack()); + AddItem(new Sandals(0x8FD)); + AddItem(new FancyDress(0x8FD)); + } + + public override string DefaultName => "Thalia"; + public override bool IsInvulnerable => true; } diff --git a/Projects/UOContent/Engines/ML Quests/Mobiles/BoonCollector.cs b/Projects/UOContent/Engines/ML Quests/Mobiles/BoonCollector.cs index 71292d9cc..a128bfba5 100644 --- a/Projects/UOContent/Engines/ML Quests/Mobiles/BoonCollector.cs +++ b/Projects/UOContent/Engines/ML Quests/Mobiles/BoonCollector.cs @@ -1,46 +1,125 @@ using System; using System.Collections.Generic; +using ModernUO.Serialization; using Server.Engines.MLQuests.Definitions; using Server.Engines.MLQuests.Gumps; using Server.Items; using Server.Mobiles; -namespace Server.Engines.MLQuests.Mobiles +namespace Server.Engines.MLQuests.Mobiles; + +[SerializationGenerator(0, false)] +public abstract partial class DoneQuestCollector : BaseCreature, IRaceChanger { - public abstract class DoneQuestCollector : BaseCreature, IRaceChanger + private InternalTimer m_Timer; + + public DoneQuestCollector() : base(AIType.AI_Vendor, FightMode.None, 2) { - private InternalTimer m_Timer; + SetSpeed(0.5, 2.0); + } - public DoneQuestCollector() : base(AIType.AI_Vendor, FightMode.None, 2) + public override bool IsInvulnerable => true; + + public abstract TextDefinition[] Offer { get; } + public abstract TextDefinition[] Incomplete { get; } + public abstract TextDefinition[] Complete { get; } + public abstract Type[] Needed { get; } + + public bool CheckComplete(PlayerMobile pm) + { + if (CompletedCount(pm) == Needed.Length) { - SetSpeed(0.5, 2.0); + return true; } - public DoneQuestCollector(Serial serial) - : base(serial) + pm.SendLocalizedMessage(1073644); // You must complete all the tasks before proceeding... + return false; + } + + public void ConsumeNeeded(PlayerMobile pm) + { + var context = MLQuestSystem.GetContext(pm); + + if (context != null) { - } - - public override bool IsInvulnerable => true; - - public abstract TextDefinition[] Offer { get; } - public abstract TextDefinition[] Incomplete { get; } - public abstract TextDefinition[] Complete { get; } - public abstract Type[] Needed { get; } - - public bool CheckComplete(PlayerMobile pm) - { - if (CompletedCount(pm) == Needed.Length) + foreach (var type in Needed) { - return true; - } + var quest = MLQuestSystem.FindQuest(type); - pm.SendLocalizedMessage(1073644); // You must complete all the tasks before proceeding... - return false; + if (quest != null) + { + context.RemoveDoneQuest(quest); + } + } + } + } + + public void OnCancel(PlayerMobile pm) + { + pm.SendLocalizedMessage(1073645); // You may try this again later... + } + + public override void OnDoubleClick(Mobile from) + { + TryTalkTo(from, true); + } + + public override void OnDoubleClickDead(Mobile from) + { + TryTalkTo(from, true); + } + + public override void OnMovement(Mobile m, Point3D oldLocation) + { + if (m.Player && InRange(m, 6) && !InRange(oldLocation, 6)) + { + TryTalkTo(m, false); } - public void ConsumeNeeded(PlayerMobile pm) + base.OnMovement(m, oldLocation); + } + + public void TryTalkTo(Mobile from, bool fromClick) + { + if (!from.Hidden && !from.HasGump() && + !RaceChangeConfirmGump.IsPending(from.NetState) && CanTalkTo(from)) { + TalkTo(from as PlayerMobile); + } + else if (fromClick) + { + DenyTalk(from); + } + } + + public virtual bool CanTalkTo(Mobile from) => true; + + public virtual void DenyTalk(Mobile from) + { + } + + public void TalkTo(PlayerMobile pm) + { + if (pm == null || m_Timer?.Running == true) + { + return; + } + + var completed = CompletedCount(pm); + + if (completed == Needed.Length) + { + m_Timer = new InternalTimer(this, pm, Complete, true); + } + else if (completed == 0) + { + m_Timer = new InternalTimer(this, pm, Offer, false); + } + else + { + var conversation = new List(); + conversation.AddRange(Incomplete); + var context = MLQuestSystem.GetContext(pm); if (context != null) @@ -49,393 +128,260 @@ namespace Server.Engines.MLQuests.Mobiles { var quest = MLQuestSystem.FindQuest(type); - if (quest != null) + if (quest == null || context.HasDoneQuest(quest)) { - context.RemoveDoneQuest(quest); + continue; } + + conversation.Add(quest.Title); } } + + m_Timer = new InternalTimer(this, pm, conversation, false); } - public void OnCancel(PlayerMobile pm) + m_Timer.Start(); + } + + private int CompletedCount(PlayerMobile pm) + { + var context = MLQuestSystem.GetContext(pm); + + if (context == null) { - pm.SendLocalizedMessage(1073645); // You may try this again later... + return 0; } - public override void OnDoubleClick(Mobile from) - { - TryTalkTo(from, true); - } + var result = 0; - public override void OnDoubleClickDead(Mobile from) + foreach (var type in Needed) { - TryTalkTo(from, true); - } + var quest = MLQuestSystem.FindQuest(type); - public override void OnMovement(Mobile m, Point3D oldLocation) - { - if (m.Player && InRange(m, 6) && !InRange(oldLocation, 6)) + if (quest == null || context.HasDoneQuest(quest)) { - TryTalkTo(m, false); - } - - base.OnMovement(m, oldLocation); - } - - public void TryTalkTo(Mobile from, bool fromClick) - { - if (!from.Hidden && !from.HasGump() && - !RaceChangeConfirmGump.IsPending(from.NetState) && CanTalkTo(from)) - { - TalkTo(from as PlayerMobile); - } - else if (fromClick) - { - DenyTalk(from); + ++result; } } - public virtual bool CanTalkTo(Mobile from) => true; + return result; + } - public virtual void DenyTalk(Mobile from) + public virtual void OnComplete(PlayerMobile pm) + { + } + + private class InternalTimer : Timer + { + private readonly IList m_Conversation; + private readonly bool m_IsComplete; + private readonly DoneQuestCollector m_Owner; + private readonly PlayerMobile m_Target; + private int m_Index; + + public InternalTimer( + DoneQuestCollector owner, PlayerMobile target, IList conversation, + bool isComplete + ) + : base(TimeSpan.Zero, GetDelay()) { + m_Owner = owner; + m_Target = target; + m_Conversation = conversation; + m_IsComplete = isComplete; + m_Index = 0; } - public void TalkTo(PlayerMobile pm) + private static TimeSpan GetDelay() => TimeSpan.FromSeconds(Utility.RandomBool() ? 3 : 4); + + protected override void OnTick() { - if (pm == null || m_Timer?.Running == true) + if (m_Owner.Deleted) { + Stop(); return; } - var completed = CompletedCount(pm); + if (m_Index >= m_Conversation.Count) + { + if (m_IsComplete) + { + m_Owner.OnComplete(m_Target); + } - if (completed == Needed.Length) - { - m_Timer = new InternalTimer(this, pm, Complete, true); - } - else if (completed == 0) - { - m_Timer = new InternalTimer(this, pm, Offer, false); + Stop(); } else { - var conversation = new List(); - conversation.AddRange(Incomplete); - - var context = MLQuestSystem.GetContext(pm); - - if (context != null) + if (m_Index == 0) { - foreach (var type in Needed) + if (m_Target.ShowFameTitle && m_Target.Fame >= 10000) { - var quest = MLQuestSystem.FindQuest(type); - - if (quest == null || context.HasDoneQuest(quest)) - { - continue; - } - - conversation.Add(quest.Title); + m_Owner.Say(true, $"{(m_Target.Female ? "Lady" : "Lord")} {m_Target.Name}"); + } + else + { + m_Owner.Say(true, m_Target.Name); } } - m_Timer = new InternalTimer(this, pm, conversation, false); + m_Conversation[m_Index++].PublicOverheadMessage(m_Owner, MessageType.Regular, 0x3B2); + Interval = GetDelay(); } - - m_Timer.Start(); - } - - private int CompletedCount(PlayerMobile pm) - { - var context = MLQuestSystem.GetContext(pm); - - if (context == null) - { - return 0; - } - - var result = 0; - - foreach (var type in Needed) - { - var quest = MLQuestSystem.FindQuest(type); - - if (quest == null || context.HasDoneQuest(quest)) - { - ++result; - } - } - - return result; - } - - public virtual void OnComplete(PlayerMobile pm) - { - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - - private class InternalTimer : Timer - { - private readonly IList m_Conversation; - private readonly bool m_IsComplete; - private readonly DoneQuestCollector m_Owner; - private readonly PlayerMobile m_Target; - private int m_Index; - - public InternalTimer( - DoneQuestCollector owner, PlayerMobile target, IList conversation, - bool isComplete - ) - : base(TimeSpan.Zero, GetDelay()) - { - m_Owner = owner; - m_Target = target; - m_Conversation = conversation; - m_IsComplete = isComplete; - m_Index = 0; - } - - private static TimeSpan GetDelay() => TimeSpan.FromSeconds(Utility.RandomBool() ? 3 : 4); - - protected override void OnTick() - { - if (m_Owner.Deleted) - { - Stop(); - return; - } - - if (m_Index >= m_Conversation.Count) - { - if (m_IsComplete) - { - m_Owner.OnComplete(m_Target); - } - - Stop(); - } - else - { - if (m_Index == 0) - { - if (m_Target.ShowFameTitle && m_Target.Fame >= 10000) - { - m_Owner.Say(true, $"{(m_Target.Female ? "Lady" : "Lord")} {m_Target.Name}"); - } - else - { - m_Owner.Say(true, m_Target.Name); - } - } - - m_Conversation[m_Index++].PublicOverheadMessage(m_Owner, MessageType.Regular, 0x3B2); - Interval = GetDelay(); - } - } - } - } - - public class Darius : DoneQuestCollector - { - private static readonly TextDefinition[] m_Offer = - { - 1073998, // Blessings of Sosaria to you and merry met, friend. - 1073999, // I am glad for your company and wonder if you seek the heritage of your people? I sense within you an elven bloodline -- the purity of which was lost when our brothers and sisters were exiled here in the Rupture. - 1074000, // If it is your desire to reclaim your place amongst the people, you must demonstrate that you understand and embrace the responsibilities expected of you as an elf. - 1074001, // The most basic lessons of our Sosaria are taught by her humblest children. Seek Maul, the great bear, who understands instinctively the seasons. - 1074398, // Seek Strongroot, the great treefellow, whose very roots reach to the heart of the world. Seek Enigma, whose wisdom can only be conveyed in riddles and rhymes. Seek Bravehorn, the great hart, who exemplifies the fierce dedication of a protector of his people. - 1074399, // Seek the Huntsman, the centaur tasked with maintaining the balance. And lastly seek Arielle, the pixie, who has perhaps the most important lesson -- not to take yourself too seriously. - 1074400 // Or do none of these things. You must choose your own path in the world, and what use you'll make of your existence. - }; - - private static readonly TextDefinition[] m_Incomplete = - { - 1074002, // You have begun to walk the path of reclaiming your heritage, but you have not learned all the lessons before you. - 1074003 // You yet must perform these services: - }; - - private static readonly TextDefinition[] m_Complete = - { - 1074004, // You have carved a path in history, sought to understand the way from our sage companions. - 1074005, // And now you have returned full circle to the place of your origin within the arms of Mother Sosaria. There is but one thing left to do if you truly wish to embrace your elven heritage. - 1074006, // To be born once more an elf, you must strip of all worldly possessions. Nothing of man or beast much touch your skin. - 1074007 // Then you may step forth into history. - }; - - private static readonly Type[] m_Needed = - { - typeof(Seasons), - typeof(CaretakerOfTheLand), - typeof(WisdomOfTheSphynx), - typeof(DefendingTheHerd), - typeof(TheBalanceOfNature), - typeof(TheJoysOfLife) - }; - - [Constructible] - public Darius() - { - Title = "the wise"; - Race = Race.Elf; - Hue = Race.RandomSkinHue(); - SpeechHue = Utility.RandomDyedHue(); - - AddItem(new WildStaff()); - AddItem(new Sandals(0x1BB)); - AddItem(new GemmedCirclet()); - AddItem(new Tunic(Utility.RandomBrightHue())); - - Utility.AssignRandomHair(this); - - SetStr(40, 50); - SetDex(60, 70); - SetInt(90, 100); // Verified int - } - - public Darius(Serial serial) - : base(serial) - { - } - - public override TextDefinition[] Offer => m_Offer; - public override TextDefinition[] Incomplete => m_Incomplete; - public override TextDefinition[] Complete => m_Complete; - public override Type[] Needed => m_Needed; - - public override string DefaultName => "Darius"; - - public override bool CanTalkTo(Mobile from) => from.Race == Race.Human; - - public override void DenyTalk(Mobile from) - { - from.SendLocalizedMessage(1074017); // He's too busy right now, so he ignores you. - } - - public override void OnComplete(PlayerMobile from) - { - from.SendGump(new RaceChangeConfirmGump(this, from, Race.Elf)); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - } - } - - public class Nedrick : DoneQuestCollector - { - private static readonly TextDefinition[] m_Offer = - { - 1074403, // Greetings, traveler and welcome. - 1074404, // Perhaps you have heard of the service I offer? Perhaps you wish to avail yourself of the opportunity I lay before you. - 1074405, // Elves and humans; we lived together once in peace. Mighty relics that attest to our friendship remain, of course. Yet, memories faded when the Gem was shattered and the world torn asunder. Alone in The Heartwood, our elven brothers and sisters wondered what terrible evil had befallen Sosaria. - 1074406, // Violent change marked the sundering of our ties. We are different -- elves and humans. And yet we are much alike. I can give an elf the chance to walk as a human upon Sosaria. I can undertake the transformation. - 1074407, // But you must prove yourself to me. Humans possess a strength of character and back. Humans are quick-witted and able to pick up a smattering of nearly any talent. Humans are tough both mentally and physically. And of course, humans defend their own -- sometimes with their own lives. - 1074408, // Seek Sledge the Versatile and learn about human ingenuity and creativity. Seek Patricus and demonstrate your integrity and strength. - 1074409, // Seek out a human in need and prove your worth as a defender of humanity. Seek Belulah in Nu'Jelm and heartily challenge the elements in a display of toughness to rival any human. - 1074411 // Or turn away and embrace your heritage. It matters not to me. - }; - - private static readonly TextDefinition[] m_Incomplete = - { - 1074412, // You have made a good start but have more yet to do. - 1074413 // You must yet perform these deeds: - }; - - private static readonly TextDefinition[] m_Complete = - { - 1074410, // You have proven yourself capable and commited and so I will grant you the transformation you seek. - 1074531, // The first time you were born, you entered the world bare of all possessions and concerns. So too as you transform to your new life as a human, you must remove all worldly goods from the touch of your flesh. - 1074532 // I call upon all nearby to witness your rebirth! - }; - - private static readonly Type[] m_Needed = - { - typeof(Ingenuity), - typeof(HeaveHo), - typeof(HumanInNeed), - typeof(AllSeasonAdventurer) - }; - - [Constructible] - public Nedrick() - { - Title = "the iron worker"; - Race = Race.Human; - Hue = Race.RandomSkinHue(); - SpeechHue = Utility.RandomDyedHue(); - - AddItem(new Boots()); - AddItem(new LongPants(Utility.RandomNondyedHue())); - AddItem(new FancyShirt(Utility.RandomNondyedHue())); - - Utility.AssignRandomHair(this); - Utility.AssignRandomFacialHair(this, HairHue); - - SetStr(70, 80); - SetDex(50, 60); - SetInt(60, 70); // Verified int - } - - public Nedrick(Serial serial) - : base(serial) - { - } - - public override TextDefinition[] Offer => m_Offer; - public override TextDefinition[] Incomplete => m_Incomplete; - public override TextDefinition[] Complete => m_Complete; - public override Type[] Needed => m_Needed; - - public override string DefaultName => "Nedrick"; - - public override bool CanTalkTo(Mobile from) => from.Race == Race.Elf; - - public override void DenyTalk(Mobile from) - { - from.SendLocalizedMessage(1074017); // He's too busy right now, so he ignores you. - } - - public override void OnComplete(PlayerMobile from) - { - from.SendGump(new RaceChangeConfirmGump(this, from, Race.Human)); - } - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); } } } + +[SerializationGenerator(0, false)] +public partial class Darius : DoneQuestCollector +{ + private static readonly TextDefinition[] m_Offer = + { + 1073998, // Blessings of Sosaria to you and merry met, friend. + 1073999, // I am glad for your company and wonder if you seek the heritage of your people? I sense within you an elven bloodline -- the purity of which was lost when our brothers and sisters were exiled here in the Rupture. + 1074000, // If it is your desire to reclaim your place amongst the people, you must demonstrate that you understand and embrace the responsibilities expected of you as an elf. + 1074001, // The most basic lessons of our Sosaria are taught by her humblest children. Seek Maul, the great bear, who understands instinctively the seasons. + 1074398, // Seek Strongroot, the great treefellow, whose very roots reach to the heart of the world. Seek Enigma, whose wisdom can only be conveyed in riddles and rhymes. Seek Bravehorn, the great hart, who exemplifies the fierce dedication of a protector of his people. + 1074399, // Seek the Huntsman, the centaur tasked with maintaining the balance. And lastly seek Arielle, the pixie, who has perhaps the most important lesson -- not to take yourself too seriously. + 1074400 // Or do none of these things. You must choose your own path in the world, and what use you'll make of your existence. + }; + + private static readonly TextDefinition[] m_Incomplete = + { + 1074002, // You have begun to walk the path of reclaiming your heritage, but you have not learned all the lessons before you. + 1074003 // You yet must perform these services: + }; + + private static readonly TextDefinition[] m_Complete = + { + 1074004, // You have carved a path in history, sought to understand the way from our sage companions. + 1074005, // And now you have returned full circle to the place of your origin within the arms of Mother Sosaria. There is but one thing left to do if you truly wish to embrace your elven heritage. + 1074006, // To be born once more an elf, you must strip of all worldly possessions. Nothing of man or beast much touch your skin. + 1074007 // Then you may step forth into history. + }; + + private static readonly Type[] m_Needed = + { + typeof(Seasons), + typeof(CaretakerOfTheLand), + typeof(WisdomOfTheSphynx), + typeof(DefendingTheHerd), + typeof(TheBalanceOfNature), + typeof(TheJoysOfLife) + }; + + [Constructible] + public Darius() + { + Title = "the wise"; + Race = Race.Elf; + Hue = Race.RandomSkinHue(); + SpeechHue = Utility.RandomDyedHue(); + + AddItem(new WildStaff()); + AddItem(new Sandals(0x1BB)); + AddItem(new GemmedCirclet()); + AddItem(new Tunic(Utility.RandomBrightHue())); + + Utility.AssignRandomHair(this); + + SetStr(40, 50); + SetDex(60, 70); + SetInt(90, 100); // Verified int + } + + public override TextDefinition[] Offer => m_Offer; + public override TextDefinition[] Incomplete => m_Incomplete; + public override TextDefinition[] Complete => m_Complete; + public override Type[] Needed => m_Needed; + + public override string DefaultName => "Darius"; + + public override bool CanTalkTo(Mobile from) => from.Race == Race.Human; + + public override void DenyTalk(Mobile from) + { + from.SendLocalizedMessage(1074017); // He's too busy right now, so he ignores you. + } + + public override void OnComplete(PlayerMobile from) + { + from.SendGump(new RaceChangeConfirmGump(this, from, Race.Elf)); + } +} + +[SerializationGenerator(0, false)] +public partial class Nedrick : DoneQuestCollector +{ + private static readonly TextDefinition[] m_Offer = + { + 1074403, // Greetings, traveler and welcome. + 1074404, // Perhaps you have heard of the service I offer? Perhaps you wish to avail yourself of the opportunity I lay before you. + 1074405, // Elves and humans; we lived together once in peace. Mighty relics that attest to our friendship remain, of course. Yet, memories faded when the Gem was shattered and the world torn asunder. Alone in The Heartwood, our elven brothers and sisters wondered what terrible evil had befallen Sosaria. + 1074406, // Violent change marked the sundering of our ties. We are different -- elves and humans. And yet we are much alike. I can give an elf the chance to walk as a human upon Sosaria. I can undertake the transformation. + 1074407, // But you must prove yourself to me. Humans possess a strength of character and back. Humans are quick-witted and able to pick up a smattering of nearly any talent. Humans are tough both mentally and physically. And of course, humans defend their own -- sometimes with their own lives. + 1074408, // Seek Sledge the Versatile and learn about human ingenuity and creativity. Seek Patricus and demonstrate your integrity and strength. + 1074409, // Seek out a human in need and prove your worth as a defender of humanity. Seek Belulah in Nu'Jelm and heartily challenge the elements in a display of toughness to rival any human. + 1074411 // Or turn away and embrace your heritage. It matters not to me. + }; + + private static readonly TextDefinition[] m_Incomplete = + { + 1074412, // You have made a good start but have more yet to do. + 1074413 // You must yet perform these deeds: + }; + + private static readonly TextDefinition[] m_Complete = + { + 1074410, // You have proven yourself capable and commited and so I will grant you the transformation you seek. + 1074531, // The first time you were born, you entered the world bare of all possessions and concerns. So too as you transform to your new life as a human, you must remove all worldly goods from the touch of your flesh. + 1074532 // I call upon all nearby to witness your rebirth! + }; + + private static readonly Type[] m_Needed = + { + typeof(Ingenuity), + typeof(HeaveHo), + typeof(HumanInNeed), + typeof(AllSeasonAdventurer) + }; + + [Constructible] + public Nedrick() + { + Title = "the iron worker"; + Race = Race.Human; + Hue = Race.RandomSkinHue(); + SpeechHue = Utility.RandomDyedHue(); + + AddItem(new Boots()); + AddItem(new LongPants(Utility.RandomNondyedHue())); + AddItem(new FancyShirt(Utility.RandomNondyedHue())); + + Utility.AssignRandomHair(this); + Utility.AssignRandomFacialHair(this, HairHue); + + SetStr(70, 80); + SetDex(50, 60); + SetInt(60, 70); // Verified int + } + + public override TextDefinition[] Offer => m_Offer; + public override TextDefinition[] Incomplete => m_Incomplete; + public override TextDefinition[] Complete => m_Complete; + public override Type[] Needed => m_Needed; + + public override string DefaultName => "Nedrick"; + + public override bool CanTalkTo(Mobile from) => from.Race == Race.Elf; + + public override void DenyTalk(Mobile from) + { + from.SendLocalizedMessage(1074017); // He's too busy right now, so he ignores you. + } + + public override void OnComplete(PlayerMobile from) + { + from.SendGump(new RaceChangeConfirmGump(this, from, Race.Human)); + } +} diff --git a/Projects/UOContent/Migrations/Server.BloodRose.v0.json b/Projects/UOContent/Migrations/Server.BloodRose.v0.json new file mode 100644 index 000000000..17826ca28 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.BloodRose.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.BloodRose" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.ClarityPotion.v0.json b/Projects/UOContent/Migrations/Server.ClarityPotion.v0.json new file mode 100644 index 000000000..621e44ea3 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.ClarityPotion.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.ClarityPotion" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Aeluva.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Aeluva.v0.json new file mode 100644 index 000000000..386b4b749 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Aeluva.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Aeluva" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Aernya.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Aernya.v0.json new file mode 100644 index 000000000..0009aa53f --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Aernya.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Aernya" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.AldenArmstrong.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.AldenArmstrong.v0.json new file mode 100644 index 000000000..1f361a56d --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.AldenArmstrong.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.AldenArmstrong" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Alefian.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Alefian.v0.json new file mode 100644 index 000000000..9c2c67f64 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Alefian.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Alefian" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.AmeliaYoungstone.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.AmeliaYoungstone.v0.json new file mode 100644 index 000000000..c89a90a09 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.AmeliaYoungstone.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.AmeliaYoungstone" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.AndreasVesalius.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.AndreasVesalius.v0.json new file mode 100644 index 000000000..23a73e78f --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.AndreasVesalius.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.AndreasVesalius" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Andric.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Andric.v0.json new file mode 100644 index 000000000..a16b2fdbc --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Andric.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Andric" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Andros.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Andros.v0.json new file mode 100644 index 000000000..1b5adfd06 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Andros.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Andros" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Arielle.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Arielle.v0.json new file mode 100644 index 000000000..2b0a5e302 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Arielle.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Arielle" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Asandos.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Asandos.v0.json new file mode 100644 index 000000000..4c86f2272 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Asandos.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Asandos" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Avicenna.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Avicenna.v0.json new file mode 100644 index 000000000..d51d271f5 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Avicenna.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Avicenna" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Belulah.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Belulah.v0.json new file mode 100644 index 000000000..e8a927171 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Belulah.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Belulah" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Ben.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Ben.v0.json new file mode 100644 index 000000000..f7be1d8f6 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Ben.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Ben" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Beotham.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Beotham.v0.json new file mode 100644 index 000000000..0b9a9be9b --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Beotham.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Beotham" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Bravehorn.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Bravehorn.v0.json new file mode 100644 index 000000000..b5a204f37 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Bravehorn.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Bravehorn" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.BravehornsMate.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.BravehornsMate.v0.json new file mode 100644 index 000000000..7a65a3e77 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.BravehornsMate.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.BravehornsMate" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Canir.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Canir.v0.json new file mode 100644 index 000000000..e1745ab53 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Canir.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Canir" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Chiyo.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Chiyo.v0.json new file mode 100644 index 000000000..041ea2b26 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Chiyo.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Chiyo" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Churchill.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Churchill.v0.json new file mode 100644 index 000000000..815321327 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Churchill.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Churchill" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Clairesse.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Clairesse.v0.json new file mode 100644 index 000000000..ede26d1bb --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Clairesse.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Clairesse" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Dallid.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Dallid.v0.json new file mode 100644 index 000000000..052e89622 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Dallid.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Dallid" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Danoel.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Danoel.v0.json new file mode 100644 index 000000000..4f76dbe93 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Danoel.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Danoel" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Dimethro.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Dimethro.v0.json new file mode 100644 index 000000000..8030fcad4 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Dimethro.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Dimethro" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Drithen.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Drithen.v0.json new file mode 100644 index 000000000..b645cc3a7 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Drithen.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Drithen" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.ElderBrae.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.ElderBrae.v0.json new file mode 100644 index 000000000..a6580c133 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.ElderBrae.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.ElderBrae" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.ElderOnallan.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.ElderOnallan.v0.json new file mode 100644 index 000000000..084b899c0 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.ElderOnallan.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.ElderOnallan" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Emerillo.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Emerillo.v0.json new file mode 100644 index 000000000..cb1bbd0e4 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Emerillo.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Emerillo" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Emilio.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Emilio.v0.json new file mode 100644 index 000000000..72ab8a2fe --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Emilio.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Emilio" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Enigma.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Enigma.v0.json new file mode 100644 index 000000000..470fb0d5e --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Enigma.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Enigma" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Evan.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Evan.v0.json new file mode 100644 index 000000000..67418b994 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Evan.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Evan" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Frederic.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Frederic.v0.json new file mode 100644 index 000000000..909cdf186 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Frederic.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Frederic" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.GeorgeHephaestus.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.GeorgeHephaestus.v0.json new file mode 100644 index 000000000..dcedc84ce --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.GeorgeHephaestus.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.GeorgeHephaestus" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Gervis.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Gervis.v0.json new file mode 100644 index 000000000..531879c8d --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Gervis.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Gervis" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Gorrow.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Gorrow.v0.json new file mode 100644 index 000000000..f00206889 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Gorrow.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Gorrow" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.GrandpaCharley.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.GrandpaCharley.v0.json new file mode 100644 index 000000000..2efd1f91f --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.GrandpaCharley.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.GrandpaCharley" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Gustar.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Gustar.v0.json new file mode 100644 index 000000000..7c2b6690f --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Gustar.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Gustar" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.GustarShroud.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.GustarShroud.v0.json new file mode 100644 index 000000000..c6f927a57 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.GustarShroud.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.GustarShroud" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Hamato.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Hamato.v0.json new file mode 100644 index 000000000..6ce52f9c7 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Hamato.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Hamato" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Hargrove.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Hargrove.v0.json new file mode 100644 index 000000000..ccc75526c --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Hargrove.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Hargrove" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Huntsman.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Huntsman.v0.json new file mode 100644 index 000000000..3085d55e2 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Huntsman.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Huntsman" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.JacobWaltz.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.JacobWaltz.v0.json new file mode 100644 index 000000000..ab4af2fbe --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.JacobWaltz.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.JacobWaltz" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Jelrice.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Jelrice.v0.json new file mode 100644 index 000000000..5b659f69e --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Jelrice.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Jelrice" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Jillian.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Jillian.v0.json new file mode 100644 index 000000000..00d9a19e6 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Jillian.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Jillian" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Jockles.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Jockles.v0.json new file mode 100644 index 000000000..bd1c29f3a --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Jockles.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Jockles" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Jun.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Jun.v0.json new file mode 100644 index 000000000..b1e9560ca --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Jun.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Jun" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Kaelynna.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Kaelynna.v0.json new file mode 100644 index 000000000..2be56933a --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Kaelynna.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Kaelynna" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Kashiel.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Kashiel.v0.json new file mode 100644 index 000000000..e4e08e76d --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Kashiel.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Kashiel" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Kia.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Kia.v0.json new file mode 100644 index 000000000..c9327ed5c --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Kia.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Kia" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Koole.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Koole.v0.json new file mode 100644 index 000000000..3cbcfdb27 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Koole.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Koole" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Leon.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Leon.v0.json new file mode 100644 index 000000000..c963606d8 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Leon.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Leon" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.LorekeeperBroolol.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.LorekeeperBroolol.v0.json new file mode 100644 index 000000000..e78281a6f --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.LorekeeperBroolol.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.LorekeeperBroolol" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.LorekeeperOolua.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.LorekeeperOolua.v0.json new file mode 100644 index 000000000..e666aa2d6 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.LorekeeperOolua.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.LorekeeperOolua" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.LorekeeperRollarn.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.LorekeeperRollarn.v0.json new file mode 100644 index 000000000..26ea7cff1 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.LorekeeperRollarn.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.LorekeeperRollarn" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Lowel.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Lowel.v0.json new file mode 100644 index 000000000..226f7bc4f --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Lowel.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Lowel" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Lyle.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Lyle.v0.json new file mode 100644 index 000000000..6570ebe35 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Lyle.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Lyle" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.MasterGnosos.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.MasterGnosos.v0.json new file mode 100644 index 000000000..f7d81d934 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.MasterGnosos.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.MasterGnosos" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Mithneral.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Mithneral.v0.json new file mode 100644 index 000000000..cf8ea93c5 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Mithneral.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Mithneral" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Morganna.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Morganna.v0.json new file mode 100644 index 000000000..720cd8ff9 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Morganna.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Morganna" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Mugg.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Mugg.v0.json new file mode 100644 index 000000000..0cbba8081 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Mugg.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Mugg" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Mulcivikh.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Mulcivikh.v0.json new file mode 100644 index 000000000..7edb39668 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Mulcivikh.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Mulcivikh" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Nibbet.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Nibbet.v0.json new file mode 100644 index 000000000..d58655a8c --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Nibbet.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Nibbet" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Norton.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Norton.v0.json new file mode 100644 index 000000000..38893cf38 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Norton.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Norton" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Nythalia.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Nythalia.v0.json new file mode 100644 index 000000000..3fdaa6cd0 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Nythalia.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Nythalia" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Patricus.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Patricus.v0.json new file mode 100644 index 000000000..5547b48f1 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Patricus.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Patricus" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Recaro.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Recaro.v0.json new file mode 100644 index 000000000..e41cdbb06 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Recaro.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Recaro" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Regina.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Regina.v0.json new file mode 100644 index 000000000..7a5f4619e --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Regina.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Regina" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Robyn.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Robyn.v0.json new file mode 100644 index 000000000..e6c99c616 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Robyn.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Robyn" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Ryuichi.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Ryuichi.v0.json new file mode 100644 index 000000000..3a0f31c4c --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Ryuichi.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Ryuichi" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Sadrah.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Sadrah.v0.json new file mode 100644 index 000000000..5da6b3888 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Sadrah.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Sadrah" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.SarsmeaSmythe.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.SarsmeaSmythe.v0.json new file mode 100644 index 000000000..5a215104c --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.SarsmeaSmythe.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.SarsmeaSmythe" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Sledge.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Sledge.v0.json new file mode 100644 index 000000000..3345bd6bd --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Sledge.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Sledge" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Synaeva.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Synaeva.v0.json new file mode 100644 index 000000000..9b13e06ab --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Synaeva.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Synaeva" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Tallinin.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Tallinin.v0.json new file mode 100644 index 000000000..36cee1423 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Tallinin.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Tallinin" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Thalia.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Thalia.v0.json new file mode 100644 index 000000000..5652f7558 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Thalia.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Thalia" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Tiana.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Tiana.v0.json new file mode 100644 index 000000000..acd5a2b97 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Tiana.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Tiana" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.TylAriadne.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.TylAriadne.v0.json new file mode 100644 index 000000000..25b0fb3de --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.TylAriadne.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.TylAriadne" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Walker.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Walker.v0.json new file mode 100644 index 000000000..fe4cf23f2 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Walker.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Walker" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Yellienir.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Yellienir.v0.json new file mode 100644 index 000000000..1ff00f3da --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Yellienir.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Yellienir" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Yorus.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Yorus.v0.json new file mode 100644 index 000000000..e0ac1f0ee --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Definitions.Yorus.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Definitions.Yorus" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Mobiles.Darius.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Mobiles.Darius.v0.json new file mode 100644 index 000000000..7bd54beb8 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Mobiles.Darius.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Mobiles.Darius" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Mobiles.DoneQuestCollector.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Mobiles.DoneQuestCollector.v0.json new file mode 100644 index 000000000..a791791aa --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Mobiles.DoneQuestCollector.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Mobiles.DoneQuestCollector" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Engines.MLQuests.Mobiles.Nedrick.v0.json b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Mobiles.Nedrick.v0.json new file mode 100644 index 000000000..984821515 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Engines.MLQuests.Mobiles.Nedrick.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Engines.MLQuests.Mobiles.Nedrick" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Factions.FactionBerserker.v0.json b/Projects/UOContent/Migrations/Server.Factions.FactionBerserker.v0.json new file mode 100644 index 000000000..d705d58c7 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Factions.FactionBerserker.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Factions.FactionBerserker" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Factions.FactionBoardVendor.v0.json b/Projects/UOContent/Migrations/Server.Factions.FactionBoardVendor.v0.json new file mode 100644 index 000000000..0901b1916 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Factions.FactionBoardVendor.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Factions.FactionBoardVendor" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Factions.FactionBottleVendor.v0.json b/Projects/UOContent/Migrations/Server.Factions.FactionBottleVendor.v0.json new file mode 100644 index 000000000..c10dfad4a --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Factions.FactionBottleVendor.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Factions.FactionBottleVendor" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Factions.FactionDeathKnight.v0.json b/Projects/UOContent/Migrations/Server.Factions.FactionDeathKnight.v0.json new file mode 100644 index 000000000..a67d700e6 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Factions.FactionDeathKnight.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Factions.FactionDeathKnight" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Factions.FactionDragoon.v0.json b/Projects/UOContent/Migrations/Server.Factions.FactionDragoon.v0.json new file mode 100644 index 000000000..edc56bc4c --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Factions.FactionDragoon.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Factions.FactionDragoon" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Factions.FactionExplosionTrap.v0.json b/Projects/UOContent/Migrations/Server.Factions.FactionExplosionTrap.v0.json new file mode 100644 index 000000000..d709a08b6 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Factions.FactionExplosionTrap.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Factions.FactionExplosionTrap" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Factions.FactionExplosionTrapDeed.v0.json b/Projects/UOContent/Migrations/Server.Factions.FactionExplosionTrapDeed.v0.json new file mode 100644 index 000000000..192fda603 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Factions.FactionExplosionTrapDeed.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Factions.FactionExplosionTrapDeed" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Factions.FactionGasTrap.v0.json b/Projects/UOContent/Migrations/Server.Factions.FactionGasTrap.v0.json new file mode 100644 index 000000000..d9a4f0d5e --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Factions.FactionGasTrap.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Factions.FactionGasTrap" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Factions.FactionGasTrapDeed.v0.json b/Projects/UOContent/Migrations/Server.Factions.FactionGasTrapDeed.v0.json new file mode 100644 index 000000000..cd00355b8 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Factions.FactionGasTrapDeed.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Factions.FactionGasTrapDeed" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Factions.FactionHenchman.v0.json b/Projects/UOContent/Migrations/Server.Factions.FactionHenchman.v0.json new file mode 100644 index 000000000..044348e22 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Factions.FactionHenchman.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Factions.FactionHenchman" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Factions.FactionHorseVendor.v0.json b/Projects/UOContent/Migrations/Server.Factions.FactionHorseVendor.v0.json new file mode 100644 index 000000000..d11804327 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Factions.FactionHorseVendor.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Factions.FactionHorseVendor" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Factions.FactionKnight.v0.json b/Projects/UOContent/Migrations/Server.Factions.FactionKnight.v0.json new file mode 100644 index 000000000..0b7c7ff8b --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Factions.FactionKnight.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Factions.FactionKnight" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Factions.FactionMercenary.v0.json b/Projects/UOContent/Migrations/Server.Factions.FactionMercenary.v0.json new file mode 100644 index 000000000..58899b204 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Factions.FactionMercenary.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Factions.FactionMercenary" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Factions.FactionNecromancer.v0.json b/Projects/UOContent/Migrations/Server.Factions.FactionNecromancer.v0.json new file mode 100644 index 000000000..99e9059ba --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Factions.FactionNecromancer.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Factions.FactionNecromancer" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Factions.FactionOreVendor.v0.json b/Projects/UOContent/Migrations/Server.Factions.FactionOreVendor.v0.json new file mode 100644 index 000000000..3abcae77b --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Factions.FactionOreVendor.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Factions.FactionOreVendor" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Factions.FactionPaladin.v0.json b/Projects/UOContent/Migrations/Server.Factions.FactionPaladin.v0.json new file mode 100644 index 000000000..c856c8f6f --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Factions.FactionPaladin.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Factions.FactionPaladin" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Factions.FactionReagentVendor.v0.json b/Projects/UOContent/Migrations/Server.Factions.FactionReagentVendor.v0.json new file mode 100644 index 000000000..437225da6 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Factions.FactionReagentVendor.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Factions.FactionReagentVendor" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Factions.FactionSawTrap.v0.json b/Projects/UOContent/Migrations/Server.Factions.FactionSawTrap.v0.json new file mode 100644 index 000000000..2a451cd26 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Factions.FactionSawTrap.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Factions.FactionSawTrap" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Factions.FactionSawTrapDeed.v0.json b/Projects/UOContent/Migrations/Server.Factions.FactionSawTrapDeed.v0.json new file mode 100644 index 000000000..d45c635b2 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Factions.FactionSawTrapDeed.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Factions.FactionSawTrapDeed" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Factions.FactionSorceress.v0.json b/Projects/UOContent/Migrations/Server.Factions.FactionSorceress.v0.json new file mode 100644 index 000000000..8fc28460b --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Factions.FactionSorceress.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Factions.FactionSorceress" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Factions.FactionSpikeTrap.v0.json b/Projects/UOContent/Migrations/Server.Factions.FactionSpikeTrap.v0.json new file mode 100644 index 000000000..44018946d --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Factions.FactionSpikeTrap.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Factions.FactionSpikeTrap" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Factions.FactionSpikeTrapDeed.v0.json b/Projects/UOContent/Migrations/Server.Factions.FactionSpikeTrapDeed.v0.json new file mode 100644 index 000000000..d17561287 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Factions.FactionSpikeTrapDeed.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Factions.FactionSpikeTrapDeed" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Factions.FactionTrapRemovalKit.v0.json b/Projects/UOContent/Migrations/Server.Factions.FactionTrapRemovalKit.v0.json new file mode 100644 index 000000000..9e46172a4 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Factions.FactionTrapRemovalKit.v0.json @@ -0,0 +1,14 @@ +{ + "version": 0, + "type": "Server.Factions.FactionTrapRemovalKit", + "properties": [ + { + "name": "Charges", + "type": "int", + "rule": "PrimitiveTypeMigrationRule", + "ruleArguments": [ + "EncodedInt" + ] + } + ] +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Factions.FactionWizard.v0.json b/Projects/UOContent/Migrations/Server.Factions.FactionWizard.v0.json new file mode 100644 index 000000000..a072a1cd3 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Factions.FactionWizard.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Factions.FactionWizard" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Factions.Silver.v0.json b/Projects/UOContent/Migrations/Server.Factions.Silver.v0.json new file mode 100644 index 000000000..7ff718a10 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Factions.Silver.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Factions.Silver" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.GemOfEmpowerment.v0.json b/Projects/UOContent/Migrations/Server.GemOfEmpowerment.v0.json new file mode 100644 index 000000000..1035b146e --- /dev/null +++ b/Projects/UOContent/Migrations/Server.GemOfEmpowerment.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.GemOfEmpowerment" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Items.Trophy.v2.json b/Projects/UOContent/Migrations/Server.Items.Trophy.v2.json new file mode 100644 index 000000000..ea1e88a9e --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Items.Trophy.v2.json @@ -0,0 +1,32 @@ +{ + "version": 2, + "type": "Server.Items.Trophy", + "properties": [ + { + "name": "Title", + "type": "string", + "rule": "PrimitiveTypeMigrationRule", + "ruleArguments": [ + "" + ] + }, + { + "name": "Rank", + "type": "Server.Items.TrophyRank", + "rule": "EnumMigrationRule" + }, + { + "name": "Owner", + "type": "Server.Mobile", + "rule": "SerializableInterfaceMigrationRule" + }, + { + "name": "Date", + "type": "System.DateTime", + "rule": "PrimitiveTypeMigrationRule", + "ruleArguments": [ + "" + ] + } + ] +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Mobiles.HolyFamiliar.v0.json b/Projects/UOContent/Migrations/Server.Mobiles.HolyFamiliar.v0.json new file mode 100644 index 000000000..c4085d439 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Mobiles.HolyFamiliar.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Mobiles.HolyFamiliar" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.Mobiles.UnholyFamiliar.v0.json b/Projects/UOContent/Migrations/Server.Mobiles.UnholyFamiliar.v0.json new file mode 100644 index 000000000..0eceb2d55 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.Mobiles.UnholyFamiliar.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.Mobiles.UnholyFamiliar" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.PowerFactionItem.v0.json b/Projects/UOContent/Migrations/Server.PowerFactionItem.v0.json new file mode 100644 index 000000000..536410c69 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.PowerFactionItem.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.PowerFactionItem" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.StormsEye.v0.json b/Projects/UOContent/Migrations/Server.StormsEye.v0.json new file mode 100644 index 000000000..a7e6f1993 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.StormsEye.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.StormsEye" +} \ No newline at end of file diff --git a/Projects/UOContent/Migrations/Server.UrnOfAscension.v0.json b/Projects/UOContent/Migrations/Server.UrnOfAscension.v0.json new file mode 100644 index 000000000..ea39fcd58 --- /dev/null +++ b/Projects/UOContent/Migrations/Server.UrnOfAscension.v0.json @@ -0,0 +1,4 @@ +{ + "version": 0, + "type": "Server.UrnOfAscension" +} \ No newline at end of file