Add interfaces for custom TabAPI, just need to add the hooks now, and of course a pretty example. As always, not tested yet.
This commit is contained in:
parent
b75a2b5060
commit
9b9addfccd
58
api/src/main/java/net/md_5/bungee/api/TabAPI.java
Normal file
58
api/src/main/java/net/md_5/bungee/api/TabAPI.java
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
package net.md_5.bungee.api;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents a custom tab list, which may have slots manipulated.
|
||||||
|
*/
|
||||||
|
public interface TabAPI
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Blank out this tab list and update immediately.
|
||||||
|
*/
|
||||||
|
void clear();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the columns in this list.
|
||||||
|
*
|
||||||
|
* @return the width of this list
|
||||||
|
*/
|
||||||
|
int getColumns();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the rows in this list.
|
||||||
|
*
|
||||||
|
* @return the height of this list
|
||||||
|
*/
|
||||||
|
int getRows();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the total size of this list.
|
||||||
|
*
|
||||||
|
* @return {@link #getRows()} * {@link #getColumns()}
|
||||||
|
*/
|
||||||
|
int getSize();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the text in the specified slot and update immediately.
|
||||||
|
*
|
||||||
|
* @param row the row to set
|
||||||
|
* @param column the column to set
|
||||||
|
* @param text the text to set
|
||||||
|
*/
|
||||||
|
void setSlot(int row, int column, String text);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the text in the specified slot.
|
||||||
|
*
|
||||||
|
* @param row the row to set
|
||||||
|
* @param column the column to set
|
||||||
|
* @param text the text to set
|
||||||
|
* @param update whether or not to invoke {@link #update()} upon completion
|
||||||
|
*/
|
||||||
|
void setSlot(int row, int column, String text, boolean update);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flush all queued changes to the user.
|
||||||
|
*/
|
||||||
|
void update();
|
||||||
|
}
|
130
proxy/src/main/java/net/md_5/bungee/tablist/Custom.java
Normal file
130
proxy/src/main/java/net/md_5/bungee/tablist/Custom.java
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
package net.md_5.bungee.tablist;
|
||||||
|
|
||||||
|
import net.md_5.bungee.api.TabAPI;
|
||||||
|
import com.google.common.base.Preconditions;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import net.md_5.bungee.api.ChatColor;
|
||||||
|
import net.md_5.bungee.api.TabListHandler;
|
||||||
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
import net.md_5.bungee.protocol.packet.PacketC9PlayerListItem;
|
||||||
|
|
||||||
|
public class Custom extends TabListHandler implements TabAPI
|
||||||
|
{
|
||||||
|
|
||||||
|
private static final int ROWS = 20;
|
||||||
|
private static final int COLUMNS = 3;
|
||||||
|
/*========================================================================*/
|
||||||
|
private final Collection<String> sentStuff = new HashSet<>();
|
||||||
|
/*========================================================================*/
|
||||||
|
private String[][] sent = new String[ ROWS ][ COLUMNS ];
|
||||||
|
private String[][] pending = new String[ ROWS ][ COLUMNS ];
|
||||||
|
|
||||||
|
public Custom(ProxiedPlayer player)
|
||||||
|
{
|
||||||
|
super( player );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized void setSlot(int row, int column, String text)
|
||||||
|
{
|
||||||
|
setSlot( row, column, text, true );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized void setSlot(int row, int column, String text, boolean update)
|
||||||
|
{
|
||||||
|
Preconditions.checkArgument( row >= 0 && row < ROWS, "row out of range" );
|
||||||
|
Preconditions.checkArgument( column >= 0 && column < COLUMNS, "column out of range" );
|
||||||
|
Preconditions.checkNotNull( text, "text" );
|
||||||
|
Preconditions.checkArgument( text.length() <= 16, "text must be <= 16 chars" );
|
||||||
|
Preconditions.checkArgument( !sentStuff.contains( text ), "list already contains %s", text );
|
||||||
|
Preconditions.checkArgument( !ChatColor.stripColor( text ).equals( text ), "Text cannot consist entirely of colour codes" );
|
||||||
|
|
||||||
|
pending[ROWS][COLUMNS] = text;
|
||||||
|
if ( update )
|
||||||
|
{
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized void update()
|
||||||
|
{
|
||||||
|
clear();
|
||||||
|
|
||||||
|
for ( int i = 0; i < ROWS; i++ )
|
||||||
|
{
|
||||||
|
for ( int j = 0; j < COLUMNS; j++ )
|
||||||
|
{
|
||||||
|
String text;
|
||||||
|
if ( pending[i][j] != null )
|
||||||
|
{
|
||||||
|
text = pending[i][j];
|
||||||
|
sentStuff.add( text );
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
text = new StringBuilder().append( ChatColor.COLOR_CHAR ).append( base( i ) ).append( ChatColor.COLOR_CHAR ).append( base( j ) ).toString();
|
||||||
|
}
|
||||||
|
getPlayer().unsafe().sendPacket( new PacketC9PlayerListItem( text, true, (short) 0 ) );
|
||||||
|
sent[i][j] = text;
|
||||||
|
pending[i][j] = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized void clear()
|
||||||
|
{
|
||||||
|
for ( int i = 0; i < ROWS; i++ )
|
||||||
|
{
|
||||||
|
for ( int j = 0; j < COLUMNS; j++ )
|
||||||
|
{
|
||||||
|
getPlayer().unsafe().sendPacket( new PacketC9PlayerListItem( sent[i][j], false, (short) 9999 ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sent = new String[ ROWS ][ COLUMNS ];
|
||||||
|
sentStuff.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized int getRows()
|
||||||
|
{
|
||||||
|
return ROWS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized int getColumns()
|
||||||
|
{
|
||||||
|
return COLUMNS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized int getSize()
|
||||||
|
{
|
||||||
|
return ROWS * COLUMNS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onListUpdate(String name, boolean online, int ping)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static char[] base(int n)
|
||||||
|
{
|
||||||
|
String hex = Integer.toHexString( n );
|
||||||
|
char[] alloc = new char[ hex.length() * 2 ];
|
||||||
|
for ( int i = 0; i < alloc.length; i++ )
|
||||||
|
{
|
||||||
|
if ( i % 2 == 0 )
|
||||||
|
{
|
||||||
|
alloc[i] = ChatColor.COLOR_CHAR;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
alloc[i] = hex.charAt( i / 2 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return alloc;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user