Войти или зарегистрироваться

Туториал Пишем свой лаунчер на C#

  • Автор темы Автор темы arteZ
  • Дата начала Дата начала
Чем это вас не устроил мой ответ?

По-твоему нереально сделать лаунчер на C#, который при отсутствии Java будет её предлагать установить?
Ты странный, бомбонувший парень..
Я только что продемонстрировал тебе работу лаунчера и майна без установки джавы.
 
Я только что продемонстрировал тебе работу лаунчера и майна без установки джавы.
Ясно.
Я только что продемонстрировал тебе работу лаунчера и майна без установки джавы.
Знаешь, а ещё ты немного конченный.
Че я тебе сказал в посте своем?
Сказал что лаунчер не работает без Java?
Глянь название темы, Девелоперка.
Это C#.
Не знаю, какого черта ты натворил, но MineCraft написан на Java, и без компилятора этой платформы работать не может.
 
Ясно.

Знаешь, а ещё ты немного конченный.
Че я тебе сказал в посте своем?
Сказал что лаунчер не работает без Java?
Глянь название темы, Девелоперка.
Это C#.
Не знаю, какого черта ты натворил, но MineCraft написан на Java, и без компилятора этой платформы работать не может.
Написал свой майн на C#, йоптиль.
Уйди! Кыш! Умственно отсталых набежало! КЫШ! КЫШ! Бегом!
Я СКАЗАЛ БРЫСЬ!
И да, как я обожаю делать.
Фото поциента:
vEw5-HFdKtY.jpg


Чух-чух, копетан.
Реально его фото?
http://yadi.sk/d/PVqz0SFCLqyNx
 
причем тут майн?
При том что тема о лаунчере для майна. И писать для кроссплатформенной игры форточкозависемый лаунчер... Когда есть другие кроссплатформерные яп, например дельфин и c++.
 
Как этот код переделать под запуск 1.6.4 Forge?:rolleyes:
Код:
java -Dfml.ignoreInvalidMinecraftCertificates=true -Dfml.ignorePatchDiscrepancies=true -Xmx512m -Djava.library.path=versions\1.6.2\natives -cp libraries\net\minecraftforge\minecraftforge\9.10.0.776\minecraftforge-9.10.0.776.jar;libraries\net\minecraft\launchwrapper\1.3\launchwrapper-1.3.jar;libraries\org\scala-lang\scala-library\2.10.2\scala-library-2.10.2.jar;libraries\org\scala-lang\scala-compiler\2.10.2\scala-compiler-2.10.2.jar;libraries\org\ow2\asm\asm-all\4.1\asm-all-4.1.jar;libraries\net\sf\jopt-simple\jopt-simple\4.5\jopt-simple-4.5.jar;libraries\lzma\lzma\0.0.1\lzma-0.0.1.jar;libraries\net\sf\jopt-simple\jopt-simple\4.5\jopt-simple-4.5.jar;libraries\com\paulscode\codecjorbis\20101023\codecjorbis-20101023.jar;libraries\com\paulscode\codecwav\20101023\codecwav-20101023.jar;libraries\com\paulscode\libraryjavasound\20101123\libraryjavasound-20101123.jar;libraries\com\paulscode\librarylwjglopenal\20100824\librarylwjglopenal-20100824.jar;libraries\com\paulscode\soundsystem\20120107\soundsystem-20120107.jar;libraries\org\lwjgl\lwjgl\lwjgl\2.9.0\lwjgl-2.9.0.jar;libraries\org\lwjgl\lwjgl\lwjgl_util\2.9.0\lwjgl_util-2.9.0.jar;libraries\argo\argo\2.25_fixed\argo-2.25_fixed.jar;libraries\org\bouncycastle\bcprov-jdk15on\1.47\bcprov-jdk15on-1.47.jar;libraries\com\google\guava\guava\14.0\guava-14.0.jar;libraries\org\apache\commons\commons-lang3\3.1\commons-lang3-3.1.jar;libraries\commons-io\commons-io\2.4\commons-io-2.4.jar;libraries\net\java\jinput\jinput\2.0.5\jinput-2.0.5.jar;libraries\net\java\jutils\jutils\1.0.0\jutils-1.0.0.jar;libraries\com\google\code\gson\gson\2.2.2\gson-2.2.2.jar;versions\1.6.2\OptiFine.zip;versions\1.6.2\1.6.2.jar net.minecraft.launchwrapper.Launch --username zenit --session 123456789 --version Forge9.10.0.776 --gameDir minecraft --assetsDir assets --tweakClass cpw.mods.fml.common.launcher.FMLTweaker
 
