Overwrite
Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
This commit is contained in:
@@ -0,0 +1,583 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
using Server;
|
||||
using Server.Mobiles;
|
||||
using Server.Items;
|
||||
using Server.Gumps;
|
||||
using Server.Engines.Points;
|
||||
using Server.Engines.Quests;
|
||||
|
||||
namespace Server.Engines.Khaldun
|
||||
{
|
||||
public class GoingGumshoeQuest : BaseQuest
|
||||
{
|
||||
public override bool DoneOnce { get { return true; } }
|
||||
|
||||
/* Going Gumshoe */
|
||||
public override object Title { get { return 1158588; } }
|
||||
|
||||
/*You've heard rumblings of Pagan Cultists causing petty crimes in the more upscale sections of Britannia's cities,
|
||||
* but to your understanding these are sympathizers taking advantage of fear to make some easy coin. Still, if the
|
||||
* Crown is rolling out a new division of the RBG to investigate...something...you bet there's an opportunity for
|
||||
* you! You should find Inspector Jasper and inquire further.*/
|
||||
public override object Description { get { return 1158589; } }
|
||||
|
||||
/* You decide against accepting the quest. */
|
||||
public override object Refuse { get { return 1158130; } }
|
||||
|
||||
/* Find Inspector Jasper, and inquire about the Town Cryer article at the new Detective Branch in East Britain */
|
||||
public override object Uncomplete { get { return 1158590; } }
|
||||
|
||||
public override object Complete { get { return null; } }
|
||||
|
||||
public override int AcceptSound { get { return 0x2E8; } }
|
||||
public override int CompleteMessage { get { return 1158616; } } // // You've found Chief Inspector Jasper! Speak to him to learn more!
|
||||
|
||||
public GoingGumshoeQuest()
|
||||
{
|
||||
AddReward(new BaseReward(1158615)); // A unique opportunity with the Detective Branch
|
||||
|
||||
AddObjective(new InternalObjective());
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
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 GoingGumshoeQuest2 : BaseQuest
|
||||
{
|
||||
public override bool DoneOnce { get { return true; } }
|
||||
|
||||
/* Going Gumshoe */
|
||||
public override object Title { get { return 1158588; } }
|
||||
|
||||
/*You can drop the coffee pods with the investigators outside...*looks up*...oh, you aren't here for the delivery? I warned
|
||||
* them talking with reporters was a terrible idea - we've been getting walk-ins like you since the article broke, lads
|
||||
* and ladies thinking they can become renowned detectives - Ha! Think you've got the intellect? The cunning and wisdom
|
||||
* to sniff a case where it leads you? Well I guess we'll see about that. I've got bigger cases to deal with, you can
|
||||
* take this one. Something about vandalism and a funeral at the Britain Cemetery. Report back to me if you find anything
|
||||
* worthwhile - and I do mean worthwhile! Don't come back to me with half baked theories and bogus evidence. I need facts!
|
||||
* Oh - and read this, you'll need it if you even hope to break a single case.*/
|
||||
public override object Description { get { return 1158592; } }
|
||||
|
||||
/* You decide against accepting the quest. */
|
||||
public override object Refuse { get { return 1158130; } }
|
||||
|
||||
/*What are you still doing here? Didn't I send you to the cemetery? */
|
||||
public override object Uncomplete { get { return 1158594; } }
|
||||
|
||||
public override object Complete { get { return null; } }
|
||||
|
||||
public override int AcceptSound { get { return 0x2E8; } }
|
||||
public override int CompleteMessage { get { return 1158595; } } // TOIDO: This
|
||||
|
||||
// Note to whoever reads this: This is stupid but I find no easier way to do this...
|
||||
public bool VisitedHeastone1 { get; set; }
|
||||
public bool VisitedHeastone2 { get; set; }
|
||||
public bool VisitedHeastone3 { get; set; }
|
||||
public bool VisitedHeastone4 { get; set; }
|
||||
|
||||
public bool ClueBook1_1 { get; set; }
|
||||
public bool ClueBook1_2 { get; set; }
|
||||
public bool ClueDust1 { get; set; }
|
||||
|
||||
public bool ClueBook2_1 { get; set; }
|
||||
public bool ClueBook2_2 { get; set; }
|
||||
public bool ClueDust2 { get; set; }
|
||||
|
||||
public bool ClueBook3_1 { get; set; }
|
||||
public bool ClueBook3_2 { get; set; }
|
||||
public bool ClueDust3 { get; set; }
|
||||
|
||||
public bool ClueBook4_1 { get; set; }
|
||||
public bool ClueBook4_2 { get; set; }
|
||||
public bool ClueDust4 { get; set; }
|
||||
|
||||
public bool IsComplete
|
||||
{
|
||||
get
|
||||
{
|
||||
return ClueBook1_1 && ClueBook1_2 && ClueDust1 &&
|
||||
ClueBook2_1 && ClueBook2_2 && ClueDust2 &&
|
||||
ClueBook3_1 && ClueBook3_2 && ClueDust3 &&
|
||||
ClueBook4_1 && ClueBook4_2 && ClueDust4;
|
||||
}
|
||||
}
|
||||
|
||||
public GoingGumshoeQuest2()
|
||||
{
|
||||
AddReward(new BaseReward(1158615)); // A unique opportunity with the Detective Branch
|
||||
|
||||
AddObjective(new InternalObjective());
|
||||
}
|
||||
|
||||
public override void OnAccept()
|
||||
{
|
||||
base.OnAccept();
|
||||
|
||||
Item book = new DetectiveBook();
|
||||
|
||||
if (Owner.Backpack == null || !Owner.Backpack.TryDropItem(Owner, book, false))
|
||||
{
|
||||
Owner.BankBox.DropItem(book);
|
||||
}
|
||||
}
|
||||
|
||||
public override void Serialize(GenericWriter writer)
|
||||
{
|
||||
base.Serialize(writer);
|
||||
|
||||
writer.Write((int)0); // version
|
||||
|
||||
writer.Write(VisitedHeastone1);
|
||||
writer.Write(VisitedHeastone2);
|
||||
writer.Write(VisitedHeastone3);
|
||||
writer.Write(VisitedHeastone4);
|
||||
|
||||
writer.Write(ClueBook1_1);
|
||||
writer.Write(ClueBook1_2);
|
||||
writer.Write(ClueDust1);
|
||||
|
||||
writer.Write(ClueBook2_1);
|
||||
writer.Write(ClueBook2_2);
|
||||
writer.Write(ClueDust2);
|
||||
|
||||
writer.Write(ClueBook3_1);
|
||||
writer.Write(ClueBook3_2);
|
||||
writer.Write(ClueDust3);
|
||||
|
||||
writer.Write(ClueBook4_1);
|
||||
writer.Write(ClueBook4_2);
|
||||
writer.Write(ClueDust4);
|
||||
}
|
||||
|
||||
public override void Deserialize(GenericReader reader)
|
||||
{
|
||||
base.Deserialize(reader);
|
||||
|
||||
int version = reader.ReadInt();
|
||||
|
||||
VisitedHeastone1 = reader.ReadBool();
|
||||
VisitedHeastone2 = reader.ReadBool();
|
||||
VisitedHeastone3 = reader.ReadBool();
|
||||
VisitedHeastone4 = reader.ReadBool();
|
||||
|
||||
ClueBook1_1 = reader.ReadBool();
|
||||
ClueBook1_2 = reader.ReadBool();
|
||||
ClueDust1 = reader.ReadBool();
|
||||
|
||||
ClueBook2_1 = reader.ReadBool();
|
||||
ClueBook2_2 = reader.ReadBool();
|
||||
ClueDust2 = reader.ReadBool();
|
||||
|
||||
ClueBook3_1 = reader.ReadBool();
|
||||
ClueBook3_2 = reader.ReadBool();
|
||||
ClueDust3 = reader.ReadBool();
|
||||
|
||||
ClueBook4_1 = reader.ReadBool();
|
||||
ClueBook4_2 = reader.ReadBool();
|
||||
ClueDust4 = reader.ReadBool();
|
||||
}
|
||||
|
||||
private class InternalObjective : BaseObjective
|
||||
{
|
||||
/* You have been assigned as a probationary investigator with the Detective Branch of the RBG. Pursue leads and follow the clues where they lead you... */
|
||||
public override object ObjectiveDescription { get { return 1158593; } }
|
||||
|
||||
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 GoingGumshoeQuest3 : BaseQuest
|
||||
{
|
||||
public override bool DoneOnce { get { return true; } }
|
||||
|
||||
/* Going Gumshoe */
|
||||
public override object Title { get { return 1158588; } }
|
||||
|
||||
/**You approach Inspector Jasper and show him the evidence you have discovered as well as your report
|
||||
* on the state of your investigation* Would you look at that, I suspect you aren't as useless as you
|
||||
* look. With a little luck you may even crack this case wide open! It looks like these notes are encrypted
|
||||
* - we need to find out what they say. There's a cryptologist at the Lycaeum who I've worked with in the
|
||||
* past. Get his help and we should be a step closer to figuring out what all this means.*/
|
||||
public override object Description { get { return 1158595; } }
|
||||
|
||||
/* You decide against accepting the quest. */
|
||||
public override object Refuse { get { return 1158130; } }
|
||||
|
||||
/*What are you still doing here? Didn't I send you to the Lycaeum?*/
|
||||
public override object Uncomplete { get { return 1158597; } }
|
||||
|
||||
public override object Complete { get { return null; } }
|
||||
|
||||
public override int AcceptSound { get { return 0x2E8; } }
|
||||
public override int CompleteMessage { get { return 1158595; } } // TOIDO: This
|
||||
|
||||
public Item BookCase { get; set; }
|
||||
public bool FoundCipherBook { get; set; }
|
||||
public bool BegunDecrypting { get; set; }
|
||||
|
||||
public bool IsComplete
|
||||
{
|
||||
get { return BegunDecrypting; }
|
||||
}
|
||||
|
||||
public GoingGumshoeQuest3()
|
||||
{
|
||||
AddReward(new BaseReward(1158615)); // A unique opportunity with the Detective Branch
|
||||
|
||||
AddObjective(new InternalObjective());
|
||||
|
||||
if (!World.Loading)
|
||||
{
|
||||
BookCase = GetBookcase();
|
||||
}
|
||||
}
|
||||
|
||||
private LibraryBookcase GetBookcase()
|
||||
{
|
||||
IPooledEnumerable eable = Map.Trammel.GetItemsInBounds(Bounds[Utility.Random(Bounds.Length)]);
|
||||
List<Item> bookcases = new List<Item>();
|
||||
|
||||
foreach (Item item in eable)
|
||||
{
|
||||
if (item is LibraryBookcase)
|
||||
{
|
||||
bookcases.Add(item);
|
||||
}
|
||||
}
|
||||
|
||||
if (bookcases.Count > 0)
|
||||
{
|
||||
var bookcase = bookcases[Utility.Random(bookcases.Count)];
|
||||
|
||||
ColUtility.Free(bookcases);
|
||||
|
||||
return (LibraryBookcase)bookcase;
|
||||
}
|
||||
|
||||
Console.WriteLine("Error: GoingGumshoeQuest3 has no bookcases. setup LibraryBookcase per EA via [CreateWorld command.");
|
||||
return null;
|
||||
}
|
||||
|
||||
public static bool CheckBookcase(Mobile from, Item item)
|
||||
{
|
||||
if (from is PlayerMobile)
|
||||
{
|
||||
var quest = QuestHelper.GetQuest<GoingGumshoeQuest3>((PlayerMobile)from);
|
||||
|
||||
if (quest != null && !quest.FoundCipherBook)
|
||||
{
|
||||
if (quest.BookCase == null)
|
||||
{
|
||||
quest.BookCase = quest.GetBookcase();
|
||||
}
|
||||
|
||||
if (item == quest.BookCase)
|
||||
{
|
||||
quest.FoundCipherBook = true;
|
||||
|
||||
from.PrivateOverheadMessage(Server.Network.MessageType.Regular, 0x47E, 1158713, from.NetState);
|
||||
// *You find the cipher text hidden among the books! Return to the Cryptologist to tell him where it is!*
|
||||
|
||||
var region = Region.Find(from.Location, from.Map);
|
||||
|
||||
if (region is QuestRegion)
|
||||
{
|
||||
((QuestRegion)region).ClearFromMessageTable(from);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static Rectangle2D[] Bounds =
|
||||
{
|
||||
new Rectangle2D(4285, 961, 10, 18),
|
||||
new Rectangle2D(4325, 961, 10, 18),
|
||||
new Rectangle2D(4285, 989, 10, 18),
|
||||
new Rectangle2D(4325, 989, 10, 18)
|
||||
};
|
||||
|
||||
public override void Serialize(GenericWriter writer)
|
||||
{
|
||||
base.Serialize(writer);
|
||||
|
||||
writer.Write((int)0); // version
|
||||
|
||||
writer.Write(BookCase);
|
||||
writer.Write(FoundCipherBook);
|
||||
writer.Write(BegunDecrypting);
|
||||
}
|
||||
|
||||
public override void Deserialize(GenericReader reader)
|
||||
{
|
||||
base.Deserialize(reader);
|
||||
|
||||
int version = reader.ReadInt();
|
||||
|
||||
BookCase = reader.ReadItem();
|
||||
FoundCipherBook = reader.ReadBool();
|
||||
BegunDecrypting = reader.ReadBool();
|
||||
|
||||
if (BookCase == null)
|
||||
{
|
||||
Timer.DelayCall(() => GetBookcase());
|
||||
}
|
||||
}
|
||||
|
||||
private class InternalObjective : BaseObjective
|
||||
{
|
||||
/* Go to the Lycaeum in Moonglow and enlist the assistance of the Cryptologist to help decode the evidence. Return to Inspector Jasper
|
||||
* when you have more to report. */
|
||||
public override object ObjectiveDescription { get { return 1158596; } }
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
private class QuestRegion : Region
|
||||
{
|
||||
public static void Initialize()
|
||||
{
|
||||
new QuestRegion();
|
||||
}
|
||||
|
||||
public QuestRegion()
|
||||
: base("Going Gumshoe Quest Region",
|
||||
Map.Trammel,
|
||||
Region.DefaultPriority,
|
||||
GoingGumshoeQuest3.Bounds)
|
||||
{
|
||||
Register();
|
||||
}
|
||||
|
||||
private Dictionary<Mobile, DateTime> _MessageTable;
|
||||
|
||||
public override void OnLocationChanged(Mobile m, Point3D oldLocation)
|
||||
{
|
||||
base.OnLocationChanged(m, oldLocation);
|
||||
|
||||
if (m is PlayerMobile)
|
||||
{
|
||||
var quest = QuestHelper.GetQuest<GoingGumshoeQuest3>((PlayerMobile)m);
|
||||
|
||||
if (quest != null && !quest.FoundCipherBook && 0.2 > Utility.RandomDouble())
|
||||
{
|
||||
var rec = GoingGumshoeQuest3.Bounds.FirstOrDefault(b => b.Contains(m.Location));
|
||||
|
||||
if (rec.Contains(quest.BookCase) && CanGiveMessage(m))
|
||||
{
|
||||
//m.PrivateOverheadMessage(Server.Network.MessageType.Regular, 0x47E, 1158714, m.NetState);
|
||||
m.SendLocalizedMessage(1158714);
|
||||
// *Your keen senses detect the books in this library have been recently disturbed...*
|
||||
|
||||
_MessageTable[m] = DateTime.UtcNow + TimeSpan.FromSeconds(15);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private bool CanGiveMessage(Mobile m)
|
||||
{
|
||||
if (_MessageTable == null)
|
||||
{
|
||||
_MessageTable = new Dictionary<Mobile, DateTime>();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
if (_MessageTable.ContainsKey(m))
|
||||
{
|
||||
return _MessageTable[m] < DateTime.UtcNow;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void ClearFromMessageTable(Mobile m)
|
||||
{
|
||||
if (_MessageTable != null && _MessageTable.ContainsKey(m))
|
||||
{
|
||||
_MessageTable.Remove(m);
|
||||
|
||||
if (_MessageTable.Count == 0)
|
||||
{
|
||||
_MessageTable = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class GoingGumshoeQuest4 : BaseQuest
|
||||
{
|
||||
public override bool DoneOnce { get { return true; } }
|
||||
|
||||
/* Going Gumshoe */
|
||||
public override object Title { get { return 1158588; } }
|
||||
|
||||
/*I must say, you've done fine work. The Cryptologist's courier arrived shortly before you did, and thanks to
|
||||
* him we know what this is all about. There's one final piece of the puzzle, and hopefully for us whoever
|
||||
* is at the bottom of this won't have known to look for a dead man. There is a Sage called Humbolt that
|
||||
* once lived in Papua. Tragically his life was taken from us too soon, but his spirit still wanders around
|
||||
* his old home. If anyone can put all the pieces together, it's him. Go to Papua and find him.*/
|
||||
public override object Description { get { return 1158634; } }
|
||||
|
||||
/* You decide against accepting the quest. */
|
||||
public override object Refuse { get { return 1158130; } }
|
||||
|
||||
/*Go to Papau and search for the spirit of Sage Humbolt*/
|
||||
public override object Uncomplete { get { return 1158635; } }
|
||||
|
||||
public override object Complete { get { return null; } }
|
||||
|
||||
public override int AcceptSound { get { return 0x2E8; } }
|
||||
public override int CompleteMessage { get { return 1158595; } } // TOIDO: This
|
||||
|
||||
public bool IsComplete { get; set; }
|
||||
|
||||
public GoingGumshoeQuest4()
|
||||
{
|
||||
AddReward(new BaseReward(1158615)); // A unique opportunity with the Detective Branch
|
||||
|
||||
AddObjective(new InternalObjective());
|
||||
}
|
||||
|
||||
public override void GiveRewards()
|
||||
{
|
||||
Item reward = new DetectiveCredentials();
|
||||
|
||||
if (Owner.Backpack == null || !Owner.Backpack.TryDropItem(Owner, reward, false))
|
||||
{
|
||||
Owner.BankBox.DropItem(reward);
|
||||
}
|
||||
|
||||
reward = new GumshoeTitleDeed();
|
||||
|
||||
if (Owner.Backpack == null || !Owner.Backpack.TryDropItem(Owner, reward, false))
|
||||
{
|
||||
Owner.BankBox.DropItem(reward);
|
||||
}
|
||||
|
||||
base.GiveRewards();
|
||||
}
|
||||
|
||||
public override void Serialize(GenericWriter writer)
|
||||
{
|
||||
base.Serialize(writer);
|
||||
|
||||
writer.Write((int)0); // version
|
||||
|
||||
writer.Write(IsComplete);
|
||||
}
|
||||
|
||||
public override void Deserialize(GenericReader reader)
|
||||
{
|
||||
base.Deserialize(reader);
|
||||
|
||||
int version = reader.ReadInt();
|
||||
|
||||
IsComplete = reader.ReadBool();
|
||||
}
|
||||
|
||||
private class InternalObjective : BaseObjective
|
||||
{
|
||||
/* Go to Papau and search for the spirit of Sage Humbolt */
|
||||
public override object ObjectiveDescription { get { return 1158635; } }
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
using Server;
|
||||
using System;
|
||||
using Server.Mobiles;
|
||||
using Server.Engines.Quests;
|
||||
|
||||
// 0x1E06 => South
|
||||
// 0x1E03 => West
|
||||
// 0x1E04 => North
|
||||
// 0x1E05 => East
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
public class BloodyFootPrints : Item
|
||||
{
|
||||
[Constructable]
|
||||
public BloodyFootPrints(int itemID)
|
||||
: base(itemID)
|
||||
{
|
||||
Movable = false;
|
||||
Hue = 1975;
|
||||
}
|
||||
|
||||
public BloodyFootPrints(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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
using System;
|
||||
|
||||
using Server;
|
||||
using Server.Mobiles;
|
||||
using Server.Items;
|
||||
using Server.Network;
|
||||
using Server.Gumps;
|
||||
using Server.SkillHandlers;
|
||||
using Server.Engines.Quests;
|
||||
|
||||
// 1158607 => brit
|
||||
// 1158608 => vesper
|
||||
// 1158609 => moonglow
|
||||
// 1158610 => yew
|
||||
|
||||
namespace Server.Engines.Khaldun
|
||||
{
|
||||
public class DamagedHeadstone : Item, IForensicTarget
|
||||
{
|
||||
public override int LabelNumber { get { return 1158561; } } // damaged headstone
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public int GumpLocalization { get; private set; }
|
||||
|
||||
public DamagedHeadstone(int gumpLoc)
|
||||
: base(0x1180)
|
||||
{
|
||||
GumpLocalization = gumpLoc;
|
||||
Movable = false;
|
||||
}
|
||||
|
||||
public void OnForensicEval(Mobile m)
|
||||
{
|
||||
if (!m.Player)
|
||||
return;
|
||||
|
||||
var quest = QuestHelper.GetQuest<GoingGumshoeQuest2>((PlayerMobile)m);
|
||||
|
||||
if (quest != null)
|
||||
{
|
||||
m.PrivateOverheadMessage(MessageType.Regular, 0x47E, 1158571, m.NetState); // *You examine the headstone...*
|
||||
m.SendLocalizedMessage(1158562, null, 0x23); // The damage to the epitaph seems deliberate. Using your training from Inspector Jasper you have found a hidden message among the scratches. You recreate the original epitaph in your mind's eye...
|
||||
|
||||
m.SendSound(quest.UpdateSound);
|
||||
|
||||
var gump = new Gump(50, 50);
|
||||
|
||||
gump.AddImage(0, 0, 0x66);
|
||||
gump.AddHtmlLocalized(47, 60, 146, 160, GumpLocalization, false, false);
|
||||
|
||||
m.SendGump(gump);
|
||||
|
||||
SetPrerequisite(quest);
|
||||
}
|
||||
else
|
||||
{
|
||||
m.PrivateOverheadMessage(MessageType.Regular, 0x47E, 1158563, m.NetState); // *It appears to be a normal, yet oddly damaged, headstone. The epitaph is illegible..*
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnDoubleClick(Mobile m)
|
||||
{
|
||||
if (m.InRange(GetWorldLocation(), 2))
|
||||
{
|
||||
m.PrivateOverheadMessage(MessageType.Regular, 0x47E, 1158563, m.NetState); // *It appears to be a normal, yet oddly damaged, headstone. The epitaph is illegible..*
|
||||
}
|
||||
else
|
||||
m.PrivateOverheadMessage(MessageType.Regular, 0x47E, 1019045, m.NetState); // I can't reach that.
|
||||
}
|
||||
|
||||
public void SetPrerequisite(GoingGumshoeQuest2 quest)
|
||||
{
|
||||
switch (GumpLocalization)
|
||||
{
|
||||
case 1158607: quest.VisitedHeastone1 = true; break;
|
||||
case 1158608: quest.VisitedHeastone2 = true; break;
|
||||
case 1158609: quest.VisitedHeastone3 = true; break;
|
||||
case 1158610: quest.VisitedHeastone4 = true; break;
|
||||
}
|
||||
}
|
||||
|
||||
public DamagedHeadstone(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize(GenericWriter writer)
|
||||
{
|
||||
base.Serialize(writer);
|
||||
|
||||
writer.Write((int)0); // version
|
||||
|
||||
writer.Write(GumpLocalization);
|
||||
}
|
||||
|
||||
public override void Deserialize(GenericReader reader)
|
||||
{
|
||||
base.Deserialize(reader);
|
||||
|
||||
int version = reader.ReadInt();
|
||||
|
||||
GumpLocalization = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,352 @@
|
||||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
|
||||
namespace Server.Items
|
||||
{
|
||||
public class KhaldunDecorationAddon : BaseAddon
|
||||
{
|
||||
public static KhaldunDecorationAddon Instance { get; set; }
|
||||
|
||||
// Ritual Table needs to be hued 1362
|
||||
// 14031 = hue 1
|
||||
private static int[,] m_AddOnSimpleComponents = new int[,] {
|
||||
{27, 74, 9, 1}, {28, 74, 9, 1}, {28, 73, 9, 1}// 1 2 3
|
||||
, {28, 72, 9, 1}, {28, 74, -1, 1}, {28, 72, -1, 1}// 4 5 6
|
||||
, {28, 73, -1, 1}, {27, 74, 6, 1}, {27, 74, 4, 1}// 7 8 9
|
||||
, {27, 74, 5, 1}, {27, 74, 7, 1}, {27, 74, 8, 1}// 10 11 12
|
||||
, {27, 74, 3, 1}, {27, 74, 2, 1}, {2879, 72, 0, 1}// 13 14 15
|
||||
, {2501, 72, 0, 7}, {27, 74, 1, 1}, {27, 74, 0, 1}// 16 17 18
|
||||
, {3644, 77, -3, 1}, {4014, 78, -3, 1}, {4014, 76, 1, 1}// 19 20 21
|
||||
, {3647, 77, -3, 7}, {4014, 76, 0, 1}, {3646, 77, -3, 4}// 22 23 24
|
||||
, {3644, 77, -2, 1}, {605, 72, -18, 1}, {4014, 75, -16, 1}// 25 26 27
|
||||
, {3647, 76, -16, 7}, {605, 74, -18, 1}, {605, 73, -18, 1}// 28 29 30
|
||||
, {4014, 73, -13, 1}, {3644, 72, -14, 1}, {605, 77, -18, 1}// 31 32 33
|
||||
, {4014, 75, -15, 1}, {605, 78, -18, 1}, {605, 80, -18, 1}// 34 35 36
|
||||
, {605, 79, -18, 1}, {605, 75, -18, 1}, {3644, 72, -13, 1}// 37 38 39
|
||||
, {3646, 76, -16, 4}, {3644, 76, -16, 1}, {605, 76, -18, 1}// 40 41 42
|
||||
, {27, 61, 9, 1}, {28, 62, 9, 1}, {28, 63, 9, 1}// 43 44 45
|
||||
, {28, 64, 9, 1}, {28, 65, 9, 1}, {28, 66, 9, 1}// 46 47 48
|
||||
, {28, 67, 9, 1}, {28, 68, 9, 1}, {28, 69, 9, 1}// 49 50 51
|
||||
, {28, 70, 9, 1}, {28, 71, 9, 1}, {28, 71, -1, 1}// 52 53 54
|
||||
, {28, 66, -1, 1}, {28, 65, -1, 1}, {28, 64, -1, 1}// 55 56 57
|
||||
, {28, 64, -1, 1}, {28, 63, -1, 1}, {28, 62, -1, 1}// 58 59 60
|
||||
, {4104, 64, 0, 7}, {3647, 69, -5, 7}, {3644, 69, -6, 1}// 61 62 63
|
||||
, {3646, 69, -6, 4}, {27, 61, 5, 1}, {27, 61, 4, 1}// 64 65 66
|
||||
, {27, 61, 3, 1}, {27, 61, 1, 1}, {27, 61, 2, 1}// 67 68 69
|
||||
, /*{5368, 67, 0, 1},*/ {27, 61, 0, 1}, {4014, 70, -7, 1}// 70 71 72
|
||||
, {33, 67, -1, 1}, /*{2501, 71, 0, 7},*/ {2879, 64, 0, 1}// 73 74 75
|
||||
, {2879, 63, 0, 1}, {2879, 62, 1, 1}, {29, 61, -1, 1}// 76 77 78
|
||||
, {2879, 62, 0, 1}, {4014, 70, -6, 1}, {3644, 69, -7, 1}// 79 80 81
|
||||
, /*{7866, 62, 2, 7},*/ {3646, 69, -5, 4}, {3644, 69, -5, 1}// 82 83 84
|
||||
, /*{5355, 62, 1, 7}, {5355, 62, 1, 8},*/ {2879, 71, 0, 1}// 85 86 87
|
||||
, {5357, 63, 0, 7}, {2879, 62, 2, 1}, {27, 61, 6, 1}// 88 89 90
|
||||
, {12254, 62, 4, 1}, {3647, 69, -6, 7}, {30, 70, -1, 1}// 91 92 93
|
||||
, {27, 61, 7, 1}, {27, 61, 8, 1}, {7427, 62, -10, 1}// 94 95 96
|
||||
, {7426, 62, -11, 1}, {7425, 62, -12, 1}, {7424, 62, -13, 1}// 97 98 99
|
||||
, {7423, 62, -14, 1}, {7409, 61, -9, 1}, {7428, 61, -10, 1}// 100 101 102
|
||||
, {7438, 61, -11, 1}, {7437, 61, -12, 1}, {7436, 61, -13, 1}// 103 104 105
|
||||
, {7422, 61, -14, 1}, {7410, 60, -9, 1}, {7429, 60, -10, 1}// 106 107 108
|
||||
, {7439, 60, -11, 1}, {7442, 60, -12, 1}, {7435, 60, -13, 1}// 109 110 111
|
||||
, {7421, 60, -14, 1}, {7411, 59, -9, 1}, {7430, 59, -10, 1}// 112 113 114
|
||||
, {7440, 59, -11, 1}, {7441, 59, -12, 1}, {7434, 59, -13, 1}// 115 116 117
|
||||
, {7420, 59, -14, 1}, {7412, 58, -9, 1}, {611, 67, -18, 1}// 118 119 120
|
||||
, {612, 67, -16, 1}, {4014, 65, -8, 1}, {3646, 64, -14, 4}// 122 123 124
|
||||
, {605, 69, -18, 1}, {605, 70, -18, 1}, {4014, 70, -10, 1}// 125 126 127
|
||||
, {605, 68, -18, 1}, {605, 65, -16, 1}, {3644, 59, -17, 1}// 128 129 130
|
||||
, {3647, 64, -14, 7}, {3647, 70, -11, 7}, {605, 71, -18, 1}// 131 132 133
|
||||
, {605, 66, -16, 1}, {3644, 59, -16, 1}, {605, 64, -16, 1}// 134 135 136
|
||||
, {3644, 65, -13, 1}, {6667, 59, -11, 1}, {4014, 65, -9, 1}// 137 138 139
|
||||
, {4014, 66, -9, 1}, {7431, 58, -10, 1}, {4014, 58, -17, 1}// 140 141 142
|
||||
, {3644, 64, -14, 1}, {6668, 60, -12, 1}, {4014, 69, -14, 1}// 143 144 145
|
||||
, {4014, 64, -13, 1}, {4014, 65, -14, 1}, {4014, 67, -12, 1}// 146 147 148
|
||||
, {4014, 66, -8, 1}, {3644, 70, -15, 1}, {3644, 71, -10, 1}// 151 153 155
|
||||
, {3646, 70, -11, 4}, {7417, 57, -13, 1}, {7416, 57, -12, 1}// 157 158 159
|
||||
, {7415, 57, -11, 1}, {3647, 59, -17, 4}, {7414, 57, -10, 1}// 161 162 163
|
||||
, {7413, 57, -9, 1}, {7419, 58, -14, 1}, {7418, 58, -13, 1}// 164 165 166
|
||||
, {7433, 58, -12, 1}, {3644, 71, -11, 1}, {3644, 70, -11, 1}// 167 168 169
|
||||
, {7432, 58, -11, 1}, {604, 67, -17, 1}, {4014, 54, -4, 1}// 170 171 172
|
||||
, {604, 52, -1, 1}, {604, 52, -2, 1}, {604, 52, -3, 1}// 173 174 175
|
||||
, {3644, 54, -3, 1}, {3644, 55, -3, 1}, {3644, 55, -4, 1}// 176 177 178
|
||||
, {604, 52, -4, 1}, {604, 52, -5, 1}, {604, 52, -6, 1}// 179 180 181
|
||||
, {604, 52, -7, 1}, {3647, 55, -3, 7}, {3646, 55, -3, 4}// 182 183 184
|
||||
, {3644, 54, -16, 1}, {3644, 53, -16, 1}, {3644, 53, -17, 1}// 185 186 187
|
||||
, {604, 50, -15, 1}, {604, 50, -11, 1}, {604, 50, -13, 1}// 188 189 190
|
||||
, {604, 50, -14, 1}, {604, 50, -10, 1}, {604, 50, -12, 1}// 191 192 193
|
||||
, {3647, 53, -16, 4}, {604, 50, -16, 1}, {4014, 54, -17, 1}// 194 195 196
|
||||
, {604, 50, -17, 1}, {604, 50, -18, 1}, {4014, 54, -12, 1}// 197 198 199
|
||||
, {604, 50, -9, 1}, {604, 50, -19, 1}, {41040, 28, 5, 1}// 200 201 202
|
||||
, {41017, 28, 6, 1}, {41030, 25, 0, 1}, {41029, 24, 0, 1}// 203 204 205
|
||||
, {41031, 26, 0, 1}, {41032, 27, 0, 1}, {41018, 27, 6, 1}// 206 207 208
|
||||
, {41019, 26, 6, 1}, {41020, 25, 6, 1}, {41021, 24, 6, 1}// 209 210 211
|
||||
, {607, 32, -3, 1}, {607, 31, -3, 1}, {5453, 32, 3, 1}// 212 213 214
|
||||
, {5453, 32, 2, 1}, {607, 28, -3, 1}, {41039, 29, 5, 1}// 215 216 217
|
||||
, {41016, 29, 6, 1}, {41038, 29, 4, 1}, {41036, 29, 2, 1}// 218 219 220
|
||||
, {41035, 29, 1, 1}, {41038, 29, 3, 1}, {41037, 29, 3, 1}// 221 222 223
|
||||
, {607, 30, -3, 1}, {607, 29, -3, 1}, {607, 25, -10, 1}// 224 225 226
|
||||
, {607, 27, -10, 1}, {607, 24, -15, 1}, {607, 26, -10, 1}// 227 228 229
|
||||
, {607, 25, -15, 1}, {28, 15, 11, 1}, {28, 14, 11, 1}// 230 231 232
|
||||
, {28, 13, 11, 1}, {28, 10, 11, 1}, {5453, 21, 9, 1}// 233 234 235
|
||||
, {27, 9, 10, 1}, {27, 9, 9, 1}, {28, 11, 11, 1}// 236 237 238
|
||||
, {28, 12, 11, 1}, {27, 15, 11, 1}, {27, 15, 9, 1}// 239 240 241
|
||||
, {27, 9, 11, 1}, {27, 15, 10, 1}, {4014, 17, -4, 1}// 242 243 244
|
||||
, {4014, 20, -6, 1}, {4014, 19, -6, 1}, {4088, 8, -1, 7}// 245 246 247
|
||||
, /*{2501, 8, -3, 7},*/ {41027, 23, 1, 1}, {41026, 23, 2, 1}// 248 249 250
|
||||
, {41025, 23, 3, 1}, {41022, 23, 6, 1}, {41024, 23, 4, 0}// 251 252 253
|
||||
, {12254, 10, 5, 1}, /*{5368, 9, -3, 1},*/ {3644, 16, -6, 1}// 254 255 256
|
||||
, {3644, 17, -7, 1}, {2879, 8, 0, 1}, {2879, 8, -1, 1}// 257 258 259
|
||||
, {2879, 8, -2, 1}, {2879, 8, -3, 1}, {3644, 20, -7, 1}// 260 261 262
|
||||
, {33, 9, -4, 1}, {3644, 17, -3, 1}, {28, 8, -4, 1}// 263 264 265
|
||||
, {28, 9, 1, 1}, {28, 8, 1, 1}, {5453, 23, -2, 1}// 266 267 268
|
||||
, {5453, 22, 0, 1}, {4104, 8, 0, 7}, {3646, 18, -3, 4}// 269 270 271
|
||||
, /*{5356, 8, -2, 7},*/ {5453, 20, 8, 1}, {27, 9, 8, 1}// 272 273 274
|
||||
, {3646, 16, -6, 4}, {27, 9, 7, 1}, {27, 9, 6, 1}// 275 276 277
|
||||
, {27, 9, 5, 1}, {27, 9, 4, 1}, {27, 9, 3, 1}// 278 279 280
|
||||
, {27, 9, 2, 1}, {4014, 17, -6, 1}, {3646, 19, -7, 4}// 281 282 283
|
||||
, {3646, 17, -7, 4}, {3647, 18, -3, 7}, {3644, 19, -7, 1}// 284 285 286
|
||||
, {3644, 18, -3, 1}, {5453, 23, -3, 1}, {5453, 21, 1, 1}// 287 288 289
|
||||
, {3646, 23, -7, 4}, /*{5356, 8, -2, 8},*/ {3647, 23, -7, 7}// 290 291 292
|
||||
, {3644, 23, -7, 1}, {30, 13, -4, 1}, {28, 14, -4, 1}// 293 294 295
|
||||
, {28, 15, -4, 1}, {27, 15, -3, 1}, {27, 15, -2, 1}// 296 297 298
|
||||
, {32, 15, 4, 1}, {27, 15, -1, 1}, {27, 15, 0, 1}// 299 300 301
|
||||
, {27, 15, 1, 1}, {31, 15, 8, 1}, {27, 15, 2, 1}// 302 303 304
|
||||
, {27, 15, 3, 1}, {3644, 15, -9, 1}, {3644, 22, -14, 1}// 305 306 307
|
||||
, {3644, 23, -8, 1}, {3644, 8, -10, 1}, {3644, 8, -9, 1}// 308 309 310
|
||||
, {3644, 12, -9, 1}, {607, 22, -15, 1}, {607, 18, -15, 1}// 311 312 313
|
||||
, {607, 15, -15, 1}, {607, 23, -15, 1}, {607, 21, -15, 1}// 314 315 316
|
||||
, {607, 19, -15, 1}, {607, 20, -15, 1}, {607, 9, -11, 1}// 317 318 319
|
||||
, {607, 11, -11, 1}, {4014, 11, -9, 1}, {4014, 15, -10, 1}// 320 321 322
|
||||
, {4014, 17, -14, 1}, {4014, 16, -14, 1}, {612, 12, -11, 1}// 323 324 325
|
||||
, {4014, 22, -13, 1}, {3647, 8, -10, 7}, {607, 14, -15, 1}// 326 327 328
|
||||
, {604, 12, -14, 1}, {611, 12, -15, 1}, {607, 8, -11, 1}// 329 330 331
|
||||
, {4014, 16, -10, 1}, {4014, 16, -9, 1}, {4014, 23, -13, 1}// 332 333 334
|
||||
, {4014, 17, -13, 1}, {4014, 12, -10, 1}, {3646, 22, -14, 4}// 335 336 337
|
||||
, {607, 10, -11, 1}, {607, 17, -15, 1}, {3646, 15, -9, 4}// 338 339 340
|
||||
, {604, 12, -13, 1}, {604, 12, -12, 1}, {607, 13, -15, 1}// 341 342 343
|
||||
, {607, 16, -15, 1}, {3647, 12, -9, 7}, {3646, 12, -9, 4}// 344 345 346
|
||||
, {3646, 8, -10, 4}/*, {7867, 7, -1, 7}, {2501, 7, -2, 7}*/// 347 348 349
|
||||
, {2879, 7, -2, 1}, {2879, 7, 0, 1}, {2879, 7, -1, 1}// 350 351 352
|
||||
, {29, 6, -4, 1}, {28, 7, 1, 1}, {27, 6, -2, 1}// 353 354 355
|
||||
, {27, 6, 1, 1}, {604, 6, -7, 1}, {604, 6, -6, 1}// 356 357 358
|
||||
, {2879, 7, -3, 1}, {28, 7, -4, 1}, {27, 6, 0, 1}// 359 360 361
|
||||
, {27, 6, -1, 1}, {27, 6, -3, 1}, {4014, 7, -10, 1}// 362 363 364
|
||||
, {604, 6, -10, 1}, {604, 6, -8, 1}, {604, 6, -9, 1}// 365 366 367
|
||||
, {607, 7, -11, 1}, {4014, 7, -9, 1}, {610, 6, -11, 1}// 368 369 370
|
||||
, {3807, -23, 9, 1}, {4014, -19, 9, 1}, {3644, -18, 9, 1}// 371 372 373
|
||||
, {6786, -24, 9, 1}, {4014, -21, 2, 1}, {4014, -20, 2, 1}// 374 379 380
|
||||
, {4014, -17, 5, 1}, {3807, -21, 7, 1}, {3809, -23, 8, 1}// 381 383 384
|
||||
, {3809, -21, 6, 1}, {3647, -20, 1, 7}, {3647, -19, 6, 4}// 385 386 387
|
||||
, {605, -18, 2, 1}, {605, -21, -5, 1}, {605, -19, -5, 1}// 388 389 390
|
||||
, {605, -20, -5, 1}, {605, -24, -5, 1}, {7848, -23, 3, 1}// 391 392 393
|
||||
, {605, -23, -5, 1}, {605, -12, 2, 1}, {605, -16, 2, 1}// 394 395 396
|
||||
, {605, -17, 2, 1}, {4014, -15, 3, 1}, {605, -14, 2, 1}// 397 398 399
|
||||
, {605, -13, 2, 1}, {605, -15, 2, 1}, {3647, -21, 1, 7}// 400 401 402
|
||||
, {3646, -21, 1, 4}, {3644, -20, 1, 1}, {3644, -21, 1, 1}// 403 404 405
|
||||
, {3644, -16, 3, 1}, {6787, -24, 8, 1}, {3646, -20, 1, 4}// 406 407 408
|
||||
, {3644, -16, 4, 1}, {3644, -19, 6, 1}, {605, -22, -5, 1}// 409 411 412
|
||||
, {3646, -16, 3, 4}, {27, -35, 9, 1}, {27, -29, 10, 1}// 413 414 415
|
||||
, {27, -35, 12, 1}, {31, -29, 9, 1}, {28, -29, 13, 1}// 416 417 418
|
||||
, {27, -29, 11, 1}, {604, -29, 18, 1}, {28, -34, 13, 1}// 419 420 421
|
||||
, {28, -30, 13, 1}, {604, -29, 16, 1}, {604, -29, 17, 1}// 422 423 424
|
||||
, {28, -33, 13, 1}, {28, -32, 13, 1}, {604, -29, 14, 1}// 425 426 427
|
||||
, {604, -29, 19, 1}, {27, -29, 13, 1}, {27, -35, 13, 1}// 428 429 430
|
||||
, {3644, -27, 16, 1}, {604, -29, 15, 1}, {27, -29, 12, 1}// 431 432 433
|
||||
, {27, -35, 10, 1}, {28, -31, 13, 1}, {3644, -27, 15, 1}// 434 435 436
|
||||
, {4014, -28, 14, 1}, {27, -35, 11, 1}, {3646, -27, 16, 4}// 437 438 439
|
||||
, {5356, -30, 0, 7}/*, {5356, -34, 0, 8}, {5356, -34, 0, 7}*/// 440 441 442
|
||||
, /*{2501, -34, 1, 7},*/ {2880, -30, 0, 1}, {2880, -31, 0, 1}// 443 444 445
|
||||
, {2879, -34, 3, 1}, {2879, -34, 2, 1}, {2879, -34, 1, 1}// 446 447 448
|
||||
, {2879, -34, 0, 1}, {27, -29, 4, 1}, {28, -34, -1, 1}// 449 450 451
|
||||
, {28, -32, -1, 1}, {27, -35, 0, 1}, {604, -28, -2, 1}// 452 453 454
|
||||
, {604, -28, -3, 1}, {604, -28, -4, 1}, {605, -26, -5, 1}// 455 456 457
|
||||
, {611, -28, -5, 1}, {27, -29, 0, 1}, {27, -35, 1, 1}// 458 459 460
|
||||
, {3644, -27, 2, 1}, {612, -28, -1, 1}, {605, -25, -5, 1}// 461 462 463
|
||||
, {3809, -26, 7, 1}, {605, -29, -1, 1}, {27, -35, 4, 1}// 464 465 466
|
||||
, {3807, -26, 8, 1}, {32, -29, 5, 1}, {27, -29, 1, 1}// 467 468 469
|
||||
, {27, -35, 6, 1}, {28, -33, -1, 1}, {3644, -28, 2, 1}// 470 471 472
|
||||
, {27, -35, 3, 1}, {27, -35, 2, 1}, {27, -35, 7, 1}// 473 475 476
|
||||
, {27, -29, 2, 1}, {27, -35, 8, 1}, {29, -35, -1, 1}// 477 478 479
|
||||
, {3807, -26, 5, 1}, {605, -27, -5, 1}/*, {7867, -34, 2, 7}*/// 480 481 482
|
||||
, {3809, -26, 4, 1}, {27, -29, 3, 1}, {27, -35, 5, 1}// 483 484 485
|
||||
, {28, -29, -1, 1}, {12254, -34, 6, 1}, {28, -30, -1, 1}// 486 488 489
|
||||
, {28, -31, -1, 1}/*, {5359, -71, 14, 7}, {7867, -72, 14, 7}*/// 490 491 492
|
||||
, /*{5370, -69, 9, 1},*/ {5357, -66, 9, 7}, {5357, -72, 15, 7}// 493 494 495
|
||||
, {3647, -71, 10, 7}, {3646, -71, 10, 4}, {2879, -65, 9, 1}// 496 497 498
|
||||
, {2879, -66, 9, 1}, {27, -63, 11, 1}, {3644, -68, 14, 1}// 499 500 501
|
||||
, {3644, -64, 13, 1}, {3644, -70, 10, 1}, {4014, -67, 11, 1}// 502 503 504
|
||||
, {27, -63, 9, 1}, {3644, -71, 11, 1}, {3644, -71, 10, 1}// 505 506 507
|
||||
, {4014, -63, 13, 1}, {27, -63, 10, 1}, {27, -61, 15, 1}// 508 509 510
|
||||
, {27, -61, 18, 1}, {4014, -66, 16, 1}, {3644, -66, 15, 1}// 511 512 513
|
||||
, {4014, -65, 16, 1}, {26, -61, 19, 1}, {4014, -65, 15, 1}// 514 515 516
|
||||
, {28, -62, 19, 1}, {4014, -67, 12, 1}, {28, -61, 11, 1}// 517 518 519
|
||||
, {28, -72, 19, 1}, {27, -61, 13, 1}, {28, -62, 11, 1}// 520 521 522
|
||||
, {4014, -68, 15, 1}, {28, -71, 19, 1}, {28, -70, 19, 1}// 523 524 525
|
||||
, {28, -69, 19, 1}, {28, -67, 19, 1}, {28, -68, 19, 1}// 526 527 528
|
||||
, {27, -61, 14, 1}, {28, -66, 19, 1}, {28, -63, 19, 1}// 529 530 531
|
||||
, {28, -65, 19, 1}, {27, -61, 12, 1}, {28, -64, 19, 1}// 532 533 534
|
||||
, {2879, -72, 15, 1}, {2879, -71, 15, 1}, {2879, -71, 14, 1}// 535 536 537
|
||||
, {2879, -72, 14, 1}, {27, -61, 16, 1}, {3644, -66, 11, 1}// 538 539 540
|
||||
, {27, -61, 17, 1}/*, {5355, -66, 8, 8}, {5355, -66, 8, 7}*/// 541 542 543
|
||||
, {3647, -63, -5, 7}, {3646, -63, -5, 4}, {2879, -66, 8, 1}// 555 556 557
|
||||
, {2879, -65, 8, 1}, {28, -64, 7, 1}, {28, -65, 7, 1}// 558 564 565
|
||||
, {28, -67, 7, 1}, {28, -66, 7, 1}, {28, -63, 7, 1}// 566 567 568
|
||||
, {27, -63, 8, 1}, {4014, -68, 4, 1}, {4014, -67, 4, 1}// 569 570 571
|
||||
, {27, -68, 8, 1}, {27, -63, 6, 1}, {28, -68, 8, 1}// 572 573 574
|
||||
, {29, -68, 7, 1}, {27, -63, 7, 1}, {3644, -63, -4, 1}// 575 576 577
|
||||
, {4014, -62, -3, 1}, {3644, -63, 2, 1}, {3644, -63, 1, 1}// 578 579 580
|
||||
, {30, -69, 8, 1}, {3644, -63, -5, 1}, {3647, -69, -9, 7}// 581 582 583
|
||||
, {3647, -70, -9, 7}, {3646, -69, -9, 4}, {3644, -70, -9, 1}// 584 585 586
|
||||
, {3644, -69, -10, 1}, {3646, -70, -9, 4}, {605, -72, -11, 1}// 587 588 589
|
||||
, {605, -69, -11, 1}, {4014, -72, -10, 1}, {4014, -72, -9, 1}// 590 591 592
|
||||
, {605, -66, -11, 1}, {605, -67, -11, 1}, {605, -68, -11, 1}// 593 594 595
|
||||
, {605, -70, -11, 1}, {3644, -69, -9, 1}, {605, -71, -11, 1}// 596 597 598
|
||||
, /*{2501, -78, 14, 7}, {2501, -78, 15, 7},*/ {2879, -78, 15, 1}// 599 600 601
|
||||
, {2879, -78, 14, 1}, {2879, -78, 13, 1}, {12254, -78, 11, 1}// 602 603 604
|
||||
, {28, -78, 19, 1}, {28, -77, 19, 1}, {28, -76, 19, 1}// 605 606 607
|
||||
, {28, -75, 19, 1}, {28, -74, 19, 1}, {28, -73, 19, 1}// 608 609 610
|
||||
, {27, -79, 10, 1}, {27, -79, 9, 1}, {27, -79, 13, 1}// 611 612 613
|
||||
, {27, -79, 14, 1}, {27, -79, 12, 1}, {27, -79, 11, 1}// 614 615 616
|
||||
, {604, -78, 18, 1}, {27, -79, 16, 1}, {27, -79, 15, 1}// 617 618 619
|
||||
, {604, -78, 17, 1}, {604, -78, 19, 1}, {604, -75, 6, 1}// 620 621 625
|
||||
, {604, -75, 5, 1}, {604, -75, 4, 1}, {604, -75, 2, 1}// 626 627 628
|
||||
, {604, -75, 3, 1}, {604, -75, -5, 1}, {604, -75, 1, 1}// 629 630 631
|
||||
, {604, -75, -2, 1}, {604, -75, 0, 1}, {604, -75, -1, 1}// 632 633 634
|
||||
, {604, -75, -4, 1}, {604, -75, -3, 1}, {604, -75, -6, 1}// 635 636 637
|
||||
, {604, -75, -7, 1}, {29, -79, 8, 1}, {33, -75, 8, 1}// 638 639 640
|
||||
, {604, -75, 7, 1}, {28, -78, 8, 1}, {28, -77, 8, 1}// 641 642 643
|
||||
, {28, -76, 8, 1}, {604, -75, 8, 1}, {604, -75, -8, 1}// 644 645 646
|
||||
, {604, -75, -9, 1}, {604, -75, -10, 1}, {4014, -73, -10, 1}// 647 648 649
|
||||
, {605, -74, -11, 1}, {605, -73, -11, 1}, {4014, -73, -9, 1}// 650 651 652
|
||||
, {611, -75, -11, 1}// 653
|
||||
};
|
||||
|
||||
public override BaseAddonDeed Deed { get { return null; } }
|
||||
|
||||
[Constructable]
|
||||
public KhaldunDecorationAddon()
|
||||
{
|
||||
Instance = this;
|
||||
|
||||
for (int i = 0; i < m_AddOnSimpleComponents.Length / 4; i++)
|
||||
AddComponent(new AddonComponent(m_AddOnSimpleComponents[i, 0]), m_AddOnSimpleComponents[i, 1], m_AddOnSimpleComponents[i, 2], m_AddOnSimpleComponents[i, 3]);
|
||||
|
||||
AddComplexComponent((BaseAddon)this, 4643, 59, -12, 1, 1105, -1, "", 1);// 121
|
||||
AddComplexComponent((BaseAddon)this, 8429, 60, -9, 2, 1105, -1, "", 1);// 149
|
||||
AddComplexComponent((BaseAddon)this, 8429, 59, -9, 2, 1105, -1, "", 1);// 150
|
||||
AddComplexComponent((BaseAddon)this, 4646, 57, -12, 2, 1105, -1, "", 1);// 152
|
||||
AddComplexComponent((BaseAddon)this, 4646, 57, -11, 2, 1105, -1, "", 1);// 154
|
||||
AddComplexComponent((BaseAddon)this, 4648, 62, -12, 2, 1105, -1, "", 1);// 156
|
||||
AddComplexComponent((BaseAddon)this, 4648, 62, -11, 2, 1105, -1, "", 1);// 160
|
||||
AddComplexComponent((BaseAddon)this, 14031, -22, 7, 1, 1, -1, "Hole", 1);// 375
|
||||
AddComplexComponent((BaseAddon)this, 14031, -23, 6, 1, 1, -1, "Hole", 1);// 376
|
||||
AddComplexComponent((BaseAddon)this, 18818, -24, -2, 1, 1105, -1, "", 1);// 377
|
||||
AddComplexComponent((BaseAddon)this, 18819, -24, -3, 1, 1105, -1, "", 1);// 378
|
||||
AddComplexComponent((BaseAddon)this, 14031, -23, 7, 1, 1, -1, "Hole", 1);// 382
|
||||
AddComplexComponent((BaseAddon)this, 14031, -22, 6, 1, 1, -1, "Hole", 1);// 410
|
||||
AddComplexComponent((BaseAddon)this, 18820, -25, -2, 1, 1105, -1, "", 1);// 474
|
||||
AddComplexComponent((BaseAddon)this, 18821, -25, -3, 1, 1105, -1, "", 1);// 487
|
||||
AddComplexComponent((BaseAddon)this, 4077, -68, -1, 1, 1105, -1, "", 1);// 544
|
||||
AddComplexComponent((BaseAddon)this, 4076, -69, -1, 1, 1105, -1, "", 1);// 545
|
||||
AddComplexComponent((BaseAddon)this, 4073, -70, -1, 1, 1105, -1, "", 1);// 546
|
||||
AddComplexComponent((BaseAddon)this, 4078, -68, -2, 1, 1105, -1, "", 1);// 547
|
||||
AddComplexComponent((BaseAddon)this, 4074, -69, -2, 1, 1105, -1, "", 1);// 548
|
||||
AddComplexComponent((BaseAddon)this, 4070, -70, -2, 1, 1105, -1, "", 1);// 549
|
||||
AddComplexComponent((BaseAddon)this, 4075, -68, -3, 1, 1105, -1, "", 1);// 550
|
||||
AddComplexComponent((BaseAddon)this, 4072, -69, -3, 1, 1105, -1, "", 1);// 551
|
||||
AddComplexComponent((BaseAddon)this, 4071, -70, -3, 1, 1105, -1, "", 1);// 552
|
||||
AddComplexComponent((BaseAddon)this, 6571, -64, 2, 8, 0, 1, "", 1);// 553
|
||||
AddComplexComponent((BaseAddon)this, 6571, -64, -2, 4, 0, 1, "", 1);// 554
|
||||
AddComplexComponent((BaseAddon)this, 6571, -72, -4, 4, 0, 1, "", 1);// 559
|
||||
AddComplexComponent((BaseAddon)this, 6571, -72, 0, 4, 0, 1, "", 1);// 560
|
||||
AddComplexComponent((BaseAddon)this, 6571, -67, 0, 4, 0, 1, "", 1);// 561
|
||||
AddComplexComponent((BaseAddon)this, 6571, -67, -4, 4, 0, 1, "", 1);// 562
|
||||
AddComplexComponent((BaseAddon)this, 6571, -64, -6, 8, 0, 1, "", 1);// 563
|
||||
AddComplexComponent((BaseAddon)this, 6571, -74, 2, 8, 0, 1, "", 1);// 622
|
||||
AddComplexComponent((BaseAddon)this, 6571, -74, -2, 4, 0, 1, "", 1);// 623
|
||||
AddComplexComponent((BaseAddon)this, 6571, -74, -6, 8, 0, 1, "", 1);// 624
|
||||
|
||||
}
|
||||
|
||||
public KhaldunDecorationAddon( Serial serial ) : base( serial )
|
||||
{
|
||||
}
|
||||
|
||||
private static void AddComplexComponent(BaseAddon addon, int item, int xoffset, int yoffset, int zoffset, int hue, int lightsource)
|
||||
{
|
||||
AddComplexComponent(addon, item, xoffset, yoffset, zoffset, hue, lightsource, null, 1);
|
||||
}
|
||||
|
||||
private static void AddComplexComponent(BaseAddon addon, int item, int xoffset, int yoffset, int zoffset, int hue, int lightsource, string name, int amount)
|
||||
{
|
||||
AddonComponent ac;
|
||||
ac = new AddonComponent(item);
|
||||
if (name != null && name.Length > 0)
|
||||
ac.Name = name;
|
||||
if (hue != 0)
|
||||
ac.Hue = hue;
|
||||
if (amount > 1)
|
||||
{
|
||||
ac.Stackable = true;
|
||||
ac.Amount = amount;
|
||||
}
|
||||
if (lightsource != -1)
|
||||
ac.Light = (LightType) lightsource;
|
||||
addon.AddComponent(ac, xoffset, yoffset, zoffset);
|
||||
}
|
||||
|
||||
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();
|
||||
|
||||
Instance = this;
|
||||
}
|
||||
}
|
||||
|
||||
public class KhaldunWorkshop : BaseAddon
|
||||
{
|
||||
private static int[,] m_AddOnSimpleComponents = new int[,] {
|
||||
{7864, 4, 0, 12} // 7 8 9
|
||||
, {4179, 4, 1, 10}, {4130, -2, -3, 10}, {9932, -2, -2, 10}// 10 11 12
|
||||
, {7867, -2, 0, 12}, {7129, -2, 1, 10}, {4014, -1, 1, 4}// 13 14 15
|
||||
, {4015, 1, -3, 4}, {4017, 1, -2, 4}, {4017, 1, 0, 4}// 16 17 18
|
||||
, {2879, 4, 1, 4}, {2879, -2, -3, 4}, {2879, 4, 0, 4}// 19 20 21
|
||||
, {2879, 4, -1, 4}, {2879, 4, -2, 4}, {2879, 4, -3, 4}// 22 23 24
|
||||
, {2879, -2, 1, 4}, {2879, -2, 0, 4}, {2879, -2, -1, 4}// 25 26 27
|
||||
, {2879, -2, -2, 4}// 28
|
||||
};
|
||||
|
||||
public override BaseAddonDeed Deed { get { return null; } }
|
||||
|
||||
[Constructable]
|
||||
public KhaldunWorkshop()
|
||||
{
|
||||
for (int i = 0; i < m_AddOnSimpleComponents.Length / 4; i++)
|
||||
AddComponent(new AddonComponent(m_AddOnSimpleComponents[i, 0]), m_AddOnSimpleComponents[i, 1], m_AddOnSimpleComponents[i, 2], m_AddOnSimpleComponents[i, 3]);
|
||||
}
|
||||
|
||||
public KhaldunWorkshop(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
using System;
|
||||
using Server;
|
||||
using Server.Gumps;
|
||||
|
||||
namespace Server.Items
|
||||
{
|
||||
public class DetectiveBook : Item
|
||||
{
|
||||
[Constructable]
|
||||
public DetectiveBook() : base(4082)
|
||||
{
|
||||
}
|
||||
|
||||
public override void GetProperties(ObjectPropertyList list)
|
||||
{
|
||||
base.GetProperties(list);
|
||||
|
||||
list.Add(1158598); // Book title
|
||||
list.Add(1154760, "K. Jasper, Chief Inspector"); // By: ~1_NAME~
|
||||
}
|
||||
|
||||
public override void OnDoubleClick(Mobile m)
|
||||
{
|
||||
if (IsChildOf(m.Backpack))
|
||||
{
|
||||
Gump g = new Gump(150, 150);
|
||||
g.AddImage(0, 0, 30236);
|
||||
g.AddHtmlLocalized(110, 30, 350, 630, 1158600, false, false); // Book content
|
||||
|
||||
m.SendGump(g);
|
||||
}
|
||||
}
|
||||
|
||||
public DetectiveBook(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize(GenericWriter writer)
|
||||
{
|
||||
base.Serialize(writer);
|
||||
writer.Write(0);
|
||||
}
|
||||
|
||||
public override void Deserialize(GenericReader reader)
|
||||
{
|
||||
base.Deserialize(reader);
|
||||
int version = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
using Server;
|
||||
|
||||
namespace Server.Items
|
||||
{
|
||||
public class DetectiveCredentials : BaseNecklace
|
||||
{
|
||||
public override int LabelNumber { get { return 1158641; } } // RBG Detective Branch Official Credential
|
||||
|
||||
[Constructable]
|
||||
public DetectiveCredentials()
|
||||
: base(0x1088)
|
||||
{
|
||||
Hue = 1176;
|
||||
LootType = LootType.Blessed;
|
||||
}
|
||||
|
||||
public DetectiveCredentials(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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using Server;
|
||||
using Server.Prompts;
|
||||
using Server.Mobiles;
|
||||
using Server.Items;
|
||||
using Server.SkillHandlers;
|
||||
using Server.Gumps;
|
||||
using Server.Network;
|
||||
using Server.Engines.Quests;
|
||||
|
||||
namespace Server.Engines.Khaldun
|
||||
{
|
||||
public class DustPile : Item, IForensicTarget
|
||||
{
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public TrapDoor Door { get; set; }
|
||||
|
||||
public DustPile(TrapDoor door)
|
||||
: base(0x573D)
|
||||
{
|
||||
Movable = false;
|
||||
Hue = 2044;
|
||||
Name = "";
|
||||
Door = door;
|
||||
}
|
||||
|
||||
public void OnForensicEval(Mobile m)
|
||||
{
|
||||
if (!m.Player)
|
||||
return;
|
||||
|
||||
var quest = QuestHelper.GetQuest<GoingGumshoeQuest2>((PlayerMobile)m);
|
||||
|
||||
if (quest != null)
|
||||
{
|
||||
if (HasFoundClue(quest))
|
||||
{
|
||||
m.SendLocalizedMessage(1158613); // You have already documented this clue.
|
||||
}
|
||||
else
|
||||
{
|
||||
m.PrivateOverheadMessage(MessageType.Regular, 0x47E, 1157722, "Forensics", m.NetState); // *Your proficiency in ~1_SKILL~ reveals more about the item*
|
||||
m.SendLocalizedMessage(1158612, null, 0x23); // You have identified a clue! This item seems pertinent to the investigation!
|
||||
|
||||
m.SendSound(quest.UpdateSound);
|
||||
m.SendSound(m.Female ? 0x30B : 0x41A);
|
||||
|
||||
m.CloseGump(typeof(GumshoeItemGump));
|
||||
m.SendGump(new GumshoeItemGump(m, ItemID, Hue, "a dust pile", 1158617, null));
|
||||
|
||||
/*The dust seems to have have settled in a distinct pattern around whatever once was placed at this location.
|
||||
* Whatever it was, it was certainly small enough to be taken away in a hurry.*/
|
||||
|
||||
SetFoundClue(quest);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void SetFoundClue(GoingGumshoeQuest2 quest)
|
||||
{
|
||||
if (Door == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
switch (Door.Keyword.ToLower())
|
||||
{
|
||||
case "boreas": quest.ClueDust1 = true; break;
|
||||
case "moriens": quest.ClueDust2 = true; break;
|
||||
case "carthax": quest.ClueDust3 = true; break;
|
||||
case "tenebrae": quest.ClueDust4 = true; break;
|
||||
}
|
||||
}
|
||||
|
||||
private bool HasFoundClue(GoingGumshoeQuest2 quest)
|
||||
{
|
||||
if (Door == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (Door.Keyword.ToLower())
|
||||
{
|
||||
case "boreas": return quest.ClueDust1;
|
||||
case "moriens": return quest.ClueDust2;
|
||||
case "carthax": return quest.ClueDust3;
|
||||
case "tenebrae": return quest.ClueDust4;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public DustPile(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize(GenericWriter writer)
|
||||
{
|
||||
base.Serialize(writer);
|
||||
|
||||
writer.Write((int)0); // version
|
||||
writer.Write(Door);
|
||||
}
|
||||
|
||||
public override void Deserialize(GenericReader reader)
|
||||
{
|
||||
base.Deserialize(reader);
|
||||
|
||||
int version = reader.ReadInt();
|
||||
Door = reader.ReadItem() as TrapDoor;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,220 @@
|
||||
using System;
|
||||
|
||||
using Server;
|
||||
using Server.Mobiles;
|
||||
using Server.Items;
|
||||
using Server.SkillHandlers;
|
||||
using Server.Network;
|
||||
using Server.Gumps;
|
||||
using Server.Engines.Quests;
|
||||
|
||||
namespace Server.Engines.Khaldun
|
||||
{
|
||||
public class BaseGumshoeForensicItem : Item, IForensicTarget
|
||||
{
|
||||
public virtual string ItemName { get { return null; } }
|
||||
public virtual int Cliloc { get { return 0; } }
|
||||
|
||||
public override bool DisplayWeight { get { return false; } }
|
||||
|
||||
public BaseGumshoeForensicItem(int itemID)
|
||||
: base(itemID)
|
||||
{
|
||||
Movable = false;
|
||||
}
|
||||
|
||||
public void OnForensicEval(Mobile m)
|
||||
{
|
||||
if (!m.Player)
|
||||
return;
|
||||
|
||||
var quest = QuestHelper.GetQuest<GoingGumshoeQuest2>((PlayerMobile)m);
|
||||
|
||||
if (quest != null)
|
||||
{
|
||||
m.PrivateOverheadMessage(MessageType.Regular, 0x47E, 1157722, "Forensics", m.NetState); // *Your proficiency in ~1_SKILL~ reveals more about the item*
|
||||
m.SendLocalizedMessage(1158612, null, 0x23); // You have identified a clue! This item seems pertinent to the investigation!
|
||||
|
||||
m.SendSound(quest.UpdateSound);
|
||||
m.SendSound(m.Female ? 0x30B : 0x41A);
|
||||
|
||||
m.CloseGump(typeof(GumshoeItemGump));
|
||||
m.SendGump(new GumshoeItemGump(m, ItemID, Hue, ItemName, Cliloc, null));
|
||||
}
|
||||
}
|
||||
|
||||
public BaseGumshoeForensicItem(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();
|
||||
}
|
||||
}
|
||||
|
||||
public class GumshoeBottles : BaseGumshoeForensicItem
|
||||
{
|
||||
public override string ItemName { get { return "bottles of wine"; } }
|
||||
public override int Cliloc { get { return 1158572; } }
|
||||
|
||||
[Constructable]
|
||||
public GumshoeBottles()
|
||||
: base(0x9C5)
|
||||
{
|
||||
}
|
||||
|
||||
public GumshoeBottles(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();
|
||||
}
|
||||
}
|
||||
|
||||
public class GumshoeDeed : BaseGumshoeForensicItem
|
||||
{
|
||||
public override string ItemName { get { return "deed"; } }
|
||||
public override int Cliloc { get { return 1158575; } }
|
||||
|
||||
[Constructable]
|
||||
public GumshoeDeed()
|
||||
: base(0x14EF)
|
||||
{
|
||||
}
|
||||
|
||||
public GumshoeDeed(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();
|
||||
}
|
||||
}
|
||||
|
||||
public class GumshoeRope : BaseGumshoeForensicItem
|
||||
{
|
||||
public override string ItemName { get { return "rope"; } }
|
||||
public override int Cliloc { get { return 1158573; } }
|
||||
|
||||
[Constructable]
|
||||
public GumshoeRope()
|
||||
: base(0x14FA)
|
||||
{
|
||||
}
|
||||
|
||||
public GumshoeRope(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();
|
||||
}
|
||||
}
|
||||
|
||||
public class GumshoeMap : BaseGumshoeForensicItem
|
||||
{
|
||||
public override string ItemName { get { return "map"; } }
|
||||
public override int Cliloc { get { return 1158574; } }
|
||||
|
||||
[Constructable]
|
||||
public GumshoeMap()
|
||||
: base(0x14EB)
|
||||
{
|
||||
}
|
||||
|
||||
public GumshoeMap(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();
|
||||
}
|
||||
}
|
||||
|
||||
public class GumshoeTools : BaseGumshoeForensicItem
|
||||
{
|
||||
public override string ItemName { get { return "tools"; } }
|
||||
public override int Cliloc { get { return 1158576; } }
|
||||
|
||||
[Constructable]
|
||||
public GumshoeTools()
|
||||
: base(0x1EBB)
|
||||
{
|
||||
}
|
||||
|
||||
public GumshoeTools(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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
using System;
|
||||
using Server.Mobiles;
|
||||
|
||||
namespace Server.Items
|
||||
{
|
||||
public class GumshoeTitleDeed : BaseRewardTitleDeed
|
||||
{
|
||||
public override TextDefinition Title { get { return 1158638; } } // Gumpshoe
|
||||
|
||||
[Constructable]
|
||||
public GumshoeTitleDeed()
|
||||
{
|
||||
}
|
||||
|
||||
public GumshoeTitleDeed(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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,191 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using Server;
|
||||
using Server.Prompts;
|
||||
using Server.Mobiles;
|
||||
using Server.Items;
|
||||
using Server.SkillHandlers;
|
||||
using Server.Network;
|
||||
using Server.Gumps;
|
||||
using Server.Engines.Quests;
|
||||
|
||||
namespace Server.Engines.Khaldun
|
||||
{
|
||||
public class MysteriousBook : Item, IForensicTarget
|
||||
{
|
||||
public override int LabelNumber { get { return 1158583; } } // mysterious book
|
||||
public static readonly Point3D SpawnLocation = new Point3D(6240, 2885, 7);
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public TrapDoor Door { get; set; }
|
||||
|
||||
public MysteriousBook(TrapDoor door)
|
||||
: base(0x42b8)
|
||||
{
|
||||
Movable = false;
|
||||
Door = door;
|
||||
Hue = 1950;
|
||||
}
|
||||
|
||||
public void OnForensicEval(Mobile m)
|
||||
{
|
||||
if (!m.Player)
|
||||
return;
|
||||
|
||||
var quest = QuestHelper.GetQuest<GoingGumshoeQuest2>((PlayerMobile)m);
|
||||
|
||||
if (quest != null)
|
||||
{
|
||||
if (HasFoundClue1(quest))
|
||||
{
|
||||
m.SendLocalizedMessage(1158613); // You have already documented this clue.
|
||||
}
|
||||
else
|
||||
{
|
||||
m.PrivateOverheadMessage(MessageType.Regular, 0x47E, 1157722, "Forensics", m.NetState); // *Your proficiency in ~1_SKILL~ reveals more about the item*
|
||||
m.SendLocalizedMessage(1158612, null, 0x23); // You have identified a clue! This item seems pertinent to the investigation!
|
||||
|
||||
m.SendSound(quest.UpdateSound);
|
||||
m.SendSound(m.Female ? 0x30B : 0x41A);
|
||||
|
||||
m.CloseGump(typeof(GumshoeItemGump));
|
||||
m.SendGump(new GumshoeItemGump(m, ItemID, Hue, "book", 1158577, null));
|
||||
|
||||
SetFoundClue1(quest);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void OnInscribeTarget(Mobile m)
|
||||
{
|
||||
var quest = QuestHelper.GetQuest<GoingGumshoeQuest2>((PlayerMobile)m);
|
||||
|
||||
if (quest != null)
|
||||
{
|
||||
if (HasFoundClue2(quest))
|
||||
{
|
||||
m.SendLocalizedMessage(1158613); // You have already documented this clue.
|
||||
}
|
||||
else
|
||||
{
|
||||
m.PrivateOverheadMessage(MessageType.Regular, 0x47E, 1158582, m.NetState); // *You copy several pages onto some parchment and roll it up...*
|
||||
m.SendLocalizedMessage(1158612, null, 0x23); // You have identified a clue! This item seems pertinent to the investigation!
|
||||
m.AddToBackpack(new RolledParchment(GetPage()));
|
||||
m.PlaySound(0x249);
|
||||
|
||||
m.SendSound(quest.UpdateSound);
|
||||
|
||||
SetFoundClue2(quest);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void SetFoundClue1(GoingGumshoeQuest2 quest)
|
||||
{
|
||||
if (Door == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
switch (Door.Keyword.ToLower())
|
||||
{
|
||||
case "boreas": quest.ClueBook1_1 = true; break;
|
||||
case "moriens": quest.ClueBook2_1 = true; break;
|
||||
case "carthax": quest.ClueBook3_1 = true; break;
|
||||
case "tenebrae": quest.ClueBook4_1 = true; break;
|
||||
}
|
||||
}
|
||||
|
||||
private void SetFoundClue2(GoingGumshoeQuest2 quest)
|
||||
{
|
||||
if (Door == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
switch (Door.Keyword.ToLower())
|
||||
{
|
||||
case "boreas": quest.ClueBook1_2 = true; break;
|
||||
case "moriens": quest.ClueBook2_2 = true; break;
|
||||
case "carthax": quest.ClueBook3_2 = true; break;
|
||||
case "tenebrae": quest.ClueBook4_2 = true; break;
|
||||
}
|
||||
}
|
||||
|
||||
private bool HasFoundClue1(GoingGumshoeQuest2 quest)
|
||||
{
|
||||
if (Door == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (Door.Keyword.ToLower())
|
||||
{
|
||||
case "boreas": return quest.ClueBook1_1;
|
||||
case "moriens": return quest.ClueBook2_1;
|
||||
case "carthax": return quest.ClueBook3_1;
|
||||
case "tenebrae": return quest.ClueBook4_1;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private bool HasFoundClue2(GoingGumshoeQuest2 quest)
|
||||
{
|
||||
if (Door == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (Door.Keyword.ToLower())
|
||||
{
|
||||
case "boreas": return quest.ClueBook1_2;
|
||||
case "moriens": return quest.ClueBook2_2;
|
||||
case "carthax": return quest.ClueBook3_2;
|
||||
case "tenebrae": return quest.ClueBook4_2;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private int GetPage()
|
||||
{
|
||||
if (Door == null)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch (Door.Keyword.ToLower())
|
||||
{
|
||||
case "boreas": return 1158629;
|
||||
case "moriens": return 1158630;
|
||||
case "carthax": return 1158631;
|
||||
case "tenebrae": return 1158632;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public MysteriousBook(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize(GenericWriter writer)
|
||||
{
|
||||
base.Serialize(writer);
|
||||
|
||||
writer.Write((int)0); // version
|
||||
writer.Write(Door);
|
||||
}
|
||||
|
||||
public override void Deserialize(GenericReader reader)
|
||||
{
|
||||
base.Deserialize(reader);
|
||||
|
||||
int version = reader.ReadInt();
|
||||
Door = reader.ReadItem() as TrapDoor;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using Server;
|
||||
using Server.Prompts;
|
||||
using Server.Mobiles;
|
||||
using Server.Items;
|
||||
using Server.SkillHandlers;
|
||||
using Server.Network;
|
||||
using Server.Gumps;
|
||||
using Server.Engines.Quests;
|
||||
|
||||
namespace Server.Engines.Khaldun
|
||||
{
|
||||
public class RolledParchment : Item
|
||||
{
|
||||
public override int LabelNumber { get { return 1158578; } } // rolled parchment
|
||||
|
||||
public int Page { get; set; }
|
||||
|
||||
public RolledParchment(int page)
|
||||
: base(0x2831)
|
||||
{
|
||||
Page = page;
|
||||
}
|
||||
|
||||
public override void GetProperties(ObjectPropertyList list)
|
||||
{
|
||||
base.GetProperties(list);
|
||||
|
||||
list.Add(Page);
|
||||
}
|
||||
|
||||
public override void OnDoubleClick(Mobile m)
|
||||
{
|
||||
m.CloseGump(typeof(GumshoeItemGump));
|
||||
m.SendGump(new GumshoeItemGump(m, ItemID, Hue, "rolled parchment", 1158580, "Copied From a Book Found in a Hidden Supply Cache"));
|
||||
|
||||
m.PrivateOverheadMessage(MessageType.Regular, 0x47E, 1157722, "its origin", m.NetState); // *Your proficiency in ~1_SKILL~ reveals more about the item*
|
||||
m.SendSound(m.Female ? 0x30B : 0x41A);
|
||||
}
|
||||
|
||||
public RolledParchment(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize(GenericWriter writer)
|
||||
{
|
||||
base.Serialize(writer);
|
||||
|
||||
writer.Write((int)0); // version
|
||||
writer.Write(Page);
|
||||
}
|
||||
|
||||
public override void Deserialize(GenericReader reader)
|
||||
{
|
||||
base.Deserialize(reader);
|
||||
|
||||
int version = reader.ReadInt();
|
||||
Page = reader.ReadInt();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,221 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using Server;
|
||||
using Server.Prompts;
|
||||
using Server.Mobiles;
|
||||
using Server.Items;
|
||||
using Server.SkillHandlers;
|
||||
using Server.Network;
|
||||
using Server.Engines.Quests;
|
||||
|
||||
namespace Server.Engines.Khaldun
|
||||
{
|
||||
public class TrapDoor : Item, IRevealableItem, IForensicTarget
|
||||
{
|
||||
//public static readonly Point3D TeleportDestination1 = new Point3D(6242, 2892, 17);
|
||||
|
||||
public Timer HideTimer { get; set; }
|
||||
public bool CheckWhenHidden { get { return true; } }
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public Map DestinationMap { get; set; }
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public Point3D Destination { get; set; }
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public string Keyword { get; set; }
|
||||
|
||||
private bool _HasBeenExamined;
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public bool HasBeenExamined
|
||||
{
|
||||
get
|
||||
{
|
||||
return _HasBeenExamined;
|
||||
}
|
||||
set
|
||||
{
|
||||
bool current = _HasBeenExamined;
|
||||
_HasBeenExamined = value;
|
||||
|
||||
if (!current && _HasBeenExamined)
|
||||
{
|
||||
HideTimer = Timer.DelayCall(TimeSpan.FromMinutes(20), () => Hide() );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public TrapDoor(string keyword, Point3D dest, Map destMap)
|
||||
: base(0xA1CD)
|
||||
{
|
||||
Keyword = keyword;
|
||||
Destination = dest;
|
||||
DestinationMap = destMap;
|
||||
|
||||
Movable = false;
|
||||
Visible = false;
|
||||
}
|
||||
|
||||
public override void Delete()
|
||||
{
|
||||
base.Delete();
|
||||
|
||||
if (HideTimer != null)
|
||||
{
|
||||
HideTimer.Stop();
|
||||
HideTimer = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void Hide()
|
||||
{
|
||||
Visible = false;
|
||||
HasBeenExamined = false;
|
||||
ItemID = 0xA1CD;
|
||||
|
||||
if (HideTimer != null)
|
||||
{
|
||||
HideTimer.Stop();
|
||||
HideTimer = null;
|
||||
}
|
||||
}
|
||||
|
||||
public bool CheckReveal(Mobile m)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool CheckPassiveDetect(Mobile m)
|
||||
{
|
||||
if (m.InRange(Location, 4))
|
||||
{
|
||||
if (Utility.Random(100) < 10)
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public void OnRevealed(Mobile m)
|
||||
{
|
||||
m.PrivateOverheadMessage(MessageType.Regular, 0x47E, 1158556, m.NetState); // *You notice something hidden in the floor...*
|
||||
Visible = true;
|
||||
}
|
||||
|
||||
public void OnForensicEval(Mobile m)
|
||||
{
|
||||
if (!m.Player)
|
||||
return;
|
||||
|
||||
var quest = QuestHelper.GetQuest<GoingGumshoeQuest2>((PlayerMobile)m);
|
||||
|
||||
if (quest != null && CheckPrerequisite(quest))
|
||||
{
|
||||
m.PrivateOverheadMessage(MessageType.Regular, 0x47E, 1158559, m.NetState); // *You discover a hidden trap door!*
|
||||
m.SendLocalizedMessage(1158611, null, 0x23); // It seems a trap door has been hidden in some false pavers. The heavy wooden door is secured with a rotating combination lock that accepts alpha-numeric characters. You'll need to figure out the passcode to unlock it...
|
||||
|
||||
m.SendSound(quest.UpdateSound);
|
||||
|
||||
HasBeenExamined = true;
|
||||
ItemID = 0xA1CC;
|
||||
|
||||
if (HideTimer != null)
|
||||
{
|
||||
HideTimer.Stop();
|
||||
HideTimer = null;
|
||||
|
||||
HideTimer = Timer.DelayCall(TimeSpan.FromMinutes(20), () => Hide());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private bool CheckPrerequisite(GoingGumshoeQuest2 quest)
|
||||
{
|
||||
switch (Keyword.ToLower())
|
||||
{
|
||||
case "boreas": return quest.VisitedHeastone1; // brit
|
||||
case "moriens": return quest.VisitedHeastone2; // vesper
|
||||
case "carthax": return quest.VisitedHeastone3; // moonglow
|
||||
case "tenebrae": return quest.VisitedHeastone4; // yew
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public override void OnDoubleClick(Mobile m)
|
||||
{
|
||||
if (Destination == Point3D.Zero || DestinationMap == null || DestinationMap == Map.Internal || String.IsNullOrEmpty(Keyword))
|
||||
return;
|
||||
|
||||
if (m.InRange(GetWorldLocation(), 2) && _HasBeenExamined)
|
||||
{
|
||||
m.Prompt = new TrapDoorPrompt(this);
|
||||
}
|
||||
}
|
||||
|
||||
private class TrapDoorPrompt : Prompt
|
||||
{
|
||||
public override int MessageCliloc { get { return 1158557; } }
|
||||
|
||||
public TrapDoor Door { get; set; }
|
||||
|
||||
public TrapDoorPrompt(TrapDoor door)
|
||||
{
|
||||
Door = door;
|
||||
}
|
||||
|
||||
public override void OnResponse(Mobile from, string text)
|
||||
{
|
||||
if (Door.Destination == Point3D.Zero || Door.DestinationMap == null || Door.DestinationMap == Map.Internal || String.IsNullOrEmpty(Door.Keyword))
|
||||
return;
|
||||
|
||||
if (!string.IsNullOrEmpty(text) && text.Trim().ToLower() == Door.Keyword.ToLower())
|
||||
{
|
||||
Effects.SendLocationParticles(EffectItem.Create(from.Location, from.Map, EffectItem.DefaultDuration), 0x3728, 10, 10, 2023);
|
||||
from.MoveToWorld(Door.Destination, Door.DestinationMap);
|
||||
Effects.SendLocationParticles(EffectItem.Create(Door.Destination, Door.DestinationMap, EffectItem.DefaultDuration), 0x3728, 10, 10, 5023);
|
||||
}
|
||||
else
|
||||
{
|
||||
from.SendLocalizedMessage(1155663); // Nothign Happens
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnCancel(Mobile from)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
public TrapDoor(Serial serial)
|
||||
: base(serial)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Serialize(GenericWriter writer)
|
||||
{
|
||||
base.Serialize(writer);
|
||||
|
||||
writer.Write((int)0); // version
|
||||
|
||||
writer.Write(Keyword);
|
||||
writer.Write(Destination);
|
||||
writer.Write(DestinationMap);
|
||||
}
|
||||
|
||||
public override void Deserialize(GenericReader reader)
|
||||
{
|
||||
base.Deserialize(reader);
|
||||
|
||||
int version = reader.ReadInt();
|
||||
|
||||
Keyword = reader.ReadString();
|
||||
Destination = reader.ReadPoint3D();
|
||||
DestinationMap = reader.ReadMap();
|
||||
|
||||
Hide();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,151 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using Server;
|
||||
using Server.Gumps;
|
||||
using Server.Items;
|
||||
using Server.Mobiles;
|
||||
using Server.Engines.Quests;
|
||||
|
||||
namespace Server.Engines.Khaldun
|
||||
{
|
||||
public class Cryptologist : BaseVendor
|
||||
{
|
||||
public static Cryptologist TramInstance { get; set; }
|
||||
|
||||
protected readonly List<SBInfo> m_SBInfos = new List<SBInfo>();
|
||||
protected override List<SBInfo> SBInfos { get { return m_SBInfos; } }
|
||||
public override bool IsActiveVendor { get { return false; } }
|
||||
|
||||
public override void InitSBInfo()
|
||||
{
|
||||
}
|
||||
|
||||
public static void Initialize()
|
||||
{
|
||||
if (Core.TOL)
|
||||
{
|
||||
if (TramInstance == null)
|
||||
{
|
||||
TramInstance = new Cryptologist();
|
||||
TramInstance.MoveToWorld(new Point3D(4325, 949, 10), Map.Trammel);
|
||||
TramInstance.Direction = Direction.South;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Cryptologist()
|
||||
: base("the Cryptologist")
|
||||
{
|
||||
}
|
||||
|
||||
public override void InitBody()
|
||||
{
|
||||
Name = NameList.RandomName("male");
|
||||
InitStats(100, 100, 25);
|
||||
|
||||
Female = false;
|
||||
CantWalk = true;
|
||||
|
||||
Race = Race.Human;
|
||||
Hue = Race.RandomSkinHue();
|
||||
HairHue = Race.RandomHairHue();
|
||||
FacialHairHue = Race.RandomHairHue();
|
||||
HairItemID = Race.RandomHair(false);
|
||||
FacialHairItemID = Race.RandomFacialHair(false);
|
||||
}
|
||||
|
||||
public override void InitOutfit()
|
||||
{
|
||||
AddItem(new Backpack());
|
||||
|
||||
SetWearable(new HakamaShita());
|
||||
SetWearable(new ShortPants(), 1157);
|
||||
SetWearable(new Obi(), 1157);
|
||||
SetWearable(new Sandals());
|
||||
}
|
||||
|
||||
public override void OnDoubleClick(Mobile m)
|
||||
{
|
||||
if (m is PlayerMobile && InRange(m.Location, 5))
|
||||
{
|
||||
GoingGumshoeQuest3 quest = QuestHelper.GetQuest<GoingGumshoeQuest3>((PlayerMobile)m);
|
||||
|
||||
if (quest != null)
|
||||
{
|
||||
if (!quest.FoundCipherBook)
|
||||
{
|
||||
m.SendLocalizedMessage(1158620, null, 0x23); /*You've spoken to the Cryptologist who has agreed to help you if you acquire the Cipher Text.*/
|
||||
m.SendGump(new InternalGump(1158619));
|
||||
}
|
||||
else
|
||||
{
|
||||
m.SendLocalizedMessage(1158621, null, 0x23); /*The Cytologist has successfully begun decrypting the copies of the books you found. He informs you he
|
||||
* will send them to Headquarters when he is finished. Return to Inspector Jasper to follow up on the case.*/
|
||||
m.SendGump(new InternalGump(1158624));
|
||||
|
||||
m.PlaySound(quest.UpdateSound);
|
||||
quest.BegunDecrypting = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
SayTo(m, 1073989, 1154);
|
||||
Effects.PlaySound(Location, Map, 0x441);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class InternalGump : Gump
|
||||
{
|
||||
public InternalGump(int cliloc)
|
||||
: base(50, 50)
|
||||
{
|
||||
AddBackground(0, 0, 720, 285, 9300);
|
||||
AddImage(0, 0, 1744);
|
||||
AddHtmlLocalized(300, 25, 408, 250, cliloc, false, false);
|
||||
|
||||
/*Shhh! Can't you see the students are...*the Cryptologist pauses as you explain the reason for your visit*
|
||||
* Oh, Inspector Jasper sent you did he? Well my service to the RBG is something I hold in -very- high regard.
|
||||
* What can I assist you with? *You show the Cryptologist your copies of the encrypted notes* Yes...yes...a
|
||||
* masterful cipher if I have ever seen one, but one that can easily be cracked! The only thing we need is the
|
||||
* cipher text - but just as it were a number of our texts have been hidden by some students having a bit of
|
||||
* fun with the season. I've already searched the dormitories out back, but I'm certain it's somewhere in the
|
||||
* Lycaeum bookcases, if you find it, I'll be happy to assist you in decrypting the texts. */
|
||||
|
||||
// or //
|
||||
|
||||
/*Wait till I catch the students who did this! Well, I must thank you for recovering this text, it's very useful
|
||||
* in my daily studies. No matter, I will begin decryption of the copies of these clues you gave me. I'll send a
|
||||
* courier to headquarters when I am through. Thank you again for your assistance! */
|
||||
}
|
||||
}
|
||||
|
||||
public Cryptologist(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 (!Core.TOL)
|
||||
Delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,138 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using Server;
|
||||
using Server.Gumps;
|
||||
using Server.Items;
|
||||
using Server.Mobiles;
|
||||
using Server.Engines.Quests;
|
||||
|
||||
namespace Server.Engines.Khaldun
|
||||
{
|
||||
public class GraveDigger : BaseVendor
|
||||
{
|
||||
protected readonly List<SBInfo> m_SBInfos = new List<SBInfo>();
|
||||
protected override List<SBInfo> SBInfos { get { return m_SBInfos; } }
|
||||
public override bool IsActiveVendor { get { return false; } }
|
||||
|
||||
public override void InitSBInfo()
|
||||
{
|
||||
}
|
||||
|
||||
public static GraveDigger TramInstance { get; set; }
|
||||
//public static GraveDigger FelInstance { get; set; }
|
||||
|
||||
public static void Initialize()
|
||||
{
|
||||
if (Core.TOL)
|
||||
{
|
||||
if (TramInstance == null)
|
||||
{
|
||||
TramInstance = new GraveDigger();
|
||||
TramInstance.MoveToWorld(new Point3D(1382, 1447, 10), Map.Trammel);
|
||||
TramInstance.Direction = Direction.South;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public GraveDigger()
|
||||
: base("the Grave Digger")
|
||||
{
|
||||
}
|
||||
|
||||
public override void InitBody()
|
||||
{
|
||||
Name = NameList.RandomName("male");
|
||||
InitStats(100, 100, 25);
|
||||
|
||||
Female = false;
|
||||
CantWalk = true;
|
||||
|
||||
Race = Race.Human;
|
||||
Hue = Race.RandomSkinHue();
|
||||
HairHue = Race.RandomHairHue();
|
||||
FacialHairHue = Race.RandomHairHue();
|
||||
HairItemID = 0x203C;
|
||||
FacialHairItemID = 0x203E;
|
||||
}
|
||||
|
||||
public override void InitOutfit()
|
||||
{
|
||||
AddItem(new Backpack());
|
||||
|
||||
SetWearable(new Surcoat(), 1634);
|
||||
SetWearable(new Kilt(), 946);
|
||||
SetWearable(new FancyShirt(), 1411);
|
||||
SetWearable(new ThighBoots(), 2013);
|
||||
SetWearable(new GoldBracelet());
|
||||
SetWearable(new GoldRing());
|
||||
}
|
||||
|
||||
public override void OnDoubleClick(Mobile m)
|
||||
{
|
||||
if (m is PlayerMobile && InRange(m.Location, 5))
|
||||
{
|
||||
GoingGumshoeQuest2 quest = QuestHelper.GetQuest<GoingGumshoeQuest2>((PlayerMobile)m);
|
||||
|
||||
if (quest != null)
|
||||
{
|
||||
m.SendLocalizedMessage(1158606, null, 0x23); /* You've spoken to the Grave Digger and have paid your respects to those who
|
||||
perished in the fight against the titans. How someone could defile a grave
|
||||
stone, you have no idea. You decide to take a closer look... */
|
||||
|
||||
m.PlaySound(quest.UpdateSound);
|
||||
|
||||
m.SendGump(new InternalGump());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class InternalGump : Gump
|
||||
{
|
||||
public InternalGump()
|
||||
: base(50, 50)
|
||||
{
|
||||
AddBackground(0, 0, 720, 285, 9300);
|
||||
AddImage(0, 0, 1743);
|
||||
AddHtmlLocalized(300, 25, 408, 250, 1158570, false, false);
|
||||
|
||||
/*Solemn job you know, but someone has to do it. Been pretty busy since the invasions, hardly a day goes by we don't
|
||||
* have the kin of someone who embraced Sacrifice and gave themselves in defense of the realm against the Titans.
|
||||
* Ah well, makes me feel good knowing me shovel gives em a good final resting place. Worst part ya know though -
|
||||
* plenty of people been in and out of the cemetery for sure, but I don't know why they insist on messing up the
|
||||
* headstones!? To think, some people have no Shame!*/
|
||||
}
|
||||
}
|
||||
|
||||
public GraveDigger(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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,213 @@
|
||||
using System;
|
||||
|
||||
using Server;
|
||||
using Server.Gumps;
|
||||
using Server.Items;
|
||||
using Server.Mobiles;
|
||||
using Server.Engines.Quests;
|
||||
|
||||
namespace Server.Engines.Khaldun
|
||||
{
|
||||
public class InspectorJasper : MondainQuester
|
||||
{
|
||||
public override Type[] Quests { get { return null; } }
|
||||
|
||||
public static InspectorJasper TramInstance { get; set; }
|
||||
|
||||
public static void Initialize()
|
||||
{
|
||||
if (Core.TOL)
|
||||
{
|
||||
if (TramInstance == null)
|
||||
{
|
||||
TramInstance = new InspectorJasper();
|
||||
TramInstance.MoveToWorld(new Point3D(1675, 1584, 7), Map.Trammel);
|
||||
TramInstance.Direction = Direction.South;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public InspectorJasper()
|
||||
: base("Jasper", "the Inspector")
|
||||
{
|
||||
}
|
||||
|
||||
public override void InitBody()
|
||||
{
|
||||
InitStats(100, 100, 25);
|
||||
|
||||
Female = false;
|
||||
CantWalk = true;
|
||||
|
||||
Race = Race.Elf;
|
||||
Hue = 33770;
|
||||
HairItemID = 0x2FCF;
|
||||
HairHue = Race.RandomHairHue();
|
||||
}
|
||||
|
||||
public override void InitOutfit()
|
||||
{
|
||||
AddItem(new Backpack());
|
||||
|
||||
SetWearable(new LongPants(), 1156);
|
||||
SetWearable(new FancyShirt());
|
||||
SetWearable(new Epaulette(), 1156);
|
||||
SetWearable(new BodySash(), 1175);
|
||||
SetWearable(new Obi(), 1156);
|
||||
SetWearable(new Shoes(), 1910);
|
||||
}
|
||||
|
||||
public override void OnDoubleClick(Mobile m)
|
||||
{
|
||||
if (m is PlayerMobile && m.InRange(Location, 5))
|
||||
{
|
||||
GoingGumshoeQuest quest = QuestHelper.GetQuest<GoingGumshoeQuest>((PlayerMobile)m);
|
||||
|
||||
if (quest != null && quest.Completed)
|
||||
{
|
||||
quest.GiveRewards();
|
||||
|
||||
BaseQuest newquest = QuestHelper.RandomQuest((PlayerMobile)m, new Type[] { typeof(GoingGumshoeQuest2) }, this);
|
||||
|
||||
if (newquest != null)
|
||||
m.SendGump(new MondainQuestGump(newquest));
|
||||
}
|
||||
else
|
||||
{
|
||||
GoingGumshoeQuest2 quest2 = QuestHelper.GetQuest<GoingGumshoeQuest2>((PlayerMobile)m);
|
||||
|
||||
if (quest2 != null)
|
||||
{
|
||||
if (quest2.IsComplete)
|
||||
{
|
||||
quest2.Objectives[0].CurProgress++;
|
||||
quest2.GiveRewards(); // TODO: Does this quest end here?
|
||||
|
||||
BaseQuest newquest = QuestHelper.RandomQuest((PlayerMobile)m, new Type[] { typeof(GoingGumshoeQuest3) }, this);
|
||||
|
||||
if (newquest != null)
|
||||
m.SendGump(new MondainQuestGump(newquest));
|
||||
}
|
||||
else
|
||||
{
|
||||
m.SendGump(new MondainQuestGump(quest2, MondainQuestGump.Section.InProgress, false));
|
||||
quest2.InProgress();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
GoingGumshoeQuest3 quest3 = QuestHelper.GetQuest<GoingGumshoeQuest3>((PlayerMobile)m);
|
||||
|
||||
if (quest3 != null)
|
||||
{
|
||||
if (quest3.IsComplete)
|
||||
{
|
||||
quest3.Objectives[0].CurProgress++;
|
||||
quest3.GiveRewards(); // TODO: Does this quest end here?
|
||||
|
||||
BaseQuest newquest = QuestHelper.RandomQuest((PlayerMobile)m, new Type[] { typeof(GoingGumshoeQuest4) }, this);
|
||||
|
||||
if (newquest != null)
|
||||
m.SendGump(new MondainQuestGump(newquest));
|
||||
}
|
||||
else
|
||||
{
|
||||
m.SendGump(new MondainQuestGump(quest3, MondainQuestGump.Section.InProgress, false));
|
||||
quest3.InProgress();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
GoingGumshoeQuest4 quest4 = QuestHelper.GetQuest<GoingGumshoeQuest4>((PlayerMobile)m);
|
||||
|
||||
if (quest4 != null && !quest4.IsComplete)
|
||||
{
|
||||
m.SendGump(new MondainQuestGump(quest4, MondainQuestGump.Section.InProgress, false));
|
||||
quest4.InProgress();
|
||||
}
|
||||
else if (quest4 == null)
|
||||
{
|
||||
SayTo(m, 1080107); // I'm sorry, I have nothing for you at this time.
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnMovement(Mobile m, Point3D oldLocation)
|
||||
{
|
||||
if (m is PlayerMobile && InLOS(m) && InRange(m.Location, 3) && !InRange(oldLocation, 3))
|
||||
{
|
||||
var quest = QuestHelper.GetQuest<GoingGumshoeQuest>((PlayerMobile)m);
|
||||
|
||||
if (quest != null)
|
||||
{
|
||||
quest.Objectives[0].CurProgress++;
|
||||
quest.OnCompleted();
|
||||
}
|
||||
else
|
||||
{
|
||||
var quest2 = QuestHelper.GetQuest<GoingGumshoeQuest4>((PlayerMobile)m);
|
||||
|
||||
if (quest2 != null && quest2.IsComplete)
|
||||
{
|
||||
quest2.Objectives[0].CurProgress++;
|
||||
|
||||
m.SendGump(new InternalGump());
|
||||
m.PlaySound(quest2.CompleteSound);
|
||||
quest2.GiveRewards();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class InternalGump : Gump
|
||||
{
|
||||
public InternalGump()
|
||||
: base(50, 50)
|
||||
{
|
||||
AddBackground(0, 0, 400, 600, 9300);
|
||||
AddImage(58, 30, 1745);
|
||||
|
||||
AddHtmlLocalized(0, 340, 400, 20, 1154645, "#1158625", 0x0, false, false); // It all comes together...
|
||||
AddHtmlLocalized(5, 365, 390, 200, 1158626, BaseGump.C32216(0x0D0D0D), false, true);
|
||||
|
||||
/**You approach Inspector Jasper and relay to him what Sage Humbolt told you...he remains expressionless*
|
||||
* This is much more sinister than any of us could have ever imagined. I had little doubt your investigatory
|
||||
* skills would yield anything but a major revelation - but this? Who could have thought. I have dispatched
|
||||
* a team to the location Sage Humbolt spoke of. It is up to everyone now to prevent this coming evil. Here
|
||||
* you go, you've earned this. Wear this title proudly. This official credential identifies you as a member
|
||||
* of the RBG Detective Branch and will allow you past the guards at the site Sage Humbolt spoke of near
|
||||
* 57o 7'S, 5o 20'E in the Lost Lands.*/
|
||||
}
|
||||
}
|
||||
|
||||
public InspectorJasper(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 (!Core.TOL)
|
||||
Delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,151 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using Server;
|
||||
using Server.Gumps;
|
||||
using Server.Items;
|
||||
using Server.Mobiles;
|
||||
using Server.Engines.Quests;
|
||||
|
||||
namespace Server.Engines.Khaldun
|
||||
{
|
||||
public class SageHumbolt : BaseVendor
|
||||
{
|
||||
public static SageHumbolt TramInstance { get; set; }
|
||||
|
||||
protected readonly List<SBInfo> m_SBInfos = new List<SBInfo>();
|
||||
protected override List<SBInfo> SBInfos { get { return m_SBInfos; } }
|
||||
public override bool IsActiveVendor { get { return false; } }
|
||||
|
||||
public override void InitSBInfo()
|
||||
{
|
||||
}
|
||||
|
||||
public static void Initialize()
|
||||
{
|
||||
if (Core.TOL)
|
||||
{
|
||||
if (TramInstance == null)
|
||||
{
|
||||
TramInstance = new SageHumbolt();
|
||||
TramInstance.MoveToWorld(new Point3D(5808, 3270, -15), Map.Trammel);
|
||||
TramInstance.Direction = Direction.North;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public SageHumbolt()
|
||||
: base("the Ghost")
|
||||
{
|
||||
IsDeadPet = true;
|
||||
}
|
||||
|
||||
public override void InitBody()
|
||||
{
|
||||
Name = "Sage Humbolt";
|
||||
InitStats(100, 100, 25);
|
||||
|
||||
Female = false;
|
||||
CantWalk = true;
|
||||
|
||||
Race = Race.Human;
|
||||
Hue = Race.RandomSkinHue();
|
||||
}
|
||||
|
||||
public override void InitOutfit()
|
||||
{
|
||||
AddItem(new Backpack());
|
||||
|
||||
var robe = new DeathRobe();
|
||||
robe.ItemID = 9863;
|
||||
SetWearable(robe);
|
||||
}
|
||||
|
||||
public bool OnSpiritSpeak(Mobile m)
|
||||
{
|
||||
var pm = m as PlayerMobile;
|
||||
|
||||
if (pm != null)
|
||||
{
|
||||
var quest = QuestHelper.GetQuest<GoingGumshoeQuest4>(pm);
|
||||
|
||||
if (quest != null && !quest.IsComplete)
|
||||
{
|
||||
/*You have successfully found Sage Humbolt who has opened you eyes to the entire conspiracy, and the danger that looms ahead
|
||||
* if no steps are taken to alter the current course of events. Return to Inspector Jasper to report your findings.*/
|
||||
m.SendLocalizedMessage(1158636, null, 0x23);
|
||||
m.SendGump(new InternalGump());
|
||||
|
||||
m.PlaySound(quest.UpdateSound);
|
||||
quest.IsComplete = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private class InternalGump : Gump
|
||||
{
|
||||
public InternalGump()
|
||||
: base(50, 50)
|
||||
{
|
||||
AddBackground(0, 0, 400, 600, 9300);
|
||||
AddImage(58, 30, 1746);
|
||||
|
||||
AddHtmlLocalized(0, 340, 400, 20, 1154645, "#1158623", 0x0, false, false); // The Prophecy
|
||||
AddHtmlLocalized(5, 365, 390, 200, 1158622, BaseGump.C32216(0x0D0D0D), false, true);
|
||||
|
||||
/**The ghostly figure looks at you with disappointment* You've brought the cheese haven't you? Gah,
|
||||
* I can never find it! *the ghost goes back to waving its hands through the barrels* You explain
|
||||
* who you are, and the circumstances that have lead you to this moment. With each word the ghost
|
||||
* becomes increasingly alarmed, yet an expression of expectation and satisfaction is apparent from
|
||||
* their reaction. The ghost nods and begins to speak in a tongue you can understand,<br><br> "That's
|
||||
* right. I am Sage Humbolt, or I was. What you speak of is especially concerning. The events you
|
||||
* describe - the invasion by otherworldly cultist, the titans, all of it - it was something foretold
|
||||
* long ago. But these most recent revelations, I was hopeful that, like most prophecies, this was a
|
||||
* bit of embellishment by sages through the millenia. Alas, it seems this prophecy has come full
|
||||
* circle.<br><br>Long ago, a great warrior named Khal Ankur lead a cult devoted to death and sacrifice
|
||||
* . Like most zealots of such a twisted dogma, Khal Ankur met his end and was sealed inside a tomb deep
|
||||
* in the Lost Lands. Not until four explorers uncovered the tomb did we even know for sure it existed.
|
||||
* The prophecy tells of a fallen star that would allow Khal Ankur to rise again and lead an army of
|
||||
* zealots against those who imprisoned him. With the strength of this fallen star Khal Ankur would be
|
||||
* impossible to kill, save for with the very power the fallen star gives to Khal Ankur. You must never
|
||||
* allow Khal Ankur to rise again, lest the cultists may use their power to recall the Titans to this
|
||||
* world! The fallen star is rich with a material called Caddellite, which gives Khal Ankur unmatched
|
||||
* power. I hope you know a good tinker, as Caddellite is a fiercely strong material that is otherwise
|
||||
* impossible to harvest. With Caddellite infused resources you will be able to supply an army of the
|
||||
* willing with weapons, arcana, and provisions to dispatch this threat once and for all. Go now, there
|
||||
* is little time to lose. Now I've got to get back to my cheese, what a new and exciting place Papua is... */
|
||||
}
|
||||
}
|
||||
|
||||
public SageHumbolt(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 (!Core.TOL)
|
||||
Delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user