From a994b6144581968eb52776a323084345731769b9 Mon Sep 17 00:00:00 2001 From: WarrentyExpired Date: Fri, 9 Oct 2026 18:15:30 -0400 Subject: [PATCH] #W# Cleanup: Removed default OSI MLQuests. --- Distribution/Data/MLQuests.cfg | 5 +- .../ML Quests/Definitions/AGhostOfCovetous.cs | 196 - .../ML Quests/Definitions/BaseEscort.cs | 20 - .../Engines/ML Quests/Definitions/Bedlam.cs | 156 - .../ML Quests/Definitions/BlightedGrove.cs | 235 - .../ML Quests/Definitions/Britannia.cs | 163 - .../ML Quests/Definitions/Heartwood.cs | 3908 ----------------- .../Engines/ML Quests/Definitions/Heritage.cs | 571 --- .../ML Quests/Definitions/HonestBeggar.cs | 107 - .../Engines/ML Quests/Definitions/Ilshenar.cs | 256 -- .../ML Quests/Definitions/IronForTheForge.cs | 30 +- .../ML Quests/Definitions/LostItems.cs | 49 - .../Engines/ML Quests/Definitions/Malas.cs | 61 - .../ML Quests/Definitions/MistakenIdentity.cs | 304 -- .../Engines/ML Quests/Definitions/NewHaven.cs | 125 - .../Definitions/NewHavenSkillTraining.cs | 1865 -------- .../ML Quests/Definitions/NewHavenTraining.cs | 773 ---- .../ML Quests/Definitions/Sanctuary.cs | 1201 ----- .../ML Quests/Definitions/Spellweaving.cs | 667 --- .../ML Quests/Definitions/TheAncientWorld.cs | 133 - .../ML Quests/Definitions/TownEscorts.cs | 131 - .../ML Quests/Definitions/UnfadingMemories.cs | 138 - .../Definitions/WarriorsOfTheGemKeeper.cs | 95 - .../Engines/ML Quests/Items/ABauble.cs | 12 - .../Items/APersonalLetterAddressedToAhie.cs | 21 - .../ML Quests/Items/AlchemistsBandage.cs | 24 - .../Engines/ML Quests/Items/AnOldNecklace.cs | 12 - .../Engines/ML Quests/Items/AnOldRing.cs | 12 - .../Engines/ML Quests/Items/AndricSatchel.cs | 15 - .../ML Quests/Items/AndrosGratitude.cs | 12 - .../Engines/ML Quests/Items/AsandosSatchel.cs | 15 - .../Items/BasinOfCrystalClearWater.cs | 20 - .../ML Quests/Items/BedlamTeleporter.cs | 34 - .../Engines/ML Quests/Items/Bleach.cs | 12 - .../Engines/ML Quests/Items/BridesLetter.cs | 20 - .../CompletedTuitionReimbursementForm.cs | 20 - .../ML Quests/Items/CraftmansSatchel.cs | 130 - .../Engines/ML Quests/Items/CrateForSledge.cs | 21 - .../ML Quests/Items/DreadSpiderSilk.cs | 24 - .../Engines/ML Quests/Items/FragmentOfAMap.cs | 12 - .../ML Quests/Items/FragmentOfAMapDelivery.cs | 20 - .../Items/FriendOfTheLibraryToken.cs | 16 - .../Items/FriendsOfTheLibraryApplication.cs | 20 - .../Engines/ML Quests/Items/GamanHorns.cs | 18 - .../Engines/ML Quests/Items/GervisSatchel.cs | 15 - .../Engines/ML Quests/Items/GiftForArielle.cs | 21 - .../ML Quests/Items/HargroveSatchel.cs | 15 - .../Engines/ML Quests/Items/KirinBrains.cs | 16 - .../Engines/ML Quests/Items/LowelSatchel.cs | 15 - .../ML Quests/Items/MiniatureMushroom.cs | 12 - .../ML Quests/Items/MirrorOfPurification.cs | 16 - .../Engines/ML Quests/Items/MuggSatchel.cs | 15 - .../Engines/ML Quests/Items/NibbetSatchel.cs | 30 - .../ML Quests/Items/NotarizedApplication.cs | 20 - .../ML Quests/Items/OfficialSealingWax.cs | 24 - .../ML Quests/Items/PeppercornFishsteak.cs | 12 - .../Engines/ML Quests/Items/PixieLeg.cs | 16 - .../ML Quests/Items/PortraitOfTheBride.cs | 20 - .../Engines/ML Quests/Items/PrismaticAmber.cs | 63 - .../ML Quests/Items/PrismaticCrystal.cs | 53 - .../Engines/ML Quests/Items/RedLeatherBook.cs | 10 - .../Engines/ML Quests/Items/ReginasLetter.cs | 20 - .../Engines/ML Quests/Items/ReginasRing.cs | 20 - .../Engines/ML Quests/Items/RewardBags.cs | 109 - .../Engines/ML Quests/Items/SadrahSatchel.cs | 15 - .../Engines/ML Quests/Items/SapOfSosaria.cs | 17 - .../ML Quests/Items/SealedNotesForJamal.cs | 21 - .../Items/SealingWaxOrderAddressedToPetrus.cs | 20 - .../Engines/ML Quests/Items/SeveredElfEars.cs | 15 - .../ML Quests/Items/SeveredHumanEars.cs | 15 - .../Items/SignedTuitionReimbursementForm.cs | 20 - .../ML Quests/Items/SpecialTreatForDrithen.cs | 16 - .../ML Quests/Items/SpeckledPoisonSac.cs | 13 - .../Engines/ML Quests/Items/SpiritBottle.cs | 20 - .../Engines/ML Quests/Items/StoutWhip.cs | 12 - .../ML Quests/Items/TaintedTreeSample.cs | 24 - .../ML Quests/Items/TransparentHeart.cs | 16 - .../Items/TuitionReimbursementForm.cs | 20 - .../Engines/ML Quests/Items/UnicornRibs.cs | 18 - .../ML Quests/Mobiles/BoonCollector.cs | 387 -- .../Engines/ML Quests/Mobiles/SirHelper.cs | 128 - .../Engines/ML Quests/Rewards/ItemReward.cs | 2 + Projects/UOContent/Items/BountyToken.cs | 23 - .../UOContent/Mobiles/Animals/Misc/Gaman.cs | 1 - .../UOContent/Mobiles/Animals/Mounts/Kirin.cs | 5 - .../Mobiles/Animals/Mounts/Unicorn.cs | 5 - Projects/UOContent/Mobiles/BountyVendor.cs | 141 - .../Mobiles/Healers/EvilWanderingHealer.cs | 5 - .../Monsters/Humanoid/Melee/Brigand.cs | 5 - .../Monsters/Humanoid/Melee/ElfBrigand.cs | 5 - .../Monsters/Humanoid/Melee/OrcCaptain.cs | 6 - .../Mobiles/Monsters/Misc/Magic/Pixie.cs | 5 - .../Mobiles/NewbieDungeon/CowardlyBrigaind.cs | 5 - .../Mobiles/Townfolk/BaseEscortable.cs | 4 + 94 files changed, 24 insertions(+), 13166 deletions(-) delete mode 100644 Projects/UOContent/Engines/ML Quests/Definitions/AGhostOfCovetous.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Definitions/BaseEscort.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Definitions/Bedlam.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Definitions/BlightedGrove.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Definitions/Britannia.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Definitions/Heartwood.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Definitions/Heritage.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Definitions/HonestBeggar.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Definitions/Ilshenar.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Definitions/LostItems.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Definitions/Malas.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Definitions/MistakenIdentity.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Definitions/NewHaven.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Definitions/NewHavenSkillTraining.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Definitions/NewHavenTraining.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Definitions/Sanctuary.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Definitions/Spellweaving.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Definitions/TheAncientWorld.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Definitions/TownEscorts.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Definitions/UnfadingMemories.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Definitions/WarriorsOfTheGemKeeper.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/ABauble.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/APersonalLetterAddressedToAhie.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/AlchemistsBandage.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/AnOldNecklace.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/AnOldRing.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/AndricSatchel.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/AndrosGratitude.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/AsandosSatchel.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/BasinOfCrystalClearWater.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/BedlamTeleporter.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/Bleach.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/BridesLetter.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/CompletedTuitionReimbursementForm.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/CraftmansSatchel.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/CrateForSledge.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/DreadSpiderSilk.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/FragmentOfAMap.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/FragmentOfAMapDelivery.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/FriendOfTheLibraryToken.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/FriendsOfTheLibraryApplication.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/GamanHorns.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/GervisSatchel.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/GiftForArielle.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/HargroveSatchel.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/KirinBrains.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/LowelSatchel.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/MiniatureMushroom.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/MirrorOfPurification.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/MuggSatchel.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/NibbetSatchel.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/NotarizedApplication.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/OfficialSealingWax.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/PeppercornFishsteak.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/PixieLeg.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/PortraitOfTheBride.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/PrismaticAmber.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/PrismaticCrystal.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/RedLeatherBook.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/ReginasLetter.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/ReginasRing.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/RewardBags.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/SadrahSatchel.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/SapOfSosaria.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/SealedNotesForJamal.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/SealingWaxOrderAddressedToPetrus.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/SeveredElfEars.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/SeveredHumanEars.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/SignedTuitionReimbursementForm.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/SpecialTreatForDrithen.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/SpeckledPoisonSac.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/SpiritBottle.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/StoutWhip.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/TaintedTreeSample.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/TransparentHeart.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/TuitionReimbursementForm.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Items/UnicornRibs.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Mobiles/BoonCollector.cs delete mode 100644 Projects/UOContent/Engines/ML Quests/Mobiles/SirHelper.cs delete mode 100644 Projects/UOContent/Items/BountyToken.cs delete mode 100644 Projects/UOContent/Mobiles/BountyVendor.cs diff --git a/Distribution/Data/MLQuests.cfg b/Distribution/Data/MLQuests.cfg index 8db2212ca..7cf425d8e 100644 --- a/Distribution/Data/MLQuests.cfg +++ b/Distribution/Data/MLQuests.cfg @@ -1,4 +1 @@ -#IronForTheForge -#DestardDrakeBounty -#DungeonBountyBoard -#DeceitSkeletalKnightBounty +IronForTheForge diff --git a/Projects/UOContent/Engines/ML Quests/Definitions/AGhostOfCovetous.cs b/Projects/UOContent/Engines/ML Quests/Definitions/AGhostOfCovetous.cs deleted file mode 100644 index 7b64c7f3b..000000000 --- a/Projects/UOContent/Engines/ML Quests/Definitions/AGhostOfCovetous.cs +++ /dev/null @@ -1,196 +0,0 @@ -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; - -public class AGhostOfCovetous : MLQuest -{ - 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; - - 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); -} - -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/BaseEscort.cs b/Projects/UOContent/Engines/ML Quests/Definitions/BaseEscort.cs deleted file mode 100644 index 761d63da0..000000000 --- a/Projects/UOContent/Engines/ML Quests/Definitions/BaseEscort.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace Server.Engines.MLQuests.Definitions -{ - // Base class for escorts providing the AwardHumanInNeed option - public class BaseEscort : MLQuest - { - public BaseEscort() => CompletionNotice = CompletionNoticeShort; - - public virtual bool AwardHumanInNeed => true; - - public override void GetRewards(MLQuestInstance instance) - { - if (AwardHumanInNeed) - { - HumanInNeed.AwardTo(instance.Player); - } - - base.GetRewards(instance); - } - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Definitions/Bedlam.cs b/Projects/UOContent/Engines/ML Quests/Definitions/Bedlam.cs deleted file mode 100644 index 4d49085fe..000000000 --- a/Projects/UOContent/Engines/ML Quests/Definitions/Bedlam.cs +++ /dev/null @@ -1,156 +0,0 @@ -using ModernUO.Serialization; -using Server.Engines.MLQuests.Objectives; -using Server.Engines.MLQuests.Rewards; -using Server.Items; -using Server.Mobiles; - -namespace Server.Engines.MLQuests.Definitions; - -public class Momento : MLQuest -{ - 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. - - 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)")] -[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/BlightedGrove.cs b/Projects/UOContent/Engines/ML Quests/Definitions/BlightedGrove.cs deleted file mode 100644 index 1892da723..000000000 --- a/Projects/UOContent/Engines/ML Quests/Definitions/BlightedGrove.cs +++ /dev/null @@ -1,235 +0,0 @@ -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 -{ - public class VilePoison : MLQuest - { - public VilePoison() - { - Activated = true; - Title = 1074950; // Vile Poison - Description = - 1074956; // Heya! I'm sure glad to see you. Listen I'm in a bit of a bind here. I'm supposed to be gathering poisoned water at the base of that corrupted tree there, but I can't get in under the roots to get a good sample. The branches and brush are so tainted that they can't be cut, burned or even magically passed. It's put my work at a real standstill. If you help me out, I'll help you get in there too. Whadda ya say? - RefusalMessage = 1074964; // Okay. If you change your mind, I'll probably still be stuck here trying to get in. - InProgressMessage = 1074968; // My friend, Iosep, is a weaponsmith in Jhelom. If anyone can help us, he can! - CompletionMessage = - 1074991; // Greetings. What have you there? Ah, a sample from a poisonous tree, you say? My friend Jamal sent you? Well, let me see that then, and we'll get to work. - - Objectives.Add(new DeliverObjective(typeof(TaintedTreeSample), 1, "tainted tree sample", typeof(Iosep))); - - Rewards.Add(new DummyReward(1074962)); // A step closer to entering Blighted Grove. - } - - public override Type NextQuest => typeof(ARockAndAHardPlace); - } - - public class ARockAndAHardPlace : MLQuest - { - public ARockAndAHardPlace() - { - Activated = true; - Title = 1074951; // A Rock and a Hard Place - Description = - 1074957; // This is some nasty stuff, that's for certain. I don't even want to think about what sort of blight caused this venomous reaction from that old tree. Let's get to work … we'll need to try something really hard but still workable as our base material. Nothing's harder than stone and diamond. Let's try them first. - RefusalMessage = 1074965; // Sure, no problem. I thought you were interested in figuring this out. - InProgressMessage = - 1074969; // If you're a miner, you should have no trouble getting that stuff. If not, you can probably buy some samples from a miner? - CompletionMessage = - 1074992; // Have you got the granite and diamonds? Great, let me see them and we'll see what effect this venom has upon them. - - // Any type of granite works - Objectives.Add(new CollectObjective(4, typeof(BaseGranite), 1026009)); // rock - Objectives.Add(new CollectObjective(2, typeof(BlueDiamond), 1032696)); // Blue Diamond - - Rewards.Add(new DummyReward(1074962)); // A step closer to entering Blighted Grove. - } - - public override Type NextQuest => typeof(SympatheticMagic); - public override bool IsChainTriggered => true; - } - - public class SympatheticMagic : MLQuest - { - public SympatheticMagic() - { - Activated = true; - Title = 1074952; // Sympathetic Magic - Description = - 1074958; // Hmm, I've never even heard of something that can damage diamond like that. I guess we'll have to go with plan B. Let's try something similar. Sometimes there's a natural immunity to be found when you use a substance that's like the one you're trying to cut. A sort of "sympathetic" thing. Y'know? - RefusalMessage = 1074965; // Sure, no problem. I thought you were interested in figuring this out. - InProgressMessage = 1074970; // I think a lumberjack can help supply bark. - CompletionMessage = 1074993; // You're back with the bark already? Terrific! I bet this will do the trick. - - Objectives.Add(new CollectObjective(10, typeof(BarkFragment), 1032687)); // Bark Fragment - - Rewards.Add(new DummyReward(1074962)); // A step closer to entering Blighted Grove. - } - - public override Type NextQuest => typeof(AlreadyDead); - public override bool IsChainTriggered => true; - } - - public class AlreadyDead : MLQuest - { - public AlreadyDead() - { - Activated = true; - Title = 1074953; // Already Dead - Description = - 1074959; // Amazing! The bark was reduced to ash in seconds. Whatever this taint is, it plays havok with living things. And of course, it took the edge off both diamonds and granite even faster. What we need is something workable but dead; something that can hold an edge without melting. See what you can come up with, please. - RefusalMessage = 1074965; // Sure, no problem. I thought you were interested in figuring this out. - InProgressMessage = - 1074971; // I'm thinking we need something fairly brittle or it won't hold an edge. And, it can't be alive, of course. - CompletionMessage = 1074994; // Great thought! Bone might just do the trick. - - Objectives.Add(new InternalObjective()); - - Rewards.Add(new DummyReward(1074962)); // A step closer to entering Blighted Grove. - } - - public override Type NextQuest => typeof(Eureka); - public override bool IsChainTriggered => true; - - private class InternalObjective : CollectObjective - { - public InternalObjective() - : base(10, typeof(Bone), 1074963) // (10) workable samples - { - } - - public override bool ShowDetailed => false; - } - } - - public class Eureka : MLQuest - { - public Eureka() - { - Activated = true; - Title = 1074954; // Eureka! - Description = - 1074960; // We're in business! I've put together the instructions for chopping sort of sword, in the style of one of those new-fangled elven machetes. Take those back to Jamal for me, if you would. - RefusalMessage = 1074966; // Well, okay. I guess I thought you'd want to see this through. - InProgressMessage = - 1074972; // I'm sure Jamal is eager to get this information. He's probably still hanging around near that big old blighted tree. - CompletionMessage = 1074995; // Heya! You're back. Was Iosep able to help? Let me see what he's sent. - - Objectives.Add(new DeliverObjective(typeof(SealedNotesForJamal), 1, "sealed note for Jamal", typeof(Jamal))); - - Rewards.Add(new DummyReward(1074962)); // A step closer to entering Blighted Grove. - } - - public override Type NextQuest => typeof(SubContracting); - public override bool IsChainTriggered => true; - - public override void GetRewards(MLQuestInstance instance) - { - var pm = instance.Player; - - if (!pm.HasRecipe(32)) - { - // The ability is awarded regardless of blacksmithy skill - pm.AcquireRecipe(32); - - if (pm.Skills.Blacksmith.Base < 45.0) // TODO: Verify threshold - { - // You observe carefully but you can't grasp the complexities of smithing a bone handled machete. - pm.SendLocalizedMessage(1075005); - } - else - { - pm.SendLocalizedMessage(1075006); // You have learned how to smith a bone handled machete! - } - } - - base.GetRewards(instance); - } - } - - public class SubContracting : MLQuest - { - public SubContracting() - { - Activated = true; - Title = 1074955; // Sub Contracting - Description = - 1074961; // Wonderful! Now we can both get in there! Let me show you these instructions for making this machete. If you're not skilled in smithing, I'm not sure how much sense it will make though. Listen, if you're heading in there anyway … maybe you'd do me one more favor? I'm ah ... buried in work out here ... so if you'd go in and get me a few water samples, I'd be obliged. - RefusalMessage = 1074967; // Oh. Right, I guess you're really ... ah ... busy too. - InProgressMessage = - 1074973; // Once you're inside, look for places where the water has twisted and warped the natural creatures. - CompletionMessage = - 1074996; // I hear sloshing ... that must mean you've got my water samples. Whew, I'm so glad you braved the dangers in there ... I mean, I would have but I'm so busy out here. Here's your reward! - - // On OSI the label is "#1074999" - Objectives.Add(new CollectObjective(3, typeof(SamplesOfCorruptedWater), "samples of corrupted water")); - // TODO: "Return to" should say "Jamal (near Blighted Grove)" - // Maybe every quest NPC has directions as a property? - - Rewards.Add(ItemReward.LargeBagOfTreasure); - } - - public override bool IsChainTriggered => true; - } - - [QuesterName("Jamal (near Blighted Grove)")] - [SerializationGenerator(0, false)] - public partial class Jamal : BaseCreature - { - [Constructible] - public Jamal() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Fisherman"; - Body = 400; - Hue = Race.RandomSkinHue(); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - Utility.AssignRandomFacialHair(this, HairHue); - - AddItem(new Shirt(0x1BB)); - AddItem(new ShortPants(Utility.RandomNeutralHue())); - AddItem(new ThighBoots(Utility.RandomAnimalHue())); - AddItem(new Backpack()); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Jamal"; - } - - [QuesterName("Iosep (Jhelom)")] - [SerializationGenerator(0, false)] - public partial class Iosep : BaseCreature - { - - [Constructible] - public Iosep() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Exporter"; - Body = 400; - Hue = Race.RandomSkinHue(); - InitStats(100, 100, 25); - - AddItem(new FancyShirt(Utility.RandomBlueHue())); - AddItem(new LongPants(0x1BB)); - AddItem(new Shoes(Utility.RandomNeutralHue())); - AddItem(new Backpack()); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Iosep"; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - // Hey, could you help me out with something? - // Don’t test my patience you sniveling worm! - MLQuestSystem.Tell(this, pm, Utility.RandomBool() ? 1074209 : 1074215 ); - } - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Definitions/Britannia.cs b/Projects/UOContent/Engines/ML Quests/Definitions/Britannia.cs deleted file mode 100644 index 3636bf356..000000000 --- a/Projects/UOContent/Engines/ML Quests/Definitions/Britannia.cs +++ /dev/null @@ -1,163 +0,0 @@ -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 -{ - public class Aemaeth1 : MLQuest - { - public Aemaeth1() - { - Activated = true; - Title = 1075321; // Aemaeth - Description = - 1075322; // My father died in an accident some months ago. My mother refused to accept his death. We had a little money set by, and she took it to a necromancer, who promised to restore my father to life. Well, he revived my father, all right, the cheat! Now my father is a walking corpse, a travesty . . . a monster. My mother is beside herself -- she won't eat, she can't sleep. I prayed at the shrine of Spirituality for guidance, and I must have fallen asleep. When I awoke, there was this basin of clear water. I cannot leave my mother, for I fear what she might do to herself. Could you take this to the graveyard, and give it to what is left of my father? - RefusalMessage = - 1075324; // Oh! Alright then. I hope someone comes along soon who can help me, or I dont know what will become of us. - InProgressMessage = - 1075325; // My father - or what remains of him - can be found in the graveyard northwest of the city. - CompletionMessage = 1075326; // What is this you give me? A basin of water? - CompletionNotice = CompletionNoticeShort; - - Objectives.Add( - new DeliverObjective( - typeof(BasinOfCrystalClearWater), - 1, - "Basin of Crystal Clear Water", - typeof(SkeletonOfSzandor) - ) - ); - - Rewards.Add(new DummyReward(1075323)); // Aurelia's gratitude. - } - - public override Type NextQuest => typeof(Aemaeth2); - } - - public class Aemaeth2 : MLQuest - { - public Aemaeth2() - { - Activated = true; - OneTimeOnly = true; - Title = 1075327; // Aemaeth - Description = - 1075328; // You tell me it is time to leave this flesh. I did not understand until now. I thought: I can see my wife and my daughter, I can speak. Is this not life? But now, as I regard my reflection, I see what I have become. This only a mockery of life. Thank you for having the courage to show me the truth. For the love I bear my wife and daughter, I know now that I must pass beyond the veil. Will you return this basin to Aurelia? She will know by this that I am at rest. - RefusalMessage = - 1075330; // You wont take this back to my daughter? Please, I cannot leave until she knows I am at peace. - InProgressMessage = 1075331; // My daughter will be at my home, on the east side of the city. - CompletionMessage = - 1075332; // Thank goodness! Now we can honor my father for the great man he was while he lived, rather than the horror he became. - CompletionNotice = CompletionNoticeShort; - - Objectives.Add( - new DeliverObjective( - typeof(BasinOfCrystalClearWater), - 1, - "Basin of Crystal Clear Water", - typeof(Aurelia) - ) - ); - - Rewards.Add(new ItemReward(1075304, typeof(MirrorOfPurification))); // Mirror of Purification - } - - public override bool IsChainTriggered => true; - } - - public class OddsAndEnds : MLQuest - { - public OddsAndEnds() - { - Activated = true; - Title = 1074354; // Odds and Ends - Description = - 1074677; // I've always been fascinated by primitive cultures -- especially the artifacts. I'm a collector, you see. I'm working on building my troglodyte display and I'm saddened to say that I'm short on examples of religion and superstition amongst the creatures. If you come across any primitive fetishes, I'd be happy to trade you something interesting for them. - RefusalMessage = 1072270; // Well, okay. But if you decide you are up for it after all, c'mon back and see me. - InProgressMessage = - 1074678; // I don't really want to know where you get the primitive fetishes, as I can't support the destruction of their lifestyle and culture. That would be wrong. - CompletionMessage = 1074679; // Bravo! These fetishes are just what I needed. You've earned this reward. - - Objectives.Add(new CollectObjective(12, typeof(PrimitiveFetish), "Primitive Fetishes")); - - Rewards.Add(ItemReward.BagOfTreasure); - } - } - - public class EmbracingHumanity : MLQuest - { - public EmbracingHumanity() - { - Activated = true; - OneTimeOnly = true; // OSI has no limit or delay, VERY exploitable - Title = 1074349; // Embracing Humanity - Description = - 1074357; // Well, I don't mind saying it -- I'm flabbergasted! Absolutely astonished. I just heard that some elves want to convert themselves to humans through some magical process. My cousin Nedrick does whatever needs doing. I guess you could check it out for yourself if you're curious. Anyway, I wonder if you'll bring my cousin, Drithen, this here treat my wife baked up for him special. - RefusalMessage = 1074459; // That's okay, I'll find someone else to make the delivery. - InProgressMessage = 1074460; // If I knew where my cousin was, I'd make the delivery myself. - CompletionMessage = 1074461; // Oh, hello there. What do you have for me? - - Objectives.Add(new DeliverObjective(typeof(SpecialTreatForDrithen), 1, "treat for Drithen", typeof(Drithen))); - - Rewards.Add(ItemReward.BagOfTreasure); - } - } - - [SerializationGenerator(0, false)] - public partial class Aurelia : BaseCreature - { - [Constructible] - public Aurelia() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Architect's Daughter"; - 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.RandomPinkHue())); - - if (Utility.RandomBool()) - { - AddItem(new Kilt(Utility.RandomPinkHue())); - } - else - { - AddItem(new Skirt(Utility.RandomPinkHue())); - } - - AddItem(new FancyShirt(Utility.RandomRedHue())); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Aurelia"; - } - - [QuesterName("Szandor")] - [SerializationGenerator(0, false)] - public partial class SkeletonOfSzandor : BaseCreature - { - [Constructible] - public SkeletonOfSzandor() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Late Architect"; - Hue = 0x83F2; // TODO: Random human hue? Why??? - Body = 0x32; - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Skeleton of Szandor"; - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Definitions/Heartwood.cs b/Projects/UOContent/Engines/ML Quests/Definitions/Heartwood.cs deleted file mode 100644 index 4bf21fdf0..000000000 --- a/Projects/UOContent/Engines/ML Quests/Definitions/Heartwood.cs +++ /dev/null @@ -1,3908 +0,0 @@ -using ModernUO.Serialization; -using Server.Engines.MLQuests.Objectives; -using Server.Engines.MLQuests.Rewards; -using Server.Items; -using Server.Mobiles; - -namespace Server.Engines.MLQuests.Definitions; - -public class TheyreBreedingLikeRabbits : MLQuest -{ - public TheyreBreedingLikeRabbits() - { - Activated = true; - Title = 1072244; // They're Breeding Like Rabbits - // Aaaahhhh! They're everywhere! Aaaaahhh! Ahem. Actually, friend, how do you feel about rabbits? - // Well, we're being overrun by them. We're finding fuzzy bunnies everywhere. Aaaaahhh! - Description = 1072259; - 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(Rabbit) }, "rabbits")); - - Rewards.Add(ItemReward.SmallBagOfTrinkets); - } -} - -public class TheyllEatAnything : MLQuest -{ - public TheyllEatAnything() - { - Activated = true; - Title = 1072248; // They'll Eat Anything - // Pork is the fruit of the land! You can barbeque it, boil it, bake it, sautee it. - // There's pork kebabs, pork creole, pork gumbo, pan fried, deep fried, stir fried. - // There's apple pork, peppered pork, pork soup, pork salad, pork and potatoes, pork burger, pork sandwich, - // pork stew, pork chops, pork loins, shredded pork. So, lets get some piggies butchered! - Description = 1072262; - 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(Pig) }, "pigs")); - - Rewards.Add(ItemReward.SmallBagOfTrinkets); - } -} - -public class NoGoodFishStealing : MLQuest -{ - public NoGoodFishStealing() - { - Activated = true; - Title = 1072251; // No Good, Fish Stealing ... - // Mighty creatures they are, aye. - // Fierce and strong, can't blame 'em for wanting to feed themselves an' all. - // Blame or no, they're eating all the fish up, so they got to go. Lend a hand? - Description = 1072265; - 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(Walrus) }, "walruses")); - - Rewards.Add(ItemReward.SmallBagOfTrinkets); - } -} - -public class AHeroInTheMaking : MLQuest -{ - public AHeroInTheMaking() - { - Activated = true; - Title = 1072246; // A Hero in the Making - // Are you new around here? Well, nevermind that. - // You look ready for adventure, I can see the gleam of glory in your eyes! - // Nothing is more valiant, more noble, more praiseworthy than mongbat slaying. - Description = 1072257; - 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(Mongbat) }, "mongbats")); - - Rewards.Add(ItemReward.SmallBagOfTrinkets); - } -} - -public class BullfightingSortOf : MLQuest -{ - public BullfightingSortOf() - { - Activated = true; - Title = 1072247; // Bullfighting ... Sort Of - // You there! Yes, you. Listen, I've got a little problem on my hands, but a brave, - // bold hero like yourself should find it a snap to solve. - // Bottom line -- we need some of the bulls in the area culled. - // You're welcome to any meat or hides, and of course, I'll give you a nice reward. - Description = 1072254; - 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(Bull) }, "bulls")); - - Rewards.Add(ItemReward.SmallBagOfTrinkets); - } -} - -public class AFineFeast : MLQuest -{ - public AFineFeast() - { - Activated = true; - Title = 1072243; // A Fine Feast. - // Mmm, I do love mutton! It's slaughtering time again and my usual hirelings haven't turned up. - // I've arranged for a butcher to come by and cut everything up but the basic sheep killing part - // I haven't gotten worked out yet. Are you up for the task? - Description = 1072261; - 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(Sheep) }, "sheep")); - - Rewards.Add(ItemReward.SmallBagOfTrinkets); - } -} - -public class ForcedMigration : MLQuest -{ - public ForcedMigration() - { - Activated = true; - Title = 1072250; // Forced Migration - // Chirp chirp ... tweet chirp. Tra la la. Bloody birds and their blasted noise. - // I've tried everything but they just won't stop that infernal clamor. - // Return me to blessed silence and I'll make it worth your while. - Description = 1072264; - 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(Bird) }, "birds")); - - Rewards.Add(ItemReward.SmallBagOfTrinkets); - } -} - -public class FilthyPests : MLQuest -{ - public FilthyPests() - { - Activated = true; - Title = 1072242; // Filthy Pests! - // They're everywhere I tell you! They crawl in the walls, they scurry in the bushes. - // Disgusting critters. Say ... I don't suppose you're up for some sewer rat killing? - // Sewer rats now, not any other kind of squeaker will do. - Description = 1072253; - 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(SewerRat) }, "sewer rats")); - - Rewards.Add(ItemReward.SmallBagOfTrinkets); - } -} - -public class DeadManWalking : MLQuest -{ - public DeadManWalking() - { - Activated = true; - Title = 1072983; // Dead Man Walking - // Why? I ask you why? They walk around after they're put in the ground. - // It's just wrong in so many ways. Put them to proper rest, I beg you. - // I'll find some way to pay you for the kindness. Just kill five zombies and five skeletons. - Description = 1073009; - 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(5, new[] { typeof(Zombie) }, "zombies")); - Objectives.Add(new KillObjective(5, new[] { typeof(Skeleton) }, "skeletons")); - - Rewards.Add(ItemReward.BagOfTrinkets); - } -} - -public class KingOfBears : MLQuest -{ - public KingOfBears() - { - Activated = true; - Title = 1072996; // King of Bears - // A pity really. With the balance of nature awry, we have no choice but to accept the responsibility - // of making it all right. It's all a part of the circle of life, after all. So, yes, the grizzly bears are - // running rampant. There are far too many in the region. Will you shoulder your obligations as a higher life form? - Description = 1073030; - 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(GrizzlyBear) }, "grizzly bears")); - - Rewards.Add(ItemReward.BagOfTrinkets); - } -} - -public class Specimens : MLQuest -{ - public Specimens() - { - Activated = true; - Title = 1072999; // Specimens - // I admire them, you know. The solen have their place -- regimented, organized. - // They're fascinating to watch with their constant strife between red and black. - // I can't help but want to stir things up from time to time. And that's where you come in. - // Kill either twelve red or twelve black solen workers and let's see what happens next! - Description = 1073032; - 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! - - ObjectiveType = ObjectiveType.Any; - - Objectives.Add(new KillObjective(12, new[] { typeof(RedSolenWorker) }, "red solen workers")); - Objectives.Add(new KillObjective(12, new[] { typeof(BlackSolenWorker) }, "black solen workers")); - - Rewards.Add(ItemReward.BagOfTrinkets); - } -} - -public class Spirits : MLQuest -{ - public Spirits() - { - Activated = true; - Title = 1073076; // Spirits - // It is a piteous thing when the dead continue to walk the earth. - // Restless spirits are known to inhabit these parts, taking the lives of unwary travelers. - // It is about time a hero put the dead back in their graves. I'm sure such a hero would be justly rewarded. - Description = 1073566; - RefusalMessage = 1073580; // I hope you'll reconsider. Until then, farwell. - InProgressMessage = 1073586; // The restless spirts still walk -- you must kill 15 of them. - - Objectives.Add( - new KillObjective( - 15, - new[] { typeof(Spectre), typeof(Shade), typeof(Wraith) }, - "spectres or shades or wraiths" - ) - ); - - Rewards.Add(ItemReward.BagOfTreasure); - } -} - -public class RollTheBones : MLQuest -{ - public RollTheBones() - { - Activated = true; - Title = 1073002; // Roll the Bones - // Why? I ask you why? They walk around after they're put in the ground. - // It's just wrong in so many ways. Put them to proper rest, I beg you. - // I'll find some way to pay you for the kindness. Just kill eight patchwork skeletons. - Description = 1073011; - 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(8, new[] { typeof(PatchworkSkeleton) }, "patchwork skeletons")); - - Rewards.Add(ItemReward.BagOfTrinkets); - } -} - -public class ItsAGhastlyJob : MLQuest -{ - public ItsAGhastlyJob() - { - Activated = true; - Title = 1073008; // It's a Ghastly Job - // Why? I ask you why? They walk around after they're put in the ground. - // It's just wrong in so many ways. Put them to proper rest, I beg you. - // I'll find some way to pay you for the kindness. Just kill twelve ghouls. - Description = 1073012; - 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(Ghoul) }, "ghouls")); - - Rewards.Add(ItemReward.BagOfTrinkets); - } -} - -public class Troglodytes : MLQuest -{ - public Troglodytes() - { - Activated = true; - Title = 1074688; // Troglodytes! - // Oh nevermind, you don't look capable of my task afterall. - // Haha! What was I thinking - you could never handle killing troglodytes. - // It'd be suicide. What? I don't know, I don't want to be responsible ... well okay if you're really sure? - Description = 1074689; - RefusalMessage = 1074690; // Probably the wiser course of action. - InProgressMessage = 1074691; // You still need to kill those troglodytes, remember? - - Objectives.Add(new KillObjective(12, new[] { typeof(Troglodyte) }, "troglodytes")); - - Rewards.Add(ItemReward.BagOfTrinkets); - } -} - -public class UnholyKnights : MLQuest -{ - public UnholyKnights() - { - Activated = true; - Title = 1073075; // Unholy Knights - // Please, hear me kind traveler. You know when a knight falls, sometimes they are cursed to roam the earth as - // undead mockeries of their former glory? That is too grim a fate for even any knight to suffer! - // Please, put them out of their misery. - // I will offer you what payment I can if you will end the torment of these undead wretches. - Description = 1073565; - RefusalMessage = 1073580; // I hope you'll reconsider. Until then, farwell. - InProgressMessage = 1073585; // Your task is not done. Continue putting the Skeleton and Bone Knights to rest. - - Objectives.Add( - new KillObjective( - 16, - new[] { typeof(BoneKnight), typeof(SkeletalKnight) }, - "bone knights or skeletal knights" - ) - ); - - Rewards.Add(ItemReward.BagOfTreasure); - } -} - -public class AFeatherInYerCap : MLQuest -{ - public AFeatherInYerCap() - { - Activated = true; - Title = 1074738; // A Feather in Yer Cap - // I've seen how you strut about, as if you were something special. - // I have some news for you, you don't impress me at all. It's not enough to have a fancy hat you know. - // That may impress people in the big city, but not here. If you want a reputation you have to climb a mountain, - // slay some great beast, and then write about it. Trust me, it's a long process. - // The first step is doing a great feat. If I were you, I'd go pluck a feather from the harpy Saliva, - // that would give you a good start. - Description = 1074737; - RefusalMessage = 1074736; // The path to greatness isn't for everyone obviously. - // If you're going to get anywhere in the adventuring game, you have to take some risks. - // A harpy, well, it's bad, but it's not a dragon. - InProgressMessage = 1074735; - CompletionMessage = 1074734; // The hero returns from the glorious battle and - oh, such a small feather? - - Objectives.Add(new CollectObjective(1, typeof(SalivasFeather), "Saliva's Feather")); - - Rewards.Add(ItemReward.BagOfTreasure); - } -} - -public class ATaleOfTail : MLQuest -{ - public ATaleOfTail() - { - Activated = true; - Title = 1074726; // A Tale of Tail - // I've heard of you, adventurer. Your reputation is impressive, and now I'll put it to the test. - // This is not something I ask lightly, for this task is fraught with danger, but it is vital. - // Seek out the vile hydra Abscess, slay it, and return to me with it's tail. - Description = 1074727; - RefusalMessage = 1074728; // Well, the beast will still be there when you are ready I suppose. - // Em, I thought I had explained already. Abscess, the hydra, you know? Lots of heads but just the one tail. - // I need the tail. I have my reasons. Go go go. - InProgressMessage = 1074729; - // Ah, the tail. You did it! You know the rumours about dried ground hydra tail powder are all true?\ - // Thank you so much! - CompletionMessage = 1074730; - - Objectives.Add(new CollectObjective(1, typeof(AbscessTail), "Abscess' Tail")); - - Rewards.Add(ItemReward.BagOfTreasure); - } -} - -public class ATrogAndHisDog : MLQuest -{ - public ATrogAndHisDog() - { - Activated = true; - Title = 1074681; // A Trog and His Dog - // I don't know if you can handle it, but I'll give you a go at it. - // Troglodyte chief - name of Lurg and his mangy wolf pet need killing. Do the deed and I'll reward you. - Description = 1074680; - RefusalMessage = 1074655; // Perhaps I thought too highly of you. - // The trog chief and his mutt should be easy enough to find. Just kill them and report back. - // Easy enough. - InProgressMessage = 1074682; - CompletionMessage = 1074683; // Not half bad. Here's your prize. - - Objectives.Add(new KillObjective(1, new[] { typeof(Lurg) }, "Lurg")); - Objectives.Add(new KillObjective(1, new[] { typeof(Grobu) }, "Grobu")); - - Rewards.Add(ItemReward.LargeBagOfTreasure); - } -} - -public class Overpopulation : MLQuest -{ - public Overpopulation() - { - Activated = true; - Title = 1072252; // Overpopulation - // I just can't bear it any longer. Sure, it's my job to thin the deer out so they don't overeat the area and - // starve themselves come winter time. Sure, I know we killed off the predators that would do this naturally - // so now we have to make up for it. But they're so graceful and innocent. I just can't do it. Will you? - Description = 1072267; - 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(Hind) }, "hinds")); - - Rewards.Add(ItemReward.SmallBagOfTrinkets); - } -} - -public class WildBoarCull : MLQuest -{ - public WildBoarCull() - { - Activated = true; - Title = 1072245; // Wild Boar Cull - // A pity really. With the balance of nature awry, we have no choice but to accept the responsibility of - // making it all right. It's all a part of the circle of life, after all. So, yes, the boars are running rampant. - // There are far too many in the region. Will you shoulder your obligations as a higher life form? - Description = 1072260; - 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(Boar) }, "boars")); - - Rewards.Add(ItemReward.SmallBagOfTrinkets); - } -} - -public class ItsElemental : MLQuest -{ - public ItsElemental() - { - Activated = true; - Title = 1073089; // It's Elemental - // The universe is all about balance my friend. Tip one end, you must balance the other. - // That's why I must ask you to kill not just one kind of elemental, but three kinds. Snuff out some Fire, douse - // a few Water, and crush some Earth elementals and I'll pay you for your trouble. - Description = 1073579; - RefusalMessage = 1073580; // I hope you'll reconsider. Until then, farwell. - InProgressMessage = 1073599; // Four of each, that's all I ask. Water, earth and fire. - - Objectives.Add(new KillObjective(4, new[] { typeof(FireElemental) }, "fire elementals")); - Objectives.Add(new KillObjective(4, new[] { typeof(WaterElemental) }, "water elementals")); - Objectives.Add(new KillObjective(4, new[] { typeof(EarthElemental) }, "earth elementals")); - - Rewards.Add(ItemReward.BagOfTreasure); - } -} - -public class CircleOfLife : MLQuest -{ - public CircleOfLife() - { - Activated = true; - Title = 1073656; // Circle of Life - // There's been a bumper crop of evil with the Bog Things in these parts, my friend. - // Though they are foul creatures, they are also most fecund. Slay one and you make the land more fertile. - // Even better, slay several and I will give you whatever coin I can spare. - Description = 1073695; - RefusalMessage = 1073733; // Perhaps you'll change your mind and return at some point. - InProgressMessage = 1073736; // Continue to seek and kill the Bog Things. - - Objectives.Add(new KillObjective(8, new[] { typeof(BogThing) }, "bog things")); - - Rewards.Add(ItemReward.LargeBagOfTreasure); - } -} - -public class DustToDust : MLQuest -{ - public DustToDust() - { - Activated = true; - Title = 1073074; // Dust to Dust - Description = - 1073564; // You want to hear about trouble? I got trouble. How's angry piles of granite walking around for trouble? Maybe they don't like the mining, maybe it's the farming. I don't know. All I know is someone's got to turn them back to potting soil. And it'd be worth a pretty penny to the soul that does it. - RefusalMessage = 1073580; // I hope you'll reconsider. Until then, farwell. - InProgressMessage = 1073584; // You got rocks in your head? I said to kill 12 earth elementals, okay? - - Objectives.Add(new KillObjective(12, new[] { typeof(EarthElemental) }, "earth elementals")); - - Rewards.Add(ItemReward.BagOfTreasure); - } -} - -public class CreepyCrawlies : MLQuest -{ - public CreepyCrawlies() - { - Activated = true; - Title = 1072987; // Creepy Crawlies - Description = - 1073016; // Disgusting! The way they scuttle on those hairy legs just makes me want to gag. I hate spiders! Rid the world of twelve and I'll find something nice to give you in thanks. - 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(GiantSpider) }, "giant spiders")); - - Rewards.Add(ItemReward.BagOfTrinkets); - } -} - -public class VoraciousPlants : MLQuest -{ - public VoraciousPlants() - { - Activated = true; - Title = 1073001; // Voracious Plants - Description = - 1073024; // I bet you can't tangle with those nasty plants ... say eight corpsers and two swamp tentacles! I bet they're too much for you. You may as well confess you can't ... - RefusalMessage = 1073019; // Hahahaha! I knew it! - InProgressMessage = 1072271; // You're not quite done yet. Get back to work! - - Objectives.Add(new KillObjective(8, new[] { typeof(Corpser) }, "corpsers")); - Objectives.Add(new KillObjective(2, new[] { typeof(SwampTentacle) }, "swamp tentacles")); - - Rewards.Add(ItemReward.BagOfTrinkets); - } -} - -public class GibberJabber : MLQuest -{ - public GibberJabber() - { - Activated = true; - Title = 1073004; // Gibber Jabber - Description = - 1073024; // I bet you can't kill ... ten gibberlings! I bet they're too much for you. You may as well confess you can't ... - RefusalMessage = 1073019; // Hahahaha! I knew it! - InProgressMessage = 1072271; // You're not quite done yet. Get back to work! - - Objectives.Add(new KillObjective(10, new[] { typeof(Gibberling) }, "gibberlings")); - - Rewards.Add(ItemReward.BagOfTrinkets); - } -} - -public class AnimatedMonstrosity : MLQuest -{ - public AnimatedMonstrosity() - { - Activated = true; - Title = 1072990; // Animated Monstrosity - Description = - 1073020; // I bet you can't kill ... say twelve ... flesh golems! I bet they're too much for you. You may as well confess you can't ... - RefusalMessage = 1073019; // Hahahaha! I knew it! - InProgressMessage = 1072271; // You're not quite done yet. Get back to work! - - Objectives.Add(new KillObjective(12, new[] { typeof(FleshGolem) }, "flesh golems")); - - Rewards.Add(ItemReward.BagOfTrinkets); - } -} - -public class BirdsOfAFeather : MLQuest -{ - public BirdsOfAFeather() - { - Activated = true; - Title = 1073007; // Birds of a Feather - Description = - 1073022; // I bet you can't kill ... ten harpies! I bet they're too much for you. You may as well confess you can't ... - RefusalMessage = 1073019; // Hahahaha! I knew it! - InProgressMessage = 1072271; // You're not quite done yet. Get back to work! - - Objectives.Add(new KillObjective(10, new[] { typeof(Harpy) }, "harpies")); - - Rewards.Add(ItemReward.BagOfTrinkets); - } -} - -public class Frightmares : MLQuest -{ - public Frightmares() - { - Activated = true; - Title = 1073000; // Frightmares - Description = - 1073036; // I bet you can't handle ten plague spawns! I bet they're too much for you. You may as well confess you can't ... - RefusalMessage = 1073019; // Hahahaha! I knew it! - InProgressMessage = 1072271; // You're not quite done yet. Get back to work! - - Objectives.Add(new KillObjective(10, new[] { typeof(PlagueSpawn) }, "plague spawns")); - - Rewards.Add(ItemReward.BagOfTrinkets); - } -} - -public class MoltenReptiles : MLQuest -{ - public MoltenReptiles() - { - Activated = true; - Title = 1072989; // Molten Reptiles - Description = - 1073018; // I bet you can't kill ... say ten ... lava lizards! I bet they're too much for you. You may as well confess you can't ... - RefusalMessage = 1073019; // Hahahaha! I knew it! - InProgressMessage = 1072271; // You're not quite done yet. Get back to work! - - Objectives.Add(new KillObjective(10, new[] { typeof(LavaLizard) }, "lava lizards")); - - Rewards.Add(ItemReward.BagOfTrinkets); - } -} - -public class BloodyNuisance : MLQuest -{ - public BloodyNuisance() - { - Activated = true; - Title = 1072992; // Bloody Nuisance - Description = - 1073021; // I bet you can't kill ... ten gore fiends! I bet they're too much for you. You may as well confess you can't ... - RefusalMessage = 1073019; // Hahahaha! I knew it! - InProgressMessage = 1072271; // You're not quite done yet. Get back to work! - - Objectives.Add(new KillObjective(10, new[] { typeof(GoreFiend) }, "gore fiends")); - - Rewards.Add(ItemReward.BagOfTrinkets); - } -} - -public class BloodSuckers : MLQuest -{ - public BloodSuckers() - { - Activated = true; - Title = 1072997; // Blood Suckers - Description = - 1073025; // I bet you can't tangle with those bloodsuckers ... say around ten vampire bats! I bet they're too much for you. You may as well confess you can't ... - RefusalMessage = 1073019; // Hahahaha! I knew it! - InProgressMessage = 1072271; // You're not quite done yet. Get back to work! - - Objectives.Add(new KillObjective(10, new[] { typeof(VampireBat) }, "vampire bats")); - - Rewards.Add(ItemReward.BagOfTrinkets); - } -} - -public class TheAfterlife : MLQuest -{ - public TheAfterlife() - { - Activated = true; - Title = 1073073; // The Afterlife - Description = - 1073563; // Nobody told me about the Mummy's Curse. How was I supposed to know you shouldn't disturb the tombs? Oh, sure, now all I hear about is the curse of the vengeful dead. I'll tell you what - make a few of these mummies go away and we'll keep this between you and me. - RefusalMessage = 1073580; // I hope you'll reconsider. Until then, farwell. - InProgressMessage = 1073583; // Uh, I don't think you're quite done killing Mummies yet. - - Objectives.Add(new KillObjective(15, new[] { typeof(Mummy) }, "mummies")); - - Rewards.Add(ItemReward.BagOfTreasure); - } -} - -public class ForkedTongue : MLQuest -{ - public ForkedTongue() - { - Activated = true; - Title = 1073655; // Forked Tongue - Description = - 1073694; // I must implore you, brave traveler, to do battle with the vile reptiles which haunt these parts. Those hideous abominations, the Ophidians, are a blight across the land. If you were able to put down a host of the scaly warriors, the Knights or the Avengers, I would forever be in your debt. - RefusalMessage = 1073733; // Perhaps you'll change your mind and return at some point. - InProgressMessage = 1073735; // Have you killed the Ophidian Knights or Avengers? - - Objectives.Add( - new KillObjective( - 10, - new[] { typeof(OphidianKnight) }, - "ophidian avengers or ophidian knight-errants" - ) - ); - - Rewards.Add(ItemReward.LargeBagOfTreasure); - } -} - -public class ImpishDelights : MLQuest -{ - public ImpishDelights() - { - Activated = true; - Title = 1073077; // Impish Delights - Description = - 1073567; // Imps! Do you hear me? Imps! They're everywhere! They're in everything! Oh, don't be fooled by their size - they vicious little devils! Half-sized evil incarnate, they are! Somebody needs to send them back to where they came from, if you know what I mean. - RefusalMessage = 1073580; // I hope you'll reconsider. Until then, farwell. - InProgressMessage = - 1073587; // Don't let the little devils scare you! You kill 12 imps - then we'll talk reward. - - Objectives.Add(new KillObjective(12, new[] { typeof(Imp) }, "imps")); - - Rewards.Add(ItemReward.BagOfTreasure); - } -} - -public class ThreeWishes : MLQuest -{ - public ThreeWishes() - { - Activated = true; - Title = 1073660; // Three Wishes - Description = - 1073699; // If I had but one wish, it would be to rid myself of these dread Efreet! Fire and ash, they are cunning and deadly! You look a brave soul - would you be interested in earning a rich reward for slaughtering a few of the smoky devils? - RefusalMessage = 1073733; // Perhaps you'll change your mind and return at some point. - InProgressMessage = 1073740; // Those smoky devils, the Efreets, are still about. - - Objectives.Add(new KillObjective(8, new[] { typeof(Efreet) }, "efreets")); - - Rewards.Add(ItemReward.LargeBagOfTreasure); - } -} - -public class EvilEye : MLQuest -{ - public EvilEye() - { - Activated = true; - Title = 1073084; // Evil Eye - Description = - 1073574; // Kind traveler, hear my plea. You know of the evil orbs? The wrathful eyes? Some call them gazers? They must be a nest nearby, for they are tormenting us poor folk. We need to drive back their numbers. But we are not strong enough to face such horrors ourselves, we need a true hero. - RefusalMessage = 1073580; // I hope you'll reconsider. Until then, farwell. - InProgressMessage = 1073594; // Have you annihilated a dozen Gazers yet, kind traveler? - - Objectives.Add(new KillObjective(12, new[] { typeof(Gazer) }, "gazers")); - - Rewards.Add(ItemReward.BagOfTreasure); - } -} - -public class GargoylesWrath : MLQuest -{ - public GargoylesWrath() - { - Activated = true; - Title = 1073658; // Gargoyle's Wrath - Description = - 1073697; // It is regretable that the Gargoyles insist upon warring with us. Their Enforcers attack men on sight, despite all efforts at reason. To help maintain order in this region, I have been authorized to encourage bounty hunters to reduce their numbers. Eradicate their number and I will reward you handsomely. - RefusalMessage = 1073733; // Perhaps you'll change your mind and return at some point. - InProgressMessage = 1073738; // I won't be able to pay you until you've gotten enough Gargoyle Enforcers. - - Objectives.Add(new KillObjective(6, new[] { typeof(GargoyleEnforcer) }, "gargoyle enforcers")); - - Rewards.Add(ItemReward.LargeBagOfTreasure); - } -} - -public class UndeadMages : MLQuest -{ - public UndeadMages() - { - Activated = true; - Title = 1073080; // Undead Mages - Description = - 1073570; // Why must the dead plague the living? With their foul necromancy and dark sorceries, the undead menace the countryside. I fear what will happen if no one is strong enough to face these nightmare sorcerers and thin their numbers. - RefusalMessage = 1073580; // I hope you'll reconsider. Until then, farwell. - InProgressMessage = 1073590; // Surely, a brave soul like yourself can kill 10 Bone Magi and Skeletal Mages? - - Objectives.Add( - new KillObjective( - 10, - new[] { typeof(BoneMagi), typeof(SkeletalMage) }, - "bone mages or skeletal mages" - ) - ); - - Rewards.Add(ItemReward.BagOfTreasure); - } -} - -public class FriendlyNeighborhoodSpiderkiller : MLQuest -{ - public FriendlyNeighborhoodSpiderkiller() - { - Activated = true; - Title = 1073662; // Friendly Neighborhood Spider-killer - Description = - 1073701; // They aren't called Dread Spiders because they're fluffy and cuddly now, are they? No, there's nothing appealing about those wretches so I sure wouldn't lose any sleep if you were to exterminate a few. I'd even part with a generous amount of gold, I would. - RefusalMessage = 1073733; // Perhaps you'll change your mind and return at some point. - InProgressMessage = 1073742; // Dread Spiders? I say keep exterminating the arachnid vermin. - - Objectives.Add(new KillObjective(8, new[] { typeof(DreadSpider) }, "dread spiders")); - - Rewards.Add(ItemReward.LargeBagOfTreasure); - } -} - -public class MongbatMenace : MLQuest -{ - public MongbatMenace() - { - Activated = true; - Title = 1073003; // Mongbat Menace! - Description = - 1073033; // I imagine you don't know about the mongbats. Well, you may think you do, but I know more than just about anyone. You see they come in two varieties ... the stronger and the weaker. Either way, they're a menace. Exterminate ten of the weaker ones and four of the stronger and I'll pay you an honest wage. - 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(Mongbat) }, "mongbats")); - Objectives.Add(new KillObjective(4, new[] { typeof(GreaterMongbat) }, "greater mongbats")); - - Rewards.Add(ItemReward.BagOfTrinkets); - } -} - -public class StirringTheNest : MLQuest -{ - public StirringTheNest() - { - Activated = true; - Title = 1073087; // Stirring the Nest - Description = - 1073577; // Were you the sort of child that enjoyed knocking over anthills? Well, perhaps you'd like to try something a little bigger? There's a Solen nest nearby and I bet if you killed a queen or two, it would be quite the sight to behold. I'd even pay to see that - what do you say? - RefusalMessage = 1073580; // I hope you'll reconsider. Until then, farwell. - InProgressMessage = 1073597; // Dead Solen Queens isn't too much to ask, is it? - - ObjectiveType = ObjectiveType.Any; - - Objectives.Add(new KillObjective(3, new[] { typeof(RedSolenQueen) }, "red solen queens")); - Objectives.Add(new KillObjective(3, new[] { typeof(BlackSolenQueen) }, "black solen queens")); - - Rewards.Add(ItemReward.BagOfTreasure); - } -} - -public class WarriorCaste : MLQuest -{ - public WarriorCaste() - { - Activated = true; - Title = 1073078; // Warrior Caste - Description = - 1073568; // The Terathan are an aggressive species. Left unchecked, they will swarm across our lands. And where will that leave us? Compost in the hive, that's what! Stop them, stop them cold my friend. Kill their warriors and you'll check their movement, that is certain. - RefusalMessage = 1073580; // I hope you'll reconsider. Until then, farwell. - InProgressMessage = - 1073588; // Unless you kill at least 10 Terathan Warriors, you won't have any impact on their hive. - - Objectives.Add(new KillObjective(10, new[] { typeof(TerathanWarrior) }, "terathan warriors")); - - Rewards.Add(ItemReward.BagOfTreasure); - } -} - -public class BigWorms : MLQuest -{ - public BigWorms() - { - Activated = true; - Title = 1073088; // Big Worms - Description = - 1073578; // It makes no sense! Cold blooded serpents cannot live in the ice! It's a biological impossibility! They are an abomination against reason! Please, I beg you - kill them! Make them disappear for me! Do this and I will reward you. - RefusalMessage = 1073580; // I hope you'll reconsider. Until then, farwell. - InProgressMessage = 1073598; // You wouldn't try and just pretend you murdered 10 Giant Ice Worms, would you? - - Objectives.Add(new KillObjective(10, new[] { typeof(IceSerpent) }, "giant ice serpents")); - - Rewards.Add(ItemReward.BagOfTreasure); - } -} - -public class OrcishElite : MLQuest -{ - public OrcishElite() - { - Activated = true; - Title = 1073081; // Orcish Elite - Description = - 1073571; // Foul brutes! No one loves an orc, but some of them are worse than the rest. Their Captains and their Bombers, for instance, they're the worst of the lot. Kill a few of those, and the rest are just a rabble. Exterminate a few of them and you'll make the world a sunnier place, don't you know. - RefusalMessage = 1073580; // I hope you'll reconsider. Until then, farwell. - InProgressMessage = - 1073591; // The only good orc is a dead orc - and 4 dead Captains and 6 dead Bombers is even better! - - Objectives.Add(new KillObjective(6, new[] { typeof(OrcBomber) }, "orc bombers")); - Objectives.Add(new KillObjective(4, new[] { typeof(OrcCaptain) }, "orc captain")); - - Rewards.Add(ItemReward.BagOfTreasure); - } -} - -public class ThinningTheHerd : MLQuest -{ - public ThinningTheHerd() - { - Activated = true; - Title = 1072249; // Thinning the Herd - Description = - 1072263; // Psst! Hey ... psst! Listen, I need some help here but it's gotta be hush hush. I don't want THEM to know I'm onto them. They watch me. I've seen them, but they don't know that I know what I know. You know? Anyway, I need you to scare them off by killing a few of them. That'll send a clear message that I won't suffer goats watching me! - 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(Goat) }, "goats")); - - Rewards.Add(ItemReward.SmallBagOfTrinkets); - } -} - -public class Squishy : MLQuest -{ - public Squishy() - { - Activated = true; - Title = 1072998; // Squishy - Description = - 1073031; // Have you ever seen what a slime can do to good gear? Well, it's not pretty, let me tell you! If you take on my task to destroy twelve of them, bear that in mind. They'll corrode your equipment faster than anything. - 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(Slime) }, "slimes")); - - Rewards.Add(ItemReward.BagOfTrinkets); - } -} - -public class OrcSlaying : MLQuest -{ - public OrcSlaying() - { - Activated = true; - Title = 1072986; // Orc Slaying - Description = - 1073015; // Those green-skinned freaks have run off with more of my livestock. I want an orc scout killed for each sheep I lost and an orc for each chicken. So that's four orc scouts and eight orcs I'll pay you to slay. - 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(8, new[] { typeof(Orc) }, "orcs")); - // TODO: This needs to be orc scouts but they aren't in the SVN - Objectives.Add(new KillObjective(4, new[] { typeof(OrcishLord) }, "orcish lords")); - - Rewards.Add(ItemReward.BagOfTrinkets); - } -} - -public class ABigJob : MLQuest -{ - public ABigJob() - { - Activated = true; - Title = 1072988; // A Big Job - Description = - 1073017; // It's a big job but you look to be just the adventurer to do it! I'm so glad you came by ... I'm paying well for the death of five ogres and five ettins. - 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(5, new[] { typeof(Ogre) }, "ogres")); - Objectives.Add(new KillObjective(5, new[] { typeof(Ettin) }, "ettins")); - - Rewards.Add(ItemReward.BagOfTrinkets); - } -} - -public class TrollingForTrolls : MLQuest -{ - public TrollingForTrolls() - { - Activated = true; - Title = 1072985; // Trolling for Trolls - Description = - 1073014; // They may not be bright, but they're incredibly destructive. Kill off ten trolls and I'll consider it a favor done for me. - 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(Troll) }, "trolls")); - - Rewards.Add(ItemReward.BagOfTrinkets); - } -} - -public class ColdHearted : MLQuest -{ - public ColdHearted() - { - Activated = true; - Title = 1072991; // Cold Hearted - Description = - 1073027; // It's a big job but you look to be just the adventurer to do it! I'm so glad you came by ... I'm paying well for the death of six giant ice serpents and six frost spiders. Hop to it, if you're so inclined. - 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(6, new[] { typeof(IceSerpent) }, "giant ice serpents")); - Objectives.Add(new KillObjective(6, new[] { typeof(FrostSpider) }, "frost spiders")); - - Rewards.Add(ItemReward.BagOfTrinkets); - } -} - -public class ForkedTongues : MLQuest -{ - public ForkedTongues() - { - Activated = true; - Title = 1072984; // Forked Tongues - Description = - 1073013; // You can't trust them, you know. Lizardmen I mean. They have forked tongues ... and you know what that means. Exterminate ten of them and I'll reward you. - 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(Lizardman) }, "lizardmen")); - - Rewards.Add(ItemReward.BagOfTrinkets); - } -} - -public class ShakingThingsUp : MLQuest -{ - public ShakingThingsUp() - { - Activated = true; - Title = 1073083; // Shaking Things Up - Description = - 1073573; // A Solen hive is a fascinating piece of ecology. It's put together like a finely crafted clock. Who knows what happens if you remove something? So let's find out. Exterminate a few of the warriors and I'll make it worth your while. - RefusalMessage = 1073580; // I hope you'll reconsider. Until then, farwell. - InProgressMessage = - 1073593; // I don't think you've gotten their attention yet -- you need to kill at least 10 Solen Warriors. - - ObjectiveType = ObjectiveType.Any; - - Objectives.Add(new KillObjective(10, new[] { typeof(RedSolenWarrior) }, "red solen warriors")); - Objectives.Add(new KillObjective(10, new[] { typeof(BlackSolenWarrior) }, "black solen warriors")); - - Rewards.Add(ItemReward.BagOfTreasure); - } -} - -public class Arachnophobia : MLQuest -{ - public Arachnophobia() - { - Activated = true; - Title = 1073079; // Arachnophobia - Description = - 1073569; // I've seen them hiding in their webs among the woods. Glassy eyes, spindly legs, poisonous fangs. Monsters, I say! Deadly horrors, these black widows. Someone must exterminate the abominations! If only I could find a worthy hero for such a task, then I could give them this considerable reward. - RefusalMessage = 1073580; // I hope you'll reconsider. Until then, farwell. - InProgressMessage = - 1073589; // You've got a good start, but to stop the black-eyed fiends, you need to kill a dozen. - - Objectives.Add(new KillObjective(12, new[] { typeof(GiantBlackWidow) }, "giant black widows")); - - Rewards.Add(ItemReward.BagOfTreasure); - } -} - -public class MiniSwampThing : MLQuest -{ - public MiniSwampThing() - { - Activated = true; - Title = 1073072; // Mini Swamp Thing - Description = - 1073562; // Some say killing a boggling brings good luck. I don't place much stock in old wives' tales, but I can say a few dead bogglings would certainly be lucky for me! Help me out and I can reward you for your efforts. - RefusalMessage = 1073580; // I hope you'll reconsider. Until then, farwell. - InProgressMessage = 1073582; // Go back and kill all 20 bogglings! - - Objectives.Add(new KillObjective(12, new[] { typeof(Bogling) }, "boglings")); - - Rewards.Add(ItemReward.BagOfTreasure); - } -} - -public class ThePerilsOfFarming : MLQuest -{ - public ThePerilsOfFarming() - { - Activated = true; - Title = 1073664; // The Perils of Farming - Description = - 1073703; // I should be trimming back the vegetation here, but something nasty has taken root. Viscious vines I can't go near. If there's any hope of getting things under control, some one's going to need to destroy a few of those Whipping Vines. Someone strong and fast and tough. - RefusalMessage = 1073733; // Perhaps you'll change your mind and return at some point. - InProgressMessage = 1073744; // How are farmers supposed to work with these Whipping Vines around? - - Objectives.Add(new KillObjective(15, new[] { typeof(WhippingVine) }, "whipping vines")); - - Rewards.Add(ItemReward.LargeBagOfTreasure); - } -} - -public class IndustriousAsAnAntLion : MLQuest -{ - public IndustriousAsAnAntLion() - { - Activated = true; - Title = 1073665; // Industrious as an Ant Lion - Description = - 1073704; // Ants are industrious and Lions are noble so who'd think an Ant Lion would be such a problem? The Ant Lion's have been causing mindless destruction in these parts. I suppose it's just how ants are. But I need you to help eliminate the infestation. Would you be willing to help for a bit of reward? - RefusalMessage = 1073733; // Perhaps you'll change your mind and return at some point. - InProgressMessage = 1073745; // Please, rid us of the Ant Lion infestation. - - Objectives.Add(new KillObjective(12, new[] { typeof(AntLion) }, "ant lions")); - - Rewards.Add(ItemReward.LargeBagOfTreasure); - } -} - -public class UnholyConstruct : MLQuest -{ - public UnholyConstruct() - { - Activated = true; - Title = 1073666; // Unholy Construct - Description = - 1073705; // They're unholy, I say. Golems, a walking mockery of all life, born of blackest magic. They're not truly alive, so destroying them isn't a crime, it's a service. A service I will gladly pay for. - RefusalMessage = 1073733; // Perhaps you'll change your mind and return at some point. - InProgressMessage = 1073746; // The unholy brutes, the Golems, must be smited! - CompletionMessage = 1073787; // Reduced those Golems to component parts? Good, then -- you deserve this reward! - - Objectives.Add(new KillObjective(10, new[] { typeof(Golem) }, "golems")); - - Rewards.Add(ItemReward.LargeBagOfTreasure); - } -} - -public class AChillInTheAir : MLQuest -{ - public AChillInTheAir() - { - Activated = true; - Title = 1073663; // A Chill in the Air - Description = - 1073702; // Feel that chill in the air? It means an icy death for the unwary, for deadly Ice Elementals are about. Who knows what magic summoned them, what's important now is getting rid of them. I don't have much, but I'll give all I can if you'd only stop the cold-hearted monsters. - RefusalMessage = 1073733; // Perhaps you'll change your mind and return at some point. - InProgressMessage = 1073746; // The chill won't lift until you eradicate a few Ice Elemenals. - - Objectives.Add(new KillObjective(15, new[] { typeof(IceElemental) }, "ice elementals")); - - Rewards.Add(ItemReward.LargeBagOfTreasure); - } -} - -public class TheKingOfClothing : MLQuest -{ - public TheKingOfClothing() - { - Activated = true; - HasRestartDelay = true; - Title = 1073902; // The King of Clothing - Description = - 1074092; // I have heard noble tales of a fine and proud human garment. An article of clothing fit for both man and god alike. It is called a "kilt" I believe? Could you fetch for me some of these kilts so I that I might revel in their majesty and glory? - RefusalMessage = 1073921; // I will patiently await your reconsideration. - InProgressMessage = 1073948; // I will be in your debt if you bring me kilts. - CompletionMessage = 1073974; // I say truly - that is a magnificent garment! You have more than earned a reward. - - Objectives.Add(new CollectObjective(10, typeof(Kilt), 1025431)); // kilt - - Rewards.Add(ItemReward.TailorSatchel); - } -} - -public class ThePuffyShirt : MLQuest -{ - public ThePuffyShirt() - { - Activated = true; - HasRestartDelay = true; - Title = 1073903; // The Puffy Shirt - Description = - 1074093; // We elves believe that beauty is expressed in all things, including the garments we wear. I wish to understand more about human aesthetics, so please kind traveler - could you bring to me magnificent examples of human fancy shirts? For my thanks, I could teach you more about the beauty of elven vestements. - RefusalMessage = 1073921; // I will patiently await your reconsideration. - InProgressMessage = 1073949; // I will be in your debt if you bring me fancy shirts. - CompletionMessage = 1073973; // I appreciate your service. Now, see what elven hands can create. - - Objectives.Add(new CollectObjective(10, typeof(FancyShirt), 1027933)); // fancy shirt - - Rewards.Add(ItemReward.TailorSatchel); - } -} - -public class FromTheGaultierCollection : MLQuest -{ - public FromTheGaultierCollection() - { - Activated = true; - HasRestartDelay = true; - Title = 1073905; // From the Gaultier Collection - Description = - 1074095; // It is my understanding, the females of humankind actually wear on certain occasions a studded bustier? This is not simply a fanciful tale? Remarkable! It sounds hideously uncomfortable as well as ludicrously impracticle. But perhaps, I simply do not understand the nuances of human clothing. Perhaps, I need to see such a studded bustier for myself? - RefusalMessage = 1073921; // I will patiently await your reconsideration. - InProgressMessage = 1073951; // I will be in your debt if you bring me studded bustiers. - CompletionMessage = 1073976; // Truly, it is worse than I feared. Still, I appreciate your efforts on my behalf. - - Objectives.Add(new CollectObjective(10, typeof(StuddedBustierArms), 1027180)); // studded bustier - - Rewards.Add(ItemReward.TailorSatchel); - } -} - -public class HauteCouture : MLQuest -{ - public HauteCouture() - { - Activated = true; - HasRestartDelay = true; - Title = 1073901; // Hâute Couture - Description = - 1074091; // Most human apparel is interesting to elven eyes. But there is one garment - the flower garland - which sounds very elven indeed. Could I see how a human crafts such an object of beauty? In exchange, I could share with you the wonders of elven garments. - RefusalMessage = 1073921; // I will patiently await your reconsideration. - InProgressMessage = 1073947; // I will be in your debt if you bring me flower garlands. - CompletionMessage = 1073973; // I appreciate your service. Now, see what elven hands can create. - - Objectives.Add(new CollectObjective(10, typeof(FlowerGarland), 1028965)); // flower garland - - Rewards.Add(ItemReward.TailorSatchel); - } -} - -public class TheSongOfTheWind : MLQuest -{ - public TheSongOfTheWind() - { - Activated = true; - HasRestartDelay = true; - Title = 1073910; // The Song of the Wind - Description = - 1074100; // To give voice to the passing wind, this is an idea worthy of an elf! Friend, bring me some of the amazing fancy wind chimes so that I may listen to the song of the passing breeze. Do this, and I will share with you treasured elven secrets. - RefusalMessage = 1073921; // I will patiently await your reconsideration. - InProgressMessage = 1073956; // I will be in your debt if you bring me fancy wind chimes. - CompletionMessage = 1073980; // Such a delightful sound, I think I shall never tire of it. - - Objectives.Add(new CollectObjective(10, typeof(FancyWindChimes), "fancy wind chimes")); - - Rewards.Add(ItemReward.TinkerSatchel); - } -} - -public class BeerGoggles : MLQuest -{ - public BeerGoggles() - { - Activated = true; - HasRestartDelay = true; - Title = 1073895; // Beer Goggles - Description = - 1074085; // Oh, the deviltry! Why would humans lock their precious liquors inside a wooden coffin? I understand I need a "keg tap" to access the golden brew within such a wooden abomination. Perhaps, if you could bring me such a tap, we could share a drink and I could teach you. - RefusalMessage = 1073921; // I will patiently await your reconsideration. - InProgressMessage = 1073941; // I will be in your debt if you bring me barrel taps. - CompletionMessage = 1073971; // My thanks for your service. Here is something for you to enjoy. - - Objectives.Add(new CollectObjective(25, typeof(BarrelTap), 1024100)); // barrel tap - - Rewards.Add(ItemReward.TinkerSatchel); - } -} - -public class MessageInABottleQuest : MLQuest -{ - public MessageInABottleQuest() - { - Activated = true; - HasRestartDelay = true; - Title = 1073894; // Message in a Bottle - Description = - 1074084; // We elves are interested in trading our wines with humans but we understand human usually trade such brew in strange transparent bottles. If you could provide some of these empty glass bottles, I might engage in a bit of elven winemaking. - RefusalMessage = 1073921; // I will patiently await your reconsideration. - InProgressMessage = 1073940; // I will be in your debt if you bring me empty bottles. - CompletionMessage = 1073971; // My thanks for your service. Here is something for you to enjoy. - - Objectives.Add(new CollectObjective(50, typeof(Bottle), 1023854)); // empty bottle - - Rewards.Add(ItemReward.TinkerSatchel); - } -} - -public class NecessitysMother : MLQuest -{ - public NecessitysMother() - { - Activated = true; - HasRestartDelay = true; - Title = 1073906; // Necessity's Mother - Description = - 1074096; // What a thing, this human need to tinker. It seems there is no end to what might be produced with a set of Tinker's Tools. Who knows what an elf might build with some? Could you obtain some tinker's tools and bring them to me? In exchange, I offer you elven lore and knowledge. - RefusalMessage = 1073921; // I will patiently await your reconsideration. - InProgressMessage = 1073952; // I will be in your debt if you bring me tinker's tools. - CompletionMessage = 1073977; // Now, I shall see what an elf can invent! - - Objectives.Add(new CollectObjective(10, typeof(TinkerTools), 1027868)); // tinker's tools - - Rewards.Add(ItemReward.TinkerSatchel); - } -} - -public class TickTock : MLQuest -{ - public TickTock() - { - Activated = true; - HasRestartDelay = true; - Title = 1073907; // Tick Tock - Description = - 1074097; // Elves find it remarkable the human preoccupation with the passage of time. To have built instruments to try and capture time -- it is a fascinating notion. I would like to see how a clock is put together. Maybe you could provide some clocks for my experimentation? - RefusalMessage = 1073921; // I will patiently await your reconsideration. - InProgressMessage = 1073953; // I will be in your debt if you bring me clocks. - CompletionMessage = 1073978; // Enjoy my thanks for your service. - - Objectives.Add(new CollectObjective(10, typeof(Clock), 1024171)); // clock - - Rewards.Add(ItemReward.TinkerSatchel); - } -} - -public class ReptilianDentist : MLQuest -{ - public ReptilianDentist() - { - Activated = true; - Title = 1074280; // Reptilian Dentist - // I'm working on a striking necklace -- something really unique -- and I know just what I need to finish it up. A huge fang! Won't that catch the eye? I would like to employ you to find me such an item, perhaps a snake would make the ideal donor. I'll make it worth your while, of course. - Description = 1074710; - RefusalMessage = 1074723; // I understand. I don't like snakes much either. They're so creepy. - // Those really big snakes like swamps, I've heard. You might try the blighted grove. - InProgressMessage = 1074722; - CompletionMessage = 1074721; // Do you have it? *gasp* What a tooth! Here … I must get right to work. - - Objectives.Add(new CollectObjective(1, typeof(CoilsFang), "coil's fang")); - - Rewards.Add(ItemReward.TinkerSatchel); - } -} - -public class StopHarpingOnMe : MLQuest -{ - public StopHarpingOnMe() - { - Activated = true; - HasRestartDelay = true; - Title = 1073881; // Stop Harping on Me - // Humans artistry can be a remarkable thing. For instance, I have heard of a wonderful instrument which creates the most melodious of music. A lap harp. I would be ever so grateful if I could examine one in person. - Description = 1074071; - RefusalMessage = 1073921; // I will patiently await your reconsideration. - InProgressMessage = 1073927; // I will be in your debt if you bring me lap harp. - CompletionMessage = 1073969; // My thanks for your service. Now, I will show you something of elven carpentry. - - Objectives.Add(new CollectObjective(20, typeof(LapHarp), 1023762)); // lap harp - - Rewards.Add(ItemReward.CarpentrySatchel); - } -} - -public class TheFarEye : MLQuest -{ - public TheFarEye() - { - Activated = true; - HasRestartDelay = true; - Title = 1073908; // The Far Eye - // The wonders of human invention! Turning sand and metal into a far-seeing eye! This is something I must experience for myself. Bring me some of these spyglasses friend human. - Description = 1074098; - RefusalMessage = 1073921; // I will patiently await your reconsideration. - InProgressMessage = 1073954; // I will be in your debt if you bring me spyglasses. - CompletionMessage = 1073978; // Enjoy my thanks for your service. - - Objectives.Add(new CollectObjective(20, typeof(Spyglass), 1025365)); // spyglass - - Rewards.Add(ItemReward.TinkerSatchel); - } -} - -public class LethalDarts : MLQuest -{ - public LethalDarts() - { - Activated = true; - HasRestartDelay = true; - Title = 1073876; // Lethal Darts - // We elves are no strangers to archery but I would be interested in learning whether there is anything to learn from the human approach. I would gladly trade you something I have if you could teach me of the deadly crossbow bolt. - Description = 1074066; - RefusalMessage = 1073921; // I will patiently await your reconsideration. - InProgressMessage = 1073922; // I will be in your debt if you bring me crossbow bolts. - CompletionMessage = 1073968; // My thanks for your service. Now, I shall teach you of elven archery. - CompletionNotice = CompletionNoticeCraft; - - Objectives.Add(new CollectObjective(10, typeof(Bolt), 1027163)); // crossbow bolt - - Rewards.Add(ItemReward.FletchingSatchel); - } -} - -public class ASimpleBow : MLQuest -{ - public ASimpleBow() - { - Activated = true; - HasRestartDelay = true; - Title = 1073877; // A Simple Bow - // I wish to try a bow crafted in the human style. Is it possible for you to bring me such a weapon? I would be happy to return this favor. - Description = 1074067; - RefusalMessage = 1073921; // I will patiently await your reconsideration. - InProgressMessage = 1073923; // I will be in your debt if you bring me bows. - CompletionMessage = 1073968; // My thanks for your service. Now, I shall teach you of elven archery. - CompletionNotice = CompletionNoticeCraft; - - Objectives.Add(new CollectObjective(10, typeof(Bow), 1025041)); // bow - - Rewards.Add(ItemReward.FletchingSatchel); - } -} - -public class IngeniousArcheryPartOne : MLQuest -{ - public IngeniousArcheryPartOne() - { - Activated = true; - HasRestartDelay = true; - Title = 1073878; // Ingenious Archery, Part I - // I have heard of a curious type of bow, you call it a "crossbow". It sounds fascinating and I would very much like to examine one closely. Would you be able to obtain such an instrument for me? - Description = 1074068; - RefusalMessage = 1073921; // I will patiently await your reconsideration. - InProgressMessage = 1073924; // I will be in your debt if you bring me crossbows. - CompletionMessage = 1073968; // My thanks for your service. Now, I shall teach you of elven archery. - CompletionNotice = CompletionNoticeCraft; - - Objectives.Add(new CollectObjective(10, typeof(Crossbow), 1023919)); // crossbow - - Rewards.Add(ItemReward.FletchingSatchel); - } -} - -public class IngeniousArcheryPartTwo : MLQuest -{ - public IngeniousArcheryPartTwo() - { - Activated = true; - HasRestartDelay = true; - Title = 1073879; // Ingenious Archery, Part II - // These human "crossbows" are complex and clever. The "heavy crossbow" is a remarkable instrument of war. I am interested in seeing one up close, if you could arrange for one to make its way to my hands. - Description = 1074069; - RefusalMessage = 1073921; // I will patiently await your reconsideration. - InProgressMessage = 1073925; // I will be in your debt if you bring me heavy crossbows. - CompletionMessage = 1073968; // My thanks for your service. Now, I shall teach you of elven archery. - CompletionNotice = CompletionNoticeCraft; - - Objectives.Add(new CollectObjective(8, typeof(HeavyCrossbow), 1025116)); // heavy crossbow - - Rewards.Add(ItemReward.FletchingSatchel); - } -} - -public class IngeniousArcheryPartThree : MLQuest -{ - public IngeniousArcheryPartThree() - { - Activated = true; - HasRestartDelay = true; - Title = 1073880; // Ingenious Archery, Part III - // My friend, I am in search of a device, a instrument of remarkable human ingenuity. It is a repeating crossbow. If you were to obtain such a device, I would gladly reveal to you some of the secrets of elven craftsmanship. - Description = 1074070; - RefusalMessage = 1073921; // I will patiently await your reconsideration. - InProgressMessage = 1073926; // I will be in your debt if you bring me repeating crossbows. - CompletionMessage = 1073968; // My thanks for your service. Now, I shall teach you of elven archery. - CompletionNotice = CompletionNoticeCraft; - - Objectives.Add(new CollectObjective(10, typeof(RepeatingCrossbow), 1029923)); // repeating crossbow - - Rewards.Add(ItemReward.FletchingSatchel); - } -} - -public class ScaleArmor : MLQuest -{ - public ScaleArmor() - { - Activated = true; - Title = 1074711; // Scale Armor - // Here's what I need ... there are some creatures called hydra, fearsome beasts, whose scales are especially suitable for a new sort of armor that I'm developing. I need a few such pieces and then some supple alligator skin for the backing. I'm going to need a really large piece that's shaped just right ... the tail I think would do nicely. I appreciate your help. - Description = 1074712; - RefusalMessage = 1073580; // I hope you'll reconsider. Until then, farwell. - // Hydras have been spotted in the Blighted Grove. You won't get those scales without getting your feet wet, I'm afraid. - InProgressMessage = 1074724; - CompletionMessage = 1074725; // I can't wait to get to work now that you've returned with my scales. - - Objectives.Add(new CollectObjective(1, typeof(ThrashersTail), "Thrasher's Tail")); - Objectives.Add(new CollectObjective(10, typeof(HydraScale), "Hydra Scales")); - - Rewards.Add(ItemReward.BagOfTreasure); - } -} - -public class CutsBothWays : MLQuest -{ - public CutsBothWays() - { - Activated = true; - HasRestartDelay = true; - Title = 1073913; // Cuts Both Ways - // What would you say is a typical human instrument of war? Is a broadsword a typical example? I wish to see more of such human weapons, so I would gladly trade elven knowledge for human steel. - Description = 1074103; - RefusalMessage = 1073921; // I will patiently await your reconsideration. - InProgressMessage = 1073959; // I will be in your debt if you bring me broadswords. - CompletionMessage = 1073978; // Enjoy my thanks for your service. - - Objectives.Add(new CollectObjective(12, typeof(Broadsword), 1023934)); // broadsword - - Rewards.Add(ItemReward.BlacksmithSatchel); - } -} - -public class DragonProtection : MLQuest -{ - public DragonProtection() - { - Activated = true; - HasRestartDelay = true; - Title = 1073915; // Dragon Protection - // Mankind, I am told, knows how to take the scales of a terrible dragon and forge them into powerful armor. Such a feat of craftsmanship! I would give anything to view such a creation - I would even teach some of the prize secrets of the elven people. - Description = 1074105; - RefusalMessage = 1073921; // I will patiently await your reconsideration. - InProgressMessage = 1073961; // I will be in your debt if you bring me dragon armor. - CompletionMessage = 1073978; // Enjoy my thanks for your service. - - Objectives.Add(new CollectObjective(10, typeof(DragonHelm), 1029797)); // dragon helm - - Rewards.Add(ItemReward.BlacksmithSatchel); - } -} - -public class NothingFancy : MLQuest -{ - public NothingFancy() - { - Activated = true; - HasRestartDelay = true; - Title = 1073911; // Nothing Fancy - // I am curious to see the results of human blacksmithing. To examine the care and quality of a simple item. Perhaps, a simple bascinet helmet? Yes, indeed -- if you could bring to me some bascinet helmets, I would demonstrate my gratitude. - Description = 1074101; - RefusalMessage = 1073921; // I will patiently await your reconsideration. - InProgressMessage = 1073957; // I will be in your debt if you bring me bascinets. - CompletionMessage = 1073978; // Enjoy my thanks for your service. - - Objectives.Add(new CollectObjective(15, typeof(Bascinet), 1025132)); // bascinet - - Rewards.Add(ItemReward.BlacksmithSatchel); - } -} - -public class TheBulwark : MLQuest -{ - public TheBulwark() - { - Activated = true; - HasRestartDelay = true; - Title = 1073912; // The Bulwark - // The clank of human iron and steel is strange to elven ears. For instance, the metallic heater shield which human warriors carry into battle. It is odd to an elf, but nevertheless intriguing. Tell me friend, could you bring me such an example of human smithing skill? - Description = 1074102; - RefusalMessage = 1073921; // I will patiently await your reconsideration. - InProgressMessage = 1073958; // I will be in your debt if you bring me heater shields. - CompletionMessage = 1073978; // Enjoy my thanks for your service. - - Objectives.Add(new CollectObjective(10, typeof(HeaterShield), 1027030)); // heater shield - - Rewards.Add(ItemReward.BlacksmithSatchel); - } -} - -public class ArchSupport : MLQuest -{ - public ArchSupport() - { - Activated = true; - HasRestartDelay = true; - Title = 1073882; // Arch Support - // How clever humans are - to understand the need of feet to rest from time to time! Imagine creating a special stool just for weary toes. I would like to examine and learn the secret of their making. Would you bring me some foot stools to examine? - Description = 1074072; - RefusalMessage = 1073921; // I will patiently await your reconsideration. - InProgressMessage = 1073928; // I will be in your debt if you bring me foot stools. - CompletionMessage = 1073969; // My thanks for your service. Now, I will show you something of elven carpentry. - - Objectives.Add(new CollectObjective(10, typeof(FootStool), 1022910)); // foot stool - - Rewards.Add(ItemReward.CarpentrySatchel); - } -} - -public class ParoxysmusSuccubi : MLQuest -{ - public ParoxysmusSuccubi() - { - Activated = true; - Title = 1073067; // Paroxysmus' Succubi - // The succubi that have congregated within the sinkhole to worship Paroxysmus pose a tremendous danger. - // Will you enter the lair and see to their destruction? - Description = 1074696; - 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( - 3, - new[] { typeof(Succubus) }, - "succubi", - new QuestArea(1074806, "The Palace of Paroxysmus") - ) - ); - - Rewards.Add(ItemReward.LargeBagOfTreasure); - } -} - -public class ParoxysmusMoloch : MLQuest -{ - public ParoxysmusMoloch() - { - Activated = true; - Title = 1073068; // Paroxysmus' Moloch - // The moloch daemons that have congregated to worship Paroxysmus pose a tremendous danger. - // Will you enter the lair and see to their destruction? - Description = 1074695; - 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( - 3, - new[] { typeof(Moloch) }, - "molochs", - new QuestArea(1074806, "The Palace of Paroxysmus") - ) - ); - - Rewards.Add(ItemReward.LargeBagOfTreasure); - } -} - -public class ParoxysmusDaemons : MLQuest -{ - public ParoxysmusDaemons() - { - Activated = true; - Title = 1073069; // Paroxysmus' Daemons - // The daemons that have congregated to worship Paroxysmus pose a tremendous danger. - // Will you enter the lair and see to their destruction? - Description = 1074694; - 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(Daemon) }, - "daemons", - new QuestArea(1074806, "The Palace of Paroxysmus") - ) - ); - - Rewards.Add(ItemReward.LargeBagOfTreasure); - } -} - -public class ParoxysmusArcaneDaemons : MLQuest -{ - public ParoxysmusArcaneDaemons() - { - Activated = true; - Title = 1073070; // Paroxysmus' Arcane Daemons - // The arcane daemons that worship Paroxysmus pose a tremendous danger. - // Will you enter the lair and see to their destruction? - Description = 1074697; - 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(ArcaneDaemon) }, - "arcane daemons", - new QuestArea(1074806, "The Palace of Paroxysmus") - ) - ); - - Rewards.Add(ItemReward.LargeBagOfTreasure); - } -} - -public class CausticCombo : MLQuest -{ - public CausticCombo() - { - Activated = true; - Title = 1073062; // Caustic Combo - // Vile creatures have exited the sinkhole and begun terrorizing the surrounding area. - // The demons are bad enough, but the elementals are an abomination, their poisons seeping into the fertile ground here. - // Will you enter the sinkhole and put a stop to their depredations? - Description = 1074693; - 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( - 3, - new[] { typeof(PoisonElemental) }, - "poison elementals", - new QuestArea(1074806, "The Palace of Paroxysmus") - ) - ); - Objectives.Add( - new KillObjective( - 6, - new[] { typeof(AcidElemental) }, - "acid elementals", - new QuestArea(1074806, "The Palace of Paroxysmus") - ) - ); - - Rewards.Add(ItemReward.LargeBagOfTreasure); - } -} - -public class PlagueLord : MLQuest -{ - public PlagueLord() - { - Activated = true; - Title = 1073061; // Plague Lord - // Some of the most horrific creatures have slithered out of the sinkhole there and begun terrorizing - // the surrounding area. The plague creatures are one of the most destruction of the minions of Paroxysmus. - // Are you willing to do something about them? - Description = 1074692; - 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(PlagueSpawn) }, - "plague spawns", - new QuestArea(1074806, "The Palace of Paroxysmus") - ) - ); - Objectives.Add( - new KillObjective( - 3, - new[] { typeof(PlagueBeast) }, - "plague beasts", - new QuestArea(1074806, "The Palace of Paroxysmus") - ) - ); - Objectives.Add( - new KillObjective( - 1, - new[] { typeof(PlagueBeastLord) }, - "plague beast lord", - new QuestArea(1074806, "The Palace of Paroxysmus") - ) - ); - - Rewards.Add(ItemReward.LargeBagOfTreasure); - } -} - -public class GlassyFoe : MLQuest -{ - public GlassyFoe() - { - Activated = true; - Title = 1073055; // Glassy Foe - // Good, you're here. The presence of a twisted creature deep under the earth near Nu'Jelm has corrupted the - // natural growth of crystals in that region. They've become infused with the twisting energy - - // they've come to a sort of life. This is an abomination that festers within Sosaria. - // You must eradicate the crystal lattice seekers. - Description = 1074669; - RefusalMessage = 1074671; // These abominations must not be permitted to fester! - InProgressMessage = 1074672; // You must not waste time. Do not suffer these crystalline abominations to live. - CompletionMessage = 1074673; // You have done well. Enjoy this reward. - - Objectives.Add( - new KillObjective( - 5, - new[] { typeof(CrystalLatticeSeeker) }, - "crystal lattice seekers", - new QuestArea(1074805, "The Prism of Light") - ) - ); - - Rewards.Add(ItemReward.LargeBagOfTreasure); - } -} - -public class DaemonicPrism : MLQuest -{ - public DaemonicPrism() - { - Activated = true; - Title = 1073053; // Daemonic Prism - // Good, you're here. - // The presence of a twisted creature deep under the earth near Nu'Jelm has corrupted the natural growth of - // crystals in that region. They've become infused with the twisting energy - they've come to a sort of life. - // This is an abomination that festers within Sosaria. You must eradicate the crystal daemons. - Description = 1074668; - RefusalMessage = 1074671; // These abominations must not be permitted to fester! - InProgressMessage = 1074672; // You must not waste time. Do not suffer these crystalline abominations to live. - CompletionMessage = 1074673; // You have done well. Enjoy this reward. - - Objectives.Add( - new KillObjective( - 3, - new[] { typeof(CrystalDaemon) }, - "crystal daemons", - new QuestArea(1074805, "The Prism of Light") - ) - ); - - Rewards.Add(ItemReward.LargeBagOfTreasure); - } -} - -public class Hailstorm : MLQuest -{ - public Hailstorm() - { - Activated = true; - Title = 1073057; // Hailstorm - // Good, you're here. - // The presence of a twisted creature deep under the earth near Nu'Jelm has corrupted the natural growth of - // crystals in that region. They've become infused with the twisting energy - they've come to a sort of life. - // This is an abomination that festers within Sosaria. You must eradicate the crystal vortices. - Description = 1074670; - RefusalMessage = 1074671; // These abominations must not be permitted to fester! - InProgressMessage = 1074672; // You must not waste time. Do not suffer these crystalline abominations to live. - CompletionMessage = 1074673; // You have done well. Enjoy this reward. - - Objectives.Add( - new KillObjective( - 8, - new[] { typeof(CrystalVortex) }, - "crystal vortices", - new QuestArea(1074805, "The Prism of Light") - ) - ); - - Rewards.Add(ItemReward.LargeBagOfTreasure); - } -} - -/* TODO: Uncomment when Crystal Hydra is added -public class HowManyHeads : MLQuest -{ - public HowManyHeads() - { - Activated = true; - Title = 1073050; // How Many Heads? - Description = 1074674; // Good, you're here. The presence of a twisted creature deep under the earth near Nu'Jelm has corrupted the natural growth of crystals in that region. They've become infused with the twisting energy - they've come to a sort of life. This is an abomination that festers within Sosaria. You must eradicate the crystal hydras. - RefusalMessage = 1074671; // These abominations must not be permitted to fester! - InProgressMessage = 1074672; // You must not waste time. Do not suffer these crystalline abominations to live. - CompletionMessage = 1074673; // You have done well. Enjoy this reward. - - Objectives.Add( new KillObjective( 3, new Type[] { typeof( CrystalHydra ) }, "crystal hydras", new QuestArea( 1074805, "The Prism of Light" ) ) ); // The Prism of Light - - Rewards.Add( ItemReward.LargeBagOfTreasure ); - } -} -*/ - -/* TODO: Uncomment when Dreadhorn is added -public class DreadhornQuest : MLQuest -{ - public DreadhornQuest() - { - Activated = true; - Title = 1074645; // Dreadhorn - Description = 1074646; // Can you comprehend it? I cannot, I confess. The most pristine and perfect Lord of Sosaria has fallen prey to the blight. From the depths of my heart I mourn his corruption; my thoughts are filled with pity for this glorious creature now tainted. And my blood boils with fury at those responsible for the innocent creature's undoing. Will you find Dread Horn, as he is now called, and free him from this misery? - RefusalMessage = 1074647; // How can you not feel as I do? - InProgressMessage = 1074648; // The lush and fertile land where Dread Horn now lives is twisted and tainted, a result of his corruption. The fey folk have sealed the land off through their magics, but you can enter through an enchanted mushroom fairy circle. - CompletionMessage = 1074649; // Thank you. I haven't the words to express my gratitude. - - Objectives.Add( new KillObjective( 1, new Type[] { typeof( DreadHorn ) }, "dread horn" ) ); - - Rewards.Add( ItemReward.RewardStrongbox ); - } -} -*/ - -/* TODO: Uncomment when SerpentsFangHighExecutioner, TigersClawThief and DragonsFlameGrandMage are added -public class NewLeadership : MLQuest -{ - public NewLeadership() - { - Activated = true; - Title = 1072905; // New Leadership - Description = 1072963; // I have a task for you ... adventurer. Will you risk all to win great renown? The Black Order is organized into three sects, each with their own speciality. The Dragon's Flame serves the will of the Grand Mage, the Tiger's Claw answers to the Master Thief, and the Serpent's Fang kills at the direction of the High Executioner. Slay all three and you will strike the order a devastating blow! - RefusalMessage = 1072973; // I do not fault your decision. - InProgressMessage = 1072974; // Once you gain entrance into The Citadel, you will need to move cautiously to find the sect leaders. - - Objectives.Add( new KillObjective( 1, new Type[] { typeof( SerpentsFangHighExecutioner ) }, "serpent's fang high executioner", new QuestArea( 1074804, "The Citadel" ) ) ); // The Citadel - Objectives.Add( new KillObjective( 1, new Type[] { typeof( TigersClawThief ) }, "tiger's claw thief", new QuestArea( 1074804, "The Citadel" ) ) ); // The Citadel - Objectives.Add( new KillObjective( 1, new Type[] { typeof( DragonsFlameGrandMage ) }, "dragon's flame mage", new QuestArea( 1074804, "The Citadel" ) ) ); // The Citadel - - Rewards.Add( ItemReward.RewardStrongbox ); - } -} -*/ - -/* TODO: Uncomment when SerpentsFangAssassin is added -public class ExAssassins : MLQuest -{ - public ExAssassins() - { - Activated = true; - Title = 1072917; // Ex-Assassins - Description = 1072969; // The Serpent's Fang sect members have gone too far! Express to them my displeasure by slaying ten of them. But remember, I do not condone war on women, so I will only accept the deaths of men, human and elf. - RefusalMessage = 1072979; // As you wish. - InProgressMessage = 1072980; // The Black Order's fortress home is well hidden. Legend has it that a humble fishing village disguises the magical portal. - - // TODO: This has to be MALES only! - Objectives.Add( new KillObjective( 10, new Type[] { typeof( SerpentsFangAssassin ) }, "male serpent's fang assassins", new QuestArea( 1074804, "The Citadel" ) ) ); // The Citadel - - Rewards.Add( ItemReward.BagOfTreasure ); - } -} -*/ - -/* TODO: Uncomment when DragonsFlameMage is added -public class ExtinguishingTheFlame : MLQuest -{ - public ExtinguishingTheFlame() - { - Activated = true; - Title = 1072911; // Extinguishing the Flame - Description = 1072966; // The Dragon's Flame sect members have gone too far! Express to them my displeasure by slaying ten of them. But remember, I do not condone war on women, so I will only accept the deaths of men, human or elf. Either race will do, I care not for the shape of their ears. Yes, this action will properly make clear my disapproval and has a pleasing harmony. - RefusalMessage = 1072979; // As you wish. - InProgressMessage = 1072980; // The Black Order's fortress home is well hidden. Legend has it that a humble fishing village disguises the magical portal. - - // TODO: This has to be MALES only! - Objectives.Add( new KillObjective( 10, new Type[] { typeof( DragonsFlameMage ) }, "male dragon's flame mages", new QuestArea( 1074804, "The Citadel" ) ) ); // The Citadel - - Rewards.Add( ItemReward.BagOfTreasure ); - } -} -*/ - -public class DeathToTheNinja : MLQuest -{ - public DeathToTheNinja() - { - Activated = true; - Title = 1072913; // Death to the Ninja! - // I wish to make a statement of censure against the elite ninjas of the Black Order. Deliver, in the strongest manner, my disdain. But do not make war on women, even those that take arms against you. It is not ... fitting. - Description = 1072966; - RefusalMessage = 1072979; // As you wish. - // The Black Order's fortress home is well hidden. Legend has it that a humble fishing village disguises the magical portal. - InProgressMessage = 1072980; - - // TODO: Verify that this has to be males only (as per the description) - Objectives.Add( - new KillObjective( - 10, - new[] { typeof(EliteNinja) }, - "elite ninjas", - new QuestArea(1074804, "The Citadel") - ) - ); - - Rewards.Add(ItemReward.BagOfTreasure); - } -} - -/* TODO: Uncomment when TigersClawThief is added -public class CrimeAndPunishment : MLQuest -{ - public CrimeAndPunishment() - { - Activated = true; - Title = 1072914; // Crime and Punishment - Description = 1072968; // The Tiger's Claw sect members have gone too far! Express to them my displeasure by slaying ten of them. But remember, I do not condone war on women, so I will only accept the deaths of men, human and elf. - RefusalMessage = 1072979; // As you wish. - InProgressMessage = 1072980; // The Black Order's fortress home is well hidden. Legend has it that a humble fishing village disguises the magical portal. - - // TODO: This has to be MALES only! - Objectives.Add( new KillObjective( 10, new Type[] { typeof( TigersClawThief ) }, "male tiger's claw thieves", new QuestArea( 1074804, "The Citadel" ) ) ); // The Citadel - - Rewards.Add( ItemReward.BagOfTreasure ); - } -} -*/ - -/* TODO: Uncomment when ShimmeringEffusion is added -public class AllThatGlittersIsNotGood : MLQuest -{ - public AllThatGlittersIsNotGood() - { - Activated = true; - Title = 1073048; // All That Glitters is Not Good - Description = 1074654; // The most incredible tale has reached my ears! Deep within the bowels of Sosaria, somewhere under the city of Nu'Jelm, a twisted creature feeds. What created this abomination, no one knows ... though there is some speculation that the fumbling initial efforts to open the portal to The Heartwood, brought it into existence. Regardless of it's origin, it must be destroyed before it damages Sosaria. Will you undertake this quest? - RefusalMessage = 1074655; // Perhaps I thought too highly of you. - InProgressMessage = 1074656; // An explorer discovered the cave system under Nu'Jelm. He made multiple trips into the place bringing back fascinating crystals and artifacts that suggested the hollow place in Sosaria was inhabited by other creatures at some point. You'll need to follow in his footsteps to find this abomination and destroy it. - CompletionMessage = 1074657; // I am overjoyed with your efforts! Your devotion to Sosaria is noted and appreciated. - - Objectives.Add( new KillObjective( 1, new Type[] { typeof( ShimmeringEffusion ) }, "shimmering effusion" ) ); - - Rewards.Add( ItemReward.RewardStrongbox ); - } -} -*/ - -[QuesterName("Saril (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class Saril : BaseCreature -{ - [Constructible] - public Saril() : 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 WoodlandLegs()); - AddItem(new WoodlandArms()); - AddItem(new WoodlandBelt()); - AddItem(new WingedHelm()); - AddItem(new FemaleElvenPlateChest()); - AddItem(new RadiantScimitar()); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Saril"; - public override bool CanTeach => true; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - // Come here, I have a task. - // You there! I have a job for you. - MLQuestSystem.Tell(this, pm, Utility.RandomBool() ? 1074186 : 1074183); - } -} - -[QuesterName("Cailla (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class Cailla : BaseCreature -{ - [Constructible] - public Cailla() : 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 HidePauldrons()); - AddItem(new HideGloves()); - AddItem(new WoodlandBelt()); - AddItem(new RavenHelm()); - AddItem(new HideFemaleChest()); - AddItem(new MagicalShortbow()); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Cailla"; - public override bool CanTeach => true; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - // Want a job? - // Hi. Looking for something to do? - MLQuestSystem.Tell(this, pm, Utility.RandomBool() ? 1074187 : 1074210); - } -} - -[QuesterName("Tamm (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class Tamm : BaseCreature -{ - [Constructible] - public Tamm() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the guard"; - 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()); - AddItem(new HidePants()); - AddItem(new HidePauldrons()); - AddItem(new WingedHelm()); - AddItem(new HideChest()); - AddItem(new ElvenCompositeLongbow()); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Tamm"; - public override bool CanTeach => true; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - // Hey buddy. Looking for work? - // Want a job? - MLQuestSystem.Tell(this, pm, Utility.RandomBool() ? 1074213 : 1074187); - } -} - -[QuesterName("Landy (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class Landy : BaseCreature -{ - [Constructible] - public Landy() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the soil nurturer"; - 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(Utility.RandomYellowHue())); - AddItem(new ShortPants(Utility.RandomYellowHue())); - AddItem(new Tunic(Utility.RandomYellowHue())); - - AddItem(new LeafGloves - { - Hue = Utility.RandomYellowHue() - }); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Landy"; - public override bool CanTeach => true; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - // I could use some help. - // Hey! I want to talk to you, now. - MLQuestSystem.Tell(this, pm, Utility.RandomBool() ? 1074211 : 1074218); - } -} - -[QuesterName("Elder Alejaha (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class Alejaha : BaseCreature -{ - [Constructible] - public Alejaha() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the wise"; - 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(Utility.RandomYellowHue())); - AddItem(new ElvenShirt(Utility.RandomYellowHue())); - AddItem(new GemmedCirclet()); - AddItem(new Cloak(Utility.RandomBrightHue())); - - if (Utility.RandomBool()) - { - AddItem(new Kilt(0x387)); - } - else - { - AddItem(new Skirt(0x387)); - } - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Elder Alejaha"; - public override bool CanTeach => true; - - 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("Mielan (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class Mielan : BaseCreature -{ - [Constructible] - public Mielan() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the arcanist"; - 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 ElvenShirt(0x56)); - AddItem(new GemmedCirclet()); - AddItem(new ElvenPants(0x901)); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Mielan"; - public override bool CanTeach => true; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - // Hello there, can I have a moment of your time? - // Have you done it yet? Oh, I haven't told you, have I? - MLQuestSystem.Tell(this, pm, Utility.RandomBool() ? 1074219 : 1074223); - } -} - -[QuesterName("Ciala (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class Ciala : BaseCreature -{ - [Constructible] - public Ciala() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the arborist"; - 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 Skirt(Utility.RandomBlueHue())); - AddItem(new ElvenShirt(Utility.RandomYellowHue())); - AddItem(new RoyalCirclet()); - - if (Utility.RandomBool()) - { - AddItem(new Boots(Utility.RandomYellowHue())); - } - else - { - AddItem(new ThighBoots(Utility.RandomYellowHue())); - } - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Ciala"; - public override bool CanTeach => true; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - // Excuse me please traveler, might I have a little of your time? - // Come here, I have a task. - MLQuestSystem.Tell(this, pm, Utility.RandomBool() ? 1074206 : 1074186); - } -} - -[QuesterName("Aniel (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class Aniel : BaseCreature -{ - [Constructible] - public Aniel() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the arborist"; - 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 ElvenPants(0x901)); - AddItem(new LeafChest()); - AddItem(new HalfApron(Utility.RandomYellowHue())); - AddItem(new ElvenBoots(0x901)); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Aniel"; - public override bool CanTeach => true; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - // May I call you friend? I have a favor to beg of you. - // Could I trouble you for some assistance? - MLQuestSystem.Tell(this, pm, Utility.RandomBool() ? 1074220 : 1074222); - } -} - -[QuesterName("Aulan (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class Aulan : BaseCreature -{ - [Constructible] - public Aulan() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the expeditionist"; - 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); - - Item item; - - item = new ElvenBoots(); - item.Hue = Utility.RandomYellowHue(); - AddItem(item); - - AddItem(new ElvenPants(Utility.RandomGreenHue())); - AddItem(new Cloak(Utility.RandomGreenHue())); - AddItem(new Circlet()); - - item = new HideChest(); - item.Hue = Utility.RandomYellowHue(); - AddItem(item); - - item = new HideGloves(); - item.Hue = Utility.RandomYellowHue(); - AddItem(item); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Aulan"; - public override bool CanTeach => true; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell( - this, - pm, - Utility.Random(3) switch - { - 0 => 1074188, // Weakling! You are not up to the task I have. - 1 => 1074191, // Just keep walking away! I thought so. Coward! I'll bite your legs off! - _ => 1074195 // You there, in the stupid hat! Come here. - } - ); - } -} - -[QuesterName("Brinnae (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class Brinnae : BaseCreature -{ - [Constructible] - public Brinnae() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the wise"; - 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 FemaleLeafChest()); - AddItem(new LeafArms()); - AddItem(new HidePants()); - AddItem(new ElvenCompositeLongbow()); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Brinnae"; - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - // *yawn* You busy? - // Hi. Looking for something to do? - MLQuestSystem.Tell(this, pm, Utility.RandomBool() ? 1074212 : 1074210); - } -} - -[QuesterName("Elder Caelas (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class Caelas : BaseCreature -{ - [Constructible] - public Caelas() : 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 ElvenBoots(0x1BB)); - AddItem(new MaleElvenRobe(0x489)); - AddItem(new Cloak(0x718)); - AddItem(new RoyalCirclet()); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Elder Caelas"; - public override bool CanTeach => true; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - // Greetings seeker. I have an urgent matter for you, if you are willing. - // Waste not a minute! There's work to be done. - MLQuestSystem.Tell(this, pm, Utility.RandomBool() ? 1074204 : 1074201); - } -} - -[QuesterName("Clehin (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class Clehin : BaseCreature -{ - [Constructible] - public Clehin() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the soil nurturer"; - 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 ElvenShirt()); - AddItem(new LeafTonlet()); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Clehin"; - public override bool CanTeach => true; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - // I could use some help. - // Come here, I have a task. - MLQuestSystem.Tell(this, pm, Utility.RandomBool() ? 1074211 : 1074186); - } -} - -[SerializationGenerator(0, false)] -public partial class Cloorne : BaseCreature -{ - [Constructible] - public Cloorne() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the expeditionist"; - 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(0x3B2)); - AddItem(new RadiantScimitar()); - AddItem(new WingedHelm()); - - Item item; - - item = new WoodlandLegs(); - item.Hue = 0x74A; - AddItem(item); - - item = new HideChest(); - item.Hue = 0x726; - AddItem(item); - - item = new LeafArms(); - item.Hue = 0x73E; - AddItem(item); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Cloorne"; - public override bool CanTeach => true; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - // Hey you! Want to help me out? - // Come here, I have a task. - MLQuestSystem.Tell(this, pm, Utility.RandomBool() ? 1074185 : 1074186); - } -} - -[QuesterName("Salaenih (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class Salaenih : BaseCreature -{ - [Constructible] - public Salaenih() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the expeditionist"; - 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 WarCleaver()); - - Item item; - - item = new WoodlandBelt(); - item.Hue = 0x597; - AddItem(item); - - item = new VultureHelm(); - item.Hue = 0x1BB; - AddItem(item); - - item = new WoodlandLegs(); - item.Hue = 0x1BB; - AddItem(item); - - item = new WoodlandChest(); - item.Hue = 0x1BB; - AddItem(item); - - item = new WoodlandArms(); - item.Hue = 0x1BB; - AddItem(item); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Salaenih"; - public override bool CanTeach => true; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - // Good day to you friend! Allow me to offer you a fabulous opportunity! Thrills and adventure await! - // Hey, could you help me out with something? - MLQuestSystem.Tell(this, pm, Utility.RandomBool() ? 1074207 : 1074209); - } -} - -[QuesterName("Vilo (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class Vilo : BaseCreature -{ - [Constructible] - public Vilo() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the guard"; - 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 OrnateAxe()); - AddItem(new WoodlandBelt(0x592)); - AddItem(new VultureHelm()); - AddItem(new WoodlandLegs()); - AddItem(new WoodlandChest()); - AddItem(new WoodlandArms()); - AddItem(new WoodlandGorget()); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Vilo"; - public override bool CanTeach => true; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - // Hi. Looking for something to do? - // May I call you friend? I have a favor to beg of you. - MLQuestSystem.Tell(this, pm, Utility.RandomBool() ? 1074210 : 1074220); - } -} - -[QuesterName("Tholef (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class Tholef : BaseCreature -{ - [Constructible] - public Tholef() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the grape tender"; - 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 FullApron(0x756)); - AddItem(new ShortPants(0x28C)); - AddItem(new Shirt(0x28C)); - - AddItem(new LeafArms - { - Hue = 0x28C - }); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Tholef"; - public override bool CanTeach => true; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - // Hey, could you help me out with something? - // Come here, I have work for you. - MLQuestSystem.Tell(this, pm, Utility.RandomBool() ? 1074209 : 1074184); - } -} - -[QuesterName("Tillanil (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class Tillanil : BaseCreature -{ - [Constructible] - public Tillanil() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the grape tender"; - 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 Tunic(0x759)); - AddItem(new ShortPants(0x21)); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Tillanil"; - public override bool CanTeach => true; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - // Want a job? - // Could I trouble you for some assistance? - MLQuestSystem.Tell(this, pm, Utility.RandomBool() ? 1074187 : 1074222); - } -} - -[QuesterName("Waelian (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class Waelian : BaseCreature -{ - [Constructible] - public Waelian() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the trinket 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 Shoes(0x901)); - AddItem(new SmithHammer()); - AddItem(new LongPants(0x340)); - AddItem(new GemmedCirclet()); - - AddItem(new LeafChest - { - Hue = 0x344 - }); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Waelian"; - public override bool CanTeach => true; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - // Greetings! I have a small task for you good traveler. - // Waste not a minute! There's work to be done. - MLQuestSystem.Tell(this, pm, Utility.RandomBool() ? 1074221 : 1074201); - } -} - -[QuesterName("Sleen (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class Sleen : BaseCreature -{ - [Constructible] - public Sleen() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the trinket 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 SmithHammer()); - AddItem(new Cloak(0x75A)); - AddItem(new ElvenShirt()); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Sleen"; - public override bool CanTeach => true; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - // Thank goodness you are here, there's no time to lose. - // Excuse me please traveler, might I have a little of your time? - MLQuestSystem.Tell(this, pm, Utility.RandomBool() ? 1074200 : 1074206); - } -} - -[QuesterName("Unoelil (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class Unoelil : BaseCreature -{ - [Constructible] - public Unoelil() : 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); - - SetSkill(SkillName.Meditation, 60.0, 80.0); - SetSkill(SkillName.Focus, 60.0, 80.0); - - AddItem(new ElvenBoots(0x1BB)); - AddItem(new ShortPants(0x1BB)); - AddItem(new Tunic(0x64D)); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Unoelil"; - public override bool CanTeach => true; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - // Come here, I have a task. - // Hey, could you help me out with something? - MLQuestSystem.Tell(this, pm, Utility.RandomBool() ? 1074209 : 1074186); - } -} - -[QuesterName("Anolly (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class Anolly : BaseCreature -{ - [Constructible] - public Anolly() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the bark 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 Sandals(0x901)); - AddItem(new ShortPants(0x3B3)); - AddItem(new FullApron(0x1BB)); - AddItem(new SmithHammer()); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Anolly"; - public override bool CanTeach => true; -} - -[QuesterName("Jusae (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class Jusae : BaseCreature -{ - [Constructible] - public Jusae() : 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(0x661)); - AddItem(new MagicalShortbow()); - - Item item; - - item = new HideChest(); - item.Hue = 0x27B; - AddItem(item); - - item = new HidePauldrons(); - item.Hue = 0x27E; - AddItem(item); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Jusae"; - public override bool CanTeach => true; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - // Hi. Looking for something to do? - // Hey buddy. Looking for work? - MLQuestSystem.Tell(this, pm, Utility.RandomBool() ? 1074210 : 1074213); - } -} - -[QuesterName("Cillitha (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class Cillitha : BaseCreature -{ - [Constructible] - public Cillitha() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the bowcrafter"; - 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 ElvenShirt(0x731)); - AddItem(new LeafLegs()); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Cillitha"; - public override bool CanTeach => true; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - // Have you done it yet?' Oh, I haven't told you, have I? - // Hey buddy. Looking for work? - MLQuestSystem.Tell(this, pm, Utility.RandomBool() ? 1074223 : 1074213); - } -} - -[QuesterName("Lohn (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class Lohn : BaseCreature -{ - [Constructible] - public Lohn() : 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 Shoes(0x901)); - AddItem(new LongPants(0x359)); - AddItem(new SmithHammer()); - AddItem(new GemmedCirclet()); - - AddItem(new LeafChest - { - Hue = 0x359 - }); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Lohn"; - public override bool CanTeach => true; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - // Hey, could you help me out with something? - // Want a job? - MLQuestSystem.Tell(this, pm, Utility.RandomBool() ? 1074209 : 1074187); - } -} - -[QuesterName("Olla (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class Olla : BaseCreature -{ - [Constructible] - public Olla() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the metal 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()); - AddItem(new LongPants(0x3B3)); - AddItem(new SmithHammer()); - AddItem(new FullApron(0x1BB)); - AddItem(new ElvenShirt()); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Olla"; - public override bool CanTeach => true; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - // Hey you! Want to help me out? - // Want a job? - MLQuestSystem.Tell(this, pm, Utility.RandomBool() ? 1074185 : 1074187); - } -} - -[QuesterName("Thallary (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class Thallary : BaseCreature -{ - [Constructible] - public Thallary() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the cloth 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 Sandals(0x901)); - AddItem(new LongPants(0x72E)); - AddItem(new Cloak(0x3B3)); - AddItem(new FancyShirt(0x13)); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Thallary"; - public override bool CanTeach => true; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - // Greetings! I have a small task for you good traveler. - // *yawn* You busy? - MLQuestSystem.Tell(this, pm, Utility.RandomBool() ? 1074221 : 1074212); - } -} - -[QuesterName("Ahie (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class Ahie : BaseCreature -{ - [Constructible] - public Ahie() : 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 Boots(0x901)); - AddItem(new Skirt(0x1C)); - AddItem(new Cloak(0x62)); - AddItem(new FancyShirt(0x738)); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Ahie"; - public override bool CanTeach => true; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - // Excuse me please traveler, might I have a little of your time? - // 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. - MLQuestSystem.Tell(this, pm, Utility.RandomBool() ? 1074206 : 1074203); - } -} - -[SerializationGenerator(0, false)] -public partial class Tyeelor : BaseCreature -{ - [Constructible] - public Tyeelor() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the expeditionist"; - Race = Race.Elf; - Body = 0x25D; - Female = false; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - AddItem(new ElvenBoots(0x1BB)); - - Item item; - - item = new WoodlandLegs(); - item.Hue = 0x236; - AddItem(item); - - item = new WoodlandChest(); - item.Hue = 0x236; - AddItem(item); - - item = new WoodlandArms(); - item.Hue = 0x236; - AddItem(item); - - item = new VultureHelm(); - item.Hue = 0x236; - AddItem(item); - - item = new WoodlandBelt(); - item.Hue = 0x236; - AddItem(item); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Tyeelor"; -} - -[SerializationGenerator(0, false)] -public partial class Athailon : BaseCreature -{ - [Constructible] - public Athailon() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the expeditionist"; - 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(0x901)); - AddItem(new WoodlandBelt()); - AddItem(new DiamondMace()); - - Item item; - - item = new WoodlandLegs(); - item.Hue = 0x3B2; - AddItem(item); - - item = new FemaleElvenPlateChest(); - item.Hue = 0x3B2; - AddItem(item); - - item = new WoodlandArms(); - item.Hue = 0x3B2; - AddItem(item); - - item = new WingedHelm(); - item.Hue = 0x3B2; - AddItem(item); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Athailon"; -} - -[SerializationGenerator(0, false)] -public partial class ElderTaellia : BaseCreature -{ - [Constructible] - public ElderTaellia() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the wise"; - Race = Race.Elf; - Body = 0x25E; - Female = true; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - AddItem(new ThighBoots(0x127)); - AddItem(new FemaleElvenRobe(Utility.RandomBrightHue())); - AddItem(new MagicWand()); - AddItem(new Circlet()); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Elder Taellia"; -} - -[SerializationGenerator(0, false)] -public partial class ElderMallew : BaseCreature -{ - [Constructible] - public ElderMallew() : 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); - - AddItem(new ElvenBoots(0x1BB)); - AddItem(new Cloak(0x3B2)); - AddItem(new Circlet()); - - Item item; - - item = new LeafTonlet(); - item.Hue = 0x544; - AddItem(item); - - item = new LeafChest(); - item.Hue = 0x538; - AddItem(item); - - item = new LeafArms(); - item.Hue = 0x528; - AddItem(item); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Elder Mallew"; -} - -[SerializationGenerator(0, false)] -public partial class ElderAbbein : BaseCreature -{ - [Constructible] - public ElderAbbein() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the wise"; - 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(0x72C)); - AddItem(new FemaleElvenRobe(0x8B0)); - AddItem(new RoyalCirclet()); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Elder Abbein"; -} - -[SerializationGenerator(0, false)] -public partial class ElderVicaie : BaseCreature -{ - [Constructible] - public ElderVicaie() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the wise"; - 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 Tunic(0x732)); - - AddItem(new LeafLegs - { - Hue = 0x3B2 - }); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Elder Vicaie"; -} - -[SerializationGenerator(0, false)] -public partial class ElderJothan : BaseCreature -{ - [Constructible] - public ElderJothan() : 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); - - AddItem(new ThighBoots()); - AddItem(new ElvenPants(0x58D)); - AddItem(new ElvenShirt(Utility.RandomYellowHue())); - AddItem(new Cloak(Utility.RandomBrightHue())); - AddItem(new Circlet()); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Elder Jothan"; -} - -[SerializationGenerator(0, false)] -public partial class ElderAlethanian : BaseCreature -{ - [Constructible] - public ElderAlethanian() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the wise"; - 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 HidePants()); - AddItem(new HideFemaleChest()); - AddItem(new HidePauldrons()); - AddItem(new GemmedCirclet()); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Elder Alethanian"; -} - -[SerializationGenerator(0, false)] -public partial class Rebinil : BaseCreature -{ - [Constructible] - public Rebinil() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the healer"; - Race = Race.Elf; - Body = 0x25E; - Female = true; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - AddItem(new Sandals(0x715)); - AddItem(new FemaleElvenRobe(0x742)); - AddItem(new RoyalCirclet()); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Rebinil"; -} - -[SerializationGenerator(0, false)] -public partial class Aluniol : BaseCreature -{ - [Constructible] - public Aluniol() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the healer"; - Race = Race.Elf; - Body = 0x25D; - Female = false; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - AddItem(new ElvenBoots(0x1BB)); - AddItem(new MaleElvenRobe(0x47E)); - AddItem(new WildStaff()); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Aluniol"; -} - -[SerializationGenerator(0, false)] -public partial class Olaeni : BaseCreature -{ - [Constructible] - public Olaeni() : 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); - - AddItem(new Shoes(0x75A)); - AddItem(new FemaleElvenRobe(0x13)); - AddItem(new MagicWand()); - AddItem(new GemmedCirclet()); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Olaeni"; -} - -[SerializationGenerator(0, false)] -public partial class Bolaevin : BaseCreature -{ - [Constructible] - public Bolaevin() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the arcanist"; - Race = Race.Elf; - Body = 0x25D; - Female = false; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - AddItem(new ElvenBoots(0x3B2)); - AddItem(new RoyalCirclet()); - AddItem(new LeafChest()); - AddItem(new LeafArms()); - - AddItem(new LeafLegs - { - Hue = 0x1BB - }); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Bolaevin"; -} - -[SerializationGenerator(0, false)] -public partial class LorekeeperAneen : BaseCreature -{ - [Constructible] - public LorekeeperAneen() : 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); - - AddItem(new Sandals(0x1BB)); - AddItem(new MaleElvenRobe(0x48F)); - AddItem(new MagicWand()); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Lorekeeper Aneen"; -} - -[SerializationGenerator(0, false)] -public partial class Daelas : BaseCreature -{ - [Constructible] - public Daelas() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the arborist"; - Race = Race.Elf; - Body = 0x25D; - Female = false; - Hue = Race.RandomSkinHue(); - - SetSpeed(0.5, 2.0); - InitStats(100, 100, 25); - - Utility.AssignRandomHair(this); - - AddItem(new ElvenBoots(0x901)); - AddItem(new ElvenPants(0x8AB)); - - Item item; - - item = new LeafChest(); - item.Hue = 0x8B0; - AddItem(item); - - item = new LeafGloves(); - item.Hue = 0x1BB; - AddItem(item); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Daelas"; -} - -[SerializationGenerator(0, false)] -public partial class Alelle : BaseCreature -{ - [Constructible] - public Alelle() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the arborist"; - 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(0x1BB)); - - Item item; - - item = new FemaleLeafChest(); - item.Hue = 0x3A; - AddItem(item); - - item = new LeafLegs(); - item.Hue = 0x74C; - AddItem(item); - - item = new LeafGloves(); - item.Hue = 0x1BB; - AddItem(item); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Alelle"; -} - -[QuesterName("Nillaen (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class LorekeeperNillaen : BaseCreature -{ - [Constructible] - public LorekeeperNillaen() : 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 Shoes(0x1BB)); - AddItem(new LongPants(0x1FB)); - AddItem(new ElvenShirt()); - AddItem(new GemmedCirclet()); - AddItem(new BodySash(0x25)); - AddItem(new BlackStaff()); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Lorekeeper Nillaen"; - public override bool CanTeach => true; -} - -[QuesterName("Ryal (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class LorekeeperRyal : BaseCreature -{ - [Constructible] - public LorekeeperRyal() : 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 ElvenBoots(0x1BB)); - AddItem(new LeafTonlet()); - AddItem(new ElvenShirt(0x2DD)); - AddItem(new Cloak(0x219)); - AddItem(new GnarledStaff()); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Lorekeeper Ryal"; - public override bool CanTeach => true; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - // Greetings seeker. I have an urgent matter for you, if you are willing. - // Thank goodness you are here, there's no time to lose. - MLQuestSystem.Tell(this, pm, Utility.RandomBool() ? 1074204 : 1074200); - } -} - -[QuesterName("Braen (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class Braen : BaseCreature -{ - [Constructible] - public Braen() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the thaumaturgist"; - 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(0x714)); - AddItem(new MaleElvenRobe(0x64A)); - AddItem(new MagicWand()); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Braen"; - public override bool CanTeach => true; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1074187); // Want a job? - } -} - -[QuesterName("Elder Acob (The Heartwood)")] -[SerializationGenerator(0, false)] -public partial class ElderAcob : BaseCreature -{ - [Constructible] - public ElderAcob() : 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 ElvenBoots(0x714)); - AddItem(new ElvenShirt(Utility.RandomBrightHue())); - AddItem(new HidePants()); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Elder Acob"; - public override bool CanTeach => true; - - 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. - } -} - -[SerializationGenerator(0, false)] -public partial class LorekeeperCalendor : BaseCreature -{ - [Constructible] - public LorekeeperCalendor() : 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(0x714)); - AddItem(new ElvenShirt(Utility.RandomOrangeHue())); - AddItem(new Kilt(Utility.RandomOrangeHue())); - AddItem(new RoyalCirclet()); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Lorekeeper Calendor"; - public override bool CanTeach => true; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1074204); // Greetings seeker. I have an urgent matter for you, if you are willing. - } -} - -[SerializationGenerator(0, false)] -public partial class LorekeeperSiarra : BaseCreature -{ - [Constructible] - public LorekeeperSiarra() : 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 Sandals(0x1BB)); - AddItem(new ElvenShirt()); - AddItem(new LeafTonlet()); - AddItem(new GemmedCirclet()); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Lorekeeper Siarra"; - public override bool CanTeach => true; - - public override bool CanShout => true; - - public override void Shout(PlayerMobile pm) - { - MLQuestSystem.Tell(this, pm, 1074206); // Excuse me please traveler, might I have a little of your time? - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Definitions/Heritage.cs b/Projects/UOContent/Engines/ML Quests/Definitions/Heritage.cs deleted file mode 100644 index 6be0871d2..000000000 --- a/Projects/UOContent/Engines/ML Quests/Definitions/Heritage.cs +++ /dev/null @@ -1,571 +0,0 @@ -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; - -public class Seasons : MLQuest -{ - 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! - - 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 - } -} - -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")] -[SerializationGenerator(0, false)] -public partial class MaulTheBear : GrizzlyBear -{ - [Constructible] - public MaulTheBear() - { - AI = AIType.AI_Vendor; - FightMode = FightMode.None; - Tamable = false; - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Maul"; -} - -[SerializationGenerator(0, false)] -public partial class Strongroot : Treefellow -{ - [Constructible] - public Strongroot() - { - AI = AIType.AI_Vendor; - FightMode = FightMode.None; - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Strongroot"; -} - -[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 deleted file mode 100644 index add2bbc3c..000000000 --- a/Projects/UOContent/Engines/ML Quests/Definitions/HonestBeggar.cs +++ /dev/null @@ -1,107 +0,0 @@ -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; - -public class HonestBeggar : MLQuest -{ - 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? - - 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))); - - Rewards.Add(new DummyReward(1075394)); // Find the ring's owner. - } - - 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 deleted file mode 100644 index 8e24c61cd..000000000 --- a/Projects/UOContent/Engines/ML Quests/Definitions/Ilshenar.cs +++ /dev/null @@ -1,256 +0,0 @@ -using ModernUO.Serialization; -using Server.Engines.MLQuests.Objectives; -using Server.Engines.MLQuests.Rewards; -using Server.Items; -using Server.Mobiles; - -namespace Server.Engines.MLQuests.Definitions; - -public class Responsibility : BaseEscort -{ - 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. - - 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. - // } -} - -public class SomethingToWailAbout : MLQuest -{ - 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. - - 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); - } -} - -[SerializationGenerator(0, false)] -public partial class Lissbet : BaseEscortable -{ - [Constructible] - public Lissbet() - { - } - - 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()); - } -} - -[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/IronForTheForge.cs b/Projects/UOContent/Engines/ML Quests/Definitions/IronForTheForge.cs index 6aa85ab79..3a0890112 100644 --- a/Projects/UOContent/Engines/ML Quests/Definitions/IronForTheForge.cs +++ b/Projects/UOContent/Engines/ML Quests/Definitions/IronForTheForge.cs @@ -11,6 +11,11 @@ namespace Server.Engines.MLQuests.Definitions; public class IronForTheForge : MLQuest { + public static void Initialize() + { + MLQuestSystem.Register(new IronForTheForge(), typeof(QuestBlacksmith)); + } + public IronForTheForge() { Activated = true; @@ -28,20 +33,11 @@ public class IronForTheForge : MLQuest // Reward: 500 Gold Rewards.Add(new ItemReward("500 Gold", typeof(Gold), 500)); } - - public override void Generate() - { - base.Generate(); - - // Registers this quest and links it to QuestBlacksmith - MLQuestSystem.Register(this, typeof(QuestBlacksmith)); - } } [SerializationGenerator(0, false)] public partial class QuestBlacksmith : BaseCreature, IQuestGiver { - // Implementation for IQuestGiver public List MLQuests => MLQuestSystem.FindQuestList(GetType()); [Constructible] @@ -49,14 +45,23 @@ public partial class QuestBlacksmith : BaseCreature, IQuestGiver { Title = "the Blacksmith"; Race = Race.Human; - Body = 0x190; - Female = false; + + Female = Utility.RandomBool(); + Body = Female ? 0x191 : 0x190; + Name = NameList.RandomName(Female ? "female" : "male"); + Hue = Race.RandomSkinHue(); SetSpeed(0.5, 2.0); InitStats(100, 100, 25); - Utility.AssignRandomHair(this); + int hairHue = Race.RandomHairHue(); + Utility.AssignRandomHair(this, hairHue); + + if (!Female) + { + Utility.AssignRandomFacialHair(this, hairHue); + } AddItem(new Backpack()); AddItem(new ShortPants(0x755)); @@ -67,5 +72,4 @@ public partial class QuestBlacksmith : BaseCreature, IQuestGiver } public override bool IsInvulnerable => true; - public override string DefaultName => "Gareth"; } diff --git a/Projects/UOContent/Engines/ML Quests/Definitions/LostItems.cs b/Projects/UOContent/Engines/ML Quests/Definitions/LostItems.cs deleted file mode 100644 index ff1c023cd..000000000 --- a/Projects/UOContent/Engines/ML Quests/Definitions/LostItems.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using ModernUO.Serialization; -using Server.Engines.MLQuests.Items; -using Server.Engines.MLQuests.Objectives; -using Server.Engines.MLQuests.Rewards; - -namespace Server.Engines.MLQuests.Definitions; -// TODO: Assassination Contract, Evidence, Lost in Transit, Last Words - -public class LostAndFound : MLQuest -{ - public LostAndFound() - { - Activated = true; - Title = 1072370; // Lost and Found - Description = - 1072589; // The battered, old bucket is inscribed with barely legible writing that indicates it belongs to someone named "Dallid". Maybe they'd pay for its return? - RefusalMessage = - 1072590; // You're right, who cares if Dallid might pay for his battered old bucket back. This way you can carry it around with you! - InProgressMessage = 1072591; // Whoever this "Dallid" might be, he's probably looking for his bucket. - CompletionMessage = - 1074580; // Is that my bucket? I had to ditch my favorite bucket when a group of ratmen jumped me! - - Objectives.Add( - new TimedDeliverObjective( - TimeSpan.FromSeconds(600), - typeof(BatteredBucket), - 1, - "battered bucket", - typeof(Dallid), - false - ) - ); - - Rewards.Add(ItemReward.BagOfTrinkets); - } -} - -[SerializationGenerator(0, false)] -public partial class BatteredBucket : TransientQuestGiverItem -{ - [Constructible] - public BatteredBucket() : base(0x2004, TimeSpan.FromMinutes(10)) => LootType = LootType.Blessed; - - // Original label, doesn't fit the expiration message well - // public override int LabelNumber => 1073129; // A battered bucket. - - public override string DefaultName => "battered bucket"; -} diff --git a/Projects/UOContent/Engines/ML Quests/Definitions/Malas.cs b/Projects/UOContent/Engines/ML Quests/Definitions/Malas.cs deleted file mode 100644 index f10b02d09..000000000 --- a/Projects/UOContent/Engines/ML Quests/Definitions/Malas.cs +++ /dev/null @@ -1,61 +0,0 @@ -using ModernUO.Serialization; -using Server.Engines.MLQuests.Objectives; -using Server.Engines.MLQuests.Rewards; -using Server.Items; -using Server.Mobiles; - -namespace Server.Engines.MLQuests.Definitions; - -public class PointyEars : MLQuest -{ - 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? - - Objectives.Add(new CollectObjective(20, typeof(SeveredElfEars), 1032590)); // severed elf ears - - 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 deleted file mode 100644 index 963c2df42..000000000 --- a/Projects/UOContent/Engines/ML Quests/Definitions/MistakenIdentity.cs +++ /dev/null @@ -1,304 +0,0 @@ -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; - -public class MistakenIdentity : MLQuest -{ - 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; - - 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); -} - -public class YouScratchMyBack : MLQuest -{ - 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; - - 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; -} - -public class FoolingAernya : MLQuest -{ - 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; - - 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; -} - -public class NotQuiteThatEasy : MLQuest -{ - 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; - - 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 - } -} - -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/NewHaven.cs b/Projects/UOContent/Engines/ML Quests/Definitions/NewHaven.cs deleted file mode 100644 index 271009316..000000000 --- a/Projects/UOContent/Engines/ML Quests/Definitions/NewHaven.cs +++ /dev/null @@ -1,125 +0,0 @@ -using Server.Engines.MLQuests.Objectives; -using Server.Engines.MLQuests.Rewards; -using Server.Items; - -namespace Server.Engines.MLQuests.Definitions -{ - public class NewHavenEscort : BaseEscort - { - // Escort reward - private static readonly BaseReward m_Reward = new ItemReward("Gold", typeof(Gold), 500); - - public NewHavenEscort(int title, int description, int progress, int destination, string region) - { - Activated = true; - Title = title; - Description = description; - RefusalMessage = - 1072288; // I wish you would reconsider my offer. I'll be waiting right here for someone brave enough to assist me. - InProgressMessage = progress; - - Objectives.Add(new EscortObjective(new QuestArea(destination, region))); - - Rewards.Add(m_Reward); - } - - // New Haven escorts do not count for 'helping a human in need' - public override bool AwardHumanInNeed => false; - } - - public class EscortToNHAlchemist : NewHavenEscort - { - public EscortToNHAlchemist() - : base(1072314, 1042769, 1072326, 1073864, "the New Haven Alchemist") - { - } - } - - public class EscortToNHBard : NewHavenEscort - { - public EscortToNHBard() - : base(1072315, 1042772, 1072327, 1073865, "the New Haven Bard") - { - } - } - - public class EscortToNHWarrior : NewHavenEscort - { - public EscortToNHWarrior() - : base(1072316, 1042787, 1072328, 1073866, "the New Haven Warrior") - { - } - } - - public class EscortToNHTailor : NewHavenEscort - { - public EscortToNHTailor() - : base(1072317, 1042781, 1072329, 1073867, "the New Haven Tailor") - { - } - } - - public class EscortToNHCarpenter : NewHavenEscort - { - public EscortToNHCarpenter() - : base(1072318, 1042775, 1072330, 1073868, "the New Haven Carpenter") - { - } - } - - public class EscortToNHMapmaker : NewHavenEscort - { - public EscortToNHMapmaker() - : base(1072319, 1042793, 1072331, 1073869, "the New Haven Mapmaker") - { - } - } - - public class EscortToNHMage : NewHavenEscort - { - public EscortToNHMage() - : base(1072320, 1042790, 1072332, 1073870, "the New Haven Mage") - { - } - } - - public class EscortToNHInn : NewHavenEscort - { - public EscortToNHInn() - : base(1072321, 1042796, 1072333, 1073871, "the New Haven Inn") - { - } - } - - public class EscortToNHFarm : NewHavenEscort - { - public EscortToNHFarm() - : base(1072322, 1042799, 1072334, 1073872, "the New Haven Farm") - { - } - } - - public class EscortToNHDocks : NewHavenEscort - { - public EscortToNHDocks() - : base(1072323, 1042802, 1072335, 1073873, "the New Haven Docks") - { - } - } - - public class EscortToNHBowyer : NewHavenEscort - { - public EscortToNHBowyer() - : base(1072324, 1042805, 1072336, 1073874, "the New Haven Bowyer") - { - } - } - - public class EscortToNHBank : NewHavenEscort - { - public EscortToNHBank() - : base(1072325, 1042784, 1072337, 1073875, "the New Haven Bank") - { - } - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Definitions/NewHavenSkillTraining.cs b/Projects/UOContent/Engines/ML Quests/Definitions/NewHavenSkillTraining.cs deleted file mode 100644 index e0a051e0c..000000000 --- a/Projects/UOContent/Engines/ML Quests/Definitions/NewHavenSkillTraining.cs +++ /dev/null @@ -1,1865 +0,0 @@ -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; - -public class CleansingOldHaven : MLQuest -{ - 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. - - Objectives.Add(new GainSkillObjective(SkillName.Chivalry, 500, true, true)); - - 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()); - } - - private class InternalReward : ItemReward - { - public InternalReward() - : base(1078052, typeof(NecromancerSpellbook)) // Complete Necromancer Spellbook - { - } - - 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 - } -} - -[SerializationGenerator(0, false)] -public partial 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 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()); - } -} - -[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()); - - AddItem(new GustarShroud - { - Hue = 0x51C - }); - } - - 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)); - - AddItem(new SmithHammer - { - Hue = 0x8AB - }); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Definitions/NewHavenTraining.cs b/Projects/UOContent/Engines/ML Quests/Definitions/NewHavenTraining.cs deleted file mode 100644 index 324898047..000000000 --- a/Projects/UOContent/Engines/ML Quests/Definitions/NewHavenTraining.cs +++ /dev/null @@ -1,773 +0,0 @@ -using ModernUO.Serialization; -using Server.Engines.MLQuests.Objectives; -using Server.Engines.MLQuests.Rewards; -using Server.Items; -using Server.Mobiles; - -namespace Server.Engines.MLQuests.Definitions; - -public class SplitEnds : MLQuest -{ - 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 - } -} - -[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()); - - AddItem(new LeatherGloves - { - Hue = 0x3B2 - }); - } - - 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()); - - AddItem(new PlateGloves - { - Hue = 0x21E - }); - } - - 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 deleted file mode 100644 index 605fca1c6..000000000 --- a/Projects/UOContent/Engines/ML Quests/Definitions/Sanctuary.cs +++ /dev/null @@ -1,1201 +0,0 @@ -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; - -public class BrokenShaft : MLQuest -{ - 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)")] -[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)); - - AddItem(new LeafGloves - { - Hue = 0x901 - }); - } - - 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()); - - AddItem(new LeafLegs - { - Hue = 0x71A - }); - } - - 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 deleted file mode 100644 index 96c9431ea..000000000 --- a/Projects/UOContent/Engines/ML Quests/Definitions/Spellweaving.cs +++ /dev/null @@ -1,667 +0,0 @@ -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; - -public static class Spellweaving -{ - public static void AwardTo(PlayerMobile pm) - { - 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); - } - } -} - -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); - - AddItem(new RavenHelm - { - Hue = Utility.RandomGreenHue() - }); - - 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 deleted file mode 100644 index 89de165db..000000000 --- a/Projects/UOContent/Engines/ML Quests/Definitions/TheAncientWorld.cs +++ /dev/null @@ -1,133 +0,0 @@ -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; - -public class TheAncientWorld : MLQuest -{ - 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? - - 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); -} - -public class TheGoldenHorn : MLQuest -{ - 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. - - 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; -} - -public class Bullish : MLQuest -{ - 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. - - 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; -} - -public class LostCivilization : MLQuest -{ - 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. - - Objectives.Add(new CollectObjective(3, typeof(MinotaurArtifact), "minotaur artifacts")); - - Rewards.Add(ItemReward.Strongbox); - } - - 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) - { - 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(0x70D)); - AddItem(new FemaleElvenRobe(0x3A)); - AddItem(new WildStaff()); - } - - 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. - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Definitions/TownEscorts.cs b/Projects/UOContent/Engines/ML Quests/Definitions/TownEscorts.cs deleted file mode 100644 index 612b0b3ed..000000000 --- a/Projects/UOContent/Engines/ML Quests/Definitions/TownEscorts.cs +++ /dev/null @@ -1,131 +0,0 @@ -using Server.Engines.MLQuests.Objectives; -using Server.Engines.MLQuests.Rewards; -using Server.Items; - -namespace Server.Engines.MLQuests.Definitions -{ - public class TownEscort : BaseEscort - { - // Escort reward - private static readonly BaseReward m_Reward = new ItemReward("Gold", typeof(Gold), 500); - - public TownEscort(int title, int progress, int destination, string region) - { - Activated = true; - Title = title; - Description = - 1072287; // I seek a worthy escort. I can offer some small pay to any able bodied adventurer who can assist me. It is imperative that I reach my destination. - RefusalMessage = - 1072288; // I wish you would reconsider my offer. I'll be waiting right here for someone brave enough to assist me. - InProgressMessage = progress; - - Objectives.Add(new EscortObjective(new QuestArea(destination, region))); - - Rewards.Add(m_Reward); - } - } - - public class EscortToYew : TownEscort - { - public EscortToYew() - : base(1072275, 1072289, 1072227, "Yew") - { - } - } - - public class EscortToVesper : TownEscort - { - public EscortToVesper() - : base(1072276, 1072290, 1072229, "Vesper") - { - } - } - - public class EscortToTrinsic : TownEscort - { - public EscortToTrinsic() - : base(1072277, 1072291, 1072236, "Trinsic") - { - } - } - - public class EscortToSkaraBrae : TownEscort - { - public EscortToSkaraBrae() - : base(1072278, 1072292, 1072235, "Skara Brae") - { - } - } - - public class EscortToSerpentsHold : TownEscort - { - public EscortToSerpentsHold() - : base(1072279, 1072293, 1072238, "Serpent's Hold") - { - } - } - - public class EscortToNujelm : TownEscort - { - public EscortToNujelm() - : base(1072280, 1072294, 1072237, "Nujel'm") - { - } - } - - public class EscortToMoonglow : TownEscort - { - public EscortToMoonglow() - : base(1072281, 1072295, 1072232, "Moonglow") - { - } - } - - public class EscortToMinoc : TownEscort - { - public EscortToMinoc() - : base(1072282, 1072296, 1072228, "Minoc") - { - } - } - - public class EscortToMagincia : TownEscort - { - public EscortToMagincia() - : base(1072283, 1072297, 1072233, "Magincia") - { - } - } - - public class EscortToJhelom : TownEscort - { - public EscortToJhelom() - : base(1072284, 1072298, 1072239, "Jhelom") - { - } - } - - public class EscortToCove : TownEscort - { - public EscortToCove() - : base(1072285, 1072299, 1072230, "Cove") - { - } - } - - public class EscortToBritain : TownEscort - { - public EscortToBritain() - : base(1072286, 1072300, 1072231, "Britain") - { - } - } - - public class EscortToOcllo : TownEscort - { - public EscortToOcllo() - : base(1072312, 1072313, 1072234, "Ocllo") - { - } - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Definitions/UnfadingMemories.cs b/Projects/UOContent/Engines/ML Quests/Definitions/UnfadingMemories.cs deleted file mode 100644 index fb2b56319..000000000 --- a/Projects/UOContent/Engines/ML Quests/Definitions/UnfadingMemories.cs +++ /dev/null @@ -1,138 +0,0 @@ -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; - -public class UnfadingMemoriesPartOne : MLQuest -{ - 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; - - 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); -} - -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/Definitions/WarriorsOfTheGemKeeper.cs b/Projects/UOContent/Engines/ML Quests/Definitions/WarriorsOfTheGemKeeper.cs deleted file mode 100644 index a03d3e0f1..000000000 --- a/Projects/UOContent/Engines/ML Quests/Definitions/WarriorsOfTheGemKeeper.cs +++ /dev/null @@ -1,95 +0,0 @@ -using System; -using Server.Engines.MLQuests.Objectives; -using Server.Engines.MLQuests.Rewards; -using Server.Items; - -namespace Server.Engines.MLQuests.Definitions -{ - public class WarriorsOfTheGemkeeper : MLQuest - { - public WarriorsOfTheGemkeeper() - { - Activated = true; - Title = 1074536; // Warriors of the Gemkeeper - Description = - 1074537; // Here we honor the Gemkeeper's Apprentice and seek to aid her efforts against the humans responsible for the death of her teacher - and the destruction of the elven way of life. Our tales speak of a fierce race of servants of the Gemkeeper, the men-bulls whose battle-skill was renowned. It is desireable to discover the fate of these noble creatures after the Rupture. Will you seek information? - RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. - InProgressMessage = - 1074540; // I care not how you get the information. Kill as many humans as you must ... but find the fate of the minotaurs. Perhaps another of the Gemkeeper's servants has the knowledge we seek. - CompletionMessage = 1074542; // What have you found? - - 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(CloseEnough); - } - - public class CloseEnough : MLQuest - { - public CloseEnough() - { - Activated = true; - Title = 1074544; // Close Enough - Description = - 1074546; // 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 seek out these warriors to see if they might join our cause. But, legend speaks of a mighty barrier to prevent invasion of the city. Take this map to Canir and explain the problem. Perhaps she can devise a solution. - RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then. - InProgressMessage = 1074548; // Canir is nearby, run and speak with her. - CompletionMessage = 1074549; // Yes? What do you want? I'm very busy. - - Objectives.Add(new DeliverObjective(typeof(FragmentOfAMapDelivery), 1, "fragment of a map", typeof(Canir))); - - Rewards.Add(new DummyReward(1074876)); // Knowledge of the legendary minotaur. - } - - public override Type NextQuest => typeof(TakingTheBullByTheHorns); - public override bool IsChainTriggered => true; - } - - public class TakingTheBullByTheHorns : MLQuest - { - public TakingTheBullByTheHorns() - { - Activated = true; - Title = 1074551; // Taking the Bull by the Horns - Description = - 1074553; // Interesting. I believe I have a way. 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")); - - Rewards.Add(new DummyReward(1074876)); // Knowledge of the legendary minotaur. - } - - public override Type NextQuest => typeof(EmissaryToTheMinotaur); - public override bool IsChainTriggered => true; - } - - public class EmissaryToTheMinotaur : MLQuest - { - public EmissaryToTheMinotaur() - { - Activated = true; - Title = 1074824; // Emissary to the Minotaur - 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")); - - Rewards.Add(ItemReward.Strongbox); - } - - public override bool IsChainTriggered => true; - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/ABauble.cs b/Projects/UOContent/Engines/ML Quests/Items/ABauble.cs deleted file mode 100644 index 5a58aef89..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/ABauble.cs +++ /dev/null @@ -1,12 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class ABauble : Item -{ - [Constructible] - public ABauble() : base(0x23B) => LootType = LootType.Blessed; - - public override int LabelNumber => 1073137; // A bauble -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/APersonalLetterAddressedToAhie.cs b/Projects/UOContent/Engines/ML Quests/Items/APersonalLetterAddressedToAhie.cs deleted file mode 100644 index edcaf0f7e..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/APersonalLetterAddressedToAhie.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class APersonalLetterAddressedToAhie : TransientItem -{ - [Constructible] - public APersonalLetterAddressedToAhie() : base(0x14ED, TimeSpan.FromMinutes(30)) => LootType = LootType.Blessed; - - public override int LabelNumber => 1073128; // A personal letter addressed to: Ahie - - public override bool Nontransferable => true; - - public override void AddNameProperties(IPropertyList list) - { - base.AddNameProperties(list); - AddQuestItemProperty(list); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/AlchemistsBandage.cs b/Projects/UOContent/Engines/ML Quests/Items/AlchemistsBandage.cs deleted file mode 100644 index 70b3f8ada..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/AlchemistsBandage.cs +++ /dev/null @@ -1,24 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class AlchemistsBandage : Item -{ - [Constructible] - public AlchemistsBandage() : base(0xE21) - { - LootType = LootType.Blessed; - Hue = 0x482; - } - - public override int LabelNumber => 1075452; // Alchemist's Bandage - - public override bool Nontransferable => true; - - public override void AddNameProperties(IPropertyList list) - { - base.AddNameProperties(list); - AddQuestItemProperty(list); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/AnOldNecklace.cs b/Projects/UOContent/Engines/ML Quests/Items/AnOldNecklace.cs deleted file mode 100644 index f3b478431..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/AnOldNecklace.cs +++ /dev/null @@ -1,12 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class AnOldNecklace : Necklace -{ - [Constructible] - public AnOldNecklace() => Hue = 0x222; - - public override int LabelNumber => 1075525; // an old necklace -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/AnOldRing.cs b/Projects/UOContent/Engines/ML Quests/Items/AnOldRing.cs deleted file mode 100644 index c39d6cfa7..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/AnOldRing.cs +++ /dev/null @@ -1,12 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class AnOldRing : GoldRing -{ - [Constructible] - public AnOldRing() => Hue = 0x222; - - public override int LabelNumber => 1075524; // an old ring -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/AndricSatchel.cs b/Projects/UOContent/Engines/ML Quests/Items/AndricSatchel.cs deleted file mode 100644 index 4812dfaf9..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/AndricSatchel.cs +++ /dev/null @@ -1,15 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class AndricSatchel : Backpack -{ - [Constructible] - public AndricSatchel() - { - Hue = Utility.RandomBrightHue(); - DropItem(new Feather(10)); - DropItem(new FletcherTools()); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/AndrosGratitude.cs b/Projects/UOContent/Engines/ML Quests/Items/AndrosGratitude.cs deleted file mode 100644 index 68ff4e22e..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/AndrosGratitude.cs +++ /dev/null @@ -1,12 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class AndrosGratitude : SmithHammer -{ - [Constructible] - public AndrosGratitude() : base(10) => LootType = LootType.Blessed; - - public override int LabelNumber => 1075345; // Andros Gratitude -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/AsandosSatchel.cs b/Projects/UOContent/Engines/ML Quests/Items/AsandosSatchel.cs deleted file mode 100644 index bdf751cf7..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/AsandosSatchel.cs +++ /dev/null @@ -1,15 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class AsandosSatchel : Backpack -{ - [Constructible] - public AsandosSatchel() - { - Hue = Utility.RandomBrightHue(); - DropItem(new SackFlour()); - DropItem(new Skillet()); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/BasinOfCrystalClearWater.cs b/Projects/UOContent/Engines/ML Quests/Items/BasinOfCrystalClearWater.cs deleted file mode 100644 index b040af141..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/BasinOfCrystalClearWater.cs +++ /dev/null @@ -1,20 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class BasinOfCrystalClearWater : Item -{ - [Constructible] - public BasinOfCrystalClearWater() : base(0x1008) => LootType = LootType.Blessed; - - public override int LabelNumber => 1075303; // Basin of Crystal-Clear Water - - public override bool Nontransferable => true; - - public override void AddNameProperties(IPropertyList list) - { - base.AddNameProperties(list); - AddQuestItemProperty(list); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/BedlamTeleporter.cs b/Projects/UOContent/Engines/ML Quests/Items/BedlamTeleporter.cs deleted file mode 100644 index 36b4d3c1c..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/BedlamTeleporter.cs +++ /dev/null @@ -1,34 +0,0 @@ -using ModernUO.Serialization; -using Server.Mobiles; - -namespace Server.Engines.MLQuests.Items; - -[SerializationGenerator(0, false)] -public partial class BedlamTeleporter : Item -{ - private static readonly Point3D PointDest = new(120, 1682, 0); - private static readonly Map MapDest = Map.Malas; - - public BedlamTeleporter() : base(0x124D) => Movable = false; - - public override int LabelNumber => 1074161; // Access to Bedlam by invitation only - - public override void OnDoubleClick(Mobile from) - { - if (!from.InRange(GetWorldLocation(), 2)) - { - from.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1019045); // I can't reach that. - return; - } - - if (from is PlayerMobile mobile && MLQuestSystem.GetContext(mobile)?.BedlamAccess == true) - { - BaseCreature.TeleportPets(mobile, PointDest, MapDest); - mobile.MoveToWorld(PointDest, MapDest); - } - else - { - from.SendLocalizedMessage(1074276); // You press and push on the iron maiden, but nothing happens. - } - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/Bleach.cs b/Projects/UOContent/Engines/ML Quests/Items/Bleach.cs deleted file mode 100644 index 9f6f43ed6..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/Bleach.cs +++ /dev/null @@ -1,12 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class Bleach : PigmentsOfTokuno -{ - [Constructible] - public Bleach() => LootType = LootType.Blessed; - - public override int LabelNumber => 1075375; // Bleach -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/BridesLetter.cs b/Projects/UOContent/Engines/ML Quests/Items/BridesLetter.cs deleted file mode 100644 index b8e9896c0..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/BridesLetter.cs +++ /dev/null @@ -1,20 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class BridesLetter : Item -{ - [Constructible] - public BridesLetter() : base(0x14ED) => LootType = LootType.Blessed; - - public override int LabelNumber => 1075301; // Bride's Letter - - public override bool Nontransferable => true; - - public override void AddNameProperties(IPropertyList list) - { - base.AddNameProperties(list); - AddQuestItemProperty(list); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/CompletedTuitionReimbursementForm.cs b/Projects/UOContent/Engines/ML Quests/Items/CompletedTuitionReimbursementForm.cs deleted file mode 100644 index d84f1494e..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/CompletedTuitionReimbursementForm.cs +++ /dev/null @@ -1,20 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class CompletedTuitionReimbursementForm : Item -{ - [Constructible] - public CompletedTuitionReimbursementForm() : base(0x14F0) => LootType = LootType.Blessed; - - public override int LabelNumber => 1074625; // Completed Tuition Reimbursement Form - - public override bool Nontransferable => true; - - public override void AddNameProperties(IPropertyList list) - { - base.AddNameProperties(list); - AddQuestItemProperty(list); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/CraftmansSatchel.cs b/Projects/UOContent/Engines/ML Quests/Items/CraftmansSatchel.cs deleted file mode 100644 index 3dea895a1..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/CraftmansSatchel.cs +++ /dev/null @@ -1,130 +0,0 @@ -using System; -using ModernUO.Serialization; -using Server.Engines.Craft; -using Server.Items; - -namespace Server.Engines.MLQuests.Items; - -[SerializationGenerator(0, false)] -public abstract partial class BaseCraftmansSatchel : Backpack -{ - protected static readonly Type[] m_TalismanType = { typeof(RandomTalisman) }; - - public BaseCraftmansSatchel() => Hue = Utility.RandomBrightHue(); - - protected void AddBaseLoot(params Type[][] lootSets) - { - var loot = Loot.Construct(lootSets.RandomElement()); - - if (loot == null) - { - return; - } - - RewardBag.Enhance(loot); - DropItem(loot); - } - - protected void AddRecipe(CraftSystem system) - { - // TODO: change craftable artifact recipes to a rarer drop - var recipeID = system.RandomRecipe(); - - if (recipeID != -1) - { - DropItem(new RecipeScroll(recipeID)); - } - } -} - -[SerializationGenerator(0, false)] -public partial class TailorSatchel : BaseCraftmansSatchel -{ - [Constructible] - public TailorSatchel() - { - AddBaseLoot(Loot.MLArmorTypes, Loot.JewelryTypes, m_TalismanType); - - if (Utility.RandomBool()) - { - AddRecipe(DefTailoring.CraftSystem); - } - } -} - -[SerializationGenerator(0, false)] -public partial class BlacksmithSatchel : BaseCraftmansSatchel -{ - [Constructible] - public BlacksmithSatchel() - { - AddBaseLoot(Loot.MLWeaponTypes, Loot.JewelryTypes, m_TalismanType); - - if (Utility.RandomBool()) - { - AddRecipe(DefBlacksmithy.CraftSystem); - } - } -} - -[SerializationGenerator(0, false)] -public partial class TinkerSatchel : BaseCraftmansSatchel -{ - [Constructible] - public TinkerSatchel() - { - AddBaseLoot(Loot.MLArmorTypes, Loot.MLWeaponTypes, Loot.MLRangedWeaponTypes, Loot.JewelryTypes, m_TalismanType); - - if (Utility.RandomBool()) - { - switch (Utility.Random(6)) - { - case 0: - AddRecipe(DefInscription.CraftSystem); - break; - case 1: - AddRecipe(DefAlchemy.CraftSystem); - break; - // TODO - // case 2: AddNonArtifactRecipe( DefTailoring.CraftSystem ); break; - // case 3: AddNonArtifactRecipe( DefBlacksmithy.CraftSystem ); break; - // case 4: AddNonArtifactRecipe( DefCarpentry.CraftSystem ); break; - // case 5: AddNonArtifactRecipe( DefBowFletching.CraftSystem ); break; - } - } - } -} - -[SerializationGenerator(0, false)] -public partial class FletchingSatchel : BaseCraftmansSatchel -{ - [Constructible] - public FletchingSatchel() - { - AddBaseLoot(Loot.MLRangedWeaponTypes, Loot.JewelryTypes, m_TalismanType); - - if (Utility.RandomBool()) - { - AddRecipe(DefBowFletching.CraftSystem); - } - - // TODO: runic fletching kit - } -} - -[SerializationGenerator(0, false)] -public partial class CarpentrySatchel : BaseCraftmansSatchel -{ - [Constructible] - public CarpentrySatchel() - { - AddBaseLoot(Loot.MLArmorTypes, Loot.MLWeaponTypes, Loot.MLRangedWeaponTypes, Loot.JewelryTypes, m_TalismanType); - - if (Utility.RandomBool()) - { - AddRecipe(DefCarpentry.CraftSystem); - } - - // TODO: Add runic dovetail saw - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/CrateForSledge.cs b/Projects/UOContent/Engines/ML Quests/Items/CrateForSledge.cs deleted file mode 100644 index a5c759b6b..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/CrateForSledge.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class CrateForSledge : TransientItem -{ - [Constructible] - public CrateForSledge() : base(0x1FFF, TimeSpan.FromHours(1)) => LootType = LootType.Blessed; - - public override int LabelNumber => 1074520; // Crate for Sledge - - public override bool Nontransferable => true; - - public override void AddNameProperties(IPropertyList list) - { - base.AddNameProperties(list); - AddQuestItemProperty(list); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/DreadSpiderSilk.cs b/Projects/UOContent/Engines/ML Quests/Items/DreadSpiderSilk.cs deleted file mode 100644 index fc13016aa..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/DreadSpiderSilk.cs +++ /dev/null @@ -1,24 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class DreadSpiderSilk : Item -{ - [Constructible] - public DreadSpiderSilk() : base(0xDF8) - { - LootType = LootType.Blessed; - Hue = 0x481; - } - - public override int LabelNumber => 1075319; // Dread Spider Silk - - public override bool Nontransferable => true; - - public override void AddNameProperties(IPropertyList list) - { - base.AddNameProperties(list); - AddQuestItemProperty(list); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/FragmentOfAMap.cs b/Projects/UOContent/Engines/ML Quests/Items/FragmentOfAMap.cs deleted file mode 100644 index 707639ff1..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/FragmentOfAMap.cs +++ /dev/null @@ -1,12 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class FragmentOfAMap : Item -{ - [Constructible] - public FragmentOfAMap() : base(0x14ED) => LootType = LootType.Blessed; - - public override int LabelNumber => 1074533; // Fragment of a Map -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/FragmentOfAMapDelivery.cs b/Projects/UOContent/Engines/ML Quests/Items/FragmentOfAMapDelivery.cs deleted file mode 100644 index 1db5d6c63..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/FragmentOfAMapDelivery.cs +++ /dev/null @@ -1,20 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class FragmentOfAMapDelivery : Item -{ - [Constructible] - public FragmentOfAMapDelivery() : base(0x14ED) => LootType = LootType.Blessed; - - public override int LabelNumber => 1074533; // Fragment of a Map - - public override bool Nontransferable => true; - - public override void AddNameProperties(IPropertyList list) - { - base.AddNameProperties(list); - AddQuestItemProperty(list); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/FriendOfTheLibraryToken.cs b/Projects/UOContent/Engines/ML Quests/Items/FriendOfTheLibraryToken.cs deleted file mode 100644 index 40ba2648c..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/FriendOfTheLibraryToken.cs +++ /dev/null @@ -1,16 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class FriendOfTheLibraryToken : Item -{ - [Constructible] - public FriendOfTheLibraryToken() : base(0x2F58) - { - Layer = Layer.Talisman; - Hue = 0x28A; - } - - public override int LabelNumber => 1073136; // Friend of the Library Token (allows donations to be made) -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/FriendsOfTheLibraryApplication.cs b/Projects/UOContent/Engines/ML Quests/Items/FriendsOfTheLibraryApplication.cs deleted file mode 100644 index 4657b0479..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/FriendsOfTheLibraryApplication.cs +++ /dev/null @@ -1,20 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class FriendsOfTheLibraryApplication : Item -{ - [Constructible] - public FriendsOfTheLibraryApplication() : base(0xEC0) => LootType = LootType.Blessed; - - public override int LabelNumber => 1073131; // Friends of the Library Application - - public override bool Nontransferable => true; - - public override void AddNameProperties(IPropertyList list) - { - base.AddNameProperties(list); - AddQuestItemProperty(list); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/GamanHorns.cs b/Projects/UOContent/Engines/ML Quests/Items/GamanHorns.cs deleted file mode 100644 index a55444855..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/GamanHorns.cs +++ /dev/null @@ -1,18 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class GamanHorns : Item -{ - [Constructible] - public GamanHorns(int amount = 1) : base(0x1084) - { - LootType = LootType.Blessed; - Stackable = true; - Amount = amount; - Hue = 0x395; - } - - public override int LabelNumber => 1074557; // Gaman Horns -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/GervisSatchel.cs b/Projects/UOContent/Engines/ML Quests/Items/GervisSatchel.cs deleted file mode 100644 index 90a31033c..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/GervisSatchel.cs +++ /dev/null @@ -1,15 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class GervisSatchel : Backpack -{ - [Constructible] - public GervisSatchel() - { - Hue = Utility.RandomBrightHue(); - DropItem(new IronIngot(10)); - DropItem(new SmithHammer()); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/GiftForArielle.cs b/Projects/UOContent/Engines/ML Quests/Items/GiftForArielle.cs deleted file mode 100644 index 39d020196..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/GiftForArielle.cs +++ /dev/null @@ -1,21 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class GiftForArielle : BaseContainer -{ - [Constructible] - public GiftForArielle() : base(0x1882) => Hue = 0x2C4; - - public override int LabelNumber => 1074356; // gift for arielle - public override int DefaultGumpID => 0x41; - - public override bool Nontransferable => true; - - public override void AddNameProperties(IPropertyList list) - { - base.AddNameProperties(list); - AddQuestItemProperty(list); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/HargroveSatchel.cs b/Projects/UOContent/Engines/ML Quests/Items/HargroveSatchel.cs deleted file mode 100644 index 032970bb2..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/HargroveSatchel.cs +++ /dev/null @@ -1,15 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class HargroveSatchel : Backpack -{ - [Constructible] - public HargroveSatchel() - { - Hue = Utility.RandomBrightHue(); - DropItem(new Gold(15)); - DropItem(new Hatchet()); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/KirinBrains.cs b/Projects/UOContent/Engines/ML Quests/Items/KirinBrains.cs deleted file mode 100644 index 33229b4d6..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/KirinBrains.cs +++ /dev/null @@ -1,16 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class KirinBrains : Item -{ - [Constructible] - public KirinBrains() : base(0x1CF0) - { - LootType = LootType.Blessed; - Hue = 0xD7; - } - - public override int LabelNumber => 1074612; // Ki-Rin Brains -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/LowelSatchel.cs b/Projects/UOContent/Engines/ML Quests/Items/LowelSatchel.cs deleted file mode 100644 index 45d642bca..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/LowelSatchel.cs +++ /dev/null @@ -1,15 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class LowelSatchel : Backpack -{ - [Constructible] - public LowelSatchel() - { - Hue = Utility.RandomBrightHue(); - DropItem(new Board(10)); - DropItem(new DovetailSaw()); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/MiniatureMushroom.cs b/Projects/UOContent/Engines/ML Quests/Items/MiniatureMushroom.cs deleted file mode 100644 index c23c206e4..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/MiniatureMushroom.cs +++ /dev/null @@ -1,12 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class MiniatureMushroom : Food -{ - [Constructible] - public MiniatureMushroom() : base(0xD16) => LootType = LootType.Blessed; - - public override int LabelNumber => 1073138; // Miniature mushroom -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/MirrorOfPurification.cs b/Projects/UOContent/Engines/ML Quests/Items/MirrorOfPurification.cs deleted file mode 100644 index 14ef77ee6..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/MirrorOfPurification.cs +++ /dev/null @@ -1,16 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class MirrorOfPurification : Item -{ - [Constructible] - public MirrorOfPurification() : base(0x1008) - { - LootType = LootType.Blessed; - Hue = 0x530; - } - - public override int LabelNumber => 1075304; // Mirror of Purification -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/MuggSatchel.cs b/Projects/UOContent/Engines/ML Quests/Items/MuggSatchel.cs deleted file mode 100644 index 21b89c715..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/MuggSatchel.cs +++ /dev/null @@ -1,15 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class MuggSatchel : Backpack -{ - [Constructible] - public MuggSatchel() - { - Hue = Utility.RandomBrightHue(); - DropItem(new Pickaxe()); - DropItem(new Pickaxe()); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/NibbetSatchel.cs b/Projects/UOContent/Engines/ML Quests/Items/NibbetSatchel.cs deleted file mode 100644 index b9e22d9ee..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/NibbetSatchel.cs +++ /dev/null @@ -1,30 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class NibbetSatchel : Backpack -{ - [Constructible] - public NibbetSatchel() - { - Hue = Utility.RandomBrightHue(); - DropItem(new TinkerTools()); - - DropItem( - Utility.Random(10) switch - { - 0 => new Springs(3), - 1 => new Axle(3), - 2 => new Hinge(3), - 3 => new Key(), - 4 => new Scissors(), - 5 => new BarrelTap(), - 6 => new BarrelHoops(), - 7 => new Gears(3), - 8 => new Lockpick(3), - _ => new ClockFrame(3) // 9 - } - ); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/NotarizedApplication.cs b/Projects/UOContent/Engines/ML Quests/Items/NotarizedApplication.cs deleted file mode 100644 index ff4e60eba..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/NotarizedApplication.cs +++ /dev/null @@ -1,20 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class NotarizedApplication : Item -{ - [Constructible] - public NotarizedApplication() : base(0x14EF) => LootType = LootType.Blessed; - - public override int LabelNumber => 1073135; // Notarized Application - - public override bool Nontransferable => true; - - public override void AddNameProperties(IPropertyList list) - { - base.AddNameProperties(list); - AddQuestItemProperty(list); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/OfficialSealingWax.cs b/Projects/UOContent/Engines/ML Quests/Items/OfficialSealingWax.cs deleted file mode 100644 index 67b35be77..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/OfficialSealingWax.cs +++ /dev/null @@ -1,24 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class OfficialSealingWax : Item -{ - [Constructible] - public OfficialSealingWax() : base(0x1426) - { - LootType = LootType.Blessed; - Hue = 0x84; - } - - public override int LabelNumber => 1072744; // Official Sealing Wax - - public override bool Nontransferable => true; - - public override void AddNameProperties(IPropertyList list) - { - base.AddNameProperties(list); - AddQuestItemProperty(list); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/PeppercornFishsteak.cs b/Projects/UOContent/Engines/ML Quests/Items/PeppercornFishsteak.cs deleted file mode 100644 index bb589a6b3..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/PeppercornFishsteak.cs +++ /dev/null @@ -1,12 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class PeppercornFishsteak : FishSteak -{ - [Constructible] - public PeppercornFishsteak() => Hue = 0x222; - - public override int LabelNumber => 1075557; // peppercorn fishsteak -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/PixieLeg.cs b/Projects/UOContent/Engines/ML Quests/Items/PixieLeg.cs deleted file mode 100644 index 65287f669..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/PixieLeg.cs +++ /dev/null @@ -1,16 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class PixieLeg : ChickenLeg -{ - [Constructible] - public PixieLeg(int amount = 1) : base(amount) - { - LootType = LootType.Blessed; - Hue = 0x1C2; - } - - public override int LabelNumber => 1074613; // Pixie Leg -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/PortraitOfTheBride.cs b/Projects/UOContent/Engines/ML Quests/Items/PortraitOfTheBride.cs deleted file mode 100644 index 47acd5c7f..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/PortraitOfTheBride.cs +++ /dev/null @@ -1,20 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class PortraitOfTheBride : Item -{ - [Constructible] - public PortraitOfTheBride() : base(0xE9F) => LootType = LootType.Blessed; - - public override int LabelNumber => 1075300; // Portrait of the Bride - - public override bool Nontransferable => true; - - public override void AddNameProperties(IPropertyList list) - { - base.AddNameProperties(list); - AddQuestItemProperty(list); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/PrismaticAmber.cs b/Projects/UOContent/Engines/ML Quests/Items/PrismaticAmber.cs deleted file mode 100644 index ac0e39a07..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/PrismaticAmber.cs +++ /dev/null @@ -1,63 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class PrismaticAmber : Amber -{ - [Constructible] - public PrismaticAmber() - { - } - - public override int LabelNumber => 1075299; // Prismatic Amber - - public override void AddNameProperties(IPropertyList list) - { - base.AddNameProperties(list); - - list.Add(1075269); // Destroyed when dropped - } - - public override bool DropToWorld(Mobile from, Point3D p) - { - var ret = base.DropToWorld(from, p); - - if (ret) - { - DestroyItem(from); - } - - return ret; - } - - public override bool DropToMobile(Mobile from, Mobile target, Point3D p) - { - var ret = base.DropToMobile(from, target, p); - - if (ret) - { - DestroyItem(from); - } - - return ret; - } - - public override bool DropToItem(Mobile from, Item target, Point3D p) - { - var ret = base.DropToItem(from, target, p); - - if (ret && Parent != from.Backpack) - { - DestroyItem(from); - } - - return ret; - } - - public virtual void DestroyItem(Mobile from) - { - from.SendLocalizedMessage(500424); // You destroyed the item. - Delete(); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/PrismaticCrystal.cs b/Projects/UOContent/Engines/ML Quests/Items/PrismaticCrystal.cs deleted file mode 100644 index ed5da7386..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/PrismaticCrystal.cs +++ /dev/null @@ -1,53 +0,0 @@ -using ModernUO.Serialization; -using Server.Engines.MLQuests; -using Server.Engines.MLQuests.Definitions; -using Server.Mobiles; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class PrismaticCrystal : Item -{ - [Constructible] - public PrismaticCrystal() : base(0x2DA) - { - Movable = false; - Hue = 0x32; - } - - public override int LabelNumber => 1074269; // prismatic crystal - - public override void OnDoubleClick(Mobile from) - { - if (from is not PlayerMobile pm || pm.Backpack == null) - { - return; - } - - if (!pm.InRange(GetWorldLocation(), 2)) - { - pm.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1019045); // I can't reach that. - return; - } - - if (MLQuestSystem.GetContext(pm)?.IsDoingQuest(typeof(UnfadingMemoriesPartOne)) != true || - pm.Backpack.FindItemByType(false) != null) - { - pm.SendLocalizedMessage(1075464); // You already have as many of those as you need. - return; - } - - var amber = new PrismaticAmber(); - - if (pm.PlaceInBackpack(amber)) - { - MLQuestSystem.MarkQuestItem(pm, amber); - Delete(); - } - else - { - pm.SendLocalizedMessage(502385); // Your pack cannot hold this item. - amber.Delete(); - } - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/RedLeatherBook.cs b/Projects/UOContent/Engines/ML Quests/Items/RedLeatherBook.cs deleted file mode 100644 index 72f4a4e6b..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/RedLeatherBook.cs +++ /dev/null @@ -1,10 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class RedLeatherBook : BlueBook -{ - [Constructible] - public RedLeatherBook() => Hue = 0x485; -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/ReginasLetter.cs b/Projects/UOContent/Engines/ML Quests/Items/ReginasLetter.cs deleted file mode 100644 index 7a9d92b9d..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/ReginasLetter.cs +++ /dev/null @@ -1,20 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class ReginasLetter : Item -{ - [Constructible] - public ReginasLetter() : base(0x14ED) => LootType = LootType.Blessed; - - public override int LabelNumber => 1075306; // Regina's Letter - - public override bool Nontransferable => true; - - public override void AddNameProperties(IPropertyList list) - { - base.AddNameProperties(list); - AddQuestItemProperty(list); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/ReginasRing.cs b/Projects/UOContent/Engines/ML Quests/Items/ReginasRing.cs deleted file mode 100644 index 41c2c7ca7..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/ReginasRing.cs +++ /dev/null @@ -1,20 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class ReginasRing : SilverRing -{ - [Constructible] - public ReginasRing() => LootType = LootType.Blessed; - - public override int LabelNumber => 1075305; // Regina's Ring - - public override bool Nontransferable => true; - - public override void AddNameProperties(IPropertyList list) - { - base.AddNameProperties(list); - AddQuestItemProperty(list); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/RewardBags.cs b/Projects/UOContent/Engines/ML Quests/Items/RewardBags.cs deleted file mode 100644 index 2adeef397..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/RewardBags.cs +++ /dev/null @@ -1,109 +0,0 @@ -using ModernUO.Serialization; -using Server.Items; - -namespace Server.Engines.MLQuests.Items; - -public static class RewardBag -{ - public static void Fill(Container c, int itemCount, double talismanChance) - { - c.Hue = Utility.RandomNondyedHue(); - - var done = 0; - - if (Utility.RandomDouble() < talismanChance) - { - c.DropItem(new RandomTalisman()); - ++done; - } - - for (; done < itemCount; ++done) - { - var loot = Utility.Random(5) switch - { - 0 => (Item)Loot.RandomWeapon(false, true), - 1 => Loot.RandomArmor(false, true), - 2 => Loot.RandomRangedWeapon(false, true), - 3 => Loot.RandomJewelry(), - _ => Loot.RandomHat() // 4 - }; - - if (loot == null) - { - continue; - } - - Enhance(loot); - c.DropItem(loot); - } - } - - public static void Enhance(Item loot) - { - if (loot is BaseWeapon weapon) - { - BaseRunicTool.ApplyAttributesTo(weapon, Utility.RandomMinMax(1, 5), 10, 80); - return; - } - - if (loot is BaseArmor armor) - { - BaseRunicTool.ApplyAttributesTo(armor, Utility.RandomMinMax(1, 5), 10, 80); - } - - if (loot is BaseJewel jewel) - { - BaseRunicTool.ApplyAttributesTo(jewel, Utility.RandomMinMax(1, 5), 10, 80); - } - } -} - -[SerializationGenerator(0, false)] -public partial class SmallBagOfTrinkets : Bag -{ - [Constructible] - public SmallBagOfTrinkets() - { - RewardBag.Fill(this, 1, 0.0); - } -} - -[SerializationGenerator(0, false)] -public partial class BagOfTrinkets : Bag -{ - [Constructible] - public BagOfTrinkets() - { - RewardBag.Fill(this, 2, 0.05); - } -} - -[SerializationGenerator(0, false)] -public partial class BagOfTreasure : Bag -{ - [Constructible] - public BagOfTreasure() - { - RewardBag.Fill(this, 3, 0.20); - } -} - -[SerializationGenerator(0, false)] -public partial class LargeBagOfTreasure : Bag -{ - [Constructible] - public LargeBagOfTreasure() - { - RewardBag.Fill(this, 4, 0.50); - } -} - -[SerializationGenerator(0, false)] -public partial class RewardStrongbox : WoodenBox -{ - [Constructible] - public RewardStrongbox() - { - RewardBag.Fill(this, 5, 1.0); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/SadrahSatchel.cs b/Projects/UOContent/Engines/ML Quests/Items/SadrahSatchel.cs deleted file mode 100644 index c1716e4ce..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/SadrahSatchel.cs +++ /dev/null @@ -1,15 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class SadrahSatchel : Backpack -{ - [Constructible] - public SadrahSatchel() - { - Hue = Utility.RandomBrightHue(); - DropItem(new Bloodmoss(10)); - DropItem(new MortarPestle()); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/SapOfSosaria.cs b/Projects/UOContent/Engines/ML Quests/Items/SapOfSosaria.cs deleted file mode 100644 index 04dde1d69..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/SapOfSosaria.cs +++ /dev/null @@ -1,17 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class SapOfSosaria : Item -{ - [Constructible] - public SapOfSosaria(int amount = 1) : base(0x1848) - { - LootType = LootType.Blessed; - Stackable = true; - Amount = amount; - } - - public override int LabelNumber => 1074178; // Sap of Sosaria -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/SealedNotesForJamal.cs b/Projects/UOContent/Engines/ML Quests/Items/SealedNotesForJamal.cs deleted file mode 100644 index b429618f0..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/SealedNotesForJamal.cs +++ /dev/null @@ -1,21 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class SealedNotesForJamal : Item -{ - [Constructible] - public SealedNotesForJamal() : base(0xEF9) => LootType = LootType.Blessed; - - public override int LabelNumber => 1074998; // Sealed Notes For Jamal - public override double DefaultWeight => 1.0; - - public override bool Nontransferable => true; - - public override void AddNameProperties(IPropertyList list) - { - base.AddNameProperties(list); - AddQuestItemProperty(list); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/SealingWaxOrderAddressedToPetrus.cs b/Projects/UOContent/Engines/ML Quests/Items/SealingWaxOrderAddressedToPetrus.cs deleted file mode 100644 index 8baad0ee9..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/SealingWaxOrderAddressedToPetrus.cs +++ /dev/null @@ -1,20 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class SealingWaxOrderAddressedToPetrus : Item -{ - [Constructible] - public SealingWaxOrderAddressedToPetrus() : base(0xEBF) => LootType = LootType.Blessed; - - public override int LabelNumber => 1073132; // Sealing Wax Order addressed to Petrus - - public override bool Nontransferable => true; - - public override void AddNameProperties(IPropertyList list) - { - base.AddNameProperties(list); - AddQuestItemProperty(list); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/SeveredElfEars.cs b/Projects/UOContent/Engines/ML Quests/Items/SeveredElfEars.cs deleted file mode 100644 index 6f8cc8f0b..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/SeveredElfEars.cs +++ /dev/null @@ -1,15 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[Flippable(0x312D, 0x312E)] -[SerializationGenerator(0, false)] -public partial class SeveredElfEars : Item -{ - [Constructible] - public SeveredElfEars(int amount = 1) : base(Utility.RandomList(0x312D, 0x312E)) - { - Stackable = true; - Amount = amount; - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/SeveredHumanEars.cs b/Projects/UOContent/Engines/ML Quests/Items/SeveredHumanEars.cs deleted file mode 100644 index 952f25204..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/SeveredHumanEars.cs +++ /dev/null @@ -1,15 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[Flippable(0x312F, 0x3130)] -[SerializationGenerator(0, false)] -public partial class SeveredHumanEars : Item -{ - [Constructible] - public SeveredHumanEars(int amount = 1) : base(Utility.RandomList(0x312F, 0x3130)) - { - Stackable = true; - Amount = amount; - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/SignedTuitionReimbursementForm.cs b/Projects/UOContent/Engines/ML Quests/Items/SignedTuitionReimbursementForm.cs deleted file mode 100644 index 91f9d9319..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/SignedTuitionReimbursementForm.cs +++ /dev/null @@ -1,20 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class SignedTuitionReimbursementForm : Item -{ - [Constructible] - public SignedTuitionReimbursementForm() : base(0x14F0) => LootType = LootType.Blessed; - - public override int LabelNumber => 1074614; // Signed Tuition Reimbursement Form - - public override bool Nontransferable => true; - - public override void AddNameProperties(IPropertyList list) - { - base.AddNameProperties(list); - AddQuestItemProperty(list); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/SpecialTreatForDrithen.cs b/Projects/UOContent/Engines/ML Quests/Items/SpecialTreatForDrithen.cs deleted file mode 100644 index ebe141a5a..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/SpecialTreatForDrithen.cs +++ /dev/null @@ -1,16 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class SpecialTreatForDrithen : Item -{ - [Constructible] - public SpecialTreatForDrithen() : base(0x21B) - { - LootType = LootType.Blessed; - Hue = 0x489; - } - - public override int LabelNumber => 1074517; // Special Treat for Drithen -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/SpeckledPoisonSac.cs b/Projects/UOContent/Engines/ML Quests/Items/SpeckledPoisonSac.cs deleted file mode 100644 index 58cdb74f0..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/SpeckledPoisonSac.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class SpeckledPoisonSac : TransientItem -{ - [Constructible] - public SpeckledPoisonSac() : base(0x23A, TimeSpan.FromHours(1)) => LootType = LootType.Blessed; - - public override int LabelNumber => 1073133; // Speckled Poison Sac -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/SpiritBottle.cs b/Projects/UOContent/Engines/ML Quests/Items/SpiritBottle.cs deleted file mode 100644 index c51dd5508..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/SpiritBottle.cs +++ /dev/null @@ -1,20 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class SpiritBottle : Item -{ - [Constructible] - public SpiritBottle() : base(0xEFB) => LootType = LootType.Blessed; - - public override int LabelNumber => 1075283; // Spirit bottle - - public override bool Nontransferable => true; - - public override void AddNameProperties(IPropertyList list) - { - base.AddNameProperties(list); - AddQuestItemProperty(list); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/StoutWhip.cs b/Projects/UOContent/Engines/ML Quests/Items/StoutWhip.cs deleted file mode 100644 index 9e60d2851..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/StoutWhip.cs +++ /dev/null @@ -1,12 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class StoutWhip : Item -{ - [Constructible] - public StoutWhip() : base(0x166F) => LootType = LootType.Blessed; - - public override int LabelNumber => 1074812; // Stout Whip -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/TaintedTreeSample.cs b/Projects/UOContent/Engines/ML Quests/Items/TaintedTreeSample.cs deleted file mode 100644 index 0523da7d7..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/TaintedTreeSample.cs +++ /dev/null @@ -1,24 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class TaintedTreeSample : Item // On OSI the base class is Kindling, and it's ignitable... -{ - [Constructible] - public TaintedTreeSample() : base(0xDE2) - { - LootType = LootType.Blessed; - Hue = 0x9D; - } - - public override int LabelNumber => 1074997; // Tainted Tree Sample - - public override bool Nontransferable => true; - - public override void AddNameProperties(IPropertyList list) - { - base.AddNameProperties(list); - AddQuestItemProperty(list); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/TransparentHeart.cs b/Projects/UOContent/Engines/ML Quests/Items/TransparentHeart.cs deleted file mode 100644 index 3a5a1cbec..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/TransparentHeart.cs +++ /dev/null @@ -1,16 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class TransparentHeart : GoldEarrings -{ - [Constructible] - public TransparentHeart() - { - LootType = LootType.Blessed; - Hue = 0x4AB; - } - - public override int LabelNumber => 1075400; // Transparent Heart -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/TuitionReimbursementForm.cs b/Projects/UOContent/Engines/ML Quests/Items/TuitionReimbursementForm.cs deleted file mode 100644 index 586d9a2f1..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/TuitionReimbursementForm.cs +++ /dev/null @@ -1,20 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class TuitionReimbursementForm : Item -{ - [Constructible] - public TuitionReimbursementForm() : base(0xE3A) => LootType = LootType.Blessed; - - public override int LabelNumber => 1074610; // Tuition Reimbursement Form (in triplicate) - - public override bool Nontransferable => true; - - public override void AddNameProperties(IPropertyList list) - { - base.AddNameProperties(list); - AddQuestItemProperty(list); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Items/UnicornRibs.cs b/Projects/UOContent/Engines/ML Quests/Items/UnicornRibs.cs deleted file mode 100644 index d1bbcacb5..000000000 --- a/Projects/UOContent/Engines/ML Quests/Items/UnicornRibs.cs +++ /dev/null @@ -1,18 +0,0 @@ -using ModernUO.Serialization; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class UnicornRibs : Item -{ - [Constructible] - public UnicornRibs(int amount = 1) : base(0x9F1) - { - LootType = LootType.Blessed; - Hue = 0x14B; - Stackable = true; - Amount = amount; - } - - public override int LabelNumber => 1074611; // Unicorn Ribs -} diff --git a/Projects/UOContent/Engines/ML Quests/Mobiles/BoonCollector.cs b/Projects/UOContent/Engines/ML Quests/Mobiles/BoonCollector.cs deleted file mode 100644 index c2e8c29a2..000000000 --- a/Projects/UOContent/Engines/ML Quests/Mobiles/BoonCollector.cs +++ /dev/null @@ -1,387 +0,0 @@ -using System; -using System.Collections.Generic; -using ModernUO.Serialization; -using Server.Engines.MLQuests.Definitions; -using Server.Engines.MLQuests.Gumps; -using Server.Gumps; -using Server.Items; -using Server.Mobiles; - -namespace Server.Engines.MLQuests.Mobiles; - -[SerializationGenerator(0, false)] -public abstract partial class DoneQuestCollector : BaseCreature, IRaceChanger -{ - private InternalTimer m_Timer; - - public DoneQuestCollector() : base(AIType.AI_Vendor, FightMode.None, 2) - { - SetSpeed(0.5, 2.0); - } - - 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) - { - return true; - } - - 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) - { - foreach (var type in Needed) - { - var quest = MLQuestSystem.FindQuest(type); - - 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); - } - - 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 - { - List conversation = [..Incomplete]; - - var context = MLQuestSystem.GetContext(pm); - - if (context != null) - { - foreach (var type in Needed) - { - var quest = MLQuestSystem.FindQuest(type); - - if (quest == null || context.HasDoneQuest(quest)) - { - continue; - } - - conversation.Add(quest.Title); - } - } - - m_Timer = new InternalTimer(this, pm, conversation, false); - } - - 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) - { - } - - 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(); - } - } - } -} - -[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) - { - RaceChangeConfirmGump.DisplayTo(from, this, 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) - { - RaceChangeConfirmGump.DisplayTo(from, this, Race.Human); - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Mobiles/SirHelper.cs b/Projects/UOContent/Engines/ML Quests/Mobiles/SirHelper.cs deleted file mode 100644 index 024eb5704..000000000 --- a/Projects/UOContent/Engines/ML Quests/Mobiles/SirHelper.cs +++ /dev/null @@ -1,128 +0,0 @@ -using System; -using ModernUO.Serialization; -using Server.Engines.MLQuests.Gumps; -using Server.Items; -using Server.Mobiles; -using Server.Network; - -namespace Server.Engines.MLQuests.Mobiles; - -[SerializationGenerator(0)] -public partial class SirHelper : Mage -{ - private static readonly TimeSpan m_ShoutDelay = TimeSpan.FromSeconds(20); - - private static readonly TimeSpan - m_ShoutCooldown = TimeSpan.FromDays(1); // TODO: Verify, could be a lot longer... or until a restart even - - private DateTime m_NextShout; - - [Constructible] - public SirHelper() - { - Title = "the Profession Guide"; // TODO: Don't display in paperdoll - - Hue = 0x83EA; - - Direction = Direction.South; - Frozen = true; - } - - public override string DefaultName => "Sir Helper"; - public override bool IsActiveVendor => false; - - public override void InitSBInfo() - { - } - - public override bool GetGender() => false; - - public override void CheckMorph() - { - } - - public override void InitOutfit() - { - HairItemID = 0x203C; - FacialHairItemID = 0x204D; - HairHue = FacialHairHue = 0x8A7; - - AddItem(new Sandals()); - - AddItem(new Cloak - { - ItemID = 0x26AD, - Hue = 0x455 - }); - - AddItem(new Robe - { - ItemID = 0x26AE, - Hue = 0x4AB - }); - - AddItem(new Backpack - { - Movable = false - }); - } - - public override void OnDoubleClick(Mobile from) - { - if (from.BeginAction(this)) - { - Timer.StartTimer(m_ShoutCooldown, () => EndLock(from)); - } - - MLQuestSystem.TurnToFace(this, from); - InfoNPCGump.DisplayTo(from, 1078029, 1078028); - - // Paperdoll doesn't open - // base.OnDoubleClick( from ); - } - - public override void OnThink() - { - base.OnThink(); - - if (m_NextShout > Core.Now) - { - return; - } - - var buffer = stackalloc byte[OutgoingMessagePackets.GetMaxMessageLocalizedLength("")].InitializePacket(); - - foreach (var state in GetClientsInRange(12)) - { - var m = state.Mobile; - - if (m.CanSee(this) && m.InLOS(this) && m.CanBeginAction(this)) - { - // Double Click On Me For Help! - var length = OutgoingMessagePackets.CreateMessageLocalized( - buffer, Serial, Body, MessageType.Regular, 946, 3, 1078099, Name - ); - - if (length != buffer.Length) - { - buffer = buffer[..length]; - } - - state.Send(buffer); - } - } - - m_NextShout = Core.Now + m_ShoutDelay; - } - - private void EndLock(Mobile m) - { - m.EndAction(this); - } - - [AfterDeserialization] - private void AfterDeserialization() - { - Frozen = true; - } -} diff --git a/Projects/UOContent/Engines/ML Quests/Rewards/ItemReward.cs b/Projects/UOContent/Engines/ML Quests/Rewards/ItemReward.cs index a44169f8b..0a5837850 100644 --- a/Projects/UOContent/Engines/ML Quests/Rewards/ItemReward.cs +++ b/Projects/UOContent/Engines/ML Quests/Rewards/ItemReward.cs @@ -7,6 +7,7 @@ namespace Server.Engines.MLQuests.Rewards { public class ItemReward : BaseReward { + /* public static readonly ItemReward SmallBagOfTrinkets = new(1072268, typeof(SmallBagOfTrinkets)); // A small bag of trinkets. @@ -35,6 +36,7 @@ namespace Server.Engines.MLQuests.Rewards public static readonly ItemReward TinkerSatchel = new(1074282, typeof(TinkerSatchel)); // Craftsman's Satchel + */ private readonly int m_Amount; diff --git a/Projects/UOContent/Items/BountyToken.cs b/Projects/UOContent/Items/BountyToken.cs deleted file mode 100644 index 69494d2cb..000000000 --- a/Projects/UOContent/Items/BountyToken.cs +++ /dev/null @@ -1,23 +0,0 @@ -using ModernUO.Serialization; -using Server.Items; - -namespace Server.Items; - -[SerializationGenerator(0, false)] -public partial class BountyToken : Item -{ - [Constructible] - public BountyToken() : this(1) - { - } - - [Constructible] - public BountyToken(int amount) : base(0x0EED) // Gold coin artwork - { - Name = "Bounty Token"; - Hue = 0x482; // Unique vibrant cyan/blue hue - Stackable = true; - Amount = amount; - LootType = LootType.Blessed; // Keeps tokens safe in dungeons upon death - } -} diff --git a/Projects/UOContent/Mobiles/Animals/Misc/Gaman.cs b/Projects/UOContent/Mobiles/Animals/Misc/Gaman.cs index a2ba72924..7e9e986a4 100644 --- a/Projects/UOContent/Mobiles/Animals/Misc/Gaman.cs +++ b/Projects/UOContent/Mobiles/Animals/Misc/Gaman.cs @@ -60,7 +60,6 @@ namespace Server.Mobiles public override void OnDeath(Container c) { base.OnDeath(c); - c.DropItem(new GamanHorns(Utility.RandomBool() ? 1 : 2)); } } } diff --git a/Projects/UOContent/Mobiles/Animals/Mounts/Kirin.cs b/Projects/UOContent/Mobiles/Animals/Mounts/Kirin.cs index 3e3a34ae3..99b74fd34 100644 --- a/Projects/UOContent/Mobiles/Animals/Mounts/Kirin.cs +++ b/Projects/UOContent/Mobiles/Animals/Mounts/Kirin.cs @@ -105,11 +105,6 @@ namespace Server.Mobiles public override void OnDeath(Container c) { base.OnDeath(c); - - if (Utility.RandomDouble() < 0.35) - { - c.DropItem(new KirinBrains()); - } } } } diff --git a/Projects/UOContent/Mobiles/Animals/Mounts/Unicorn.cs b/Projects/UOContent/Mobiles/Animals/Mounts/Unicorn.cs index e95f53921..3ffbb0cb2 100644 --- a/Projects/UOContent/Mobiles/Animals/Mounts/Unicorn.cs +++ b/Projects/UOContent/Mobiles/Animals/Mounts/Unicorn.cs @@ -115,11 +115,6 @@ namespace Server.Mobiles public override void OnDeath(Container c) { base.OnDeath(c); - - if (Utility.RandomDouble() < 0.35) - { - c.DropItem(new UnicornRibs()); - } } } } diff --git a/Projects/UOContent/Mobiles/BountyVendor.cs b/Projects/UOContent/Mobiles/BountyVendor.cs deleted file mode 100644 index b20eb9413..000000000 --- a/Projects/UOContent/Mobiles/BountyVendor.cs +++ /dev/null @@ -1,141 +0,0 @@ -using System; -using System.Collections.Generic; -using ModernUO.Serialization; -using Server.Gumps; -using Server.Items; -using Server.Mobiles; -using Server.Network; - -namespace Server.Mobiles; - -[SerializationGenerator(0, false)] -public partial class BountyVendor : BaseCreature -{ - [Constructible] - public BountyVendor() : base(AIType.AI_Vendor, FightMode.None, 2) - { - Title = "the Bounty Quartermaster"; - 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 FancyShirt(0x482)); - AddItem(new LongPants(0x1F0D)); - AddItem(new Boots()); - AddItem(new Cloak(0x482)); - } - - public override bool IsInvulnerable => true; - public override string DefaultName => "Capt. Vance"; - - public override void OnDoubleClick(Mobile from) - { - if (from is PlayerMobile pm) - { - if (from.InRange(Location, 3)) - { - pm.SendGump(new BountyRewardGump(pm, this)); - } - else - { - from.SendLocalizedMessage(500446); // That is too far away. - } - } - } -} - -// ========================================== -// BOUNTY REWARD SHOP GUMP -// ========================================== -public class BountyRewardGump : Gump -{ - private readonly PlayerMobile _player; - private readonly BountyVendor _vendor; - - // Define Reward Store Items using factory functions: (Name, TokenCost, CreateItem) - private static readonly (string Name, int Cost, Func CreateItem)[] Rewards = new (string, int, Func)[] - { - ("Dungeon Hunter Ring", 25, () => new GoldRing()), - ("Decorative Dragon Statue", 50, () => new MonsterStatuette(MonsterStatuetteType.Dragon)), - ("Monster Statue Dyetub", 75, () => new StatuetteDyeTub()), - ("Bag of Sending", 100, () => new BagOfSending()) - }; - - public BountyRewardGump(PlayerMobile player, BountyVendor vendor) : base(50, 50) - { - _player = player; - _vendor = vendor; - - int totalTokens = player.Backpack != null ? player.Backpack.GetAmount(typeof(BountyToken)) : 0; - - AddPage(0); - - // Matching BuildWorld.cs Frame Style - AddBackground(0, 0, 450, 310, 9270); - AddAlphaRegion(10, 10, 430, 290); - - // Header Labels - AddLabel(110, 15, 1152, "BOUNTY QUARTERMASTER STORE"); - AddLabel(20, 40, 0x3F, $"Your Bounty Tokens: {totalTokens}"); - - int y = 75; - for (int i = 0; i < Rewards.Length; i++) - { - var reward = Rewards[i]; - - // Item Purchase Button & Labels - AddButton(20, y, 4005, 4007, i + 1, GumpButtonType.Reply, 0); - AddLabel(55, y, 1152, reward.Name); - AddLabel(300, y, 0x3F, $"{reward.Cost} Tokens"); - - y += 35; - } - - // Close Button - AddButton(20, y + 10, 4017, 4019, 0, GumpButtonType.Reply, 0); - AddLabel(55, y + 10, 1152, "Close Shop"); - } - - public override void OnResponse(NetState sender, in RelayInfo info) - { - if (info.ButtonID <= 0 || info.ButtonID > Rewards.Length) - { - return; - } - - int index = info.ButtonID - 1; - var reward = Rewards[index]; - - if (_player.Backpack == null) - { - return; - } - - int tokenCount = _player.Backpack.GetAmount(typeof(BountyToken)); - - if (tokenCount >= reward.Cost) - { - if (_player.Backpack.ConsumeTotal(typeof(BountyToken), reward.Cost)) - { - Item newItem = reward.CreateItem(); - _player.AddToBackpack(newItem); - - _player.SendMessage(0x35, $"You purchased {reward.Name} for {reward.Cost} Bounty Tokens!"); - } - } - else - { - _player.SendMessage(0x22, $"You need {reward.Cost - tokenCount} more Bounty Tokens to buy this item."); - } - - // Reopen gump to refresh balance - _player.SendGump(new BountyRewardGump(_player, _vendor)); - } -} diff --git a/Projects/UOContent/Mobiles/Healers/EvilWanderingHealer.cs b/Projects/UOContent/Mobiles/Healers/EvilWanderingHealer.cs index 0058ffd3c..b7dff371d 100644 --- a/Projects/UOContent/Mobiles/Healers/EvilWanderingHealer.cs +++ b/Projects/UOContent/Mobiles/Healers/EvilWanderingHealer.cs @@ -48,10 +48,5 @@ public partial class EvilWanderingHealer : BaseHealer public override void OnDeath(Container c) { base.OnDeath(c); - - if (Utility.RandomBool()) - { - c.DropItem(new FragmentOfAMap()); - } } } diff --git a/Projects/UOContent/Mobiles/Monsters/Humanoid/Melee/Brigand.cs b/Projects/UOContent/Mobiles/Monsters/Humanoid/Melee/Brigand.cs index afdced4a9..0449fc89a 100644 --- a/Projects/UOContent/Mobiles/Monsters/Humanoid/Melee/Brigand.cs +++ b/Projects/UOContent/Mobiles/Monsters/Humanoid/Melee/Brigand.cs @@ -69,11 +69,6 @@ namespace Server.Mobiles public override void OnDeath(Container c) { base.OnDeath(c); - - if (Utility.RandomDouble() < 0.9) - { - c.DropItem(new SeveredHumanEars()); - } } public override void GenerateLoot() diff --git a/Projects/UOContent/Mobiles/Monsters/Humanoid/Melee/ElfBrigand.cs b/Projects/UOContent/Mobiles/Monsters/Humanoid/Melee/ElfBrigand.cs index f71434770..e4772a2b2 100644 --- a/Projects/UOContent/Mobiles/Monsters/Humanoid/Melee/ElfBrigand.cs +++ b/Projects/UOContent/Mobiles/Monsters/Humanoid/Melee/ElfBrigand.cs @@ -88,11 +88,6 @@ namespace Server.Mobiles public override void OnDeath(Container c) { base.OnDeath(c); - - if (Utility.RandomDouble() < 0.9) - { - c.DropItem(new SeveredElfEars()); - } } public override void GenerateLoot() diff --git a/Projects/UOContent/Mobiles/Monsters/Humanoid/Melee/OrcCaptain.cs b/Projects/UOContent/Mobiles/Monsters/Humanoid/Melee/OrcCaptain.cs index 1628198a2..1af66d351 100644 --- a/Projects/UOContent/Mobiles/Monsters/Humanoid/Melee/OrcCaptain.cs +++ b/Projects/UOContent/Mobiles/Monsters/Humanoid/Melee/OrcCaptain.cs @@ -70,12 +70,6 @@ namespace Server.Mobiles public override void OnDeath(Container c) { base.OnDeath(c); - - // TODO: Check drop rate - if (Utility.RandomDouble() < 0.05) - { - c.DropItem(new StoutWhip()); - } } public override void GenerateLoot() diff --git a/Projects/UOContent/Mobiles/Monsters/Misc/Magic/Pixie.cs b/Projects/UOContent/Mobiles/Monsters/Misc/Magic/Pixie.cs index 5f1376b40..bc2f162ae 100644 --- a/Projects/UOContent/Mobiles/Monsters/Misc/Magic/Pixie.cs +++ b/Projects/UOContent/Mobiles/Monsters/Misc/Magic/Pixie.cs @@ -64,11 +64,6 @@ namespace Server.Mobiles public override void OnDeath(Container c) { base.OnDeath(c); - - if (Utility.RandomDouble() < 0.35) - { - c.DropItem(new PixieLeg()); - } } } } diff --git a/Projects/UOContent/Mobiles/NewbieDungeon/CowardlyBrigaind.cs b/Projects/UOContent/Mobiles/NewbieDungeon/CowardlyBrigaind.cs index 998fbbe5b..1b4ecb610 100644 --- a/Projects/UOContent/Mobiles/NewbieDungeon/CowardlyBrigaind.cs +++ b/Projects/UOContent/Mobiles/NewbieDungeon/CowardlyBrigaind.cs @@ -69,11 +69,6 @@ namespace Server.Mobiles public override void OnDeath(Container c) { base.OnDeath(c); - - if (Utility.RandomDouble() < 0.9) - { - c.DropItem(new SeveredHumanEars()); - } } public override void GenerateLoot() diff --git a/Projects/UOContent/Mobiles/Townfolk/BaseEscortable.cs b/Projects/UOContent/Mobiles/Townfolk/BaseEscortable.cs index cf439a76c..6fd7d5f23 100644 --- a/Projects/UOContent/Mobiles/Townfolk/BaseEscortable.cs +++ b/Projects/UOContent/Mobiles/Townfolk/BaseEscortable.cs @@ -53,6 +53,7 @@ public partial class BaseEscortable : BaseCreature // Used when: MLQuestSystem.Enabled && !Region.IsPartOf( "Haven Island" ) private static readonly Dictionary _mlQuestTypes = new() { + /* { typeof(EscortToYew), (Array.Empty(), 0) }, { typeof(EscortToVesper), (Array.Empty(), 0) }, { typeof(EscortToTrinsic), (Array.Empty(), 0) }, @@ -67,6 +68,7 @@ public partial class BaseEscortable : BaseCreature { typeof(EscortToBritain), (Array.Empty(), 0) } // Ocllo was removed in pub 56 // { typeof(EscortToOcllo), (Array.Empty(), 0) } + */ }; // ML quest system New Haven list @@ -75,6 +77,7 @@ public partial class BaseEscortable : BaseCreature // that teach you where things are in a city instead of the randomly spawned ones. private static readonly Dictionary _mlQuestTypesNH = new() { + /* // I am missing several components for my new potions, and I need to find the local alchemist. // My daughter is sick , and I need medicine. Do you know the way to the local alchemist? // I need some potions before I set out for a long journey. Can you take me to the alchemist in The Bottled Imp? @@ -153,6 +156,7 @@ public partial class BaseEscortable : BaseCreature // You there. Do you know the way to the local archer? // I’m looking to go to the local archery range. Will you take me? { typeof(EscortToNHBowyer), ([1042803, 1042804, 1042805, 1042831], 1042818) }, + */ }; [SerializableField(0, setter: "private")]