• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!

1. Настройка и компиляция плагина / Configuring and compiling a plugin

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.271
Благодарности
4.573
Баллы
625

Русский English


  • Перед началом иметь:
    - Visual studio 2010 для компиляции проектов.
    - Любая свежая Visual studio под разработку.
    - Установленный шаблон-плагин из Менеджера ресурсов.



    Настройка плагина:
    73945
    В списке конфигураций проекта есть заготовки под конкретную версию движка, а также общая - кроссплатформенная.
    Например при выборе G2A Release плагин будет собираться исключительно для Gothic II: NoTR, а при Release - для всех сразу.
    Выбор конкретной платформы также полезен при промежуточных сборках. Это позволит значительно сократить время на компиляцию.

    Далее можно настроить выходной путь плагина прямо в директорию игры. Зажимаем Alt + F7, идем во вкладку 'Общие', в 'Выходном каталоге' указываем путь до вашей Gothic\System.
    Сразу проверяем параметр 'Набор инструментов платформы'. Если у Вас стоит Visual studio 2010, то сохраняем и закрываем окно. Иначе выбираем другую версию.



    Компиляция плагина:
    Для компиляции зажимаем F7 (Ctrl + Shift + B) или Сборка->Собрать решение.
    В Union.ini или в .ini мода прописываем имена запускаемых плагинов (через запятую):
    73947
    Финальный плагин можно запаковать в VDF том.



    Подключение отладчика:
    Для расставления точек останова и отлова исключений зажимаем Alt + F7, идем во вкладку 'Отладка'. В параметр 'Команда' прописываем: если плагин компилируется в директорию игры, то $(TargetDir)\Gothic.exe иначе полный путь до exe файла игры.
    Сохраняем и закрываем окно. Для компиляции и запуска отладчика нажимаем F5 или Отладка->Начать отладку.

  • You should have before the beginning:
    - Visual studio 2010 for compiling project (you need 2010 compiler)
    - Any Visual studio for development
    - An installed template plugin from Resource Manager



    Plugin settings:
    73945
    In configuration list there are templates for any engine version and a common one - crossplatform.
    For example, if you select 'G2A Release' plugin will be compiler only for Gothic II: NoTR, if 'Release' then for all engine version.
    Selecting a specific platform is also useful for intermediate builds. This will significantly reduce compilation time.

    Next, you can configure the plugin's output path directly to the game directory. Hold Alt + F7, go to the 'General' tab, in the 'Output directory' specify the path to your Gothic\ System.
    There immediately check the 'Platform Toolset' parameter. If you have Visual studio 2010, then save and close the window. Otherwise, select a different version.




    Compiling:
    For compiling press F7 (Ctrl + Shift + B) or Build->Build Solution.
    In Union.ini or in .ini of your mod insert the names of your plugins (use comma "," as a delimiter):
    73947
    You can archive your plugin into a VDF volume.



    Attaching the debugger:
    To set breakpoints and catch exceptions, hold Alt + F7, go to the 'Debug' tab. Write in the 'Command' parameter: if the plugin is compiled into the game directory, then $ (TargetDir)\Gothic.exe, otherwise the full path to the game's exe file.
    Save and close the window. To compile and run the debugger, press F5 or Debug-> Start Debugging.
 
Последнее редактирование модератором:

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.033
Благодарности
1.792
Баллы
240
А как сделать, чтобы при старте игры автоматически загружался сейв?
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.271
Благодарности
4.573
Баллы
625
А как сделать, чтобы при старте игры автоматически загружался сейв?
Ну вариантов полно. Самый короткий что пришел в голову.
74110

В свойствах ярлыка указываешь номер слота и передаешь его в загрузчик.
Прим.: Второй аргумент LoadSavegame определяет будут ли загружены значения глобальных переменный.
 

blood4ng3l

Участник форума
Регистрация
15 Июл 2019
Сообщения
4
Благодарности
1
Баллы
95
Hello everyone,

I want to try the development of a Plugin.

The union 1.0b is available as a template to build a new project, but in the project i have no general or other c++ specific options in the Properties window of the Project, which i normally have if i create for example a new blank c++ project.

So i was wondering where would be my mistake?
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.033
Благодарности
1.792
Баллы
240
blood4ng3l, try menu: Debug -> <Project Name> Properties...
 
Последнее редактирование:

blood4ng3l

