First attempt of MC 1.7 Server Ping ping packet

Currently not working, see MinecraftCom.cs & comment "STUCK HERE"
This commit is contained in:
ORelio 2014-01-06 18:11:54 +01:00
parent 6beb5588ce
commit 5fb54882ca
2 changed files with 69 additions and 36 deletions

View file

@ -299,12 +299,12 @@ namespace MinecraftClient
} }
private string readNextString() private string readNextString()
{ {
ushort length = (ushort)readNextShort(); int length = readNextVarInt();
if (length > 0) if (length > 0)
{ {
byte[] cache = new byte[length * 2]; byte[] cache = new byte[length];
Receive(cache, 0, length * 2, SocketFlags.None); Receive(cache, 0, length, SocketFlags.None);
string result = Encoding.BigEndianUnicode.GetString(cache); string result = Encoding.UTF8.GetString(cache);
return result; return result;
} }
else return ""; else return "";
@ -450,6 +450,36 @@ namespace MinecraftClient
readData(datalen); readData(datalen);
readData(12 * (chunkcount)); readData(12 * (chunkcount));
} }
private int readNextVarInt()
{
int i = 0;
int j = 0;
while (true)
{
int k = readNextByte();
i |= (k & 0x7F) << j++ * 7;
if (j > 5) throw new OverflowException("VarInt too big");
if ((k & 0x80) != 128) break;
}
return i;
}
private static byte[] getVarInt(int paramInt)
{
List<byte> bytes = new List<byte>();
while ((paramInt & -128) != 0)
{
bytes.Add((byte)(paramInt & 127 | 128));
paramInt = (int)(((uint)paramInt) >> 7);
}
return bytes.ToArray();
}
private static byte[] concatBytes(params byte[][] bytes)
{
List<byte> result = new List<byte>();
foreach (byte[] array in bytes)
result.AddRange(array);
return result.ToArray();
}
private static void setcolor(char c) private static void setcolor(char c)
{ {
@ -565,40 +595,43 @@ namespace MinecraftClient
} }
TcpClient tcp = new TcpClient(host, port); TcpClient tcp = new TcpClient(host, port);
byte[] ping = new byte[2] { 0xfe, 0x01 };
tcp.Client.Send(ping, SocketFlags.None);
tcp.Client.Receive(ping, 0, 1, SocketFlags.None); byte[] packet_id = getVarInt(0);
if (ping[0] == 0xff) byte[] protocol_version = getVarInt(4);
{ byte[] server_adress_val = Encoding.UTF8.GetBytes(host);
byte[] server_adress_len = getVarInt(server_adress_val.Length);
byte[] server_port = BitConverter.GetBytes((ushort)port); Array.Reverse(server_port);
byte[] next_state = getVarInt(1);
byte[] packet = concatBytes(packet_id, protocol_version, server_adress_len, server_adress_val, server_port, next_state);
byte[] tosend = concatBytes(getVarInt(packet.Length), packet);
tcp.Client.Send(tosend, SocketFlags.None);
byte[] status_request = getVarInt(0);
byte[] request_packet = concatBytes(getVarInt(status_request.Length), status_request);
tcp.Client.Send(request_packet, SocketFlags.None);
MinecraftCom ComTmp = new MinecraftCom(); MinecraftCom ComTmp = new MinecraftCom();
ComTmp.setClient(tcp); ComTmp.setClient(tcp);
if (ComTmp.readNextVarInt() > 0) //Read Response length //<- STUCK HERE (NO ANSWER FROM SERVER)
{
if (ComTmp.readNextVarInt() == 0x00) //Read Packet ID
{
string result = ComTmp.readNextString(); string result = ComTmp.readNextString();
Console.ForegroundColor = ConsoleColor.DarkGray; Console.ForegroundColor = ConsoleColor.DarkGray;
//Console.WriteLine(result.Replace((char)0x00, ' ')); Console.WriteLine(result);
if (result.Length > 2 && result[0] == '§' && result[1] == '1') //Console.WriteLine("Server version : MC " + version + " (protocol v" + protocolversion + ").");*/
{
string[] tmp = result.Split((char)0x00);
protocolversion = (byte)Int16.Parse(tmp[1]);
version = tmp[2];
}
else
{
protocolversion = (byte)39;
version = "B1.8.1 - 1.3.2";
}
Console.WriteLine("Server version : MC " + version + " (protocol v" + protocolversion + ").");
Console.ForegroundColor = ConsoleColor.Gray; Console.ForegroundColor = ConsoleColor.Gray;
return true; //return true;
return false; //MC 1.7+ not supported
}
} }
else
{
Console.ForegroundColor = ConsoleColor.DarkGray; Console.ForegroundColor = ConsoleColor.DarkGray;
Console.WriteLine("Unexpected answer from the server (is that a Minecraft server ?)"); Console.WriteLine("Unexpected answer from the server (is that a MC 1.7+ server ?)");
Console.ForegroundColor = ConsoleColor.Gray; Console.ForegroundColor = ConsoleColor.Gray;
return false; return false;
} }
}
catch catch
{ {
Console.ForegroundColor = ConsoleColor.DarkGray; Console.ForegroundColor = ConsoleColor.DarkGray;

View file

@ -23,7 +23,7 @@ namespace MinecraftClient
static void Main(string[] args) static void Main(string[] args)
{ {
Console.WriteLine("Console Client for MC 1.4.6 to 1.6.4 - v" + Version + " - By ORelio & Contributors"); Console.WriteLine("Console Client for MC 1.7.2 - v" + Version + " - By ORelio & Contributors");
//Basic Input/Output ? //Basic Input/Output ?
if (args.Length >= 1 && args[args.Length - 1] == "BasicIO") if (args.Length >= 1 && args[args.Length - 1] == "BasicIO")
@ -211,11 +211,11 @@ namespace MinecraftClient
if (MinecraftCom.GetServerInfo(Settings.ServerIP, ref protocolversion, ref version)) if (MinecraftCom.GetServerInfo(Settings.ServerIP, ref protocolversion, ref version))
{ {
//Supported protocol version ? //Supported protocol version ?
int[] supportedVersions = { 51, 60, 61, 72, 73, 74, 78 }; int[] supportedVersions = { 4 };
if (Array.IndexOf(supportedVersions, protocolversion) > -1) if (Array.IndexOf(supportedVersions, protocolversion) > -1)
{ {
//Minecraft 1.6+ ? Load translations //Load translations (Minecraft 1.6+)
if (protocolversion >= 72) { ChatParser.InitTranslations(); } ChatParser.InitTranslations();
//Will handle the connection for this client //Will handle the connection for this client
Console.WriteLine("Version is supported."); Console.WriteLine("Version is supported.");