using System; using Server; using Server.Gumps; using Server.Network; using Server.Mobiles; using System.Collections; using Server.Targets; using System.Collections.Generic; namespace Server.Guilds { public class GuildRosterGump : BaseGuildListGump { #region Comparers private class NameComparer : IComparer { public static readonly IComparer Instance = new NameComparer(); public NameComparer() { } public int Compare( PlayerMobile x, PlayerMobile y ) { if ( x == null && y == null ) return 0; else if ( x == null ) return -1; else if ( y == null ) return 1; return Insensitive.Compare( x.Name, y.Name ); } } private class LastOnComparer : IComparer { public static readonly IComparer Instance = new LastOnComparer(); public LastOnComparer() { } public int Compare( PlayerMobile x, PlayerMobile y ) { if ( x == null && y == null ) return 0; else if ( x == null ) return -1; else if ( y == null ) return 1; NetState aState = x.NetState; NetState bState = y.NetState; if ( aState == null && bState == null ) return x.LastOnline.CompareTo( y.LastOnline ); else if ( aState == null ) return 1; else if ( bState == null ) return -1; else return 0; } } private class TitleComparer : IComparer { public static readonly IComparer Instance = new TitleComparer(); public TitleComparer() { } public int Compare( PlayerMobile x, PlayerMobile y ) { if ( x == null && y == null ) return 0; else if ( x == null ) return -1; else if ( y == null ) return 1; return Insensitive.Compare( x.GuildTitle, y.GuildTitle ); } } private class RankComparer : IComparer { public static readonly IComparer Instance = new RankComparer(); public RankComparer() { } public int Compare( PlayerMobile x, PlayerMobile y ) { if ( x == null && y == null ) return 0; else if ( x == null ) return -1; else if ( y == null ) return 1; return x.GuildRank.Rank.CompareTo( y.GuildRank.Rank ); } } #endregion private static InfoField[] m_Fields = new InfoField[] { new InfoField( 1062955, 130, GuildRosterGump.NameComparer.Instance ), //Name new InfoField( 1062956, 80, GuildRosterGump.RankComparer.Instance ), //Rank new InfoField( 1062952, 80, GuildRosterGump.LastOnComparer.Instance), //Last On new InfoField( 1062953, 150, GuildRosterGump.TitleComparer.Instance ) //Guild Title }; public GuildRosterGump( PlayerMobile pm, Guild g ) : this( pm, g, GuildRosterGump.LastOnComparer.Instance, true, "", 0 ) { } public GuildRosterGump( PlayerMobile pm, Guild g, IComparer currentComparer, bool ascending, string filter, int startNumber ) : base( pm, g, Utility.SafeConvertList( g.Members ), currentComparer, ascending, filter, startNumber, m_Fields ) { PopulateGump(); } public override void PopulateGump() { base.PopulateGump(); AddHtmlLocalized( 266, 43, 110, 26, 1062974, 0xF, false, false ); // Guild Roster } public override void DrawEndingEntry( int itemNumber ) { AddBackground( 225, 148 + itemNumber * 28, 150, 26, 0x2486 ); AddButton( 230, 153 + itemNumber * 28, 0x845, 0x846, 8, GumpButtonType.Reply, 0 ); AddHtmlLocalized( 255, 151 + itemNumber * 28, 110, 26, 1062992, 0x0, false, false ); // Invite Player } protected override TextDefinition[] GetValuesFor( PlayerMobile pm, int aryLength ) { TextDefinition[] defs = new TextDefinition[aryLength]; string name = String.Format( "{0}{1}", pm.Name, ( player.GuildFealty == pm && player.GuildFealty != guild.Leader ) ? " *" : "" ); if( pm == player ) name = Color( name, 0x006600 ); else if( pm.NetState != null ) name = Color( name, 0x000066 ); defs[0] = name; defs[1] = pm.GuildRank.Name; defs[2] = (pm.NetState != null) ? new TextDefinition( 1063015 ): new TextDefinition( pm.LastOnline.ToString( "yyyy-MM-dd" ) ); defs[3] = (pm.GuildTitle == null) ? "" : pm.GuildTitle; return defs; } protected override bool IsFiltered( PlayerMobile pm, string filter ) { if( pm == null ) return true; return !Insensitive.Contains( pm.Name, filter ); } public override Gump GetResentGump( PlayerMobile pm, Guild g, IComparer comparer, bool ascending, string filter, int startNumber ) { return new GuildRosterGump( pm, g, comparer, ascending, filter, startNumber ); } public override Gump GetObjectInfoGump( PlayerMobile pm, Guild g, PlayerMobile o ) { return new GuildMemberInfoGump( pm, g, o, false, false ) ; } public override void OnResponse( NetState sender, RelayInfo info ) { base.OnResponse( sender, info ); PlayerMobile pm = sender.Mobile as PlayerMobile; if( pm == null || !IsMember( pm, guild ) ) return; if( info.ButtonID == 8 ) { if( pm.GuildRank.GetFlag( RankFlags.CanInvitePlayer ) ) { pm.SendLocalizedMessage( 1063048 ); // Whom do you wish to invite into your guild? pm.BeginTarget( -1, false, Targeting.TargetFlags.None, new TargetStateCallback( InvitePlayer_Callback ), guild ); } else pm.SendLocalizedMessage( 503301 ); // You don't have permission to do that. } } public void InvitePlayer_Callback( Mobile from, object targeted, object state ) { PlayerMobile pm = from as PlayerMobile; PlayerMobile targ = targeted as PlayerMobile; Guild g = state as Guild; if( pm == null || !IsMember( pm, guild ) || !pm.GuildRank.GetFlag( RankFlags.CanInvitePlayer ) ) { pm.SendLocalizedMessage( 503301 ); // You don't have permission to do that. } else if( targ == null ) { pm.SendLocalizedMessage( 1063334 ); // That isn't a valid player. } else if( !targ.AcceptGuildInvites ) { pm.SendLocalizedMessage( 1063049, targ.Name ); // ~1_val~ is not accepting guild invitations. } else if( g.IsMember( targ ) ) { pm.SendLocalizedMessage( 1063050, targ.Name ); // ~1_val~ is already a member of your guild! } else if( targ.Guild != null ) { pm.SendLocalizedMessage( 1063051, targ.Name ); // ~1_val~ is already a member of a guild. } else if( targ.HasGump( typeof( BaseGuildGump ) ) || targ.HasGump( typeof( CreateGuildGump ) )) //TODO: Check message if CreateGuildGump Open { pm.SendLocalizedMessage( 1063052, targ.Name ); // ~1_val~ is currently considering another guild invitation. } else { pm.SendLocalizedMessage( 1063053, targ.Name ); // You invite ~1_val~ to join your guild. targ.SendGump( new GuildInvitationRequest( targ, guild, pm ) ); } } } }