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

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

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

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.636
Баллы
625
  • Первое сообщение
  • #1

Русский 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.
 
Последнее редактирование модератором:

Gratt


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

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.860
Благодарности
6.740
Баллы
1.625

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.081
Благодарности
1.901
Баллы
320
В файле функция Wld_IsTime - пустая. А на деле принимает 4 параметра для своей работы...
Этот файл Сатурас выложил.
Wld_IsTime для результата использует выражение ogame -> GetWorldTimer() -> IsTimeBetween(hour1,min1,hour2,min2)
 

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
555
Благодарности
142
Баллы
220
Здравствуйте. Сейчас у плагина присутствуют такие опции компиляции:
G2A Debug
G2A MD Release
G2A MT Release

Что за MD/MT, какой выбирать?
 

Chode McBlob

Участник форума
Регистрация
13 Ноя 2024
Сообщения
8
Благодарности
0
Баллы
5
Подскажите как загрузить текстуру?
файл находится по пути:
_WORK\DATA\TEXTURES\SCANNER_TX.tga

C++:
        scanner = new zCView();
        screen->InsertItem(scanner);
        zSTRING txtName = zSTRING("_WORK\\DATA\\TEXTURES\\SCANNER_TX.tga");
        if (zCTexture* tex = tex->Load(txtName, true)) {
            scanner->InsertBack(tex);
            tex->Release();
        }
        scanner->SetPos(0, 0);
        scanner->SetSize(500, 500);
если, без текстуры, то все ок, с текстурой игра вылетает
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
449
Благодарности
266
Баллы
230
Chode McBlob, стоп-стоп-стоп. Много лишних действий.
Попробуйте так:
C++:
zCView* scanner = new zCView(0, 0, 500, 500);

// вставляем текстуру на задний план,
// причём происходит автоматич. поиск текстуры в ресурсах игры
// (можно использовать "SCANNER_TX.tga", тут без разницы)
scanner->InsertBack("SCANNER_TX");

// вкл. поддержку функции альфа-смешивания
scanner->alphafunc = zTRnd_AlphaBlendFunc::zRND_ALPHA_FUNC_BLEND;

// вставляем во вьюпорт
screen->InsertItem(scanner);

И, всегда, перед обращением по указателю, проверяй его (если есть шанс что он может быть равен нулю или null) !
Например так:
Код:
if (tex)
{
   tex->Release();
}
Иначе получаешь вылет.

Здесь конечно тоже можно проверить объект "scanner" на null-условие, перед обращением по указателю, но в большинстве случаев память для нового объекта выделяется успешно и проверка не требуется. Ну уж если нужна железобетонная защита указателя, то можешь поставить.
 
Последнее редактирование:

Chode McBlob

Участник форума
Регистрация
13 Ноя 2024
Сообщения
8
Благодарности
0
Баллы
5
Chode McBlob, стоп-стоп-стоп. Много лишних действий.
Попробуйте так:
C++:
zCView* scanner = new zCView(0, 0, 500, 500);

// вставляем текстуру на задний план,
// причём происходит автоматич. поиск текстуры в ресурсах игры
// (можно использовать "SCANNER_TX.tga", тут без разницы)
scanner->InsertBack("SCANNER_TX");

// вкл. поддержку функции альфа-смешивания
scanner->alphafunc = zTRnd_AlphaBlendFunc::zRND_ALPHA_FUNC_BLEND;

// вставляем во вьюпорт
screen->InsertItem(scanner);

И, всегда, перед обращением по указателю, проверяй его (если есть шанс что он может быть равен нулю или null) !
Например так:
Код:
if (tex)
{
   tex->Release();
}
Иначе получаешь вылет.

Здесь конечно тоже можно проверить объект "scanner" на null-условие, перед обращением по указателю, но в большинстве случаев память для нового объекта выделяется успешно и проверка не требуется. Ну уж если нужна железобетонная защита указателя, то можешь поставить.

Спасибо за ответ. Не помогло...
Подумал, может с файлом что не так, поменял, все равно вылет
Вылетает в рендере.

