using System; using System.Data; using System.IO; using System.Collections; using Server; using Server.Items; using Server.Multis; using Server.Network; using Server.Gumps; using Server.Targeting; using System.Reflection; using Server.Commands; using Server.Commands.Generic; using CPA = Server.CommandPropertyAttribute; using System.Xml; using Server.Spells; using System.Text; using Server.Accounting; using Server.Mobiles; using Server.Engines.XmlSpawner2; /* ** XmlEditNPC ** Version 1.00 ** updated 5/24/05 ** ArteGordon ** ** */ namespace Server.Engines.XmlSpawner2 { public class XmlEditDialogGump : Gump { private const int MaxEntries = 8; private const int MaxEntriesPerPage = 8; private Mobile m_From; private string Name; private int Selected; private int DisplayFrom; private string SaveFilename; private bool [] m_SelectionList; private XmlDialog m_Dialog; private bool SelectAll = false; private ArrayList m_SearchList; public static void Initialize() { CommandSystem.Register( "XmlEdit", AccessLevel.GameMaster, new CommandEventHandler( XmlEditDialog_OnCommand ) ); } [Usage( "XmlEdit" )] [Description( "Edits XmlDialog entries on an object" )] public static void XmlEditDialog_OnCommand( CommandEventArgs e ) { if(e == null || e.Mobile == null) return; // target an object with the xmldialog attachment e.Mobile.Target = new EditDialogTarget(); } private class EditDialogTarget : Target { public EditDialogTarget() : base ( 30, true, TargetFlags.None ) { } protected override void OnTarget( Mobile from, object targeted ) { if(from == null) return; // does it have an xmldialog attachment? XmlDialog xd = XmlAttach.FindAttachment(targeted, typeof(XmlDialog)) as XmlDialog; if(xd == null) { from.SendMessage("Target has no XmlDialog attachment"); // TODO: ask whether they would like to add one from.SendGump( new XmlConfirmAddGump(from, targeted)); return; } from.SendGump( new XmlEditDialogGump(from, true, xd, -1, 0, null, false, null, 0, 0)); } } public class XmlConfirmAddGump : Gump { private Mobile m_From; private object m_Targeted; public XmlConfirmAddGump(Mobile from, object targeted) : base ( 0, 0 ) { if(from == null || targeted == null) return; m_Targeted = targeted; m_From = from; Closable = false; Dragable = true; AddPage( 0 ); AddBackground( 10, 200, 200, 130, 5054 ); AddLabel( 20, 210, 68, String.Format("Add an XmlDialog to target?") ); string name = null; if(targeted is Item) { name = ((Item)targeted).Name; } else if(targeted is Mobile) { name = ((Mobile)targeted).Name; } if(name == null) { name = targeted.GetType().Name; } AddLabel( 20, 230, 0, String.Format("{0}", name) ); AddRadio( 35, 255, 9721, 9724, false, 1 ); // accept/yes radio AddRadio( 135, 255, 9721, 9724, true, 2 ); // decline/no radio AddHtmlLocalized(72, 255, 200, 30, 1049016, 0x7fff , false , false ); // Yes AddHtmlLocalized(172, 255, 200, 30, 1049017, 0x7fff , false , false ); // No AddButton( 80, 289, 2130, 2129, 3, GumpButtonType.Reply, 0 ); // Okay button } public override void OnResponse( NetState state, RelayInfo info ) { if(info == null || state == null || state.Mobile == null) return; int radiostate = -1; if(info.Switches.Length > 0) { radiostate = info.Switches[0]; } switch(info.ButtonID) { default: { if(radiostate == 1) { // accept // add the attachment XmlDialog xd = new XmlDialog(); XmlAttach.AttachTo(state.Mobile, m_Targeted, xd); // open the editing gump state.Mobile.SendGump( new XmlEditDialogGump(state.Mobile, true, xd, -1, 0, null, false, null, 0, 0)); } break; } } } } public const int MaxLabelLength = 200; public string TruncateLabel(string s) { if (s == null || s.Length < MaxLabelLength) return s; return s.Substring(0,MaxLabelLength); } public XmlEditDialogGump( Mobile from, bool firststart, XmlDialog dialog, int selected, int displayfrom, string savefilename, bool selectall, bool [] selectionlist, int X, int Y ) : base( X,Y ) { if(from == null || dialog == null) return; m_Dialog = dialog; m_From = from; m_SelectionList = selectionlist; if(m_SelectionList == null) { m_SelectionList = new bool[MaxEntries]; } SaveFilename = savefilename; DisplayFrom = displayfrom; Selected = selected; // fill the list with the XmlDialog entries m_SearchList = dialog.SpeechEntries; // prepare the page int height = 500; AddPage( 0 ); AddBackground( 0, 0, 755, height, 5054 ); AddAlphaRegion( 0, 0, 755, height ); // add the separators AddImageTiled( 10, 80, 735, 4, 0xBB9 ); AddImageTiled( 10, height -212, 735, 4, 0xBB9 ); AddImageTiled( 10, height -60, 735, 4, 0xBB9 ); // add the xmldialog properties int y = 5; int w = 140; int x = 5; int lw = 0; // the dialog name AddImageTiled( x, y, w, 21, 0x23F4 ); // get the name of the object this is attached to if(m_Dialog.AttachedTo is Item) { Name = ((Item)m_Dialog.AttachedTo).Name; } else if(m_Dialog.AttachedTo is Mobile) { Name = ((Mobile)m_Dialog.AttachedTo).Name; } if(Name == null && m_Dialog.AttachedTo != null) { Name = m_Dialog.AttachedTo.GetType().Name; } AddLabelCropped( x, y, w, 21, 0, Name ); x += w + lw + 20; w = 40; lw = 90; // add the proximity range AddLabel( x, y, 0x384, "ProximityRange" ); AddImageTiled( x+lw, y, w, 21, 0xBBC ); AddTextEntry( x+lw, y, w, 21, 0, 140, m_Dialog.ProximityRange.ToString() ); x += w + lw + 20; w = 100; lw = 60; // reset time AddLabel( x, y, 0x384, "ResetTime" ); AddImageTiled( x+lw, y, w, 21, 0xBBC ); AddTextEntry( x+lw, y, w, 21, 0, 141, m_Dialog.ResetTime.ToString() ); x += w + lw + 20; w = 40; lw = 65; // speech pace AddLabel( x, y, 0x384, "SpeechPace" ); AddImageTiled( x+lw, y, w, 21, 0xBBC ); AddTextEntry( x+lw, y, w, 21, 0, 142, m_Dialog.SpeechPace.ToString() ); x += w + lw + 20; w = 30; lw = 55; // allow ghost triggering AddLabel( x, y, 0x384, "GhostTrig" ); AddCheck( x+lw, y, 0xD2, 0xD3, m_Dialog.AllowGhostTrig, 260); // add the triggeroncarried y += 27; w = 600; x = 10; lw = 100; AddLabel( 10, y, 0x384, "TrigOnCarried" ); AddImageTiled( x + lw, y, w, 21, 0xBBC ); AddTextEntry( x+lw, y, w, 21, 0, 150, TruncateLabel(m_Dialog.TriggerOnCarried) ); AddButton( 720, y, 0xFAB, 0xFAD, 5005, GumpButtonType.Reply, 0 ); // add the notriggeroncarried y += 22; w = 600; x = 10; lw = 100; AddLabel( x, y, 0x384, "NoTrigOnCarried" ); AddImageTiled( x+lw, y, w, 21, 0xBBC ); AddTextEntry(x + lw, y, w, 21, 0, 151, TruncateLabel(m_Dialog.NoTriggerOnCarried)); AddButton( 720, y, 0xFAB, 0xFAD, 5006, GumpButtonType.Reply, 0 ); y = 88; // column labels AddLabel( 10, y, 0x384, "Edit" ); AddLabel( 45, y, 0x384, "#" ); AddLabel( 95, y, 0x384, "ID" ); AddLabel( 145, y, 0x384, "Depends" ); AddLabel( 195, y, 0x384, "Keywords" ); AddLabel( 295, y, 0x384, "Text" ); AddLabel( 540, y, 0x384, "Action" ); AddLabel( 602, y, 0x384, "Condition" ); AddLabel( 664, y, 0x384, "Gump" ); // display the select-all-displayed toggle AddButton( 730, y, 0xD2, 0xD3, 3999, GumpButtonType.Reply, 0 ); y -= 10; for ( int i = 0; i < MaxEntries; i++ ) { int index = i + DisplayFrom; if(m_SearchList == null || index >= m_SearchList.Count) break; int page = (int)(i/MaxEntriesPerPage); if(i%MaxEntriesPerPage == 0) { AddPage(page+1); // add highlighted page button //AddImageTiled( 235+page*25, 448, 25, 25, 0xBBC ); //AddImage( 238+page*25, 450, 0x8B1+page ); } // background for search results area AddImageTiled( 235, y + 22 * (i%MaxEntriesPerPage) + 30, 386, 23, 0x52 ); AddImageTiled( 236, y + 22 * (i%MaxEntriesPerPage) + 31, 384, 21, 0xBBC ); XmlDialog.SpeechEntry s = (XmlDialog.SpeechEntry)m_SearchList[index]; if(s == null) continue; int texthue = 0; bool sel=false; if(m_SelectionList != null && i < m_SelectionList.Length) { sel = m_SelectionList[i]; } // entries with the selection box checked are highlighted in red if(sel) texthue = 33; // the selected entry is highlighted in green if(i == Selected) texthue = 68; x = 10; w = 35; // add the Edit button for each entry AddButton( 10, y + 22 * (i%MaxEntriesPerPage) + 30, 0xFAE, 0xFAF, 1000+i, GumpButtonType.Reply, 0 ); x += w; w = 50; // display the entry number AddImageTiled( x, y + 22 * (i%MaxEntriesPerPage) + 31, w, 21, 0xBBC ); AddLabel( x, y + 22 * (i%MaxEntriesPerPage) + 31, texthue, s.EntryNumber.ToString() ); x += w; w = 50; // display the entry ID AddImageTiled( x, y + 22 * (i%MaxEntriesPerPage) + 31, w, 21, 0x23F4 ); AddLabel( x, y + 22 * (i%MaxEntriesPerPage) + 31, texthue, s.ID.ToString() ); x += w; w = 50; // display the entry dependson AddImageTiled( x, y + 22 * (i%MaxEntriesPerPage) + 31, w, 21, 0xBBC ); AddLabel( x, y + 22 * (i%MaxEntriesPerPage) + 31, texthue, s.DependsOn ); x += w; w = 100; // display the entry keywords AddImageTiled( x, y + 22 * (i%MaxEntriesPerPage) + 31, w, 21, 0x23F4 ); AddLabelCropped( x, y + 22 * (i%MaxEntriesPerPage) + 31, w-5, 21, texthue, TruncateLabel(s.Keywords) ); x += w; w = 245; // display the entry text AddImageTiled( x, y + 22 * (i%MaxEntriesPerPage) + 31, w, 21, 0xBBC ); AddLabelCropped( x, y + 22 * (i%MaxEntriesPerPage) + 31, w-5, 21, texthue, TruncateLabel(s.Text) ); x += w; w = 62; // display the action text AddImageTiled( x, y + 22 * (i%MaxEntriesPerPage) + 31, w, 21, 0x23F4 ); AddLabelCropped( x, y + 22 * (i%MaxEntriesPerPage) + 31, w-5, 21, texthue, TruncateLabel(s.Action) ); x += w; w = 62; // display the condition text AddImageTiled( x, y + 22 * (i%MaxEntriesPerPage) + 31, w, 21, 0xBBC ); AddLabelCropped( x, y + 22 * (i%MaxEntriesPerPage) + 31, w-5, 21, texthue, TruncateLabel(s.Condition) ); x += w; w = 62; // display the gump text AddImageTiled( x, y + 22 * (i%MaxEntriesPerPage) + 31, w, 21, 0x23F4 ); AddLabelCropped( x, y + 22 * (i%MaxEntriesPerPage) + 31, w-5, 21, texthue, TruncateLabel(s.Gump) ); // display the selection button AddButton( 730, y + 22 * (i%MaxEntriesPerPage) + 32, (sel? 0xD3:0xD2), (sel? 0xD2:0xD3), 4000+i, GumpButtonType.Reply, 0 ); } // display the selected entry information for editing XmlDialog.SpeechEntry sentry = null; if(Selected >= 0 && Selected + DisplayFrom >= 0 && Selected + DisplayFrom < m_SearchList.Count) { sentry = (XmlDialog.SpeechEntry)m_SearchList[Selected+ DisplayFrom]; } if(sentry != null) { y = height - 200; // add the entry parameters lw = 15; w = 40; x = 10; int spacing = 11; // entry number AddLabel( x, y, 0x384, "#" ); AddImageTiled( x+lw, y, w, 21, 0xBBC ); AddTextEntry( x+lw, y, w, 21, 0, 200, sentry.EntryNumber.ToString() ); x += w + lw + spacing; w = 40; lw = 17; // ID number AddLabel( x, y, 0x384, "ID" ); AddImageTiled( x+lw, y, w, 21, 0xBBC ); AddTextEntry( x+lw, y, w, 21, 0, 201, sentry.ID.ToString() ); x += w + lw + spacing; w = 40; lw = 65; // depends on AddLabel( x, y, 0x384, "DependsOn" ); AddImageTiled( x+lw, y, w, 21, 0xBBC ); AddTextEntry( x+lw, y, w, 21, 0, 202, sentry.DependsOn ); x += w + lw + spacing; w = 35; lw = 57; // prepause AddLabel( x, y, 0x384, "PrePause" ); AddImageTiled( x+lw, y, w, 21, 0xBBC ); AddTextEntry( x+lw, y, w, 21, 0, 203, sentry.PrePause.ToString() ); x += w + lw + spacing; w = 35; lw = 37; // pause AddLabel( x, y, 0x384, "Pause" ); AddImageTiled( x+lw, y, w, 21, 0xBBC ); AddTextEntry( x+lw, y, w, 21, 0, 204, sentry.Pause.ToString() ); x += w + lw + spacing; w = 37; lw = 26; // speech hue AddLabel( x, y, 0x384, "Hue" ); AddImageTiled( x+lw, y, w, 21, 0xBBC ); AddTextEntry( x+lw, y, w, 21, 0, 205, sentry.SpeechHue.ToString() ); x += w + lw + spacing; w = 20; lw = 52; // lock conversation AddLabel(x, y, 0x384, "IgnoreCar"); AddCheck(x + lw, y, 0xD2, 0xD3, sentry.IgnoreCarried, 252); x += w + lw + spacing; w = 20; lw = 42; // lock conversation AddLabel( x, y, 0x384, "LockOn" ); AddCheck( x+lw, y, 0xD2, 0xD3, sentry.LockConversation, 250); x += w + lw + spacing; w = 20; lw = 54; // npctrigger AddLabel( x, y, 0x384, "AllowNPC" ); AddCheck( x+lw, y, 0xD2, 0xD3, sentry.AllowNPCTrigger, 251); w = 650; x = 70; y += 27; // add the keyword entry AddLabel( 10, y, 0x384, "Keywords" ); AddImageTiled( x, y, w, 21, 0xBBC ); AddTextEntry( x+1, y, w, 21, 0, 101, sentry.Keywords ); AddButton( 720, y, 0xFAB, 0xFAD, 5001, GumpButtonType.Reply, 0 ); y += 22; // add the text entry AddLabel( 10, y, 0x384, "Text" ); AddImageTiled( x, y, w, 21, 0xBBC ); AddTextEntry( x+1, y, w, 21, 0, 100, sentry.Text ); AddButton( 720, y, 0xFAB, 0xFAD, 5000, GumpButtonType.Reply, 0 ); y += 22; // add the condition string entry AddLabel( 10, y, 0x384, "Condition" ); AddImageTiled( x, y, w, 21, 0xBBC ); AddTextEntry( x+1, y, w, 21, 0, 102, sentry.Condition ); AddButton( 720, y, 0xFAB, 0xFAD, 5002, GumpButtonType.Reply, 0 ); y += 22; // add the action string entry AddLabel( 10, y, 0x384, "Action" ); AddImageTiled( x, y, w, 21, 0xBBC ); AddTextEntry( x+1, y, w, 21, 0, 103, sentry.Action ); AddButton( 720, y, 0xFAB, 0xFAD, 5003, GumpButtonType.Reply, 0 ); y += 22; // add the gump string entry AddLabel( 10, y, 0x384, "Gump" ); AddImageTiled( x, y, w, 21, 0xBBC ); AddTextEntry( x+1, y, w, 21, 0, 104, sentry.Gump ); AddButton( 720, y, 0xFAB, 0xFAD, 5004, GumpButtonType.Reply, 0 ); } y = height - 50; AddLabel( 10, y, 0x384, "Config:" ); AddImageTiled( 50, y , 120, 19, 0x23F4 ); AddLabel( 50, y, 0, m_Dialog.ConfigFile ); if(from.AccessLevel >= XmlSpawner.DiskAccessLevel) { // add the save entry AddButton( 185, y , 0xFA8, 0xFAA, 159, GumpButtonType.Reply, 0 ); AddLabel( 218, y , 0x384, "Save to file:" ); AddImageTiled( 300, y , 180, 19, 0xBBC ); AddTextEntry( 300, y, 180, 19, 0, 300, SaveFilename ); } // display the item list if(m_SearchList != null) { AddLabel( 495, y, 68, String.Format("{0} Entries",m_SearchList.Count) ); int last = DisplayFrom + MaxEntries < m_SearchList.Count ? DisplayFrom + MaxEntries : m_SearchList.Count; if(last > 0) AddLabel( 595, y, 68, String.Format("Displaying {0}-{1}",DisplayFrom, last -1) ); } y = height - 25; // add run status display if(m_Dialog.Running) { AddButton( 10, y-5, 0x2A4E, 0x2A3A, 100, GumpButtonType.Reply, 0 ); AddLabel( 43, y, 0x384, "On" ); } else { AddButton( 10, y-5, 0x2A62, 0x2A3A, 100, GumpButtonType.Reply, 0 ); AddLabel( 43, y, 0x384, "Off" ); } // add the Refresh/Sort button AddButton( 80, y, 0xFAB, 0xFAD, 700, GumpButtonType.Reply, 0 ); AddLabel( 113, y, 0x384, "Refresh" ); // add the Add button AddButton( 185, y, 0xFAB, 0xFAD, 155, GumpButtonType.Reply, 0 ); AddLabel( 218, y, 0x384, "Add" ); // add the Delete button AddButton( 255, y, 0xFB1, 0xFB3, 156, GumpButtonType.Reply, 0 ); AddLabel( 283, y, 0x384, "Delete" ); // add the page buttons for(int i = 0;i<(int)(MaxEntries/MaxEntriesPerPage);i++) { AddButton( 513+i*25, y, 0x8B1+i, 0x8B1+i, 0, GumpButtonType.Page, 1+i ); } // add the advance pageblock buttons AddButton( 510+25*(int)(MaxEntries/MaxEntriesPerPage), y, 0x15E1, 0x15E5, 201, GumpButtonType.Reply, 0 ); // block forward AddButton( 490, y, 0x15E3, 0x15E7, 202, GumpButtonType.Reply, 0 ); // block backward // add the displayfrom entry AddLabel( 555, y, 0x384, "Display" ); AddImageTiled( 595, y, 60, 21, 0xBBC ); AddTextEntry( 595, y, 60, 21, 0, 400, DisplayFrom.ToString() ); AddButton( 655, y, 0xFAB, 0xFAD, 9998, GumpButtonType.Reply, 0 ); //AddLabel( 610, y, 0x384, "Select All" ); // display the select-all toggle //AddButton( 670, y, (SelectAll? 0xD3:0xD2), (SelectAll? 0xD2:0xD3), 3998, GumpButtonType.Reply, 0 ); } private void SortFindList() { if(m_SearchList != null && m_SearchList.Count > 0) { this.m_SearchList.Sort( new ListSorter(false) ); } } private class ListSorter : IComparer { private bool Dsort; public ListSorter(bool descend) : base () { Dsort = descend; } public int Compare( object x, object y ) { int xn = 0; int yn = 0; xn = ((XmlDialog.SpeechEntry)x).EntryNumber; yn = ((XmlDialog.SpeechEntry)y).EntryNumber; if(Dsort) return yn - xn; else return xn- yn; } } private void SaveList(Mobile from, string filename) { if(m_SearchList == null || m_SelectionList == null) return; string dirname; if( System.IO.Directory.Exists( XmlDialog.DefsDir ) && filename != null && !filename.StartsWith("/") && !filename.StartsWith("\\")) { // put it in the defaults directory if it exists dirname = String.Format("{0}/{1}",XmlDialog.DefsDir,filename); } else { // otherwise just put it in the main installation dir dirname = filename; } // save it to the file } private XmlEditDialogGump Refresh(NetState state) { XmlEditDialogGump g = new XmlEditDialogGump(this.m_From, false, this.m_Dialog, this.Selected, this.DisplayFrom, this.SaveFilename, this.SelectAll, this.m_SelectionList, this.X, this.Y); state.Mobile.SendGump(g); return g; } public static void ProcessXmlEditBookEntry(Mobile from, object[] args, string text) { if(from == null || args == null || args.Length < 6) return; XmlDialog dialog = (XmlDialog)args[0]; XmlDialog.SpeechEntry entry = (XmlDialog.SpeechEntry)args[1]; int textid = (int)args[2]; int selected = (int)args[3]; int displayfrom = (int)args[4]; string savefile = (string)args[5]; // place the book text into the entry by type switch(textid) { case 0: // text if(entry != null) entry.Text = text; break; case 1: // keywords if(entry != null) entry.Keywords = text; break; case 2: // condition if(entry != null) entry.Condition = text; break; case 3: // action if(entry != null) entry.Action = text; break; case 4: // gump if(entry != null) entry.Gump = text; break; case 5: // trigoncarried if(dialog != null) dialog.TriggerOnCarried = text; break; case 6: // notrigoncarried if(dialog != null) dialog.NoTriggerOnCarried = text; break; } from.CloseGump(typeof(XmlEditDialogGump)); //from.SendGump( new XmlEditDialogGump(from, false, m_Dialog, selected, displayfrom, savefilename, false, null, X, Y) ); from.SendGump( new XmlEditDialogGump(from, true, dialog, selected, displayfrom, savefile, false, null, 0, 0)); } public override void OnResponse( NetState state, RelayInfo info ) { if(info == null || state == null || state.Mobile == null || m_Dialog == null) return; int radiostate = -1; if(info.Switches.Length > 0) { radiostate = info.Switches[0]; } TextRelay tr = info.GetTextEntry( 400 ); // displayfrom info try { DisplayFrom = int.Parse(tr.Text); } catch{} tr = info.GetTextEntry( 300 ); // savefilename info if(tr != null) SaveFilename = tr.Text; if(m_Dialog != null) { tr = info.GetTextEntry( 140 ); // proximity range if(tr != null) { try { m_Dialog.ProximityRange = int.Parse(tr.Text); } catch{} } tr = info.GetTextEntry( 141 ); // reset time if(tr != null) { try { m_Dialog.ResetTime = TimeSpan.Parse(tr.Text); } catch{} } tr = info.GetTextEntry( 142 ); // speech pace if(tr != null) { try { m_Dialog.SpeechPace = int.Parse(tr.Text); } catch{} } tr = info.GetTextEntry( 150 ); // trig on carried if(tr != null && (m_Dialog.TriggerOnCarried == null || m_Dialog.TriggerOnCarried.Length < 230)) { if(tr.Text != null && tr.Text.Trim().Length > 0) { m_Dialog.TriggerOnCarried = tr.Text; } else { m_Dialog.TriggerOnCarried = null; } } tr = info.GetTextEntry( 151 ); // notrig on carried if(tr != null && (m_Dialog.NoTriggerOnCarried == null || m_Dialog.NoTriggerOnCarried.Length < 230)) { if(tr.Text != null && tr.Text.Trim().Length > 0) { m_Dialog.NoTriggerOnCarried = tr.Text; } else { m_Dialog.NoTriggerOnCarried = null; } } m_Dialog.AllowGhostTrig = info.IsSwitched(260); // allow ghost triggering } if(m_SearchList != null && Selected >= 0 && Selected + DisplayFrom >= 0 && Selected + DisplayFrom < m_SearchList.Count) { // entry information XmlDialog.SpeechEntry entry = (XmlDialog.SpeechEntry)m_SearchList[Selected + DisplayFrom]; tr = info.GetTextEntry( 200 ); // entry number if(tr != null) { try { entry.EntryNumber = int.Parse(tr.Text); } catch {} } tr = info.GetTextEntry( 201 ); // entry id if(tr != null) { try { entry.ID = int.Parse(tr.Text); } catch {} } tr = info.GetTextEntry( 202 ); // depends on if(tr != null) { try { entry.DependsOn = tr.Text; } catch {} } tr = info.GetTextEntry( 203 ); // prepause if(tr != null) { try { entry.PrePause = int.Parse(tr.Text); } catch {} } tr = info.GetTextEntry( 204 ); // pause if(tr != null) { try { entry.Pause = int.Parse(tr.Text); } catch {} } tr = info.GetTextEntry( 205 ); // hue if(tr != null) { try { entry.SpeechHue = int.Parse(tr.Text); } catch {} } tr = info.GetTextEntry( 101 ); // keywords if(tr != null && (entry.Keywords == null || entry.Keywords.Length < 230)) { if(tr.Text != null && tr.Text.Trim().Length > 0) { entry.Keywords = tr.Text; } else { entry.Keywords = null; } } tr = info.GetTextEntry( 100 ); // text if(tr != null && (entry.Text == null || entry.Text.Length < 230)) { if(tr.Text != null && tr.Text.Trim().Length > 0) { entry.Text = tr.Text; } else { entry.Text = null; } } tr = info.GetTextEntry( 102 ); // condition if(tr != null && (entry.Condition == null || entry.Condition.Length < 230)) { if(tr.Text != null && tr.Text.Trim().Length > 0) { entry.Condition = tr.Text; } else { entry.Condition = null; } } tr = info.GetTextEntry( 103 ); // action if(tr != null && (entry.Action == null || entry.Action.Length < 230)) { if(tr.Text != null && tr.Text.Trim().Length > 0) { entry.Action = tr.Text; } else { entry.Action = null; } } tr = info.GetTextEntry( 104 ); // gump if(tr != null && (entry.Gump == null || entry.Gump.Length < 230)) { if(tr.Text != null && tr.Text.Trim().Length > 0) { entry.Gump = tr.Text; } else { entry.Gump = null; } } entry.LockConversation = info.IsSwitched(250); // lock conversation entry.AllowNPCTrigger = info.IsSwitched(251); // allow npc entry.IgnoreCarried = info.IsSwitched(252); // ignorecarried } switch ( info.ButtonID ) { case 0: // Close { m_Dialog.DeleteTextEntryBook(); return; } case 100: // toggle running status { m_Dialog.Running = !m_Dialog.Running; break; } case 155: // add new entry { if(m_SearchList != null) { // find the last entry int lastentry = 0; foreach(XmlDialog.SpeechEntry e in m_SearchList) { if(e.EntryNumber > lastentry) lastentry = e.EntryNumber; } lastentry += 10; XmlDialog.SpeechEntry se = new XmlDialog.SpeechEntry(); se.EntryNumber = lastentry; se.ID = lastentry; m_SearchList.Add(se); Selected = m_SearchList.Count -1; } break; } case 156: // Delete selected entries { XmlEditDialogGump g = Refresh(state); int allcount = 0; if(m_SearchList != null) allcount = m_SearchList.Count; state.Mobile.SendGump( new XmlConfirmDeleteGump(state.Mobile, g, m_SearchList, m_SelectionList, DisplayFrom, SelectAll, allcount) ); return; } case 159: // save to a .npc file { // Create a new gump Refresh(state); // try to save m_Dialog.DoSaveNPC(state.Mobile, SaveFilename, true); return; } case 201: // forward block { // clear the selections if(m_SelectionList != null && !SelectAll) Array.Clear(m_SelectionList,0,m_SelectionList.Length); if(m_SearchList != null && DisplayFrom + MaxEntries < m_SearchList.Count) { DisplayFrom += MaxEntries; // clear any selection Selected = -1; } break; } case 202: // backward block { // clear the selections if(m_SelectionList != null && !SelectAll) Array.Clear(m_SelectionList,0,m_SelectionList.Length); DisplayFrom -= MaxEntries; if(DisplayFrom < 0) DisplayFrom = 0; // clear any selection Selected = -1; break; } case 700: // Sort { // clear any selection Selected = -1; // clear the selections if(m_SelectionList != null && !SelectAll) Array.Clear(m_SelectionList,0,m_SelectionList.Length); SortFindList(); break; } case 9998: // refresh the gump { // clear any selection Selected = -1; break; } default: { if(info.ButtonID >= 1000 && info.ButtonID < 1000+ MaxEntries) { // flag the entry selected Selected = info.ButtonID - 1000; } else if(info.ButtonID == 3998) { SelectAll = !SelectAll; // dont allow individual selection with the selectall button selected if(m_SelectionList != null) { for(int i = 0; i < MaxEntries;i++) { if(i < m_SelectionList.Length) { // only toggle the selection list entries for things that actually have entries m_SelectionList[i] = SelectAll; } else { break; } } } } else if(info.ButtonID == 3999) { // dont allow individual selection with the selectall button selected if(m_SelectionList != null && m_SearchList != null && !SelectAll) { for(int i = 0; i < MaxEntries;i++) { if(i < m_SelectionList.Length) { // only toggle the selection list entries for things that actually have entries if((m_SearchList.Count - DisplayFrom > i)) { m_SelectionList[i] = !m_SelectionList[i]; } } else { break; } } } } else if(info.ButtonID >= 4000 && info.ButtonID < 4000+ MaxEntries) { int i = info.ButtonID - 4000; // dont allow individual selection with the selectall button selected if(m_SelectionList != null && i >= 0 && i < m_SelectionList.Length && !SelectAll) { // only toggle the selection list entries for things that actually have entries if(m_SearchList != null && (m_SearchList.Count - DisplayFrom > i)) { m_SelectionList[i] = !m_SelectionList[i]; } } } else if(info.ButtonID >= 5000 && info.ButtonID < 5100) { // text entry book buttons int textid = info.ButtonID - 5000; // entry information XmlDialog.SpeechEntry entry = null; if(m_SearchList != null && Selected >= 0 && Selected + DisplayFrom >= 0 && Selected + DisplayFrom < m_SearchList.Count) { entry = (XmlDialog.SpeechEntry)m_SearchList[Selected + DisplayFrom]; } string text = String.Empty; string title = String.Empty; switch(textid) { case 0: // text if(entry != null) text = entry.Text; title = "Text"; break; case 1: // keywords if(entry != null) text = entry.Keywords; title = "Keywords"; break; case 2: // condition if(entry != null) text = entry.Condition; title = "Condition"; break; case 3: // action if(entry != null) text = entry.Action; title = "Action"; break; case 4: // gump if(entry != null) text = entry.Gump; title = "Gump"; break; case 5: // trigoncarried text = m_Dialog.TriggerOnCarried; title = "TrigOnCarried"; break; case 6: // notrigoncarried text = m_Dialog.NoTriggerOnCarried; title = "NoTrigOnCarried"; break; } object [] args = new object[6]; args[0] = m_Dialog; args[1] = entry; args[2] = textid; args[3] = Selected; args[4] = DisplayFrom; args[5] = SaveFilename; XmlTextEntryBook book = new XmlTextEntryBook(0, String.Empty, m_Dialog.Name, 20, true, new XmlTextEntryBookCallback(ProcessXmlEditBookEntry), args); if(m_Dialog.m_TextEntryBook == null) { m_Dialog.m_TextEntryBook = new ArrayList(); } m_Dialog.m_TextEntryBook.Add(book); book.Title = title; book.Author = Name; // fill the contents of the book with the current text entry data book.FillTextEntryBook(text); // put the book at the location of the player so that it can be opened, but drop it below visible range book.Visible = false; book.Movable = false; book.MoveToWorld(new Point3D(state.Mobile.Location.X,state.Mobile.Location.Y,state.Mobile.Location.Z-100), state.Mobile.Map); // Create a new gump Refresh(state); // and open it book.OnDoubleClick(state.Mobile); return; } break; } } // Create a new gump Refresh(state); } public class XmlConfirmDeleteGump : Gump { private ArrayList SearchList; private bool [] SelectedList; private Mobile From; private int DisplayFrom; private bool selectAll; XmlEditDialogGump m_Gump; public XmlConfirmDeleteGump(Mobile from, XmlEditDialogGump gump, ArrayList searchlist, bool [] selectedlist, int displayfrom, bool selectall, int allcount) : base ( 0, 0 ) { SearchList = searchlist; SelectedList = selectedlist; DisplayFrom = displayfrom; selectAll = selectall; m_Gump = gump; From = from; Closable = false; Dragable = true; AddPage( 0 ); AddBackground( 10, 200, 200, 130, 5054 ); int count = 0; if(selectall) { count = allcount; } else { for(int i =0;i 0) { radiostate = info.Switches[0]; } switch(info.ButtonID) { default: { if(radiostate == 1 && SearchList != null && SelectedList != null) { // accept ArrayList dlist = new ArrayList(); for(int i = 0;i < SearchList.Count;i++) { int index = i-DisplayFrom; if((index >= 0 && index < SelectedList.Length && SelectedList[index] == true) || selectAll) { object o = SearchList[i]; // delete the entry; dlist.Add(o); } } foreach(object o in dlist) { SearchList.Remove(o); } // clear the selections Array.Clear(SelectedList,0,SelectedList.Length); if(m_Gump != null) { state.Mobile.CloseGump(typeof(XmlEditDialogGump)); m_Gump.Refresh(state); } } break; } } } } } }