diff --git a/MinecraftClient/ChatParser.cs b/MinecraftClient/ChatParser.cs
index 086edc79..2faff1d3 100644
--- a/MinecraftClient/ChatParser.cs
+++ b/MinecraftClient/ChatParser.cs
@@ -59,17 +59,17 @@ namespace MinecraftClient
case "black": return "§0";
case "dark_blue": return "§1";
case "dark_green": return "§2";
- case "dark_cyan": return "§3";
- case "dark_cyanred": return "§4";
- case "dark_magenta": return "§5";
- case "dark_yellow": return "§6";
+ case "dark_aqua": return "§3";
+ case "dark_red": return "§4";
+ case "dark_purple": return "§5";
+ case "gold": return "§6";
case "gray": return "§7";
case "dark_gray": return "§8";
case "blue": return "§9";
case "green": return "§a";
- case "cyan": return "§b";
+ case "aqua": return "§b";
case "red": return "§c";
- case "magenta": return "§d";
+ case "light_purple": return "§d";
case "yellow": return "§e";
case "white": return "§f";
default: return "";
@@ -294,7 +294,7 @@ namespace MinecraftClient
{
JSONData[] extras = data.Properties["extra"].DataArray.ToArray();
foreach (JSONData item in extras)
- extra_result += JSONData2String(item);
+ extra_result = extra_result + JSONData2String(item) + "§r";
}
if (data.Properties.ContainsKey("color"))
{
diff --git a/MinecraftClient/McTcpClient.cs b/MinecraftClient/McTcpClient.cs
index e8360e3a..c2ffa6cc 100644
--- a/MinecraftClient/McTcpClient.cs
+++ b/MinecraftClient/McTcpClient.cs
@@ -34,9 +34,9 @@ namespace MinecraftClient
/// A valid sessionID obtained with MinecraftCom.GetLogin()
/// The server IP (serveradress or serveradress:port)
- public McTcpClient(string username, string sessionID, string server_port, MinecraftCom handler)
+ public McTcpClient(string username, string uuid, string sessionID, string server_port, MinecraftCom handler)
{
- StartClient(username, sessionID, server_port, false, handler, "");
+ StartClient(username, uuid, sessionID, server_port, false, handler, "");
}
///
@@ -47,9 +47,9 @@ namespace MinecraftClient
/// The server IP (serveradress or serveradress:port)
/// The text or command to send.
- public McTcpClient(string username, string sessionID, string server_port, MinecraftCom handler, string command)
+ public McTcpClient(string username, string uuid, string sessionID, string server_port, MinecraftCom handler, string command)
{
- StartClient(username, sessionID, server_port, true, handler, command);
+ StartClient(username, uuid, sessionID, server_port, true, handler, command);
}
///
@@ -61,7 +61,7 @@ namespace MinecraftClient
/// If set to true, the client will send a single command and then disconnect from the server
/// The text or command to send. Will only be sent if singlecommand is set to true.
- private void StartClient(string user, string sessionID, string server_port, bool singlecommand, MinecraftCom handler, string command)
+ private void StartClient(string user, string uuid, string sessionID, string server_port, bool singlecommand, MinecraftCom handler, string command)
{
this.handler = handler;
username = user;
@@ -86,7 +86,7 @@ namespace MinecraftClient
client = new TcpClient(host, port);
client.ReceiveBufferSize = 1024 * 1024;
handler.setClient(client);
- if (handler.Login(user, sessionID, host, port))
+ if (handler.Login(user, uuid, sessionID, host, port))
{
//Single command sending
if (singlecommand)
diff --git a/MinecraftClient/MinecraftCom.cs b/MinecraftClient/MinecraftCom.cs
index 3f55a4ef..36e5e377 100644
--- a/MinecraftClient/MinecraftCom.cs
+++ b/MinecraftClient/MinecraftCom.cs
@@ -13,7 +13,7 @@ namespace MinecraftClient
public class MinecraftCom : IAutoComplete
{
- #region Login to Minecraft.net, Obtaining a session ID
+ #region Login to Minecraft.net and get a new session ID
public enum LoginResult { Error, Success, WrongPassword, Blocked, AccountMigrated, NotPremium };
@@ -77,35 +77,23 @@ namespace MinecraftClient
#region Session checking when joining a server in online mode
///
- /// This method allows to join an online-mode server.
- /// It Should be called between the handshake and the login attempt.
+ /// Check session using the Yggdrasil authentication scheme. Allow to join an online-mode server
///
/// Username
- /// A valid session ID for this username
- /// Hash returned by the server during the handshake
- /// Returns true if the check was successful
+ /// Session ID
+ /// Server ID
+ /// TRUE if session was successfully checked
- public static bool SessionCheck(string user, string sessionID, string hash)
+ public static bool SessionCheck(string uuid, string accesstoken, string serverhash)
{
- Console.ForegroundColor = ConsoleColor.DarkGray;
- WebClient client = new WebClient();
- Console.Write("http://session.minecraft.net/game/joinserver.jsp?user=" + user + "&sessionId=" + sessionID + "&serverId=" + hash + " ... ");
- string result;
try
{
- result = client.DownloadString("http://session.minecraft.net/game/joinserver.jsp?user=" + user + "&sessionId=" + sessionID + "&serverId=" + hash);
+ WebClient wClient = new WebClient();
+ wClient.Headers.Add("Content-Type: application/json");
+ string json_request = "{\"accessToken\":\"" + accesstoken + "\",\"selectedProfile\":\"" + uuid + "\",\"serverId\":\"" + serverhash + "\"}";
+ return (wClient.UploadString("https://sessionserver.mojang.com/session/minecraft/join", json_request) == "");
}
- catch (WebException e)
- {
- Console.ForegroundColor = ConsoleColor.Gray;
- Console.WriteLine();
- Console.WriteLine("Error while connecting to session server: " + e.Message);
- Console.ForegroundColor = ConsoleColor.DarkGray;
- return false;
- }
- Console.WriteLine(result);
- Console.ForegroundColor = ConsoleColor.Gray;
- return (result == "OK");
+ catch (WebException) { return false; }
}
#endregion
@@ -166,7 +154,7 @@ namespace MinecraftClient
autocomplete_received = true;
tab_list = tab_list.Trim();
if (tab_list.Length > 0)
- ConsoleIO.WriteLine(tab_list);
+ printstring("§8" + tab_list, false);
break;
case 0x40: string reason = readNextString();
ConsoleIO.WriteLine("Disconnected by Server :");
@@ -447,7 +435,7 @@ namespace MinecraftClient
return false;
}
}
- public bool Login(string username, string sessionID, string host, int port)
+ public bool Login(string username, string uuid, string sessionID, string host, int port)
{
byte[] packet_id = getVarInt(0);
byte[] protocol_version = getVarInt(4);
@@ -470,13 +458,14 @@ namespace MinecraftClient
int size = readNextVarInt(); //Packet size
int pid = readNextVarInt(); //Packet ID
size -= getVarInt(pid).Length;
+ /*
while (pid == 0x3F) //Skip some early plugin messages
{
readData(size);
size = readNextVarInt();
pid = readNextVarInt();
size -= getVarInt(pid).Length;
- }
+ }*/
if (pid == 0x00) //Login rejected
{
Console.WriteLine("Login rejected by Server :");
@@ -490,10 +479,7 @@ namespace MinecraftClient
byte[] token = readNextByteArray();
var PublicServerkey = Crypto.GenerateRSAPublicKey(Serverkey_RAW);
var SecretKey = Crypto.GenerateAESPrivateKey();
- Console.ForegroundColor = ConsoleColor.DarkGray;
- Console.WriteLine("Handshake successful. (Server ID: " + serverID + ')');
- Console.ForegroundColor = ConsoleColor.Gray;
- return StartEncryption(username, sessionID, token, serverID, PublicServerkey, SecretKey);
+ return StartEncryption(uuid, sessionID, token, serverID, PublicServerkey, SecretKey);
}
else if (pid == 0x02) //Login successfull
{
@@ -504,7 +490,7 @@ namespace MinecraftClient
}
else return false;
}
- public bool StartEncryption(string username, string sessionID, byte[] token, string serverIDhash, java.security.PublicKey serverKey, javax.crypto.SecretKey secretKey)
+ public bool StartEncryption(string uuid, string sessionID, byte[] token, string serverIDhash, java.security.PublicKey serverKey, javax.crypto.SecretKey secretKey)
{
Console.ForegroundColor = ConsoleColor.DarkGray;
ConsoleIO.WriteLine("Crypto keys & hash generated.");
@@ -513,7 +499,7 @@ namespace MinecraftClient
if (serverIDhash != "-")
{
Console.WriteLine("Checking Session...");
- if (!SessionCheck(username, sessionID, new java.math.BigInteger(Crypto.getServerHash(serverIDhash, serverKey, secretKey)).toString(16)))
+ if (!SessionCheck(uuid, sessionID, new java.math.BigInteger(Crypto.getServerHash(serverIDhash, serverKey, secretKey)).toString(16)))
{
return false;
}
@@ -531,61 +517,13 @@ namespace MinecraftClient
byte[] encryption_response_tosend = concatBytes(getVarInt(encryption_response.Length), encryption_response);
Send(encryption_response_tosend);
+ //Start client-side encryption
+ setEncryptedClient(Crypto.SwitchToAesMode(c.GetStream(), secretKey));
+
//Get the next packet
- int size = readNextVarInt(); //Packet size
- int pid = readNextVarInt(); //Packet ID
- if (pid == 0x02)
- {
- setEncryptedClient(Crypto.SwitchToAesMode(c.GetStream(), secretKey));
- return true;
- }
- else return false;
+ readNextVarInt(); //Skip Packet size (not needed)
+ return (readNextVarInt() == 0x02); //Packet ID. 0x02 = Login Success
}
- /*
- public bool FinalizeLogin()
- {
- Send(new byte[] { 0xCD, 0 });
- try
- {
- byte[] pid = new byte[1];
- try
- {
- if (c.Connected)
- {
- Receive(pid, 0, 1, SocketFlags.None);
- while (pid[0] >= 0xC0 && pid[0] != 0xFF) //Skip some early packets or plugin messages
- {
- processPacket(pid[0]);
- Receive(pid, 0, 1, SocketFlags.None);
- }
- if (pid[0] == (byte)1)
- {
- readData(4); readNextString(); readData(5);
- return true; //The Server accepted the request
- }
- else if (pid[0] == (byte)0xFF)
- {
- string reason = readNextString();
- Console.WriteLine("Login rejected by Server :"); printstring(reason, true);
- for (int i = 0; i < bots.Count; i++) { bots[i].OnDisconnect(ChatBot.DisconnectReason.LoginRejected, reason); }
- return false;
- }
- }
- }
- catch
- {
- //Connection failed
- return false;
- }
- }
- catch
- {
- //Network error
- Console.WriteLine("Connection Lost.");
- return false;
- }
- return false; //Login was unsuccessful (received a kick...)
- }*/
public bool SendChatMessage(string message)
{
diff --git a/MinecraftClient/Program.cs b/MinecraftClient/Program.cs
index d3ed6267..86434ad7 100644
--- a/MinecraftClient/Program.cs
+++ b/MinecraftClient/Program.cs
@@ -15,7 +15,7 @@ namespace MinecraftClient
{
private static McTcpClient Client;
public static string[] startupargs;
- public const string Version = "1.6.0";
+ public const string Version = "1.7.0";
///
/// The main entry point of Minecraft Console Client
@@ -179,8 +179,9 @@ namespace MinecraftClient
{
MinecraftCom.LoginResult result;
- string username = Settings.Login;
+ Settings.Username = Settings.Login;
string sessionID = "";
+ string UUID = "";
if (Settings.Password == "-")
{
@@ -193,9 +194,8 @@ namespace MinecraftClient
else
{
Console.WriteLine("Connecting to Minecraft.net...");
- result = MinecraftCom.GetLogin(ref username, Settings.Password, ref sessionID, ref Settings.UUID);
+ result = MinecraftCom.GetLogin(ref Settings.Username, Settings.Password, ref sessionID, ref UUID);
}
- Settings.Username = username;
if (result == MinecraftCom.LoginResult.Success)
{
Console.WriteLine("Success. (session ID: " + sessionID + ')');
@@ -236,9 +236,9 @@ namespace MinecraftClient
//Start the main TCP client
if (Settings.SingleCommand != "")
{
- Client = new McTcpClient(Settings.Username, sessionID, Settings.ServerIP, handler, Settings.SingleCommand);
+ Client = new McTcpClient(Settings.Username, UUID, sessionID, Settings.ServerIP, handler, Settings.SingleCommand);
}
- else Client = new McTcpClient(Settings.Username, sessionID, Settings.ServerIP, handler);
+ else Client = new McTcpClient(Settings.Username, UUID, sessionID, Settings.ServerIP, handler);
}
else
{
diff --git a/MinecraftClient/Settings.cs b/MinecraftClient/Settings.cs
index 6c33c159..f6a3284c 100644
--- a/MinecraftClient/Settings.cs
+++ b/MinecraftClient/Settings.cs
@@ -19,7 +19,6 @@ namespace MinecraftClient
public static string Login = "";
public static string Username = "";
public static string Password = "";
- public static string UUID = "";
public static string ServerIP = "";
public static string SingleCommand = "";