From 3b94a24a9af957df11464d6f03903e539e70ae77 Mon Sep 17 00:00:00 2001 From: eos Date: Fri, 8 Feb 2013 16:54:36 +0000 Subject: [PATCH] - Enabled quests that were locked due to issues. - Added a CompletionNotice setting to MLQuest to replace the OnComplete overrides. - MLQuest.CanOffer now recursively checks NextQuest for OneTimeOnly/HasRestartDelay as well. - Implemented quest restart delays and enabled them on the crafting quests. - Questers offering multiple quests will no longer randomly offer quests for which CanOffer is false, as long as there are other quests for which CanOffer is true. - Added a manual Register method to MLQuestSystem for registering quests without using MLQuests.cfg (to be used in Configure). - Misc quest tweaks. - Corrected typo in cove.cfg deco file. --- Data/Decoration/Britannia/cove.cfg | 2 +- Data/MLQuests.cfg | 110 ++++++------ .../MLQuests/Definitions/AGhostOfCovetous.cs | 26 +-- .../MLQuests/Definitions/BaseEscort.cs | 6 +- .../Engines/MLQuests/Definitions/Britannia.cs | 29 +--- .../Engines/MLQuests/Definitions/Heartwood.cs | 32 +++- .../Engines/MLQuests/Definitions/Heritage.cs | 24 +-- .../MLQuests/Definitions/HonestBeggar.cs | 18 +- .../Definitions/NewHavenSkillTraining.cs | 156 +++--------------- .../MLQuests/Definitions/NewHavenTraining.cs | 16 +- .../Engines/MLQuests/Definitions/Sanctuary.cs | 24 ++- .../MLQuests/Definitions/Spellweaving.cs | 6 +- .../MLQuests/Definitions/UnfadingMemories.cs | 24 +-- .../MLQuests/Gumps/QuestReportBackGump.cs | 2 +- Scripts/Engines/MLQuests/MLQuest.cs | 102 +++++++----- Scripts/Engines/MLQuests/MLQuestContext.cs | 27 +-- Scripts/Engines/MLQuests/MLQuestEntry.cs | 26 ++- Scripts/Engines/MLQuests/MLQuestSystem.cs | 55 +++--- .../MLQuests/Objectives/BaseObjective.cs | 2 +- .../MLQuests/Objectives/CollectObjective.cs | 2 +- .../MLQuests/Objectives/EscortObjective.cs | 19 ++- .../MLQuests/Objectives/GainSkillObjective.cs | 8 +- Scripts/Misc/TextDefinition.cs | 11 ++ Scripts/Mobiles/BaseCreature.cs | 2 +- 24 files changed, 320 insertions(+), 409 deletions(-) diff --git a/Data/Decoration/Britannia/cove.cfg b/Data/Decoration/Britannia/cove.cfg index a8335b0d8..247d58a7a 100644 --- a/Data/Decoration/Britannia/cove.cfg +++ b/Data/Decoration/Britannia/cove.cfg @@ -230,7 +230,7 @@ Static 0x0EC5 # executioner's axe Static 0x0F46 -2331 1219 0s +2331 1219 0 # fire pit Static 0x0FAC (Light=Circle225) diff --git a/Data/MLQuests.cfg b/Data/MLQuests.cfg index dd47c4132..5c175fe43 100644 --- a/Data/MLQuests.cfg +++ b/Data/MLQuests.cfg @@ -23,10 +23,9 @@ HonestBeggar Evan ReginasThanks Regina # Unfading Memories -# TODO: OneTimeOnly issue -#UnfadingMemoriesPartOne Emilio -#UnfadingMemoriesPartTwo Emilio -#UnfadingMemoriesPartThree Thalia +UnfadingMemoriesPartOne Emilio +UnfadingMemoriesPartTwo Emilio +UnfadingMemoriesPartThree Thalia # A Ghost Of Covetous AGhostOfCovetous Ben @@ -94,30 +93,29 @@ ThePerilsOfFarming Vilo Tiana IndustriousAsAnAntLion Vilo Tiana UnholyConstruct Vilo Tiana Braen AChillInTheAir Vilo Tiana -# TODO: Restart delays -#TheKingOfClothing Ahie Thallary -#ThePuffyShirt Ahie Thallary -#FromTheGaultierCollection Waelian Sleen Ahie Thallary -#HauteCouture Ahie Thallary -#TheSongOfTheWind Tholef Tillanil -#BeerGoggles Tholef Tillanil -#MessageInABottleQuest Tholef Tillanil -#NecessitysMother Waelian Sleen -#TickTock Waelian Sleen Danoel +TheKingOfClothing Ahie Thallary +ThePuffyShirt Ahie Thallary +FromTheGaultierCollection Waelian Sleen Ahie Thallary +HauteCouture Ahie Thallary +TheSongOfTheWind Tholef Tillanil +BeerGoggles Tholef Tillanil +MessageInABottleQuest Tholef Tillanil +NecessitysMother Waelian Sleen +TickTock Waelian Sleen Danoel ReptilianDentist Sleen Danoel -#StopHarpingOnMe Waelian Sleen Anolly Cillitha Jusae Unoelil -#TheFarEye Waelian Sleen Anolly Unoelil -#LethalDarts Cillitha Jusae -#ASimpleBow Cillitha Jusae -#IngeniousArcheryPartOne Cillitha Jusae -#IngeniousArcheryPartTwo Cillitha Jusae -#IngeniousArcheryPartThree Cillitha Jusae +StopHarpingOnMe Waelian Sleen Anolly Cillitha Jusae Unoelil +TheFarEye Waelian Sleen Anolly Unoelil +LethalDarts Cillitha Jusae +ASimpleBow Cillitha Jusae +IngeniousArcheryPartOne Cillitha Jusae +IngeniousArcheryPartTwo Cillitha Jusae +IngeniousArcheryPartThree Cillitha Jusae ScaleArmor Ahie Thallary Tallinin -#CutsBothWays Lohn Olla -#DragonProtection Lohn Olla -#NothingFancy Anolly Lohn Olla Unoelil Danoel -#TheBulwark Lohn Olla -#ArchSupport Waelian Sleen Ciala Aniel +CutsBothWays Lohn Olla +DragonProtection Lohn Olla +NothingFancy Anolly Lohn Olla Unoelil Danoel +TheBulwark Lohn Olla +ArchSupport Waelian Sleen Ciala Aniel ParoxysmusSuccubi LorekeeperNillaen LorekeeperOolua ParoxysmusMoloch LorekeeperNillaen LorekeeperOolua ParoxysmusDaemons LorekeeperNillaen LorekeeperOolua @@ -149,33 +147,32 @@ TakingTheBullByTheHorns Canir EmissaryToTheMinotaur Canir # Sanctuary -# TODO: Restart delays -#BrokenShaft Beotham -#BendingTheBow Beotham -#ArmsRace Beotham -#ImprovedCrossbows Beotham -#BuildingTheBetterCrossbow Beotham -#InstrumentOfWar Danoel -#TheShield Danoel -#MusicToMyEars Danoel -#TheGlassEye Danoel -#LazyHumans Danoel -#InventiveTools Danoel +BrokenShaft Beotham +BendingTheBow Beotham +ArmsRace Beotham +ImprovedCrossbows Beotham +BuildingTheBetterCrossbow Beotham +InstrumentOfWar Danoel +TheShield Danoel +MusicToMyEars Danoel +TheGlassEye Danoel +LazyHumans Danoel +InventiveTools Danoel PixieDustToDust LorekeeperOolua -#AnImpressivePlaid Tallinin -#LeatherAndLace Danoel Tallinin -#FeyHeadgear Tallinin +AnImpressivePlaid Tallinin +LeatherAndLace Danoel Tallinin +FeyHeadgear Tallinin NewCloak Tallinin ADishBestServedCold Tiana Koole ArchEnemies Tiana Vermin Tiana -#ANiceShirt Tallinin +ANiceShirt Tallinin MougGuurMustDie Dallid LeaderOfThePack Dallid SayonaraSzavetra Dallid -#TappingTheKeg Dallid -#WaitingToBeFilled Dallid -#BreezesSong Dallid +TappingTheKeg Dallid +WaitingToBeFilled Dallid +BreezesSong Dallid ProofOfTheDeed ElderOnallan Tiana Marauders ElderOnallan Tiana Koole TheBrainsOfTheOperation ElderOnallan Tiana @@ -220,19 +217,18 @@ EscortToNHBowyer EscortToNHBank # New Haven Training -# TODO: Restart delays -#SplitEnds Andric +SplitEnds Andric IShotAnArrowIntoTheAir Kashiel -#BakersDozen Asandos -#AStitchInTime Clairesse -#BatteredBucklers Gervis -#MoreOrePlease Mugg -#ComfortableSeating Lowel -#ThePenIsMightier Lyle -#AClockworkPuzzle Nibbet -#DeliciousFishes Norton -#FleeAndFatigue Sadrah -#ChopChopOnTheDouble Hargrove +BakersDozen Asandos +AStitchInTime Clairesse +BatteredBucklers Gervis +MoreOrePlease Mugg +ComfortableSeating Lowel +ThePenIsMightier Lyle +AClockworkPuzzle Nibbet +DeliciousFishes Norton +FleeAndFatigue Sadrah +ChopChopOnTheDouble Hargrove # New Haven Skill Training CleansingOldHaven Aelorn diff --git a/Scripts/Engines/MLQuests/Definitions/AGhostOfCovetous.cs b/Scripts/Engines/MLQuests/Definitions/AGhostOfCovetous.cs index 160d2fede..bb107a127 100644 --- a/Scripts/Engines/MLQuests/Definitions/AGhostOfCovetous.cs +++ b/Scripts/Engines/MLQuests/Definitions/AGhostOfCovetous.cs @@ -19,23 +19,18 @@ namespace Server.Engines.MLQuests.Definitions public AGhostOfCovetous() { Activated = true; - OneTimeOnly = true; Title = 1075287; // A Ghost of Covetous Description = 1075286; // 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. RefusalMessage = 1075288; // That's okay, I'm sure someone with more courage than either of us will come along eventually. InProgressMessage = 1075290; // You'll find that ghost in the mountain pass above the Covetous dungeon. CompletionMessage = 1075291; // (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! + CompletionNotice = CompletionNoticeShort; - Objectives.Add( new DeliverObjective( typeof( SpiritBottle ), 1, 1075283, typeof( Frederic ), "The Ghost of Frederic Smithson" ) ); // Spirit bottle + Objectives.Add( new DeliverObjective( typeof( SpiritBottle ), 1, "Spirit Bottle", typeof( Frederic ), "The Ghost of Frederic Smithson" ) ); Rewards.Add( new DummyReward( 1075284 ) ); // Return the filled Spirit Bottle to Griswolt the Master Necromancer to receive a reward. } - public override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1046258, "", 0x23 ); // Your quest is complete. - } - public override void Generate() { base.Generate(); @@ -58,17 +53,13 @@ namespace Server.Engines.MLQuests.Definitions 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, 1075319, typeof( Leon ), "Leon" ) ); // Dread Spider Silk + Objectives.Add( new TimedDeliverObjective( TimeSpan.FromSeconds( 600 ), typeof( DreadSpiderSilk ), 1, "Dread Spider Silk", typeof( Leon ), "Leon" ) ); Rewards.Add( new DummyReward( 1075339 ) ); // Hurry! You must get the silk to Leon the Alchemist quickly, or it will crumble and become useless! } - public override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1046258, "", 0x23 ); // Your quest is complete. - } - public override void Generate() { base.Generate(); @@ -85,22 +76,19 @@ namespace Server.Engines.MLQuests.Definitions 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, 1075452, typeof( Andros ), "Andros" ) ); // Alchemist's Bandage + Objectives.Add( new DeliverObjective( typeof( AlchemistsBandage ), 1, "Alchemist's Bandage", typeof( Andros ), "Andros" ) ); Rewards.Add( new ItemReward( 1075345, typeof( AndrosGratitude ) ) ); // Andros’ Gratitude } - public override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1046258, "", 0x23 ); // Your quest is complete. - } - public override void Generate() { base.Generate(); diff --git a/Scripts/Engines/MLQuests/Definitions/BaseEscort.cs b/Scripts/Engines/MLQuests/Definitions/BaseEscort.cs index cad021951..ee9e989bf 100644 --- a/Scripts/Engines/MLQuests/Definitions/BaseEscort.cs +++ b/Scripts/Engines/MLQuests/Definitions/BaseEscort.cs @@ -10,11 +10,7 @@ namespace Server.Engines.MLQuests.Definitions public BaseEscort() { - } - - public override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1046258, "", 0x23 ); // Your quest is complete. + CompletionNotice = CompletionNoticeShort; } public override void GetRewards( MLQuestInstance instance ) diff --git a/Scripts/Engines/MLQuests/Definitions/Britannia.cs b/Scripts/Engines/MLQuests/Definitions/Britannia.cs index e09af0c96..baf26bc26 100644 --- a/Scripts/Engines/MLQuests/Definitions/Britannia.cs +++ b/Scripts/Engines/MLQuests/Definitions/Britannia.cs @@ -24,34 +24,13 @@ namespace Server.Engines.MLQuests.Definitions 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, 1075303, typeof( SkeletonOfSzandor ), "Szandor" ) ); Rewards.Add( new DummyReward( 1075323 ) ); // Aurelia's gratitude. } - public override bool CanOffer( BaseCreature quester, PlayerMobile pm ) - { - if ( !base.CanOffer( quester, pm ) ) - return false; - - MLQuestContext context = MLQuestSystem.GetContext( pm ); - - // This quest can be repeated, but only while the next quest has not been completed. - if ( context != null && context.HasDoneQuest( NextQuest ) ) - { - MLQuestSystem.Tell( quester, pm, 1075454 ); // I cannot offer you the quest again. - return false; - } - - return true; - } - - public override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1046258, "", 0x23 ); // Your quest is complete. - } - public override void Generate() { base.Generate(); @@ -74,17 +53,13 @@ namespace Server.Engines.MLQuests.Definitions 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, 1075303, typeof( Aurelia ), "Aurelia" ) ); Rewards.Add( new ItemReward( 1075304, typeof( MirrorOfPurification ) ) ); } - public override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1046258, "", 0x23 ); // Your quest is complete. - } - public override void Generate() { base.Generate(); diff --git a/Scripts/Engines/MLQuests/Definitions/Heartwood.cs b/Scripts/Engines/MLQuests/Definitions/Heartwood.cs index 453a65542..0d387c279 100644 --- a/Scripts/Engines/MLQuests/Definitions/Heartwood.cs +++ b/Scripts/Engines/MLQuests/Definitions/Heartwood.cs @@ -1103,6 +1103,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -1120,6 +1121,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -1137,6 +1139,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -1154,6 +1157,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -1171,6 +1175,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -1188,6 +1193,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -1205,6 +1211,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -1222,6 +1229,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -1239,6 +1247,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -1273,6 +1282,7 @@ namespace Server.Engines.MLQuests.Definitions public StopHarpingOnMe() { Activated = true; + HasRestartDelay = true; Title = 1073881; // Stop Harping on Me Description = 1074071; // 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. RefusalMessage = 1073921; // I will patiently await your reconsideration. @@ -1290,6 +1300,7 @@ namespace Server.Engines.MLQuests.Definitions public TheFarEye() { Activated = true; + HasRestartDelay = true; Title = 1073908; // The Far Eye Description = 1074098; // 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. RefusalMessage = 1073921; // I will patiently await your reconsideration. @@ -1307,11 +1318,13 @@ namespace Server.Engines.MLQuests.Definitions public LethalDarts() { Activated = true; + HasRestartDelay = true; Title = 1073876; // Lethal Darts Description = 1074066; // 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. 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 @@ -1324,11 +1337,13 @@ namespace Server.Engines.MLQuests.Definitions public ASimpleBow() { Activated = true; + HasRestartDelay = true; Title = 1073877; // A Simple Bow Description = 1074067; // 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. 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 @@ -1341,22 +1356,18 @@ namespace Server.Engines.MLQuests.Definitions public IngeniousArcheryPartOne() { Activated = true; + HasRestartDelay = true; Title = 1073878; // Ingenious Archery, Part I Description = 1074068; // 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? 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 ); } - - // TODO: Verified for this one, what about the others? - public override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1073967, "", 0x23 ); // You obtained what you seek, now receive your reward. - } } public class IngeniousArcheryPartTwo : MLQuest @@ -1364,11 +1375,13 @@ namespace Server.Engines.MLQuests.Definitions public IngeniousArcheryPartTwo() { Activated = true; + HasRestartDelay = true; Title = 1073879; // Ingenious Archery, Part II Description = 1074069; // 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. 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 @@ -1381,11 +1394,13 @@ namespace Server.Engines.MLQuests.Definitions public IngeniousArcheryPartThree() { Activated = true; + HasRestartDelay = true; Title = 1073880; // Ingenious Archery, Part III Description = 1074070; // 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. 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 @@ -1416,6 +1431,7 @@ namespace Server.Engines.MLQuests.Definitions public CutsBothWays() { Activated = true; + HasRestartDelay = true; Title = 1073913; // Cuts Both Ways Description = 1074103; // 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. RefusalMessage = 1073921; // I will patiently await your reconsideration. @@ -1433,6 +1449,7 @@ namespace Server.Engines.MLQuests.Definitions public DragonProtection() { Activated = true; + HasRestartDelay = true; Title = 1073915; // Dragon Protection Description = 1074105; // 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. RefusalMessage = 1073921; // I will patiently await your reconsideration. @@ -1450,6 +1467,7 @@ namespace Server.Engines.MLQuests.Definitions public NothingFancy() { Activated = true; + HasRestartDelay = true; Title = 1073911; // Nothing Fancy Description = 1074101; // 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. RefusalMessage = 1073921; // I will patiently await your reconsideration. @@ -1467,6 +1485,7 @@ namespace Server.Engines.MLQuests.Definitions public TheBulwark() { Activated = true; + HasRestartDelay = true; Title = 1073912; // The Bulwark Description = 1074102; // 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? RefusalMessage = 1073921; // I will patiently await your reconsideration. @@ -1484,6 +1503,7 @@ namespace Server.Engines.MLQuests.Definitions public ArchSupport() { Activated = true; + HasRestartDelay = true; Title = 1073882; // Arch Support Description = 1074072; // 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? RefusalMessage = 1073921; // I will patiently await your reconsideration. diff --git a/Scripts/Engines/MLQuests/Definitions/Heritage.cs b/Scripts/Engines/MLQuests/Definitions/Heritage.cs index d74aa50d5..1006ed070 100644 --- a/Scripts/Engines/MLQuests/Definitions/Heritage.cs +++ b/Scripts/Engines/MLQuests/Definitions/Heritage.cs @@ -144,17 +144,13 @@ namespace Server.Engines.MLQuests.Definitions 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" ) ) ); // Bravehorn's drinking pool Rewards.Add( new DummyReward( 1072806 ) ); // The boon of Bravehorn. } - public override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1046258, "", 0x23 ); // Your quest is complete. - } - public override void GetRewards( MLQuestInstance instance ) { instance.Player.SendLocalizedMessage( 1074942, "", 0x2A ); // 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. @@ -534,17 +530,13 @@ namespace Server.Engines.MLQuests.Definitions 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 void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1073775, "", 0x23 ); // Your quest is complete. Return for your reward. - } - public override void GetRewards( MLQuestInstance instance ) { instance.Player.SendLocalizedMessage( 1074946, "", 0x2A ); // 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. @@ -575,17 +567,13 @@ namespace Server.Engines.MLQuests.Definitions 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 ), "Sledge (Buc's Den)" ) ); Rewards.Add( new DummyReward( 1074875 ) ); // Another step closer to becoming human. } - public override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1046258, "", 0x23 ); // Your quest is complete. - } - public override void GetRewards( MLQuestInstance instance ) { instance.Player.SendLocalizedMessage( 1074948, "", 0x2A ); // You have demonstrated your physical strength! Humans can carry vast loads without complaint. You are one step closer to achieving humanity. @@ -632,6 +620,7 @@ namespace Server.Engines.MLQuests.Definitions 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 Type[] { typeof( Efreet ) }, "efreets", new QuestArea( 1074808, "Fire" ) ) ); // Fire Objectives.Add( new KillObjective( 5, new Type[] { typeof( IceFiend ) }, "ice fiends", new QuestArea( 1074809, "Ice" ) ) ); // Ice @@ -639,11 +628,6 @@ namespace Server.Engines.MLQuests.Definitions Rewards.Add( new DummyReward( 1074875 ) ); // Another step closer to becoming human. } - public override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1073775, "", 0x23 ); // Your quest is complete. Return for your reward. - } - public override void GetRewards( MLQuestInstance instance ) { instance.Player.SendLocalizedMessage( 1074947, "", 0x2A ); // 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. diff --git a/Scripts/Engines/MLQuests/Definitions/HonestBeggar.cs b/Scripts/Engines/MLQuests/Definitions/HonestBeggar.cs index 542da92f5..5c8fa7596 100644 --- a/Scripts/Engines/MLQuests/Definitions/HonestBeggar.cs +++ b/Scripts/Engines/MLQuests/Definitions/HonestBeggar.cs @@ -19,23 +19,18 @@ namespace Server.Engines.MLQuests.Definitions public HonestBeggar() { Activated = true; - OneTimeOnly = true; Title = 1075392; // Honest Beggar Description = 1075393; // 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? RefusalMessage = 1075395; // I see. Too good to help an honest beggar like me, eh? InProgressMessage = 1075396; // 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. CompletionMessage = 1075397; // 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. + CompletionNotice = CompletionNoticeShort; - Objectives.Add( new DeliverObjective( typeof( ReginasRing ), 1, 1075305, typeof( Regina ), "Regina" ) ); + Objectives.Add( new DeliverObjective( typeof( ReginasRing ), 1, "Regina's Ring", typeof( Regina ), "Regina" ) ); Rewards.Add( new DummyReward( 1075394 ) ); // Find the ring’s owner. } - public override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1046258, "", 0x23 ); // Your quest is complete. - } - public override void Generate() { base.Generate(); @@ -52,22 +47,19 @@ namespace Server.Engines.MLQuests.Definitions 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, 1075306, typeof( Evan ), "Evan" ) ); + Objectives.Add( new DeliverObjective( typeof( ReginasLetter ), 1, "Regina's Letter", typeof( Evan ), "Evan" ) ); Rewards.Add( new ItemReward( 1075400, typeof( TransparentHeart ) ) ); // Transparent Heart } - public override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1046258, "", 0x23 ); // Your quest is complete. - } - public override void Generate() { base.Generate(); diff --git a/Scripts/Engines/MLQuests/Definitions/NewHavenSkillTraining.cs b/Scripts/Engines/MLQuests/Definitions/NewHavenSkillTraining.cs index 2e2b63cf9..8578b6f61 100644 --- a/Scripts/Engines/MLQuests/Definitions/NewHavenSkillTraining.cs +++ b/Scripts/Engines/MLQuests/Definitions/NewHavenSkillTraining.cs @@ -23,17 +23,13 @@ namespace Server.Engines.MLQuests.Definitions 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 override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1077725, "", 0x23 ); // You have achieved the rank of Apprentice Paladin. Return to Aelorn in New Haven to report your progress. - } - public override void Generate() { base.Generate(); @@ -53,17 +49,13 @@ namespace Server.Engines.MLQuests.Definitions 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 override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1077612, "", 0x23 ); // You have achieved the rank of Apprentice Wrestler. Return to Dimethro in New Haven to receive your prize. - } - public override void Generate() { base.Generate(); @@ -83,17 +75,13 @@ namespace Server.Engines.MLQuests.Definitions 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 override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1078068, "", 0x23 ); // You have achieved the rank of Apprentice Armsman. Return to Churchill in New Haven to claim your reward. - } - public override void Generate() { base.Generate(); @@ -113,17 +101,13 @@ namespace Server.Engines.MLQuests.Definitions 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 override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1078208, "", 0x23 ); // You have achieved the rank of Apprentice Archer. Return to Robyn in New Haven to claim your reward. - } - public override void Generate() { base.Generate(); @@ -143,17 +127,13 @@ namespace Server.Engines.MLQuests.Definitions 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 override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1078193, "", 0x23 ); // You have achieved the rank of Apprentice Fencer. Return to Recaro in New Haven to claim your reward. - } - public override void Generate() { base.Generate(); @@ -173,17 +153,13 @@ namespace Server.Engines.MLQuests.Definitions 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 override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1077673, "", 0x23 ); // You have achieved the rank of Apprentice Warrior. Return to Alden Armstrong in New Haven to claim your reward. - } - public override void Generate() { base.Generate(); @@ -203,17 +179,13 @@ namespace Server.Engines.MLQuests.Definitions 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 override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1077664, "", 0x23 ); // 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! - } - public override void Generate() { base.Generate(); @@ -233,17 +205,13 @@ namespace Server.Engines.MLQuests.Definitions 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 override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1077710, "", 0x23 ); // 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. - } - public override void Generate() { base.Generate(); @@ -263,17 +231,13 @@ namespace Server.Engines.MLQuests.Definitions 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 override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1077625, "", 0x23 ); // You have achieved the rank of Apprentice Mage (for Resisting Spells). Return to Alefian in New Haven to receive your arcane prize. - } - public override void Generate() { base.Generate(); @@ -293,17 +257,13 @@ namespace Server.Engines.MLQuests.Definitions RefusalMessage = 1077599; // Seek me out if you ever wish to study the art of Meditation. Good journey. InProgressMessage = 1077628; // You have not achived 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 override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1077600, "", 0x23 ); // You have achieved the rank of Apprentice Stoic (for Meditation). Return to Gustar in New Haven to receive your arcane prize. - } - public override void Generate() { base.Generate(); @@ -323,17 +283,13 @@ namespace Server.Engines.MLQuests.Definitions 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 achived 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 please 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 enhanced the potency of your offensive soells when used against Undead. Be mindful, though. While this book is equiped you invoke powerful spells and abilities vs Humanoids, such as other humans, orcs, ettins, and trolls. 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 override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1077618, "", 0x23 ); // You have achieved the rank of Apprentice Scribe. Return to Jillian in New Haven to receive your arcane prize. - } - public override void Generate() { base.Generate(); @@ -353,17 +309,13 @@ namespace Server.Engines.MLQuests.Definitions 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 override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1077580, "", 0x23 ); // You have achieved the rank of Apprentice Mage. Return to Kaelynna in New Haven to receive your arcane prize. - } - public override void Generate() { base.Generate(); @@ -383,17 +335,13 @@ namespace Server.Engines.MLQuests.Definitions 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 override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1077606, "", 0x23 ); // You have achieved the rank of Apprentice Scholar. Return to Mithneral in New Haven to receive your arcane prize. - } - public override void Generate() { base.Generate(); @@ -413,17 +361,13 @@ namespace Server.Engines.MLQuests.Definitions 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 override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1077747, "", 0x23 ); // 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. - } - public override void Generate() { base.Generate(); @@ -443,17 +387,13 @@ namespace Server.Engines.MLQuests.Definitions 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 override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1077691, "", 0x23 ); // 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. - } - public override void Generate() { base.Generate(); @@ -473,17 +413,13 @@ namespace Server.Engines.MLQuests.Definitions 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 override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1077682, "", 0x23 ); // You have achieved the rank of Apprentice Healer. Return to Avicenna in New Haven as soon as you can to claim your reward. - } - public override void Generate() { base.Generate(); @@ -503,17 +439,13 @@ namespace Server.Engines.MLQuests.Definitions 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 override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1077702, "", 0x23 ); // 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. - } - public override void Generate() { base.Generate(); @@ -533,17 +465,13 @@ namespace Server.Engines.MLQuests.Definitions 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 override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1078161, "", 0x23 ); // 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. - } - public override void Generate() { base.Generate(); @@ -563,17 +491,13 @@ namespace Server.Engines.MLQuests.Definitions 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 override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1078171, "", 0x23 ); // You have achieved the rank of Apprentice Rogue (for Hiding). Return to Chiyo in New Haven to claim your reward. - } - public override void Generate() { base.Generate(); @@ -593,17 +517,13 @@ namespace Server.Engines.MLQuests.Definitions 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 override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1078181, "", 0x23 ); // You have achieved the rank of Apprentice Rogue (for Stealth). Return to Jun in New Haven to claim your reward. - } - public override void Generate() { base.Generate(); @@ -623,17 +543,13 @@ namespace Server.Engines.MLQuests.Definitions 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 override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1078220, "", 0x23 ); // You have achieved the rank of Apprentice Ranger (for Tracking). Return to Walker in New Haven to claim your reward. - } - public override void Generate() { base.Generate(); @@ -653,17 +569,13 @@ namespace Server.Engines.MLQuests.Definitions 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 override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1078013, "", 0x23 ); // You have achieved the rank of Apprentice Samurai. Return to Hamato in New Haven to report your progress. - } - public override void Generate() { base.Generate(); @@ -683,17 +595,13 @@ namespace Server.Engines.MLQuests.Definitions RefusalMessage = 1078040; // You are weak after all. Come back to me when you are ready to practice Necromancy. InProgressMessage = 1078041; // You have not achieved the rank of Apprentice Necromancer. Come back to me once you feel that you are worthy of the rank of Apprentice Necromancer and I will reward you with the knowledge you desire. CompletionMessage = 1078043; // You have done well, my young apprentice. Behold! I now present to you the knowledge you desire. This spellbook contains all the Necromancer spells. The power is intoxicating, isn't it? + CompletionNotice = 1078042; // You have achieved the rank of Apprentice Necromancer. Return to Mulcivikh in New Haven to receive the knowledge you desire. Objectives.Add( new GainSkillObjective( SkillName.Necromancy, 500, true, true ) ); Rewards.Add( new InternalReward() ); } - public override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1078042, "", 0x23 ); // You have achieved the rank of Apprentice Necromancer. Return to Mulcivikh in New Haven to receive the knowledge you desire. - } - public override void Generate() { base.Generate(); @@ -733,17 +641,13 @@ namespace Server.Engines.MLQuests.Definitions 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 override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1078050, "", 0x23 ); // You have achieved the rank of Apprentice Medium. Return to Morganna in New Haven to receive your reward. - } - public override void Generate() { base.Generate(); @@ -763,17 +667,13 @@ namespace Server.Engines.MLQuests.Definitions 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 override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1077756, "", 0x23 ); // 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. - } - public override void Generate() { base.Generate(); @@ -793,17 +693,13 @@ namespace Server.Engines.MLQuests.Definitions RefusalMessage = 1077736; // You're not interested in learning to be a smith, eh? I thought for sure that's why you were here. Oh well, if you change your mind, you can always come back and talk to me. InProgressMessage = 1077737; // You’re doing well, but you’re not quite there yet. Remember that the quickest way to learn is to make daggers up until 45 skill, and then switch to maces. Also, don’t forget that using my forge and anvil will help you learn faster. CompletionMessage = 1077739; // I've been watching you get better and better as you've been smithing, and I have to say, you're a natural! It's a long road to being a Grandmaster Blacksmith, but I have no doubt that if you put your mind to it you'll get there someday. Let me give you one final piece of advice. If you're smithing just to practice and improve your skill, make items that are moderately difficult (60-80% success chance), and try to stick to ones that use less ingots.

