Fixes code according to modern code style. Fixes a few expression bugs.

This commit is contained in:
Kamron Batman 2018-09-15 09:58:51 -07:00
parent 89eea25e5f
commit 970fd563b2
3324 changed files with 441118 additions and 433755 deletions

View file

@ -1,21 +1,21 @@
namespace Server.Engines.MLQuests.Definitions
{
// Base class for escorts providing the AwardHumanInNeed option
public class BaseEscort : MLQuest
{
public virtual bool AwardHumanInNeed => true;
// Base class for escorts providing the AwardHumanInNeed option
public class BaseEscort : MLQuest
{
public BaseEscort()
{
CompletionNotice = CompletionNoticeShort;
}
public BaseEscort()
{
CompletionNotice = CompletionNoticeShort;
}
public virtual bool AwardHumanInNeed => true;
public override void GetRewards( MLQuestInstance instance )
{
if ( AwardHumanInNeed )
HumanInNeed.AwardTo( instance.Player );
public override void GetRewards(MLQuestInstance instance)
{
if (AwardHumanInNeed)
HumanInNeed.AwardTo(instance.Player);
base.GetRewards( instance );
}
}
}
base.GetRewards(instance);
}
}
}

View file

@ -1,4 +1,3 @@
using System;
using Server.Engines.MLQuests.Objectives;
using Server.Engines.MLQuests.Rewards;
using Server.Items;
@ -6,218 +5,226 @@ using Server.Mobiles;
namespace Server.Engines.MLQuests.Definitions
{
#region Quests
#region Quests
public class Momento : MLQuest
{
public Momento()
{
Activated = true;
Title = 1074750; // Momento!
Description = 1074751; // I was going to march right out there and get it myself, but no ... Master Gnosos won't let me. But you see, that bridle means so much to me. A momento of happier, less-dead ... well undead horseback riding. Could you fetch it for me? I think my horse, formerly known as 'Resolve', may still be wearing it.
RefusalMessage = 1074752; // Hrmph.
InProgressMessage = 1074753; // The bridle would be hard to miss on him now ... since he's skeletal. Please do what you need to do to retrieve it for me.
CompletionMessage = 1074754; // I'd know that jingling sound anywhere! You have recovered my bridle. Thank you.
public class Momento : MLQuest
{
public Momento()
{
Activated = true;
Title = 1074750; // Momento!
Description =
1074751; // I was going to march right out there and get it myself, but no ... Master Gnosos won't let me. But you see, that bridle means so much to me. A momento of happier, less-dead ... well undead horseback riding. Could you fetch it for me? I think my horse, formerly known as 'Resolve', may still be wearing it.
RefusalMessage = 1074752; // Hrmph.
InProgressMessage =
1074753; // The bridle would be hard to miss on him now ... since he's skeletal. Please do what you need to do to retrieve it for me.
CompletionMessage = 1074754; // I'd know that jingling sound anywhere! You have recovered my bridle. Thank you.
Objectives.Add( new CollectObjective( 1, typeof( ResolvesBridle ), "Resolve's Bridle" ) );
Objectives.Add(new CollectObjective(1, typeof(ResolvesBridle), "Resolve's Bridle"));
Rewards.Add( ItemReward.LargeBagOfTreasure );
}
Rewards.Add(ItemReward.LargeBagOfTreasure);
}
public override void Generate()
{
base.Generate();
public override void Generate()
{
base.Generate();
PutSpawner( new Spawner( 1, 5, 10, 0, 3, "Kia" ), new Point3D( 87, 1640, 0 ), Map.Malas );
PutSpawner( new Spawner( 1, 5, 10, 0, 3, "Nythalia" ), new Point3D( 91, 1639, 0 ), Map.Malas );
}
}
PutSpawner(new Spawner(1, 5, 10, 0, 3, "Kia"), new Point3D(87, 1640, 0), Map.Malas);
PutSpawner(new Spawner(1, 5, 10, 0, 3, "Nythalia"), new Point3D(91, 1639, 0), Map.Malas);
}
}
public class CulinaryCrisis : MLQuest
{
public CulinaryCrisis()
{
Activated = true;
Title = 1074755; // Culinary Crisis
Description = 1074756; // You have NO idea how impossible this is. Simply intolerable! How can one expect an artiste' like me to create masterpieces of culinary delight without the best, fresh ingredients? Ever since this whositwhatsit started this uproar, my thrice-daily produce deliveries have ended. I can't survive another hour without produce!
RefusalMessage = 1074757; // You have no artistry in your soul.
InProgressMessage = 1074758; // I must have fresh produce and cheese at once!
CompletionMessage = 1074759; // Those dates look bruised! Oh no, and you fetched a soft cheese. *deep pained sigh* Well, even I can only do so much with inferior ingredients. BAM!
public class CulinaryCrisis : MLQuest
{
public CulinaryCrisis()
{
Activated = true;
Title = 1074755; // Culinary Crisis
Description =
1074756; // You have NO idea how impossible this is. Simply intolerable! How can one expect an artiste' like me to create masterpieces of culinary delight without the best, fresh ingredients? Ever since this whositwhatsit started this uproar, my thrice-daily produce deliveries have ended. I can't survive another hour without produce!
RefusalMessage = 1074757; // You have no artistry in your soul.
InProgressMessage = 1074758; // I must have fresh produce and cheese at once!
CompletionMessage =
1074759; // Those dates look bruised! Oh no, and you fetched a soft cheese. *deep pained sigh* Well, even I can only do so much with inferior ingredients. BAM!
Objectives.Add( new CollectObjective( 20, typeof( Dates ), 1025927 ) ); // bunch of dates
Objectives.Add( new CollectObjective( 5, typeof( CheeseWheel ), 1022430 ) ); // wheel of cheese
Objectives.Add(new CollectObjective(20, typeof(Dates), 1025927)); // bunch of dates
Objectives.Add(new CollectObjective(5, typeof(CheeseWheel), 1022430)); // wheel of cheese
Rewards.Add( ItemReward.BagOfTreasure );
}
Rewards.Add(ItemReward.BagOfTreasure);
}
public override void Generate()
{
base.Generate();
public override void Generate()
{
base.Generate();
PutSpawner( new Spawner( 1, 5, 10, 0, 3, "Emerillo" ), new Point3D( 90, 1639, 0 ), Map.Malas );
}
}
PutSpawner(new Spawner(1, 5, 10, 0, 3, "Emerillo"), new Point3D(90, 1639, 0), Map.Malas);
}
}
public class GoneNative : MLQuest
{
public GoneNative()
{
Activated = true;
Title = 1074855; // Gone Native
Description = 1074856; // Pathetic really. I must say, a senior instructor going native -- forgetting about his students and peers and engaging in such disgraceful behavior! I'm speaking, of course, of Theophilus. Master Theophilus to you. He may have gone native but he still holds a Mastery Degree from Bedlam College! But, well, that's neither here nor there. I need you to take care of my colleague. Convince him of the error of his ways. He may resist. In fact, assume he will and kill him. We'll get him resurrected and be ready to cure his folly. What do you say?
RefusalMessage = 1074857; // I understand. A Master of Bedlam, even one entirely off his rocker, is too much for you to handle.
InProgressMessage = 1074858; // You had better get going. Master Theophilus isn't likely to kill himself just to save me this embarrassment.
CompletionMessage = 1074859; // You look a bit worse for wear! He put up a good fight did he? Hah! That's the spirit … a Master of Bedlam is a match for most.
public class GoneNative : MLQuest
{
public GoneNative()
{
Activated = true;
Title = 1074855; // Gone Native
Description =
1074856; // Pathetic really. I must say, a senior instructor going native -- forgetting about his students and peers and engaging in such disgraceful behavior! I'm speaking, of course, of Theophilus. Master Theophilus to you. He may have gone native but he still holds a Mastery Degree from Bedlam College! But, well, that's neither here nor there. I need you to take care of my colleague. Convince him of the error of his ways. He may resist. In fact, assume he will and kill him. We'll get him resurrected and be ready to cure his folly. What do you say?
RefusalMessage =
1074857; // I understand. A Master of Bedlam, even one entirely off his rocker, is too much for you to handle.
InProgressMessage =
1074858; // You had better get going. Master Theophilus isn't likely to kill himself just to save me this embarrassment.
CompletionMessage =
1074859; // You look a bit worse for wear! He put up a good fight did he? Hah! That's the spirit … a Master of Bedlam is a match for most.
Objectives.Add( new KillObjective( 1, new[] { typeof( MasterTheophilus ) }, "Master Theophilus" ) );
Objectives.Add(new KillObjective(1, new[] { typeof(MasterTheophilus) }, "Master Theophilus"));
Rewards.Add( ItemReward.LargeBagOfTreasure );
}
}
Rewards.Add(ItemReward.LargeBagOfTreasure);
}
}
#endregion
#endregion
#region Mobiles
#region Mobiles
[QuesterName( "Kia (Bedlam)" )]
public class Kia : BaseCreature
{
public override bool IsInvulnerable => true;
public override string DefaultName => "Kia";
[QuesterName("Kia (Bedlam)")]
public class Kia : BaseCreature
{
[Constructible]
public Kia()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
{
Title = "the student";
Race = Race.Human;
BodyValue = 0x191;
Female = true;
Hue = Race.RandomSkinHue();
InitStats(100, 100, 25);
[Constructible]
public Kia()
: base( AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2 )
{
Title = "the student";
Race = Race.Human;
BodyValue = 0x191;
Female = true;
Hue = Race.RandomSkinHue();
InitStats( 100, 100, 25 );
Utility.AssignRandomHair(this, true);
Utility.AssignRandomHair( this, true );
AddItem(new Backpack());
AddItem(new Sandals(0x709));
AddItem(new Robe(0x497));
}
AddItem( new Backpack() );
AddItem( new Sandals( 0x709 ) );
AddItem( new Robe( 0x497 ) );
}
public Kia(Serial serial)
: base(serial)
{
}
public Kia( Serial serial )
: base( serial )
{
}
public override bool IsInvulnerable => true;
public override string DefaultName => "Kia";
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write( (int) 0 ); // version
}
writer.Write(0); // version
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
int version = reader.ReadInt();
}
}
[QuesterName( "Emerillo (Bedlam)" )]
public class Emerillo : BaseCreature
{
public override bool IsInvulnerable => true;
public override string DefaultName => "Emerillo";
[QuesterName("Emerillo (Bedlam)")]
public class Emerillo : BaseCreature
{
[Constructible]
public Emerillo()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
{
Title = "the cook";
Race = Race.Human;
BodyValue = 0x190;
Female = false;
Hue = Race.RandomSkinHue();
InitStats(100, 100, 25);
public override bool CanShout => true;
Utility.AssignRandomHair(this, true);
public override void Shout( PlayerMobile pm )
{
MLQuestSystem.Tell( this, pm, 1074222 ); // Could I trouble you for some assistance?
}
AddItem(new Backpack());
AddItem(new Sandals(Utility.RandomNeutralHue()));
AddItem(new ShortPants(Utility.RandomPinkHue()));
AddItem(new Shirt());
AddItem(new HalfApron(0x8FD));
}
[Constructible]
public Emerillo()
: base( AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2 )
{
Title = "the cook";
Race = Race.Human;
BodyValue = 0x190;
Female = false;
Hue = Race.RandomSkinHue();
InitStats( 100, 100, 25 );
public Emerillo(Serial serial)
: base(serial)
{
}
Utility.AssignRandomHair( this, true );
public override bool IsInvulnerable => true;
public override string DefaultName => "Emerillo";
AddItem( new Backpack() );
AddItem( new Sandals( Utility.RandomNeutralHue() ) );
AddItem( new ShortPants( Utility.RandomPinkHue() ) );
AddItem( new Shirt() );
AddItem( new HalfApron( 0x8FD ) );
}
public override bool CanShout => true;
public Emerillo( Serial serial )
: base( serial )
{
}
public override void Shout(PlayerMobile pm)
{
MLQuestSystem.Tell(this, pm, 1074222); // Could I trouble you for some assistance?
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write( (int) 0 ); // version
}
writer.Write(0); // version
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
int version = reader.ReadInt();
}
}
public class Nythalia : BaseCreature
{
public override bool IsInvulnerable => true;
public override string DefaultName => "Mythalia";
public class Nythalia : BaseCreature
{
[Constructible]
public Nythalia()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
{
Title = "the student";
Race = Race.Human;
BodyValue = 0x191;
Female = true;
Hue = Race.RandomSkinHue();
InitStats(100, 100, 25);
[Constructible]
public Nythalia()
: base( AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2 )
{
Title = "the student";
Race = Race.Human;
BodyValue = 0x191;
Female = true;
Hue = Race.RandomSkinHue();
InitStats( 100, 100, 25 );
Utility.AssignRandomHair(this, true);
Utility.AssignRandomHair( this, true );
AddItem(new Backpack());
AddItem(new Shoes(Utility.RandomNeutralHue()));
AddItem(new Robe(Utility.RandomBool() ? 0x497 : 0x498));
}
AddItem( new Backpack() );
AddItem( new Shoes( Utility.RandomNeutralHue() ) );
AddItem( new Robe( Utility.RandomBool() ? 0x497 : 0x498 ) );
}
public Nythalia(Serial serial)
: base(serial)
{
}
public Nythalia( Serial serial )
: base( serial )
{
}
public override bool IsInvulnerable => true;
public override string DefaultName => "Mythalia";
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write( (int) 0 ); // version
}
writer.Write(0); // version
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
int version = reader.ReadInt();
}
}
#endregion
}
#endregion
}

View file