сейчас так:
C++:
            scanner = new zCView(0, 0, 500, 500);
            scanner->InsertBack("EARTH");
            scanner->alphafunc = zTRnd_AlphaBlendFunc::zRND_ALPHA_FUNC_BLEND;
            screen->InsertItem(scanner);

Ошибка:

access_violation.png


Я так понимаю текстура просто не загрузилась:

tex_null.png
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
449
Благодарности
266
Баллы
230
Я так понимаю текстура просто не загрузилась:
Дело не в текстуре. Если ты указываешь несуществующую текстуру, например "123.tga", то получишь примерно такой результат, как в левом верхнем углу:
TestView123.jpg

Также выглядит "default.tga".
Если в качестве текстуры указываешь пустую строку "", то вью-слой будет просто прозрачным.

Приведи полный код, а не часть.
И возможно даже проблема не там, где ты ищешь, а в другом месте. И это место нужно найти по наводкам.
Судя по "zFILE_FILE::Write()", ты что-то пытаешься сохранить на диск?
Ещё в отчёте говорится о записи по адресу 24h. Так что, скорей всего, ты где то пытаешься работать с нулевым указателем!
Как найти?
Отключаешь по очереди все функции с помощью комментариев:
C++:
/*
   код функции
*/
или
C++:
#if 0
   код функции
#endif
И смотришь в какой момент всё работает, а в какой приводит к вылету.
Затем скидываешь функцию сюда, там посмотрим. Или, если хочешь сам разобраться, то дальше разбивай функцию по кускам с помощью "cmd-сообщений" или "Say::Box()-сообщениям". С помощью них ты можешь определить где функция ещё работает, а где приводит к вылету.

Для теста можешь ещё попробовать этот код:
C++:
void Insert_RedRectangle_OnScreen()
{
    zCView* pView = new zCView(0, 0, 2000, 2000);
    if (!pView || !screen)
    {
        Say::Box("Some ptr's is null!");
        return;
    }

    pView->InsertBack("RED");
    pView->alphafunc = zTRnd_AlphaBlendFunc::zRND_ALPHA_FUNC_BLEND;
    screen->InsertItem(pView);
}

// После инициализации главного меню
void Game_Init()
{
    Insert_RedRectangle_OnScreen();
}
Если увидишь красный прямоугольник в левом верхнем углу, в главном меню, значит текстура загрузилась.
Потом попробуй какую-нибудь другую.
 
Последнее редактирование:

Chode McBlob

Участник форума
Регистрация
13 Ноя 2024
Сообщения
8
Благодарности
0
Баллы
5
Дело не в текстуре. Если ты указываешь несуществующую текстуру, например "123.tga", то получишь примерно такой результат, как в левом верхнем углу:
Посмотреть вложение 127130
Также выглядит "default.tga".
Если в качестве текстуры указываешь пустую строку "", то вью-слой будет просто прозрачным.

Приведи полный код, а не часть.
И возможно даже проблема не там, где ты ищешь, а в другом месте. И это место нужно найти по наводкам.
Судя по "zFILE_FILE::Write()", ты что-то пытаешься сохранить на диск?
Ещё в отчёте говорится о записи по адресу 24h. Так что, скорей всего, ты где то пытаешься работать с нулевым указателем!
Как найти?
Отключаешь по очереди все функции с помощью комментариев:
C++:
/*
   код функции
*/
или
C++:
#if 0
   код функции
#endif
И смотришь в какой момент всё работает, а в какой приводит к вылету.
Затем скидываешь функцию сюда, там посмотрим. Или, если хочешь сам разобраться, то дальше разбивай функцию по кускам с помощью "cmd-сообщений" или "Say::Box()-сообщениям". С помощью них ты можешь определить где функция ещё работает, а где приводит к вылету.

Для теста можешь ещё попробовать этот код:
C++:
void Insert_RedRectangle_OnScreen()
{
    zCView* pView = new zCView(0, 0, 2000, 2000);
    if (!pView || !screen)
    {
        Say::Box("Some ptr's is null!");
        return;
    }

    pView->InsertBack("RED");
    pView->alphafunc = zTRnd_AlphaBlendFunc::zRND_ALPHA_FUNC_BLEND;
    screen->InsertItem(pView);
}

