1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

Toolbar issues

Discussion in 'Archived Bug Reports' started by Ravenwolfe, Feb 16, 2014.

  1. Ravenwolfe
    Offline

    Moderator ServUO Developer

    Joined:
    Sep 7, 2013
    Messages:
    1,103
    Likes Received:
    117
    Having a problem with the toolbar not serializing any changes to the entries. If you modify the default commands, the changes do not survive a server restart.

    I'm a bit stumped because it appears that the _Entries are being serialized. Is it maybe losing the Linked Mobile Toolbarinfo after a restart?
     
  2. Ce Jayce
    Offline

    Ce Jayce Member

    Joined:
    Jan 24, 2014
    Messages:
    140
    Likes Received:
    14
    Hi Ravenwolfe,
    Not sure if this will be of any help but below is an older version of Jokeus toolbar that saves properly. I had a look at the serialization briefly but couldn't see anything that jumped out at me. Perhaps you can compare the old with the new *shrugs*.

    When i've got some more time i'll see if I can make any headway with it! :)

    Code (C#):
    1. /**************************************
    2. *Script Name: Toolbar                *
    3. *Author: Joeku AKA Demortris          *
    4. *For use with RunUO 2.0              *
    5. *Client Tested with: 5.0.7.1          *
    6. *Version: 1.3                        *
    7. *Initial Release: 08/23/06            *
    8. *Revision Date: 01/22/07              *
    9. **************************************/
    10.  
    11. using System;
    12. using System.Collections;
    13. using System.Collections.Generic;
    14. using Server;
    15. using Server.Accounting;
    16. using Server.Commands;
    17. using Server.Gumps;
    18. using Server.Network;
    19.  
    20. namespace Joeku
    21. {
    22.     public class ToolbarHelper
    23.     {
    24.         public static int Version = 130;                        // Version identification
    25.         public static string ReleaseDate = "January 22, 2007";  // release date =D
    26.         public static ToolbarInfos Infos = null;                // DO NOT CHANGE THIS! Used for the persistance item...
    27.  
    28.         public static void Initialize()
    29.         {
    30.             if( Infos == null )
    31.                 Infos = new ToolbarInfos();
    32.  
    33.             CommandHandlers.Register("Toolbar", AccessLevel.Counselor, new CommandEventHandler(Toolbar_OnCommand));
    34.             EventSink.Login += new LoginEventHandler(OnLogin);
    35.         }
    36.  
    37.         /// <summary>
    38.         /// Sends a toolbar to staff members upon login.
    39.         /// </summary>
    40.         private static void OnLogin(LoginEventArgs e)
    41.         {
    42.             if (e.Mobile.AccessLevel >= AccessLevel.Counselor)
    43.             {
    44.                 e.Mobile.CloseGump(typeof(Toolbar));
    45.                 SendToolbar(e.Mobile);
    46.             }
    47.         }
    48.  
    49.         [Usage("Toolbar")]
    50.         public static void Toolbar_OnCommand(CommandEventArgs e)
    51.         {
    52.             e.Mobile.CloseGump(typeof(Toolbar));
    53.             SendToolbar(e.Mobile);
    54.         }
    55.  
    56.         /// <summary>
    57.         /// Sends a toolbar to the mobile
    58.         /// </summary>
    59.         public static void SendToolbar(Mobile mob)
    60.         {
    61.             ToolbarInfo info;
    62.             ReadInfo(mob, out info);
    63.  
    64.             mob.SendGump(new Toolbar(info));
    65.         }
    66.  
    67.         /// <summary>
    68.         /// Reads the information in the persistance item and exports it into a new ToolbarInfo class.
    69.         /// </summary>
    70.         public static void ReadInfo(Mobile mob, out ToolbarInfo info)
    71.         {
    72.             EnsureMaxed( mob );
    73.             Account acc = mob.Account as Account;
    74.             info = null;
    75.             for(int i = 0; i < ToolbarHelper.Infos.Info.Count; i++)
    76.             {
    77.                 if(ToolbarHelper.Infos.Info[i].Account == acc.Username)
    78.                     info = ToolbarHelper.Infos.Info[i];
    79.             }
    80.             if(info == null)
    81.                 info = ToolbarInfo.CreateNew(mob, acc);
    82.         }
    83.  
    84.         public static void EnsureMaxed( Mobile mob )
    85.         {
    86.             //AccessLevel level = (AccessLevel)ToolbarInfo.GetAccess( mob.Account as Account );
    87.  
    88.             if( mob.AccessLevel > ((Account)mob.Account).AccessLevel )
    89.             {
    90.                 mob.Account.AccessLevel = mob.AccessLevel;
    91.             //else if( mob.AccessLevel < acc.AccessLevel )
    92.                 //mob.AccessLevel = level;
    93.                 Console.WriteLine("***TOOLBAR*** Account {0}, Mobile {1}: AccessLevel resolved to {2}.", ((Account)mob.Account).Username, mob, mob.AccessLevel );
    94.             }
    95.         }
    96.     }
    97.  
    98.     public class ToolbarInfos : Item
    99.     {
    100.         private List<ToolbarInfo> p_ToolbarInfo = new List<ToolbarInfo>();
    101.         public List<ToolbarInfo> Info{ get{ return p_ToolbarInfo; } set{ p_ToolbarInfo = value; }}
    102.  
    103.         public ToolbarInfos(){}
    104.  
    105.         public ToolbarInfos(Serial serial) : base( serial ){}
    106.  
    107.         public override void Delete(){ return; }
    108.  
    109.         public override void Serialize(GenericWriter writer)
    110.         {
    111.             base.Serialize(writer);
    112.  
    113.             writer.Write((int) ToolbarHelper.Version);
    114.  
    115.             writer.Write((int) Info.Count);
    116.  
    117.             for(int i = 0; i < Info.Count; i++)
    118.             {
    119.                 ToolbarInfo t = Info[i] as ToolbarInfo;
    120.  
    121.             // Version 1.3
    122.                 writer.Write((int)t.Font );
    123.                 writer.Write((bool)t.Phantom );
    124.                 writer.Write((bool)t.Stealth );
    125.                 writer.Write((bool)t.Reverse );
    126.                 writer.Write((bool)t.Lock );
    127.  
    128.             // Version 1.0
    129.                 writer.Write((string) t.Account);
    130.  
    131.                 writer.Write((int) t.Dimensions.Count);
    132.                 for(int j = 0; j < t.Dimensions.Count; j++)
    133.                     writer.Write((int) t.Dimensions[j]);
    134.  
    135.                 writer.Write((int) t.Entries.Count);
    136.                 for(int k = 0; k < t.Entries.Count; k++)
    137.                     writer.Write((string) t.Entries[k]);
    138.  
    139.                 writer.Write((int) t.Skin);
    140.  
    141.                 writer.Write((int) t.Points.Count);
    142.                 for(int l = 0; l < t.Points.Count; l++)
    143.                     writer.Write((Point3D) t.Points[l]);
    144.             }
    145.         }
    146.  
    147.         public override void Deserialize(GenericReader reader)
    148.         {
    149.             base.Deserialize(reader);
    150.  
    151.             int version = reader.ReadInt();
    152.  
    153.             ToolbarHelper.Infos = this;
    154.  
    155.             int count = reader.ReadInt();
    156.  
    157.         // Version 1.3
    158.             int font = 0;
    159.             bool phantom = true, stealth = false, reverse = false, locked = true;
    160.  
    161.         // Version 1.0
    162.             string account;
    163.             List<int> dimensions;
    164.             List<string> entries;
    165.             int subcount, skin;
    166.             List<Point3D> points;
    167.             for(int i = 0; i < count; i++)
    168.             {  
    169.                 switch(version)
    170.                 {
    171.                     case 130:
    172.                     {
    173.                         font = reader.ReadInt();
    174.                         phantom = reader.ReadBool();
    175.                         stealth = reader.ReadBool();
    176.                         reverse = reader.ReadBool();
    177.                         locked = reader.ReadBool();
    178.                         goto case 100;
    179.                     }
    180.                     default:
    181.                     case 100:
    182.                     {
    183.                         account = reader.ReadString();
    184.  
    185.                         dimensions = new List<int>();
    186.  
    187.                         subcount = reader.ReadInt();
    188.                         for(int j = 0; j < subcount; j++)
    189.                             dimensions.Add(reader.ReadInt());
    190.  
    191.                         entries = new List<string>();
    192.  
    193.                         subcount = reader.ReadInt();
    194.                         for(int k = 0; k < subcount; k++)
    195.                             entries.Add(reader.ReadString());
    196.  
    197.                         skin = reader.ReadInt();
    198.  
    199.                         points = new List<Point3D>();
    200.  
    201.                         subcount = reader.ReadInt();
    202.                         for(int l = 0; l < subcount; l++)
    203.                             points.Add(reader.ReadPoint3D());
    204.  
    205.                         break;
    206.                     }
    207.                 }
    208.                
    209.                 ToolbarInfo info = new ToolbarInfo(account, dimensions, entries, skin, points, font, new bool[]{ phantom, stealth, reverse, locked });
    210.             }
    211.         }
    212.     }
    213.  
    214.     public class ToolbarInfo
    215.     {
    216.     // Version 1.3
    217.         private int p_Font;
    218.         public int Font{ get{ return p_Font; } set{ p_Font = value; }}
    219.         private bool p_Phantom;
    220.         public bool Phantom{ get{ return p_Phantom; } set{ p_Phantom = value; }}
    221.         private bool p_Stealth;
    222.         public bool Stealth{ get{ return p_Stealth; } set{ p_Stealth = value; }}
    223.         private bool p_Reverse;
    224.         public bool Reverse{ get{ return p_Reverse; } set{ p_Reverse = value; }}
    225.         private bool p_Lock;
    226.         public bool Lock{ get{ return p_Lock; } set{ p_Lock = value; }}
    227.  
    228.     // Version 1.0
    229.         private string p_Account;
    230.         public string Account{ get{ return p_Account; } set{ p_Account = value; }}
    231.  
    232.         private List<int> p_Dimensions;
    233.         public List<int> Dimensions{ get{ return p_Dimensions; } set{ p_Dimensions = value; }}
    234.  
    235.         private List<string> p_Entries;
    236.         public List<string> Entries{ get{ return p_Entries; } set{ p_Entries = value; }}
    237.  
    238.         private int p_Skin;
    239.         public int Skin{ get{ return p_Skin; } set{ p_Skin= value; }}
    240.  
    241.         private List<Point3D> p_Points; // Marker
    242.         public List<Point3D> Points{ get{ return p_Points; } set{ p_Points = value; }}
    243.        
    244.         public ToolbarInfo(string account, List<int> dimensions, List<string> entries, int skin, List<Point3D> points, int font, bool[] switches )
    245.         {
    246.             p_Dimensions = new List<int>();
    247.             p_Entries = new List<string>();
    248.             p_Points = new List<Point3D>();
    249.  
    250.             SetAttributes(account, dimensions, entries, skin, points, font, switches);
    251.             ToolbarHelper.Infos.Info.Add(this);
    252.         }
    253.  
    254.         /// <summary>
    255.         /// Sets the attributes of a ToolbarInfo.
    256.         /// </summary>
    257.         public void SetAttributes(string account, List<int> dimensions, List<string> entries, int skin, List<Point3D> points, int font, bool[] switches )
    258.         {
    259.         // Version 1.3
    260.             p_Font = font;
    261.             p_Phantom = switches[0];
    262.             p_Stealth = switches[1];
    263.             p_Reverse = switches[2];
    264.             p_Lock = switches[3];
    265.  
    266.         // Version 1.0
    267.             p_Account = account;
    268.             p_Dimensions = dimensions;
    269.             p_Entries = entries;
    270.             p_Skin = skin;
    271.  
    272.             p_Points = points;
    273.         }
    274.  
    275.         /// <summary>
    276.         /// Creates a new ToolbarInfo...
    277.         /// </summary>
    278.         public static ToolbarInfo CreateNew(Mobile mob, Account acc)
    279.         {
    280.             string account = acc.Username;
    281.             int access = (int)mob.AccessLevel;
    282.             List<int> dimensions = DefaultDimensions( access );
    283.             List<string> entries = DefaultEntries( access );
    284.             int skin = 0;
    285.             List<Point3D> points = new List<Point3D>();
    286.            
    287.             for( int i = entries.Count; i <= 135; i++ )
    288.                 entries.Add("-*UNUSED*-");
    289.  
    290.             return new ToolbarInfo(account, dimensions, entries, skin, points, 0, new bool[]{ true, false, false, true } );
    291.         }
    292.        
    293.         /// <summary>
    294.         /// Gets the highest accesslevel of a character on an account.
    295.         /// </summary>
    296.         /*public static int GetAccess( Account acc )
    297.         {
    298.             int access = 0;
    299.             for( int i = 0; i < 6; i++ )
    300.             {
    301.                 if( ((Mobile)acc[i]) == null )
    302.                     break;
    303.                 if( (int)((Mobile)acc[i]).AccessLevel > access )
    304.                     access = (int)((Mobile)acc[i]).AccessLevel;
    305.             }
    306.             return access;
    307.         }*/
    308.  
    309.         /// <summary>
    310.         /// Calculates the default command entries based on one's AccessLevel.
    311.         /// </summary>
    312.         public static List<string> DefaultEntries( int i )
    313.         {
    314.             List<string> entries = new List<string>();
    315.             switch(i)
    316.             {
    317.                 case 0: // Player
    318.                     break;
    319.                 case 1: // Counselor
    320.                     entries.Add("[GMBody"); entries.Add("[StaffRunebook"); entries.Add("[SpeedBoost"); entries.Add("[M Tele"); entries.Add("[Where"); entries.Add("[who");
    321.                     break;
    322.                 case 2: // GameMaster
    323.                     entries.Add("[GMBody"); entries.Add("[StaffRunebook"); entries.Add("[Who"); entries.Add("[Tele"); entries.Add("[M Tele"); entries.Add("[Add"); for( int j = 0; j < 3; j++ ){entries.Add("-*UNUSED*-");}
    324.                     entries.Add("[SpawnEditor"); entries.Add("[SpeedBoost"); entries.Add("[Move"); entries.Add("[Delete"); entries.Add("[Wipe"); entries.Add("[Kill");
    325.                     break;
    326.                 case 3: // Seer
    327.                     goto case 2;
    328.                 case 4: // Administrator
    329.                     entries.Add("[Admin"); entries.Add("[PremiumSpawner"); entries.Add("[Props"); entries.Add("[SpeedBoost"); entries.Add("[Self Hide"); entries.Add("[Self Unhide"); for( int j = 0; j < 3; j++ ){entries.Add("-*UNUSED*-");}
    330.                     entries.Add("[StaffRunebook"); entries.Add("[M Tele"); entries.Add("[Go"); entries.Add("[Where"); entries.Add("[Move"); entries.Add("[M Remove");
    331.                     break;
    332.                 case 5: // Developer
    333.                     goto case 4;
    334.                 case 6: // Owner
    335.                     goto case 4;
    336.             }
    337.             return entries;
    338.         }
    339.        
    340.         public static List<int> DefaultDimensions( int i )
    341.         {
    342.             List<int> dimensions = new List<int>();
    343.             switch(i)
    344.             {
    345.                 case 0: // Player
    346.                     dimensions.Add(0); dimensions.Add(0);
    347.                     break;
    348.                 case 1: // Counselor
    349.                     dimensions.Add(6); dimensions.Add(1);
    350.                     break;
    351.                 case 2: // GameMaster
    352.                     dimensions.Add(6); dimensions.Add(2);
    353.                     break;
    354.                 case 3: // Seer
    355.                     goto case 2;
    356.                 case 4: // Administrator
    357.                     dimensions.Add(6); dimensions.Add(2);
    358.                     break;
    359.                 case 5: // Developer
    360.                     goto case 4;
    361.                 case 6: // Owner
    362.                     goto case 4;
    363.             }
    364.  
    365.             return dimensions;
    366.         }
    367.     }
    368.  
    369.     public class Toolbar : Gump
    370.     {
    371.         /*******************
    372.         *   BUTTON ID'S
    373.         * 0 - Close
    374.         * 1 - Edit
    375.         *******************/
    376.  
    377.         private ToolbarInfo p_Info;
    378.  
    379.     // Version 1.3
    380.         private int p_Font;
    381.         public int Font{ get{ return p_Font; } set{ p_Font = value; } }
    382.         private bool p_Phantom, p_Stealth, p_Reverse, p_Lock;
    383.         public bool Phantom{ get{ return p_Phantom; } set{ p_Phantom = value; } }
    384.         public bool Stealth{ get{ return p_Stealth; } set{ p_Stealth = value; } }
    385.         public bool Reverse{ get{ return p_Reverse; } set{ p_Reverse = value; } }
    386.         public bool Lock{ get{ return p_Lock; } set{ p_Lock = value; } }
    387.  
    388.     // Version 1.0
    389.         private List<string> p_Commands;
    390.         private int p_Skin, p_Columns, p_Rows;
    391.  
    392.         public List<string> Commands{ get{ return p_Commands; } set{ p_Commands = value; } }
    393.         public int Skin{ get{ return p_Skin; } set{ p_Skin = value; } }
    394.         public int Columns{ get{ return p_Columns; } set{ p_Columns = value; } }
    395.         public int Rows{ get{ return p_Rows; } set{ p_Rows = value; } }
    396.  
    397.         public int InitOptsW, InitOptsH;
    398.  
    399.         public Toolbar(ToolbarInfo info) : base(0, 28)
    400.         {
    401.             p_Info = info;
    402.  
    403.         // Version 1.3
    404.             p_Font = info.Font;
    405.             p_Phantom = info.Phantom;
    406.             p_Stealth = info.Stealth;
    407.             p_Reverse = info.Reverse;
    408.             p_Lock = info.Lock;
    409.  
    410.         // Version 1.0
    411.             p_Commands = info.Entries;
    412.             p_Skin = info.Skin;
    413.             p_Columns = info.Dimensions[0];
    414.             p_Rows = info.Dimensions[1];
    415.  
    416.             if( Lock )
    417.                 Closable = false;
    418.  
    419.             int offset = GumpIDs.Misc[(int)GumpIDs.MiscIDs.ButtonOffset].Content[p_Skin,0];
    420.             int bx = ((offset * 2) + (Columns * 110)), by = ((offset * 2) + (Rows * 24)), byx = by, cy = 0;
    421.  
    422.             SetCoords( offset );
    423.  
    424.             if( Reverse )
    425.             {
    426.                 cy = InitOptsH;
    427.                 by = 0;
    428.             }
    429.  
    430.             AddPage( 0 );
    431.             AddPage( 1 );
    432.             if( Stealth )
    433.             {
    434.                 AddMinimized( by, offset );
    435.                 AddPage( 2 );
    436.             }
    437.  
    438.             AddInitOpts( by, offset );
    439.  
    440.             AddBackground(0, cy, bx, byx, GumpIDs.Misc[(int)GumpIDs.MiscIDs.Background].Content[p_Skin,0]);
    441.  
    442.             string font = GumpIDs.Fonts[Font];
    443.             if( Phantom )
    444.                 font += "<BASEFONT COLOR=#FFFFFF>";
    445.  
    446.             int temp = 0, x = 0, y = 0;
    447.             for(int i = 0; i < Columns*Rows; i++)
    448.             {
    449.                 x = offset + ((i % Columns) * 110);
    450.                 y = offset + (int)(Math.Floor((double)(i / Columns)) * 24) + cy;
    451.                 AddButton(x + 1, y, 2445, 2445, temp + 10, GumpButtonType.Reply, 0);
    452.                 AddBackground(x, y, 110, 24, GumpIDs.Misc[(int)GumpIDs.MiscIDs.Buttonground].Content[p_Skin,0]);
    453.                
    454.                 if( Phantom )
    455.                 {
    456.                     AddImageTiled( x + 2, y + 2, 106, 20, 2624 ); // Alpha Area 1_1
    457.                     AddAlphaRegion( x + 2, y + 2, 106, 20 ); // Alpha Area 1_2
    458.                 }
    459.  
    460.                 AddHtml( x + 5, y + 3, 100, 20, String.Format( "<center>{0}{1}", font, Commands[temp]), false, false );
    461.                 //AddLabelCropped(x + 5, y + 3, 100, 20, GumpIDs.Misc[(int)GumpIDs.MiscIDs.Color].Content[p_Skin,0], Commands[temp]);
    462.  
    463.                 if( i%Columns == Columns-1 )
    464.                     temp += 9-Columns;
    465.                 temp++;
    466.             }
    467.  
    468.             /*TEST---
    469.             0%5 == 0
    470.             1%5 == 1
    471.             2%5 == 2
    472.             3%5 == 3
    473.             4%5 == 4
    474.             5%5 == 0
    475.             END TEST---*/
    476.  
    477.             if( !Stealth )
    478.             {
    479.                 AddPage(2);
    480.                 AddMinimized( by, offset );
    481.             }
    482.         }
    483.         public override void OnResponse(NetState sender, RelayInfo info)
    484.         {
    485.             Mobile mob = sender.Mobile;
    486.  
    487.             switch(info.ButtonID)
    488.             {
    489.                 default:    // Command
    490.                     mob.SendGump(this);
    491.                     if(Commands[info.ButtonID - 10].StartsWith(CommandSystem.Prefix))
    492.                     {
    493.                         mob.SendMessage( Commands[info.ButtonID - 10]);
    494.                         CommandSystem.Handle(mob, Commands[info.ButtonID - 10]);
    495.                     }
    496.                     else
    497.                     {
    498.                         //SpeechEventArgs args = new SpeechEventArgs( mob, Commands[info.ButtonID - 10], MessageType.Regular, mob.SpeechHue, null );
    499.                         mob.DoSpeech( Commands[info.ButtonID - 10], new int[0], MessageType.Regular, mob.SpeechHue );
    500.                         //mob.Say(Commands[info.ButtonID - 10]);
    501.                     }
    502.                     break;
    503.                 case 0:     // Close
    504.                     break;
    505.                 case 1:     // Edit
    506.                     mob.SendGump(this);
    507.                     mob.CloseGump( typeof( ToolbarEdit ) );
    508.                     mob.SendGump(new ToolbarEdit( p_Info ));
    509.                     break;
    510.             }
    511.         }
    512.  
    513.         /// <summary>
    514.         /// Sets coordinates and sizes.
    515.         /// </summary>
    516.         public void SetCoords( int offset )
    517.         {
    518.             InitOptsW = 50 + (offset * 2) + GumpIDs.Buttons[(int)GumpIDs.ButtonIDs.Minimize].Content[p_Skin,2] + 5 + GumpIDs.Buttons[(int)GumpIDs.ButtonIDs.Customize].Content[p_Skin,2];
    519.             InitOptsH = (offset * 2) + GumpIDs.Buttons[(int)GumpIDs.ButtonIDs.Minimize].Content[p_Skin,3];
    520.             if(GumpIDs.Buttons[(int)GumpIDs.ButtonIDs.Customize].Content[p_Skin,3] + (offset * 2) > InitOptsH)
    521.                 InitOptsH = GumpIDs.Buttons[(int)GumpIDs.ButtonIDs.Customize].Content[p_Skin,3] + (offset * 2);
    522.         }
    523.  
    524.         /// <summary>
    525.         /// Adds initial options.
    526.         /// </summary>
    527.         public void AddInitOpts( int y, int offset )
    528.         {
    529.             AddBackground(0, y, InitOptsW, InitOptsH, GumpIDs.Misc[(int)GumpIDs.MiscIDs.Background].Content[p_Skin,0]);
    530.             AddButton(offset, y + offset, GumpIDs.Buttons[(int)GumpIDs.ButtonIDs.Minimize].Content[p_Skin,0], GumpIDs.Buttons[(int)GumpIDs.ButtonIDs.Minimize].Content[p_Skin,1], 0, GumpButtonType.Page, Stealth ? 1 : 2);
    531.             AddButton(offset + GumpIDs.Buttons[(int)GumpIDs.ButtonIDs.Minimize].Content[p_Skin,2] + 5, y + offset, GumpIDs.Buttons[(int)GumpIDs.ButtonIDs.Customize].Content[p_Skin,0], GumpIDs.Buttons[(int)GumpIDs.ButtonIDs.Customize].Content[p_Skin,1], 1, GumpButtonType.Reply, 0);   // 1 Edit
    532.         }
    533.        
    534.         /// <summary>
    535.         /// Adds minimized page.
    536.         /// </summary>
    537.         public void AddMinimized( int y, int offset )
    538.         {
    539.             AddBackground(0, y, InitOptsW, InitOptsH, GumpIDs.Misc[(int)GumpIDs.MiscIDs.Background].Content[p_Skin,0]);
    540.             AddButton(offset, y + offset, GumpIDs.Buttons[(int)GumpIDs.ButtonIDs.Maximize].Content[p_Skin,0], GumpIDs.Buttons[(int)GumpIDs.ButtonIDs.Maximize].Content[p_Skin,1], 0, GumpButtonType.Page, Stealth ? 2 : 1);
    541.             AddButton(offset + GumpIDs.Buttons[(int)GumpIDs.ButtonIDs.Minimize].Content[p_Skin,2] + 5, y + offset, GumpIDs.Buttons[(int)GumpIDs.ButtonIDs.Customize].Content[p_Skin,0], GumpIDs.Buttons[(int)GumpIDs.ButtonIDs.Customize].Content[p_Skin,1], 1, GumpButtonType.Reply, 0);   // 1 Edit
    542.         }
    543.     }
    544.  
    545.     public class ToolbarEdit : Gump
    546.     {
    547.         public static string HTML = String.Format( "<center><u>Command Toolbar v{0}</u><br>Made by Joeku AKA Demortris<br>{1}<br>- Customized to Nerun's Distro -</center><br>  This toolbar is extremely versatile. You can switch skins and increase or decrease columns or rows. The toolbar operates like a spreadsheet; you can use the navigation menu to scroll through different commands and bind them. Enjoy!<br><p>If you have questions, concerns, or bug reports, please <A HREF=\"mailto:[email protected]\">e-mail me</A>.", ((double)ToolbarHelper.Version) / 100, ToolbarHelper.ReleaseDate);
    548.         private bool p_Expanded;
    549.         private int p_ExpandedInt;
    550.    
    551.         private int p_Font;
    552.         public int Font{ get{ return p_Font; } set{ p_Font = value; } }
    553.  
    554.         private bool p_Phantom, p_Stealth, p_Reverse, p_Lock;
    555.         public bool Phantom{ get{ return p_Phantom; } set{ p_Phantom = value; } }
    556.         public bool Stealth{ get{ return p_Stealth; } set{ p_Stealth = value; } }
    557.         public bool Reverse{ get{ return p_Reverse; } set{ p_Reverse = value; } }
    558.         public bool Lock{ get{ return p_Lock; } set{ p_Lock = value; } }
    559.  
    560.         private List<string> p_Commands;
    561.         private int p_Skin, p_Columns, p_Rows;
    562.         private ToolbarInfo p_Info;
    563.         private List<TextRelay> TextRelays = null;
    564.  
    565.         public List<string> Commands{ get{ return p_Commands; } set{ p_Commands = value; } }
    566.         public int Skin{ get{ return p_Skin; } set{ p_Skin = value; } }
    567.         public int Columns{ get{ return p_Columns; } set{ p_Columns = value; } }
    568.         public int Rows{ get{ return p_Rows; } set{ p_Rows = value; } }
    569.  
    570.         public ToolbarEdit( ToolbarInfo info ) : this( info, false ){}
    571.         public ToolbarEdit( ToolbarInfo info, bool expanded ) : this( info, expanded, info.Entries, info.Skin, info.Dimensions[0], info.Dimensions[1], info.Font, new bool[]{ info.Phantom, info.Stealth, info.Reverse, info.Lock } ){}
    572.  
    573.         public ToolbarEdit( ToolbarInfo info, List<string> commands, int skin, int columns, int rows, int font, bool[] switches ) : this( info, false, commands, skin, columns, rows, font, switches ){}
    574.         public ToolbarEdit( ToolbarInfo info, bool expanded, List<string> commands, int skin, int columns, int rows, int font, bool[] switches )  : base(0, 28)
    575.         {
    576.             p_Info = info;
    577.             p_Expanded = expanded;
    578.             p_ExpandedInt = expanded ? 2 : 1;
    579.  
    580.             p_Font = font;
    581.             p_Phantom = switches[0];
    582.             p_Stealth = switches[1];
    583.             p_Reverse = switches[2];
    584.             p_Lock = switches[3];
    585.  
    586.             p_Commands = commands;
    587.             p_Skin = skin;
    588.             p_Columns = columns;
    589.             p_Rows = rows;
    590.  
    591.             AddInit();
    592.             AddControls();
    593.             AddNavigation();
    594.             AddResponses();
    595.             AddEntries();
    596.         }
    597.  
    598.         public override void OnResponse(NetState sender, RelayInfo info)
    599.         {
    600.             Mobile m = sender.Mobile;
    601.             TextRelays = CreateList( info.TextEntries );
    602.  
    603.            
    604.             bool[] switches = new bool[4]
    605.                 {
    606.                     info.IsSwitched( 21 ),
    607.                     info.IsSwitched( 23 ),
    608.                     info.IsSwitched( 25 ),
    609.                     info.IsSwitched( 27 )
    610.                 };
    611.  
    612.             switch( info.ButtonID )
    613.             {
    614.                 case 0: break;
    615.                 case 1: m.SendGump( new ToolbarEdit( p_Info, this.p_Expanded, AnalyzeEntries(), Skin + 1, Columns, Rows, Font, switches )); break;
    616.                 case 2: m.SendGump( new ToolbarEdit( p_Info, this.p_Expanded, AnalyzeEntries(), Skin - 1, Columns, Rows, Font, switches )); break;
    617.                 case 3: m.SendGump( new ToolbarEdit( p_Info, this.p_Expanded, AnalyzeEntries(), Skin, Columns, Rows + 1, Font, switches )); break;
    618.                 case 4: m.SendGump( new ToolbarEdit( p_Info, this.p_Expanded, AnalyzeEntries(), Skin, Columns, Rows - 1, Font, switches )); break;
    619.                 case 5: m.SendGump( new ToolbarEdit( p_Info, this.p_Expanded, AnalyzeEntries(), Skin, Columns + 1, Rows, Font, switches )); break;
    620.                 case 6: m.SendGump( new ToolbarEdit( p_Info, this.p_Expanded, AnalyzeEntries(), Skin, Columns - 1, Rows, Font, switches )); break;
    621.                 //case 7:
    622.                     //m.SendGump( new ToolbarEdit( p_Info, this.p_Expanded, AnalyzeEntries(), Skin, Columns, Rows, Font, switches ));
    623.                     //m.SendMessage( 32, "The Marker utility is not an active feature yet; please be patient." );
    624.                     //goto case 0;
    625.                 case 9:     // Default
    626.                     List<string> toolbarinfo = ToolbarInfo.DefaultEntries( (int)m.AccessLevel );
    627.                     CombineEntries( toolbarinfo );
    628.                     toolbarinfo.AddRange( AnalyzeEntries( toolbarinfo.Count ) );
    629.                     m.SendGump( new ToolbarEdit( p_Info, this.p_Expanded, toolbarinfo, Skin, Columns, Rows, Font, switches ));
    630.                     break;
    631.                 case 10:    // Okay
    632.                     goto case 12;
    633.                 case 11:    // Cancel
    634.                     goto case 0;
    635.                 case 12:    // Apply
    636.                     Account acc = m.Account as Account;
    637.                     ToolbarInfo infos = null;
    638.                     for(int i = 0; i < ToolbarHelper.Infos.Info.Count; i++)
    639.                     {
    640.                         if(ToolbarHelper.Infos.Info[i].Account == acc.Username)
    641.                             infos = ToolbarHelper.Infos.Info[i];
    642.                     }
    643.                     if(infos == null)
    644.                         infos = ToolbarInfo.CreateNew(m, acc);
    645.                     List<int> dims = new List<int>();
    646.                         dims.Add( Columns );
    647.                         dims.Add( Rows );
    648.  
    649.                     infos.SetAttributes(acc.Username, dims, AnalyzeEntries(), Skin, infos.Points, Font, switches );
    650.  
    651.                     if( info.ButtonID == 12 )
    652.                         m.SendGump( new ToolbarEdit( infos, this.p_Expanded ) );
    653.                     m.CloseGump( typeof( Toolbar ) );
    654.                     m.SendGump( new Toolbar( infos ) );
    655.                     break;
    656.                 case 18: m.SendGump( new ToolbarEdit( p_Info, this.p_Expanded, AnalyzeEntries(), Skin, Columns, Rows, Font + 1, switches )); break;
    657.                 case 19: m.SendGump( new ToolbarEdit( p_Info, this.p_Expanded, AnalyzeEntries(), Skin, Columns, Rows, Font - 1, switches )); break;
    658.                 case 20:
    659.                     m.SendGump( new ToolbarEdit( p_Info, this.p_Expanded, AnalyzeEntries(), Skin, Columns, Rows, Font, switches ));
    660.                     m.SendMessage( 2101, "Phantom mode turns the toolbar semi-transparent." );
    661.                     break;
    662.                 case 22:
    663.                     m.SendGump( new ToolbarEdit( p_Info, this.p_Expanded, AnalyzeEntries(), Skin, Columns, Rows, Font, switches ));
    664.                     m.SendMessage( 2101, "Stealth mode makes the toolbar automatically minimize when you click a button." );
    665.                     break;
    666.                 case 24:
    667.                     m.SendGump( new ToolbarEdit( p_Info, this.p_Expanded, AnalyzeEntries(), Skin, Columns, Rows, Font, switches ));
    668.                     m.SendMessage( 2101, "Reverse mode puts the minimize bar above the toolbar instead of below." );
    669.                     break;
    670.                 case 26:
    671.                     m.SendGump( new ToolbarEdit( p_Info, this.p_Expanded, AnalyzeEntries(), Skin, Columns, Rows, Font, switches ));
    672.                     m.SendMessage( 2101, "Lock mode disables closing the toolbar with right-click." );
    673.                     break;
    674.                 case 28:    // Expand
    675.                     m.SendGump( new ToolbarEdit( p_Info, !this.p_Expanded, AnalyzeEntries(), Skin, Columns, Rows, Font, switches ));
    676.                     m.SendMessage( 2101, "Expanded view {0}activated.", this.p_Expanded ? "de" : "" );
    677.                     break;
    678.             }
    679.         }
    680.  
    681.         /// <summary>
    682.         /// Takes the gump relay entries and converts them from an Array into a List.
    683.         /// </summary>
    684.         public static List<TextRelay> CreateList( TextRelay[] entries )
    685.         {
    686.             List<TextRelay> list = new List<TextRelay>();
    687.             for( int i = 0; i < entries.Length; i++ )
    688.                 list.Add( entries[i] );
    689.  
    690.             return list;
    691.         }
    692.  
    693.         public void CombineEntries( List<string> list )
    694.         {
    695.             string temp;
    696.             for( int i = 0; i < list.Count; i++ )
    697.             {
    698.                 if( list[i] == "-*UNUSED*-" && (temp = GetEntry( i+13, this ).Text) != "" )
    699.                     list[i] = temp;
    700.             }
    701.         }
    702.  
    703.         public List<string> AnalyzeEntries()
    704.         { return AnalyzeEntries( 0 ); }
    705.  
    706.         /// <summary>
    707.         /// Organizes the gump relay entries into a usable collection.
    708.         /// </summary>
    709.         public List<string> AnalyzeEntries( int i )
    710.         {
    711.             List<string> list = new List<string>();
    712.  
    713.             string temp;
    714.             for( int j = i; j < 135; j++ )
    715.             {
    716.                 if( (temp = GetEntry( j+13, this ).Text) == "" )
    717.                     list.Add( "-*UNUSED*-" );
    718.                 else
    719.                     list.Add( temp );
    720.             }
    721.  
    722.             return list;
    723.         }
    724.  
    725.         /// <summary>
    726.         /// Gets entry # in the gump relay.
    727.         /// </summary>
    728.         public static TextRelay GetEntry( int entryID, ToolbarEdit gump )
    729.         {
    730.             int temp = 0;
    731.             TextRelay relay = null;
    732.             for( int i = 0; i < gump.TextRelays.Count; i++ )
    733.             {
    734.                 if( gump.TextRelays[i].EntryID == entryID )
    735.                 {
    736.                     temp = i;
    737.                     relay = gump.TextRelays[i];
    738.                 }
    739.             }
    740.             gump.TextRelays.RemoveAt( temp );
    741.             return relay;
    742.         }
    743.  
    744.         /// <summary>
    745.         /// Adds the skeleton gump.
    746.         /// </summary>
    747.         public void AddInit()
    748.         {
    749.             AddPage(0);
    750.             AddBackground(0, 0, 620, 120, 9200);
    751.             AddHtml(10, 10, 240, 100, HTML, true, true);
    752.         }
    753.  
    754.         /// <summary>
    755.         /// Adds other dynamic options.
    756.         /// </summary>
    757.         public void AddControls()
    758.         {
    759.             AddBackground(260, 0, 240, 120, 9200);
    760.             AddLabel(274, 11, 0, String.Format("Skin - {0}", p_Skin + 1 ));
    761.             if( p_Skin < GumpIDs.Skins - 1 )
    762.                 AddButton(359, 10, 2435, 2436, 1, GumpButtonType.Reply, 0);
    763.             if( p_Skin > 0 )
    764.                 AddButton(359, 21, 2437, 2438, 2, GumpButtonType.Reply, 0);
    765.             AddLabel(274, 36, 0, String.Format("Rows - {0}", p_Rows ));
    766.             if( p_Rows < 15 )
    767.                 AddButton(359, 35, 2435, 2436, 3, GumpButtonType.Reply, 0);
    768.             if( p_Rows > 1 )
    769.                 AddButton(359, 46, 2437, 2438, 4, GumpButtonType.Reply, 0);
    770.             AddLabel(274, 61, 0, String.Format("Columns - {0}", p_Columns ));
    771.             if( p_Columns < 9 )
    772.                 AddButton(359, 60, 2435, 2436, 5, GumpButtonType.Reply, 0);
    773.             if( p_Columns > 1 )
    774.                 AddButton(359, 71, 2437, 2438, 6, GumpButtonType.Reply, 0);
    775.  
    776.             AddHtml( 276, 87, 100, 20, String.Format("{0}Font - {1}", GumpIDs.Fonts[p_Font], p_Font+1), false, false );
    777.             if( p_Font < GumpIDs.Fonts.Length-1 )
    778.                 AddButton(359, 85, 2435, 2436, 18, GumpButtonType.Reply, 0);
    779.             if( p_Font > 0 )
    780.                 AddButton(359, 96, 2437, 2438, 19, GumpButtonType.Reply, 0);
    781.  
    782.  
    783.             /*AddLabel(274, 86, 0, "Marker");
    784.             AddButton(326, 88, 22153, 22155, 7, GumpButtonType.Reply, 0);
    785.             AddCheck(349, 86, 210, 211, true, 8); */
    786.  
    787.         // Version 1.3
    788.             AddLabel(389, 11, 0, "Phantom");
    789.                 AddButton(446, 13, 22153, 22155, 20, GumpButtonType.Reply, 0);
    790.                 AddCheck(469, 11, 210, 211, Phantom, 21);
    791.             AddLabel(389, 36, 0, "Stealth");
    792.                 AddButton(446, 38, 22153, 22155, 22, GumpButtonType.Reply, 0);
    793.                 AddCheck(469, 36, 210, 211, Stealth, 23);
    794.             AddLabel(389, 61, 0, "Reverse");
    795.                 AddButton(446, 63, 22153, 22155, 24, GumpButtonType.Reply, 0);
    796.                 AddCheck(469, 61, 210, 211, Reverse, 25);
    797.             AddLabel(389, 86, 0, "Lock");
    798.                 AddButton(446, 88, 22153, 22155, 26, GumpButtonType.Reply, 0);
    799.                 AddCheck(469, 86, 210, 211, Lock, 27);
    800.         }
    801.  
    802.         /// <summary>
    803.         /// Adds the skeleton navigation section.
    804.         /// </summary>
    805.         public void AddNavigation()
    806.         {
    807.             AddBackground(500, 0, 120, 120, 9200);
    808.             AddHtml(500, 10, 120, 20, @"<center><u>Navigation</u></center>", false, false);
    809.             AddLabel( 508, 92, 0, "Expanded View" );
    810.             AddButton( 595, 95, this.p_Expanded ? 5603 : 5601, this.p_Expanded ? 5607 : 5605, 28, GumpButtonType.Reply, 0 );
    811.         }
    812.  
    813.         /// <summary>
    814.         /// Adds response buttons.
    815.         /// </summary>
    816.         public void AddResponses()
    817.         {
    818.             int temp = 170 + (p_ExpandedInt * 100);
    819.             AddBackground(0, temp, 500, 33, 9200);
    820.             AddButton( 50, temp + 5, 246, 244, 9, GumpButtonType.Reply, 0 );        // Default
    821.             AddButton( 162, temp + 5, 249, 248, 10, GumpButtonType.Reply, 0 );  // Okay
    822.             AddButton( 275, temp + 5, 243, 241, 11, GumpButtonType.Reply, 0 );  // Cancel
    823.             AddButton( 387, temp + 5, 239, 240, 12, GumpButtonType.Reply, 0 );  // Apply
    824.         }
    825.  
    826.         /// <summary>
    827.         /// Adds the actual command/phrase entries.
    828.         /// </summary>
    829.         public void AddEntries()
    830.         {
    831.             int buffer = 2;
    832.             // CALC
    833.             int entryX = p_ExpandedInt * 149, entryY = p_ExpandedInt * 20;
    834.             int bgX = 10 + 4 + (buffer * 3) + (entryX * 3), bgY = 10 + 8 + (entryY * 5);
    835.             int divX = bgX - 10, divY = bgY - 10;
    836.             // ENDCALC
    837.  
    838.             AddBackground(0, 120, 33 + bgX, 32 + bgY, 9200);
    839.            
    840.                 AddBackground(33, 152, bgX, bgY, 9200);
    841.                
    842.                 // Add vertical dividers
    843.                 for( int m = 1; m <= 2; m++ )
    844.                     AddImageTiled( 38 + ( m * entryX ) + buffer + ((m-1)*4), 157, 2, divY, 10004);
    845.  
    846.                 // Add horizontal dividers
    847.                 for( int n = 1; n <= 4; n++ )
    848.                     AddImageTiled( 38, 155 +  (n * ( entryY + 2)), divX, 2, 10001);
    849.  
    850.             int start = -3, temp = 0;
    851.  
    852.             for( int i = 1; i <= 9; i++ )
    853.             {
    854.                 start += 3;
    855.                 if( i == 4 )
    856.                     start = 45;
    857.                 else if( i == 7 )
    858.                     start = 90;
    859.                 temp = start;
    860.                 /********
    861.                 * PAGES *
    862.                 *-------*
    863.                 * 1 2 3 *
    864.                 * 4 5 6 *
    865.                 * 7 8 9 *
    866.                 ********/
    867.  
    868.                 AddPage(i);
    869.                 CalculatePages(i);
    870.  
    871.                 // Add column identifiers
    872.                 for( int j = 0; j < 3; j++ )
    873.                     AddHtml( 38 + buffer + ((j % 3) * (buffer + entryX + 2)), 128, entryX, 20, String.Format("<center>Column {0}</center>", (j+1) + CalculateColumns(i) ), false, false);
    874.  
    875.                 AddHtml( 2, 128, 30, 20, "<center>Row</center>", false, false );
    876.  
    877.                 int tempInt = 0;
    878.                 if( p_Expanded )
    879.                     tempInt = 11;
    880.                 // Add row identifiers
    881.                 for( int k = 0; k < 5; k++ )
    882.                     AddHtml(0, 157 + (k * (entryY + 2)) + tempInt, 32, 20, String.Format("<center>{0}</center>", (k+1) +  CalculateRows(i) ), false, false);
    883.  
    884.                 // Add command entries
    885.                 for( int l = 0; l < 15; l++ )
    886.                 {
    887.                     AddTextEntry( 38 + buffer + ((l % 3) * ((buffer*2) + entryX )), 157 + ((int)Math.Floor((double)l / 3) * (entryY + 2)), entryX-1, entryY, 2101, temp+13, Commands[temp] /*,int size*/);
    888.  
    889.                     if( l%3 == 2 )
    890.                         temp += 6;
    891.                     temp++;
    892.                 }
    893.             }
    894.         }
    895.        
    896.         /// <summary>
    897.         /// Calculates what navigation button takes you to what page.
    898.         /// </summary>
    899.         public void CalculatePages( int i )
    900.         {
    901.             int up = 0, down = 0, left = 0, right = 0;
    902.             switch( i )
    903.             {
    904.                 case 1: down = 4; right = 2; break;
    905.                 case 2: down = 5; left = 1; right = 3; break;
    906.                 case 3: down = 6; left = 2; break;
    907.                 case 4: up = 1; down = 7; right = 5; break;
    908.                 case 5: up = 2; down = 8; left = 4; right = 6; break;
    909.                 case 6: up = 3; down = 9; left = 5; break;
    910.                 case 7: up = 4; right = 8; break;
    911.                 case 8: up = 5; left = 7; right = 9; break;
    912.                 case 9: up = 6; left = 8; break;
    913.             }
    914.  
    915.             AddNavigation( up, down, left, right );
    916.         }
    917.  
    918.         /// <summary>
    919.         /// Adds navigation buttons for each page.
    920.         /// </summary>
    921.         public void AddNavigation( int up, int down, int left, int right )
    922.         {
    923.             if( up > 0 )
    924.                 AddButton(549, 34, 9900, 9902, 0, GumpButtonType.Page, up);
    925.             if( down > 0 )
    926.                 AddButton(549, 65, 9906, 9908, 0, GumpButtonType.Page, down);
    927.             if( left > 0 )
    928.                 AddButton(523, 50, 9909, 9911, 0, GumpButtonType.Page, left);
    929.             if( right > 0 )
    930.                 AddButton(575, 50, 9903, 9905, 0, GumpButtonType.Page, right);
    931.         }
    932.  
    933.         /// <summary>
    934.         /// Damn I've forgotten...
    935.         /// </summary>
    936.         public static int CalculateColumns( int i )
    937.         {
    938.             if( i == 1 || i == 4 || i == 7 )
    939.                 return 0;
    940.             else if( i == 2 || i == 5 || i == 8 )
    941.                 return 3;
    942.             else
    943.                 return 6;
    944.         }
    945.  
    946.         /// <summary>
    947.         /// Same as above! =(
    948.         /// </summary>
    949.         public static int CalculateRows( int i )
    950.         {
    951.             if( i >= 1 && i <= 3 )
    952.                 return 0;
    953.             else if( i >= 4 && i <= 6 )
    954.                 return 5;
    955.             else
    956.                 return 10;
    957.         }
    958.     }
    959.  
    960.     public class GumpIDs
    961.     {
    962.         public enum MiscIDs
    963.         {
    964.             Background = 0,
    965.             Color = 1,
    966.             Buttonground = 2,
    967.             ButtonOffset = 3,
    968.         }
    969.  
    970.         public enum ButtonIDs
    971.         {
    972.             Minimize = 0,
    973.             Maximize = 1,
    974.             Customize = 2,
    975.             SpecialCommand = 3,
    976.  
    977.             Send = 4,
    978.             Teleport = 5,
    979.             Gate = 6,
    980.         }
    981.  
    982.         private int p_ID;
    983.         public int ID{ get{ return p_ID; } set{ p_ID = value; }}
    984.         private int[,] p_Content;
    985.         public int[,] Content{ get{ return p_Content; } set{ p_Content = value; }}
    986.         private string p_Name;
    987.         public string Name{ get{ return p_Name; } set{ p_Name = value; }}
    988.  
    989.         public GumpIDs(int iD, string name, int[,] content)
    990.         {
    991.             p_ID = iD;
    992.             p_Content = content;
    993.             p_Name = name;
    994.         }
    995.  
    996.         private static string[] p_Fonts = new string[]
    997.         { "", "<b>", "<i>", "<b><i>", "<small>", "<b><small>", "<i><small>", "<b><i><small>", "<big>", "<b><big>", "<i><big>", "<b><i><big>" };
    998.         public static string[] Fonts{ get{ return p_Fonts; } set{ p_Fonts = value; }}
    999.  
    1000.         public static int Skins = 2;
    1001.         private static GumpIDs[] m_Misc = new GumpIDs[]
    1002.             {
    1003.                 new GumpIDs( 0, "Background",       new int[2,1]{{ 9200 }, { 9270 }}),
    1004.                 new GumpIDs( 1, "Color",            new int[2,1]{{ 0 }, { 0 }}),
    1005.                 new GumpIDs( 2, "Buttonground",     new int[2,1]{{ 9200 }, { 9350 }}),
    1006.                 new GumpIDs( 3, "ButtonOffset",     new int[2,1]{{ 5 }, { 7 }}),
    1007.             };
    1008.         public static GumpIDs[] Misc{ get{ return m_Misc; } set{ m_Misc = value; }}
    1009.  
    1010.         private static GumpIDs[] m_Buttons = new GumpIDs[]
    1011.             {
    1012.                 new GumpIDs( 0, "Minimize",         new int[2,4]{{ 5603, 5607, 16, 16 }, { 5537, 5539, 19, 21 }}),
    1013.                 new GumpIDs( 1, "Maximize",         new int[2,4]{{ 5601, 5605, 16, 16 }, { 5540, 5542, 19, 21 }}),
    1014.                 new GumpIDs( 2, "Customize",        new int[2,4]{{ 22153, 22155, 16, 16 }, { 5525, 5527, 62, 24 }}),
    1015.                 new GumpIDs( 3, "SpecialCommand",   new int[2,4]{{ 2117, 2118, 15, 15 }, { 9720, 9722, 29, 29 }}),
    1016.  
    1017.                 new GumpIDs( 4, "Send",             new int[2,4]{{ 2360, 2360, 11, 11 }, { 2360, 2360, 11, 11 }}),
    1018.                 new GumpIDs( 5, "Teleport",         new int[2,4]{{ 2361, 2361, 11, 11 }, { 2361, 2361, 11, 11 }}),
    1019.                 new GumpIDs( 6, "Gate",             new int[2,4]{{ 2362, 2362, 11, 11 }, { 2361, 2361, 11, 11 }}),
    1020.             };
    1021.         public static GumpIDs[] Buttons{ get{ return m_Buttons; } set{ m_Buttons = value; }}
    1022.     }
    1023. }
     

    Attached Files:

  3. Kalamus
    Offline

    Kalamus Active Member

    Joined:
    Apr 24, 2013
    Messages:
    282
    Likes Received:
    32
    I can confirm that ServUO's version doesn't save/load properly. @Insanity rewrote this back in ForkUO to use the Customs Framework and work with modules. I briefly looked over the code and it looks like it's all in place but the Serialize/Deserialize methods never trigger when saving or loading from my brief debugging I did.
     
    • Like Like x 1
  4. Ravenwolfe
    Offline

    Moderator ServUO Developer

    Joined:
    Sep 7, 2013
    Messages:
    1,103
    Likes Received:
    117
    Well, I found one error in the BaseCore but I recompiled the Core and it didn't seem to fix the issue.

    In BaseCore.cs change:

    Code (C#):
    1.  
    2. public override void Deserialize(GenericReader reader)
    3. {
    4.     int version = reader.ReadInt();
    5.     switch (version)
    6.     {
    7.         case 0:
    8.         {
    9.             LinkedMobile = reader.ReadMobile();
    10.             LinkedItem = reader.ReadItem();
    11.             _CreatedTime = reader.ReadDateTime();
    12.             _LastEditedTime = reader.ReadDateTime();
    13.             break;
    14.         }
    15.     }
    16. }
    17.  
    To

    Code (C#):
    1.  
    2. public override void Deserialize(GenericReader reader)
    3. {
    4.     int version = reader.ReadInt();
    5.     switch (version)
    6.     {
    7.         case 0:
    8.         {
    9.             _LinkedMobile = reader.ReadMobile();
    10.             _LinkedItem = reader.ReadItem();
    11.             _CreatedTime = reader.ReadDateTime();
    12.             _LastEditedTime = reader.ReadDateTime();
    13.             break;
    14.         }
    15.     }
    16. }
     
    • Like Like x 1
  5. Kalamus
    Offline

    Kalamus Active Member

    Joined:
    Apr 24, 2013
    Messages:
    282
    Likes Received:
    32
    I think the problem is the Customs Framework never got added to the save strategies. I'm still digging through all the code for it and I can't find anywhere that calls it to save. It looks like all the loading code is in place though.


    Edit: Yeah Customs Framework isn't saving for sure. Just made changes to both Slayer Title System and Food Effect System and neither of those are saving and both of those use the Customs Framework as well.
     
    #5 Kalamus, Feb 17, 2014
    Last edited: Feb 17, 2014
  6. Toriad
    Offline

    Toriad Shard Owner

    Joined:
    Mar 4, 2013
    Messages:
    86
    Likes Received:
    35
    Converted to a Milestone Issue (Link)
     
  7. Kvothe
    Offline

    Kvothe New Member

    Joined:
    Mar 27, 2014
    Messages:
    12
    Likes Received:
    1
    Hey Toriad, are those above changes you've linked available in the newest publish? Making all the individual changes using github would make me cry inside.
     
  8. Mortiferus
    Offline

    Mortiferus New Member

    Joined:
    Jul 21, 2014
    Messages:
    4
    Likes Received:
    0
    Can anyone tell me where the settings are saved exactly? I have edited the menu on one character but it does not appear edited on the other so i was wanting to copy the save to the other character if possibl. Thanks in advance!
     
  9. LordFenris
    Offline

    LordFenris Member

    Joined:
    Jul 21, 2014
    Messages:
    116
    Likes Received:
    4
    The 3D version of the game toolbar is unreadable. I attach a screenshot. The solution would be to change the background from dark to lighter and possibly change the main menu settings.
     

    Attached Files:

Similar Threads: Toolbar issues
Forum Title Date
Archived Bug Reports Publish 54 Command Toolbar Jul 10, 2016
Archived Bug Reports Toolbar Crash Bug Apr 19, 2016
Script Support Joeku Toolbar Facet Missing Mar 19, 2016
Archived Bug Reports Toolbar gump crash on login Feb 13, 2016
Script Support i want a player toolbar Script . Feb 23, 2015
Windows Support Toolbar Gump Crash Sep 28, 2014
General Discussion Spell Toolbar Script - Looking for some feedback Jul 6, 2014