@ -1,271 +1,287 @@
using System;
using Server.Mobiles;
using Server.Items;
using Server.Engines.MLQuests.Objectives;
using Server.Engines.MLQuests.Rewards;
using Server.Items;
using Server.Mobiles;
namespace Server.Engines.MLQuests.Definitions
{
#region Quests
#region Quests
public class VilePoison : MLQuest
{
public override Type NextQuest => typeof( ARockAndAHardPlace );
public class VilePoison : MLQuest
{
public VilePoison()
{
Activated = true;
Title = 1074950; // Vile Poison
Description =
1074956; // Heya! I'm sure glad to see you. Listen I'm in a bit of a bind here. I'm supposed to be gathering poisoned water at the base of that corrupted tree there, but I can't get in under the roots to get a good sample. The branches and brush are so tainted that they can't be cut, burned or even magically passed. It's put my work at a real standstill. If you help me out, I'll help you get in there too. Whadda ya say?
RefusalMessage = 1074964; // Okay. If you change your mind, I'll probably still be stuck here trying to get in.
InProgressMessage = 1074968; // My friend, Iosep, is a weaponsmith in Jhelom. If anyone can help us, he can!
CompletionMessage =
1074991; // Greetings. What have you there? Ah, a sample from a poisonous tree, you say? My friend Jamal sent you? Well, let me see that then, and we'll get to work.
public VilePoison()
{
Activated = true;
Title = 1074950; // Vile Poison
Description = 1074956; // Heya! I'm sure glad to see you. Listen I'm in a bit of a bind here. I'm supposed to be gathering poisoned water at the base of that corrupted tree there, but I can't get in under the roots to get a good sample. The branches and brush are so tainted that they can't be cut, burned or even magically passed. It's put my work at a real standstill. If you help me out, I'll help you get in there too. Whadda ya say?
RefusalMessage = 1074964; // Okay. If you change your mind, I'll probably still be stuck here trying to get in.
InProgressMessage = 1074968; // My friend, Iosep, is a weaponsmith in Jhelom. If anyone can help us, he can!
CompletionMessage = 1074991; // Greetings. What have you there? Ah, a sample from a poisonous tree, you say? My friend Jamal sent you? Well, let me see that then, and we'll get to work.
Objectives.Add(new DeliverObjective(typeof(TaintedTreeSample), 1, "tainted tree sample", typeof(Iosep)));
Objectives.Add( new DeliverObjective( typeof( TaintedTreeSample ), 1, "tainted tree sample", typeof( Iosep ) ) );
Rewards.Add(new DummyReward(1074962)); // A step closer to entering Blighted Grove.
}
Rewards.Add( new DummyReward( 1074962 ) ); // A step closer to entering Blighted Grove.
}
public override Type NextQuest => typeof(ARockAndAHardPlace);
public override void Generate()
{
base.Generate();
public override void Generate()
{
base.Generate();
PutSpawner( new Spawner( 1, 5, 10, 0, 5, "Jamal" ), new Point3D( 559, 1651, 0 ), Map.Felucca );
PutSpawner( new Spawner( 1, 5, 10, 0, 5, "Jamal" ), new Point3D( 559, 1651, 0 ), Map.Trammel );
PutSpawner(new Spawner(1, 5, 10, 0, 5, "Jamal"), new Point3D(559, 1651, 0), Map.Felucca);
PutSpawner(new Spawner(1, 5, 10, 0, 5, "Jamal"), new Point3D(559, 1651, 0), Map.Trammel);
PutSpawner( new Spawner( 1, 5, 10, 0, 2, "Iosep" ), new Point3D( 1354, 3754, 0 ), Map.Felucca );
PutSpawner( new Spawner( 1, 5, 10, 0, 2, "Iosep" ), new Point3D( 1354, 3754, 0 ), Map.Trammel );
}
}
PutSpawner(new Spawner(1, 5, 10, 0, 2, "Iosep"), new Point3D(1354, 3754, 0), Map.Felucca);
PutSpawner(new Spawner(1, 5, 10, 0, 2, "Iosep"), new Point3D(1354, 3754, 0), Map.Trammel);
}
}
public class ARockAndAHardPlace : MLQuest
{
public override Type NextQuest => typeof( SympatheticMagic );
public override bool IsChainTriggered => true;
public class ARockAndAHardPlace : MLQuest
{
public ARockAndAHardPlace()
{
Activated = true;
Title = 1074951; // A Rock and a Hard Place
Description =
1074957; // This is some nasty stuff, that's for certain. I don't even want to think about what sort of blight caused this venomous reaction from that old tree. Let's get to work … we'll need to try something really hard but still workable as our base material. Nothing's harder than stone and diamond. Let's try them first.
RefusalMessage = 1074965; // Sure, no problem. I thought you were interested in figuring this out.
InProgressMessage =
1074969; // If you're a miner, you should have no trouble getting that stuff. If not, you can probably buy some samples from a miner?
CompletionMessage =
1074992; // Have you got the granite and diamonds? Great, let me see them and we'll see what effect this venom has upon them.
public ARockAndAHardPlace()
{
Activated = true;
Title = 1074951; // A Rock and a Hard Place
Description = 1074957; // This is some nasty stuff, that's for certain. I don't even want to think about what sort of blight caused this venomous reaction from that old tree. Let's get to work … we'll need to try something really hard but still workable as our base material. Nothing's harder than stone and diamond. Let's try them first.
RefusalMessage = 1074965; // Sure, no problem. I thought you were interested in figuring this out.
InProgressMessage = 1074969; // If you're a miner, you should have no trouble getting that stuff. If not, you can probably buy some samples from a miner?
CompletionMessage = 1074992; // Have you got the granite and diamonds? Great, let me see them and we'll see what effect this venom has upon them.
// Any type of granite works
Objectives.Add(new CollectObjective(4, typeof(BaseGranite), 1026009)); // rock
Objectives.Add(new CollectObjective(2, typeof(BlueDiamond), 1032696)); // Blue Diamond
// Any type of granite works
Objectives.Add( new CollectObjective( 4, typeof( BaseGranite ), 1026009 ) ); // rock
Objectives.Add( new CollectObjective( 2, typeof( BlueDiamond ), 1032696 ) ); // Blue Diamond
Rewards.Add(new DummyReward(1074962)); // A step closer to entering Blighted Grove.
}
Rewards.Add( new DummyReward( 1074962 ) ); // A step closer to entering Blighted Grove.
}
}
public override Type NextQuest => typeof(SympatheticMagic);
public override bool IsChainTriggered => true;
}
public class SympatheticMagic : MLQuest
{
public override Type NextQuest => typeof( AlreadyDead );
public override bool IsChainTriggered => true;
public class SympatheticMagic : MLQuest
{
public SympatheticMagic()
{
Activated = true;
Title = 1074952; // Sympathetic Magic
Description =
1074958; // Hmm, I've never even heard of something that can damage diamond like that. I guess we'll have to go with plan B. Let's try something similar. Sometimes there's a natural immunity to be found when you use a substance that's like the one you're trying to cut. A sort of "sympathetic" thing. Y'know?
RefusalMessage = 1074965; // Sure, no problem. I thought you were interested in figuring this out.
InProgressMessage = 1074970; // I think a lumberjack can help supply bark.
CompletionMessage = 1074993; // You're back with the bark already? Terrific! I bet this will do the trick.
public SympatheticMagic()
{
Activated = true;
Title = 1074952; // Sympathetic Magic
Description = 1074958; // Hmm, I've never even heard of something that can damage diamond like that. I guess we'll have to go with plan B. Let's try something similar. Sometimes there's a natural immunity to be found when you use a substance that's like the one you're trying to cut. A sort of "sympathetic" thing. Y'know?
RefusalMessage = 1074965; // Sure, no problem. I thought you were interested in figuring this out.
InProgressMessage = 1074970; // I think a lumberjack can help supply bark.
CompletionMessage = 1074993; // You're back with the bark already? Terrific! I bet this will do the trick.
Objectives.Add(new CollectObjective(10, typeof(BarkFragment), 1032687)); // Bark Fragment
Objectives.Add( new CollectObjective( 10, typeof( BarkFragment ), 1032687 ) ); // Bark Fragment
Rewards.Add(new DummyReward(1074962)); // A step closer to entering Blighted Grove.
}
Rewards.Add( new DummyReward( 1074962 ) ); // A step closer to entering Blighted Grove.
}
}
public override Type NextQuest => typeof(AlreadyDead);
public override bool IsChainTriggered => true;
}
public class AlreadyDead : MLQuest
{
public override Type NextQuest => typeof( Eureka );
public override bool IsChainTriggered => true;
public class AlreadyDead : MLQuest
{
public AlreadyDead()
{
Activated = true;
Title = 1074953; // Already Dead
Description =
1074959; // Amazing! The bark was reduced to ash in seconds. Whatever this taint is, it plays havok with living things. And of course, it took the edge off both diamonds and granite even faster. What we need is something workable but dead; something that can hold an edge without melting. See what you can come up with, please.
RefusalMessage = 1074965; // Sure, no problem. I thought you were interested in figuring this out.
InProgressMessage =
1074971; // I'm thinking we need something fairly brittle or it won't hold an edge. And, it can't be alive, of course.
CompletionMessage = 1074994; // Great thought! Bone might just do the trick.
public AlreadyDead()
{
Activated = true;
Title = 1074953; // Already Dead
Description = 1074959; // Amazing! The bark was reduced to ash in seconds. Whatever this taint is, it plays havok with living things. And of course, it took the edge off both diamonds and granite even faster. What we need is something workable but dead; something that can hold an edge without melting. See what you can come up with, please.
RefusalMessage = 1074965; // Sure, no problem. I thought you were interested in figuring this out.
InProgressMessage = 1074971; // I'm thinking we need something fairly brittle or it won't hold an edge. And, it can't be alive, of course.
CompletionMessage = 1074994; // Great thought! Bone might just do the trick.
Objectives.Add(new InternalObjective());
Objectives.Add( new InternalObjective() );
Rewards.Add(new DummyReward(1074962)); // A step closer to entering Blighted Grove.
}
Rewards.Add( new DummyReward( 1074962 ) ); // A step closer to entering Blighted Grove.
}
public override Type NextQuest => typeof(Eureka);
public override bool IsChainTriggered => true;
private class InternalObjective : CollectObjective
{
public override bool ShowDetailed => false;
private class InternalObjective : CollectObjective
{
public InternalObjective()
: base(10, typeof(Bone), 1074963) // (10) workable samples
{
}
public InternalObjective()
: base( 10, typeof( Bone ), 1074963 ) // (10) workable samples
{
}
}
}
public override bool ShowDetailed => false;
}
}
public class Eureka : MLQuest
{
public override Type NextQuest => typeof( SubContracting );
public override bool IsChainTriggered => true;
public class Eureka : MLQuest
{
public Eureka()
{
Activated = true;
Title = 1074954; // Eureka!
Description =
1074960; // We're in business! I've put together the instructions for chopping sort of sword, in the style of one of those new-fangled elven machetes. Take those back to Jamal for me, if you would.
RefusalMessage = 1074966; // Well, okay. I guess I thought you'd want to see this through.
InProgressMessage =
1074972; // I'm sure Jamal is eager to get this information. He's probably still hanging around near that big old blighted tree.
CompletionMessage = 1074995; // Heya! You're back. Was Iosep able to help? Let me see what he's sent.
public Eureka()
{
Activated = true;
Title = 1074954; // Eureka!
Description = 1074960; // We're in business! I've put together the instructions for chopping sort of sword, in the style of one of those new-fangled elven machetes. Take those back to Jamal for me, if you would.
RefusalMessage = 1074966; // Well, okay. I guess I thought you'd want to see this through.
InProgressMessage = 1074972; // I'm sure Jamal is eager to get this information. He's probably still hanging around near that big old blighted tree.
CompletionMessage = 1074995; // Heya! You're back. Was Iosep able to help? Let me see what he's sent.
Objectives.Add(new DeliverObjective(typeof(SealedNotesForJamal), 1, "sealed note for Jamal", typeof(Jamal)));
Objectives.Add( new DeliverObjective( typeof( SealedNotesForJamal ), 1, "sealed note for Jamal", typeof( Jamal ) ) );
Rewards.Add(new DummyReward(1074962)); // A step closer to entering Blighted Grove.
}
Rewards.Add( new DummyReward( 1074962 ) ); // A step closer to entering Blighted Grove.
}
public override Type NextQuest => typeof(SubContracting);
public override bool IsChainTriggered => true;
public override void GetRewards( MLQuestInstance instance )
{
PlayerMobile pm = instance.Player;
public override void GetRewards(MLQuestInstance instance)
{
PlayerMobile pm = instance.Player;
if ( !pm.HasRecipe( 32 ) )
{
// The ability is awarded regardless of blacksmithy skill
pm.AcquireRecipe( 32 );
if (!pm.HasRecipe(32))
{
// The ability is awarded regardless of blacksmithy skill
pm.AcquireRecipe(32);
if ( pm.Skills[SkillName.Blacksmith].Base < 45.0 ) // TODO: Verify threshold
pm.SendLocalizedMessage( 1075005 ); // You observe carefully but you can't grasp the complexities of smithing a bone handled machete.
else
pm.SendLocalizedMessage( 1075006 ); // You have learned how to smith a bone handled machete!
}
if (pm.Skills[SkillName.Blacksmith].Base < 45.0) // TODO: Verify threshold
pm.SendLocalizedMessage(
1075005); // You observe carefully but you can't grasp the complexities of smithing a bone handled machete.
else
pm.SendLocalizedMessage(1075006); // You have learned how to smith a bone handled machete!
}
base.GetRewards( instance );
}
}
base.GetRewards(instance);
}
}
public class SubContracting : MLQuest
{
public override bool IsChainTriggered => true;
public class SubContracting : MLQuest
{
public SubContracting()
{
Activated = true;
Title = 1074955; // Sub Contracting
Description =
1074961; // Wonderful! Now we can both get in there! Let me show you these instructions for making this machete. If you're not skilled in smithing, I'm not sure how much sense it will make though. Listen, if you're heading in there anyway … maybe you'd do me one more favor? I'm ah ... buried in work out here ... so if you'd go in and get me a few water samples, I'd be obliged.
RefusalMessage = 1074967; // Oh. Right, I guess you're really ... ah ... busy too.
InProgressMessage =
1074973; // Once you're inside, look for places where the water has twisted and warped the natural creatures.
CompletionMessage =
1074996; // I hear sloshing ... that must mean you've got my water samples. Whew, I'm so glad you braved the dangers in there ... I mean, I would have but I'm so busy out here. Here's your reward!
public SubContracting()
{
Activated = true;
Title = 1074955; // Sub Contracting
Description = 1074961; // Wonderful! Now we can both get in there! Let me show you these instructions for making this machete. If you're not skilled in smithing, I'm not sure how much sense it will make though. Listen, if you're heading in there anyway … maybe you'd do me one more favor? I'm ah ... buried in work out here ... so if you'd go in and get me a few water samples, I'd be obliged.
RefusalMessage = 1074967; // Oh. Right, I guess you're really ... ah ... busy too.
InProgressMessage = 1074973; // Once you're inside, look for places where the water has twisted and warped the natural creatures.
CompletionMessage = 1074996; // I hear sloshing ... that must mean you've got my water samples. Whew, I'm so glad you braved the dangers in there ... I mean, I would have but I'm so busy out here. Here's your reward!
Objectives.Add(new CollectObjective(3, typeof(SamplesOfCorruptedWater),
"samples of corrupted water")); // On OSI the label is "#1074999"
// TODO: "Return to" should say "Jamal (near Blighted Grove)"
// Maybe every quest NPC has directions as a property?
Objectives.Add( new CollectObjective( 3, typeof( SamplesOfCorruptedWater ), "samples of corrupted water" ) ); // On OSI the label is "#1074999"
// TODO: "Return to" should say "Jamal (near Blighted Grove)"
// Maybe every quest NPC has directions as a property?
Rewards.Add(ItemReward.LargeBagOfTreasure);
}
Rewards.Add( ItemReward.LargeBagOfTreasure );
}
}
public override bool IsChainTriggered => true;
}
#endregion
#endregion
#region Mobiles
#region Mobiles
[QuesterName( "Jamal (near Blighted Grove)" )]
public class Jamal : BaseCreature
{
public override bool IsInvulnerable => true;
public override string DefaultName => "Jamal";
[QuesterName("Jamal (near Blighted Grove)")]
public class Jamal : BaseCreature
{
[Constructible]
public Jamal()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.2, 0.4)
{
Title = "the Fisherman";
Body = 400;
Hue = Race.RandomSkinHue();
InitStats(100, 100, 25);
[Constructible]
public Jamal()
: base( AIType.AI_Vendor, FightMode.None, 2, 1, 0.2, 0.4 )
{
Title = "the Fisherman";
Body = 400;
Hue = Race.RandomSkinHue();
InitStats( 100, 100, 25 );
Utility.AssignRandomHair(this);
Utility.AssignRandomFacialHair(this, HairHue);
Utility.AssignRandomHair( this );
Utility.AssignRandomFacialHair( this, HairHue );
AddItem(new Shirt(0x1BB));
AddItem(new ShortPants(Utility.RandomNeutralHue()));
AddItem(new ThighBoots(Utility.RandomAnimalHue()));
AddItem(new Backpack());
}
AddItem( new Shirt( 0x1BB ) );
AddItem( new ShortPants( Utility.RandomNeutralHue() ) );
AddItem( new ThighBoots( Utility.RandomAnimalHue() ) );
AddItem( new Backpack() );
}
public Jamal(Serial serial)
: base(serial)
{
}
public Jamal( Serial serial )
: base( serial )
{
}
public override bool IsInvulnerable => true;
public override string DefaultName => "Jamal";
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write( (int)0 ); // version
}
writer.Write(0); // version
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
reader.ReadInt();
}
}
reader.ReadInt();
}
}
[QuesterName( "Iosep (Jhelom)" )]
public class Iosep : BaseCreature
{
public override bool IsInvulnerable => true;
public override string DefaultName => "Iosep";
[QuesterName("Iosep (Jhelom)")]
public class Iosep : BaseCreature
{
[Constructible]
public Iosep()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.2, 0.4)
{
Title = "the Exporter";
Body = 400;
Hue = Race.RandomSkinHue();
InitStats(100, 100, 25);
public override bool CanShout => true;
public override void Shout( PlayerMobile pm )
{
MLQuestSystem.Tell( this, pm, Utility.RandomList(
1074209, // Hey, could you help me out with something?
1074215 // Dont test my patience you sniveling worm!
) );
}
AddItem(new FancyShirt(Utility.RandomBlueHue()));
AddItem(new LongPants(0x1BB));
AddItem(new Shoes(Utility.RandomNeutralHue()));
AddItem(new Backpack());
}
[Constructible]
public Iosep()
: base( AIType.AI_Vendor, FightMode.None, 2, 1, 0.2, 0.4 )
{
Title = "the Exporter";
Body = 400;
Hue = Race.RandomSkinHue();
InitStats( 100, 100, 25 );
public Iosep(Serial serial)
: base(serial)
{
}
AddItem( new FancyShirt( Utility.RandomBlueHue() ) );
AddItem( new LongPants( 0x1BB ) );
AddItem( new Shoes( Utility.RandomNeutralHue() ) );
AddItem( new Backpack() );
}
public override bool IsInvulnerable => true;
public override string DefaultName => "Iosep";
public Iosep( Serial serial )
: base( serial )
{
}
public override bool CanShout => true;
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
public override void Shout(PlayerMobile pm)
{
MLQuestSystem.Tell(this, pm, Utility.RandomList(
1074209, // Hey, could you help me out with something?
1074215 // Dont test my patience you sniveling worm!
));
}
writer.Write( (int)0 ); // version
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
writer.Write(0); // version
}
reader.ReadInt();
}
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
#endregion
}
reader.ReadInt();
}
}
#endregion
}

View file