// После инициализации главного меню
void Game_Init()
{
    Insert_RedRectangle_OnScreen();
}
Если увидишь красный прямоугольник в левом верхнем углу, в главном меню, значит текстура загрузилась.
Потом попробуй какую-нибудь другую.

Вот "Red" как раз и показывается, дефолтная тоже показывается. А файл - нет, крэш.

Вот проект, там собственно неичего нет, кроме этого кода:

Test.zip

Файл:

earth.tga

Находится здесь:
Screenshot 2024-11-15 194502.png


Может какие-то манипуляции нало еще сделать? Он должен появляться в _compiled?
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
449
Благодарности
266
Баллы
230
Он должен появляться в _compiled?
У меня твоя текстура отображается и скомпил. вариант появляется. Так что дело не в ней.
Earth_test.jpg

Я, к сожалению, не работал с альтернативным вариантом Union API, поэтому протестировать твой код не смогу.
Но мне не нравится переменная:
C++:
static bool ready{false};
Я такой синтаксис не понимаю и компилятор студии тоже. Скорей всего дело в ней.
И если ты хочешь вывести вью-слой на экран единожды, то попробуй так:
C++:
void Game_Loop()
{
    static bool ready = false;

    if (player && ready == false)
    {
        zCView* pView = new zCView(0, 0, 2000, 2000);
        if (!pView || !screen)
        {
            Say::Box("Some ptr's is null!");
            return;
        }

        pView->InsertBack("earth");
        pView->alphafunc = zTRnd_AlphaBlendFunc::zRND_ALPHA_FUNC_BLEND;
        screen->InsertItem(pView);

        // запрещаем повторный вызов блока
        ready = true; 
    }
}
 

Chode McBlob

Участник форума
Регистрация
13 Ноя 2024
Сообщения
8
Благодарности
0
Баллы
5
У меня твоя текстура отображается и скомпил. вариант появляется. Так что дело не в ней.
Посмотреть вложение 127133
Я, к сожалению, не работал с альтернативным вариантом Union API, поэтому протестировать твой код не смогу.
Но мне не нравится переменная:
C++:
static bool ready{false};
Я такой синтаксис не понимаю и компилятор студии тоже. Скорей всего дело в ней.
И если ты хочешь вывести вью-слой на экран единожды, то попробуй так:
C++:
void Game_Loop()
{
    static bool ready = false;

    if (player && ready == false)
    {
        zCView* pView = new zCView(0, 0, 2000, 2000);
        if (!pView || !screen)
        {
            Say::Box("Some ptr's is null!");
            return;
        }

        pView->InsertBack("earth");
        pView->alphafunc = zTRnd_AlphaBlendFunc::zRND_ALPHA_FUNC_BLEND;
        screen->InsertItem(pView);

        // запрещаем повторный вызов блока
        ready = true;
    }
}

2022 студия понимает (c++20), надо просто открыть папку, она все сгенерирует что надо.
Все равно не работает, такое впечатление, что API не находит это текстуру.
Есть какие-нибудь методы получить имена всех доступных текстур? API, вроде, практически полностью повторяет SDK
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
449
Благодарности
266
Баллы
230
1. А попробуй скопировать компил. вариант текстуры в папку:
"Gothic2\_work\Data\Textures\_Compiled\"
и проверь, загрузится ли текстура.
Возможно проблема в компиляции файла текстуры движком.

2. Ещё могу предложить тебе тестовый плагин на 2010 студии. Посмотришь как другие АПИ отработают. Если будет похожий вылет, значит проблема в каких-то правах доступа к файловой системе. Не знаю, может антивирус блокирует создание новых файлов, хз.
Плагин мультиплатформенный, разместить здесь:
"Gothic2\System\Autorun\TGA_Test.dll"
Только перед тестом не забудь отключить тот плагин, который выдаёт ошибку и удалить скомпилир. вариант текстуры.
Результат увидишь сразу же, в главном меню.