Участник форума
Регистрация
15 Июл 2019
Сообщения
4
Благодарности
1
Баллы
95
It seems to be a bug in Visual Studio 2017 because it seems that the Project/Template was originally created in a different Language than I want to use it English/German.
Picture of my Properties, ...

"Bug" Report on Stackoverflow

Changing my OS or VS to russian (I guess) is not practical for me.
I will try to use vs2019.

Maybe Gratt could create a new Project/Template of Union with English as the Language of OS/VS. ;)

Edit: Changing VS2017 to 2019 does not change the issue. :(

Edit2: also changing the VS's Language to russian does not help: Changing VS2019 Language to Russian does not solve the issue

Edit3: had to rewrite the post since google translation somehow changed the whole post?!
 
Последнее редактирование:

neromont


Модостроитель
Регистрация
12 Мар 2011
Сообщения
674
Благодарности
655
Баллы
245
В качестве примера пойдет?

// Создаем объект
zCViewBase zcvb;

// Выводим на экран высоту zCView в виртуальных координатах
screen->PrintCXY(zcvb.ViewVirtualHeight);
 

OsmithREV

Участник форума
Регистрация
17 Мар 2016
Сообщения
117
Благодарности
183
Баллы
230
Не нашел тему с общими вопросами, поэтому наверное спрошу здесь. Можно ли как-то получить дамп исполняемых функций? Ну к примеру, нажимаю на "Новая игра", и мне выдает все исполняемые методы (или хотя бы их адреса). Например там, "CGameManager::GameSessionReset(); oCGame::SetupPlayers()" и т.п.? Объясню для чего нужно, просто если все таки нельзя - может поможете конкретно по этой ситуации. Есть следующий код:
C++:
void Game_Init() {
    gameMan->GameSessionReset();
    ogame->spawnman->SetSpawningEnabled(false);
    ogame->LoadGame(-2, "NEWWORLD\\NEWWORLD.ZEN");
    zCMusicSystem*& zmusic = *(zCMusicSystem * *)0x008D1F14;
    if (zmusic) {
        zmusic->Stop();
    }
    gameMan->playTime = 0;
}
По идее он должен запускать новую игру (и отключать спаун NPC, да), и все вроде бы хорошо, все запускается, но при открытии меню стартует музыка и недоступны сохранения (как будто персонаж мертв). Собственно это и хотел поправить получив список исполняемых функций при старте новой игры.
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
435
Благодарности
261
Баллы
230
OsmithREV, добавь в конец своего кода:
zCMenu::inGameMenu = TRUE;
Это разблокирует меню сохранения.

Или как вариант с доп. проверкой на возможность сохранения:
(добавить также в конец кода)
C++:
BOOL bSave;
// если разрешено сохраняться
if (gameMan->MenuEnabled(bSave))
    // даём эту возможность
    zCMenu::inGameMenu = TRUE;
// Примеч: После вызова функции MenuEnabled(), в переменной "bSave" будет частичное условие возможности сохранения, а сама функция возвращает результат проверки всех возможных аварийных ситуаций перед сохранением (1 - удача, 0 - неудача).
Думаю в твоём случае разница будет незаметна.

А что за проблема с музыкой? При использовании твоего тестового кода ничего не заметил.
 

OsmithREV

Участник форума
Регистрация
17 Мар 2016
Сообщения
117
Благодарности
183
Баллы
230
А что за проблема с музыкой? При использовании твоего тестового кода ничего не заметил.

Я имел ввиду то, что если запускать игру таким методом - персонаж как-будто не инициализируется должным образом. Когда в игре умираешь и открываешь меню, то стартует музыка другая (из меню которая) и становятся недоступны сохранения. Вот у меня такая же ситуация если запускаю игру таким образом, хотя персонаж жив. Вот и думал, что там есть какая-то доп. функция, которая условно "запускает сессию", или что-то такое.
 

OsmithREV

Участник форума
Регистрация
17 Мар 2016
Сообщения
117
Благодарности
183
Баллы
230
Можете, пожалуйста, объяснить как правильно перехватывать функции с соглашениями __cdecl и __fastcall? Пытался как-то разобраться сам через wiki + пробы, но не вышло. К примеру, хочу перехватить эти 2:
Код:
0x004FF070 void __fastcall vidMinimize(int)
0x00432EC0 void __cdecl HandleResultString(class zSTRING)
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.271
Благодарности
4.573
Баллы
625
OsmithREV,
Тут есть пример на каждый вид перехвата. Любой хук - шаблон, отличающийся только соглашением.

C++:
void __fastcall vidMinimize( int a0 );

  // 0x004FF070 void __fastcall vidMinimize(int)
  CInvoke<void( __fastcall* )( int )> Ivk_vidMinimize( 0x004FF070, &vidMinimize );

  void __fastcall vidMinimize( int a0 ) {
    // TO DO
    Ivk_vidMinimize( a0 );
  }



  void HandleResultString( zSTRING a0 );

  // 0x00432EC0 void __cdecl HandleResultString(class zSTRING)
  CInvoke<void( * )( zSTRING )> Ivk_HandleResultString( 0x00432EC0, &HandleResultString );

  void HandleResultString( zSTRING a0 ) {
    // TO DO
    Ivk_HandleResultString( a0 );
  }
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
435
Благодарности
261
Баллы
230
Когда в игре умираешь и открываешь меню, то стартует музыка другая (из меню которая) и становятся недоступны сохранения.
В общем, если интересно, то попробуй таким костыликом:
C++:
//0x004DB780 public: virtual void __thiscall zCMenu::Enter(void)
static void __fastcall Menu_Enter(zCMenu* _this);
static CInvoke <void(__thiscall*) (zCMenu*)> pMenu_Enter(0x004DB780, Menu_Enter, IVK_AUTO);
static void __fastcall Menu_Enter(zCMenu* _this)
{
    // если меню открывается в уже загруженном мире
    if (ogame && ogame->world)
        // то с этим флагом стартовый звук не проигрывается
        zCMenu::inGameMenu = TRUE;

    pMenu_Enter(_this);
}


//0x004DCDE0 protected: virtual void __thiscall zCMenu::ScreenInit(void)
static void __fastcall Menu_ScreenInit(zCMenu* _this);
static CInvoke <void(__thiscall*) (zCMenu*)> pMenu_ScreenInit(0x004DCDE0, Menu_ScreenInit, IVK_AUTO);
static void __fastcall Menu_ScreenInit(zCMenu* _this)
{
    // блокировка/разблокировка меню сохранения
    BOOL bSave;
    gameMan->MenuEnabled(bSave);

    // если разрешено сохраняться, есть указатель на игрока и он не мёртв
    if (bSave && player && player->attribute[NPC_ATR_HITPOINTS] != 0)
        // можно сохраняться
        zCMenu::inGameMenu = TRUE;
    else
        // иначе нельзя
        zCMenu::inGameMenu = FALSE;

    pMenu_ScreenInit(_this);
}


void Game_Init()
{
    // стартовый звук при загрузке (если нужен)
    /*if (zsound)
    {
        zCSoundFX* startSound = zsound->LoadSoundFXScript("GAMESTART");
        if (startSound)
        {
            // фиксирует проигрывание звука (не прерывается)
            startSound->SetIsFixed(TRUE);
            zsound->PlaySound(startSound, 0);
        }
    }*/

    gameMan->GameSessionReset();
    ogame->spawnman->SetSpawningEnabled(false);
    ogame->LoadGame(-2, "NEWWORLD\\NEWWORLD.ZEN");
    gameMan->playTime = 0;
}
 

zeratul47

Участник форума
Регистрация
10 Янв 2020
Сообщения
21
Благодарности
0
Баллы
60
Простите, но я не понял как запустить мод. Вот я его написал и собрал.
Появилась dll по пути D:\GothicModes\test\UnionPlugin_1_0f1\Bin\UnionPlugin_1_0f1.dll
Далее как я понял, я должен поправить .ini в D:\Steam\steamapps\common\Gothic\system\Union.ini
Там я прописываю
[PLUGINS]
PluginList = UnionPlugin_1_0f1

А дальше что? Разве я не должен куда-то скинуть эту дллку? И что именно я должен запустить?
Gothic.exe
GothicMod.exe
GothicStarter.exe
GothicStarter_mod.exe
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.271
Благодарности
4.573
Баллы
625
А дальше что? Разве я не должен куда-то скинуть эту дллку? И что именно я должен запустить?
В папку System ты должен положить DLL'ку или засунуть в VDF том.

И что именно я должен запустить?
Ровно то, что тебе надо. Единственное Gothic.exe у тебя вообще из какой-то не той оперы, если это первая готика конечно.
Если ты прописал в юнион ини, то чтение библиотеки произойдет при запуске GothicMod.exe, как опция по умолчанию.
А если мод со своим ini файлом, то, соответственно, вписываешь плагин туда, а запускаешь через GothicStarter.exe (или вариант для мододелов GothicStarter_mod.exe).
 

sam0delk1n

Участник форума
Регистрация
19 Апр 2020
Сообщения
24
Благодарности
1
Баллы
60
Всё установил по инструкции но шаблона проекта в студии не появилось.
  • Почему менеджер ресурсов установил исходники именно в AppData/Roaming/...?
  • Что делать если я хочу собирать из командной строки и явно прописывать пути к исходникам? Может менеджеру надо спрашивать куда их устанавливать?
  • Что делать если я хочу пользоваться gcc/MinGW?
Очень мало общей и вводной информации для начала работы со всем этим. Нужны не только пошаговые инструкции но и общая информация "что, для чего, зачем" чтобы можно было как-то ориентироваться или использовать какие-то свои альтернативы по необходимости.

Обычный стандартный hello world проект с каким-нибудь API предполагает что-то заинключить, что-то прилинковать, вызвать пару-тройку функций для теста и что-то увидеть на экране. Вот с этой тулзой так-же начинать можно?
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.271
Благодарности
4.573
Баллы
625
sam0delk1n, это очень хорошо что ты обращаешь внимание на такие вещи. Множество из того, что ты спросишь в дальнейшем, просто напросто является для меня слишком очевидным, из-за чего могу не заострить на этом внимания. И раз уж тебе есть что сказать, то пожалуй заочно создам тему по актуальным SDK Union SDK - инструменты разработчика
Далее можешь писать туда.

Всё установил по инструкции но шаблона проекта в студии не появилось.
На любую свежую студию шаблон ставится без проблем, появится он в documents/visual studio XXXX/templates обычным zip архивом.

Почему менеджер ресурсов установил исходники именно в AppData/Roaming/...?
Union использует ProgramData как единую и очевидную для всех продуктов папку. Например там будет лежать Union SDK, на которые ссылаются плагины.

Что делать если я хочу собирать из командной строки и явно прописывать пути к исходникам? Может менеджеру надо спрашивать куда их устанавливать?
Тут вопрос в том, что плагины настроены так, чтобы не приходилось их потом перенастраивать под себя или особенности системы. Говоря проще для максимального удобства пользователя.

то делать если я хочу пользоваться gcc/MinGW?
Не знаю, не пробовал
 

Cbrhex

Участник форума
Регистрация
5 Окт 2019
Сообщения
42
Благодарности
2
Баллы
100
А есть простой способ натравить npc на npc как в скриптах?
Daedalus:
Npc_SetTarget(...);
AI_StartState(..., ZS_Attack, ...);
 

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
549
Благодарности
142
Баллы
220
Попробовал скомпилить плагин (пока пустой), компилятор выдаёт такие ошибки:
1>------ Build started: Project: UnionPlugin1, Configuration: G1 Release Win32 ------
1>Project file contains ToolsVersion="14.0". This toolset may be unknown or missing, in which case you may be able to resolve this by installing the appropriate version of MSBuild, or the build may have been forced to a particular ToolsVersion for policy reasons. Treating the project as if it had ToolsVersion="4.0". For more information, please see http://go.microsoft.com/fwlink/?LinkId=291333.
1> Системе не удается найти указанный путь.
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(124,5): error MSB3073: The command "C:\ProgramData\Union\SDK\Union\v1.0h\Build\beforebuild.exe С:\vcp\UnionPlugin1\
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(124,5): error MSB3073: :VCEnd" exited with code 3.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Стоит Visual Studio 2012 (11). Компилить ею можно, или только 2010?
Ошибку с v1.0h в пути получилось решить копированием содержимого v1.0i в v1.0h, не знаю, насколько это правильно. В таком случае список ошибок становится таким:
1>Project file contains ToolsVersion="14.0". This toolset may be unknown or missing, in which case you may be able to resolve this by installing the appropriate version of MSBuild, or the build may have been forced to a particular ToolsVersion for policy reasons. Treating the project as if it had ToolsVersion="4.0". For more information, please see http://go.microsoft.com/fwlink/?LinkId=291333.
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(347,5): error : Required file "tracker.exe" is missing.

P.S. Проблему решил переустановкой студии.
 
Последнее редактирование:
Сверху Снизу