@ -6,188 +6,199 @@ using Server.Mobiles;
namespace Server.Engines.MLQuests.Definitions
{
#region Quests
#region Quests
public class Aemaeth1 : MLQuest
{
public override Type NextQuest => typeof( Aemaeth2 );
public class Aemaeth1 : MLQuest
{
public Aemaeth1()
{
Activated = true;
Title = 1075321; // Aemaeth
Description =
1075322; // My father died in an accident some months ago. My mother refused to accept his death. We had a little money set by, and she took it to a necromancer, who promised to restore my father to life. Well, he revived my father, all right, the cheat! Now my father is a walking corpse, a travesty . . . a monster. My mother is beside herself -- she won't eat, she can't sleep. I prayed at the shrine of Spirituality for guidance, and I must have fallen asleep. When I awoke, there was this basin of clear water. I cannot leave my mother, for I fear what she might do to herself. Could you take this to the graveyard, and give it to what is left of my father?
RefusalMessage =
1075324; // Oh! Alright then. I hope someone comes along soon who can help me, or I dont know what will become of us.
InProgressMessage =
1075325; // My father - or what remains of him - can be found in the graveyard northwest of the city.
CompletionMessage = 1075326; // What is this you give me? A basin of water?
CompletionNotice = CompletionNoticeShort;
public Aemaeth1()
{
Activated = true;
Title = 1075321; // Aemaeth
Description = 1075322; // My father died in an accident some months ago. My mother refused to accept his death. We had a little money set by, and she took it to a necromancer, who promised to restore my father to life. Well, he revived my father, all right, the cheat! Now my father is a walking corpse, a travesty . . . a monster. My mother is beside herself -- she won't eat, she can't sleep. I prayed at the shrine of Spirituality for guidance, and I must have fallen asleep. When I awoke, there was this basin of clear water. I cannot leave my mother, for I fear what she might do to herself. Could you take this to the graveyard, and give it to what is left of my father?
RefusalMessage = 1075324; // Oh! Alright then. I hope someone comes along soon who can help me, or I dont know what will become of us.
InProgressMessage = 1075325; // My father - or what remains of him - can be found in the graveyard northwest of the city.
CompletionMessage = 1075326; // What is this you give me? A basin of water?
CompletionNotice = CompletionNoticeShort;
Objectives.Add(new DeliverObjective(typeof(BasinOfCrystalClearWater), 1, "Basin of Crystal Clear Water",
typeof(SkeletonOfSzandor)));
Objectives.Add( new DeliverObjective( typeof( BasinOfCrystalClearWater ), 1, "Basin of Crystal Clear Water", typeof( SkeletonOfSzandor ) ) );
Rewards.Add(new DummyReward(1075323)); // Aurelia's gratitude.
}
Rewards.Add( new DummyReward( 1075323 ) ); // Aurelia's gratitude.
}
public override Type NextQuest => typeof(Aemaeth2);
public override void Generate()
{
base.Generate();
public override void Generate()
{
base.Generate();
PutSpawner( new Spawner( 1, 5, 10, 0, 4, "Aurelia" ), new Point3D( 1459, 3795, 0 ), Map.Trammel );
PutSpawner( new Spawner( 1, 5, 10, 0, 4, "Aurelia" ), new Point3D( 1459, 3795, 0 ), Map.Felucca );
}
}
PutSpawner(new Spawner(1, 5, 10, 0, 4, "Aurelia"), new Point3D(1459, 3795, 0), Map.Trammel);
PutSpawner(new Spawner(1, 5, 10, 0, 4, "Aurelia"), new Point3D(1459, 3795, 0), Map.Felucca);
}
}
public class Aemaeth2 : MLQuest
{
public override bool IsChainTriggered => true;
public class Aemaeth2 : MLQuest
{
public Aemaeth2()
{
Activated = true;
OneTimeOnly = true;
Title = 1075327; // Aemaeth
Description =
1075328; // You tell me it is time to leave this flesh. I did not understand until now. I thought: I can see my wife and my daughter, I can speak. Is this not life? But now, as I regard my reflection, I see what I have become. This only a mockery of life. Thank you for having the courage to show me the truth. For the love I bear my wife and daughter, I know now that I must pass beyond the veil. Will you return this basin to Aurelia? She will know by this that I am at rest.
RefusalMessage =
1075330; // You wont take this back to my daughter? Please, I cannot leave until she knows I am at peace.
InProgressMessage = 1075331; // My daughter will be at my home, on the east side of the city.
CompletionMessage =
1075332; // Thank goodness! Now we can honor my father for the great man he was while he lived, rather than the horror he became.
CompletionNotice = CompletionNoticeShort;
public Aemaeth2()
{
Activated = true;
OneTimeOnly = true;
Title = 1075327; // Aemaeth
Description = 1075328; // You tell me it is time to leave this flesh. I did not understand until now. I thought: I can see my wife and my daughter, I can speak. Is this not life? But now, as I regard my reflection, I see what I have become. This only a mockery of life. Thank you for having the courage to show me the truth. For the love I bear my wife and daughter, I know now that I must pass beyond the veil. Will you return this basin to Aurelia? She will know by this that I am at rest.
RefusalMessage = 1075330; // You wont take this back to my daughter? Please, I cannot leave until she knows I am at peace.
InProgressMessage = 1075331; // My daughter will be at my home, on the east side of the city.
CompletionMessage = 1075332; // Thank goodness! Now we can honor my father for the great man he was while he lived, rather than the horror he became.
CompletionNotice = CompletionNoticeShort;
Objectives.Add(new DeliverObjective(typeof(BasinOfCrystalClearWater), 1, "Basin of Crystal Clear Water",
typeof(Aurelia)));
Objectives.Add( new DeliverObjective( typeof( BasinOfCrystalClearWater ), 1, "Basin of Crystal Clear Water", typeof( Aurelia ) ) );
Rewards.Add(new ItemReward(1075304, typeof(MirrorOfPurification))); // Mirror of Purification
}
Rewards.Add( new ItemReward( 1075304, typeof( MirrorOfPurification ) ) ); // Mirror of Purification
}
public override bool IsChainTriggered => true;
public override void Generate()
{
base.Generate();
public override void Generate()
{
base.Generate();
PutSpawner( new Spawner( 1, 5, 10, 0, 2, "SkeletonOfSzandor" ), new Point3D( 1277, 3731, 0 ), Map.Trammel );
PutSpawner( new Spawner( 1, 5, 10, 0, 2, "SkeletonOfSzandor" ), new Point3D( 1277, 3731, 0 ), Map.Felucca );
}
}
PutSpawner(new Spawner(1, 5, 10, 0, 2, "SkeletonOfSzandor"), new Point3D(1277, 3731, 0), Map.Trammel);
PutSpawner(new Spawner(1, 5, 10, 0, 2, "SkeletonOfSzandor"), new Point3D(1277, 3731, 0), Map.Felucca);
}
}
public class OddsAndEnds : MLQuest
{
public OddsAndEnds()
{
Activated = true;
Title = 1074354; // Odds and Ends
Description = 1074677; // I've always been fascinated by primitive cultures -- especially the artifacts. I'm a collector, you see. I'm working on building my troglodyte display and I'm saddened to say that I'm short on examples of religion and superstition amongst the creatures. If you come across any primitive fetishes, I'd be happy to trade you something interesting for them.
RefusalMessage = 1072270; // Well, okay. But if you decide you are up for it after all, c'mon back and see me.
InProgressMessage = 1074678; // I don't really want to know where you get the primitive fetishes, as I can't support the destruction of their lifestyle and culture. That would be wrong.
CompletionMessage = 1074679; // Bravo! These fetishes are just what I needed. You've earned this reward.
public class OddsAndEnds : MLQuest
{
public OddsAndEnds()
{
Activated = true;
Title = 1074354; // Odds and Ends
Description =
1074677; // I've always been fascinated by primitive cultures -- especially the artifacts. I'm a collector, you see. I'm working on building my troglodyte display and I'm saddened to say that I'm short on examples of religion and superstition amongst the creatures. If you come across any primitive fetishes, I'd be happy to trade you something interesting for them.
RefusalMessage = 1072270; // Well, okay. But if you decide you are up for it after all, c'mon back and see me.
InProgressMessage =
1074678; // I don't really want to know where you get the primitive fetishes, as I can't support the destruction of their lifestyle and culture. That would be wrong.
CompletionMessage = 1074679; // Bravo! These fetishes are just what I needed. You've earned this reward.
Objectives.Add( new CollectObjective( 12, typeof( PrimitiveFetish ), "Primitive Fetishes" ) );
Objectives.Add(new CollectObjective(12, typeof(PrimitiveFetish), "Primitive Fetishes"));
Rewards.Add( ItemReward.BagOfTreasure );
}
}
Rewards.Add(ItemReward.BagOfTreasure);
}
}
public class EmbracingHumanity : MLQuest
{
public EmbracingHumanity()
{
Activated = true;
OneTimeOnly = true; // OSI has no limit or delay, VERY exploitable
Title = 1074349; // Embracing Humanity
Description = 1074357; // Well, I don't mind saying it -- I'm flabbergasted! Absolutely astonished. I just heard that some elves want to convert themselves to humans through some magical process. My cousin Nedrick does whatever needs doing. I guess you could check it out for yourself if you're curious. Anyway, I wonder if you'll bring my cousin, Drithen, this here treat my wife baked up for him special.
RefusalMessage = 1074459; // That's okay, I'll find someone else to make the delivery.
InProgressMessage = 1074460; // If I knew where my cousin was, I'd make the delivery myself.
CompletionMessage = 1074461; // Oh, hello there. What do you have for me?
public class EmbracingHumanity : MLQuest
{
public EmbracingHumanity()
{
Activated = true;
OneTimeOnly = true; // OSI has no limit or delay, VERY exploitable
Title = 1074349; // Embracing Humanity
Description =
1074357; // Well, I don't mind saying it -- I'm flabbergasted! Absolutely astonished. I just heard that some elves want to convert themselves to humans through some magical process. My cousin Nedrick does whatever needs doing. I guess you could check it out for yourself if you're curious. Anyway, I wonder if you'll bring my cousin, Drithen, this here treat my wife baked up for him special.
RefusalMessage = 1074459; // That's okay, I'll find someone else to make the delivery.
InProgressMessage = 1074460; // If I knew where my cousin was, I'd make the delivery myself.
CompletionMessage = 1074461; // Oh, hello there. What do you have for me?
Objectives.Add( new DeliverObjective( typeof( SpecialTreatForDrithen ), 1, "treat for Drithen", typeof( Drithen ) ) );
Objectives.Add(new DeliverObjective(typeof(SpecialTreatForDrithen), 1, "treat for Drithen", typeof(Drithen)));
Rewards.Add( ItemReward.BagOfTreasure );
}
}
Rewards.Add(ItemReward.BagOfTreasure);
}
}
#endregion
#endregion
#region Mobiles
#region Mobiles
public class Aurelia : BaseCreature
{
public override bool IsInvulnerable => true;
public override string DefaultName => "Aurelia";
public class Aurelia : BaseCreature
{
[Constructible]
public Aurelia()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
{
Title = "the Architect's Daughter";
Race = Race.Human;
BodyValue = 0x191;
Female = true;
Hue = Race.RandomSkinHue();
InitStats(100, 100, 25);
[Constructible]
public Aurelia()
: base( AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2 )
{
Title = "the Architect's Daughter";
Race = Race.Human;
BodyValue = 0x191;
Female = true;
Hue = Race.RandomSkinHue();
InitStats( 100, 100, 25 );
Utility.AssignRandomHair(this, true);
Utility.AssignRandomHair( this, true );
AddItem(new Backpack());
AddItem(new Sandals(Utility.RandomPinkHue()));
AddItem( new Backpack() );
AddItem( new Sandals( Utility.RandomPinkHue() ) );
if (Utility.RandomBool())
AddItem(new Kilt(Utility.RandomPinkHue()));
else
AddItem(new Skirt(Utility.RandomPinkHue()));
if ( Utility.RandomBool() )
AddItem( new Kilt( Utility.RandomPinkHue() ) );
else
AddItem( new Skirt( Utility.RandomPinkHue() ) );
AddItem(new FancyShirt(Utility.RandomRedHue()));
}
AddItem( new FancyShirt( Utility.RandomRedHue() ) );
}
public Aurelia(Serial serial)
: base(serial)
{
}
public Aurelia( Serial serial )
: base( serial )
{
}
public override bool IsInvulnerable => true;
public override string DefaultName => "Aurelia";
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write( (int) 0 ); // version
}
writer.Write(0); // version
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
int version = reader.ReadInt();
}
}
[QuesterName( "Szandor" )]
public class SkeletonOfSzandor : BaseCreature
{
public override bool IsInvulnerable => true;
public override string DefaultName => "Skeleton of Szandor";
[QuesterName("Szandor")]
public class SkeletonOfSzandor : BaseCreature
{
[Constructible]
public SkeletonOfSzandor()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
{
Title = "the Late Architect";
Hue = 0x83F2; // TODO: Random human hue? Why???
Body = 0x32;
InitStats(100, 100, 25);
}
[Constructible]
public SkeletonOfSzandor()
: base( AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2 )
{
Title = "the Late Architect";
Hue = 0x83F2; // TODO: Random human hue? Why???
Body = 0x32;
InitStats( 100, 100, 25 );
}
public SkeletonOfSzandor(Serial serial)
: base(serial)
{
}
public SkeletonOfSzandor( Serial serial )
: base( serial )
{
}
public override bool IsInvulnerable => true;
public override string DefaultName => "Skeleton of Szandor";
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write( (int) 0 ); // version
}
writer.Write(0); // version
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
int version = reader.ReadInt();
}
}
#endregion
}
#endregion
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -6,156 +6,159 @@ using Server.Mobiles;
namespace Server.Engines.MLQuests.Definitions
{
#region Quests
#region Quests
public class HonestBeggar : MLQuest
{
public override Type NextQuest => typeof( ReginasThanks );
public class HonestBeggar : MLQuest
{
public HonestBeggar()
{
Activated = 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<6E>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;
public HonestBeggar()
{
Activated = 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<6E>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, "Regina's Ring", typeof(Regina)));
Objectives.Add( new DeliverObjective( typeof( ReginasRing ), 1, "Regina's Ring", typeof( Regina ) ) );
Rewards.Add(new DummyReward(1075394)); // Find the ring<6E>s owner.
}
Rewards.Add( new DummyReward( 1075394 ) ); // Find the ring<6E>s owner.
}
public override Type NextQuest => typeof(ReginasThanks);
public override void Generate()
{
base.Generate();
public override void Generate()
{
base.Generate();
PutSpawner( new Spawner( 1, 5, 10, 0, 4, "Evan" ), new Point3D( 1486, 1706, 0 ), Map.Trammel );
PutSpawner( new Spawner( 1, 5, 10, 0, 4, "Evan" ), new Point3D( 1486, 1706, 0 ), Map.Felucca );
}
}
PutSpawner(new Spawner(1, 5, 10, 0, 4, "Evan"), new Point3D(1486, 1706, 0), Map.Trammel);
PutSpawner(new Spawner(1, 5, 10, 0, 4, "Evan"), new Point3D(1486, 1706, 0), Map.Felucca);
}
}
public class ReginasThanks : MLQuest
{
public override bool IsChainTriggered => true;
public class ReginasThanks : MLQuest
{
public ReginasThanks()
{
Activated = true;
OneTimeOnly = true;
Title = 1075398; // Regina<6E>s Thanks
Description =
1075399; // What<61>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;
public ReginasThanks()
{
Activated = true;
OneTimeOnly = true;
Title = 1075398; // Regina<6E>s Thanks
Description = 1075399; // What<61>s that you say? It was a humble beggar that found my ring? Such honesty must be rewarded. Here, take this packet and return it to him, and I will be in your debt.
RefusalMessage = 1075401; // Hmph. Very well. What did you say his name was?
InProgressMessage = 1075402; // Take the packet and return it to the beggar who found my ring.
CompletionMessage = 1075403; // What? For me? Let me see . . . these sapphire earrings are for you, it says. Oh, she wants to offer me a job! This is the most wonderful thing that ever happened to me!
CompletionNotice = CompletionNoticeShort;
Objectives.Add(new DeliverObjective(typeof(ReginasLetter), 1, "Regina's Letter", typeof(Evan)));
Objectives.Add( new DeliverObjective( typeof( ReginasLetter ), 1, "Regina's Letter", typeof( Evan ) ) );
Rewards.Add(new ItemReward(1075400, typeof(TransparentHeart))); // Transparent Heart
}
Rewards.Add( new ItemReward( 1075400, typeof( TransparentHeart ) ) ); // Transparent Heart
}
public override bool IsChainTriggered => true;
public override void Generate()
{
base.Generate();
public override void Generate()
{
base.Generate();
PutSpawner( new Spawner( 1, 5, 10, 0, 0, "Regina" ), new Point3D( 1362, 1622, 50 ), Map.Trammel );
PutSpawner( new Spawner( 1, 5, 10, 0, 3, "Regina" ), new Point3D( 1422, 1621, 20 ), Map.Felucca );
}
}
PutSpawner(new Spawner(1, 5, 10, 0, 0, "Regina"), new Point3D(1362, 1622, 50), Map.Trammel);
PutSpawner(new Spawner(1, 5, 10, 0, 3, "Regina"), new Point3D(1422, 1621, 20), Map.Felucca);
}
}
#endregion
#endregion
#region Mobiles
#region Mobiles
public class Evan : BaseCreature
{
public override bool IsInvulnerable => true;
public override string DefaultName => "Evan";
public class Evan : BaseCreature
{
[Constructible]
public Evan()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
{
Title = "the Beggar";
Race = Race.Human;
BodyValue = 0x190;
Female = false;
Hue = Race.RandomSkinHue();
InitStats(100, 100, 25);
[Constructible]
public Evan()
: base( AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2 )
{
Title = "the Beggar";
Race = Race.Human;
BodyValue = 0x190;
Female = false;
Hue = Race.RandomSkinHue();
InitStats( 100, 100, 25 );
Utility.AssignRandomHair(this, true);
Utility.AssignRandomHair( this, true );
AddItem(new Backpack());
AddItem(new Doublet());
AddItem(new ShortPants(0x755));
}
AddItem( new Backpack() );
AddItem( new Doublet() );
AddItem( new ShortPants( 0x755 ) );
public Evan(Serial serial)
: base(serial)
{
}
}
public override bool IsInvulnerable => true;
public override string DefaultName => "Evan";
public Evan( Serial serial )
: base( serial )
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write(0); // version
}
writer.Write( (int) 0 ); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
int version = reader.ReadInt();
}
}
public class Regina : BaseCreature
{
[Constructible]
public Regina()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
{
Title = "the Noble";
Race = Race.Human;
BodyValue = 0x191;
Female = true;
Hue = Race.RandomSkinHue();
InitStats(100, 100, 25);
public class Regina : BaseCreature
{
public override bool IsInvulnerable => true;
public override string DefaultName => "Regina";
Utility.AssignRandomHair(this, true);
[Constructible]
public Regina()
: base( AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2 )
{
Title = "the Noble";
Race = Race.Human;
BodyValue = 0x191;
Female = true;
Hue = Race.RandomSkinHue();
InitStats( 100, 100, 25 );
AddItem(new Backpack());
AddItem(new GildedDress());
AddItem(new Boots());
}
Utility.AssignRandomHair( this, true );
public Regina(Serial serial)
: base(serial)
{
}
AddItem( new Backpack() );
AddItem( new GildedDress() );
AddItem( new Boots() );
public override bool IsInvulnerable => true;
public override string DefaultName => "Regina";
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
public Regina( Serial serial )
: base( serial )
{
}
writer.Write(0); // version
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
writer.Write( (int) 0 ); // version
}
int version = reader.ReadInt();
}
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
#endregion
}
#endregion
}

View file

