Overwrite

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

View File

@@ -0,0 +1,438 @@
using Server;
using System;
using Server.Items;
using Server.Mobiles;
using Server.Services.TownCryer;
namespace Server.Engines.Quests
{
public class APleaFromMinocQuest : BaseQuest
{
/* A Plea from Minoc */
public override object Title { get { return 1158259; } }
/*The Governor of Minoc has made a plea to any and all of those willing and able to come to defense of the City.
* Cora the Sorcerers has overtaken the Dungeon Covetous and corrupted the creatures that reside within. You hear
* rumors the Governor has authorized the Sheriff of Minoc to bestow great fortune and fame to those who sacrifice
* in the name of the city.*/
public override object Description { get { return 1158260; } }
/* You decide against accepting the quest. */
public override object Refuse { get { return 1158130; } }
/* Visit the Skara Brae Ranger's Guild and participate in the Huntmaster's Challenge */
public override object Uncomplete { get { return 1158261; } }
/* You have braved the wilds of Britannia and slayed a mighty beast! You have meticulously documented your kill
* and submitted it to the Ranger's Guild for evaluation. If luck was on your side you may indeed have
* the largest quarry for the month...or maybe not. Alas, your bravery has earned you the well deserved title
* of Hunter! May you go fearlessly into the wilderness in search of your next big kill! Well done! */
public override object Complete { get { return 1158378; } }
public override int CompleteMessage { get { return 1156585; } } // You've completed a quest!
public override int AcceptSound { get { return 0x2E8; } }
public override bool DoneOnce { get { return true; } }
public APleaFromMinocQuest()
{
AddObjective(new InternalObjective());
AddReward(new BaseReward(1158262)); // A Reward Title Deed
}
public void CompleteQuest()
{
OnCompleted();
Objectives[0].CurProgress++;
TownCryerSystem.CompleteQuest(Owner, 1158275, 1158276, 0x65B);
GiveRewards();
}
private class InternalObjective : BaseObjective
{
public override object ObjectiveDescription { get { return Quest.Uncomplete; } }
public InternalObjective()
: base(1)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}
public class ClearingCovetousQuest : BaseQuest
{
/* Clearing Covetous */
public override object Title { get { return 1158263; } }
/*That's right, I'm the Sheriff of Minoc, what can I help you with citizen? What you read in the Town Cryer is true,
* Covetous has become quite dangerous. It seems a vile Sorcerers called Cora has overtaken the dungeon and corrupted
* the creatures within, binding them to her cruel rule. The Lycaeum had been trying to contain her magics within
* the dungeon with something called the "Void Pool" but the mage they sent has not been seen in quite some time.
* The place is dangerous to say the least and requires skilled combatants who will encounter greater success if
* they pool their resources. None the less, the Governor has authorized me to deputize any and all who sacrifice
* on behalf of Minoc and attempt to cleanse Covetous. As you know the mountain is a key strategic resource to
* valuable ore that is vital to Minoc's economy. Prove yourself to the City and you shall not soon be forgotten...*/
public override object Description { get { return 1158264; } }
/* You decide against accepting the quest. */
public override object Refuse { get { return 1158130; } }
/* Go to the dungeon Covetous Level 1 and defeat the creatures within! */
public override object Uncomplete { get { return 1158266; } }
/* Indeed, you have proven yourself, and with your clearing of the creatures in the upper levels of Covetous Mountain our
* miners can once again return to their normal operations, ensuring the lifeblood of our city is one again flowing. You
* are no doubt brave and strong, but your next task will test your endurance no doubt. As I said, the Lycaeum is keeping
* Cora's power at bay with something called the Void Pool. The magics prevent Cora herself from destroying it, but her
* minions are not bound by that restriction. Only blade and spell can defeat her forces as they try to destroy the Void
* Pool. Defend the Void Pool at all costs and sacrifice for Minoc. Do this and you will no doubt be remembered a hero. */
//public override object Complete { get { return 1158268; } }
public override int CompleteMessage { get { return 1158267; } } // You've cleared enough creatures to allow the miners of
// Minoc to return to their mining operations. Return to the Sheriff and report the news.
public override int AcceptSound { get { return 0x2E8; } }
public override bool DoneOnce { get { return true; } }
public ClearingCovetousQuest()
{
AddObjective(new SlayObjective(typeof(HeadlessMiner), "headless miners", 40, "Covetous"));
AddObjective(new SlayObjective(typeof(VampireMongbat), "vampire mongbats", 30, "Covetous"));
AddObjective(new SlayObjective(typeof(DazzledHarpy), "dazzled harpies", 20, "Covetous"));
AddObjective(new SlayObjective(typeof(StrangeGazer), "strange gazers", 10, "Covetous"));
AddReward(new BaseReward(1158265)); // A step closer to glory for thy deeds...
}
public override void OnCompleted()
{
base.OnCompleted();
GiveRewards();
}
/*public void CompleteChallenge()
{
OnCompleted();
Objectives[0].CurProgress++;
TownCryerSystem.CompleteQuest(Owner, 1158275, 1158276, 0x65B);
GiveRewards();
}*/
}
public class AForcedSacraficeQuest : BaseQuest
{
/* A Forced Sacrifice */
public override object Title { get { return 1158271; } }
/* Indeed, you have proven yourself, and with your clearing of the creatures in the upper levels of Covetous Mountain our
* miners can once again return to their normal operations, ensuring the lifeblood of our city is one again flowing. You
* are no doubt brave and strong, but your next task will test your endurance no doubt. As I said, the Lycaeum is keeping
* Cora's power at bay with something called the Void Pool. The magics prevent Cora herself from destroying it, but her
* minions are not bound by that restriction. Only blade and spell can defeat her forces as they try to destroy the Void
* Pool. Defend the Void Pool at all costs and sacrifice for Minoc. Do this and you will no doubt be remembered a hero. */
public override object Description { get { return 1158268; } }
/* You decide against accepting the quest. */
public override object Refuse { get { return 1158130; } }
/* Go to the Void Pool located in Level 2 of Covetous and defend it from Cora's armies! */
public override object Uncomplete { get { return 1158269; } }
//public override object Complete { get { return 1158268; } }
/*You have defended the void pool until your last breath, your sacrifice for Minoc will not be soon forgotten! Return to
* the Sheriff of Minoc and report the news!*/
public override int CompleteMessage { get { return 1158270; } }
public override int AcceptSound { get { return 0x2E8; } }
public override bool DoneOnce { get { return true; } }
public AForcedSacraficeQuest()
{
AddObjective(new InternalObjective());
AddReward(new BaseReward(1158265)); // A step closer to glory for thy deeds...
}
public void CompleteQuest()
{
OnCompleted();
Objectives[0].CurProgress++;
GiveRewards();
}
private class InternalObjective : BaseObjective
{
public override object ObjectiveDescription { get { return Quest.Uncomplete; } }
public InternalObjective()
: base(1)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}
public class AForcedSacraficeQuest2 : BaseQuest
{
/* A Forced Sacrifice */
public override object Title { get { return 1158271; } }
/* Despite your failure in protecting the void pool, your efforts have allowed the mages of the Lycaeum to use their
* magics and bind the void pool in an infinite time loop, forever sealing Cora within the dungeon. This is only a
* stopgap measure, however, and Cora cannot be allowed to continue her twisted craft. Now comes the ultimate test,
* you must venture to the deepest level of Dungeon Covetous and slay Cora. It is the only way. Take this, it is all
* the city can offer you in an effort to slay Cora. The City is counting on you. */
public override object Description { get { return 1158272; } }
/* You decide against accepting the quest. */
public override object Refuse { get { return 1158130; } }
/* Go to the furthest depths of Covetous and slay Cora! */
public override object Uncomplete { get { return 1158273; } }
/*You have slayed the vile sorceress Cora! A powerful mage as she was, her armies will no doubt attempt
* to resurrect their general - for now though Minoc is safe. The economic future of Minoc has been
* secured and for your efforts you are hereby bestowed a great honor!*/
public override object Complete { get { return 1158281; } }
/*You have slayed the sorceress Cora! Return to the Sheriff of Minoc and report the news!*/
public override int CompleteMessage { get { return 1158274; } }
public override int AcceptSound { get { return 0x2E8; } }
public override bool DoneOnce { get { return true; } }
public AForcedSacraficeQuest2()
{
AddObjective(new SlayObjective(typeof(CoraTheSorceress), "Cora the Sorcerer", 1, "Covetous"));
AddReward(new BaseReward(typeof(HeroOfMincRewardTitleDeed), 1158139)); // A Reward Title Deed
}
public override void OnAccept()
{
base.OnAccept();
if (QuestHelper.TryReceiveQuestItem(Owner, typeof(MysteriousPotion), TimeSpan.FromDays(3)))
{
Owner.AddToBackpack(new MysteriousPotion());
}
}
public void CompleteQuest()
{
TownCryerSystem.CompleteQuest(Owner, 1158280, 1158281, 0x623);
GiveRewards();
Server.Engines.Points.PointsSystem.VoidPool.AwardPoints(Owner, 2000, false, false);
Owner.SendLocalizedMessage(1158282); // For your accomplishments you have been awarded a bonus 2000 Covetous points! Visit Vela in the Town of Cove to redeem them!
}
}
public class SheriffOfMinoc : MondainQuester
{
public override Type[] Quests { get { return new Type[] { typeof(ToolsOfTheTradeQuest) }; } }
public static SheriffOfMinoc TramInstance { get; set; }
public static SheriffOfMinoc FelInstance { get; set; }
public static void Initialize()
{
if (Core.TOL)
{
if (TramInstance == null)
{
TramInstance = new SheriffOfMinoc();
TramInstance.MoveToWorld(new Point3D(2462, 439, 15), Map.Trammel);
TramInstance.Direction = Direction.South;
}
if (FelInstance == null)
{
FelInstance = new SheriffOfMinoc();
FelInstance.MoveToWorld(new Point3D(2462, 439, 15), Map.Felucca);
FelInstance.Direction = Direction.South;
}
}
}
public SheriffOfMinoc()
: base(NameList.RandomName("male"), "the Sheriff of Minoc")
{
}
public override void InitBody()
{
InitStats(100, 100, 25);
Female = false;
CantWalk = true;
Body = 0x190;
Hue = Race.RandomSkinHue();
HairItemID = 0;
FacialHairItemID = 0x2041;
FacialHairHue = Race.RandomHairHue();
}
public override void InitOutfit()
{
AddItem(new Backpack());
SetWearable(new ChainCoif());
SetWearable(new ChainChest());
SetWearable(new ChainLegs());
SetWearable(new Boots(), 2012);
SetWearable(new FancyKilt(), 2012);
SetWearable(new RingmailGloves());
SetWearable(new BodySash(), 43);
}
public override void OnDoubleClick(Mobile m)
{
if (m is PlayerMobile)
{
var pm = m as PlayerMobile;
if (QuestHelper.CheckDoneOnce(pm, typeof(APleaFromMinocQuest), this, false))
{
if (CheckProgress(pm))
{
return;
}
AForcedSacraficeQuest2 quest = QuestHelper.GetQuest<AForcedSacraficeQuest2>(pm);
if (quest != null && quest.Completed)
{
quest.CompleteQuest();
return;
}
BaseQuest q = QuestHelper.RandomQuest(pm, new Type[] { typeof(ClearingCovetousQuest) }, this, false);
if (q == null)
{
q = QuestHelper.RandomQuest(pm, new Type[] { typeof(AForcedSacraficeQuest) }, this, false);
if (q == null)
{
q = QuestHelper.RandomQuest(pm, new Type[] { typeof(AForcedSacraficeQuest2) }, this, false);
}
}
if (q != null)
{
pm.CloseGump(typeof(MondainQuestGump));
pm.SendGump(new MondainQuestGump(q));
}
else
{
SayTo(m, 1080107, 0x3B2); // I'm sorry, I have nothing for you at this time.
}
}
else
{
SayTo(m, 1080107, 0x3B2); // I'm sorry, I have nothing for you at this time.
}
}
}
public override void OnMovement(Mobile m, Point3D oldLocation)
{
if (m is PlayerMobile && InRange(m.Location, 5) && !InRange(oldLocation, 5))
{
APleaFromMinocQuest quest = QuestHelper.GetQuest<APleaFromMinocQuest>((PlayerMobile)m);
if (quest != null)
{
quest.CompleteQuest();
}
}
}
private bool CheckProgress(PlayerMobile pm)
{
foreach (var t in _Quests)
{
var quest = QuestHelper.GetQuest(pm, t);
if (quest != null && !quest.Completed)
{
pm.CloseGump(typeof(MondainQuestGump));
pm.SendGump(new MondainQuestGump(quest, MondainQuestGump.Section.InProgress, false));
return true;
}
}
return false;
}
private Type[] _Quests = { typeof(ClearingCovetousQuest), typeof(AForcedSacraficeQuest), typeof(AForcedSacraficeQuest2) };
public SheriffOfMinoc(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
if (Map == Map.Trammel)
{
TramInstance = this;
}
if (Map == Map.Felucca)
{
FelInstance = this;
}
if (!Core.TOL)
{
Delete();
}
}
}
}

View File

@@ -0,0 +1,83 @@
using Server;
using System;
using Server.Items;
using Server.Mobiles;
using Server.Services.TownCryer;
namespace Server.Engines.Quests
{
public class AVisitToCastleBlackthornQuest : BaseQuest
{
private object _Title = 1158197;
/* A Visit to Castle Blackthorn */
public override object Title { get { return _Title; } }
/*It seems that Castle Blackthorn has some secrets that are worth investigating. Your history on how Blackthorn even became
* king is a little fuzzy. You decide a visit to Castle Blackthorn would be worthwhile.*/
public override object Description { get { return 1158198; } }
/* You decide against accepting the quest. */
public override object Refuse { get { return 1158130; } }
/* Visit Castle Blackthorn in Northern Britain. */
public override object Uncomplete { get { return 1158199; } }
/* As you cross the bridge Blackthorn's massive castle towers up from the terrain it sits atop. The jet-black stone of her walls
* are foreboding, yet invite your curiosity. Your eyes scan the courtyard and fixate on an incredibly handsome man. You've never
* seen such beauty and style! Their exquisitely apportioned jester suit perfectly toes the line between comedic expression and
* fashion. His hat is masterfully crafted with golden bells matching radiant jewelry that jingles as he swigs from a bottle.
* You decide to follow the jester, who is no doubt headed for the castle bar. */
public override object Complete { get { return 1158203; } }
public override int CompleteMessage { get { return 1156585; } } // You've completed a quest!
public override int AcceptSound { get { return 0x2E8; } }
public override bool DoneOnce { get { return true; } }
public AVisitToCastleBlackthornQuest()
{
AddObjective(new InternalObjective());
AddReward(new BaseReward(1158200)); // A step closer to understanding the history of Blackthorn's Rise to the Throne.
}
public static void CheckLocation(PlayerMobile pm, Point3D oldLocation)
{
var quest = QuestHelper.GetQuest<AVisitToCastleBlackthornQuest>(pm);
if (quest != null)
{
quest.OnCompleted();
TownCryerSystem.CompleteQuest(quest.Owner, 1158202, quest.Complete, 0x61B);
quest.Objectives[0].CurProgress++;
quest.GiveRewards();
}
}
private class InternalObjective : BaseObjective
{
public override object ObjectiveDescription { get { return Quest.Uncomplete; } }
public InternalObjective()
: base(1)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}
}

View File

@@ -0,0 +1,524 @@
using Server;
using System;
using Server.Items;
using Server.Mobiles;
using Server.Services.TownCryer;
using Server.Gumps;
namespace Server.Engines.Quests
{
public class BuriedRichesQuest : BaseQuest
{
/* Buried Riches */
public override object Title { get { return 1158230; } }
/*Treasure Hunting sure does sound like an interesting profession! Think of the riches to be found! You'd have everything
* you've ever dreamed of! The Town Cryer article is fairly vague, however you have heard whispers of a mapmaker in Vesper
* at the Majestic Boat who may know a thing or two about decoding treasure maps.*/
public override object Description { get { return 1158223; } }
/* You decide against accepting the quest. */
public override object Refuse { get { return 1158130; } }
/* Visit the Skara Brae Ranger's Guild and participate in the Huntmaster's Challenge */
public override object Uncomplete { get { return 1158231; } }
/*The Cartographer seems busy at her desk pouring over stacks of rolled parchment. You decide to break the
* silence with courteous *Ahem**/
public override object Complete { get { return 1158226; } }
public override int CompleteMessage { get { return 1156585; } } // You've completed a quest!
public override int AcceptSound { get { return 0x2E8; } }
public override bool DoneOnce { get { return true; } }
public BuriedRichesQuest()
{
AddObjective(new InternalObjective());
AddReward(new BaseReward(1158224)); // A step closer to becoming a treasure hunter.
}
public void CompleteQuest()
{
OnCompleted();
Objectives[0].CurProgress++;
TownCryerSystem.CompleteQuest(Owner, 1158225, Complete, 0x614);
GiveRewards();
}
private class InternalObjective : BaseObjective
{
public override object ObjectiveDescription { get { return 1158231; } } // Visit the Legendary Cartographer at the The Majestic Boat in Vesper.
public InternalObjective()
: base(1)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}
public class ToolsOfTheTradeQuest : BaseQuest
{
/* Tools of the Trade */
public override object Title { get { return 1158232; } }
/*A treasure seeker then? There is no telling the lengths someone will go to protect their most prized possessions. Over
* time maps to certain treasure troves have been found and their bounties recovered. The bounty within a treasure chest
* is directly related to the difficulty of deciphering the map and overcoming the protections of the chest itself.
* Cartographers use a variety of terms to describe the difficulty of a map that is drawn. This includes maps that are
* plainly, expertly, adeptly, cleverly, deviously, ingeniously, and diabolically drawn. Even the most basically trained
* cartographer can decode a plainly drawn map. Beyond that, however, some training in cartography is required. Once
* deciphered, the cartographer must find the location within the world and use a digging tool, such as a pickaxe or shovel
* to dig up the chest. Those skilled at mining will have a much easier time finding the chest, but it is not a requirement.
* The chest will be no doubt locked and trapped, so some skill with lockpicking and trap removal is suggested, although
* mages skilled enough may use magical means to unlock and untrap lower end treasure chests. Finally, the chest is likely
* to be guarded by a variety of creatures that will attempt to defend the treasure at all costs. Combat skills are imperative
* to dispatch those creatures safely! Sounds like a challenge? Well it can be, but alas it is also incredibly rewarding and
* you will have a much easier time of it if you recruit other adventures into your budding treasure seeking business. Alas,
* here's a map I had lying around. You can visit the Adventurer's Supplies just on the mainland of Vesper to get some basic
* supplies.*/
public override object Description { get { return 1158227; } }
/* You decide against accepting the quest. */
public override object Refuse { get { return 1158130; } }
/* Visit the Adventurer's Supplies in Northern Vesper, just across the bridge, and speak to the Master Provisioner
* to get some basic treasure hunting equipment. */
public override object Uncomplete { get { return 1158228; } }
/*The Adventurer's Supplies is a large provisioner with many different types of adventuring equipment available for purchase.
* You spot the shopkeeper the Cartographer described and approach with a friendly greeting!*/
public override object Complete { get { return 1158233; } }
public override int CompleteMessage { get { return 1156585; } } // You've completed a quest!
public override int AcceptSound { get { return 0x2E8; } }
public override bool DoneOnce { get { return true; } }
public ToolsOfTheTradeQuest()
{
AddObjective(new InternalObjective());
AddReward(new BaseReward(1158224)); // A step closer to becoming a treasure hunter.
}
public override void OnAccept()
{
base.OnAccept();
if (QuestHelper.TryReceiveQuestItem(Owner, typeof(BuriedRichesTreasureMap), TimeSpan.FromDays(7)))
{
Owner.AddToBackpack(new BuriedRichesTreasureMap(0));
}
}
public void CompleteQuest()
{
OnCompleted();
Objectives[0].CurProgress++;
TownCryerSystem.CompleteQuest(Owner, 1016275, Complete, 0x619);
GiveRewards();
}
private class InternalObjective : BaseObjective
{
public override object ObjectiveDescription { get { return 1158228; } } // Visit the Adventurer's Supplies in Northern Vesper, just across the bridge, and speak to the Master Provisioner to get some basic treasure hunting equipment.
public InternalObjective()
: base(1)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}
public class TheTreasureChaseQuest : BaseQuest
{
/* The Treasure Chase */
public override object Title { get { return 1158239; } }
/*Finest provisions in all of Britannia! Right here! *The Provisioner looks you up and down* I've seen your kind before -
* I know that look! You're a treasure seeker! I take it you spoke to the Cartographer then? Of course you have, why else
* would you be visiting Britannia's premiere outfitter of Treasure Hunting supplies! I trust you will be most successful
* with treasure hunting so I'll kit you out with basic supplies free of charge - just remember me when you've become a
* famous treasure hunter!*/
public override object Description { get { return 1158365; } }
/* You decide against accepting the quest. */
public override object Refuse { get { return 1158130; } }
/* Use the book "Treasure Hunting: A Practical Approach" to help you decode the treasure maps you have been given and those
* that you find during your adventure and use the information contained within the text to aid you in your quest.*/
public override object Uncomplete { get { return 1158238; } }
/*The Adventurer's Supplies is a large provisioner with many different types of adventuring equipment available for purchase.
* You spot the shopkeeper the Cartographer described and approach with a friendly greeting!*/
public override object Complete { get { return 1158233; } }
public override int CompleteMessage { get { return 1158247; } } //You have found the final zealot treasure! There are no doubt riches to be had within! Your experience has earned you a
// reward title that has been placed in your backpack.
public override int AcceptSound { get { return 0x2E8; } }
public override bool DoneOnce { get { return true; } }
public TheTreasureChaseQuest()
{
AddObjective(new InternalObjective());
AddReward(new BaseReward(typeof(TreasureHunterRewardTitleDeed), 1158237)); // Treasure!
}
public override void OnAccept()
{
base.OnAccept();
if (QuestHelper.TryReceiveQuestItem(Owner, typeof(TreasureHuntingBook), TimeSpan.FromDays(7)))
{
var chest = new WoodenChest();
chest.DropItem(new TreasureHuntingBook());
var heals = new GreaterHealPotion();
heals.Amount = 10;
chest.DropItem(heals);
var scrolls = new TelekinisisScroll();
scrolls.Amount = 20;
chest.DropItem(scrolls);
chest.DropItem(new Pickaxe());
chest.DropItem(new TreasureSeekersLockpick());
Owner.Backpack.DropItem(chest);
}
}
public override bool RenderObjective(MondainQuestGump g, bool offer)
{
if (offer)
g.AddHtmlLocalized(130, 45, 270, 16, 1049010, 0xFFFFFF, false, false); // Quest Offer
else
g.AddHtmlLocalized(130, 45, 270, 16, 1046026, 0xFFFFFF, false, false); // Quest Log
g.AddButton(130, 430, 0x2EEF, 0x2EF1, (int)Buttons.PreviousPage, GumpButtonType.Reply, 0);
g.AddButton(275, 430, 0x2EE9, 0x2EEB, (int)Buttons.NextPage, GumpButtonType.Reply, 0);
g.AddHtmlObject(160, 70, 200, 40, Title, BaseQuestGump.DarkGreen, false, false);
g.AddHtmlLocalized(98, 140, 312, 16, 1049073, 0x2710, false, false); // Objective:
g.AddHtmlLocalized(98, 156, 312, 16, 1072208, 0x2710, false, false); // All of the following
g.AddHtmlLocalized(98, 172, 312, 83, 1158234, BaseQuestGump.LightGreen, false, false);
/* Find the location marked on the Treasure Map given to you by the Cartographer and use the supplies the Provisioner
* gave you to recover the treasure.*/
g.AddHtmlLocalized(98, 255, 312, 40, 1158235, BaseQuestGump.LightGreen, false, false);
//Expand your experience as a Treasure Hunter to an Expertly Drawn Map.
g.AddHtmlLocalized(98, 335, 312, 40, 1158236, BaseQuestGump.LightGreen, false, false);
// Complete your experience as a Treasure Hunter by discovering the final treasure hoard.
return true;
}
public void CompleteQuest()
{
OnCompleted();
Objectives[0].CurProgress++;
TownCryerSystem.CompleteQuest(Owner, 1158239, 1158249, 0x655);
/*Another rusted chest emerges from the broken ground at your feet! As you pry it open the brilliant
* shimmer of gold and jewels catches your eye. This map too is highly decorated with ancient runic
* text and marks another location for the hoard. You notice the magical creatures guarding the previous
* hoard were more challenging than the first, and you expect that trend to continue. With greater
* difficulty comes greater reward! On the reverse of the map is a short hand-written note,<br><br><i>For
* those who will come long after and discover this treasure, know you will never truly discover the
* extent of our wealth. If you posses this map you no doubt have some connection to our society, which
* has survived generation after generation. Use this wealth for what we have used it for, to be virtuous
* and good throughout Sosaria...</i><br><br>The note is very cryptic about the origins of these zealots
* and their beliefs, but from what you can gleam they are a long gone organization who's values were
* that of virtue and good. You are warmed by this altruistic purpose and decide to use your wealth to
* promote their cause throughout the realm as you search for other treasures.*/
GiveRewards();
}
private class InternalObjective : BaseObjective
{
public override object ObjectiveDescription { get { return 1158231; } } // Visit the Legendary Cartographer at the The Majestic Boat in Vesper.
public InternalObjective()
: base(1)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}
public class LegendaryCartographer : MondainQuester
{
public override Type[] Quests { get { return new Type[] { typeof(ToolsOfTheTradeQuest) }; } }
public static LegendaryCartographer TramInstance { get; set; }
public static LegendaryCartographer FelInstance { get; set; }
public static void Initialize()
{
if (Core.TOL)
{
if (TramInstance == null)
{
TramInstance = new LegendaryCartographer();
TramInstance.MoveToWorld(new Point3D(3005, 811, 0), Map.Trammel);
TramInstance.Direction = Direction.West;
}
if (FelInstance == null)
{
FelInstance = new LegendaryCartographer();
FelInstance.MoveToWorld(new Point3D(3005, 811, 0), Map.Felucca);
FelInstance.Direction = Direction.West;
}
}
}
public LegendaryCartographer()
: base(NameList.RandomName("female"), "the Legendary Cartographer")
{
}
public override void InitBody()
{
InitStats(100, 100, 25);
Female = true;
CantWalk = true;
Body = 0x191;
Hue = Race.RandomSkinHue();
HairItemID = 0x2045;
HairHue = 0x8A8;
}
public override void InitOutfit()
{
AddItem(new Backpack());
SetWearable(new Doublet());
SetWearable(new Kilt(), 443);
SetWearable(new ThighBoots(), 1837);
}
public override void OnDoubleClick(Mobile m)
{
if (m is PlayerMobile && !QuestHelper.CheckDoneOnce((PlayerMobile)m, typeof(ToolsOfTheTradeQuest), this, false))
{
m.SendLocalizedMessage(1080107); // I'm sorry, I have nothing for you at this time.
}
else
{
base.OnDoubleClick(m);
}
}
public override void OnMovement(Mobile m, Point3D oldLocation)
{
if (m is PlayerMobile && InRange(m.Location, 5) && !InRange(oldLocation, 5))
{
BuriedRichesQuest quest = QuestHelper.GetQuest<BuriedRichesQuest>((PlayerMobile)m);
if (quest != null)
{
quest.CompleteQuest();
}
}
}
public LegendaryCartographer(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
if (Map == Map.Trammel)
{
TramInstance = this;
}
if (Map == Map.Felucca)
{
FelInstance = this;
}
if(!Core.TOL)
{
Delete();
}
}
}
public class MasterProvisioner : MondainQuester
{
public override Type[] Quests { get { return new Type[] { typeof(TheTreasureChaseQuest) }; } }
public static MasterProvisioner TramInstance { get; set; }
public static MasterProvisioner FelInstance { get; set; }
public static void Initialize()
{
if (Core.TOL)
{
if (TramInstance == null)
{
TramInstance = new MasterProvisioner();
TramInstance.MoveToWorld(new Point3D(2989, 636, 0), Map.Trammel);
TramInstance.Direction = Direction.West;
}
if (FelInstance == null)
{
FelInstance = new MasterProvisioner();
FelInstance.MoveToWorld(new Point3D(2989, 636, 0), Map.Felucca);
FelInstance.Direction = Direction.West;
}
}
}
public MasterProvisioner()
: base(NameList.RandomName("male"), "the Master Provisioner")
{
}
public override void InitBody()
{
InitStats(100, 100, 25);
Female = false;
CantWalk = true;
Body = 0x190;
Hue = Race.RandomSkinHue();
}
public override void InitOutfit()
{
AddItem(new Backpack());
SetWearable(new FancyShirt());
SetWearable(new JinBaori());
SetWearable(new Kilt());
SetWearable(new ThighBoots(), 1908);
SetWearable(new GoldNecklace());
}
public override void OnDoubleClick(Mobile m)
{
if (m is PlayerMobile && QuestHelper.CheckDoneOnce((PlayerMobile)m, typeof(TheTreasureChaseQuest), this, false))
{
m.SendLocalizedMessage(1080107); // I'm sorry, I have nothing for you at this time.
}
else
{
base.OnDoubleClick(m);
}
}
public override void OnMovement(Mobile m, Point3D oldLocation)
{
if (m is PlayerMobile && InRange(m.Location, 5) && !InRange(oldLocation, 5))
{
ToolsOfTheTradeQuest quest = QuestHelper.GetQuest<ToolsOfTheTradeQuest>((PlayerMobile)m);
if (quest != null)
{
quest.CompleteQuest();
}
}
}
public MasterProvisioner(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
if (Map == Map.Trammel)
{
TramInstance = this;
}
if (Map == Map.Felucca)
{
FelInstance = this;
}
if (!Core.TOL)
{
Delete();
}
}
}
}

View File

@@ -0,0 +1,70 @@
using Server;
using System;
using Server.Items;
using Server.Services.TownCryer;
namespace Server.Engines.Quests
{
public class ExploringTheDeepQuest : BaseQuest
{
/* Exploring the Deep */
public override object Title { get { return 1154327; } }
/*The life of a Shipwreck Salvager does seem exciting! Visiting Hepler Paulson at the Sons of the Sea in the
* City of Trinsic is certainly to be an adventure!*/
public override object Description { get { return 1158127; } }
/* You decide against accepting the quest. */
public override object Refuse { get { return 1158130; } }
/* Speak to Hepler Paulson at the Sons of the Sea in Trinsic and complete the Exploring the Deep Quest. */
public override object Uncomplete { get { return 1158131; } }
/* You have discovered the secrets of the Wreck of the Ararat and aided in binding the Shadowlords to their tomb within!*/
public override object Complete { get { return 1158136; } }
public override int CompleteMessage { get { return 1156585; } } // You've completed a quest!
public override int AcceptSound { get { return 0x2E8; } }
public override bool DoneOnce { get { return true; } }
public ExploringTheDeepQuest()
{
AddObjective(new InternalObjective());
AddReward(new BaseReward(typeof(ExploringTheDeedTitleDeed), 1158142)); // Uncovering the secrets of the deep...
}
public void CompleteQuest()
{
OnCompleted();
Objectives[0].CurProgress++;
TownCryerSystem.CompleteQuest(Owner, this);
GiveRewards();
}
private class InternalObjective : BaseObjective
{
public override object ObjectiveDescription { get { return Quest.Uncomplete; } }
public InternalObjective()
: base(1)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}
}

View File

@@ -0,0 +1,73 @@
using Server;
using System;
using Server.Items;
using Server.Services.TownCryer;
namespace Server.Engines.Quests
{
public class HuntmastersChallengeQuest : BaseQuest
{
/* Huntmaster's Challenge */
public override object Title { get { return 1155726; } }
/*Each month the Ranger's Guild in Skara Brae hosts a contest to see who can hunt Britannia's
* largest creatures! Visit the Skara Brae Ranger's Guild to learn more!*/
public override object Description { get { return 1158132; } }
/* You decide against accepting the quest. */
public override object Refuse { get { return 1158130; } }
/* Visit the Skara Brae Ranger's Guild and participate in the Huntmaster's Challenge */
public override object Uncomplete { get { return 1158133; } }
/* You have braved the wilds of Britannia and slayed a mighty beast! You have meticulously documented your kill
* and submitted it to the Ranger's Guild for evaluation. If luck was on your side you may indeed have
* the largest quarry for the month...or maybe not. Alas, your bravery has earned you the well deserved title
* of Hunter! May you go fearlessly into the wilderness in search of your next big kill! Well done! */
public override object Complete { get { return 1158378; } }
public override int CompleteMessage { get { return 1156585; } } // You've completed a quest!
public override int AcceptSound { get { return 0x2E8; } }
public override bool DoneOnce { get { return true; } }
public HuntmastersChallengeQuest()
{
AddObjective(new InternalObjective());
AddReward(new BaseReward(typeof(HuntmastersQuestRewardTitleDeed), 1158139)); // A Reward Title Deed
}
public void CompleteChallenge()
{
OnCompleted();
Objectives[0].CurProgress++;
TownCryerSystem.CompleteQuest(Owner, this);
GiveRewards();
}
private class InternalObjective : BaseObjective
{
public override object ObjectiveDescription { get { return Quest.Uncomplete; } }
public InternalObjective()
: base(1)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}
}

View File

@@ -0,0 +1,252 @@
using Server;
using System;
using Server.Items;
using Server.Mobiles;
using Server.Services.TownCryer;
namespace Server.Engines.Quests
{
public class PaladinsOfTrinsic : BaseQuest
{
public override QuestChain ChainID{get {return QuestChain.PaladinsOfTrinsic; } }
public override Type NextQuest { get { return typeof(PaladinsOfTrinsic2); } }
/* The Paladins of Trinsic */
public override object Title { get { return 1158093; } }
/*It seems the Paladins of Trinsic are working hard to see the threats of Shame are kept inside Shame,
* perhaps it would be a good idea to visit their headquarters in Northeast Trinsic.*/
public override object Description { get { return 1158114; } }
/* You decide against accepting the quest. */
public override object Refuse { get { return 1158130; } }
/* Find the Lord Commander of the Paladins of Trinsic. */
public override object Uncomplete { get { return 1158117; } }
/*You have proven yourself honorable and the Lord Commander has invited you to join the elite order of the Paladin of Trinsic!
* Congratulations, Paladin!*/
public override object Complete { get { return 1158317; } }
public override int CompleteMessage { get { return 1156585; } } // You've completed a quest!
public override int AcceptSound { get { return 0x2E8; } }
public override bool DoneOnce { get { return true; } }
public PaladinsOfTrinsic()
{
AddObjective(new InternalObjective());
AddReward(new BaseReward(1158120)); // A unique opportunity to join the Paladins of Trinsic.
}
private class InternalObjective : BaseObjective
{
public override object ObjectiveDescription { get { return Quest.Uncomplete; } }
public InternalObjective()
: base(1)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}
public class PaladinsOfTrinsic2 : BaseQuest
{
public override QuestChain ChainID { get { return QuestChain.PaladinsOfTrinsic; } }
/* The Paladins of Trinsic */
public override object Title { get { return 1158093; } }
/*Another who wishes to walk the path of the Paladins of Trinsic? Well you should know the path is not an easy one to walk,
* and only those with the courage to pursue truth are admitted to the order. If you prove you are honorable, then you shall
* join our ranks and gain the prestigious title of Paladin of Trinsic. We are bound by Honor, and thus we stand against
* Shame! To prove yourself you must venture deep within the dungeon Shame and slay the vile within. Succeed in this task
* and you will prove your worth, fail and you will bring to your name what you hope to defeat - Shame.*/
public override object Description { get { return 1158096; } }
/* The way of the Paladin is not for everyone, I understand your decision but hope you reconsider... */
public override object Refuse { get { return 1158102; } }
/* Go to the dungeon Shame and slay the creatures within, only then will you have the Honor of calling thyself a Paladin of
* Trinsic. */
public override object Uncomplete { get { return 1158105; } }
/*You have proven yourself honorable and the Lord Commander has invited you to join the elite order of the Paladin of Trinsic!
* Congratulations, Paladin!*/
public override object Complete { get { return 1158317; } }
public override int AcceptSound { get { return 0x2E8; } }
public override bool DoneOnce { get { return true; } }
public override int CompleteMessage { get { return 1158108; } }
public bool SentMessage { get; set; }
public PaladinsOfTrinsic2()
{
AddObjective(new SlayObjective(typeof(QuartzElemental), "quartz elemental", 1, "Shame"));
AddObjective(new SlayObjective(typeof(FlameElemental), "flame elemental", 1, "Shame"));
AddObjective(new SlayObjective(typeof(WindElemental), "wind elemental", 1, "Shame"));
AddObjective(new SlayObjective(typeof(UnboundEnergyVortex), "unbound energy vortex", 1, "Shame"));
AddReward(new BaseReward(typeof(PaladinOfTrinsicRewardTitleDeed), 1158099)); // Becoming a Paladin of Trinsic
}
public void CompleteQuest()
{
TownCryerSystem.CompleteQuest(Owner, new PaladinsOfTrinsic());
OnCompleted();
GiveRewards();
QuestHelper.Delay(Owner, typeof(PaladinsOfTrinsic), RestartDelay);
}
}
public class Morz : MondainQuester
{
public override Type[] Quests { get { return new Type[] { typeof(PaladinsOfTrinsic) }; } }
public static Morz TramInstance { get; set; }
public static Morz FelInstance { get; set; }
public static void Initialize()
{
if (Core.TOL)
{
if (TramInstance == null)
{
TramInstance = new Morz();
TramInstance.MoveToWorld(new Point3D(2018, 2745, 30), Map.Trammel);
TramInstance.Direction = Direction.South;
}
if (FelInstance == null)
{
FelInstance = new Morz();
FelInstance.MoveToWorld(new Point3D(2018, 2745, 30), Map.Felucca);
FelInstance.Direction = Direction.South;
}
}
}
public Morz()
: base("Morz", "the Lord Commander")
{
}
public override void InitBody()
{
InitStats(100, 100, 25);
Female = false;
CantWalk = true;
Body = 0x190;
Hue = Race.RandomSkinHue();
HairItemID = 0;
FacialHairItemID = 0x204D;
}
public override void InitOutfit()
{
AddItem(new Backpack());
SetWearable(new PlateChest(), 0x8A5);
SetWearable(new PlateLegs(), 0x8A5);
SetWearable(new PlateArms(), 0x8A5);
SetWearable(new PlateGloves(), 0x8A5);
SetWearable(new BodySash(), 1158);
SetWearable(new Cloak(), 1158);
}
public override void OnDoubleClick(Mobile m)
{
if (m is PlayerMobile && m.InRange(Location, 5))
{
PaladinsOfTrinsic quest = QuestHelper.GetQuest((PlayerMobile)m, typeof(PaladinsOfTrinsic)) as PaladinsOfTrinsic;
if (quest != null)
{
quest.GiveRewards();
}
else
{
PaladinsOfTrinsic2 quest2 = QuestHelper.GetQuest((PlayerMobile)m, typeof(PaladinsOfTrinsic2)) as PaladinsOfTrinsic2;
if (quest2 != null)
{
if (quest2.Completed)
{
quest2.CompleteQuest();
}
else
{
m.SendGump(new MondainQuestGump(quest2, MondainQuestGump.Section.InProgress, false));
quest2.InProgress();
}
}
}
}
}
public override void OnMovement(Mobile m, Point3D oldLocation)
{
if(m is PlayerMobile && InRange(m.Location, 5) && !InRange(oldLocation, 5))
{
PaladinsOfTrinsic2 quest = QuestHelper.GetQuest<PaladinsOfTrinsic2>((PlayerMobile)m);
if(quest != null && !quest.SentMessage && quest.Completed)
{
m.SendLocalizedMessage(1158111); // You have proven yourself Honorable, the Lord Commander looks overjoyed as you approach him triumphantly! Speak to him to claim your reward!
quest.SentMessage = true;
}
}
}
public Morz(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
if (Map == Map.Trammel)
{
TramInstance = this;
}
else if (Map == Map.Felucca)
{
FelInstance = this;
}
if (!Core.TOL)
Delete();
}
}
}

View File

@@ -0,0 +1,604 @@
using Server;
using System;
using Server.Items;
using Server.Mobiles;
using Server.Engines.Quests;
using Server.Network;
using Server.Gumps;
using Server.Services.TownCryer;
namespace Server.Engines.Quests
{
public class RoyalBritannianGuardOrders : BaseJournal
{
public override TextDefinition Title { get { return 1158159; } } // Royal Britannian Guard Orders
public override TextDefinition Body { get { return 1158160; } }
/*ROYAL BRITANNIAN GUARD<br>MINISTRY OF PRISONS DETACHMENT<br><br>ORIGINAL ORDERS<br>ROYAL BRITANNIAN GUARD<br>WRONG PRISON
* DIVISION<br><br>From: COMMAND, RBG Yew<br>To: Lieutenant Bennet Yardley, RBG Yew<br><br>Subject: Wrong Prison Treasure
* Expedition<br><br>1. RBG Intelligence has indicated the presence of highly prized cache of weapons stashed within the
* deepest confinements of the Prison Dungeon Wrong. Intelligence indicates these weapons were confiscated at the time of
* various assassination attempts among the prisoners before the prison was lost.<br><br>2. Official cover story remains in
* place - no outside interference expected and only official RBG personnel are permitted entry.<br><br>3. Interview with
* former prison officials indicate weapons under heavy lock and key, suggest specialist assignment of lock picking skills
* and tools.<br><br>*The remainder of the document is illegible**/
public override int LabelNumber { get { return 1158171; } } // orders
[Constructable]
public RoyalBritannianGuardOrders()
{
LootType = LootType.Blessed;
}
public RoyalBritannianGuardOrders(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int v = reader.ReadInt();
}
}
public class CorpseOfBennetYardley : Item, IConditionalVisibility
{
public static CorpseOfBennetYardley TramInstance { get; set; }
public static CorpseOfBennetYardley FelInstance { get; set; }
public static void Initialize()
{
if (Core.TOL)
{
if (TramInstance == null)
{
TramInstance = new CorpseOfBennetYardley();
TramInstance.MoveToWorld(new Point3D(5688, 653, 0), Map.Trammel);
}
if (FelInstance == null)
{
FelInstance = new CorpseOfBennetYardley();
FelInstance.MoveToWorld(new Point3D(5688, 653, 0), Map.Felucca);
}
}
}
public override bool ForceShowProperties { get { return true; } }
public override int LabelNumber { get { return 1158168; } }
public CorpseOfBennetYardley()
: base(Utility.Random(0xECA, 9))
{
Movable = false;
}
public bool CanBeSeenBy(PlayerMobile pm)
{
if (pm.AccessLevel > AccessLevel.Player)
return true;
var quest = QuestHelper.GetQuest<RightingWrongQuest4>(pm);
return quest != null && !quest.Completed;
}
public override void OnDoubleClick(Mobile from)
{
if (from is PlayerMobile && from.InRange(Location, 2))
{
var quest = QuestHelper.GetQuest<RightingWrongQuest4>((PlayerMobile)from);
if (from is PlayerMobile && quest != null && !quest.Completed)
{
quest.Objectives[0].CurProgress++;
quest.OnCompleted();
Visible = false;
Visible = true;
}
}
}
public CorpseOfBennetYardley(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int v = reader.ReadInt();
if (Map == Map.Trammel)
{
TramInstance = this;
}
else if (Map == Map.Felucca)
{
FelInstance = this;
}
if (!Core.TOL)
Delete();
}
}
public class TreasureHuntingBook : Item
{
[Constructable]
public TreasureHuntingBook()
: base(0xFBE)
{
LootType = LootType.Blessed;
}
public override void OnDoubleClick(Mobile m)
{
if (m is PlayerMobile && IsChildOf(m.Backpack))
{
m.CloseGump(typeof(InternalGump));
BaseGump.SendGump(new InternalGump((PlayerMobile)m));
}
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
list.Add(1158253); // Treasure Hunting: A Practical Approach
list.Add(1154760, "#1158254"); // By: Vespyr Jones
}
public class InternalGump : BaseGump
{
public InternalGump(PlayerMobile pm)
: base(pm, 10, 10)
{
}
public override void AddGumpLayout()
{
AddImage(0, 0, 0x761C);
AddImage(112, 40, 0x655);
AddHtmlLocalized(113, 350, 342, 280, 1158255, C32216(0x080808), false, true);
}
}
public TreasureHuntingBook(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int v = reader.ReadInt();
}
}
public class BuriedRichesTreasureMap : TreasureMap
{
public TreasureMapChest Chest { get; set; }
public BuriedRichesTreasureMap(int level)
: base(level, Map.Trammel)
{
LootType = LootType.Blessed;
}
public override void Decode(Mobile from)
{
if (QuestHelper.HasQuest<TheTreasureChaseQuest>((PlayerMobile)from))
{
from.CheckSkill(SkillName.Cartography, 0, 100);
Decoder = from;
DisplayTo(from);
from.SendLocalizedMessage(1158243); // Your time studying Treasure Hunting: A Practical Approach helps you decode the map...
}
else
{
from.PrivateOverheadMessage(MessageType.Regular, 0x21, 1157850, from.NetState); // *You don't make anything of it.*
//m.PrivateOverheadMessage(MessageType.Regular, 1154, 1158244, m.NetState); // *You decide to visit the Provisioner at the Adventurer's Supplies in Vesper before trying to decode the map...*
}
}
public override void DisplayTo(Mobile m)
{
base.DisplayTo(m);
m.PlaySound(0x41A);
m.PrivateOverheadMessage(MessageType.Regular, 1154, 1157722, "Cartography", m.NetState); // *Your proficiency in ~1_SKILL~ reveals more about the item*
if (m is PlayerMobile && Level == 0)
{
m.CloseGump(typeof(InternalGump));
BaseGump.SendGump(new InternalGump((PlayerMobile)m, this));
}
}
public override void OnChestOpened(Mobile from, TreasureMapChest chest)
{
if (from is PlayerMobile)
{
var quest = QuestHelper.GetQuest<TheTreasureChaseQuest>((PlayerMobile)from);
if (quest != null)
{
if (Level == 0)
{
TownCryerSystem.CompleteQuest((PlayerMobile)from, 1158239, 1158251, 0x655);
/*Your eyes widen as you pry open the old chest and reveal the treasure within! Even this small cache
* excites you as the thought of bigger and better treasure looms on the horizon! The map is covered
* in ancient runes and marks the location of another treasure hoard. You carefully furl the map and
* set off on your next adventure!*/
from.SendLocalizedMessage(1158245, "", 0x23); // You have found the first zealot treasure! As you dig up the chest a leather bound case appears to contain an additional map. You place it in your backpack for later examination.
chest.DropItem(new BuriedRichesTreasureMap(1));
}
else
{
from.SendLocalizedMessage(1158246, "", 0x23); // You have found the second zealot treasure! As you dig up the chest a leather bound case appears to contain an additional map. You place it in your backpack for later examination.
quest.CompleteQuest();
}
}
}
}
public override void OnBeginDig(Mobile from)
{
if (Completed)
{
from.SendLocalizedMessage(503028); // The treasure for this map has already been found.
}
else if (Decoder != from)
{
from.SendLocalizedMessage(503031); // You did not decode this map and have no clue where to look for the treasure.
}
else if (!from.CanBeginAction(typeof(TreasureMap)))
{
from.SendLocalizedMessage(503020); // You are already digging treasure.
}
else if (from.Map != Facet)
{
from.SendLocalizedMessage(1010479); // You seem to be in the right place, but may be on the wrong facet!
}
else if (from is PlayerMobile && !QuestHelper.HasQuest<TheTreasureChaseQuest>((PlayerMobile)from))
{
from.SendLocalizedMessage(1158257); // You must be on the "The Treasure Chase" quest offered via the Town Cryer to dig up this treasure.
}
else
{
from.SendLocalizedMessage(503033); // Where do you wish to dig?
from.Target = new TreasureMap.DigTarget(this);
}
}
protected override bool HasRequiredSkill(Mobile from)
{
return true;
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
if (Level == 0)
{
list.Add(1158229); // A mysterious treasure map personally given to you by the Legendary Cartographer in Vesper
}
else
{
list.Add(1158256); // A mysterious treasure map recovered from a treasure hoard
}
}
private class InternalGump : BaseGump
{
public BuriedRichesTreasureMap Map { get; set; }
public InternalGump(PlayerMobile pm, BuriedRichesTreasureMap map)
: base(pm, 10, 10)
{
Map = map;
}
public override void AddGumpLayout()
{
AddBackground(0, 0, 454, 400, 9380);
AddHtmlLocalized(177, 53, 235, 20, CenterLoc, "#1158240", C32216(0xA52A2A), false, false); // A Mysterious Treasure Map
AddHtmlLocalized(177, 80, 235, 40, CenterLoc, Map.Level == 0 ? "#1158241" : "#1158250", C32216(0xA52A2A), false, false); // Given to you by the Master Cartographer
/*The Cartographer has given you a mysterious treasure map and offered you some tips on how to go about
* recovering the treasure. As the Cartographer leaned in and handed you the furled parchment, she told
* you of the origins of this mysterious document. "Legend has it..." she tells you, "this map is the
* lost treasure of an ancient Sosarian Order of Zealots. I'm told over the centuries they would bury
* small portions of their treasure throughout the Britannian countryside in an effort to thwart any
* attempts to recover the hoard in its entirety." Your eyes widen at the thought of a massive treasure
* hoard and you can't wait to find it!*/
AddHtmlLocalized(177, 122, 235, 228, 1158242, true, true);
AddItem(85, 120, 0x14EB, 0);
}
}
public BuriedRichesTreasureMap(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
writer.Write(Chest);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int v = reader.ReadInt();
Chest = reader.ReadItem() as TreasureMapChest;
}
}
public class TreasureSeekersLockpick : Lockpick
{
public override int LabelNumber { get { return 1158258; } }
public TreasureSeekersLockpick()
{
ItemID = 0x14FD;
}
protected override void BeginLockpick(Mobile from, ILockpickable item)
{
if (from is PlayerMobile &&
item.Locked &&
QuestHelper.HasQuest<TheTreasureChaseQuest>((PlayerMobile)from) &&
item is TreasureMapChest &&
((TreasureMapChest)item).TreasureMap is BuriedRichesTreasureMap)
{
var chest = (TreasureMapChest)item;
from.PlaySound(0x241);
Timer.DelayCall(TimeSpan.FromMilliseconds(200), () =>
{
if (item.Locked && from.InRange(chest.GetWorldLocation(), 1))
{
from.CheckTargetSkill(SkillName.Lockpicking, item, 0, 100);
// Success! Pick the lock!
from.PrivateOverheadMessage(MessageType.Regular, 1154, 1158252, from.NetState); // *Your recent study of Treasure Hunting helps you pick the lock...*
chest.SendLocalizedMessageTo(from, 502076); // The lock quickly yields to your skill.
from.PlaySound(0x4A);
item.LockPick(from);
}
});
}
else
{
base.BeginLockpick(from, item);
}
}
public TreasureSeekersLockpick(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int v = reader.ReadInt();
}
}
public class MysteriousPotion : Item
{
public override int LabelNumber { get { return 1158286; } } // A Mysterious Potion
public MysteriousPotion()
: base(0xF06)
{
}
public override void OnDoubleClick(Mobile m)
{
if (m is PlayerMobile)
{
var pm = m as PlayerMobile;
if (QuestHelper.HasQuest<AForcedSacraficeQuest2>(pm))
{
if (!TownCryerSystem.UnderMysteriousPotionEffects(pm))
{
pm.SendGump(new ConfirmCallbackGump(pm, 1158286, 1158287, null, null, confirm: (mob, o) =>
{
TownCryerSystem.AddMysteriousPotionEffects(mob);
mob.FixedParticles(0x376A, 9, 32, 5007, EffectLayer.Waist);
mob.PlaySound(0x1E3);
BasePotion.PlayDrinkEffect(mob);
Delete();
}));
}
else
{
pm.SendLocalizedMessage(1158289); // You have already used this.
}
}
else
{
pm.SendLocalizedMessage(1158285); // You must be on the "A Forced Sacrifice" quest to use this item.
}
}
}
public MysteriousPotion(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int v = reader.ReadInt();
}
}
public class PaladinCorpse : Container
{
public static PaladinCorpse TramInstance { get; set; }
public static PaladinCorpse FelInstance { get; set; }
public static void Initialize()
{
if (Core.TOL)
{
if (TramInstance == null)
{
TramInstance = new PaladinCorpse();
TramInstance.MoveToWorld(new Point3D(5396, 118, 0), Map.Trammel);
}
if (FelInstance == null)
{
FelInstance = new PaladinCorpse();
FelInstance.MoveToWorld(new Point3D(5396, 118, 0), Map.Felucca);
}
}
}
public override int LabelNumber { get { return 1158135; } } // the remains of a would-be paladin
public override bool HandlesOnMovement { get { return true; } }
public override bool IsDecoContainer { get { return false; } }
public PaladinCorpse()
: base(0x9F1E)
{
DropItem(new WouldBePaladinChronicles());
}
public override void OnMovement(Mobile m, Point3D oldLocation)
{
if (InRange(m.Location, 2) && !InRange(oldLocation, 2))
{
PrivateOverheadMessage(Server.Network.MessageType.Regular, 1154, 1158137, m.NetState); // *You notice the skeleton clutching a small journal...*
}
}
public PaladinCorpse(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int v = reader.ReadInt();
if (Map == Map.Trammel)
{
TramInstance = this;
}
else if (Map == Map.Felucca)
{
FelInstance = this;
}
if (!Core.TOL)
Delete();
}
}
public class WouldBePaladinChronicles : BaseJournal
{
public override int LabelNumber { get { return 1094837; } } // a journal
public override TextDefinition Title { get { return null; } }
public override TextDefinition Body { get { return 1158138; } }
/**the text is mostly a journal chronicling the adventures of a man who wished to join the Paladins of Trinsic.
* Of particular note is the final entry...*<br><br>This is the most shameful entry I will write...for I have fallen
* short of my goal. My only hope is my failures will serve to assist those who come after me with the courage to
* pursue the truth, and with my notes they will find success. I have found strange crystals on the corpses of the
* creatures I slay here. When I touch the crystal, I can feel it absorbed into my being. A growing voice inside me
* compels me to altars located throughout the dungeon. When the voice within grew loud enough I could no longer
* ignore it, I touched my hand to the altar and before me a grand champion stood! I was quick to react to the
* crushing blow my newly summoned opponent sought to deliver, and I was victorious! Alas, the deeper into the
* dungeon I explored, the more powerful the altar champions become and now I find myself in this dire situation....
* To anyone who reads this...do me the honor and defeat the three champions and slay the unbound energy vortexes that
* inhabit the deepest depths of this place...for I feel my time here is shor...*/
public WouldBePaladinChronicles()
{
Movable = false;
}
public override void OnDoubleClick(Mobile m)
{
m.SendGump(new BaseJournalGump(Title, Body));
}
public WouldBePaladinChronicles(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int v = reader.ReadInt();
}
}
}

View File

@@ -0,0 +1,194 @@
using Server;
using System;
namespace Server.Items
{
public class HuntmastersQuestRewardTitleDeed : BaseRewardTitleDeed
{
public override TextDefinition Title { get { return new TextDefinition(1158140); } } // Hunter
[Constructable]
public HuntmastersQuestRewardTitleDeed()
{
}
public HuntmastersQuestRewardTitleDeed(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int v = reader.ReadInt();
}
}
public class PaladinOfTrinsicRewardTitleDeed : BaseRewardTitleDeed
{
public override TextDefinition Title { get { return new TextDefinition(1158090); } } // Paladin of Trinsic
[Constructable]
public PaladinOfTrinsicRewardTitleDeed()
{
}
public PaladinOfTrinsicRewardTitleDeed(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int v = reader.ReadInt();
}
}
public class RightingWrongRewardTitleDeed : BaseRewardTitleDeed
{
public override TextDefinition Title { get { return new TextDefinition(1158161); } } // Warden of Wrong
[Constructable]
public RightingWrongRewardTitleDeed()
{
}
public RightingWrongRewardTitleDeed(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int v = reader.ReadInt();
}
}
public class TreasureHunterRewardTitleDeed : BaseRewardTitleDeed
{
public override TextDefinition Title { get { return new TextDefinition(1158389); } } // Treasure Hunter
[Constructable]
public TreasureHunterRewardTitleDeed()
{
}
public TreasureHunterRewardTitleDeed(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int v = reader.ReadInt();
}
}
public class HeroOfMincRewardTitleDeed : BaseRewardTitleDeed
{
public override TextDefinition Title { get { return new TextDefinition(1158278); } } // Hero of Minoc
[Constructable]
public HeroOfMincRewardTitleDeed()
{
}
public HeroOfMincRewardTitleDeed(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int v = reader.ReadInt();
}
}
public class DespiseTitleDeed : BaseRewardTitleDeed
{
public override TextDefinition Title { get { return new TextDefinition(1158303); } } // The Battle of Wisps TODO: Correct cliloc
[Constructable]
public DespiseTitleDeed()
{
}
public DespiseTitleDeed(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int v = reader.ReadInt();
}
}
public class ExploringTheDeedTitleDeed : BaseRewardTitleDeed
{
public override TextDefinition Title { get { return new TextDefinition(1154505); } } // Salvager of the Deep
[Constructable]
public ExploringTheDeedTitleDeed()
{
}
public ExploringTheDeedTitleDeed(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int v = reader.ReadInt();
}
}
}

View File

@@ -0,0 +1,388 @@
using Server;
using System;
using Server.Items;
using Server.Mobiles;
using Server.Services.TownCryer;
namespace Server.Engines.Quests
{
public class RightingWrongQuest : BaseQuest
{
/* Righting Wrong */
public override object Title { get { return 1158150; } }
/*The situation at the Prison Dungeon Wrong seems to have gotten out of control. The article mentioned the Royal
* Britannian' Guard has started contracting adventuring groups to handle the situation. Perhaps it would be
* prudent to inquire about opportunities with the Guard at the Court of Truth in Yew.*/
public override object Description { get { return 1158151; } }
/* You decide against accepting the quest. */
public override object Refuse { get { return 1158130; } }
/* Inquire about the events at Wrong with the Royal Britannian Guard at the Court of Truth in Yew. */
public override object Uncomplete { get { return 1158152; } }
public override object Complete { get { return 1158170; } }
/*You have brought Justice to the forgotten prison dungeon Wrong! The Royal Britannian Guard thanks you for your service,
* and for not leaving the Lieutenant behind. You fought bravely this day and escaped the prison. As a thank you for your
* service, and a testament to your accomplishment, you have been granted the title Warden of Wrong!*/
public override int CompleteMessage { get { return 1158291; } } // You've found the Royal Guard Captain! Speak to him to learn more!
public override int AcceptSound { get { return 0x2E8; } }
public override bool DoneOnce { get { return true; } }
public RightingWrongQuest()
{
AddObjective(new InternalObjective());
AddReward(new BaseReward(1158153)); // A unique opportunity with the Royal Britannian Guard
}
public override void GiveRewards()
{
base.GiveRewards();
QuestHelper.Delay(Owner, typeof(RightingWrongQuest), RestartDelay);
}
private class InternalObjective : BaseObjective
{
public override object ObjectiveDescription { get { return Quest.Uncomplete; } }
public InternalObjective()
: base(1)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}
public class RightingWrongQuest2 : BaseQuest
{
public override QuestChain ChainID { get { return QuestChain.RightingWrong; } }
public override Type NextQuest { get { return typeof(RightingWrongQuest3); } }
/* Righting Wrong */
public override object Title { get { return 1158150; } }
/*Another wanna-be guardsman expecting to wrangle this mess? You should know that inside Wrong there are many terrors.
* Lizardman have squatted in the entire prison, eaten most of the prisoners and staff. The few staff that are left have
* gone mad. If you expect to make it as a Guardsman you are going to need to thin out the heard. Head inside and kill
* the creatures within!*/
public override object Description { get { return 1158155; } }
/* You decide against accepting the quest. */
public override object Refuse { get { return 1158130; } }
/* Go inside the prison dungeon Wrong and slay the creatures within! */
public override object Uncomplete { get { return 1158156; } }
/* Well then, I guess you aren't as useless as you look. Made quick work of the Lizards, that's fine work indeed!
* Your next test is going to require you travel deeper into the prison. Seems there is an ogre who has taken to mastering
* his cooking skills at the expense of the former prisoners. The Guard can't have that, so you need to go in there and make
* sure this cook is prepping his last meal! */
public override object Complete { get { return 1158157; } }
public override int AcceptSound { get { return 0x2E8; } }
public override bool DoneOnce { get { return true; } }
public RightingWrongQuest2()
{
AddObjective(new SlayObjective(typeof(LizardmanDefender), "lizardman defenders", 5));
AddObjective(new SlayObjective(typeof(LizardmanSquatter), "lizardman squatters", 5));
AddObjective(new SlayObjective(typeof(CaveTrollWrong), "cave trolls", 5));
AddObjective(new SlayObjective(typeof(HungryOgre), "hungry ogres", 5));
AddReward(new BaseReward(1158167)); // A step closer to righting Wrong
}
}
public class RightingWrongQuest3 : BaseQuest
{
public override QuestChain ChainID { get { return QuestChain.RightingWrong; } }
public override Type NextQuest { get { return typeof(RightingWrongQuest4); } }
/* Righting Wrong */
public override object Title { get { return 1158150; } }
/* Well then, I guess you aren't as useless as you look. Made quick work of the Lizards, that's fine work indeed!
* Your next test is going to require you travel deeper into the prison. Seems there is an ogre who has taken to mastering
* his cooking skills at the expense of the former prisoners. The Guard can't have that, so you need to go in there and make
* sure this cook is prepping his last meal! */
public override object Description { get { return 1158157; } }
/* You decide against accepting the quest. */
public override object Refuse { get { return 1158130; } }
/* Go inside the prison dungeon Wrong and slay Fezzik the Ogre Cook */
public override object Uncomplete { get { return 1158158; } }
/* Looks like Fezzik won't be making anymore stew! Hah! Well done! Your final task is going to require you to learn the
* most important lesson of being a Guardsman - we never leave a man behind. One of our comrades was captured by the
* demonic jailers and taken to the prison. You need to get yourself captured by the jailers and taken inside the deepest
* part of the prison. Once inside, find our fallen comrade and escape. Here's a copy of his orders to help you find his corpse. */
public override object Complete { get { return 1158163; } }
//public override int CompleteMessage { get { return 1158291; } } // You've found the Royal Guard Captain! Speak to him to learn more!
public override int AcceptSound { get { return 0x2E8; } }
public RightingWrongQuest3()
{
AddObjective(new SlayObjective(typeof(Fezzik), "fezzik the ogre cook", 1));
AddReward(new BaseReward(1158167)); // A step closer to righting Wrong
}
}
public class RightingWrongQuest4 : BaseQuest
{
public override QuestChain ChainID { get { return QuestChain.RightingWrong; } }
private RoyalBritannianGuardOrders Orders { get; set; }
/* Righting Wrong */
public override object Title { get { return 1158150; } }
/* Looks like Fezzik won't be making anymore stew! Hah! Well done! Your final task is going to require you to learn the
* most important lesson of being a Guardsman - we never leave a man behind. One of our comrades was captured by the
* demonic jailers and taken to the prison. You need to get yourself captured by the jailers and taken inside the deepest
* part of the prison. Once inside, find our fallen comrade and escape. Here's a copy of his orders to help you find his corpse. */
public override object Description { get { return 1158163; } }
/* You decide against accepting the quest. */
public override object Refuse { get { return 1158130; } }
/* Go inside the prison dungeon Wrong and get yourself captured by the Demonic Jailors. Once inside, find the fallen Guard and escape
* with his corpse. */
public override object Uncomplete { get { return 1158166; } }
/* You have brought Justice to the forgotten prison dungeon Wrong! The Royal Britannian Guard thanks you for your service,
* and for not leaving the Lieutenant behind. You fought bravely this day and escaped the prison. As a thank you for your
* service, and a testament to your accomplishment, you have been granted the title Warden of Wrong! */
public override object Complete { get { return 1158170; } }
public override int CompleteMessage { get { return 1158169; } }
/*You have found the corpse of Lieutenant Bennet Yardley of the Royal Britannian Guard. Unfortunately, it seems there
* is not much left to return to the Field Commander. Regardless, you hold back your urge to become sick and gather his
* remains. Escape the prison and return to the Field Commander.*/
public override int AcceptSound { get { return 0x2E8; } }
public RightingWrongQuest4()
{
AddObjective(new InternalObjective());
AddReward(new BaseReward(typeof(RightingWrongRewardTitleDeed), 1158165)); // A Unique Honor from the Royal Britannian Guard
}
public override void OnAccept()
{
base.OnAccept();
Orders = new RoyalBritannianGuardOrders();
Owner.Backpack.DropItem(Orders);
Owner.SendLocalizedMessage(1154489); // You received a Quest Item!
}
public void CompleteQuest()
{
TownCryerSystem.CompleteQuest(Owner, new RightingWrongQuest());
OnCompleted();
GiveRewards();
QuestHelper.Delay(Owner, typeof(RightingWrongQuest2), RestartDelay);
}
public override void RemoveQuest(bool removeChain)
{
base.RemoveQuest(removeChain);
if (Orders != null && !Orders.Deleted)
{
Orders.Delete();
}
}
private class InternalObjective : BaseObjective
{
public override object ObjectiveDescription { get { return 1158164; } } // Find the fallen Guard's corpse and escape the prison.
public InternalObjective()
: base(1)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
writer.Write(Orders);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
Orders = reader.ReadItem() as RoyalBritannianGuardOrders;
}
}
public class Arnold : MondainQuester
{
public override Type[] Quests { get { return new Type[] { typeof(RightingWrongQuest2) }; } }
public static Arnold TramInstance { get; set; }
public static Arnold FelInstance { get; set; }
public static void Initialize()
{
if (Core.TOL)
{
if (TramInstance == null)
{
TramInstance = new Arnold();
TramInstance.MoveToWorld(new Point3D(363, 913, 0), Map.Trammel);
TramInstance.Direction = Direction.East;
}
if (FelInstance == null)
{
FelInstance = new Arnold();
FelInstance.MoveToWorld(new Point3D(363, 913, 0), Map.Felucca);
FelInstance.Direction = Direction.East;
}
}
}
public Arnold()
: base("Arnold", "the Royal Britannian Guard")
{
}
public override void InitBody()
{
InitStats(100, 100, 25);
Female = false;
CantWalk = true;
Body = 0x190;
Hue = Race.RandomSkinHue();
HairItemID = 0x203C;
FacialHairItemID = 0x204C;
HairHue = 0x8A8;
FacialHairHue = 0x8A8;
}
public override void InitOutfit()
{
AddItem(new Backpack());
SetWearable(new ChainChest());
SetWearable(new ThighBoots());
SetWearable(new BodySash(), 1157);
SetWearable(new Epaulette(), 1157);
SetWearable(new ChaosShield());
SetWearable(new Broadsword());
}
public override void OnDoubleClick(Mobile m)
{
if (m is PlayerMobile && m.InRange(Location, 5))
{
RightingWrongQuest4 quest = QuestHelper.GetQuest<RightingWrongQuest4>((PlayerMobile)m);
if (quest != null && quest.Completed)
{
quest.CompleteQuest();
}
else
{
base.OnDoubleClick(m);
}
}
}
public override void OnMovement(Mobile m, Point3D oldLocation)
{
if (m is PlayerMobile && InRange(m.Location, 5) && !InRange(oldLocation, 5))
{
RightingWrongQuest quest = QuestHelper.GetQuest<RightingWrongQuest>((PlayerMobile)m);
if (quest != null)
{
quest.OnCompleted();
quest.GiveRewards();
}
}
}
public Arnold(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
if (Map == Map.Trammel)
{
TramInstance = this;
}
else if (Map == Map.Felucca)
{
FelInstance = this;
}
if (!Core.TOL)
Delete();
}
}
}

View File

@@ -0,0 +1,186 @@
using Server;
using System;
using Server.Items;
using Server.Mobiles;
using Server.Engines.Points;
using Server.Services.TownCryer;
using Server.Gumps;
namespace Server.Engines.Quests
{
public class WishesOfTheWispQuest : BaseQuest
{
/*Wishes of Wisps*/
public override object Title { get { return 1158296; } }
/*The story of the brothers Andros and Adrian is troubling, yet fascinates you. You have heard rumor of items
* traded by the mysterious wisps. Despite the dangers you decide you should venture to the dungeon Despise.*/
public override object Description { get { return 1158318; } }
/* You decide against accepting the quest. */
public override object Refuse { get { return 1158130; } }
/* Visit the Dungeon Despise and investigate. */
public override object Uncomplete { get { return 1158297; } }
//public override object Complete { get { return 1158378; } }
public override int CompleteMessage { get { return 1156585; } } // You've completed a quest!
public override int AcceptSound { get { return 0x2E8; } }
public override bool DoneOnce { get { return true; } }
public WishesOfTheWispQuest()
{
AddObjective(new InternalObjective());
AddReward(new BaseReward(1158298)); // A step closer to understanding what happened at Despise
}
public void CompleteQuest()
{
OnCompleted();
Objectives[0].CurProgress++;
TownCryerSystem.CompleteQuest(Owner, 1153468, 1158309, 0x65C);
GiveRewards();
}
private class InternalObjective : BaseObjective
{
public override object ObjectiveDescription { get { return Quest.Uncomplete; } }
public InternalObjective()
: base(1)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}
public class WhisperingWithWispsQuest : BaseQuest
{
/*Whispering with Wisps*/
public override object Title { get { return 1158300; } }
/*The mysterious wisp seems friendly. You are taken by the mysterious creature and it's iridescent glow. The wisp directs
* you inside the dungeon, but otherwise does not respond to your presence. You feel guided by your karma. Entering the
* dungeon with negative karma will draw you to the depths of despise while entering with positive karma will draw you up
* into the peaceful glades above. You have learned from the wisp you must venture inside the dungeon and seek an Ankh.*/
public override object Description { get { return 1158301; } }
/* You decide against accepting the quest. */
public override object Refuse { get { return 1158130; } }
/* Enter the appropriate level of despise based on your karma. Once inside, find and use an ankh. */
public override object Uncomplete { get { return 1158302; } }
/*You have successfully freed Despise from the eternal feud between Andros and Adrian. Despite your efforts, you no doubt
* believe their strong magics will compel them to battle once again. You rejoice, however, in your small albeit short
* lived victory! The wisp seems eternally grateful and grants you a generous gift!*/
public override object Complete { get { return 1158323; } }
public override int CompleteMessage { get { return 1158322; } }
// You have successfully slayed the brother and freed Despise from their eternal feud! Return to the Wisp outside the dungeon to claim your reward!
public override int AcceptSound { get { return 0x2E8; } }
public override bool DoneOnce { get { return true; } }
public WhisperingWithWispsQuest()
{
AddObjective(new InternalObjective());
AddReward(new BaseReward(typeof(DespiseTitleDeed), 1158139));
}
public override bool RenderObjective(MondainQuestGump g, bool offer)
{
if (offer)
g.AddHtmlLocalized(130, 45, 270, 16, 1049010, 0xFFFFFF, false, false); // Quest Offer
else
g.AddHtmlLocalized(130, 45, 270, 16, 1046026, 0xFFFFFF, false, false); // Quest Log
g.AddButton(130, 430, 0x2EEF, 0x2EF1, (int)Buttons.PreviousPage, GumpButtonType.Reply, 0);
g.AddButton(275, 430, 0x2EE9, 0x2EEB, (int)Buttons.NextPage, GumpButtonType.Reply, 0);
g.AddHtmlObject(160, 70, 200, 40, Title, BaseQuestGump.DarkGreen, false, false);
g.AddHtmlLocalized(98, 140, 312, 16, 1049073, 0x2710, false, false); // Objective:
g.AddHtmlLocalized(98, 156, 312, 16, 1072208, 0x2710, false, false); // All of the following
g.AddHtmlLocalized(98, 172, 312, 83, 1158302, BaseQuestGump.LightGreen, false, false);
/* Enter the appropriate level of despise based on your karma. Once inside, find and use an ankh.*/
g.AddHtmlLocalized(98, 255, 312, 40, 1158305, BaseQuestGump.LightGreen, false, false);
//Using your wisp, posses a creature within the dungeon.
g.AddHtmlLocalized(98, 335, 312, 40, 1158306, BaseQuestGump.LightGreen, false, false);
// Defeat Andros or Adrian in the depths of Despise.
return true;
}
public static void OnBossSlain(Server.Engines.Despise.DespiseBoss boss)
{
foreach (var ds in boss.GetLootingRights())
{
if(ds.m_Mobile is PlayerMobile)
{
var pm = ds.m_Mobile as PlayerMobile;
var quest = QuestHelper.GetQuest<WhisperingWithWispsQuest>(pm);
if(quest != null && !quest.Completed)
{
quest.Objectives[0].CurProgress++;
quest.OnCompleted();
}
}
}
}
public void CompleteQuest()
{
TownCryerSystem.CompleteQuest(Owner, 1158303, 1158323, 0x650);
GiveRewards();
Owner.SendLocalizedMessage(1158326); // For your accomplishments you have been awarded a bonus 1000 Despise points! Trade with the wisp to redeem them!
Server.Engines.Points.PointsSystem.DespiseCrystals.AwardPoints(Owner, 1000, false, false);
}
private class InternalObjective : BaseObjective
{
public override object ObjectiveDescription { get { return Quest.Uncomplete; } }
public InternalObjective()
: base(1)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}
}