1.6.4 Forge:
else if (match.Success)
{
string input = responseFromServer;
string[] split = input.Split(':');
string session = split[3];
string launch = @"%appdata%/.minecraft/libraries/net/minecraft/launchwrapper/1.8/launchwrapper-1.8.jar;%appdata%/.minecraft/libraries/org/scala-lang/scala-library/2.10.2/scala-library-2.10.2.jar;%appdata%/.minecraft/libraries/org/scala-lang/scala-compiler/2.10.2/scala-compiler-2.10.2.jar;%appdata%/.minecraft/libraries/org/ow2/asm/asm-all/4.1/asm-all-4.1.jar;%appdata%/.minecraft/libraries/net/sf/jopt-simple/jopt-simple/4.5/jopt-simple-4.5.jar;%appdata%/.minecraft/libraries/lzma/lzma/0.0.1/lzma-0.0.1.jar;%appdata%/.minecraft/libraries/net/sf/jopt-simple/jopt-simple/4.5/jopt-simple-4.5.jar;%appdata%/.minecraft/libraries/com/paulscode/codecjorbis/20101023/codecjorbis-20101023.jar;%appdata%/.minecraft/libraries/com/paulscode/codecwav/20101023/codecwav-20101023.jar;%appdata%/.minecraft/libraries/com/paulscode/libraryjavasound/20101123/libraryjavasound-20101123.jar;%appdata%/.minecraft/libraries/com/paulscode/librarylwjglopenal/20100824/librarylwjglopenal-20100824.jar;%appdata%/.minecraft/libraries/net/minecraftforge/minecraftforge/9.11.1.965/minecraftforge-9.11.1.965.jar;%appdata%/.minecraft/libraries/com/paulscode/soundsystem/20120107/soundsystem-20120107.jar;%appdata%/.minecraft/libraries/org/lwjgl/lwjgl/lwjgl/2.9.0/lwjgl-2.9.0.jar;%appdata%/.minecraft/libraries/org/lwjgl/lwjgl/lwjgl_util/2.9.0/lwjgl_util-2.9.0.jar;%appdata%/.minecraft/libraries/argo/argo/2.25_fixed/argo-2.25_fixed.jar;%appdata%/.minecraft/libraries/org/bouncycastle/bcprov-jdk15on/1.47/bcprov-jdk15on-1.47.jar;%appdata%/.minecraft/libraries/com/google/guava/guava/14.0/guava-14.0.jar;%appdata%/.minecraft/libraries/org/apache/commons/commons-lang3/3.1/commons-lang3-3.1.jar;%appdata%/.minecraft/libraries/commons-io/commons-io/2.4/commons-io-2.4.jar;%appdata%/.minecraft/libraries/net/java/jinput/jinput/2.0.5/jinput-2.0.5.jar;%appdata%/.minecraft/libraries/net/java/jutils/jutils/1.0.0/jutils-1.0.0.jar;%appdata%/.minecraft/libraries/com/google/code/gson/gson/2.2.2/gson-2.2.2.jar;%appdata%/.minecraft/libraries/net/minecraftforge/minecraftforge/9.11.1.965/minecraftforge-9.11.1.965.jar;%appdata%/.minecraft/libraries/net/minecraft/launchwrapper/1.8/launchwrapper-1.8.jar;%appdata%/.minecraft/versions/1.6.4-Forge9.11.1.965/1.6.4-Forge9.11.1.965.jar\";
System.Diagnostics.Process.Start("cmd", "/c start javaw -Xmx512m -Djava.library.path=\"%appdata%/.minecraft/versions/1.6.4-Forge9.11.1.965/natives/\" -cp " + launch + " net.minecraft.launchwrapper.Launch --username " + username + " --session " + session + " --version 1.6.4 --gameDir \"%appdata%/.minecraft/\" --assetsDir assets --tweakClass cpw.mods.fml.common.launcher.FMLTweaker");
this.Close();
reader.Close();
dataStream.Close();
response.Close();
Application.Exit();
}
 