@ -6,328 +6,342 @@ using Server.Mobiles;
namespace Server.Engines.MLQuests.Definitions
{
public class Responsibility : BaseEscort
{
public Responsibility()
{
Activated = true;
Title = 1074352; // Responsibility
Description = 1074524; // Oh! I just don't know what to do. My mother is away and my father told me not to talk to strangers ... *worried frown* But my grandfather has sent word that he has been hurt and needs me to tend his wounds. He has a small farm southeast of here. Would you ... could you ... escort me there safely?
RefusalMessage = 1074525; // I hope my grandfather will be alright.
InProgressMessage = 1074526; // Grandfather's farm is a ways west of the Shrine of Spirituality. So, we're not quite there yet. Thank you again for keeping me safe.
public class Responsibility : BaseEscort
{
public Responsibility()
{
Activated = true;
Title = 1074352; // Responsibility
Description =
1074524; // Oh! I just don't know what to do. My mother is away and my father told me not to talk to strangers ... *worried frown* But my grandfather has sent word that he has been hurt and needs me to tend his wounds. He has a small farm southeast of here. Would you ... could you ... escort me there safely?
RefusalMessage = 1074525; // I hope my grandfather will be alright.
InProgressMessage =
1074526; // Grandfather's farm is a ways west of the Shrine of Spirituality. So, we're not quite there yet. Thank you again for keeping me safe.
Objectives.Add( new EscortObjective( new QuestArea( 1074781, "Sheep Farm" ) ) ); // Sheep Farm
Objectives.Add(new EscortObjective(new QuestArea(1074781, "Sheep Farm"))); // Sheep Farm
Rewards.Add( ItemReward.BagOfTrinkets );
}
Rewards.Add(ItemReward.BagOfTrinkets);
}
// OSI sends this instead, but it doesn't make sense for an escortable
//public override void OnComplete( MLQuestInstance instance )
//{
// instance.Player.SendLocalizedMessage( 1073775, "", 0x23 ); // Your quest is complete. Return for your reward.
//}
// OSI sends this instead, but it doesn't make sense for an escortable
//public override void OnComplete( MLQuestInstance instance )
//{
// instance.Player.SendLocalizedMessage( 1073775, "", 0x23 ); // Your quest is complete. Return for your reward.
//}
public override void Generate()
{
base.Generate();
public override void Generate()
{
base.Generate();
PutSpawner( new Spawner( 1, TimeSpan.FromSeconds( 10 ), TimeSpan.FromSeconds( 30 ), 0, 5, "Lissbet" ), new Point3D( 1568, 1040, -7 ), Map.Ilshenar );
PutSpawner( new Spawner( 1, 5, 10, 0, 8, "GrandpaCharley" ), new Point3D( 1322, 1331, -14 ), Map.Ilshenar );
PutSpawner( new Spawner( 1, TimeSpan.FromSeconds( 10 ), TimeSpan.FromSeconds( 30 ), 0, 3, "Sheep" ), new Point3D( 1308, 1324, -14 ), Map.Ilshenar );
}
}
PutSpawner(new Spawner(1, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(30), 0, 5, "Lissbet"),
new Point3D(1568, 1040, -7), Map.Ilshenar);
PutSpawner(new Spawner(1, 5, 10, 0, 8, "GrandpaCharley"), new Point3D(1322, 1331, -14), Map.Ilshenar);
PutSpawner(new Spawner(1, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(30), 0, 3, "Sheep"),
new Point3D(1308, 1324, -14), Map.Ilshenar);
}
}
public class SomethingToWailAbout : MLQuest
{
public SomethingToWailAbout()
{
Activated = true;
Title = 1073071; // Something to Wail About
Description = 1073561; // Can you hear them? The never-ending howling? The incessant wailing? These banshees, they never cease! Never! They haunt my nights. Please, I beg you -- will you silence them? I would be ever so grateful.
RefusalMessage = 1073580; // I hope you'll reconsider. Until then, farwell.
InProgressMessage = 1073581; // Until you kill 12 Wailing Banshees, there will be no peace.
public class SomethingToWailAbout : MLQuest
{
public SomethingToWailAbout()
{
Activated = true;
Title = 1073071; // Something to Wail About
Description =
1073561; // Can you hear them? The never-ending howling? The incessant wailing? These banshees, they never cease! Never! They haunt my nights. Please, I beg you -- will you silence them? I would be ever so grateful.
RefusalMessage = 1073580; // I hope you'll reconsider. Until then, farwell.
InProgressMessage = 1073581; // Until you kill 12 Wailing Banshees, there will be no peace.
Objectives.Add( new KillObjective( 12, new[] { typeof( WailingBanshee ) }, "wailing banshees" ) );
Objectives.Add(new KillObjective(12, new[] { typeof(WailingBanshee) }, "wailing banshees"));
Rewards.Add( ItemReward.BagOfTreasure );
}
Rewards.Add(ItemReward.BagOfTreasure);
}
public override void Generate()
{
base.Generate();
public override void Generate()
{
base.Generate();
PutSpawner( new Spawner( 1, 5, 10, 0, 4, "Jelrice" ), new Point3D( 1176, 1196, -25 ), Map.Ilshenar );
}
}
PutSpawner(new Spawner(1, 5, 10, 0, 4, "Jelrice"), new Point3D(1176, 1196, -25), Map.Ilshenar);
}
}
public class Runaways : MLQuest
{
public Runaways()
{
Activated = true;
Title = 1072993; // Runaways!
Description = 1073026; // You've got to help me out! Those wild ostards have been causing absolute havok around here. Kill them off before they destroy my land. There are around twelve of them.
RefusalMessage = 1072270; // Well, okay. But if you decide you are up for it after all, c'mon back and see me.
InProgressMessage = 1072271; // You're not quite done yet. Get back to work!
public class Runaways : MLQuest
{
public Runaways()
{
Activated = true;
Title = 1072993; // Runaways!
Description =
1073026; // You've got to help me out! Those wild ostards have been causing absolute havok around here. Kill them off before they destroy my land. There are around twelve of them.
RefusalMessage = 1072270; // Well, okay. But if you decide you are up for it after all, c'mon back and see me.
InProgressMessage = 1072271; // You're not quite done yet. Get back to work!
Objectives.Add( new KillObjective( 12, new[] { typeof( FrenziedOstard ) }, "frenzied ostards" ) );
Objectives.Add(new KillObjective(12, new[] { typeof(FrenziedOstard) }, "frenzied ostards"));
Rewards.Add( ItemReward.BagOfTrinkets );
}
}
Rewards.Add(ItemReward.BagOfTrinkets);
}
}
public class ViciousPredator : MLQuest
{
public ViciousPredator()
{
Activated = true;
Title = 1072994; // Vicious Predator
Description = 1073028; // You've got to help me out! Those dire wolves have been causing absolute havok around here. Kill them off before they destroy my land. They run around in a pack of around ten.
RefusalMessage = 1072270; // Well, okay. But if you decide you are up for it after all, c'mon back and see me.
InProgressMessage = 1072271; // You're not quite done yet. Get back to work!
public class ViciousPredator : MLQuest
{
public ViciousPredator()
{
Activated = true;
Title = 1072994; // Vicious Predator
Description =
1073028; // You've got to help me out! Those dire wolves have been causing absolute havok around here. Kill them off before they destroy my land. They run around in a pack of around ten.
RefusalMessage = 1072270; // Well, okay. But if you decide you are up for it after all, c'mon back and see me.
InProgressMessage = 1072271; // You're not quite done yet. Get back to work!
Objectives.Add( new KillObjective( 10, new[] { typeof( DireWolf ) }, "dire wolves" ) );
Objectives.Add(new KillObjective(10, new[] { typeof(DireWolf) }, "dire wolves"));
Rewards.Add( ItemReward.BagOfTrinkets );
}
}
Rewards.Add(ItemReward.BagOfTrinkets);
}
}
public class GuileIrkAndSpite : MLQuest
{
public GuileIrkAndSpite()
{
Activated = true;
Title = 1074739; // Guile, Irk and Spite
Description = 1074740; // You know them, don't you. The three? They look like you, you'll see. They looked like me, I remember, they looked like, well, you'll see. The three. They'll drive you mad too, if you let them. They are trouble, and they need to be slain. Seek them out.
RefusalMessage = 1074745; // You just don't understand the gravity of the situation. If you did, you'd agree to my task.
InProgressMessage = 1074746; // Perhaps I was unclear. You'll know them when you see them, because you'll see you, and you, and you. Hurry now.
CompletionMessage = 1074747; // Are you one of THEM? Ahhhh! Oh, wait, if you were them, then you'd be me. So you're -- you. Good job!
public class GuileIrkAndSpite : MLQuest
{
public GuileIrkAndSpite()
{
Activated = true;
Title = 1074739; // Guile, Irk and Spite
Description =
1074740; // You know them, don't you. The three? They look like you, you'll see. They looked like me, I remember, they looked like, well, you'll see. The three. They'll drive you mad too, if you let them. They are trouble, and they need to be slain. Seek them out.
RefusalMessage =
1074745; // You just don't understand the gravity of the situation. If you did, you'd agree to my task.
InProgressMessage =
1074746; // Perhaps I was unclear. You'll know them when you see them, because you'll see you, and you, and you. Hurry now.
CompletionMessage =
1074747; // Are you one of THEM? Ahhhh! Oh, wait, if you were them, then you'd be me. So you're -- you. Good job!
Objectives.Add( new KillObjective( 1, new[] { typeof( Guile ) }, "Guile" ) );
Objectives.Add( new KillObjective( 1, new[] { typeof( Irk ) }, "Irk" ) );
Objectives.Add( new KillObjective( 1, new[] { typeof( Spite ) }, "Spite" ) );
Objectives.Add(new KillObjective(1, new[] { typeof(Guile) }, "Guile"));
Objectives.Add(new KillObjective(1, new[] { typeof(Irk) }, "Irk"));
Objectives.Add(new KillObjective(1, new[] { typeof(Spite) }, "Spite"));
Rewards.Add( ItemReward.Strongbox );
}
Rewards.Add(ItemReward.Strongbox);
}
public override void Generate()
{
base.Generate();
public override void Generate()
{
base.Generate();
PutSpawner( new Spawner( 1, 5, 10, 0, 5, "Yorus" ), new Point3D( 1389, 423, -24 ), Map.Ilshenar );
}
}
PutSpawner(new Spawner(1, 5, 10, 0, 5, "Yorus"), new Point3D(1389, 423, -24), Map.Ilshenar);
}
}
public class Lissbet : BaseEscortable
{
public override bool StaticMLQuester => true;
public override bool InitialInnocent => true;
public override string DefaultName => "Lissbet";
public class Lissbet : BaseEscortable
{
[Constructible]
public Lissbet()
{
}
public override bool CanShout => true;
public override void Shout( PlayerMobile pm )
{
MLQuestSystem.Tell( this, pm, Utility.RandomList(
1074204, // Greetings seeker.  I have an urgent matter for you, if you are willing.
1074222 // Could I trouble you for some assistance?
) );
}
public Lissbet(Serial serial)
: base(serial)
{
}
[Constructible]
public Lissbet()
{
}
public override bool StaticMLQuester => true;
public override bool InitialInnocent => true;
public override string DefaultName => "Lissbet";
public override void InitBody()
{
SetStr( 40, 50 );
SetDex( 70, 80 );
SetInt( 80, 90 );
public override bool CanShout => true;
Hue = Utility.RandomSkinHue();
Female = true;
Body = 401;
public override void Shout(PlayerMobile pm)
{
MLQuestSystem.Tell(this, pm, Utility.RandomList(
1074204, // Greetings seeker.  I have an urgent matter for you, if you are willing.
1074222 // Could I trouble you for some assistance?
));
}
Title = "the flower girl";
public override void InitBody()
{
SetStr(40, 50);
SetDex(70, 80);
SetInt(80, 90);
HairItemID = 0x203D;
HairHue = 0x1BB;
}
Hue = Utility.RandomSkinHue();
Female = true;
Body = 401;
public override void InitOutfit()
{
AddItem( new Kilt( Utility.RandomYellowHue() ) );
AddItem( new FancyShirt( Utility.RandomYellowHue() ) );
AddItem( new Sandals() );
}
Title = "the flower girl";
public Lissbet( Serial serial )
: base( serial )
{
}
HairItemID = 0x203D;
HairHue = 0x1BB;
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
public override void InitOutfit()
{
AddItem(new Kilt(Utility.RandomYellowHue()));
AddItem(new FancyShirt(Utility.RandomYellowHue()));
AddItem(new Sandals());
}
writer.Write( (int)0 ); // version
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
writer.Write(0); // version
}
int version = reader.ReadInt();
}
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
public class GrandpaCharley : BaseCreature
{
public override bool IsInvulnerable => true;
public override string DefaultName => "Grandpa Charley";
public override bool CanTeach => true;
int version = reader.ReadInt();
}
}
[Constructible]
public GrandpaCharley()
: base( AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2 )
{
Title = "the farmer";
Body = 400;
Hue = Race.RandomSkinHue();
InitStats( 100, 100, 25 );
public class GrandpaCharley : BaseCreature
{
[Constructible]
public GrandpaCharley()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
{
Title = "the farmer";
Body = 400;
Hue = Race.RandomSkinHue();
InitStats(100, 100, 25);
int hairHue = 0x3B2 + Utility.Random( 2 );
Utility.AssignRandomHair( this, hairHue );
int hairHue = 0x3B2 + Utility.Random(2);
Utility.AssignRandomHair(this, hairHue);
FacialHairItemID = 0x203E; // Long Beard
FacialHairHue = hairHue;
FacialHairItemID = 0x203E; // Long Beard
FacialHairHue = hairHue;
SetSkill( SkillName.ItemID, 80, 90 );
SetSkill(SkillName.ItemID, 80, 90);
AddItem( new WideBrimHat( Utility.RandomNondyedHue() ) );
AddItem( new FancyShirt( Utility.RandomNondyedHue() ) );
AddItem( new LongPants( Utility.RandomNondyedHue() ) );
AddItem( new Sandals( Utility.RandomNeutralHue() ) );
AddItem( new ShepherdsCrook() );
AddItem( new Backpack() );
}
AddItem(new WideBrimHat(Utility.RandomNondyedHue()));
AddItem(new FancyShirt(Utility.RandomNondyedHue()));
AddItem(new LongPants(Utility.RandomNondyedHue()));
AddItem(new Sandals(Utility.RandomNeutralHue()));
AddItem(new ShepherdsCrook());
AddItem(new Backpack());
}
public GrandpaCharley( Serial serial )
: base( serial )
{
}
public GrandpaCharley(Serial serial)
: base(serial)
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
public override bool IsInvulnerable => true;
public override string DefaultName => "Grandpa Charley";
public override bool CanTeach => true;
writer.Write( (int)0 ); // version
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
writer.Write(0); // version
}
int version = reader.ReadInt();
}
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
[QuesterName( "Jelrice (Ilshenar)" )]
public class Jelrice : BaseCreature
{
public override bool IsInvulnerable => true;
public override string DefaultName => "Jelrice";
public override bool CanShout => true;
public override void Shout( PlayerMobile pm )
{
MLQuestSystem.Tell( this, pm, 1074221 ); // Greetings!  I have a small task for you good traveler.
}
int version = reader.ReadInt();
}
}
[Constructible]
public Jelrice()
: base( AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2 )
{
Title = "the trader";
Race = Race.Human;
BodyValue = 0x191;
Female = true;
Hue = Race.RandomSkinHue();
InitStats( 100, 100, 25 );
[QuesterName("Jelrice (Ilshenar)")]
public class Jelrice : BaseCreature
{
[Constructible]
public Jelrice()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
{
Title = "the trader";
Race = Race.Human;
BodyValue = 0x191;
Female = true;
Hue = Race.RandomSkinHue();
InitStats(100, 100, 25);
Utility.AssignRandomHair( this, true );
Utility.AssignRandomHair(this, true);
AddItem( new Shoes( Utility.RandomNeutralHue() ) );
AddItem( new Skirt( Utility.RandomBlueHue() ) );
AddItem( new FancyShirt( Utility.RandomRedHue() ) );
}
AddItem(new Shoes(Utility.RandomNeutralHue()));
AddItem(new Skirt(Utility.RandomBlueHue()));
AddItem(new FancyShirt(Utility.RandomRedHue()));
}
public Jelrice( Serial serial )
: base( serial )
{
}
public Jelrice(Serial serial)
: base(serial)
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
public override bool IsInvulnerable => true;
public override string DefaultName => "Jelrice";
public override bool CanShout => true;
writer.Write( (int) 0 ); // version
}
public override void Shout(PlayerMobile pm)
{
MLQuestSystem.Tell(this, pm, 1074221); // Greetings!  I have a small task for you good traveler.
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
int version = reader.ReadInt();
}
}
writer.Write(0); // version
}
[QuesterName( "Yorus (Ilshenar)" )]
public class Yorus : BaseCreature
{
public override bool IsInvulnerable => true;
public override string DefaultName => "Yorus";
public override bool CanShout => true;
public override void Shout( PlayerMobile pm )
{
MLQuestSystem.Tell( this, pm, 1074218 ); // Hey!  I want to talk to you, now.
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
[Constructible]
public Yorus()
: base( AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2 )
{
Title = "the tinker";
Race = Race.Human;
BodyValue = 0x190;
Female = false;
Hue = Race.RandomSkinHue();
InitStats( 100, 100, 25 );
int version = reader.ReadInt();
}
}
Utility.AssignRandomHair( this, true );
[QuesterName("Yorus (Ilshenar)")]
public class Yorus : BaseCreature
{
[Constructible]
public Yorus()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
{
Title = "the tinker";
Race = Race.Human;
BodyValue = 0x190;
Female = false;
Hue = Race.RandomSkinHue();
InitStats(100, 100, 25);
AddItem( new Shoes( Utility.RandomNeutralHue() ) );
AddItem( new LongPants( Utility.RandomBlueHue() ) );
AddItem( new FancyShirt( Utility.RandomOrangeHue() ) );
AddItem( new Cloak( Utility.RandomBrightHue() ) );
}
Utility.AssignRandomHair(this, true);
public Yorus( Serial serial )
: base( serial )
{
}
AddItem(new Shoes(Utility.RandomNeutralHue()));
AddItem(new LongPants(Utility.RandomBlueHue()));
AddItem(new FancyShirt(Utility.RandomOrangeHue()));
AddItem(new Cloak(Utility.RandomBrightHue()));
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
public Yorus(Serial serial)
: base(serial)
{
}
writer.Write( (int) 0 ); // version
}
public override bool IsInvulnerable => true;
public override string DefaultName => "Yorus";
public override bool CanShout => true;
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
public override void Shout(PlayerMobile pm)
{
MLQuestSystem.Tell(this, pm, 1074218); // Hey!  I want to talk to you, now.
}
int version = reader.ReadInt();
}
}
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -5,64 +5,67 @@ using Server.Engines.MLQuests.Rewards;
namespace Server.Engines.MLQuests.Definitions
{
// TODO: Assassination Contract, Evidence, Lost in Transit, Last Words
// TODO: Assassination Contract, Evidence, Lost in Transit, Last Words
#region Quests
#region Quests
public class LostAndFound : MLQuest
{
public LostAndFound()
{
Activated = true;
Title = 1072370; // Lost and Found
Description = 1072589; // The battered, old bucket is inscribed with barely legible writing that indicates it belongs to someone named "Dallid". Maybe they'd pay for its return?
RefusalMessage = 1072590; // You're right, who cares if Dallid might pay for his battered old bucket back. This way you can carry it around with you!
InProgressMessage = 1072591; // Whoever this "Dallid" might be, he's probably looking for his bucket.
CompletionMessage = 1074580; // Is that my bucket? I had to ditch my favorite bucket when a group of ratmen jumped me!
public class LostAndFound : MLQuest
{
public LostAndFound()
{
Activated = true;
Title = 1072370; // Lost and Found
Description =
1072589; // The battered, old bucket is inscribed with barely legible writing that indicates it belongs to someone named "Dallid". Maybe they'd pay for its return?
RefusalMessage =
1072590; // You're right, who cares if Dallid might pay for his battered old bucket back. This way you can carry it around with you!
InProgressMessage = 1072591; // Whoever this "Dallid" might be, he's probably looking for his bucket.
CompletionMessage =
1074580; // Is that my bucket? I had to ditch my favorite bucket when a group of ratmen jumped me!
Objectives.Add( new TimedDeliverObjective( TimeSpan.FromSeconds( 600 ), typeof( BatteredBucket ), 1, "battered bucket", typeof( Dallid ), false ) );
Objectives.Add(new TimedDeliverObjective(TimeSpan.FromSeconds(600), typeof(BatteredBucket), 1, "battered bucket",
typeof(Dallid), false));
Rewards.Add( ItemReward.BagOfTrinkets );
}
}
Rewards.Add(ItemReward.BagOfTrinkets);
}
}
#endregion
#endregion
#region Items
#region Items
public class BatteredBucket : TransientQuestGiverItem
{
// Original label, doesn't fit the expiration message well
//public override int LabelNumber => 1073129; // A battered bucket.
public class BatteredBucket : TransientQuestGiverItem
{
[Constructible]
public BatteredBucket()
: base(0x2004, TimeSpan.FromMinutes(10))
{
LootType = LootType.Blessed;
}
public override string DefaultName => "battered bucket";
public BatteredBucket(Serial serial)
: base(serial)
{
}
// Original label, doesn't fit the expiration message well
//public override int LabelNumber => 1073129; // A battered bucket.
[Constructible]
public BatteredBucket()
: base( 0x2004, TimeSpan.FromMinutes( 10 ) )
{
LootType = LootType.Blessed;
}
public override string DefaultName => "battered bucket";
public BatteredBucket( Serial serial )
: base( serial )
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write(0); // version
}
writer.Write( (int)0 ); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
int version = reader.ReadInt();
}
}
#endregion
}
#endregion
}

