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

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

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

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

  1. Gratt

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

    Регистрация:
    14 ноя 2014
    Сообщения:
    607
    Благодарности:
    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. Gratt

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

    Регистрация:
    14 ноя 2014
    Сообщения:
    607
    Благодарности:
    683
    Баллы:
    135
    Пол:
    Мужской
    ну мне ваще не до этого. готика не предусматривает трассировку динамических объектов: тела, морфмеши, морфполигоны.
    для того, чтобы трассирнуть полигон, ему надо получить инфу о его вертексах и нормалях, где последние вообще в динамике никогда не обновляются.
    следствие: сюрфейс физика всегда статична и ее бестолку тормошить..

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

    в случае нпс это гемор.. не над так делать лучше
     
  3. Jr13San

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

    Регистрация:
    1 апр 2010
    Сообщения:
    435
    Благодарности:
    85
    Баллы:
    190
    Пол:
    Мужской
    Ладно бы для всех было одно и то же, а тут ведь на "Големах" трассировка правильно работает. Может потому что их шкура обвешана партикль-частицами огня?
     
  4. Gratt

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

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

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

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

    ЗЫ:
    Видео (открыть)


     
    Последнее редактирование: 30 дек 2016
    hell9999 сказал Спасибо
  6. Gratt

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

    Регистрация:
    14 ноя 2014
    Сообщения:
    607
    Благодарности:
    683
    Баллы:
    135
    Пол:
    Мужской
    слушай, сделай пачку скринов или видео в динамике.. на словах сложно объяснять..
    или не в теме обговаривать, иначе это уже не обсуждение, а диалог между нами двумя получается
     
  7. Saturas

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

    Регистрация:
    11 фев 2009
    Сообщения:
    1.816
    Благодарности:
    535
    Баллы:
    275
    Пол:
    Женский
    Не не не, там есть флаги какие то, так вроде можно над глянуть потом. Ща просто апи занимаюсь, а это еще пара недель.
     
  8. Jr13San

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

    Регистрация:
    1 апр 2010
    Сообщения:
    435
    Благодарности:
    85
    Баллы:
    190
    Пол:
    Мужской
    По трассировке удалось выяснить, вот что.
    Если модель НПС составлена из отдельных "zm_Frill", соединённых в иерархию с помощью инструмента "Select and link", как в случае с "Големами", то она чекается как положено. А если в оболочке модели присутствует модификатор "Physique" или "Skin", как, например, у "Болотного голема", то он не чекается, если только по объёму.
    Отдельно присоединённый меш(zm_Frill1) к общей иерархии костей, через "Select adn link" также не имеет столкновения при рассировке луча. Когда вся основная оболочка "zm_Frill" имеет модификатор "Physique".
     
    Последнее редактирование: 1 янв 2017
  9. alex_draven

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

    Регистрация:
    13 сен 2007
    Сообщения:
    1.126
    Благодарности:
    1.394
    Баллы:
    315
    Пол:
    Мужской
    Не связано ли это с производительностью вычислений при расчете сложной геометрии на модификаторе?

    По-нормальному это решается добавлением в модель упрощенного меша для расчетов. Мы уже примерно такой делали. Он просто охватывает части модели в объеме, но сам имеет предельно простую геометрию. Как при расчете физики обычно делается.
     
  10. Jr13San

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

    Регистрация:
    1 апр 2010
    Сообщения:
    435
    Благодарности:
    85
    Баллы:
    190
    Пол:
    Мужской
    Возможно ты прав. Но с другой стороны, я бы не сказал, что модель набранная из отдельных мешей сильно упрощает расчёты для вычисления точки столкновения луча и полигона модели. Разница лишь в том, что с модификатором модель может растягиваться.
    Это на ZenGin или на каком-то другом движке? Unity3D?
     
  11. alex_draven

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

    Регистрация:
    13 сен 2007
    Сообщения:
    1.126
    Благодарности:
    1.394
    Баллы:
    315
    Пол:
    Мужской
    Для AST на zengin. Там речь была про точечный расчет попаданий при ударах.
    А так в любом 3d-редакторе лучше всего считать физику на упрощенных элементах, а не заряжать в расчет 100500 полигонов.
     
  12. Saturas

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

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

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

    Регистрация:
    1 апр 2010
    Сообщения:
    435
    Благодарности:
    85
    Баллы:
    190
    Пол:
    Мужской
    Никто не подскажет, что за аргументы принимает функция у структуры zTBBox3D? :
    Код:
    int IsIntersecting(zVEC3 const&,zVEC3 const&,float&,float&)const
    {
        XCALL(0x00545370);
    };
     
  14. Saturas

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

    Регистрация:
    11 фев 2009
    Сообщения:
    1.816
    Благодарности:
    535
    Баллы:
    275
    Пол:
    Женский
    BOOL zTBBox3D::IsIntersecting(const zVEC3& startRay, const zVEC3& rayDirection, float& scaleMin, float& scaleMax ) const

    Вот еще немного справки, имена всех методов г2а и их адреса, больше не нужно ковырятся в иде.

    ps. прилепил файлик в шапку.
     

    Вложения:

    • Undecorated.txt
      Размер файла:
      1,2 МБ
      Просмотров:
      13
    Последнее редактирование модератором: 2 янв 2017
    Jr13San сказал Спасибо
  15. Saturas

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

    Регистрация:
    11 фев 2009
    Сообщения:
    1.816
    Благодарности:
    535
    Баллы:
    275
    Пол:
    Женский
    ВНИМАНИЕ! Скоро релиз AST v. 003, по этому поводу, всем СКРИПТЕРАМ, просьба закидывать сюда свои пожелания относительно дополнительных функций скриптов(в смысле встроенных) и какой функционал движка(ранее не доступный) хорошо бы перенести в скрипты(обработка колющего оружия например) так что у вас есть пара дней чтоб написать свои пожелания, и уже буквально через ту же пару дней вы сможете это все использовать. Спасибо за внимание.
     
  16. Jr13San

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

    Регистрация:
    1 апр 2010
    Сообщения:
    435
    Благодарности:
    85
    Баллы:
    190
    Пол:
    Мужской
    Возможно могла бы пригодиться функция проигрывания анимации для интерактивного объекта "без участия НПС".
    Простое движение можно обыграть мувером, но что, если анимация сложная?
    Суть в том, что без НПС модель не проигрывает анимацию. Т.е. такой код ничего не даёт:
    C++:
    Код:
    zCVob* pVob = _player->GetFocusVob();
    if (pVob)
    {
        if (pVob->m_TypeVob == zTVOB_MOB)
        {
            oCMobInter* mobInter = (oCMobInter*)pVob;
            mobInter->GetModel()->StartAnimation("T_S0_2_S1");//анимация не проигрывается
        }
    }
    
     
  17. Gratt

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

    Регистрация:
    14 ноя 2014
    Сообщения:
    607
    Благодарности:
    683
    Баллы:
    135
    Пол:
    Мужской
    нужен zCMorphMesh, визуал которого представлен как zCVisualAnimate. и соответствующая исходная модель анимации. и уже дальше
    *StartAnimation* будет работать, если проигрывать его через анимированый визуал, а не просто гетмодел.
     
  18. Jr13San

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

    Регистрация:
    1 апр 2010
    Сообщения:
    435
    Благодарности:
    85
    Баллы:
    190
    Пол:
    Мужской
    Я так понял, что с обычными НЕ морф-мешами это провернуть нельзя?
    Следующий код доходит только до сообщения MsgBox("no pMorph*");. Нет указателя на морф-меш.
    Тестировалось на объекте класса oCMobInter с визуалом "PAN_OC.MDS".
    Code (открыть)
    Код:
    if (KeyClick(KEY_Z))
    {
        zCVob* pVob = _player->GetFocusVob();
        if (pVob)
        {
            if (pVob->m_TypeVob == zTVOB_MOB)
            {
                oCMobInter* mobInter = (oCMobInter*)pVob;
                zCVisualAnimate* pVisAni = mobInter->GetModel();
                if (pVisAni)
                {
                    zCMorphMesh* pMorph = dynamic_cast<zCMorphMesh*>(pVisAni);
                    if (pMorph)
                    {
                        MsgBox("Play Ani");
                        pMorph->StartAnimation("T_S0_2_S1");
                    }
                    else
                    {
                        MsgBox("no pMorph*");
                    }
                }
                else
                {
                    MsgBox("no pVisAni*");
                }
            }
        }
    }
    

    Кстати, при использовании функции "MsgBox" в фулл-скрин режиме - окно виснет, а сообщения даже и не видно.
     
  19. Gratt

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

    Регистрация:
    14 ноя 2014
    Сообщения:
    607
    Благодарности:
    683
    Баллы:
    135
    Пол:
    Мужской
    ясен пень, анимации то ему откуда читать

    а нафига вызывать боксы в фулскрине то? тут надо как минимум программно вырубать полноэкранный режим чтобы показать другие окна

    на примере лицевой анимации:

    Код:
    zCModelNodeInst* pNode = pNpc->GetModel()->SearchNode(zMDL_NODE_NAME_HEAD);
    zCMorphMesh* pMorph = dynamic_cast<zCMorphMesh*>(pNode->m_pVisual);
    if(pMorph)
    {
        zCMorphMeshAni* pAni = pMorph->SearchAni(nameAni);
        if(pAni)
            pMorph->AddRandAni(pAni, timeStart, timeStartVar, timeStop, timeStopVar, probablyMin);
    }
    

    где zMDL_NODE_NAME_HEAD можно прочитать по 0x008D8A08
    или просто создать свою константу "BIP01 HEAD"

    Открыть спойлер

    0x008D89B4 class zSTRING const zMDL_NODE_NAME_R_HAND
    0x008D89C8 class zSTRING const zMDL_NODE_NAME_R_FOOT
    0x008D89DC class zSTRING const zMDL_NODE_NAME_FOOTSTEPS
    0x008D89F4 class zSTRING const zMDL_NODE_NAME_BIP_PREFIX
    0x008D8A08 class zSTRING const zMDL_NODE_NAME_HEAD
     
  20. Jr13San

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

    Регистрация:
    1 апр 2010
    Сообщения:
    435
    Благодарности:
    85
    Баллы:
    190
    Пол:
    Мужской
    На Икаре окна всплывают модально. Но не помню минимизируется ли окно в этот момент.

    Я сначала подумал, что если представить модель в какой-то другой форме, то анимация запустится. Но сомневался о причастности здесь морф-меша. Сейчас всё понятно стало.

    Но кстати, анимцию у обычного мобинтера можно запустить, если посадить за руль ноу боди, ноу таргет НПС какого-нибудь в виде точки.

    ЗЫ:
    Кстати да, c помощью каких функций лучше читать данные типа: zSTRING, INT, FLOAT по адресам Готы?
    С помощью функции memcpy() мне удалось считать и записать типы: int, float. С zString и другими типами пока не разобрался.
     
    Последнее редактирование: 4 янв 2017
  21. Saturas

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

    Регистрация:
    11 фев 2009
    Сообщения:
    1.816
    Благодарности:
    535
    Баллы:
    275
    Пол:
    Женский
    Если переменная имеет вид в движке zCPsraser parser; то читать так - zCParser* parser = (zCParser*)0x00AB40C0;
    если указатель(zCOption* zoptions), то так zCOption*& zgameoptions= *(zCOption**)0x008CD98C;
    если int то так = int oCNpc::game_mode = *(int*)0x00AB27D0;
     

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