Hello i have this gump:


levelgumpz.png


As u guys can see it doesnt show the exp value even thought sometimes it does, i dont know why this happens. The value says 0 even thought is not 0.

The tolevel is the part it fails i think.

Because the 0 should be the exp left to level.


Code:
 int tolevel = 0;
        
                for (int i = 0; i < LevelItemManager.ExpTable.Length; ++i)
                {
            if (pm == null)
            return;
                    Item item = pm.FindItemOnLayer( (Layer)i );
                    if (item != null)
                    {
                    XmlLevelItem levitemf = XmlAttach.FindAttachment(item, typeof(XmlLevelItem)) as XmlLevelItem;
                    ( if  levitemf != null)
                    {
                    if (levitemf.Experience < LevelItemManager.ExpTable[i])
                    {
           
                    tolevel = LevelItemManager.ExpTable[i] - levitemf.Experience;
                    break;
                    }
                     }
         
                    }
                }

The onsingleclick method shows the correct value:


onsingle.png


Code:
  public override void OnSingleClick(Mobile from)
        {
            LabelTo(from, Sphere.ComputeName(this));
     
            if (from != null)
            {
        from.CloseGump( typeof( weaponsinglelcickgump ) );
         from.SendGump(new weaponsinglelcickgump(this));
            }
                XmlLevelItem levitem = XmlAttach.FindAttachment(this, typeof(XmlLevelItem)) as XmlLevelItem;
              if (levitem != null)
              {     
    
        
               int tolevel = 0;
            for (int i = 0; i < LevelItemManager.ExpTable.Length; ++i)
            {
                if (levitem.Experience < LevelItemManager.ExpTable[i])
                {
                    tolevel = LevelItemManager.ExpTable[i] - levitem.Experience;
                    break;
                }
            }
        
                   if (levitem.Level == 100)
                   {
                   LabelTo(from, String.Format("Level [{0}]",levitem.Level));
                   return;
                   }
        
               LabelTo(from, String.Format("Level [{0}]",levitem.Level));
     
                   if (LevelItems.DisplayExpProp)
                   LabelTo(from, String.Format("Experience {0}/{1}",levitem.Experience, tolevel.ToString()));
        
        

                 }


The gump doesnt....

I uploaded the whole gump script.
 
Last edited:
Code:
 Item item = pm.FindItemOnLayer((Layer)i );

Are you sure that converting the 'i' at this point results in a valid layer?
Seems to me that 'i' represents the xp value for each level, not each layer.
 
I dont know..


Code:
  int tolevel = 0;
              for (int i = 0; i < LevelItemManager.ExpTable.Length; ++i)
               {
               
              foreach (Layer l in Enum.GetValues(typeof(Layer)))
                {
                    Item tocheck = pm.FindItemOnLayer( l );
                    if (tocheck == null )
                        continue;
                 
                    XmlLevelItem xmllevelitem = XmlAttach.FindAttachment(tocheck, typeof(XmlLevelItem)) as XmlLevelItem;
                if ( tocheck != null && xmllevelitem != null && xmllevelitem.Experience < LevelItemManager.ExpTable[i])
                  {
                    tolevel = LevelItemManager.ExpTable[i] - xmllevelitem.Experience;
                    break;
                  }
               }
                }
im trying this and is not showing the correct value :eek:
 
You'd be better off starting with a new gump and simply adding a new line for each entry in the user's equipment;
Code:
int yOffset = 0;

foreach ( Item item in user.Items )
{
	XmlLevelItem xml = XmlAttach.FindAttachment( item, typeof( XmlLevelItem ) ) as XmlLevelItem;

	if( xml == null )
		continue;

	AddItem( 0, yOffset, item.ItemID, item.Hue );

	int level = xml.Level;
	int xpCur = xml.Experience;
	int xpReq = LevelItemManager.ExpTable[level];

	string text = string.Format( "Level [{0}] Exp: {1} / {2}", level, xpCur, xpReq );

	AddLabel( 50, yOffset, 0x33, text );

	yOffset += 50;
}

This is purely for example and untested.
 
Thanks Voxpire
[doublepost=1551107815][/doublepost]IS there a way to sort the values from minimum to maximum? like a list in order, not sure if i explain myself good
 
Last edited:
This will require
Code:
using System.Linq;
using System.Collections.Generic;

Code:
int yOffset = 0;

Dictionary<Item, XmlLevelItem> items = new Dictionary<Item, XmlLevelItem>( );

foreach ( Item item in user.Items )
{
    XmlLevelItem xml = XmlAttach.FindAttachment( item, typeof( XmlLevelItem ) ) as XmlLevelItem;

    if( xml != null )
        items[item] = xml;
}

foreach ( KeyValuePair<Item, XmlLevelItem> entry in items.OrderByDescending( o => o.Value.Level ) )
{
    Item item = entry.Key;
    XmlLevelItem xml = entry.Value;

    AddItem( 0, yOffset, item.ItemID, item.Hue );

    int level = xml.Level;
    int xpCur = xml.Experience;
    int xpReq = LevelItemManager.ExpTable[level];

    string text = string.Format( "Level [{0}] Exp: {1} / {2}", level, xpCur, xpReq );

    AddLabel( 50, yOffset, 0x33, text );

    yOffset += 50;
}

items.Clear( );
 
It works great however the gump only shows the equipped items.

Had to change
Code:
foreach ( Item item in user.Items )
to
Code:
foreach ( Item item in pm.Items )
im using runuo.

So how can i modify it to show also every item on backpack that has the xml attachment on it? thanks!!
 
Code:
foreach( Item item in pm.Items.Union( pm.Backpack.FindItemsByType<Item>( ) ) )
 
Back