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

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  2. Форум аддона "Возвращение" 2.0:
    — Обсудить игру, почитать о прохождениях и/или разрешить свои вопросы по игре вы можете в одной из тем одноименного форума. Посетить...
    — Прочитать историю изменения и/или скачать последнюю версию аддона "Возвращение", вы можете на страницах наших ресурсов. Скачать...

AST SDK - Помощь по работе

Тема в разделе "Уpоки AST", создана пользователем Gratt, 12 сен 2016.

  1. Gratt

    Gratt
    Модостроитель

    Регистрация:
    14 ноя 2014
    Сообщения:
    609
    Благодарности:
    683
    Баллы:
    135
    Пол:
    Мужской
    В комплекте с AST идет API, который необходимо поместить в папку с исходниками плагина.

    Прежде всего, с гордостью заявляю, что это более чем полноценный SDK не только для AST, но и на игру Gothic в целом. Возможности пакета позволяют гибко и комфортно работать с движком, изменяя, добавляя или дополняя его стандартный функционал.

    Что необходимо знать о C/C++ для работы с SDK:

    0. Рекомендуется использовать Visual Studio 2012. бегло пробежаться по синтаксису С/С++ и заострить внимание на вещах, представленных ниже.

    1. Работа начинается с подключения заголовочных файлов. Необходимо понимать что они из себя представляют и как работают, поскольку их будет катастрофически много. Об этом можно спокойно почитать в интернете, однако кратко опишу некоторые грабли новичков:
    Открыть спойлер

    Первое, на что я обращаю внимание, в заголовочных файлах рекомендуется использовать только статические данные (static, const, extern), либо их прототипы (объявление без кода реализации). В противном случае, если производить вызов заголовочника из разных файлов исходного кода (.cpp), выскочит ошибка о переопределении данных.

    Обязательно проверяйте иерархию вызовов заголовков. В этом может помочь универсальный заголовок со вложенными в него другими, с заранее определенным порядком подключения.


    2. Далее следует понять что такое указатели. об этом тоже можно почитаете в интернете. для справки поясню:
    Открыть спойлер

    Указатель - это ссылка на объект в памяти. наглядно показываю задачкой как оно работает:
    int A; // Переменная типа int
    int* B = &A; // Указатель на переменную типа int
    int** C = &B; // Указатель на указатель на переменную типа int
    A = 10; // присваиваем A значение 10
    // Рассмотрим результаты вывода задачи

    Print(A); // Результат = 10
    Print(*B); // Результат = 10
    Print(**C); // Результат = 10
    Print(&A); // Результат = адрес расположения элемента A
    Print(B); // Результат = адрес расположения элемента A
    Print(*C); // Результат = адрес расположения элемента A
    Print(&B); // Результат = адрес расположения указателя B
    Print(C); // Результат = адрес расположения указателя B
    Print(&C); // Результат = адрес расположения указателя C
    A, к примеру, имеет адрес 0x00000700. (& (амперсанд) получает адрес объекта в памяти)
    B ссылается на адрес 0x00000700, в котором находится объект A.
    соответственно, C ссылается на адрес B, по которому лежит адрес A.


    3. Классы. все построено на классах и структурах. частично скриптеры с ними уже знакомы, так что особых проблем тут не возникнет.
    Открыть спойлер

    основные понятия, которые следует изучить для написания своих нормальных классов:
    1. конструкторы и деструкторы.
    2. уровни доступности: public, private, protected...
    3. статический метод(функция)/свойство(переменная)
    4. виртуальный метод. отличие от обычного. абстрактный класс. (по желанию)
    5. соответственно почитать о наследовании (по желанию)

    4. От себя советую изучить макросы #define. очень простая и удобная штука

    В остальном многие понятия вам уже знакомы, если приходилось копаться в скриптах (дедал по синтаксису нечто между Паскалем и Си)

    -------

    Определить путь выходного файла можно заранее определить в системную папку игры, пройдя в меню Проект->Свойства->Общие->Выходной каталог & Наименование. (хоткей компиляции F7 на 2012 студии)

    -------

    Плагины уже имеют все необходимые настройки и основные функции событий (Покадровый цикл, второстепенный поток, инициализация плагина...), найти их можно в фильтре Source
     

    Вложения:

    • Undecorated.txt
      Размер файла:
      1,2 МБ
      Просмотров:
      27
    Последнее редактирование: 29 сен 2016
    Поблагодарили gggg12345678!, Дикарь, Banderas1989 и 3 других пользователя.
  2. Jr13San

    Jr13San Участник форума

    Регистрация:
    1 апр 2010
    Сообщения:
    435
    Благодарности:
    85
    Баллы:
    190
    Пол:
    Мужской
    Saturas, сам попробуй на вашем плагине написать простой хук на эту функцию и получить из репорта "m_pCollObj1" и далее "m_pVob", если получится.
     
  3. Saturas

    Saturas
    Модостроитель

    Регистрация:
    11 фев 2009
    Сообщения:
    1.816
    Благодарности:
    535
    Баллы:
    275
    Пол:
    Женский
    void __fastcall StartHitSND(void* _this,void*,zCVob *vobSndSource, int med1, int med2, int med1Type, int med2Type, const zCCollisionReport* collisionReport)
    {
    if(collisionReport->m_pCollObj1)
    if(collisionReport->m_pCollObj1->m_pVob)
    MessageBox(0,collisionReport->m_pCollObj1->m_pVob->m_sNameObj,0,0);
    if(collisionReport->m_pCollObj1)
    if(collisionReport->m_pCollObj1->m_pVob)
    MessageBox(0,collisionReport->m_pCollObj2->m_pVob->m_sNameObj,0,0);
    pStartHitSND(_this,vobSndSource,med1,med2,med1Type,med2Type,collisionReport);
    };
    все прекрасно отрабатывает.
     
  4. Jr13San

    Jr13San Участник форума

    Регистрация:
    1 апр 2010
    Сообщения:
    435
    Благодарности:
    85
    Баллы:
    190
    Пол:
    Мужской
    А почему у тебя "void* _this"?, если должно быть "zCSoundManager* _this". Типа неопределённый тип?
     
    Последнее редактирование: 7 янв 2017
  5. Gratt

    Gratt
    Модостроитель

    Регистрация:
    14 ноя 2014
    Сообщения:
    609
    Благодарности:
    683
    Баллы:
    135
    Пол:
    Мужской
    какая разница? это обычный указатель
     
  6. Jr13San

    Jr13San Участник форума

    Регистрация:
    1 апр 2010
    Сообщения:
    435
    Благодарности:
    85
    Баллы:
    190
    Пол:
    Мужской
    При вызове функции "Draw()" у любого объекта класса "zCOBBox3D" происходит вылет без какой-либо информации об ошибке. В чём может быть дело?
     
  7. Saturas

    Saturas
    Модостроитель

    Регистрация:
    11 фев 2009
    Сообщения:
    1.816
    Благодарности:
    535
    Баллы:
    275
    Пол:
    Женский
    убери __fastcall я случайно его туда поставил походу, там его нет на самом деле.
     
  8. Jr13San

    Jr13San Участник форума

    Регистрация:
    1 апр 2010
    Сообщения:
    435
    Благодарности:
    85
    Баллы:
    190
    Пол:
    Мужской
    Убрал, вылетает по прежнему.
     
  9. Saturas

    Saturas
    Модостроитель

    Регистрация:
    11 фев 2009
    Сообщения:
    1.816
    Благодарности:
    535
    Баллы:
    275
    Пол:
    Женский
    А как вызываешь?
     
  10. kwenlY

    kwenlY Участник форума

    Регистрация:
    27 дек 2016
    Сообщения:
    9
    Благодарности:
    0
    Баллы:
    10
    Пол:
    Мужской
    Решил начать модостроительство Gothic так что я еще новичок. Может это и тупой вопрос, но что мне делать с ошибкой:
    WorldInit в export.def вписан

    Решение:
    Открыть спойлер
    Удалить строку WorldInit, или добавить в скрип функцию
    Пример функции (открыть)
    Код:
    void WorldInit() { // тут код пишем свой код или оставляем пустым. }

     
    Последнее редактирование: 14 янв 2017
  11. Jr13San

    Jr13San Участник форума

    Регистрация:
    1 апр 2010
    Сообщения:
    435
    Благодарности:
    85
    Баллы:
    190
    Пол:
    Мужской
    Да элементарно, хоть так:
    Код:
    _player->GetModel()->GetOBBox3D()->Draw(1,zCOLOR(255,255,255));
    
    Я так понял, первый параметр это опять буфер глубины(1 - внутри игры, 0 - поверх всего)?
     
  12. Gratt

    Gratt
    Модостроитель

    Регистрация:
    14 ноя 2014
    Сообщения:
    609
    Благодарности:
    683
    Баллы:
    135
    Пол:
    Мужской
    в 001-002 описаны экспорты, может у тебя нет функции WorldInit? удали строку с этой функцией в export.def и не парься
     
    kwenlY сказал Спасибо
  13. Saturas

    Saturas
    Модостроитель

    Регистрация:
    11 фев 2009
    Сообщения:
    1.816
    Благодарности:
    535
    Баллы:
    275
    Пол:
    Женский
    Так, это нормально, жди релиза 003, тут опять же сбита виртуалка, можешь попробовать скопировать метод GetOBBox3D(), переименовать его по своему усмотрению типа вот так:
    zCOBBox3D* GetOBBox3D_(void)
    {
    XCALL(0x004CA050);
    };
    и засунуть в нужный класс.
     
  14. Jr13San

    Jr13San Участник форума

    Регистрация:
    1 апр 2010
    Сообщения:
    435
    Благодарности:
    85
    Баллы:
    190
    Пол:
    Мужской
    Попробовал, всё равно вылетает. Хотя понадеялся, что всё получится. :)
     
  15. Saturas

    Saturas
    Модостроитель

    Регистрация:
    11 фев 2009
    Сообщения:
    1.816
    Благодарности:
    535
    Баллы:
    275
    Пол:
    Женский
    Вобще подожди до релиза, пофиксим. А вот нашел, нужен другой адрес в твоем случае. Тож самое, но с этим адресом 0x005670A0
     

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