1.6.4 Forge:
else if (match.Success)
{
string input = responseFromServer;
string[] split = input.Split(':');
string session = split[3];
string launch = @"%appdata%/.minecraft/libraries/net/minecraft/launchwrapper/1.8/launchwrapper-1.8.jar;%appdata%/.minecraft/libraries/org/scala-lang/scala-library/2.10.2/scala-library-2.10.2.jar;%appdata%/.minecraft/libraries/org/scala-lang/scala-compiler/2.10.2/scala-compiler-2.10.2.jar;%appdata%/.minecraft/libraries/org/ow2/asm/asm-all/4.1/asm-all-4.1.jar;%appdata%/.minecraft/libraries/net/sf/jopt-simple/jopt-simple/4.5/jopt-simple-4.5.jar;%appdata%/.minecraft/libraries/lzma/lzma/0.0.1/lzma-0.0.1.jar;%appdata%/.minecraft/libraries/net/sf/jopt-simple/jopt-simple/4.5/jopt-simple-4.5.jar;%appdata%/.minecraft/libraries/com/paulscode/codecjorbis/20101023/codecjorbis-20101023.jar;%appdata%/.minecraft/libraries/com/paulscode/codecwav/20101023/codecwav-20101023.jar;%appdata%/.minecraft/libraries/com/paulscode/libraryjavasound/20101123/libraryjavasound-20101123.jar;%appdata%/.minecraft/libraries/com/paulscode/librarylwjglopenal/20100824/librarylwjglopenal-20100824.jar;%appdata%/.minecraft/libraries/net/minecraftforge/minecraftforge/9.11.1.965/minecraftforge-9.11.1.965.jar;%appdata%/.minecraft/libraries/com/paulscode/soundsystem/20120107/soundsystem-20120107.jar;%appdata%/.minecraft/libraries/org/lwjgl/lwjgl/lwjgl/2.9.0/lwjgl-2.9.0.jar;%appdata%/.minecraft/libraries/org/lwjgl/lwjgl/lwjgl_util/2.9.0/lwjgl_util-2.9.0.jar;%appdata%/.minecraft/libraries/argo/argo/2.25_fixed/argo-2.25_fixed.jar;%appdata%/.minecraft/libraries/org/bouncycastle/bcprov-jdk15on/1.47/bcprov-jdk15on-1.47.jar;%appdata%/.minecraft/libraries/com/google/guava/guava/14.0/guava-14.0.jar;%appdata%/.minecraft/libraries/org/apache/commons/commons-lang3/3.1/commons-lang3-3.1.jar;%appdata%/.minecraft/libraries/commons-io/commons-io/2.4/commons-io-2.4.jar;%appdata%/.minecraft/libraries/net/java/jinput/jinput/2.0.5/jinput-2.0.5.jar;%appdata%/.minecraft/libraries/net/java/jutils/jutils/1.0.0/jutils-1.0.0.jar;%appdata%/.minecraft/libraries/com/google/code/gson/gson/2.2.2/gson-2.2.2.jar;%appdata%/.minecraft/libraries/net/minecraftforge/minecraftforge/9.11.1.965/minecraftforge-9.11.1.965.jar;%appdata%/.minecraft/libraries/net/minecraft/launchwrapper/1.8/launchwrapper-1.8.jar;%appdata%/.minecraft/versions/1.6.4-Forge9.11.1.965/1.6.4-Forge9.11.1.965.jar\";
System.Diagnostics.Process.Start("cmd", "/c start javaw -Xmx512m -Djava.library.path=\"%appdata%/.minecraft/versions/1.6.4-Forge9.11.1.965/natives/\" -cp " + launch + " net.minecraft.launchwrapper.Launch --username " + username + " --session " + session + " --version 1.6.4 --gameDir \"%appdata%/.minecraft/\" --assetsDir assets --tweakClass cpw.mods.fml.common.launcher.FMLTweaker");
this.Close();
reader.Close();
dataStream.Close();
response.Close();
Application.Exit();
}
Почему нельзя просто взять какой-нибудь Newtonsoft.JSON и распарсить json, лежащий рядом с файлом?
 
А если файл java (или javaw) был модифицирован, то фейковый файл java (или javaw) запустит клиент с читами отдав туда нужную сессию и никнейм
 
?
Вполне логичный вопрос. И актуальная проблема.
 
Вообщем, буду вас учить зарабатывать денюжки, или юзать СВОЙ лаунчер на Своём сервере)
А внизу будут сорцы лаунчера авторизацией и запуском :)


Топик я разобью по частям:
1. Авторизация
2. Запуск Minecraft
3. Остальное(Потом допишем :) )


Видео-уроки(Болело горло, извиняйте):

Начнём с 1 части...