View file

@ -5,87 +5,89 @@ using Server.Mobiles;
namespace Server.Engines.MLQuests.Definitions
{
#region Quests
#region Quests
public class PointyEars : MLQuest
{
public PointyEars()
{
Activated = true;
Title = 1074640; // Pointy Ears
Description = 1074641; // I've heard ... there's some that will pay a good bounty for pointed ears, much like we used to pay for each wolf skin. I've got nothing personal against these elves. It's just business. You want in on this? I'm not fussy who I work with.
RefusalMessage = 1074642; // Suit yourself.
InProgressMessage = 1074643; // I can't pay a bounty if you don't bring bag the ears.
CompletionMessage = 1074644; // Here to collect on a bounty?
public class PointyEars : MLQuest
{
public PointyEars()
{
Activated = true;
Title = 1074640; // Pointy Ears
Description =
1074641; // I've heard ... there's some that will pay a good bounty for pointed ears, much like we used to pay for each wolf skin. I've got nothing personal against these elves. It's just business. You want in on this? I'm not fussy who I work with.
RefusalMessage = 1074642; // Suit yourself.
InProgressMessage = 1074643; // I can't pay a bounty if you don't bring bag the ears.
CompletionMessage = 1074644; // Here to collect on a bounty?
Objectives.Add( new CollectObjective( 20, typeof( SeveredElfEars ), 1032590 ) ); // severed elf ears
Objectives.Add(new CollectObjective(20, typeof(SeveredElfEars), 1032590)); // severed elf ears
Rewards.Add( ItemReward.BagOfTrinkets );
}
Rewards.Add(ItemReward.BagOfTrinkets);
}
public override void Generate()
{
base.Generate();
public override void Generate()
{
base.Generate();
PutSpawner( new Spawner( 1, 5, 10, 0, 4, "Drithen" ), new Point3D( 1983, 1364, -80 ), Map.Malas );
}
}
PutSpawner(new Spawner(1, 5, 10, 0, 4, "Drithen"), new Point3D(1983, 1364, -80), Map.Malas);
}
}
#endregion
#endregion
#region Mobiles
#region Mobiles
[QuesterName( "Drithen (Umbra)" )]
public class Drithen : BaseCreature
{
public override bool IsInvulnerable => true;
public override bool CanTeach => true;
public override string DefaultName => "Drithen";
public override bool CanShout => true;
public override void Shout( PlayerMobile pm )
{
MLQuestSystem.Tell( this, pm, 1074188 ); // Weakling! You are not up to the task I have.
}
[QuesterName("Drithen (Umbra)")]
public class Drithen : BaseCreature
{
[Constructible]
public Drithen()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
{
Title = "the Fierce";
Race = Race.Human;
BodyValue = 0x190;
Female = false;
Hue = Race.RandomSkinHue();
InitStats(100, 100, 25);
[Constructible]
public Drithen()
: base( AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2 )
{
Title = "the Fierce";
Race = Race.Human;
BodyValue = 0x190;
Female = false;
Hue = Race.RandomSkinHue();
InitStats( 100, 100, 25 );
AddItem(new Backpack());
AddItem(new ElvenBoots(Utility.RandomNeutralHue()));
AddItem(new LongPants(Utility.RandomBlueHue()));
AddItem(new Tunic(Utility.RandomNeutralHue()));
AddItem(new Cloak(Utility.RandomBrightHue()));
AddItem( new Backpack() );
AddItem( new ElvenBoots( Utility.RandomNeutralHue() ) );
AddItem( new LongPants( Utility.RandomBlueHue() ) );
AddItem( new Tunic( Utility.RandomNeutralHue() ) );
AddItem( new Cloak( Utility.RandomBrightHue() ) );
SetSkill(SkillName.Focus, 60.0, 80.0);
}
SetSkill( SkillName.Focus, 60.0, 80.0 );
}
public Drithen(Serial serial)
: base(serial)
{
}
public Drithen( Serial serial )
: base( serial )
{
}
public override bool IsInvulnerable => true;
public override bool CanTeach => true;
public override string DefaultName => "Drithen";
public override bool CanShout => true;
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
public override void Shout(PlayerMobile pm)
{
MLQuestSystem.Tell(this, pm, 1074188); // Weakling! You are not up to the task I have.
}
writer.Write( (int) 0 ); // version
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
writer.Write(0); // version
}
int version = reader.ReadInt();
}
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
#endregion
}
int version = reader.ReadInt();
}
}
#endregion
}

View file

