using System; using System.Collections.Generic; using Server; using Server.Items; using Server.Network; using Server.Mobiles; using Server.Prompts; using Server.Targeting; using Server.Engines.XmlSpawner2; namespace Server.Gumps { public class XmlQuestStatusGump : Gump { public static string Color(string text, string color) { return String.Format("{1}", color, text); } public void DisplayQuestStatus(int x, int y, string objectivestr, string statestr, bool status, string descriptionstr) { if (objectivestr != null && objectivestr.Length > 0) { // look for special keywords string[] arglist = BaseXmlSpawner.ParseString(objectivestr, 5, ","); int targetcount = 1; bool foundkill = false; bool foundcollect = false; bool foundgive = false; bool foundescort = false; string name = null; string mobname = null; string type = null; string status_str; string text = null; string typestr; bool checkprop; if (arglist.Length > 0) switch (arglist[0]) { case "GIVE": // format for the objective string will be GIVE,mobname,itemtype[,count][,proptest] if (arglist.Length > 2) { mobname = arglist[1]; //name = arglist[2]; type = arglist[2]; } XmlQuest.CheckArgList(arglist, 3, null, out typestr, out targetcount, out checkprop, out status_str); foundgive = true; break; case "GIVENAMED": // format for the objective string will be GIVENAMED,mobname,itemname[,type][,count][,proptest] if (arglist.Length > 2) { mobname = arglist[1]; name = arglist[2]; } XmlQuest.CheckArgList(arglist, 3, null, out typestr, out targetcount, out checkprop, out status_str); if (typestr != null) type = typestr; foundgive = true; break; case "KILL": // format for the objective string will be KILL,mobtype[,count][,proptest] if (arglist.Length > 1) { //name = arglist[1]; type = arglist[1]; } XmlQuest.CheckArgList(arglist, 2, null, out typestr, out targetcount, out checkprop, out status_str); foundkill = true; break; case "KILLNAMED": // format for the objective string KILLNAMED,mobname[,type][,count][,proptest] if (arglist.Length > 1) { name = arglist[1]; } XmlQuest.CheckArgList(arglist, 2, null, out typestr, out targetcount, out checkprop, out status_str); if (typestr != null) type = typestr; foundkill = true; break; case "COLLECT": // format for the objective string will be COLLECT,itemtype[,count][,proptest] if (arglist.Length > 1) { //name = arglist[1]; type = arglist[1]; } XmlQuest.CheckArgList(arglist, 2, null, out typestr, out targetcount, out checkprop, out status_str); foundcollect = true; break; case "COLLECTNAMED": // format for the objective string will be COLLECTNAMED,itemname[,itemtype][,count][,proptest] if (arglist.Length > 1) { name = arglist[1]; } XmlQuest.CheckArgList(arglist, 2, null, out typestr, out targetcount, out checkprop, out status_str); if (typestr != null) type = typestr; foundcollect = true; break; case "ESCORT": // format for the objective string will be ESCORT,mobname[,proptest] if (arglist.Length > 1) { name = arglist[1]; } foundescort = true; break; } if (foundkill) { // get the current kill status int killed = 0; try { killed = int.Parse(statestr); } catch { } int remaining = targetcount - killed; if (remaining < 0) remaining = 0; // report the kill task objective status if (descriptionstr != null) text = String.Format("{0} ({1} left)", descriptionstr, remaining); else { if (name != null) { if (type == null) type = "mob"; text = String.Format("Kill {0} {1}(s) named {2} ({3} left)", targetcount, type, name, remaining); } else text = String.Format("Kill {0} {1}(s) ({2} left)", targetcount, type, remaining); } } else if (foundescort) { // get the current escort status int escorted = 0; try { escorted = int.Parse(statestr); } catch { } int remaining = targetcount - escorted; if (remaining < 0) remaining = 0; // report the escort task objective status if (descriptionstr != null) text = descriptionstr; else text = String.Format("Escort {0}", name); } else if (foundcollect) { // get the current collection status int collected = 0; try { collected = int.Parse(statestr); } catch { } int remaining = targetcount - collected; if (remaining < 0) remaining = 0; // report the collect task objective status if (descriptionstr != null) text = String.Format("{0} ({1} left)", descriptionstr, remaining); else { if (name != null) { if (type == null) type = "mob"; text = String.Format("Collect {0} {1}(s) named {2} ({3} left)", targetcount, type, name, remaining); } else text = String.Format("Collect {0} {1}(s) ({2} left)", targetcount, type, remaining); } } else if (foundgive) { // get the current give status int collected = 0; try { collected = int.Parse(statestr); } catch { } int remaining = targetcount - collected; if (remaining < 0) remaining = 0; // report the collect task objective status if (descriptionstr != null) text = String.Format("{0} ({1} left)", descriptionstr, remaining); else { if (name != null) { if (type == null) type = "item"; text = String.Format("Give {0} {1}(s) named {2} to {3} ({4} left)", targetcount, type, name, mobname, remaining); } else text = String.Format("Give {0} {1}(s) to {2} ({3} left)", targetcount, type, mobname, remaining); } } else { // just report the objectivestring text = objectivestr; } AddHtml(x, y, 223, 35, XmlSimpleGump.Color(text, "EFEF5A"), false, false); if (status) { AddImage(x - 20, y + 3, 0x939); // bullet AddHtmlLocalized(x + 222, y, 225, 37, 1046033, 0xff42, false, false); // Complete } else { AddImage(x - 20, y + 3, 0x938); // bullet AddHtmlLocalized(x + 222, y, 225, 37, 1046034, 0x7fff, false, false); // Incomplete } } } private IXmlQuest m_questitem; private string m_gumptitle; private int m_X; private int m_Y; private bool m_solid; private int m_screen; public XmlQuestStatusGump(IXmlQuest questitem, string gumptitle) : this(questitem, gumptitle, 0, 0, false, 0) { } public XmlQuestStatusGump(IXmlQuest questitem, string gumptitle, int X, int Y, bool solid) : this(questitem, gumptitle, X, Y, solid, 0) { } public XmlQuestStatusGump(IXmlQuest questitem, string gumptitle, int X, int Y, bool solid, int screen) : base(X, Y) { Closable = true; Dragable = true; m_X = X; m_Y = Y; m_solid = solid; m_questitem = questitem; m_gumptitle = gumptitle; m_screen = screen; AddPage(0); if (!solid) { AddImageTiled(54, 33, 369, 400, 2624); AddAlphaRegion(54, 33, 369, 400); } else { AddBackground(54, 33, 369, 400, 5054); } AddImageTiled(416, 39, 44, 389, 203); // AddButton( 338, 392, 2130, 2129, 3, GumpButtonType.Reply, 0 ); // Okay button AddHtmlLocalized(139, 59, 200, 30, 1046026, 0x7fff, false, false); // Quest Log AddImage(97, 49, 9005); // quest ribbon AddImageTiled(58, 39, 29, 390, 10460); // left hand border AddImageTiled(412, 37, 31, 389, 10460); // right hand border AddImage(430, 9, 10441); AddImageTiled(40, 38, 17, 391, 9263); AddImage(6, 25, 10421); AddImage(34, 12, 10420); AddImageTiled(94, 25, 342, 15, 10304); // top border AddImageTiled(40, 414, 415, 16, 10304); // bottom border AddImage(-10, 314, 10402); AddImage(56, 150, 10411); AddImage(136, 84, 96); AddImage(372, 57, 1417); AddImage(381, 66, 5576); // add the status and journal tabs AddImageTiled(90, 34, 322, 5, 0x145E); // top border int tab1 = 0x138F; int tab2 = 0x138E; if (screen == 1) { tab1 = 0x138E; tab2 = 0x138F; } AddButton(100, 18, tab1, tab2, 900, GumpButtonType.Reply, 0); AddLabel(115, 17, 0, "Status"); AddButton(189, 18, tab2, tab1, 901, GumpButtonType.Reply, 0); AddLabel(205, 17, 0, "Journal"); if (screen == 1) { // display the journal if (questitem.Journal != null && questitem.Journal.Count > 0) { string journaltext = null; for (int i = 0; i < questitem.Journal.Count; i++) { journaltext += ""; journaltext += questitem.Journal[i].EntryID; journaltext += ":
"; journaltext += questitem.Journal[i].EntryText; journaltext += "

"; } AddHtml(100, 90, 270, 300, journaltext, true, true); } // add the add journal entry button AddButton(300, 49, 0x99C, 0x99D, 952, GumpButtonType.Reply, 0); //AddButton(300, 49, 0x159E, 0x159D, 952, GumpButtonType.Reply, 0); } else { if (gumptitle != null && gumptitle.Length > 0) { // display the title if it is there AddImage(146, 91, 2103); // bullet AddHtml(164, 86, 200, 30, XmlSimpleGump.Color(gumptitle, "00FF42"), false, false); } if (questitem.NoteString != null && questitem.NoteString.Length > 0) { // display the note string if it is there AddHtml(100, 106, 270, 80, questitem.NoteString, true, true); } DisplayQuestStatus(130, 192, questitem.Objective1, questitem.State1, questitem.Completed1, questitem.Description1); DisplayQuestStatus(130, 224, questitem.Objective2, questitem.State2, questitem.Completed2, questitem.Description2); DisplayQuestStatus(130, 256, questitem.Objective3, questitem.State3, questitem.Completed3, questitem.Description3); DisplayQuestStatus(130, 288, questitem.Objective4, questitem.State4, questitem.Completed4, questitem.Description4); DisplayQuestStatus(130, 320, questitem.Objective5, questitem.State5, questitem.Completed5, questitem.Description5); //if(questitem.HasCollect){ AddButton(100, 350, 0x2A4E, 0x2A3A, 700, GumpButtonType.Reply, 0); AddLabel(135, 356, 0x384, "Collect"); //} if ((questitem.RewardItem != null && !questitem.RewardItem.Deleted)) { m_questitem.CheckRewardItem(); if (questitem.RewardItem.Amount > 1) { AddLabel(230, 356, 55, String.Format("Reward: {0} ({1})", questitem.RewardItem.GetType().Name, questitem.RewardItem.Amount)); AddLabel(230, 373, 55, String.Format("Weight: {0}", questitem.RewardItem.Weight * questitem.RewardItem.Amount)); } else if (questitem.RewardItem is Container) { AddLabel(230, 356, 55, String.Format("Reward: {0} ({1} items)", questitem.RewardItem.GetType().Name, questitem.RewardItem.TotalItems)); AddLabel(230, 373, 55, String.Format("Weight: {0}", questitem.RewardItem.TotalWeight + questitem.RewardItem.Weight)); } else { AddLabel(230, 356, 55, String.Format("Reward: {0}", questitem.RewardItem.GetType().Name)); AddLabel(230, 373, 55, String.Format("Weight: {0}", questitem.RewardItem.Weight)); } AddImageTiled(330, 373, 81, 40, 200); AddItem(340, 376, questitem.RewardItem.ItemID); } if (questitem.RewardAttachment != null && !questitem.RewardAttachment.Deleted) { AddLabel(230, 339, 55, String.Format("Bonus: {0}", questitem.RewardAttachment.GetType().Name)); } if ((questitem.RewardItem != null && !questitem.RewardItem.Deleted) || (questitem.RewardAttachment != null && !questitem.RewardAttachment.Deleted)) { if (questitem.CanSeeReward) { AddButton(400, 380, 2103, 2103, 800, GumpButtonType.Reply, 0); } } // indicate any status info XmlQuest.VerifyObjectives(questitem); if (questitem.Status != null) { AddLabel(100, 392, 33, questitem.Status); } else // indicate the expiration time if (questitem.IsValid) { //AddHtmlLocalized(150, 400, 50, 37, 1046033, 0xf0000 , false , false ); // Expires AddHtml(130, 392, 200, 37, XmlSimpleGump.Color(questitem.ExpirationString, "00FF42"), false, false); } else if (questitem.AlreadyDone) { if (!questitem.Repeatable) { AddLabel(100, 392, 33, "Already done - cannot be repeated"); } else { List a = XmlAttach.FindAttachments(questitem.Owner, typeof(XmlQuestAttachment), questitem.Name); if (a != null && a.Count > 0) { AddLabel(100, 392, 33, String.Format("Repeatable in {0}", a[0].Expiration)); } else { AddLabel(150, 392, 33, "Already done - ???"); } } } else { //AddHtml( 150, 384, 200, 37, XmlSimpleGump.Color( "No longer valid", "00FF42" ), false, false ); AddLabel(150, 392, 33, "No longer valid"); } if (XmlQuest.QuestPointsEnabled) { AddHtml(250, 40, 200, 30, XmlSimpleGump.Color(String.Format("Difficulty Level {0}", questitem.Difficulty), "00FF42"), false, false); } if (questitem.PartyEnabled) { AddHtml(250, 55, 200, 30, XmlSimpleGump.Color("Party Quest", "00FF42"), false, false); if (questitem.PartyRange >= 0) { AddHtml(250, 70, 200, 30, XmlSimpleGump.Color(String.Format("Party Range {0}", questitem.PartyRange), "00FF42"), false, false); } else { AddHtml(250, 70, 200, 30, XmlSimpleGump.Color("No Range Limit", "00FF42"), false, false); } } else { AddHtml(250, 55, 200, 30, XmlSimpleGump.Color("Solo Quest", "00FF42"), false, false); } } } public override void OnResponse(NetState state, RelayInfo info) { if (info == null || state == null || state.Mobile == null || state.Mobile.Deleted || m_questitem == null || m_questitem.Deleted) return; switch (info.ButtonID) { case 700: state.Mobile.Target = new XmlQuest.GetCollectTarget(m_questitem); state.Mobile.SendGump(new XmlQuestStatusGump(m_questitem, m_gumptitle, m_X, m_Y, m_solid, m_screen)); break; case 800: if(!m_questitem.CanSeeReward) return; if (m_questitem.RewardItem != null || m_questitem.RewardAttachment != null) { // open a new status gump state.Mobile.SendGump(new XmlQuestStatusGump(m_questitem, m_gumptitle, m_X, m_Y, m_solid, m_screen)); } // display the reward item if (m_questitem.RewardItem != null) { // show the contents of the xmlquest pack if (m_questitem.Pack != null) m_questitem.Pack.DisplayTo(state.Mobile); } // identify the reward attachment if (m_questitem.RewardAttachment != null) { //state.Mobile.SendMessage("{0}",m_questitem.RewardAttachment.OnIdentify(state.Mobile)); state.Mobile.CloseGump(typeof(DisplayAttachmentGump)); state.Mobile.SendGump(new DisplayAttachmentGump(state.Mobile, m_questitem.RewardAttachment.OnIdentify(state.Mobile))); } break; case 900: // open a new status gump with status display state.Mobile.SendGump(new XmlQuestStatusGump(m_questitem, m_gumptitle, m_X, m_Y, m_solid, 0)); break; case 901: // open a new status gump with journal display state.Mobile.SendGump(new XmlQuestStatusGump(m_questitem, m_gumptitle, m_X, m_Y, m_solid, 1)); break; case 952: // open a new status gump with journal display state.Mobile.SendGump(new XmlQuestStatusGump(m_questitem, m_gumptitle, m_X, m_Y, m_solid, 1)); // and open the journal entry editing gump // only allow this to be used if the questholder is theirs if (m_questitem.Owner == state.Mobile) { state.Mobile.SendGump(new JournalEntryGump(m_questitem, m_gumptitle, m_X, m_Y, m_solid)); } break; } } public class JournalEntryGump : Gump { private IXmlQuest m_questitem; private string m_gumptitle; private int m_X, m_Y; private bool m_solid; public JournalEntryGump(IXmlQuest questitem, string gumptitle, int X, int Y, bool solid) : base(X, Y) { if (questitem == null || questitem.Deleted) return; m_questitem = questitem; m_gumptitle = gumptitle; m_X = X; m_Y = Y; m_solid = solid; AddPage(0); //AddBackground(0, 0, 260, 354, 5054); //AddAlphaRegion(20, 0, 220, 354); AddImage(0, 0, 0x24AE); // left top scroll AddImage(114, 0, 0x24AF); // middle top scroll AddImage(170, 0, 0x24B0); // right top scroll AddImageTiled(0, 140, 114, 100, 0x24B1); // left middle scroll AddImageTiled(114, 140, 114, 100, 0x24B2); // middle middle scroll AddImageTiled(170, 140, 114, 100, 0x24B3); // right middle scroll AddImage(0, 210, 0x24B4); // left bottom scroll AddImage(114, 210, 0x24B5); // middle bottom scroll AddImage(170, 210, 0x24B6); // right bottom scroll //AddImageTiled(23, 40, 214, 290, 0x52); //AddImageTiled(24, 41, 213, 281, 0xBBC); // OK button AddButton(25, 327, 0xFB7, 0xFB9, 1, GumpButtonType.Reply, 0); // Close button AddButton(230, 327, 0xFB1, 0xFB3, 0, GumpButtonType.Reply, 0); // Edit button //AddButton(100, 325, 0xEF, 0xEE, 2, GumpButtonType.Reply, 0); string str = null; int entrynumber = 0; if (questitem.Journal != null && questitem.Journal.Count > 0) { entrynumber = questitem.Journal.Count; } string m_entryid = "Personal entry #" + entrynumber; // entryid text entry area //AddImageTiled(23, 0, 214, 23, 0x52); //AddImageTiled(24, 1, 213, 21, 0xBBC); AddTextEntry(35, 5, 200, 21, 0, 1, m_entryid); // main text entry area AddTextEntry(35, 40, 200, 271, 0, 0, str); // editing text entry areas // background for text entry area /* AddImageTiled(23, 275, 214, 23, 0x52); AddImageTiled(24, 276, 213, 21, 0xBBC); AddImageTiled(23, 300, 214, 23, 0x52); AddImageTiled(24, 301, 213, 21, 0xBBC); AddTextEntry(35, 275, 200, 21, 0, 1, null); AddTextEntry(35, 300, 200, 21, 0, 2, null); */ } public override void OnResponse(NetState state, RelayInfo info) { if (info == null || state == null || state.Mobile == null) return; if (m_questitem == null || m_questitem.Deleted) return; bool update_entry = false; //bool edit_entry = false; switch (info.ButtonID) { case 0: // Close { update_entry = false; break; } case 1: // Okay { update_entry = true; break; } case 2: // Edit { //edit_entry = true; break; } default: update_entry = true; break; } if (update_entry) { string entrytext = null; string entryid = null; TextRelay entry = info.GetTextEntry(0); if (entry != null) { entrytext = entry.Text; } entry = info.GetTextEntry(1); if (entry != null) { entryid = entry.Text; } m_questitem.AddJournalEntry = entryid + ":" + entrytext; } // open a new journal gump state.Mobile.CloseGump(typeof(XmlQuestStatusGump)); state.Mobile.SendGump(new XmlQuestStatusGump(m_questitem, m_gumptitle, m_X, m_Y, m_solid, 1)); } } private class DisplayAttachmentGump : Gump { public DisplayAttachmentGump(Mobile from, string text) : base(0, 0) { // prepare the page AddPage(0); AddBackground(0, 0, 400, 150, 5054); AddAlphaRegion(0, 0, 400, 150); AddLabel(20, 2, 55, "Quest Attachment Description"); AddHtml(20, 20, 360, 110, text, true, true); } } } }