3. Ну и может ещё кто-то подтянется, да что-то подскажет, вдруг у кого-то уже такое было.
 

Вложения

  • EARTH-C.ZIP
    90,3 KB · Просмотры: 2
  • TGA_Test.zip
    132,7 KB · Просмотры: 2
Последнее редактирование:

Chode McBlob

Участник форума
Регистрация
13 Ноя 2024
Сообщения
8
Благодарности
0
Баллы
5
1. А попробуй скопировать компил. вариант текстуры в папку:
"Gothic2\_work\Data\Textures\_Compiled\"
и проверь, загрузится ли текстура.
Возможно проблема в компиляции файла текстуры движком.

2. Ещё могу предложить тебе тестовый плагин на 2010 студии. Посмотришь как другие АПИ отработают. Если будет похожий вылет, значит проблема в каких-то правах доступа к файловой системе. Не знаю, может антивирус блокирует создание новых файлов, хз.
Плагин мультиплатформенный, разместить здесь:
"Gothic2\System\Autorun\TGA_Test.dll"
Только перед тестом не забудь отключить тот плагин, который выдаёт ошибку и удалить скомпилир. вариант текстуры.
Результат увидишь сразу же, в главном меню.

3. Ну и может ещё кто-то подтянется, да что-то подскажет, вдруг у кого-то уже такое было.

С твоим плагином тоже крэш... :D
*facepalm*
 

Chode McBlob

Участник форума
Регистрация
13 Ноя 2024
Сообщения
8
Благодарности
0
Баллы
5
Jr13San

В общем, запихнул все в vdf, закинул в плагины и все заработало.
Вопрос: Чем ты tga в tex компилируешь? У меня кривые какие-то получаются текстуры
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
6.123
Благодарности
5.618
Баллы
910

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
449
Благодарности
266
Баллы
230
Чем ты tga в tex компилируешь?
Компилирую движком, на этапе загрузки текстуры во вью-объект(функция "InsertBack"), без галочки.
В общем, запихнул все в vdf, закинул в плагины и все заработало.
Ну т.е. получается, что если подсунуть движку готовую скомпиленную текстуру, то она выводится у тебя на экран.
А если в наличии только tga-текстура, то он не может скомпилить в .tex и происходит вылет. Так?

Последнее, что можно сравнить - это свойства доступа пользователя к папке:
"Gothic2\_work\Data\Textures\_Compiled"
Compiled_props.jpg

Может быть у тебя, как у пользователя, не полный доступ к папке, поэтому и ошибка сохранения файлов?
(личные данные можешь замазать)

На крайняк попробуй выставить запуск Gothic2.exe от имени администратора.
Всё, у меня больше никаких идей.
 

Chode McBlob

Участник форума
Регистрация
13 Ноя 2024
Сообщения
8
Благодарности
0
Баллы
5
Компилирую движком, на этапе загрузки текстуры во вью-объект(функция "InsertBack"), без галочки.

Ну т.е. получается, что если подсунуть движку готовую скомпиленную текстуру, то она выводится у тебя на экран.
А если в наличии только tga-текстура, то он не может скомпилить в .tex и происходит вылет. Так?

Последнее, что можно сравнить - это свойства доступа пользователя к папке:
"Gothic2\_work\Data\Textures\_Compiled"
Посмотреть вложение 127166
Может быть у тебя, как у пользователя, не полный доступ к папке, поэтому и ошибка сохранения файлов?
(личные данные можешь замазать)

На крайняк попробуй выставить запуск Gothic2.exe от имени администратора.
Всё, у меня больше никаких идей.

Хоть компилированный Gothic2\_work\Data\Textures\_Compiled, хоть в Gothic2\_work\Data\Textures не компилированный -
не работает ни там, ни там
Работает только если упаковать в vdf.
От админа запускался - пофиг
Ну хоть так, неудобно конечно каждый раз паковать, но дебажить можно, жить можно
 
Сверху Снизу