1 ЧАСТЬ:
Код авторизации:
Код:
string username = Login.Text;
            string pattern = @"\d*:\w*:\w*:\w*";
            Regex regex = new Regex(pattern);
            WebRequest request = WebRequest.Create([COLOR=#ff0000]"http://clannr.org/scripts/login/auth.php"[/COLOR]);
            request.Method = "POST";
            string postData = [COLOR=#ff0000]"user=" + Login.Text + "&password=" + Password.Text + "&version=13"[/COLOR];
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = byteArray.Length;
            Stream dataStream = request.GetRequestStream();
            dataStream.Write(byteArray, 0, byteArray.Length);
            dataStream.Close();
            WebResponse response = request.GetResponse();
            Console.WriteLine(((HttpWebResponse)response).StatusDescription);
            dataStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(dataStream);
            string responseFromServer = reader.ReadToEnd();
            string s = sr.ReadToEnd();

P.S Я тут своё юзал, так что не обижайтесь, если что-то не подходит именно вам...

string username = Login.Text; - Login.Text - textBox называется Login
string pattern = @"\d*:\w*:\w*:\w*"; - Строка, проверка ответа с сервера, пока не нужна
2 строка(тут мне было лень копировать каждую строку) -
3 строка - регекс и тд - Тот же самый паттерн(использование)
4 строка - Создание запроса(Заканчивается аж на... 15 строчке(код до конца)

Теперь рассмотрим строчку WebRequest request =... :

Что туда писать? Ссылку на авторизацию...

Далее, строка string postData = "user="... :
Строка, отвечающая за аргументы запроса, т.е ник, пароль, версия лаунчера.

Далее, я думаю, разъяснять не нужно, потому что вы и так читать не любите :DD

Запрос авторизации готов! Что теперь? Теперь нужно проверить ответ с сервера!:
Код:
            if (responseFromServer.Contains(" Bad login"))
            {
                MessageBox.Show("Неправильный логин/пароль!");
            }
            else if (responseFromServer.Contains(" Old version"))
            {
                MessageBox.Show("Обновите лаунчер!(Скачайте новую версию с сайта clanNr.org)");
            }
Смотрим...

if - переводится как ЕСЛИ, т.е перевод скриптового языка: если ответ с сервера равен " Bad Login", то показывает окно с текстом, неправильный логин или пароль

else if - ИНАЧЕ ЕСЛИ, т.е перевод: Иначе если 1 ЕСЛИ не равняется, то проверка: ответ с сервера равен " Old Version" то выскакивает окошко.... ну дальше понятно...

Авторизация готова!

ЧАСТЬ 2
Запуск Minecraft после успешной авторизации с парсингом сессии


После авторизации, прямо сразу же пишем:
Код:
else if (match.Success)
{
string input = responseFromServer;
                        string[] split = input.Split(':');
                        string final = split[3];
                        ProcessStartInfo mcStartInfo = new ProcessStartInfo("javaw", "-Xms1G -Xmx1G -cp \"" + appData + "\\.ClanNR\\bin\\minecraft1.jar;" + appData + "\\.ClanNR\\bin\\jinput.jar;" + appData + "\\.ClanNR\\bin\\lwjgl.jar;" + appData + "\\.ClanNR\\bin\\lwjgl_util.jar \" -Djava.library.path=\"" + appData + "\\.ClanNR\\bin\\natives\" net.minecraft.client.Minecraft" + " " + username;
                        Process.Start(mcStartInfo);
                        this.Close();
                        reader.Close();
                        dataStream.Close();
                        response.Close();
}

Разбираем:
string[] split =... - проверка сессии, так же, как и 2 строка
ProcessStartInfo... - Аргументы запуска. Изменяйте как пожелаете
Process.Start... - Запуск Minecraft

Остальные строчки закрывают запрос (Не позволяют запрос оставаться даже после успешного входа)

Вход готов! Тестируйте!

Оказывается, тут нашёлся ещё 1 C#-дев, вот вам строка, ускоряющая процесс POST-запроса(Авторизации)(Спасибо Raptor2108):
Код:
request.Proxy = new WebProxy();



ДОПОЛНЯЖЖКИ:
Делаем показ скина:

1. Изменяем кнопку с текстом Старт! на "Вход!"
2. Добавляем точно такую же(копию) кнопку, и размещаем её точно так же, как и кнопка входа
3. Добавим свойства(в свойствах формы, т.е. в граф. редакторе):
Кнопка Старт! - Visible = False
Кнопка Вход! - Visible = True


Далее смотрим по видео, тут описывать долго и нудно :)
А где найти все эти файлы в майнкрафте 1,7,2-1,7,10?
 
Назад
Верх