Added a player list command /list

This commit is contained in:
lokulin 2014-11-11 00:32:32 +11:00
parent 157aa2a786
commit 07fed5cd24
5 changed files with 85 additions and 5 deletions

View file

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MinecraftClient.Commands
{
public class List : Command
{
public override string CMDName { get { return "list"; } }
public override string CMDDesc { get { return "list: get the player list."; } }
public override string Run(McTcpClient handler, string command)
{
handler.ListPlayers();
return "";
}
}
}

View file

@ -33,6 +33,8 @@ namespace MinecraftClient
private string uuid;
private string sessionid;
public Dictionary<string, string> players;
public int getServerPort() { return port; }
public string getServerHost() { return host; }
public string getUsername() { return username; }
@ -56,6 +58,7 @@ namespace MinecraftClient
public McTcpClient(string username, string uuid, string sessionID, int protocolversion, string server_ip, ushort port)
{
StartClient(username, uuid, sessionID, server_ip, port, protocolversion, false, "");
players = new Dictionary<string, string>();
}
/// <summary>
@ -388,14 +391,35 @@ namespace MinecraftClient
else return handler.SendChatMessage(text);
}
/// <summary>
/// Display a list of players
/// </summary>
/// <returns>True if the players can be listed</returns>
public bool ListPlayers()
{
ConsoleIO.WriteLine ("Player List");
foreach (string player in players.Values)
ConsoleIO.WriteLine (player);
return true;
}
/// <summary>
/// Allow to respawn after death
/// </summary>
/// <returns>True if packet successfully sent</returns>
public bool SendRespawnPacket()
{
return handler.SendRespawnPacket();
}
}
{
return handler.SendRespawnPacket ();
}
public void addPlayer(string uuid, string name) {
players[uuid] = name;
}
public void removePlayer(string uuid){
players.Remove (uuid);
}
public HashSet<string> getPlayers() { return new HashSet<string>(players.Values); }
}
}

View file

@ -131,6 +131,7 @@
<Compile Include="Proxy\Handlers\Socks5ProxyClient.cs" />
<Compile Include="Proxy\Handlers\Utils.cs" />
<Compile Include="Settings.cs" />
<Compile Include="Commands\List.cs" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include=".NETFramework,Version=v4.0,Profile=Client">

View file

@ -141,8 +141,28 @@ namespace MinecraftClient.Protocol.Handlers
SendPacket(0x00, getVarInt(readNextVarInt(ref packetData)));
break;
case 0x02:
handler.OnTextReceived(ChatParser.ParseText(readNextString(ref packetData)));
handler.OnTextReceived(ChatParser.ParseText(readNextString(ref packetData)));
break;
case 0x0C: //Entity Look and Relative Move
//ConsoleIO.WriteLineFormatted("§8 0x0C entity:" + readNextVarInt(ref packetData) + " has come in to sight");
break;
case 0x38: // update player list
int action = readNextVarInt (ref packetData);
int numActions = readNextVarInt (ref packetData);
string uuid = readNextUUID (ref packetData);
switch (action) {
case 0x00:
string name = readNextString (ref packetData);
handler.addPlayer (uuid, name);
break;
case 0x04:
handler.removePlayer (uuid);
break;
default:
//do nothing
break;
}
break;
case 0x3A:
int autocomplete_count = readNextVarInt(ref packetData);
string tab_list = "";
@ -256,6 +276,17 @@ namespace MinecraftClient.Protocol.Handlers
else return "";
}
/// <summary>
/// Read a uuid from a cache of bytes and remove it from the cache
/// </summary>
/// <param name="cache">Cache of bytes to read from</param>
/// <returns>The uuid as a string</returns>
private string readNextUUID(ref byte[] cache)
{
return BitConverter.ToString(readData (16, ref cache)).Replace ("-", string.Empty).ToLower();
}
/// <summary>
/// Read a byte array from a cache of bytes and remove it from the cache
/// </summary>

View file

@ -22,6 +22,10 @@ namespace MinecraftClient.Protocol
string getUserUUID();
string getSessionID();
void addPlayer(string uuid, string name);
void removePlayer(string uuid);
HashSet<string> getPlayers();
/// <summary>
/// This method is called when the protocol handler receives a chat message
/// </summary>