Now that you're an Apprentice Blacksmith, I have something for you. While you were busy practicing, I was crafting this hammer for you. It's finely balanced, and has a bit of magic imbued within that will help you craft better items. However, that magic needs to restore itself over time, so you can only use it so many times per day. I hope you find it useful! + CompletionNotice = 1077738; // You have achieved the rank of Apprentice Blacksmith. Return to George Hephaestus in New Haven to see what kind of reward he has waiting for you. Objectives.Add( new GainSkillObjective( SkillName.Blacksmith, 500, true, true ) ); Rewards.Add( new ItemReward( 1077740, typeof( HammerOfHephaestus ) ) ); // Hammer of Hephaestus } - public override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1077738, "", 0x23 ); // 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. - } - public override void Generate() { base.Generate(); diff --git a/Scripts/Engines/MLQuests/Definitions/NewHavenTraining.cs b/Scripts/Engines/MLQuests/Definitions/NewHavenTraining.cs index a8ad937f0..1ca419915 100644 --- a/Scripts/Engines/MLQuests/Definitions/NewHavenTraining.cs +++ b/Scripts/Engines/MLQuests/Definitions/NewHavenTraining.cs @@ -11,15 +11,13 @@ using Server.Mobiles; namespace Server.Engines.MLQuests.Definitions { #region Quests - // TODO: Time delay on doing these quests (2 mins?) - // I'm sorry, but I don't have anything else for you right now. Could you check back with me in a few minutes? - // I'm sorry, I have nothing for you at this time. 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... @@ -67,6 +65,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -91,13 +90,14 @@ namespace Server.Engines.MLQuests.Definitions 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 ), 1015275 ) ); // fancy dress + 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 @@ -116,6 +116,7 @@ namespace Server.Engines.MLQuests.Definitions 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! @@ -140,6 +141,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -164,6 +166,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -188,6 +191,7 @@ namespace Server.Engines.MLQuests.Definitions 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! @@ -212,6 +216,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -236,6 +241,7 @@ namespace Server.Engines.MLQuests.Definitions 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! @@ -260,6 +266,7 @@ namespace Server.Engines.MLQuests.Definitions 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? @@ -284,6 +291,7 @@ namespace Server.Engines.MLQuests.Definitions 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. diff --git a/Scripts/Engines/MLQuests/Definitions/Sanctuary.cs b/Scripts/Engines/MLQuests/Definitions/Sanctuary.cs index 068d14ade..6d8088a5b 100644 --- a/Scripts/Engines/MLQuests/Definitions/Sanctuary.cs +++ b/Scripts/Engines/MLQuests/Definitions/Sanctuary.cs @@ -17,6 +17,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -60,6 +61,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -77,6 +79,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -94,6 +97,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -111,6 +115,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -128,6 +133,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -145,6 +151,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -162,6 +169,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -179,6 +187,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -196,6 +205,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -213,6 +223,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -246,6 +257,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -263,6 +275,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -280,6 +293,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -297,6 +311,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -439,6 +454,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -456,6 +472,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -473,6 +490,7 @@ namespace Server.Engines.MLQuests.Definitions 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. @@ -603,16 +621,12 @@ namespace Server.Engines.MLQuests.Definitions 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 ), "Ahie (The Heartwood)" ) ); Rewards.Add( ItemReward.BagOfTrinkets ); } - - public override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1046258, "", 0x23 ); // Your quest is complete. - } } #endregion diff --git a/Scripts/Engines/MLQuests/Definitions/Spellweaving.cs b/Scripts/Engines/MLQuests/Definitions/Spellweaving.cs index 1abd54ef0..43eb0bb3a 100644 --- a/Scripts/Engines/MLQuests/Definitions/Spellweaving.cs +++ b/Scripts/Engines/MLQuests/Definitions/Spellweaving.cs @@ -345,17 +345,13 @@ namespace Server.Engines.MLQuests.Definitions 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 Type[] { typeof( Reaper ) }, "reapers" ) ); Rewards.Add( new ItemReward( 1031607, typeof( SummonFeyScroll ) ) ); // Summon Fey } - public override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1073775, "", 0x23 ); // Your quest is complete. Return for your reward. - } - public override void GetRewards( MLQuestInstance instance ) { instance.PlayerContext.SummonFey = true; diff --git a/Scripts/Engines/MLQuests/Definitions/UnfadingMemories.cs b/Scripts/Engines/MLQuests/Definitions/UnfadingMemories.cs index eb0413e83..d5afe6616 100644 --- a/Scripts/Engines/MLQuests/Definitions/UnfadingMemories.cs +++ b/Scripts/Engines/MLQuests/Definitions/UnfadingMemories.cs @@ -19,23 +19,18 @@ namespace Server.Engines.MLQuests.Definitions public UnfadingMemoriesPartOne() { Activated = true; - OneTimeOnly = true; // TODO: Similar issue as Aemaeth, part one may be taken while part three is not finished Title = 1075355; // Unfading Memories Description = 1075356; // 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! RefusalMessage = 1075358; // Is there no one who can help a humble artist pursue his Muse? InProgressMessage = 1075359; // You can find Prismatic Amber in the Prism of Light, located just north of the city of Nujel'm. CompletionMessage = 1075360; // I knew it! See, it’s just the color I needed! Look how it brings out the highlights of her wheaten tresses! + CompletionNotice = CompletionNoticeShort; Objectives.Add( new CollectObjective( 1, typeof( PrismaticAmber ), "Prismatic Amber" ) ); Rewards.Add( new DummyReward( 1075357 ) ); // The joy of contributing to a noble artistic effort, however paltry the end product. } - public override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1046258, "", 0x23 ); // Your quest is complete. - } - public override void Generate() { base.Generate(); @@ -58,16 +53,12 @@ namespace Server.Engines.MLQuests.Definitions RefusalMessage = 1075370; // Alright then, you have already helped me more than I deserved. I shall find someone else to undertake this task. InProgressMessage = 1075371; // The wedding is taking place in the palace in Nujel'm. You will likely find her there. CompletionMessage = 1075372; // I’m sorry, I’m getting ready to be married. I don’t have time to . . . what’s that you say? + CompletionNotice = CompletionNoticeShort; - Objectives.Add( new DeliverObjective( typeof( PortraitOfTheBride ), 1, "Portrait of the Bride", typeof( Thalia ), "Bride" ) ); + Objectives.Add( new DeliverObjective( typeof( PortraitOfTheBride ), 1, "Portrait of the Bride", typeof( Thalia ), "Thalia (Nujel'm)" ) ); // OSI's description is "Bride" Rewards.Add( new DummyReward( 1075369 ) ); // The Artist’s gratitude. } - - public override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1046258, "", 0x23 ); // Your quest is complete. - } } public class UnfadingMemoriesPartThree : MLQuest @@ -77,22 +68,19 @@ namespace Server.Engines.MLQuests.Definitions public UnfadingMemoriesPartThree() { Activated = true; + OneTimeOnly = true; Title = 1075373; // Unfading Memories Description = 1075374; // 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. RefusalMessage = 1075376; // Very well, then. If you will excuse me, I need to get ready. InProgressMessage = 1075377; // Take the letter back to the Artist’s Guild in Britain, if you would do me this kindness. CompletionMessage = 1075378; // 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. + CompletionNotice = CompletionNoticeShort; - Objectives.Add( new DeliverObjective( typeof( BridesLetter ), 1, "Bride's Letter", typeof( Emilio ), "Artist" ) ); + Objectives.Add( new DeliverObjective( typeof( BridesLetter ), 1, "Bride's Letter", typeof( Emilio ), "Emilio (Britain)" ) ); // OSI's description is "Artist" Rewards.Add( new ItemReward( 1075375, typeof( Bleach ) ) ); // Bleach } - public override void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1046258, "", 0x23 ); // Your quest is complete. - } - public override void Generate() { base.Generate(); diff --git a/Scripts/Engines/MLQuests/Gumps/QuestReportBackGump.cs b/Scripts/Engines/MLQuests/Gumps/QuestReportBackGump.cs index af75d66a6..d861980a3 100644 --- a/Scripts/Engines/MLQuests/Gumps/QuestReportBackGump.cs +++ b/Scripts/Engines/MLQuests/Gumps/QuestReportBackGump.cs @@ -34,7 +34,7 @@ namespace Server.Engines.MLQuests.Gumps public override void OnResponse( NetState sender, RelayInfo info ) { if ( info.ButtonID == 4 ) - m_Instance.ContinueReportBack(); + m_Instance.ContinueReportBack( true ); } } } diff --git a/Scripts/Engines/MLQuests/MLQuest.cs b/Scripts/Engines/MLQuests/MLQuest.cs index 6405c91ca..8f334c448 100644 --- a/Scripts/Engines/MLQuests/MLQuest.cs +++ b/Scripts/Engines/MLQuests/MLQuest.cs @@ -43,10 +43,12 @@ namespace Server.Engines.MLQuests private TextDefinition m_Description; private TextDefinition m_RefuseMessage; private TextDefinition m_InProgressMessage; - private TextDefinition m_CompleteMessage; + private TextDefinition m_CompletionMessage; + private TextDefinition m_CompletionNotice; // TODO: Flags? (Deserialized, SaveEnabled, Activated) private bool m_OneTimeOnly; + private bool m_HasRestartDelay; public bool Activated { @@ -90,6 +92,12 @@ namespace Server.Engines.MLQuests set { m_OneTimeOnly = value; } } + public bool HasRestartDelay + { + get { return m_HasRestartDelay; } + set { m_HasRestartDelay = value; } + } + public bool HasObjective() where T : BaseObjective { foreach ( BaseObjective obj in m_Objectives ) @@ -118,8 +126,7 @@ namespace Server.Engines.MLQuests public virtual bool RecordCompletion { - // TODO - get { return ( m_OneTimeOnly /* || HasRestartDelay */ ); } + get { return ( m_OneTimeOnly || m_HasRestartDelay ); } } public virtual bool IsChainTriggered { get { return false; } } @@ -129,7 +136,13 @@ namespace Server.Engines.MLQuests public TextDefinition Description { get { return m_Description; } set { m_Description = value; } } public TextDefinition RefusalMessage { get { return m_RefuseMessage; } set { m_RefuseMessage = value; } } public TextDefinition InProgressMessage { get { return m_InProgressMessage; } set { m_InProgressMessage = value; } } - public TextDefinition CompletionMessage { get { return m_CompleteMessage; } set { m_CompleteMessage = value; } } + public TextDefinition CompletionMessage { get { return m_CompletionMessage; } set { m_CompletionMessage = value; } } + public TextDefinition CompletionNotice { get { return m_CompletionNotice; } set { m_CompletionNotice = value; } } + + public static readonly TextDefinition CompletionNoticeDefault = new TextDefinition( 1072273 ); // You've completed a quest! Don't forget to collect your reward. + public static readonly TextDefinition CompletionNoticeShort = new TextDefinition( 1046258 ); // Your quest is complete. + public static readonly TextDefinition CompletionNoticeShortReturn = new TextDefinition( 1073775 ); // Your quest is complete. Return for your reward. + public static readonly TextDefinition CompletionNoticeCraft = new TextDefinition( 1073967 ); // You obtained what you seek, now receive your reward. public MLQuest() { @@ -137,6 +150,7 @@ namespace Server.Engines.MLQuests m_Objectives = new List(); m_ObjectiveType = ObjectiveType.All; m_Rewards = new List(); + m_CompletionNotice = CompletionNoticeDefault; m_Questers = new List(); m_Instances = new List(); @@ -178,21 +192,21 @@ namespace Server.Engines.MLQuests public void PutSpawner( Spawner s, Point3D loc, Map map ) { + string name = String.Format( "MLQS-{0}", GetType().Name ); + // Auto cleanup on regeneration - /* List toDelete = new List(); foreach ( Item item in map.GetItemsInRange( loc, 0 ) ) { - if ( item is Spawner ) + if ( item is Spawner && item.Name == name ) toDelete.Add( item ); } foreach ( Item item in toDelete ) item.Delete(); - */ - s.Name = String.Format( "MLQS-{0}", GetType().Name ); + s.Name = name; s.MoveToWorld( loc, map ); } @@ -203,44 +217,60 @@ namespace Server.Engines.MLQuests return new MLQuestInstance( this, quester, pm ); } - public virtual bool CanOffer( BaseCreature quester, PlayerMobile pm ) + public bool CanOffer( BaseCreature quester, PlayerMobile pm, bool message ) + { + return CanOffer( quester, pm, MLQuestSystem.GetContext( pm ), message ); + } + + public virtual bool CanOffer( BaseCreature quester, PlayerMobile pm, MLQuestContext context, bool message ) { if ( !m_Activated || quester.Deleted || !m_Questers.Contains( quester ) ) return false; - MLQuestContext context = MLQuestSystem.GetContext( pm ); - if ( context != null ) { if ( context.IsFull ) { - MLQuestSystem.Tell( quester, pm, 1080107 ); // I'm sorry, I have nothing for you at this time. + if ( message ) + MLQuestSystem.Tell( quester, pm, 1080107 ); // I'm sorry, I have nothing for you at this time. + return false; } - DateTime lastDone; + MLQuest checkQuest = this; - // TODO: Also recursively check NextQuest? (This would explain Aemaeth1) - if ( context.HasDoneQuest( this, out lastDone ) ) + while ( checkQuest != null ) { - if ( m_OneTimeOnly ) + DateTime nextAvailable; + + if ( context.HasDoneQuest( checkQuest, out nextAvailable ) ) { - MLQuestSystem.Tell( quester, pm, 1075454 ); // I cannot offer you the quest again. - return false; + if ( checkQuest.OneTimeOnly ) + { + if ( message ) + MLQuestSystem.Tell( quester, pm, 1075454 ); // I cannot offer you the quest again. + + return false; + } + else if ( nextAvailable > DateTime.Now ) + { + if ( message ) + MLQuestSystem.Tell( quester, pm, 1075575 ); // I'm sorry, but I don't have anything else for you right now. Could you check back with me in a few minutes? + + return false; + } } - //else if ( m_RestartDelay > TimeSpan.Zero && lastDone + m_RestartDelay > DateTime.Now ) - //{ - // MLQuestSystem.Tell( quester, pm, "Piss off!" ); - // return false; - //} + + if ( checkQuest.NextQuest == null ) + break; + + checkQuest = MLQuestSystem.FindQuest( checkQuest.NextQuest ); } } - // Note: On OSI this is checked before max concurrent / one time only (at least for EscortObjective), - // but it's more intuitive for players to have it here foreach ( BaseObjective obj in m_Objectives ) { - if ( !obj.CanOffer( quester, pm ) ) + if ( !obj.CanOffer( quester, pm, message ) ) return false; } @@ -254,7 +284,7 @@ namespace Server.Engines.MLQuests public virtual void OnAccept( BaseCreature quester, PlayerMobile pm ) { - if ( !CanOffer( quester, pm ) ) + if ( !CanOffer( quester, pm, true ) ) return; MLQuestInstance instance = CreateInstance( quester, pm ); @@ -268,22 +298,9 @@ namespace Server.Engines.MLQuests public virtual void OnRefuse( BaseCreature quester, PlayerMobile pm ) { - if ( !CanOffer( quester, pm ) ) - return; - pm.SendGump( new QuestConversationGump( this, pm, RefusalMessage ) ); } - // Note: Be careful with awarding stuff in OnComplete (like fame), this CAN - // be triggered multiple times for certain objectives. Use OnRewardClaimed instead. - public virtual void OnComplete( MLQuestInstance instance ) - { - instance.Player.SendLocalizedMessage( 1072273, "", 0x23 ); // You've completed a quest! Don't forget to collect your reward. - - // Note: For some quests this message is sent instead: - //instance.Player.SendLocalizedMessage( 1073775, "", 0x23 ); // Your quest is complete. Return for your reward. - } - public virtual void GetRewards( MLQuestInstance instance ) { instance.SendRewardGump(); @@ -305,6 +322,11 @@ namespace Server.Engines.MLQuests { } + public virtual TimeSpan GetRestartDelay() + { + return TimeSpan.FromSeconds( Utility.Random( 1, 5 ) * 30 ); + } + public static void Serialize( GenericWriter writer, MLQuest quest ) { MLQuestSystem.WriteQuestRef( writer, quest ); diff --git a/Scripts/Engines/MLQuests/MLQuestContext.cs b/Scripts/Engines/MLQuests/MLQuestContext.cs index 8c75bcf96..8f4165c32 100644 --- a/Scripts/Engines/MLQuests/MLQuestContext.cs +++ b/Scripts/Engines/MLQuests/MLQuestContext.cs @@ -21,29 +21,29 @@ namespace Server.Engines.MLQuests private class MLDoneQuestInfo { public MLQuest m_Quest; - public DateTime m_Completed; + public DateTime m_NextAvailable; - public MLDoneQuestInfo( MLQuest quest, DateTime completed ) + public MLDoneQuestInfo( MLQuest quest, DateTime nextAvailable ) { m_Quest = quest; - m_Completed = completed; + m_NextAvailable = nextAvailable; } public void Serialize( GenericWriter writer ) { MLQuestSystem.WriteQuestRef( writer, m_Quest ); - writer.Write( m_Completed ); + writer.Write( m_NextAvailable ); } public static MLDoneQuestInfo Deserialize( GenericReader reader, int version ) { MLQuest quest = MLQuestSystem.ReadQuestRef( reader ); - DateTime completed = reader.ReadDateTime(); + DateTime nextAvailable = reader.ReadDateTime(); if ( quest == null || !quest.RecordCompletion ) return null; // forget about this record - return new MLDoneQuestInfo( quest, completed ); + return new MLDoneQuestInfo( quest, nextAvailable ); } } @@ -122,15 +122,15 @@ namespace Server.Engines.MLQuests return false; } - public bool HasDoneQuest( MLQuest quest, out DateTime completed ) + public bool HasDoneQuest( MLQuest quest, out DateTime nextAvailable ) { - completed = DateTime.MinValue; + nextAvailable = DateTime.MinValue; foreach ( MLDoneQuestInfo info in m_DoneQuests ) { if ( info.m_Quest == quest ) { - completed = info.m_Completed; + nextAvailable = info.m_NextAvailable; return true; } } @@ -139,17 +139,22 @@ namespace Server.Engines.MLQuests } public void SetDoneQuest( MLQuest quest ) + { + SetDoneQuest( quest, DateTime.MinValue ); + } + + public void SetDoneQuest( MLQuest quest, DateTime nextAvailable ) { foreach ( MLDoneQuestInfo info in m_DoneQuests ) { if ( info.m_Quest == quest ) { - info.m_Completed = DateTime.Now; + info.m_NextAvailable = nextAvailable; return; } } - m_DoneQuests.Add( new MLDoneQuestInfo( quest, DateTime.Now ) ); + m_DoneQuests.Add( new MLDoneQuestInfo( quest, nextAvailable ) ); } public void RemoveDoneQuest( MLQuest quest ) diff --git a/Scripts/Engines/MLQuests/MLQuestEntry.cs b/Scripts/Engines/MLQuests/MLQuestEntry.cs index 6636f8c2f..de2d522f4 100644 --- a/Scripts/Engines/MLQuests/MLQuestEntry.cs +++ b/Scripts/Engines/MLQuests/MLQuestEntry.cs @@ -182,10 +182,18 @@ namespace Server.Engines.MLQuests foreach ( BaseObjectiveInstance obj in m_ObjectiveInstances ) obj.OnQuestCompleted(); - m_Quest.OnComplete( this ); + TextDefinition.SendMessageTo( m_Player, m_Quest.CompletionNotice, 0x23 ); - if ( !Removed && SkipReportBack && !m_Quest.RequiresCollection ) // An OnComplete can potentially have removed this instance already - ClaimReward = true; + /* + * Advance to the ClaimReward=true stage if this quest has no + * completion message to show anyway. This suppresses further + * triggers of CheckComplete. + * + * For quests that require collections, this is done later when + * the player double clicks the quester. + */ + if ( !Removed && SkipReportBack && !m_Quest.RequiresCollection ) // An OnQuestCompleted can potentially have removed this instance already + ContinueReportBack( false ); } } @@ -273,12 +281,12 @@ namespace Server.Engines.MLQuests public void SendReportBackGump() { if ( SkipReportBack ) - ContinueReportBack(); // skip ahead + ContinueReportBack( true ); // skip ahead else m_Player.SendGump( new QuestReportBackGump( this ) ); } - public void ContinueReportBack() + public void ContinueReportBack( bool sendRewardGump ) { // There is a backpack check here on OSI for the rewards as well (even though it's not needed...) @@ -326,11 +334,15 @@ namespace Server.Engines.MLQuests ClaimReward = true; + if ( m_Quest.HasRestartDelay ) + PlayerContext.SetDoneQuest( m_Quest, DateTime.Now + m_Quest.GetRestartDelay() ); + // This is correct for ObjectiveType.Any as well foreach ( BaseObjectiveInstance objective in m_ObjectiveInstances ) objective.OnAfterClaimReward(); - SendRewardOffer(); + if ( sendRewardGump ) + SendRewardOffer(); } public void ClaimRewards() @@ -385,7 +397,7 @@ namespace Server.Engines.MLQuests MLQuestContext context = PlayerContext; - if ( m_Quest.RecordCompletion ) + if ( m_Quest.RecordCompletion && !m_Quest.HasRestartDelay ) // Quests with restart delays are logged earlier as per OSI context.SetDoneQuest( m_Quest ); if ( m_Quest.IsChainTriggered ) diff --git a/Scripts/Engines/MLQuests/MLQuestSystem.cs b/Scripts/Engines/MLQuests/MLQuestSystem.cs index 906ec6ead..3163a0990 100644 --- a/Scripts/Engines/MLQuests/MLQuestSystem.cs +++ b/Scripts/Engines/MLQuests/MLQuestSystem.cs @@ -116,6 +116,14 @@ namespace Server.Engines.MLQuests questList.Add( quest ); } + public static void Register( MLQuest quest, params Type[] questerTypes ) + { + Register( quest.GetType(), quest ); + + foreach ( Type questerType in questerTypes ) + RegisterQuestGiver( quest, questerType ); + } + public static void Initialize() { if ( !Enabled ) @@ -306,7 +314,7 @@ namespace Server.Engines.MLQuests m.SendGump( new InterfaceGump( m, new string[] { "Object" }, found, 0, null ) ); } - private static bool FindQuest( BaseCreature quester, PlayerMobile pm, out MLQuest quest, out MLQuestInstance entry ) + private static bool FindQuest( BaseCreature quester, PlayerMobile pm, MLQuestContext context, out MLQuest quest, out MLQuestInstance entry ) { quest = null; entry = null; @@ -314,8 +322,6 @@ namespace Server.Engines.MLQuests List quests = quester.MLQuests; Type questerType = quester.GetType(); - MLQuestContext context = GetContext( pm ); - // 1. Check quests in progress with this NPC (overriding deliveries is intended) if ( context != null ) { @@ -323,10 +329,10 @@ namespace Server.Engines.MLQuests { MLQuestInstance instance = context.FindInstance( questEntry ); - if ( instance != null && instance.QuesterType == questerType ) + if ( instance != null && ( instance.Quester == quester || ( !questEntry.IsEscort && instance.QuesterType == questerType ) ) ) { entry = instance; - quest = instance.Quest; + quest = questEntry; return true; } } @@ -353,7 +359,7 @@ namespace Server.Engines.MLQuests } // 4. Random quest - quest = RandomStarterQuest( quester, pm ); + quest = RandomStarterQuest( quester, pm, context ); return ( quest != null ); } @@ -363,16 +369,18 @@ namespace Server.Engines.MLQuests if ( quester.Deleted || !quester.CanGiveMLQuest || !pm.Alive ) return; + MLQuestContext context = GetContext( pm ); + MLQuest quest; MLQuestInstance entry; - if ( !FindQuest( quester, pm, out quest, out entry ) ) + if ( !FindQuest( quester, pm, context, out quest, out entry ) ) { Tell( quester, pm, 1080107 ); // I'm sorry, I have nothing for you at this time. return; } - if ( entry != null && ( entry.Quester == quester || !quest.IsEscort ) ) // TODO: It's possible to move the NPC requirement to FindQuest now + if ( entry != null ) { TurnToFace( quester, pm ); @@ -385,7 +393,7 @@ namespace Server.Engines.MLQuests else entry.SendProgressGump(); } - else if ( quest.CanOffer( quester, pm ) ) + else if ( quest.CanOffer( quester, pm, context, true ) ) { TurnToFace( quester, pm ); @@ -617,39 +625,34 @@ namespace Server.Engines.MLQuests private static List m_EligiblePool = new List(); - public static MLQuest RandomStarterQuest( BaseCreature quester, PlayerMobile pm ) + public static MLQuest RandomStarterQuest( BaseCreature quester, PlayerMobile pm, MLQuestContext context ) { List quests = quester.MLQuests; if ( quests.Count == 0 ) return null; - MLQuestContext context = GetContext( pm ); m_EligiblePool.Clear(); + MLQuest fallback = null; foreach ( MLQuest quest in quests ) { - if ( !quest.Activated ) + if ( quest.IsChainTriggered || ( context != null && context.IsDoingQuest( quest ) ) ) continue; - if ( quest.IsChainTriggered ) - continue; + /* + * Save first quest that reaches the CanOffer call. + * If no quests are valid at all, return this quest for displaying the CanOffer error message. + */ + if ( fallback == null ) + fallback = quest; - if ( context != null ) - { - if ( context.IsDoingQuest( quest ) ) - continue; - - // TODO: Maybe this is more complex and it checks CanOffer... but this'll do for now - if ( quests.Count > 1 && quest.OneTimeOnly && context.HasDoneQuest( quest ) ) - continue; - } - - m_EligiblePool.Add( quest ); + if ( quest.CanOffer( quester, pm, context, false ) ) + m_EligiblePool.Add( quest ); } if ( m_EligiblePool.Count == 0 ) - return null; + return fallback; return m_EligiblePool[Utility.Random( m_EligiblePool.Count )]; } diff --git a/Scripts/Engines/MLQuests/Objectives/BaseObjective.cs b/Scripts/Engines/MLQuests/Objectives/BaseObjective.cs index 277362055..b1d139b62 100644 --- a/Scripts/Engines/MLQuests/Objectives/BaseObjective.cs +++ b/Scripts/Engines/MLQuests/Objectives/BaseObjective.cs @@ -16,7 +16,7 @@ namespace Server.Engines.MLQuests.Objectives { } - public virtual bool CanOffer( BaseCreature quester, PlayerMobile pm ) + public virtual bool CanOffer( BaseCreature quester, PlayerMobile pm, bool message ) { return true; } diff --git a/Scripts/Engines/MLQuests/Objectives/CollectObjective.cs b/Scripts/Engines/MLQuests/Objectives/CollectObjective.cs index 741c0345c..14ad28872 100644 --- a/Scripts/Engines/MLQuests/Objectives/CollectObjective.cs +++ b/Scripts/Engines/MLQuests/Objectives/CollectObjective.cs @@ -67,7 +67,7 @@ namespace Server.Engines.MLQuests.Objectives else result = ( label - 1078872 ); - if ( MLQuestSystem.Debug && result > 0x4000 ) + if ( MLQuestSystem.Debug && ( result <= 0 || result > 0x4000 ) ) Console.WriteLine( "Warning: cliloc {0} is likely giving the wrong item ID", label ); return result; diff --git a/Scripts/Engines/MLQuests/Objectives/EscortObjective.cs b/Scripts/Engines/MLQuests/Objectives/EscortObjective.cs index 872ea99e1..9d21fad00 100644 --- a/Scripts/Engines/MLQuests/Objectives/EscortObjective.cs +++ b/Scripts/Engines/MLQuests/Objectives/EscortObjective.cs @@ -29,7 +29,7 @@ namespace Server.Engines.MLQuests.Objectives m_Destination = destination; } - public override bool CanOffer( BaseCreature quester, PlayerMobile pm ) + public override bool CanOffer( BaseCreature quester, PlayerMobile pm, bool message ) { BaseEscortable escortable = quester as BaseEscortable; @@ -44,7 +44,9 @@ namespace Server.Engines.MLQuests.Objectives { if ( instance.Quest.IsEscort ) { - MLQuestSystem.Tell( quester, pm, 500896 ); // I see you already have an escort. + if ( message ) + MLQuestSystem.Tell( quester, pm, 500896 ); // I see you already have an escort. + return false; } } @@ -55,12 +57,15 @@ namespace Server.Engines.MLQuests.Objectives // Note: On OSI Bravehorn doesn't check the time limit, but it does SET the last escort time... bug! if ( nextEscort > DateTime.Now ) { - int minutes = (int)Math.Ceiling( ( nextEscort - DateTime.Now ).TotalMinutes ); + if ( message ) + { + int minutes = (int)Math.Ceiling( ( nextEscort - DateTime.Now ).TotalMinutes ); - if ( minutes == 1 ) - MLQuestSystem.Tell( quester, pm, "You must rest 1 minute before we set out on this journey." ); - else - MLQuestSystem.Tell( quester, pm, 1071195, minutes.ToString() ); // You must rest ~1_minsleft~ minutes before we set out on this journey. + if ( minutes == 1 ) + MLQuestSystem.Tell( quester, pm, "You must rest 1 minute before we set out on this journey." ); + else + MLQuestSystem.Tell( quester, pm, 1071195, minutes.ToString() ); // You must rest ~1_minsleft~ minutes before we set out on this journey. + } return false; } diff --git a/Scripts/Engines/MLQuests/Objectives/GainSkillObjective.cs b/Scripts/Engines/MLQuests/Objectives/GainSkillObjective.cs index 3a23fa927..4c9634781 100644 --- a/Scripts/Engines/MLQuests/Objectives/GainSkillObjective.cs +++ b/Scripts/Engines/MLQuests/Objectives/GainSkillObjective.cs @@ -66,15 +66,15 @@ namespace Server.Engines.MLQuests.Objectives m_Flags |= GainSkillObjectiveFlags.Accelerate; } - public override bool CanOffer( BaseCreature quester, PlayerMobile pm ) + public override bool CanOffer( BaseCreature quester, PlayerMobile pm, bool message ) { Skill skill = pm.Skills[m_Skill]; if ( ( UseReal ? skill.Fixed : skill.BaseFixedPoint ) >= m_ThresholdFixed ) { - // On OSI both 1077772 and 1080107 are sent. - MLQuestSystem.Tell( quester, pm, 1077772 ); // I cannot teach you, for you know all I can teach! - //MLQuestSystem.Tell( quester, pm, 1080107 ); // I'm sorry, I have nothing for you at this time. + if ( message ) + MLQuestSystem.Tell( quester, pm, 1077772 ); // I cannot teach you, for you know all I can teach! + return false; } diff --git a/Scripts/Misc/TextDefinition.cs b/Scripts/Misc/TextDefinition.cs index 97221dd36..201950fa5 100644 --- a/Scripts/Misc/TextDefinition.cs +++ b/Scripts/Misc/TextDefinition.cs @@ -175,6 +175,17 @@ namespace Server m.SendMessage( def.m_String ); } + public static void SendMessageTo( Mobile m, TextDefinition def, int hue ) + { + if ( def == null ) + return; + + if ( def.m_Number > 0 ) + m.SendLocalizedMessage( def.m_Number, "", hue ); + else if ( def.m_String != null ) + m.SendMessage( hue, def.m_String ); + } + public static void PublicOverheadMessage( Mobile m, MessageType messageType, int hue, TextDefinition def ) { if ( def == null ) diff --git a/Scripts/Mobiles/BaseCreature.cs b/Scripts/Mobiles/BaseCreature.cs index 1a0ee8bca..87d1fc78b 100644 --- a/Scripts/Mobiles/BaseCreature.cs +++ b/Scripts/Mobiles/BaseCreature.cs @@ -366,7 +366,7 @@ namespace Server.Mobiles if ( context != null && context.IsFull ) return; - MLQuest quest = MLQuestSystem.RandomStarterQuest( this, pm ); + MLQuest quest = MLQuestSystem.RandomStarterQuest( this, pm, context ); if ( quest == null || !quest.Activated || ( context != null && context.IsDoingQuest( quest ) ) ) return;