diff --git a/.gitignore b/.gitignore index f911c9a39e..307f491a00 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ /MinecraftClient.suo /MinecraftClientGUI.v11.suo /MinecraftClientGUI.suo +/MinecraftClient.userprefs diff --git a/MinecraftClient/Commands/List.cs b/MinecraftClient/Commands/List.cs new file mode 100644 index 0000000000..b1a653d611 --- /dev/null +++ b/MinecraftClient/Commands/List.cs @@ -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 ""; + } + } +} + diff --git a/MinecraftClient/McTcpClient.cs b/MinecraftClient/McTcpClient.cs index 4e59d1b34b..47954ad558 100644 --- a/MinecraftClient/McTcpClient.cs +++ b/MinecraftClient/McTcpClient.cs @@ -33,6 +33,8 @@ public class McTcpClient : IMinecraftComHandler private string uuid; private string sessionid; + public Dictionary players; + public int getServerPort() { return port; } public string getServerHost() { return host; } public string getUsername() { return username; } @@ -56,6 +58,7 @@ public class McTcpClient : IMinecraftComHandler 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(); } /// @@ -388,6 +391,19 @@ public bool SendText(string text) else return handler.SendChatMessage(text); } + /// + /// Display a list of players + /// + /// True if the players can be listed + + public bool ListPlayers() + { + ConsoleIO.WriteLine ("Player List"); + foreach (string player in players.Values) + ConsoleIO.WriteLine (player); + return true; + } + /// /// Allow to respawn after death /// @@ -395,7 +411,16 @@ public bool SendText(string text) 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 getPlayers() { return new HashSet(players.Values); } } } diff --git a/MinecraftClient/MinecraftClient.csproj b/MinecraftClient/MinecraftClient.csproj index 4bbb262fea..52dba3330b 100644 --- a/MinecraftClient/MinecraftClient.csproj +++ b/MinecraftClient/MinecraftClient.csproj @@ -131,6 +131,7 @@ + diff --git a/MinecraftClient/Protocol/Handlers/Protocol18.cs b/MinecraftClient/Protocol/Handlers/Protocol18.cs index 270809dccd..edac89b159 100644 --- a/MinecraftClient/Protocol/Handlers/Protocol18.cs +++ b/MinecraftClient/Protocol/Handlers/Protocol18.cs @@ -143,6 +143,26 @@ private bool handlePacket(int packetID, byte[] packetData) case 0x02: 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 @@ private string readNextString(ref byte[] cache) else return ""; } + /// + /// Read a uuid from a cache of bytes and remove it from the cache + /// + /// Cache of bytes to read from + /// The uuid as a string + + private string readNextUUID(ref byte[] cache) + { + return BitConverter.ToString(readData (16, ref cache)).Replace ("-", string.Empty).ToLower(); + } + /// /// Read a byte array from a cache of bytes and remove it from the cache /// diff --git a/MinecraftClient/Protocol/IMinecraftComHandler.cs b/MinecraftClient/Protocol/IMinecraftComHandler.cs index cc2b6055f3..79b4fe39ee 100644 --- a/MinecraftClient/Protocol/IMinecraftComHandler.cs +++ b/MinecraftClient/Protocol/IMinecraftComHandler.cs @@ -22,6 +22,10 @@ public interface IMinecraftComHandler string getUserUUID(); string getSessionID(); + void addPlayer(string uuid, string name); + void removePlayer(string uuid); + HashSet getPlayers(); + /// /// This method is called when the protocol handler receives a chat message ///