@ -7,330 +7,350 @@ using Server.Mobiles;
namespace Server.Engines.MLQuests.Definitions
{
#region Quests
#region Quests
public class MistakenIdentity : MLQuest
{
public override Type NextQuest => typeof( YouScratchMyBack );
public class MistakenIdentity : MLQuest
{
public MistakenIdentity()
{
Activated = true;
Title = 1074573; // Mistaken Identity
Description =
1074574; // What do you want? Wonderful, another whining request for a refund on tuition. You know, experiences like that are invaluable ... and infrequent. Having the opportunity to test yourself under such realistic situations isn't something the college offers all students. Fine. Fine. You'll need to submit a refund request form in triplicate before I can return your 1,000,000 gold tuition. You'll need to get some signatures and a few other odds and ends.
RefusalMessage = 1074606; // If you're not willing to follow the proper process then go away.
InProgressMessage = 1074605; // You're not getting a refund without the proper forms and signatures.
CompletionMessage = 1074607; // Oh blast! Not another of those forms. I'm so sick of this endless paperwork.
CompletionNotice = CompletionNoticeShort;
public MistakenIdentity()
{
Activated = true;
Title = 1074573; // Mistaken Identity
Description = 1074574; // What do you want? Wonderful, another whining request for a refund on tuition. You know, experiences like that are invaluable ... and infrequent. Having the opportunity to test yourself under such realistic situations isn't something the college offers all students. Fine. Fine. You'll need to submit a refund request form in triplicate before I can return your 1,000,000 gold tuition. You'll need to get some signatures and a few other odds and ends.
RefusalMessage = 1074606; // If you're not willing to follow the proper process then go away.
InProgressMessage = 1074605; // You're not getting a refund without the proper forms and signatures.
CompletionMessage = 1074607; // Oh blast! Not another of those forms. I'm so sick of this endless paperwork.
CompletionNotice = CompletionNoticeShort;
Objectives.Add(new DeliverObjective(typeof(TuitionReimbursementForm), 1, "Tuition Reimbursement Form",
typeof(Gorrow)));
Objectives.Add( new DeliverObjective( typeof( TuitionReimbursementForm ), 1, "Tuition Reimbursement Form", typeof( Gorrow ) ) );
Rewards.Add(new DummyReward(1074634)); // Tuition Reimbursement
}
Rewards.Add( new DummyReward( 1074634 ) ); // Tuition Reimbursement
}
public override Type NextQuest => typeof(YouScratchMyBack);
public override void Generate()
{
base.Generate();
public override void Generate()
{
base.Generate();
PutSpawner( new Spawner( 1, 5, 10, 0, 4, "Aernya" ), new Point3D( 2095, 1380, -90 ), Map.Malas );
}
}
PutSpawner(new Spawner(1, 5, 10, 0, 4, "Aernya"), new Point3D(2095, 1380, -90), Map.Malas);
}
}
public class YouScratchMyBack : MLQuest
{
public override Type NextQuest => typeof( FoolingAernya );
public override bool IsChainTriggered => true;
public class YouScratchMyBack : MLQuest
{
public YouScratchMyBack()
{
Activated = true;
Title = 1074608; // You Scratch My Back
Description =
1074609; // Heh. Heheheh. Good one. You're not a Bedlam student and you're definitely not eligible for a tuition refund. Heheheh. That old witch Aernya doesn't see as well as she used to you know. Otherwise, she would have ... hmmm, wait a minute. I sense a certain 'opportunity' here. I'll sign your forms in return for a little help with a project of my own. What do you say?
RefusalMessage = 1074615; // Hehehe. Your choice.
InProgressMessage =
1074616; // I'm something of a gourmet, you see. It's tough getting some of the ingredients, though. Bring me back some pixie legs, unicorn ribs and ki-rin brains and I'll sign your form.
CompletionMessage =
1074617; // Oh excellent, you're back. I'll get the oven going. That thing about pixie legs, you see, is that they burn and dry out if you're not really careful. Taste just like chicken too!
CompletionNotice = CompletionNoticeShortReturn;
public YouScratchMyBack()
{
Activated = true;
Title = 1074608; // You Scratch My Back
Description = 1074609; // Heh. Heheheh. Good one. You're not a Bedlam student and you're definitely not eligible for a tuition refund. Heheheh. That old witch Aernya doesn't see as well as she used to you know. Otherwise, she would have ... hmmm, wait a minute. I sense a certain 'opportunity' here. I'll sign your forms in return for a little help with a project of my own. What do you say?
RefusalMessage = 1074615; // Hehehe. Your choice.
InProgressMessage = 1074616; // I'm something of a gourmet, you see. It's tough getting some of the ingredients, though. Bring me back some pixie legs, unicorn ribs and ki-rin brains and I'll sign your form.
CompletionMessage = 1074617; // Oh excellent, you're back. I'll get the oven going. That thing about pixie legs, you see, is that they burn and dry out if you're not really careful. Taste just like chicken too!
CompletionNotice = CompletionNoticeShortReturn;
Objectives.Add(new CollectObjective(1, typeof(UnicornRibs), "Unicorn Ribs"));
Objectives.Add(new CollectObjective(2, typeof(KirinBrains), "Ki-Rin Brains"));
Objectives.Add(new CollectObjective(5, typeof(PixieLeg), "Pixie Leg"));
Objectives.Add( new CollectObjective( 1, typeof( UnicornRibs ), "Unicorn Ribs" ) );
Objectives.Add( new CollectObjective( 2, typeof( KirinBrains ), "Ki-Rin Brains" ) );
Objectives.Add( new CollectObjective( 5, typeof( PixieLeg ), "Pixie Leg" ) );
Rewards.Add(new DummyReward(1074634)); // Tuition Reimbursement
}
Rewards.Add( new DummyReward( 1074634 ) ); // Tuition Reimbursement
}
public override Type NextQuest => typeof(FoolingAernya);
public override bool IsChainTriggered => true;
public override void Generate()
{
base.Generate();
public override void Generate()
{
base.Generate();
PutSpawner( new Spawner( 1, 5, 10, 0, 4, "Gorrow" ), new Point3D( 993, 512, -50 ), Map.Malas );
}
}
PutSpawner(new Spawner(1, 5, 10, 0, 4, "Gorrow"), new Point3D(993, 512, -50), Map.Malas);
}
}
public class FoolingAernya : MLQuest
{
public override Type NextQuest => typeof( NotQuiteThatEasy );
public override bool IsChainTriggered => true;
public class FoolingAernya : MLQuest
{
public FoolingAernya()
{
Activated = true;
Title = 1074618; // Fooling Aernya
Description =
1074619; // Now that I've signed your papers you'd better get back to that witch Aernya. Mmmm mmm smell those ribs!
RefusalMessage = 1074620; // Giving up on your scheme eh? Suit yourself.
InProgressMessage =
1074621; // You better hurry back to Mistress Aernya with that signed form. The college only has so much money and with enough claims you may find yourself unable to get your tuition refunded. *wink*
CompletionMessage = 1074622; // What? Hrmph. Gorrow signed your form did he? Let me see that. *squint*
CompletionNotice = CompletionNoticeShort;
public FoolingAernya()
{
Activated = true;
Title = 1074618; // Fooling Aernya
Description = 1074619; // Now that I've signed your papers you'd better get back to that witch Aernya. Mmmm mmm smell those ribs!
RefusalMessage = 1074620; // Giving up on your scheme eh? Suit yourself.
InProgressMessage = 1074621; // You better hurry back to Mistress Aernya with that signed form. The college only has so much money and with enough claims you may find yourself unable to get your tuition refunded. *wink*
CompletionMessage = 1074622; // What? Hrmph. Gorrow signed your form did he? Let me see that. *squint*
CompletionNotice = CompletionNoticeShort;
Objectives.Add(new DeliverObjective(typeof(SignedTuitionReimbursementForm), 1,
"Signed Tuition Reimbursement Form", typeof(Aernya)));
Objectives.Add( new DeliverObjective( typeof( SignedTuitionReimbursementForm ), 1, "Signed Tuition Reimbursement Form", typeof( Aernya ) ) );
Rewards.Add(new DummyReward(1074634)); // Tuition Reimbursement
}
Rewards.Add( new DummyReward( 1074634 ) ); // Tuition Reimbursement
}
}
public override Type NextQuest => typeof(NotQuiteThatEasy);
public override bool IsChainTriggered => true;
}
public class NotQuiteThatEasy : MLQuest
{
public override Type NextQuest => typeof( ConvinceMe );
public override bool IsChainTriggered => true;
public class NotQuiteThatEasy : MLQuest
{
public NotQuiteThatEasy()
{
Activated = true;
Title = 1074623; // Not Quite That Easy
Description =
1074624; // I wouldn't be too smug just yet, whiner. You still need Master Gnosos' signature before I can cut your refund. Last I heard, he's coordinating the recovery of the portions of the college that are currently overrun. *nasty smile* Off with you.
RefusalMessage = 1074626; // Coward.
InProgressMessage = 1074627; // What are you waiting for? The iron maiden is still the portal to Bedlam.
CompletionMessage =
1074628; // Made it through did you? Did you happen to see Red Death out there? Big horse, skeletal ... burning eyes? No? What's this? Forms? FORMS? I'm up to my eyebrows in ravenous out-of-control undead and you want a signature?
CompletionNotice = CompletionNoticeShort;
public NotQuiteThatEasy()
{
Activated = true;
Title = 1074623; // Not Quite That Easy
Description = 1074624; // I wouldn't be too smug just yet, whiner. You still need Master Gnosos' signature before I can cut your refund. Last I heard, he's coordinating the recovery of the portions of the college that are currently overrun. *nasty smile* Off with you.
RefusalMessage = 1074626; // Coward.
InProgressMessage = 1074627; // What are you waiting for? The iron maiden is still the portal to Bedlam.
CompletionMessage = 1074628; // Made it through did you? Did you happen to see Red Death out there? Big horse, skeletal ... burning eyes? No? What's this? Forms? FORMS? I'm up to my eyebrows in ravenous out-of-control undead and you want a signature?
CompletionNotice = CompletionNoticeShort;
Objectives.Add(new DeliverObjective(typeof(SignedTuitionReimbursementForm), 1,
"Signed Tuition Reimbursement Form", typeof(MasterGnosos)));
Objectives.Add( new DeliverObjective( typeof( SignedTuitionReimbursementForm ), 1, "Signed Tuition Reimbursement Form", typeof( MasterGnosos ) ) );
Rewards.Add(new DummyReward(1074634)); // Tuition Reimbursement
}
Rewards.Add( new DummyReward( 1074634 ) ); // Tuition Reimbursement
}
public override Type NextQuest => typeof(ConvinceMe);
public override bool IsChainTriggered => true;
public override void Generate()
{
base.Generate();
public override void Generate()
{
base.Generate();
PutDeco( new BedlamTeleporter(), new Point3D( 2067, 1371, -75 ), Map.Malas );
}
PutDeco(new BedlamTeleporter(), new Point3D(2067, 1371, -75), Map.Malas);
}
public override void OnAccepted( MLQuestInstance instance )
{
instance.PlayerContext.BedlamAccess = true; // Permanent access
}
}
public override void OnAccepted(MLQuestInstance instance)
{
instance.PlayerContext.BedlamAccess = true; // Permanent access
}
}
public class ConvinceMe : MLQuest
{
public override Type NextQuest => typeof( TuitionReimbursement );
public override bool IsChainTriggered => true;
public class ConvinceMe : MLQuest
{
public ConvinceMe()
{
Activated = true;
Title = 1074629; // Convince Me
Description =
1074630; // I'm not signing any forms until the situation here is under control. So, you can either help out or you can forget getting your tuition refund. Which will it be? Help control the shambling dead?
RefusalMessage = 1074631; // No signature for you.
InProgressMessage =
1074632; // No signature for you until you kill off some of the shambling dead out there and destroy that blasted horse.
CompletionMessage = 1074633; // Pulled it off huh? Well then you've earned this signature!
CompletionNotice = CompletionNoticeShortReturn;
public ConvinceMe()
{
Activated = true;
Title = 1074629; // Convince Me
Description = 1074630; // I'm not signing any forms until the situation here is under control. So, you can either help out or you can forget getting your tuition refund. Which will it be? Help control the shambling dead?
RefusalMessage = 1074631; // No signature for you.
InProgressMessage = 1074632; // No signature for you until you kill off some of the shambling dead out there and destroy that blasted horse.
CompletionMessage = 1074633; // Pulled it off huh? Well then you've earned this signature!
CompletionNotice = CompletionNoticeShortReturn;
QuestArea bedlam = new QuestArea(1074835, "Bedlam"); // Bedlam
QuestArea bedlam = new QuestArea( 1074835, "Bedlam" ); // Bedlam
Objectives.Add(new KillObjective(1, new[] { typeof(RedDeath) }, "Red Death", bedlam));
Objectives.Add(new KillObjective(10, new[] { typeof(GoreFiend) }, "gore fiends", bedlam));
Objectives.Add(new KillObjective(8, new[] { typeof(RottingCorpse) }, "rotting corpses", bedlam));
Objectives.Add( new KillObjective( 1, new[] { typeof( RedDeath ) }, "Red Death", bedlam ) );
Objectives.Add( new KillObjective( 10, new[] { typeof( GoreFiend ) }, "gore fiends", bedlam ) );
Objectives.Add( new KillObjective( 8, new[] { typeof( RottingCorpse ) }, "rotting corpses", bedlam ) );
Rewards.Add(new DummyReward(1074634)); // Tuition Reimbursement
}
Rewards.Add( new DummyReward( 1074634 ) ); // Tuition Reimbursement
}
public override Type NextQuest => typeof(TuitionReimbursement);
public override bool IsChainTriggered => true;
public override void Generate()
{
base.Generate();
public override void Generate()
{
base.Generate();
PutSpawner( new Spawner( 1, 5, 10, 0, 3, "MasterGnosos" ), new Point3D( 87, 1639, 0 ), Map.Malas );
}
}
PutSpawner(new Spawner(1, 5, 10, 0, 3, "MasterGnosos"), new Point3D(87, 1639, 0), Map.Malas);
}
}
public class TuitionReimbursement : MLQuest
{
public override bool IsChainTriggered => true;
public class TuitionReimbursement : MLQuest
{
public TuitionReimbursement()
{
Activated = true;
Title = 1074634; // Tuition Reimbursement
Description =
1074635; // Well, there you are. I've added my signature to that of Gorrow, so you should be set to return to Mistress Aernya and get your tuition refunded.
RefusalMessage =
1074636; // Great! If you're going to stick around here, I know we have more tasks for you to perform.
InProgressMessage =
1074637; // Just head out the main gates there and you'll find yourself embracing the iron maiden in the Bloodletter's Guild.
CompletionMessage =
1074638; // *disinterested stare* What? Oh, you've gotten your form filled in. How nice. *glare* And I'd hoped you'd drop this charade before I was forced to rub your nose in it. *nasty smile* You're not even a student and as such, you're not eligible for a refund -- you've never paid tuition. For your services, Master Gnosos has recommended you receive pay. So here. Now go away.
CompletionNotice = CompletionNoticeShort;
public TuitionReimbursement()
{
Activated = true;
Title = 1074634; // Tuition Reimbursement
Description = 1074635; // Well, there you are. I've added my signature to that of Gorrow, so you should be set to return to Mistress Aernya and get your tuition refunded.
RefusalMessage = 1074636; // Great! If you're going to stick around here, I know we have more tasks for you to perform.
InProgressMessage = 1074637; // Just head out the main gates there and you'll find yourself embracing the iron maiden in the Bloodletter's Guild.
CompletionMessage = 1074638; // *disinterested stare* What? Oh, you've gotten your form filled in. How nice. *glare* And I'd hoped you'd drop this charade before I was forced to rub your nose in it. *nasty smile* You're not even a student and as such, you're not eligible for a refund -- you've never paid tuition. For your services, Master Gnosos has recommended you receive pay. So here. Now go away.
CompletionNotice = CompletionNoticeShort;
Objectives.Add(new DeliverObjective(typeof(CompletedTuitionReimbursementForm), 1,
"Completed Tuition Reimbursement Form", typeof(Aernya)));
Objectives.Add( new DeliverObjective( typeof( CompletedTuitionReimbursementForm ), 1, "Completed Tuition Reimbursement Form", typeof( Aernya ) ) );
Rewards.Add(ItemReward.Strongbox);
}
Rewards.Add( ItemReward.Strongbox );
}
}
public override bool IsChainTriggered => true;
}
#endregion
#endregion
#region Mobiles
#region Mobiles
[QuesterName( "Aernya (Umbra)" )]
public class Aernya : BaseCreature
{
public override bool IsInvulnerable => true;
public override string DefaultName => "Aernya";
[QuesterName("Aernya (Umbra)")]
public class Aernya : BaseCreature
{
[Constructible]
public Aernya()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
{
Title = "the Mistress of Admissions";
Race = Race.Human;
BodyValue = 0x191;
Female = true;
Hue = Race.RandomSkinHue();
InitStats(100, 100, 25);
[Constructible]
public Aernya()
: base( AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2 )
{
Title = "the Mistress of Admissions";
Race = Race.Human;
BodyValue = 0x191;
Female = true;
Hue = Race.RandomSkinHue();
InitStats( 100, 100, 25 );
Utility.AssignRandomHair(this, true);
Utility.AssignRandomHair( this, true );
AddItem(new Backpack());
AddItem(new Sandals(Utility.RandomNeutralHue()));
AddItem(new Skirt(Utility.RandomBool() ? 0x1 : 0x0));
AddItem(new Cloak(Utility.RandomBrightHue()));
AddItem(new FancyShirt(Utility.RandomBool() ? 0x3B2 : 0x3B3));
}
AddItem( new Backpack() );
AddItem( new Sandals( Utility.RandomNeutralHue() ) );
AddItem( new Skirt( Utility.RandomBool() ? 0x1 : 0x0 ) );
AddItem( new Cloak( Utility.RandomBrightHue() ) );
AddItem( new FancyShirt( Utility.RandomBool() ? 0x3B2 : 0x3B3 ) );
}
public Aernya(Serial serial)
: base(serial)
{
}
public Aernya( Serial serial )
: base( serial )
{
}
public override bool IsInvulnerable => true;
public override string DefaultName => "Aernya";
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write( (int) 0 ); // version
}
writer.Write(0); // version
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
int version = reader.ReadInt();
}
}
[QuesterName( "Gorrow (Luna)" )]
public class Gorrow : BaseCreature
{
public override bool IsInvulnerable => true;
public override string DefaultName => "Gorrow";
public override bool CanShout => true;
public override void Shout( PlayerMobile pm )
{
MLQuestSystem.Tell( this, pm, Utility.RandomList(
1074200, // Thank goodness you are here, there<72>s no time to lose.
1074203 // Hello friend. I realize you are busy but if you would be willing to render me a service I can assure you that you will be judiciously renumerated.
) );
}
[QuesterName("Gorrow (Luna)")]
public class Gorrow : BaseCreature
{
[Constructible]
public Gorrow()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
{
Title = "the Mayor";
Race = Race.Human;
BodyValue = 0x190;
Female = false;
Hue = Race.RandomSkinHue();
InitStats(100, 100, 25);
[Constructible]
public Gorrow()
: base( AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2 )
{
Title = "the Mayor";
Race = Race.Human;
BodyValue = 0x190;
Female = false;
Hue = Race.RandomSkinHue();
InitStats( 100, 100, 25 );
AddItem(new Backpack());
AddItem(new Shoes(0x1BB));
AddItem(new Tunic(Utility.RandomNeutralHue()));
AddItem(new LongPants(0x901));
AddItem(new Cloak(Utility.RandomRedHue()));
}
AddItem( new Backpack() );
AddItem( new Shoes( 0x1BB ) );
AddItem( new Tunic( Utility.RandomNeutralHue() ) );
AddItem( new LongPants( 0x901 ) );
AddItem( new Cloak( Utility.RandomRedHue() ) );
}
public Gorrow(Serial serial)
: base(serial)
{
}
public Gorrow( Serial serial )
: base( serial )
{
}
public override bool IsInvulnerable => true;
public override string DefaultName => "Gorrow";
public override bool CanShout => true;
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
public override void Shout(PlayerMobile pm)
{
MLQuestSystem.Tell(this, pm, Utility.RandomList(
1074200, // Thank goodness you are here, there<72>s no time to lose.
1074203 // Hello friend. I realize you are busy but if you would be willing to render me a service I can assure you that you will be judiciously renumerated.
));
}
writer.Write( (int) 0 ); // version
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
writer.Write(0); // version
}
int version = reader.ReadInt();
}
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
[QuesterName( "Master Gnosos (Bedlam)" )]
public class MasterGnosos : BaseCreature
{
public override bool IsInvulnerable => true;
public override bool CanTeach => true;
public override string DefaultName => "Master Gnosos";
public override bool CanShout => true;
public override void Shout( PlayerMobile pm )
{
MLQuestSystem.Tell( this, pm, 1074186 ); // Come here, I have a task.
}
int version = reader.ReadInt();
}
}
[Constructible]
public MasterGnosos()
: base( AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2 )
{
Title = "the necromancer";
Race = Race.Human;
BodyValue = 0x190;
Female = false;
Hue = 0x83E8;
InitStats( 100, 100, 25 );
[QuesterName("Master Gnosos (Bedlam)")]
public class MasterGnosos : BaseCreature
{
[Constructible]
public MasterGnosos()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
{
Title = "the necromancer";
Race = Race.Human;
BodyValue = 0x190;
Female = false;
Hue = 0x83E8;
InitStats(100, 100, 25);
HairItemID = 0x2049;
FacialHairItemID = 0x204B;
HairItemID = 0x2049;
FacialHairItemID = 0x204B;
AddItem( new Backpack() );
AddItem( new Shoes( 0x485 ) );
AddItem( new Robe( 0x497 ) );
AddItem(new Backpack());
AddItem(new Shoes(0x485));
AddItem(new Robe(0x497));
SetSkill( SkillName.EvalInt, 60.0, 80.0 );
SetSkill( SkillName.Inscribe, 60.0, 80.0 );
SetSkill( SkillName.MagicResist, 60.0, 80.0 );
SetSkill( SkillName.SpiritSpeak, 60.0, 80.0 );
SetSkill( SkillName.Meditation, 60.0, 80.0 );
SetSkill( SkillName.Necromancy, 60.0, 80.0 );
}
SetSkill(SkillName.EvalInt, 60.0, 80.0);
SetSkill(SkillName.Inscribe, 60.0, 80.0);
SetSkill(SkillName.MagicResist, 60.0, 80.0);
SetSkill(SkillName.SpiritSpeak, 60.0, 80.0);
SetSkill(SkillName.Meditation, 60.0, 80.0);
SetSkill(SkillName.Necromancy, 60.0, 80.0);
}
public MasterGnosos( Serial serial )
: base( serial )
{
}
public MasterGnosos(Serial serial)
: base(serial)
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
public override bool IsInvulnerable => true;
public override bool CanTeach => true;
public override string DefaultName => "Master Gnosos";
public override bool CanShout => true;
writer.Write( (int) 0 ); // version
}
public override void Shout(PlayerMobile pm)
{
MLQuestSystem.Tell(this, pm, 1074186); // Come here, I have a task.
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
int version = reader.ReadInt();
}
}
writer.Write(0); // version
}
#endregion
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
#endregion
}

View file

