Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
  • Данный раздел создан исключительно для релизов! Вопросы по лаунчеру или обвязке задавайте ТОЛЬКО в соответсвующей теме автора. Любые другие темы будут удалены, а авторы понесут наказание.

Способ запуска клиента игры из Лаунчера Часть 2

Можно)
В Java это делается так:
Код:
System.setProperty("minecraft.applet.WrapperClass", "класс_Вашего_враппера");

В лаунчере у меня получилась такая конструкция:
Код:
jclass systemClass = env->FindClass("java/lang/System");
            jmethodID setPropertyMethod = env->GetStaticMethodID(systemClass, "setProperty","(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;");
            env->CallStaticObjectMethod(systemClass,setPropertyMethod,env->NewStringUTF("minecraft.applet.WrapperClass"),env->NewStringUTF("net.minecraft.tenaxy"));

кстати создание окна через swing мне не очень понравилось, я через awt реализовал, также как и сам майн работает.
Код:
  class_appletStub = env->FindClass("java/lang/System");
    mtid_appletStub = env->GetStaticMethodID(class_appletStub, "setProperty","(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;");
 
obj_hashMap = env->NewObject(env->FindClass("java/util/HashMap"), env->GetMethodID(env->FindClass("java/util/HashMap"), "<init>", "()V"));
mtid_put = env->GetMethodID(env->FindClass("java/util/HashMap"), "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
 
env->CallObjectMethod(obj_hashMap, mtid_put, env->NewStringUTF("username"), env->NewStringUTF("Player"));
env->CallObjectMethod(obj_hashMap, mtid_put, env->NewStringUTF("stand-alone"), env->NewStringUTF("false"));
env->CallObjectMethod(obj_hashMap, mtid_put, env->NewStringUTF("demo"), env->NewStringUTF("false"));
env->CallObjectMethod(obj_hashMap, mtid_put, env->NewStringUTF("fullscreen"), env->NewStringUTF("false"));
env->CallObjectMethod(obj_hashMap, mtid_put, env->NewStringUTF("sessionid"), env->NewStringUTF("-"));
env->CallObjectMethod(obj_hashMap, mtid_put, env->NewStringUTF("server"), env->NewStringUTF("127.0.0.1"));
env->CallObjectMethod(obj_hashMap, mtid_put, env->NewStringUTF("port"), env->NewStringUTF("25565"));
 
obj_appletStub = env->NewObject(class_appletStub, mtid_appletStub, obj_hashMap);
 
obj_minecraftApplet = env->NewObject(env->FindClass("net/minecraft/client/MinecraftApplet"), env->GetMethodID(env->FindClass("net/minecraft/client/MinecraftApplet"), "<init>", "()V"));

Вот что получается у меня. Только возникають проблемы из-за острой нехватки знаний:
obj_appletStub не создается по какому-то поводу. Не затруднит ли просветить, о светлейший, в чем тут ошибка?
 
Код:
  class_appletStub = env->FindClass("java/lang/System");
класс System не является потомком AppletStub, поэтому и не работает.

вот как у меня:
Код:
jclass class_appletStub = env->FindClass("net/minecraft/tenaxy");

я решил не указывать стандартный майновский AppletStub , так как у него в каждой версии разное название
 
вот как у меня:
Код:
jclass class_appletStub = env->FindClass("net/minecraft/tenaxy");

я решил не указывать стандартный майновский AppletStub , так как у него в каждой версии разное название

А что же за класс net/minecraft/tenaxy? Понимаю, что нечто самописное... Или все же заблуждаюсь?
Да и я стандартный майновский AppletStub вроде не указал.
 
Можно в параметрах вирт. машины просто прописать -Dminecraft.applet.class=[ваш класс]. Я вообще с этим не заморачиваюсь, и кидаю враппер под именем net.minecraft.Launcher, менять ничего не нужно...
 
Мои глаза... редко на руведре вижу столько кода в одном месте. Вобщем даже tldr
 
Описанный в данной теме метод годится только для С++, в c# и дельфи только через java машину строкой запуска.

Я знаю что здесь только для C++, поэтому я и спрашиваю, есть ли у кого переписанный на C# или Delphi.
 
Описанный в данной теме метод годится только для С++, в c# и дельфи только через java машину строкой запуска.
С чего это только C++?
Я знаю что здесь только для C++, поэтому я и спрашиваю, есть ли у кого переписанный на C# или Delphi.
Гуглите по запросам "JNI in Delphi" и "JNI in C#".
 
Кто знает, как в 1.6 получить апплет для запуска?
 
Здравствуйте, пытаюсь сделать по вашей инструкции, но по скольку у меня в клиенте установлен forge, то пытаюсь запустить майнкрафт через net.minecraft.client.Minecraft функцией main. По идее он должен запустится, однако у меня появляется окно загрузки forge, потом оно исчезает и в консоли пишется ошибка(См скрин):( Подскажите, что я делаю не так?
Вот код:
Код:
#include <tchar.h>
#include <stdio.h>
#include <jni.h>
#include <windows.h>
 
#define JAVA_HOME "G:\\Program Files (x86)\\Java\\jre7"
#define GAME_PATH "G:\\Users\\Вадим\\AppData\\Roaming\\Clasdek minecraft server"
 
typedef jint (JNICALL *JNI_CREATEJAVAVM)(JavaVM **, JNIEnv **, void *);
JNI_CREATEJAVAVM jni_JNI_CreateJavaVM = NULL;
 
int _tmain(int argc, _TCHAR* argv[])
{
HMODULE hJvm = ::LoadLibrary(_T(JAVA_HOME) _T("\\bin\\client\\jvm.dll"));
 
    jni_JNI_CreateJavaVM = (JNI_CREATEJAVAVM)GetProcAddress(hJvm, "JNI_CreateJavaVM"); //Получаем адреес функции в dll
 
 
    /*
        Для запуска клиента игры необходимо указать виртуальной машине java
        где находятся классы клиента и нативные библиотеки
    */
    JavaVMOption options[2];
    options[0].optionString = "-Djava.class.path=" GAME_PATH "\\bin\\lwjgl_util.jar;"
                                                  GAME_PATH "\\bin\\lwjgl.jar;"
                                                  GAME_PATH "\\bin\\jinput.jar;"
                                                  GAME_PATH "\\bin\\minecraft.jar;";
 
    options[1].optionString = "-Djava.library.path=" GAME_PATH "\\bin\\natives";
 
 
    //Формируем опции запуска виртуальной машины
    JavaVMInitArgs args;
    args.options = options;
    args.nOptions = 2; // Количество опций
    args.ignoreUnrecognized = FALSE;
    args.version = JNI_VERSION_1_6;
 
    //Вспомогательные классы, олицетворяющие виртуальную машину Java и среду выпонения
    JavaVM* jvm = NULL;
    JNIEnv* env = NULL;
 
    //Вызываем функцию JNI_CreateJavaVM из dll адрес которой получили ранее
    jni_JNI_CreateJavaVM(&jvm, &env, &args);
//Собственно пытаюсь запустить майн
    env->CallStaticVoidMethod(env->FindClass("net/minecraft/client/Minecraft"), env->GetStaticMethodID(env->FindClass("net/minecraft/client/Minecraft"), "main", "([Ljava/lang/String;)V"), env->NewStringUTF("user session"));
 
        Sleep(100000000);
    return 0;
}
Minecraft 1.5.2
Forge 5.2.23.738
img.png
 
Переопредели свойства:
Код:
system.setProperty("minecraft.applet.WrapperClass","net.minecraft.tenaxy");
system.setProperty("net.minecraft.Launcher","net.minecraft.tenaxy");

Вот тебе для примера кусок кода:
Код:
jclass systemClass = env->FindClass("java/lang/System");
jmethodID setPropertyMethod = env->GetStaticMethodID(systemClass, "setProperty","(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;");
env->CallStaticObjectMethod(systemClass,setPropertyMethod,env->NewStringUTF("minecraft.applet.WrapperClass"),env->NewStringUTF("net.minecraft.tenaxy"));
 
Спасибо за ответ, я как понимаю класс net.minecraft.tenaxy ваш, не могли бы его сюда выложить или что мне использовать?)
 
Спасибо за ответ, я как понимаю класс net.minecraft.tenaxy ваш, не могли бы его сюда выложить или что мне использовать?)

Класс мой, сделан на основе MinecraftFakeLauncher для того, чтобы все свои клиенты без проблем запускать. (MinecraftFakeLauncher в каждой версии называется по разному)
 
вызывает ошибку "ваша программа вызвала нарушение доступа ошибку сегментации" после #pragma endregion. Что подскажете?
Скорее всего из за jni_JNI_CreateJavaVM(&jvm, &env, &args); (44 строка) но кроме того что пытается выйти за 2, больше мыслей не возникает.
 
@Racvol, есть пара вопросов:
Если ли какие-то способы подменить сессию в момент изменения переменной в машине Java? (Я не говорю о редактировании переменной уже после передачи сессии лаунчером)
Есть ли какие-то особенности запуска версий MC старше 1.5.2?
 

Поделиться этой страницей

Назад
Верх