ClassiCube/ClassicalSharp/2D/Widgets/PlayerList/NormalPlayerListWidget.cs

120 lines
3.3 KiB
C#

// ClassicalSharp copyright 2014-2016 UnknownShadow200 | Licensed under MIT
using System;
using System.Collections.Generic;
using System.Drawing;
using ClassicalSharp.Entities;
using ClassicalSharp.Events;
namespace ClassicalSharp.Gui {
public class NormalPlayerListWidget : PlayerListWidget {
public NormalPlayerListWidget( Game game, Font font ) : base( game, font ) {
textures = new Texture[256];
}
PlayerInfo[] info = new PlayerInfo[256];
protected class PlayerInfo {
public string Name, ColouredName;
public byte Id;
public PlayerInfo( TabListEntry p ) {
ColouredName = p.PlayerName;
Name = Utils.StripColours( p.PlayerName );
Id = p.NameId;
}
}
public override string GetNameUnder( int mouseX, int mouseY ) {
for( int i = 0; i < namesCount; i++ ) {
Texture texture = textures[i];
if( texture.IsValid && texture.Bounds.Contains( mouseX, mouseY ) )
return Utils.StripColours( info[i].Name );
}
return null;
}
public override void Init() {
base.Init();
game.EntityEvents.TabListEntryAdded += TabEntryAdded;
game.EntityEvents.TabListEntryRemoved += TabEntryRemoved;
game.EntityEvents.TabListEntryChanged += TabEntryChanged;
}
public override void Dispose() {
base.Dispose();
game.EntityEvents.TabListEntryAdded -= TabEntryAdded;
game.EntityEvents.TabListEntryChanged -= TabEntryChanged;
game.EntityEvents.TabListEntryRemoved -= TabEntryRemoved;
}
protected override void CreateInitialPlayerInfo() {
TabListEntry[] entries = game.TabList.Entries;
for( int i = 0; i < entries.Length; i++ ) {
TabListEntry e = entries[i];
if( e != null )
AddPlayerInfo( new PlayerInfo( e ), -1 );
}
}
void AddPlayerInfo( PlayerInfo pInfo, int index ) {
Texture tex = DrawName( pInfo );
if( index < 0 ) {
info[namesCount] = pInfo;
textures[namesCount] = tex;
namesCount++;
} else {
info[index] = pInfo;
textures[index] = tex;
}
}
protected virtual Texture DrawName( PlayerInfo pInfo ) {
DrawTextArgs args = new DrawTextArgs( pInfo.ColouredName, font, false );
Texture tex = game.Drawer2D.MakeChatTextTexture( ref args, 0, 0 );
game.Drawer2D.ReducePadding( ref tex, Utils.Floor( font.Size ), 3 );
return tex;
}
void TabEntryAdded( object sender, IdEventArgs e ) {
AddPlayerInfo( new PlayerInfo( game.TabList.Entries[e.Id] ), -1 );
SortPlayerInfo();
}
void TabEntryChanged( object sender, IdEventArgs e ) {
for( int i = 0; i < namesCount; i++ ) {
PlayerInfo pInfo = info[i];
if( pInfo.Id != e.Id ) continue;
Texture tex = textures[i];
api.DeleteTexture( ref tex );
AddPlayerInfo( new PlayerInfo( game.TabList.Entries[e.Id] ), i );
SortPlayerInfo();
return;
}
}
void TabEntryRemoved( object sender, IdEventArgs e ) {
for( int i = 0; i < namesCount; i++ ) {
PlayerInfo pInfo = info[i];
if( pInfo.Id == e.Id ) {
RemoveInfoAt( info, i );
return;
}
}
}
PlayerInfoComparer comparer = new PlayerInfoComparer();
class PlayerInfoComparer : IComparer<PlayerInfo> {
public int Compare( PlayerInfo x, PlayerInfo y ) {
return x.Name.CompareTo( y.Name );
}
}
protected override void SortInfoList() {
Array.Sort( info, textures, 0, namesCount, comparer );
}
}
}