@ -4,121 +4,122 @@ using Server.Items;
namespace Server.Engines.MLQuests.Definitions
{
public class NewHavenEscort : BaseEscort
{
// New Haven escorts do not count for 'helping a human in need'
public override bool AwardHumanInNeed => false;
public class NewHavenEscort : BaseEscort
{
// Escort reward
private static readonly BaseReward m_Reward = new ItemReward("Gold", typeof(Gold), 500);
// Escort reward
private static readonly BaseReward m_Reward = new ItemReward( "Gold", typeof( Gold ), 500 );
public NewHavenEscort(int title, int description, int progress, int destination, string region)
{
Activated = true;
Title = title;
Description = description;
RefusalMessage =
1072288; // I wish you would reconsider my offer. I'll be waiting right here for someone brave enough to assist me.
InProgressMessage = progress;
public NewHavenEscort( int title, int description, int progress, int destination, string region )
{
Activated = true;
Title = title;
Description = description;
RefusalMessage = 1072288; // I wish you would reconsider my offer. I'll be waiting right here for someone brave enough to assist me.
InProgressMessage = progress;
Objectives.Add(new EscortObjective(new QuestArea(destination, region)));
Objectives.Add( new EscortObjective( new QuestArea( destination, region ) ) );
Rewards.Add(m_Reward);
}
Rewards.Add( m_Reward );
}
}
// New Haven escorts do not count for 'helping a human in need'
public override bool AwardHumanInNeed => false;
}
public class EscortToNHAlchemist : NewHavenEscort
{
public EscortToNHAlchemist()
: base( 1072314, 1042769, 1072326, 1073864, "the New Haven Alchemist" )
{
}
}
public class EscortToNHAlchemist : NewHavenEscort
{
public EscortToNHAlchemist()
: base(1072314, 1042769, 1072326, 1073864, "the New Haven Alchemist")
{
}
}
public class EscortToNHBard : NewHavenEscort
{
public EscortToNHBard()
: base( 1072315, 1042772, 1072327, 1073865, "the New Haven Bard" )
{
}
}
public class EscortToNHBard : NewHavenEscort
{
public EscortToNHBard()
: base(1072315, 1042772, 1072327, 1073865, "the New Haven Bard")
{
}
}
public class EscortToNHWarrior : NewHavenEscort
{
public EscortToNHWarrior()
: base( 1072316, 1042787, 1072328, 1073866, "the New Haven Warrior" )
{
}
}
public class EscortToNHWarrior : NewHavenEscort
{
public EscortToNHWarrior()
: base(1072316, 1042787, 1072328, 1073866, "the New Haven Warrior")
{
}
}
public class EscortToNHTailor : NewHavenEscort
{
public EscortToNHTailor()
: base( 1072317, 1042781, 1072329, 1073867, "the New Haven Tailor" )
{
}
}
public class EscortToNHTailor : NewHavenEscort
{
public EscortToNHTailor()
: base(1072317, 1042781, 1072329, 1073867, "the New Haven Tailor")
{
}
}
public class EscortToNHCarpenter : NewHavenEscort
{
public EscortToNHCarpenter()
: base( 1072318, 1042775, 1072330, 1073868, "the New Haven Carpenter" )
{
}
}
public class EscortToNHCarpenter : NewHavenEscort
{
public EscortToNHCarpenter()
: base(1072318, 1042775, 1072330, 1073868, "the New Haven Carpenter")
{
}
}
public class EscortToNHMapmaker : NewHavenEscort
{
public EscortToNHMapmaker()
: base( 1072319, 1042793, 1072331, 1073869, "the New Haven Mapmaker" )
{
}
}
public class EscortToNHMapmaker : NewHavenEscort
{
public EscortToNHMapmaker()
: base(1072319, 1042793, 1072331, 1073869, "the New Haven Mapmaker")
{
}
}
public class EscortToNHMage : NewHavenEscort
{
public EscortToNHMage()
: base( 1072320, 1042790, 1072332, 1073870, "the New Haven Mage" )
{
}
}
public class EscortToNHMage : NewHavenEscort
{
public EscortToNHMage()
: base(1072320, 1042790, 1072332, 1073870, "the New Haven Mage")
{
}
}
public class EscortToNHInn : NewHavenEscort
{
public EscortToNHInn()
: base( 1072321, 1042796, 1072333, 1073871, "the New Haven Inn" )
{
}
}
public class EscortToNHInn : NewHavenEscort
{
public EscortToNHInn()
: base(1072321, 1042796, 1072333, 1073871, "the New Haven Inn")
{
}
}
public class EscortToNHFarm : NewHavenEscort
{
public EscortToNHFarm()
: base( 1072322, 1042799, 1072334, 1073872, "the New Haven Farm" )
{
}
}
public class EscortToNHFarm : NewHavenEscort
{
public EscortToNHFarm()
: base(1072322, 1042799, 1072334, 1073872, "the New Haven Farm")
{
}
}
public class EscortToNHDocks : NewHavenEscort
{
public EscortToNHDocks()
: base( 1072323, 1042802, 1072335, 1073873, "the New Haven Docks" )
{
}
}
public class EscortToNHDocks : NewHavenEscort
{
public EscortToNHDocks()
: base(1072323, 1042802, 1072335, 1073873, "the New Haven Docks")
{
}
}
public class EscortToNHBowyer : NewHavenEscort
{
public EscortToNHBowyer()
: base( 1072324, 1042805, 1072336, 1073874, "the New Haven Bowyer" )
{
}
}
public class EscortToNHBowyer : NewHavenEscort
{
public EscortToNHBowyer()
: base(1072324, 1042805, 1072336, 1073874, "the New Haven Bowyer")
{
}
}
public class EscortToNHBank : NewHavenEscort
{
public EscortToNHBank()
: base( 1072325, 1042784, 1072337, 1073875, "the New Haven Bank" )
{
}
}
}
public class EscortToNHBank : NewHavenEscort
{
public EscortToNHBank()
: base(1072325, 1042784, 1072337, 1073875, "the New Haven Bank")
{
}
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -6,150 +6,161 @@ using Server.Mobiles;
namespace Server.Engines.MLQuests.Definitions
{
#region Quests
#region Quests
public class TheAncientWorld : MLQuest
{
public override Type NextQuest => typeof( TheGoldenHorn );
public class TheAncientWorld : MLQuest
{
public TheAncientWorld()
{
Activated = true;
Title = 1074534; // The Ancient World
Description =
1074535; // The lore of my people mentions Mondain many times. In one tale, it is revealed that he created and enslaved a race -- a sort of man bull, known as a 'minotaur'. The tales speak of mighty warriors who charged with blood-soaked horns into the heat of battle. But, alas, the fate of the bull-men is unknown after the rupture. Will you seek information about their civilization?
RefusalMessage = 1074538; // I am disappointed, but I respect your decision.
InProgressMessage =
1074539; // A traveler has told me that worshippers of Mondain still exist and wander the land. Perhaps their lore speaks of whether the bull-men survived. I do not think they share their secrets gladly. You may need to be 'persuasive'.
CompletionMessage = 1074542; // What have you found?
public TheAncientWorld()
{
Activated = true;
Title = 1074534; // The Ancient World
Description = 1074535; // The lore of my people mentions Mondain many times. In one tale, it is revealed that he created and enslaved a race -- a sort of man bull, known as a 'minotaur'. The tales speak of mighty warriors who charged with blood-soaked horns into the heat of battle. But, alas, the fate of the bull-men is unknown after the rupture. Will you seek information about their civilization?
RefusalMessage = 1074538; // I am disappointed, but I respect your decision.
InProgressMessage = 1074539; // A traveler has told me that worshippers of Mondain still exist and wander the land. Perhaps their lore speaks of whether the bull-men survived. I do not think they share their secrets gladly. You may need to be 'persuasive'.
CompletionMessage = 1074542; // What have you found?
Objectives.Add(new CollectObjective(1, typeof(FragmentOfAMap), "fragment of a map"));
Objectives.Add( new CollectObjective( 1, typeof( FragmentOfAMap ), "fragment of a map" ) );
Rewards.Add(new DummyReward(1074876)); // Knowledge of the legendary minotaur.
}
Rewards.Add( new DummyReward( 1074876 ) ); // Knowledge of the legendary minotaur.
}
public override Type NextQuest => typeof(TheGoldenHorn);
public override void Generate()
{
base.Generate();
public override void Generate()
{
base.Generate();
PutSpawner( new Spawner( 1, 5, 10, 0, 5, "LorekeeperBroolol" ), new Point3D( 7011, 375, 0 ), Map.Trammel );
PutSpawner( new Spawner( 1, 5, 10, 0, 5, "LorekeeperBroolol" ), new Point3D( 7011, 375, 0 ), Map.Felucca );
}
}
PutSpawner(new Spawner(1, 5, 10, 0, 5, "LorekeeperBroolol"), new Point3D(7011, 375, 0), Map.Trammel);
PutSpawner(new Spawner(1, 5, 10, 0, 5, "LorekeeperBroolol"), new Point3D(7011, 375, 0), Map.Felucca);
}
}
public class TheGoldenHorn : MLQuest
{
public override Type NextQuest => typeof( Bullish );
public override bool IsChainTriggered => true;
public class TheGoldenHorn : MLQuest
{
public TheGoldenHorn()
{
Activated = true;
Title = 1074543; // The Golden Horn
Description =
1074545; // Ah ha! You see here ... and over here ... The map fragment places the city of the bull-men, Labyrinth, on that piece of Sosaria that was thrown into the sky. Hmmm, I would have you go there and find any artifacts that remain that help tell the story. But, legend speaks of a mighty barrier to prevent invasion of the city. Take this map to Braen and explain the problem. Perhaps he can devise a solution.
RefusalMessage = 1074538; // I am disappointed, but I respect your decision.
InProgressMessage = 1074547; // Braen is nearby, run and speak with him.
CompletionMessage = 1074549; // Yes? What do you want? I'm very busy.
public TheGoldenHorn()
{
Activated = true;
Title = 1074543; // The Golden Horn
Description = 1074545; // Ah ha! You see here ... and over here ... The map fragment places the city of the bull-men, Labyrinth, on that piece of Sosaria that was thrown into the sky. Hmmm, I would have you go there and find any artifacts that remain that help tell the story. But, legend speaks of a mighty barrier to prevent invasion of the city. Take this map to Braen and explain the problem. Perhaps he can devise a solution.
RefusalMessage = 1074538; // I am disappointed, but I respect your decision.
InProgressMessage = 1074547; // Braen is nearby, run and speak with him.
CompletionMessage = 1074549; // Yes? What do you want? I'm very busy.
Objectives.Add(new DeliverObjective(typeof(FragmentOfAMapDelivery), 1, "fragment of a map", typeof(Braen)));
Objectives.Add( new DeliverObjective( typeof( FragmentOfAMapDelivery ), 1, "fragment of a map", typeof( Braen ) ) );
Rewards.Add(new DummyReward(1074876)); // Knowledge of the legendary minotaur.
}
Rewards.Add( new DummyReward( 1074876 ) ); // Knowledge of the legendary minotaur.
}
}
public override Type NextQuest => typeof(Bullish);
public override bool IsChainTriggered => true;
}
public class Bullish : MLQuest
{
public override Type NextQuest => typeof( LostCivilization );
public override bool IsChainTriggered => true;
public class Bullish : MLQuest
{
public Bullish()
{
Activated = true;
Title = 1074550; // Bullish
Description =
1074552; // Oh, I see. I will need some materials to infuse you with the essence of a bull-man, so you can fool their defenses. The most similar beast to the original Baratarian bull that the minotaur were bred from is undoubtedly the mighty Gaman, native to the Lands of the Feudal Lords. I need horns, in great quantity to undertake this magic.
RefusalMessage = 1074554; // Oh come now, don't be afraid. The magic won't harm you.
InProgressMessage =
1074555; // I cannot grant you the ability to pass through the bull-men's defenses without the gaman horns.
CompletionMessage =
1074556; // You've returned at last! Give me just a moment to examine what you've brought and I can perform the magic that will allow you enter the Labyrinth.
public Bullish()
{
Activated = true;
Title = 1074550; // Bullish
Description = 1074552; // Oh, I see. I will need some materials to infuse you with the essence of a bull-man, so you can fool their defenses. The most similar beast to the original Baratarian bull that the minotaur were bred from is undoubtedly the mighty Gaman, native to the Lands of the Feudal Lords. I need horns, in great quantity to undertake this magic.
RefusalMessage = 1074554; // Oh come now, don't be afraid. The magic won't harm you.
InProgressMessage = 1074555; // I cannot grant you the ability to pass through the bull-men's defenses without the gaman horns.
CompletionMessage = 1074556; // You've returned at last! Give me just a moment to examine what you've brought and I can perform the magic that will allow you enter the Labyrinth.
Objectives.Add(new CollectObjective(20, typeof(GamanHorns), "gaman horns"));
Objectives.Add( new CollectObjective( 20, typeof( GamanHorns ), "gaman horns" ) );
Rewards.Add(new DummyReward(1074876)); // Knowledge of the legendary minotaur.
}
Rewards.Add( new DummyReward( 1074876 ) ); // Knowledge of the legendary minotaur.
}
}
public override Type NextQuest => typeof(LostCivilization);
public override bool IsChainTriggered => true;
}
public class LostCivilization : MLQuest
{
public override bool IsChainTriggered => true;
public class LostCivilization : MLQuest
{
public LostCivilization()
{
Activated = true;
Title = 1074823; // Lost Civilization
Description =
1074825; // *whew* It is done! The fierce essence of the bull has been infused into your aura. You are able now to breach the ancient defenses of the city. Go forth and seek the minotaur -- and then return with wonderous tales and evidence of your visit to the Labyrinth.
RefusalMessage =
1074827; // As you wish. I can't understand why you'd pass up such a remarkable opportunity. Think of the adventures you would have.
InProgressMessage =
1074828; // You won't reach the minotaur city by loitering around here! What are you waiting for? You need to get to Malas and find the access point for the island. You'll be renowned for your discovery!
CompletionMessage =
1074829; // Oh! You've returned at last! I can't wait to hear the tales ... but first, let me see those artifacts. You've certainly earned this reward.
public LostCivilization()
{
Activated = true;
Title = 1074823; // Lost Civilization
Description = 1074825; // *whew* It is done! The fierce essence of the bull has been infused into your aura. You are able now to breach the ancient defenses of the city. Go forth and seek the minotaur -- and then return with wonderous tales and evidence of your visit to the Labyrinth.
RefusalMessage = 1074827; // As you wish. I can't understand why you'd pass up such a remarkable opportunity. Think of the adventures you would have.
InProgressMessage = 1074828; // You won't reach the minotaur city by loitering around here! What are you waiting for? You need to get to Malas and find the access point for the island. You'll be renowned for your discovery!
CompletionMessage = 1074829; // Oh! You've returned at last! I can't wait to hear the tales ... but first, let me see those artifacts. You've certainly earned this reward.
Objectives.Add(new CollectObjective(3, typeof(MinotaurArtifact), "minotaur artifacts"));
Objectives.Add( new CollectObjective( 3, typeof( MinotaurArtifact ), "minotaur artifacts" ) );
Rewards.Add(ItemReward.Strongbox);
}
Rewards.Add( ItemReward.Strongbox );
}
}
public override bool IsChainTriggered => true;
}
#endregion
#endregion
#region Mobiles
#region Mobiles
[QuesterName( "Broolol (The Heartwood)" )]
public class LorekeeperBroolol : BaseCreature
{
public override bool IsInvulnerable => true;
public override bool CanTeach => true;
public override string DefaultName => "Lorekeeper Broolol";
public override bool CanShout => true;
public override void Shout( PlayerMobile pm )
{
MLQuestSystem.Tell( this, pm, 1074200 ); // Thank goodness you are here, there<72>s no time to lose.
}
[QuesterName("Broolol (The Heartwood)")]
public class LorekeeperBroolol : BaseCreature
{
[Constructible]
public LorekeeperBroolol()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
{
Title = "the keeper of tradition";
Race = Race.Elf;
BodyValue = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
InitStats(100, 100, 25);
[Constructible]
public LorekeeperBroolol()
: base( AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2 )
{
Title = "the keeper of tradition";
Race = Race.Elf;
BodyValue = 0x25E;
Female = true;
Hue = Race.RandomSkinHue();
InitStats( 100, 100, 25 );
Utility.AssignRandomHair(this, true);
Utility.AssignRandomHair( this, true );
SetSkill(SkillName.Meditation, 60.0, 80.0);
SetSkill(SkillName.Focus, 60.0, 80.0);
SetSkill( SkillName.Meditation, 60.0, 80.0 );
SetSkill( SkillName.Focus, 60.0, 80.0 );
AddItem(new ElvenBoots(0x70D));
AddItem(new FemaleElvenRobe(0x3A));
AddItem(new WildStaff());
}
AddItem( new ElvenBoots( 0x70D ) );
AddItem( new FemaleElvenRobe( 0x3A ) );
AddItem( new WildStaff() );
}
public LorekeeperBroolol(Serial serial)
: base(serial)
{
}
public LorekeeperBroolol( Serial serial )
: base( serial )
{
}
public override bool IsInvulnerable => true;
public override bool CanTeach => true;
public override string DefaultName => "Lorekeeper Broolol";
public override bool CanShout => true;
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
public override void Shout(PlayerMobile pm)
{
MLQuestSystem.Tell(this, pm, 1074200); // Thank goodness you are here, there<72>s no time to lose.
}
writer.Write( (int) 0 ); // version
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
writer.Write(0); // version
}
int version = reader.ReadInt();
}
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
#endregion
}
int version = reader.ReadInt();
}
}
#endregion
}

View file

@ -4,126 +4,128 @@ using Server.Items;
namespace Server.Engines.MLQuests.Definitions
{
public class TownEscort : BaseEscort
{
// Escort reward
private static readonly BaseReward m_Reward = new ItemReward( "Gold", typeof( Gold ), 500 );
public class TownEscort : BaseEscort
{
// Escort reward
private static readonly BaseReward m_Reward = new ItemReward("Gold", typeof(Gold), 500);
public TownEscort( int title, int progress, int destination, string region )
{
Activated = true;
Title = title;
Description = 1072287; // I seek a worthy escort. I can offer some small pay to any able bodied adventurer who can assist me. It is imperative that I reach my destination.
RefusalMessage = 1072288; // I wish you would reconsider my offer. I'll be waiting right here for someone brave enough to assist me.
InProgressMessage = progress;
public TownEscort(int title, int progress, int destination, string region)
{
Activated = true;
Title = title;
Description =
1072287; // I seek a worthy escort. I can offer some small pay to any able bodied adventurer who can assist me. It is imperative that I reach my destination.
RefusalMessage =
1072288; // I wish you would reconsider my offer. I'll be waiting right here for someone brave enough to assist me.
InProgressMessage = progress;
Objectives.Add( new EscortObjective( new QuestArea( destination, region ) ) );
Objectives.Add(new EscortObjective(new QuestArea(destination, region)));
Rewards.Add( m_Reward );
}
}
Rewards.Add(m_Reward);
}
}
public class EscortToYew : TownEscort
{
public EscortToYew()
: base( 1072275, 1072289, 1072227, "Yew" )
{
}
}
public class EscortToYew : TownEscort
{
public EscortToYew()
: base(1072275, 1072289, 1072227, "Yew")
{
}
}
public class EscortToVesper : TownEscort
{
public EscortToVesper()
: base( 1072276, 1072290, 1072229, "Vesper" )
{
}
}
public class EscortToVesper : TownEscort
{
public EscortToVesper()
: base(1072276, 1072290, 1072229, "Vesper")
{
}
}
public class EscortToTrinsic : TownEscort
{
public EscortToTrinsic()
: base( 1072277, 1072291, 1072236, "Trinsic" )
{
}
}
public class EscortToTrinsic : TownEscort
{
public EscortToTrinsic()
: base(1072277, 1072291, 1072236, "Trinsic")
{
}
}
public class EscortToSkaraBrae : TownEscort
{
public EscortToSkaraBrae()
: base( 1072278, 1072292, 1072235, "Skara Brae" )
{
}
}
public class EscortToSkaraBrae : TownEscort
{
public EscortToSkaraBrae()
: base(1072278, 1072292, 1072235, "Skara Brae")
{
}
}
public class EscortToSerpentsHold : TownEscort
{
public EscortToSerpentsHold()
: base( 1072279, 1072293, 1072238, "Serpent's Hold" )
{
}
}
public class EscortToSerpentsHold : TownEscort
{
public EscortToSerpentsHold()
: base(1072279, 1072293, 1072238, "Serpent's Hold")
{
}
}
public class EscortToNujelm : TownEscort
{
public EscortToNujelm()
: base( 1072280, 1072294, 1072237, "Nujel'm" )
{
}
}
public class EscortToNujelm : TownEscort
{
public EscortToNujelm()
: base(1072280, 1072294, 1072237, "Nujel'm")
{
}
}
public class EscortToMoonglow : TownEscort
{
public EscortToMoonglow()
: base( 1072281, 1072295, 1072232, "Moonglow" )
{
}
}
public class EscortToMoonglow : TownEscort
{
public EscortToMoonglow()
: base(1072281, 1072295, 1072232, "Moonglow")
{
}
}
public class EscortToMinoc : TownEscort
{
public EscortToMinoc()
: base( 1072282, 1072296, 1072228, "Minoc" )
{
}
}
public class EscortToMinoc : TownEscort
{
public EscortToMinoc()
: base(1072282, 1072296, 1072228, "Minoc")
{
}
}
public class EscortToMagincia : TownEscort
{
public EscortToMagincia()
: base( 1072283, 1072297, 1072233, "Magincia" )
{
}
}
public class EscortToMagincia : TownEscort
{
public EscortToMagincia()
: base(1072283, 1072297, 1072233, "Magincia")
{
}
}
public class EscortToJhelom : TownEscort
{
public EscortToJhelom()
: base( 1072284, 1072298, 1072239, "Jhelom" )
{
}
}
public class EscortToJhelom : TownEscort
{
public EscortToJhelom()
: base(1072284, 1072298, 1072239, "Jhelom")
{
}
}
public class EscortToCove : TownEscort
{
public EscortToCove()
: base( 1072285, 1072299, 1072230, "Cove" )
{
}
}
public class EscortToCove : TownEscort
{
public EscortToCove()
: base(1072285, 1072299, 1072230, "Cove")
{
}
}
public class EscortToBritain : TownEscort
{
public EscortToBritain()
: base( 1072286, 1072300, 1072231, "Britain" )
{
}
}
public class EscortToBritain : TownEscort
{
public EscortToBritain()
: base(1072286, 1072300, 1072231, "Britain")
{
}
}
public class EscortToOcllo : TownEscort
{
public EscortToOcllo()
: base( 1072312, 1072313, 1072234, "Ocllo" )
{
}
}
}
public class EscortToOcllo : TownEscort
{
public EscortToOcllo()
: base(1072312, 1072313, 1072234, "Ocllo")
{
}
}
}

View file

