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

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

Тема в разделе "Веб-обвязки и лаунчеры", создана пользователем Racvol, 22 дек 2012.

  1. xProf

    xProf Активный участник

    Баллы:
    63
    Имя в Minecraft:
    xProf
    Код:
      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 не создается по какому-то поводу. Не затруднит ли просветить, о светлейший, в чем тут ошибка?
     
  2. Хостинг MineCraft
    <
  3. shamahn

    shamahn Активный участник Пользователь

    Баллы:
    78
    Имя в Minecraft:
    shamahn
    класс System не является потомком AppletStub, поэтому и не работает.

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


    я решил не указывать стандартный майновский AppletStub , так как у него в каждой версии разное название
     
    I-Am-Black-Overlord нравится это.
  4. xProf

    xProf Активный участник

    Баллы:
    63
    Имя в Minecraft:
    xProf
    А что же за класс net/minecraft/tenaxy? Понимаю, что нечто самописное... Или все же заблуждаюсь?
    Да и я стандартный майновский AppletStub вроде не указал.
     
  5. ksada

    ksada Старожил

    Баллы:
    103
    Skype:
    k-s-a-d-a
    Можно в параметрах вирт. машины просто прописать -Dminecraft.applet.class=[ваш класс]. Я вообще с этим не заморачиваюсь, и кидаю враппер под именем net.minecraft.Launcher, менять ничего не нужно...
     
  6. shamahn

    shamahn Активный участник Пользователь

    Баллы:
    78
    Имя в Minecraft:
    shamahn
    Ты вообще апплетстаб никакой не указал

    Я брал MinecraftFakeLauncher за основу и вносил свои поправки
     
  7. aLLeXUs

    aLLeXUs Активный участник Пользователь

    Баллы:
    78
    Skype:
    mr.allexus
    А есть у кого на C# или Delphi?
     
  8. Raptor2108

    Raptor2108 Старожил Пользователь

    Баллы:
    173
    Skype:
    Raptor210818
    Имя в Minecraft:
    Raptor2108
    что C# или дельфи?
     
  9. aLLeXUs

    aLLeXUs Активный участник Пользователь

    Баллы:
    78
    Skype:
    mr.allexus
    Реализация подключения к серверу на C# или Delphi
     
  10. Raptor2108

    Raptor2108 Старожил Пользователь

    Баллы:
    173
    Skype:
    Raptor210818
    Имя в Minecraft:
    Raptor2108
    Описанный в данной теме метод годится только для С++, в c# и дельфи только через java машину строкой запуска.
     
  11. Pyani

    Pyani Активный участник Пользователь

    Баллы:
    88
    Мои глаза... редко на руведре вижу столько кода в одном месте. Вобщем даже tldr
     
  12. aLLeXUs

    aLLeXUs Активный участник Пользователь

    Баллы:
    78
    Skype:
    mr.allexus
    Я знаю что здесь только для C++, поэтому я и спрашиваю, есть ли у кого переписанный на C# или Delphi.
     
  13. foxquiz

    foxquiz Активный участник Пользователь

    Баллы:
    78
    С чего это только C++?
    Гуглите по запросам "JNI in Delphi" и "JNI in C#".
     
    Russiablackbird нравится это.
  14. Raptor2108

    Raptor2108 Старожил Пользователь

    Баллы:
    173
    Skype:
    Raptor210818
    Имя в Minecraft:
    Raptor2108
    я же сказал НЕТ
     
  15. Tsukasa

    Tsukasa Активный участник

    Баллы:
    63
    Имя в Minecraft:
    mauchan
    Кто знает, как в 1.6 получить апплет для запуска?
     
  16. vadim121

    vadim121 Активный участник

    Баллы:
    63
    Здравствуйте, пытаюсь сделать по вашей инструкции, но по скольку у меня в клиенте установлен 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
     
  17. shamahn

    shamahn Активный участник Пользователь

    Баллы:
    78
    Имя в Minecraft:
    shamahn
    Переопредели свойства:
    Код:
    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"));
     
    vadim121 нравится это.
  18. vadim121

    vadim121 Активный участник

    Баллы:
    63
    Спасибо за ответ, я как понимаю класс net.minecraft.tenaxy ваш, не могли бы его сюда выложить или что мне использовать?)
     
    Сникерсни нравится это.
  19. shamahn

    shamahn Активный участник Пользователь

    Баллы:
    78
    Имя в Minecraft:
    shamahn
    Класс мой, сделан на основе MinecraftFakeLauncher для того, чтобы все свои клиенты без проблем запускать. (MinecraftFakeLauncher в каждой версии называется по разному)
     
  20. dzikar

    dzikar Активный участник Пользователь

    Баллы:
    88
    Skype:
    kabala1790
    Имя в Minecraft:
    dzikar
    вызывает ошибку "ваша программа вызвала нарушение доступа ошибку сегментации" после #pragma endregion. Что подскажете?
    Скорее всего из за jni_JNI_CreateJavaVM(&jvm, &env, &args); (44 строка) но кроме того что пытается выйти за 2, больше мыслей не возникает.
     
  21. Sirse

    Sirse Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    Sirse
    @Racvol, есть пара вопросов:
    Если ли какие-то способы подменить сессию в момент изменения переменной в машине Java? (Я не говорю о редактировании переменной уже после передачи сессии лаунчером)
    Есть ли какие-то особенности запуска версий MC старше 1.5.2?
     

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