Merge pull request #34 from ORelio/Indev

Merging changes from Indev for 1.7.1 release
This commit is contained in:
ORelio 2014-01-28 09:49:35 -08:00
commit ae5e418b52
9 changed files with 301 additions and 141 deletions

View file

@ -127,10 +127,10 @@ namespace MinecraftClient
try
{
//Detect vanilla /tell messages
//Someone whispers message
//Someone whispers to you: message
if (tmp.Length > 2 && tmp[1] == "whispers")
{
message = text.Substring(tmp[0].Length + 10);
message = text.Substring(tmp[0].Length + 18);
sender = tmp[0];
return isValidName(sender);
}
@ -264,7 +264,7 @@ namespace MinecraftClient
}
/// <summary>
/// This bot sends a /ping command every 60 seconds in order to stay non-afk.
/// This bot sends a command every 60 seconds in order to stay non-afk.
/// </summary>
public class AntiAFK : ChatBot
@ -289,7 +289,7 @@ namespace MinecraftClient
count++;
if (count == timeping)
{
SendText("/ping");
SendText(Settings.AntiAFK_Command);
count = 0;
}
}
@ -875,14 +875,33 @@ namespace MinecraftClient
public override void Initialize()
{
// Loads the given file from the startup parameters
if (System.IO.File.Exists(file))
//Load the given file from the startup parameters
//Automatically look in subfolders and try to add ".txt" file extension
string[] files = new string[]
{
lines = System.IO.File.ReadAllLines(file); // Load the given bot text file (containing commands)
file,
file + ".txt",
"scripts\\" + file,
"scripts\\" + file + ".txt",
"config\\" + file,
"config\\" + file + ".txt",
};
bool file_found = false;
foreach (string possible_file in files)
{
if (System.IO.File.Exists(possible_file))
{
lines = System.IO.File.ReadAllLines(possible_file);
file_found = true;
break;
}
}
else
if (!file_found)
{
LogToConsole("File not found: " + file);
LogToConsole("File not found: '" + file + "'");
UnloadBot(); //No need to keep the bot active
}
}
@ -898,9 +917,9 @@ namespace MinecraftClient
nextline++; //Move the cursor so that the next time the following line will be interpreted
sleepticks = sleepticks_interval; //Used to delay next command sending and prevent from beign kicked for spamming
if (instruction_line.Length > 0)
if (instruction_line.Length > 1)
{
if (!instruction_line.StartsWith("//") && !instruction_line.StartsWith("#"))
if (instruction_line[0] != '#' && instruction_line[0] != '/' && instruction_line[1] != '/')
{
string instruction_name = instruction_line.Split(' ')[0];
switch (instruction_name.ToLower())

View file

@ -21,7 +21,7 @@ namespace MinecraftClient
{
int cursorpos = 0;
JSONData jsonData = String2Data(json, ref cursorpos);
return JSONData2String(jsonData);
return JSONData2String(jsonData, "");
}
/// <summary>
@ -96,14 +96,37 @@ namespace MinecraftClient
TranslationRules["commands.message.display.outgoing"] = "§7You whisper to %s: %s";
//Use translations from Minecraft assets if translation file is not found but a copy of the game is installed?
if (!System.IO.File.Exists(Settings.TranslationsFile) //Try en_US.lang
if (!System.IO.File.Exists(Settings.TranslationsFile) //Try en_GB.lang
&& System.IO.File.Exists(Settings.TranslationsFile_FromMCDir))
{ Settings.TranslationsFile = Settings.TranslationsFile_FromMCDir; }
if (!System.IO.File.Exists(Settings.TranslationsFile) //Still not found? try en_GB.lang
&& System.IO.File.Exists(Settings.TranslationsFile_FromMCDir_Alt))
{ Settings.TranslationsFile = Settings.TranslationsFile_FromMCDir_Alt; }
{
Settings.TranslationsFile = Settings.TranslationsFile_FromMCDir;
Console.ForegroundColor = ConsoleColor.DarkGray;
ConsoleIO.WriteLine("Using en_GB.lang from your Minecraft directory.");
Console.ForegroundColor = ConsoleColor.Gray;
}
//Load an external dictionnary of translation rules
//Still not found? try downloading en_GB from Mojang's servers?
if (!System.IO.File.Exists(Settings.TranslationsFile))
{
Console.ForegroundColor = ConsoleColor.DarkGray;
ConsoleIO.WriteLine("Downloading en_GB.lang from Mojang's servers...");
try
{
string assets_index = downloadString(Settings.TranslationsFile_Website_Index);
string[] tmp = assets_index.Split(new string[] { "lang/en_GB.lang" }, StringSplitOptions.None);
tmp = tmp[1].Split(new string[] { "hash\": \"" }, StringSplitOptions.None);
string hash = tmp[1].Split('"')[0]; //Translations file identifier on Mojang's servers
System.IO.File.WriteAllText(Settings.TranslationsFile, downloadString(Settings.TranslationsFile_Website_Download + '/' + hash.Substring(0, 2) + '/' + hash));
ConsoleIO.WriteLine("Done. File saved as \"" + Settings.TranslationsFile + '"');
}
catch
{
ConsoleIO.WriteLine("Failed to download the file.");
}
Console.ForegroundColor = ConsoleColor.Gray;
}
//Load the external dictionnary of translation rules or display an error message
if (System.IO.File.Exists(Settings.TranslationsFile))
{
string[] translations = System.IO.File.ReadAllLines(Settings.TranslationsFile);
@ -281,41 +304,43 @@ namespace MinecraftClient
/// Use a JSON Object to build the corresponding string
/// </summary>
/// <param name="data">JSON object to convert</param>
/// <param name="colorcode">Allow parent color code to affect child elements (set to "" for function init)</param>
/// <returns>returns the Minecraft-formatted string</returns>
private static string JSONData2String(JSONData data)
private static string JSONData2String(JSONData data, string colorcode)
{
string extra_result = "";
string colorcode = "";
switch (data.Type)
{
case JSONData.DataType.Object:
if (data.Properties.ContainsKey("color"))
{
colorcode = color2tag(JSONData2String(data.Properties["color"], ""));
}
if (data.Properties.ContainsKey("extra"))
{
JSONData[] extras = data.Properties["extra"].DataArray.ToArray();
foreach (JSONData item in extras)
extra_result = extra_result + JSONData2String(item) + "§r";
}
if (data.Properties.ContainsKey("color"))
{
colorcode = color2tag(JSONData2String(data.Properties["color"]));
extra_result = extra_result + JSONData2String(item, colorcode) + "§r";
}
if (data.Properties.ContainsKey("text"))
{
return extra_result + colorcode + JSONData2String(data.Properties["text"]) + colorcode;
return colorcode + JSONData2String(data.Properties["text"], colorcode) + extra_result;
}
else if (data.Properties.ContainsKey("translate"))
{
List<string> using_data = new List<string>();
if (data.Properties.ContainsKey("using"))
if (data.Properties.ContainsKey("using") && !data.Properties.ContainsKey("with"))
data.Properties["with"] = data.Properties["using"];
if (data.Properties.ContainsKey("with"))
{
JSONData[] array = data.Properties["using"].DataArray.ToArray();
JSONData[] array = data.Properties["with"].DataArray.ToArray();
for (int i = 0; i < array.Length; i++)
{
using_data.Add(JSONData2String(array[i]));
using_data.Add(JSONData2String(array[i], colorcode));
}
}
return extra_result + colorcode + TranslateString(JSONData2String(data.Properties["translate"]), using_data) + colorcode;
return colorcode + TranslateString(JSONData2String(data.Properties["translate"], ""), using_data) + extra_result;
}
else return extra_result;
@ -323,12 +348,12 @@ namespace MinecraftClient
string result = "";
foreach (JSONData item in data.DataArray)
{
result += JSONData2String(item);
result += JSONData2String(item, colorcode);
}
return result;
case JSONData.DataType.String:
return data.StringValue;
return colorcode + data.StringValue;
}
return "";
@ -341,5 +366,23 @@ namespace MinecraftClient
/// <returns>True if hexadecimal</returns>
private static bool isHex(char c) { return ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f')); }
/// <summary>
/// Do a HTTP request to get a webpage or text data from a server file
/// </summary>
/// <param name="url">URL of resource</param>
/// <returns>Returns resource data if success, otherwise a WebException is raised</returns>
private static string downloadString(string url)
{
System.Net.HttpWebRequest myRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
myRequest.Method = "GET";
System.Net.WebResponse myResponse = myRequest.GetResponse();
System.IO.StreamReader sr = new System.IO.StreamReader(myResponse.GetResponseStream(), System.Text.Encoding.UTF8);
string result = sr.ReadToEnd();
sr.Close();
myResponse.Close();
return result;
}
}
}

View file

@ -2,6 +2,8 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace MinecraftClient
{
@ -80,77 +82,86 @@ namespace MinecraftClient
k = Console.ReadKey(true);
while (writing_lock) { }
reading_lock = true;
switch (k.Key)
if (k.Key == ConsoleKey.V && k.Modifiers == ConsoleModifiers.Control)
{
case ConsoleKey.Escape:
ClearLineAndBuffer();
break;
case ConsoleKey.Backspace:
RemoveOneChar();
break;
case ConsoleKey.Enter:
Console.Write('\n');
break;
case ConsoleKey.LeftArrow:
GoLeft();
break;
case ConsoleKey.RightArrow:
GoRight();
break;
case ConsoleKey.Home:
while (buffer.Length > 0) { GoLeft(); }
break;
case ConsoleKey.End:
while (buffer2.Length > 0) { GoRight(); }
break;
case ConsoleKey.Delete:
if (buffer2.Length > 0)
{
GoRight();
string clip = ReadClipboard();
foreach (char c in clip)
AddChar(c);
}
else
{
switch (k.Key)
{
case ConsoleKey.Escape:
ClearLineAndBuffer();
break;
case ConsoleKey.Backspace:
RemoveOneChar();
}
break;
case ConsoleKey.Oem6:
break;
case ConsoleKey.DownArrow:
if (previous.Count > 0)
{
ClearLineAndBuffer();
buffer = previous.First.Value;
previous.AddLast(buffer);
previous.RemoveFirst();
Console.Write(buffer);
}
break;
case ConsoleKey.UpArrow:
if (previous.Count > 0)
{
ClearLineAndBuffer();
buffer = previous.Last.Value;
previous.AddFirst(buffer);
previous.RemoveLast();
Console.Write(buffer);
}
break;
case ConsoleKey.Tab:
if (autocomplete_engine != null && buffer.Length > 0)
{
string[] tmp = buffer.Split(' ');
if (tmp.Length > 0)
break;
case ConsoleKey.Enter:
Console.Write('\n');
break;
case ConsoleKey.LeftArrow:
GoLeft();
break;
case ConsoleKey.RightArrow:
GoRight();
break;
case ConsoleKey.Home:
while (buffer.Length > 0) { GoLeft(); }
break;
case ConsoleKey.End:
while (buffer2.Length > 0) { GoRight(); }
break;
case ConsoleKey.Delete:
if (buffer2.Length > 0)
{
string word_tocomplete = tmp[tmp.Length - 1];
string word_autocomplete = autocomplete_engine.AutoComplete(word_tocomplete);
if (!String.IsNullOrEmpty(word_autocomplete) && word_autocomplete != word_tocomplete)
GoRight();
RemoveOneChar();
}
break;
case ConsoleKey.Oem6:
break;
case ConsoleKey.DownArrow:
if (previous.Count > 0)
{
ClearLineAndBuffer();
buffer = previous.First.Value;
previous.AddLast(buffer);
previous.RemoveFirst();
Console.Write(buffer);
}
break;
case ConsoleKey.UpArrow:
if (previous.Count > 0)
{
ClearLineAndBuffer();
buffer = previous.Last.Value;
previous.AddFirst(buffer);
previous.RemoveLast();
Console.Write(buffer);
}
break;
case ConsoleKey.Tab:
if (autocomplete_engine != null && buffer.Length > 0)
{
string[] tmp = buffer.Split(' ');
if (tmp.Length > 0)
{
while (buffer.Length > 0 && buffer[buffer.Length - 1] != ' ') { RemoveOneChar(); }
foreach (char c in word_autocomplete) { AddChar(c); }
string word_tocomplete = tmp[tmp.Length - 1];
string word_autocomplete = autocomplete_engine.AutoComplete(word_tocomplete);
if (!String.IsNullOrEmpty(word_autocomplete) && word_autocomplete != word_tocomplete)
{
while (buffer.Length > 0 && buffer[buffer.Length - 1] != ' ') { RemoveOneChar(); }
foreach (char c in word_autocomplete) { AddChar(c); }
}
}
}
}
break;
default:
AddChar(k.KeyChar);
break;
break;
default:
AddChar(k.KeyChar);
break;
}
}
reading_lock = false;
}
@ -212,7 +223,7 @@ namespace MinecraftClient
}
#endregion
#region subfunctions
#region Subfunctions
private static void ClearLineAndBuffer()
{
while (buffer2.Length > 0) { GoRight(); }
@ -275,6 +286,27 @@ namespace MinecraftClient
for (int i = 0; i < buffer2.Length; i++) { GoBack(); }
}
#endregion
#region Clipboard management
private static string ReadClipboard()
{
string clipdata = "";
Thread staThread = new Thread(new ThreadStart(
delegate
{
try
{
clipdata = Clipboard.GetText();
}
catch { }
}
));
staThread.SetApartmentState(ApartmentState.STA);
staThread.Start();
staThread.Join();
return clipdata;
}
#endregion
}
/// <summary>

View file

@ -143,6 +143,9 @@ namespace MinecraftClient
{
try
{
//Needed if the player is dead
handler.SendRespawnPacket();
while (client.Client.Connected)
{
text = ConsoleIO.ReadLine();
@ -160,9 +163,21 @@ namespace MinecraftClient
}
else
{
if (text.ToLower() == "/quit" || text.ToLower().StartsWith("/exec ") || text.ToLower() == "/reco" || text.ToLower() == "/reconnect") { break; }
while (text.Length > 0 && text[0] == ' ') { text = text.Substring(1); }
if (text != "")
text = text.Trim();
if (text.ToLower() == "/quit" || text.ToLower() == "/reco")
{
break;
}
else if (text.ToLower() == "/respawn")
{
handler.SendRespawnPacket();
ConsoleIO.WriteLine("You have respawned.");
}
else if (text.ToLower().StartsWith("/script "))
{
handler.BotLoad(new Bots.Scripting(text.Substring(8)));
}
else if (text != "")
{
//Message is too long
if (text.Length > 100)
@ -175,7 +190,7 @@ namespace MinecraftClient
}
else
{
//Send the message splitted in sereval messages
//Send the message splitted in several messages
while (text.Length > 100)
{
handler.SendChatMessage(text.Substring(0, 100));
@ -189,22 +204,10 @@ namespace MinecraftClient
}
}
if (text.ToLower() == "/quit")
switch (text.ToLower())
{
ConsoleIO.WriteLine("You have left the server.");
Disconnect();
}
else if (text.ToLower().StartsWith("/exec ")) {
handler.BotLoad(new Bots.Scripting("config/" + text.Split()[1]));
}
else if (text.ToLower() == "/reco" || text.ToLower() == "/reconnect")
{
ConsoleIO.WriteLine("You have left the server.");
handler.SendRespawnPacket();
Program.Restart();
case "/quit": Program.Exit(); break;
case "/reco": Program.Restart(); break;
}
}
catch (IOException) { }

View file

@ -74,6 +74,7 @@
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />

View file

@ -132,16 +132,6 @@ namespace MinecraftClient
message = ChatParser.ParseText(message);
printstring(message, false);
for (int i = 0; i < bots.Count; i++) { bots[i].GetText(message); } break;
case 0x37:
int stats_count = readNextVarInt();
for (int i = 0; i < stats_count; i++)
{
string stat_name = readNextString();
readNextVarInt(); //stat value
if (stat_name == "stat.deaths")
printstring("You are dead. Type /reco to respawn & reconnect.", false);
}
break;
case 0x3A:
int autocomplete_count = readNextVarInt();
string tab_list = "";
@ -343,7 +333,6 @@ namespace MinecraftClient
private void setEncryptedClient(Crypto.AesStream n) { s = n; encrypted = true; }
private void Receive(byte[] buffer, int start, int offset, SocketFlags f)
{
while (c.Client.Available < start + offset) { }
if (encrypted)
{
s.Read(buffer, start, offset);
@ -549,6 +538,9 @@ namespace MinecraftClient
if (message == null)
message = "";
message.Replace("\"", "\\\"");
message = "\"" + message + "\"";
try
{
byte[] packet_id = getVarInt(0x40);

View file

@ -15,7 +15,7 @@ namespace MinecraftClient
{
private static McTcpClient Client;
public static string[] startupargs;
public const string Version = "1.7.0";
public const string Version = "1.7.1";
/// <summary>
/// The main entry point of Minecraft Console Client
@ -29,16 +29,28 @@ namespace MinecraftClient
if (args.Length >= 1 && args[args.Length - 1] == "BasicIO")
{
ConsoleIO.basicIO = true;
Console.OutputEncoding = Console.InputEncoding = Encoding.GetEncoding(System.Globalization.CultureInfo.CurrentCulture.TextInfo.ANSICodePage);
args = args.Where(o => !Object.ReferenceEquals(o, args[args.Length - 1])).ToArray();
}
//Processing Command-line arguments or Config File
if (args.Length == 1 && System.IO.File.Exists(args[0]))
//Process ini configuration file
if (args.Length >= 1 && System.IO.File.Exists(args[0]) && System.IO.Path.GetExtension(args[0]).ToLower() == ".ini")
{
Settings.LoadSettings(args[0]);
//remove ini configuration file from arguments array
List<string> args_tmp = args.ToList<string>();
args_tmp.RemoveAt(0);
args = args_tmp.ToArray();
}
else if (args.Length >= 1)
else if (System.IO.File.Exists("MinecraftClient.ini"))
{
Settings.LoadSettings("MinecraftClient.ini");
}
else Settings.WriteDefaultSettings("MinecraftClient.ini");
//Other command-line arguments
if (args.Length >= 1)
{
Settings.Login = args[0];
if (args.Length >= 2)
@ -141,11 +153,11 @@ namespace MinecraftClient
}
}
}
else if (System.IO.File.Exists("MinecraftClient.ini"))
if (Settings.ConsoleTitle != "")
{
Settings.LoadSettings("MinecraftClient.ini");
Console.Title = Settings.ConsoleTitle.Replace("%username%", "New Window");
}
else Settings.WriteDefaultSettings("MinecraftClient.ini");
//Asking the user to type in missing data such as Username and Password
@ -198,6 +210,11 @@ namespace MinecraftClient
}
if (result == MinecraftCom.LoginResult.Success)
{
if (Settings.ConsoleTitle != "")
{
Console.Title = Settings.ConsoleTitle.Replace("%username%", Settings.Username);
}
Console.WriteLine("Success. (session ID: " + sessionID + ')');
if (Settings.ServerIP == "")
{

View file

@ -21,16 +21,19 @@ namespace MinecraftClient
public static string Password = "";
public static string ServerIP = "";
public static string SingleCommand = "";
public static string ConsoleTitle = "";
//Other Settings
public static string TranslationsFile_FromMCDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\.minecraft\assets\virtual\legacy\lang\en_US.lang";
public static string TranslationsFile_FromMCDir_Alt = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\.minecraft\assets\virtual\legacy\lang\en_GB.lang";
public static string TranslationsFile_FromMCDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\.minecraft\assets\objects\9e\9e2fdc43fc1c7024ff5922b998fadb2971a64ee0"; //MC 1.7.4 en_GB.lang
public static string TranslationsFile_Website_Index = "https://s3.amazonaws.com/Minecraft.Download/indexes/1.7.4.json";
public static string TranslationsFile_Website_Download = "http://resources.download.minecraft.net";
public static string TranslationsFile = "translations.lang";
public static string Bots_OwnersFile = "bot-owners.txt";
//AntiAFK Settings
public static bool AntiAFK_Enabled = false;
public static int AntiAFK_Delay = 600;
public static string AntiAFK_Command = "/ping";
//Hangman Settings
public static bool Hangman_Enabled = false;
@ -120,7 +123,7 @@ namespace MinecraftClient
case "singlecommand": SingleCommand = argValue; break;
case "translationsfile": TranslationsFile = argValue; break;
case "botownersfile": Bots_OwnersFile = argValue; break;
case "consoletitle": Console.Title = argValue; break;
case "consoletitle": ConsoleTitle = argValue; break;
}
break;
@ -138,6 +141,7 @@ namespace MinecraftClient
{
case "enabled": AntiAFK_Enabled = str2bool(argValue); break;
case "delay": AntiAFK_Delay = str2int(argValue); break;
case "command": AntiAFK_Command = argValue == "" ? "/ping" : argValue; break;
}
break;
@ -195,7 +199,56 @@ namespace MinecraftClient
public static void WriteDefaultSettings(string settingsfile)
{
System.IO.File.WriteAllText(settingsfile, "#Minecraft Console Client v" + Program.Version + "\r\n#Startup Config File\r\n\r\n[Main]\r\n\r\n#General settings\r\n#leave blank = prompt user on startup\r\n#Use \"-\" as password for offline mode\r\n\r\nlogin=\r\npassword=\r\nserverip=\r\n\r\n#Advanced settings\r\n\r\ntranslationsfile=translations.lang\r\nbotownersfile=bot-owners.txt\r\nconsoletitle=Minecraft Console Client\r\n\r\n#Bot Settings\r\n\r\n[Alerts]\r\nenabled=false\r\nalertsfile=alerts.txt\r\nexcludesfile=alerts-exclude.txt\r\n\r\n[AntiAFK]\r\nenabled=false\r\ndelay=600 #10 = 1s\r\n\r\n[AutoRelog]\r\nenabled=false\r\ndelay=10\r\nretries=3 #-1 = unlimited\r\nkickmessagesfile=kickmessages.txt\r\n\r\n[ChatLog]\r\nenabled=false\r\ntimestamps=true\r\nfilter=messages\r\nlogfile=chatlog.txt\r\n\r\n[Hangman]\r\nenabled=false\r\nenglish=true\r\nwordsfile=hangman-en.txt\r\nfichiermots=hangman-fr.txt\r\n\r\n[Scripting]\r\nenabled=false\r\nscriptfile=testscript.txt\r\n", Encoding.UTF8);
System.IO.File.WriteAllText(settingsfile, "#Minecraft Console Client v" + Program.Version + "\r\n"
+ "#Startup Config File\r\n"
+ "\r\n"
+ "[Main]\r\n"
+ "\r\n"
+ "#General settings\r\n"
+ "#leave blank = prompt user on startup\r\n"
+ "#Use \"-\" as password for offline mode\r\n"
+ "\r\n"
+ "login=\r\npassword=\r\nserverip=\r\n"
+ "\r\n"
+ "#Advanced settings\r\n"
+ "\r\n"
+ "translationsfile=translations.lang\r\n"
+ "botownersfile=bot-owners.txt\r\n"
+ "consoletitle=Minecraft Console Client - %username%\r\n"
+ "\r\n"
+ "#Bot Settings\r\n"
+ "\r\n"
+ "[Alerts]\r\n"
+ "enabled=false\r\n"
+ "alertsfile=alerts.txt\r\n"
+ "excludesfile=alerts-exclude.txt\r\n"
+ "\r\n"
+ "[AntiAFK]\r\n"
+ "enabled=false\r\n"
+ "delay=600 #10 = 1s\r\n"
+ "command=/ping\r\n"
+ "\r\n"
+ "[AutoRelog]\r\n"
+ "enabled=false\r\n"
+ "delay=10\r\n"
+ "retries=3 #-1 = unlimited\r\n"
+ "kickmessagesfile=kickmessages.txt\r\n"
+ "\r\n"
+ "[ChatLog]\r\n"
+ "enabled=false\r\n"
+ "timestamps=true\r\n"
+ "filter=messages\r\n"
+ "logfile=chatlog.txt\r\n"
+ "\r\n"
+ "[Hangman]\r\n"
+ "enabled=false\r\n"
+ "english=true\r\n"
+ "wordsfile=hangman-en.txt\r\n"
+ "fichiermots=hangman-fr.txt\r\n"
+ "\r\n"
+ "[Scripting]\r\n"
+ "enabled=false\r\n"
+ "scriptfile=testscript.txt\r\n", Encoding.UTF8);
}
public static int str2int(string str) { try { return Convert.ToInt32(str); } catch { return 0; } }

View file

@ -59,7 +59,7 @@ namespace MinecraftClientGUI
Client.StartInfo.FileName = ExePath;
Client.StartInfo.Arguments = arguments;
Client.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
Client.StartInfo.StandardOutputEncoding = Encoding.GetEncoding(850);
Client.StartInfo.StandardOutputEncoding = Encoding.GetEncoding(System.Globalization.CultureInfo.CurrentCulture.TextInfo.ANSICodePage);
Client.StartInfo.UseShellExecute = false;
Client.StartInfo.RedirectStandardOutput = true;
Client.StartInfo.RedirectStandardInput = true;