@ -6,182 +6,191 @@ using Server.Mobiles;
namespace Server.Engines.MLQuests.Definitions
{
#region Quests
#region Quests
public class UnfadingMemoriesPartOne : MLQuest
{
public override Type NextQuest => typeof( UnfadingMemoriesPartTwo );
public class UnfadingMemoriesPartOne : MLQuest
{
public UnfadingMemoriesPartOne()
{
Activated = true;
Title = 1075355; // Unfading Memories
Description =
1075356; // Aargh! It<49>s just not right! It doesn<73>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<69>s just the color I needed! Look how it brings out the highlights of her wheaten tresses!
CompletionNotice = CompletionNoticeShort;
public UnfadingMemoriesPartOne()
{
Activated = true;
Title = 1075355; // Unfading Memories
Description = 1075356; // Aargh! It<49>s just not right! It doesn<73>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<69>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"));
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.
}
Rewards.Add( new DummyReward( 1075357 ) ); // The joy of contributing to a noble artistic effort, however paltry the end product.
}
public override Type NextQuest => typeof(UnfadingMemoriesPartTwo);
public override void Generate()
{
base.Generate();
public override void Generate()
{
base.Generate();
PutSpawner( new Spawner( 1, 5, 10, 0, 3, "Emilio" ), new Point3D( 1447, 1664, 10 ), Map.Trammel );
PutSpawner( new Spawner( 1, 5, 10, 0, 3, "Emilio" ), new Point3D( 1447, 1664, 10 ), Map.Felucca );
}
}
PutSpawner(new Spawner(1, 5, 10, 0, 3, "Emilio"), new Point3D(1447, 1664, 10), Map.Trammel);
PutSpawner(new Spawner(1, 5, 10, 0, 3, "Emilio"), new Point3D(1447, 1664, 10), Map.Felucca);
}
}
public class UnfadingMemoriesPartTwo : MLQuest
{
public override Type NextQuest => typeof( UnfadingMemoriesPartThree );
public override bool IsChainTriggered => true;
public class UnfadingMemoriesPartTwo : MLQuest
{
public UnfadingMemoriesPartTwo()
{
Activated = true;
Title = 1075367; // Unfading Memories
Description =
1075368; // Finished! With the pigment I was able to create from the Prismatic Amber you brought me, I was able to complete my humble work. I should explain. Once, I loved a noble lady of gentleness and refinement, who possessed such beauty that I have found myself unable to love another to this day. But it was from afar that I admired her, for it is not for one so lowly as I to pay court to the likes of her. You have heard of the fair Thalia, Lady of Nujel'm? No? Well, she was my Muse, my inspiration, and when I heard she was to be married, I lost whatever pitiful talent I possessed. I felt I must compose a portrait of her, my masterpiece, or I would never be able to paint again. You, my friend, have helped me complete my work. Now I ask another favor of you. Will you take it to her as a wedding gift? She will probably reject it, but I must make the offer.
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<6F>t have time to . . . what<61>s that you say?
CompletionNotice = CompletionNoticeShort;
public UnfadingMemoriesPartTwo()
{
Activated = true;
Title = 1075367; // Unfading Memories
Description = 1075368; // Finished! With the pigment I was able to create from the Prismatic Amber you brought me, I was able to complete my humble work. I should explain. Once, I loved a noble lady of gentleness and refinement, who possessed such beauty that I have found myself unable to love another to this day. But it was from afar that I admired her, for it is not for one so lowly as I to pay court to the likes of her. You have heard of the fair Thalia, Lady of Nujel'm? No? Well, she was my Muse, my inspiration, and when I heard she was to be married, I lost whatever pitiful talent I possessed. I felt I must compose a portrait of her, my masterpiece, or I would never be able to paint again. You, my friend, have helped me complete my work. Now I ask another favor of you. Will you take it to her as a wedding gift? She will probably reject it, but I must make the offer.
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<6F>t have time to . . . what<61>s that you say?
CompletionNotice = CompletionNoticeShort;
Objectives.Add(new DeliverObjective(typeof(PortraitOfTheBride), 1, "Portrait of the Bride", typeof(Thalia)));
Objectives.Add( new DeliverObjective( typeof( PortraitOfTheBride ), 1, "Portrait of the Bride", typeof( Thalia ) ) );
Rewards.Add(new DummyReward(1075369)); // The Artist<73>s gratitude.
}
Rewards.Add( new DummyReward( 1075369 ) ); // The Artist<73>s gratitude.
}
}
public override Type NextQuest => typeof(UnfadingMemoriesPartThree);
public override bool IsChainTriggered => true;
}
public class UnfadingMemoriesPartThree : MLQuest
{
public override bool IsChainTriggered => true;
public class UnfadingMemoriesPartThree : MLQuest
{
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<6F>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<73>s Guild in Britain, if you would do me this kindness.
CompletionMessage =
1075378; // She said what? She thinks what of me? I . . . I can<61>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;
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<6F>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<73>s Guild in Britain, if you would do me this kindness.
CompletionMessage = 1075378; // She said what? She thinks what of me? I . . . I can<61>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)));
Objectives.Add( new DeliverObjective( typeof( BridesLetter ), 1, "Bride's Letter", typeof( Emilio ) ) );
Rewards.Add(new ItemReward(1075375, typeof(Bleach))); // Bleach
}
Rewards.Add( new ItemReward( 1075375, typeof( Bleach ) ) ); // Bleach
}
public override bool IsChainTriggered => true;
public override void Generate()
{
base.Generate();
public override void Generate()
{
base.Generate();
PutSpawner( new Spawner( 1, 5, 10, 0, 3, "Thalia" ), new Point3D( 3675, 1322, 20 ), Map.Trammel );
PutSpawner( new Spawner( 1, 5, 10, 0, 3, "Thalia" ), new Point3D( 3675, 1322, 20 ), Map.Felucca );
}
}
PutSpawner(new Spawner(1, 5, 10, 0, 3, "Thalia"), new Point3D(3675, 1322, 20), Map.Trammel);
PutSpawner(new Spawner(1, 5, 10, 0, 3, "Thalia"), new Point3D(3675, 1322, 20), Map.Felucca);
}
}
#endregion
#endregion
#region Mobiles
#region Mobiles
[QuesterName( "Emilio (Britain)" )] // OSI's description is "Artist", not very helpful
public class Emilio : BaseCreature
{
public override string DefaultName => "Emilio";
public override bool IsInvulnerable => true;
[QuesterName("Emilio (Britain)")] // OSI's description is "Artist", not very helpful
public class Emilio : BaseCreature
{
[Constructible]
public Emilio()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
{
Title = "the Tortured Artist";
Race = Race.Human;
BodyValue = 0x190;
Female = false;
Hue = Race.RandomSkinHue();
InitStats(100, 100, 25);
[Constructible]
public Emilio()
: base( AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2 )
{
Title = "the Tortured Artist";
Race = Race.Human;
BodyValue = 0x190;
Female = false;
Hue = Race.RandomSkinHue();
InitStats( 100, 100, 25 );
Utility.AssignRandomHair(this, true);
Utility.AssignRandomHair( this, true );
AddItem(new Backpack());
AddItem(new Sandals(0x72B));
AddItem(new LongPants(0x525));
AddItem(new FancyShirt(0x53F));
AddItem(new FloppyHat(0x58C));
AddItem(new BodySash(0x1C));
}
AddItem( new Backpack() );
AddItem( new Sandals( 0x72B ) );
AddItem( new LongPants( 0x525 ) );
AddItem( new FancyShirt( 0x53F ) );
AddItem( new FloppyHat( 0x58C ) );
AddItem( new BodySash( 0x1C ) );
public Emilio(Serial serial)
: base(serial)
{
}
}
public override string DefaultName => "Emilio";
public override bool IsInvulnerable => true;
public Emilio( Serial serial )
: base( serial )
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write(0); // version
}
writer.Write( (int) 0 ); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
int version = reader.ReadInt();
}
}
[QuesterName("Thalia (Nujel'm)")] // OSI's description is "Bride", not very helpful
public class Thalia : BaseCreature
{
[Constructible]
public Thalia()
: base(AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2)
{
Title = "the Bride";
Race = Race.Human;
BodyValue = 0x191;
Female = true;
Hue = Race.RandomSkinHue();
InitStats(100, 100, 25);
[QuesterName( "Thalia (Nujel'm)" )] // OSI's description is "Bride", not very helpful
public class Thalia : BaseCreature
{
public override string DefaultName => "Thalia";
public override bool IsInvulnerable => true;
Utility.AssignRandomHair(this, true);
[Constructible]
public Thalia()
: base( AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2 )
{
Title = "the Bride";
Race = Race.Human;
BodyValue = 0x191;
Female = true;
Hue = Race.RandomSkinHue();
InitStats( 100, 100, 25 );
AddItem(new Backpack());
AddItem(new Sandals(0x8FD));
AddItem(new FancyDress(0x8FD));
}
Utility.AssignRandomHair( this, true );
public Thalia(Serial serial)
: base(serial)
{
}
AddItem( new Backpack() );
AddItem( new Sandals( 0x8FD ) );
AddItem( new FancyDress( 0x8FD ) );
public override string DefaultName => "Thalia";
public override bool IsInvulnerable => true;
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
public Thalia( Serial serial )
: base( serial )
{
}
writer.Write(0); // version
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
writer.Write( (int) 0 ); // version
}
int version = reader.ReadInt();
}
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
#endregion
}
#endregion
}

View file

@ -5,81 +5,91 @@ using Server.Items;
namespace Server.Engines.MLQuests.Definitions
{
public class WarriorsOfTheGemkeeper : MLQuest
{
public override Type NextQuest => typeof( CloseEnough );
public class WarriorsOfTheGemkeeper : MLQuest
{
public WarriorsOfTheGemkeeper()
{
Activated = true;
Title = 1074536; // Warriors of the Gemkeeper
Description =
1074537; // Here we honor the Gemkeeper's Apprentice and seek to aid her efforts against the humans responsible for the death of her teacher - and the destruction of the elven way of life. Our tales speak of a fierce race of servants of the Gemkeeper, the men-bulls whose battle-skill was renowned. It is desireable to discover the fate of these noble creatures after the Rupture. Will you seek information?
RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then.
InProgressMessage =
1074540; // I care not how you get the information. Kill as many humans as you must ... but find the fate of the minotaurs. Perhaps another of the Gemkeeper's servants has the knowledge we seek.
CompletionMessage = 1074542; // What have you found?
public WarriorsOfTheGemkeeper()
{
Activated = true;
Title = 1074536; // Warriors of the Gemkeeper
Description = 1074537; // Here we honor the Gemkeeper's Apprentice and seek to aid her efforts against the humans responsible for the death of her teacher - and the destruction of the elven way of life. Our tales speak of a fierce race of servants of the Gemkeeper, the men-bulls whose battle-skill was renowned. It is desireable to discover the fate of these noble creatures after the Rupture. Will you seek information?
RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then.
InProgressMessage = 1074540; // I care not how you get the information. Kill as many humans as you must ... but find the fate of the minotaurs. Perhaps another of the Gemkeeper's servants has the knowledge we seek.
CompletionMessage = 1074542; // What have you found?
Objectives.Add(new CollectObjective(1, typeof(FragmentOfAMap), "fragment of a map"));
Objectives.Add( new CollectObjective( 1, typeof( FragmentOfAMap ), "fragment of a map" ) );
Rewards.Add(new DummyReward(1074876)); // Knowledge of the legendary minotaur.
}
Rewards.Add( new DummyReward( 1074876 ) ); // Knowledge of the legendary minotaur.
}
}
public override Type NextQuest => typeof(CloseEnough);
}
public class CloseEnough : MLQuest
{
public override Type NextQuest => typeof( TakingTheBullByTheHorns );
public override bool IsChainTriggered => true;
public class CloseEnough : MLQuest
{
public CloseEnough()
{
Activated = true;
Title = 1074544; // Close Enough
Description =
1074546; // Ah ha! You see here ... and over here ... The map fragment places the city of the bull-men, Labyrinth, on that piece of Sosaria that was thrown into the sky. Hmmm, I would have you go there and seek out these warriors to see if they might join our cause. But, legend speaks of a mighty barrier to prevent invasion of the city. Take this map to Canir and explain the problem. Perhaps she can devise a solution.
RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then.
InProgressMessage = 1074548; // Canir is nearby, run and speak with her.
CompletionMessage = 1074549; // Yes? What do you want? I'm very busy.
public CloseEnough()
{
Activated = true;
Title = 1074544; // Close Enough
Description = 1074546; // Ah ha! You see here ... and over here ... The map fragment places the city of the bull-men, Labyrinth, on that piece of Sosaria that was thrown into the sky. Hmmm, I would have you go there and seek out these warriors to see if they might join our cause. But, legend speaks of a mighty barrier to prevent invasion of the city. Take this map to Canir and explain the problem. Perhaps she can devise a solution.
RefusalMessage = 1074063; // Fine then, I'm shall find another to run my errands then.
InProgressMessage = 1074548; // Canir is nearby, run and speak with her.
CompletionMessage = 1074549; // Yes? What do you want? I'm very busy.
Objectives.Add(new DeliverObjective(typeof(FragmentOfAMapDelivery), 1, "fragment of a map", typeof(Canir)));
Objectives.Add( new DeliverObjective( typeof( FragmentOfAMapDelivery ), 1, "fragment of a map", typeof( Canir ) ) );
Rewards.Add(new DummyReward(1074876)); // Knowledge of the legendary minotaur.
}
Rewards.Add( new DummyReward( 1074876 ) ); // Knowledge of the legendary minotaur.
}
}
public override Type NextQuest => typeof(TakingTheBullByTheHorns);
public override bool IsChainTriggered => true;
}
public class TakingTheBullByTheHorns : MLQuest
{
public override Type NextQuest => typeof( EmissaryToTheMinotaur );
public override bool IsChainTriggered => true;
public class TakingTheBullByTheHorns : MLQuest
{
public TakingTheBullByTheHorns()
{
Activated = true;
Title = 1074551; // Taking the Bull by the Horns
Description =
1074553; // Interesting. I believe I have a way. I will need some materials to infuse you with the essence of a bull-man, so you can fool their defenses. The most similar beast to the original Baratarian bull that the minotaur were bred from is undoubtedly the mighty Gaman, native to the Lands of the Feudal Lords. I need horns, in great quantity to undertake this magic.
RefusalMessage = 1074554; // Oh come now, don't be afraid. The magic won't harm you.
InProgressMessage =
1074555; // I cannot grant you the ability to pass through the bull-men's defenses without the gaman horns.
CompletionMessage =
1074556; // You've returned at last! Give me just a moment to examine what you've brought and I can perform the magic that will allow you enter the Labyrinth.
public TakingTheBullByTheHorns()
{
Activated = true;
Title = 1074551; // Taking the Bull by the Horns
Description = 1074553; // Interesting. I believe I have a way. I will need some materials to infuse you with the essence of a bull-man, so you can fool their defenses. The most similar beast to the original Baratarian bull that the minotaur were bred from is undoubtedly the mighty Gaman, native to the Lands of the Feudal Lords. I need horns, in great quantity to undertake this magic.
RefusalMessage = 1074554; // Oh come now, don't be afraid. The magic won't harm you.
InProgressMessage = 1074555; // I cannot grant you the ability to pass through the bull-men's defenses without the gaman horns.
CompletionMessage = 1074556; // You've returned at last! Give me just a moment to examine what you've brought and I can perform the magic that will allow you enter the Labyrinth.
Objectives.Add(new CollectObjective(20, typeof(GamanHorns), "gaman horns"));
Objectives.Add( new CollectObjective( 20, typeof( GamanHorns ), "gaman horns" ) );
Rewards.Add(new DummyReward(1074876)); // Knowledge of the legendary minotaur.
}
Rewards.Add( new DummyReward( 1074876 ) ); // Knowledge of the legendary minotaur.
}
}
public override Type NextQuest => typeof(EmissaryToTheMinotaur);
public override bool IsChainTriggered => true;
}
public class EmissaryToTheMinotaur : MLQuest
{
public override bool IsChainTriggered => true;
public class EmissaryToTheMinotaur : MLQuest
{
public EmissaryToTheMinotaur()
{
Activated = true;
Title = 1074824; // Emissary to the Minotaur
Description =
1074825; // *whew* It is done! The fierce essence of the bull has been infused into your aura. You are able now to breach the ancient defenses of the city. Go forth and seek the minotaur -- and then return with wonderous tales and evidence of your visit to the Labyrinth.
RefusalMessage =
1074827; // As you wish. I can't understand why you'd pass up such a remarkable opportunity. Think of the adventures you would have.
InProgressMessage =
1074828; // You won't reach the minotaur city by loitering around here! What are you waiting for? You need to get to Malas and find the access point for the island. You'll be renowned for your discovery!
CompletionMessage =
1074829; // Oh! You've returned at last! I can't wait to hear the tales ... but first, let me see those artifacts. You've certainly earned this reward.
public EmissaryToTheMinotaur()
{
Activated = true;
Title = 1074824; // Emissary to the Minotaur
Description = 1074825; // *whew* It is done! The fierce essence of the bull has been infused into your aura. You are able now to breach the ancient defenses of the city. Go forth and seek the minotaur -- and then return with wonderous tales and evidence of your visit to the Labyrinth.
RefusalMessage = 1074827; // As you wish. I can't understand why you'd pass up such a remarkable opportunity. Think of the adventures you would have.
InProgressMessage = 1074828; // You won't reach the minotaur city by loitering around here! What are you waiting for? You need to get to Malas and find the access point for the island. You'll be renowned for your discovery!
CompletionMessage = 1074829; // Oh! You've returned at last! I can't wait to hear the tales ... but first, let me see those artifacts. You've certainly earned this reward.
Objectives.Add(new CollectObjective(3, typeof(MinotaurArtifact), "minotaur artifacts"));
Objectives.Add( new CollectObjective( 3, typeof( MinotaurArtifact ), "minotaur artifacts" ) );
Rewards.Add(ItemReward.Strongbox);
}
Rewards.Add( ItemReward.Strongbox );
}
}
}
public override bool IsChainTriggered => true;
}
}