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

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Внимание!
    — Требуется примерно по 3-5 человек на каждую из версий ОС:: - Windows® XP SP3, Windows® Vista SP2, Windows® 7 SP1, Windows® 8, Windows® 8.1, Windows® 10(build 10 1607) и Windows® 10(build 10 1703). Для стационарных ПК и ноутбуков. Заявку на участие можно оставить здесь...
  • Друзья, доброго времени суток!
    Хотелось бы посоветовать вам ознакомиться с творчеством наших форумчан, посвященным серии игр "Готика". При желании прочесть конкурсные работы и оценить их. Данный конкурс у нас проходит ежегодно, но сейчас крайне мала активность критиков. Ждем именно вас.

    Ссылка на конкурсную тему - тык

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

Haart

Участник форума
Регистрация
24 Окт 2011
Сообщения
132
Благодарности
22
Баллы
170
Есть еще вопрос - Готика же не просчитывает логику и все остальное, что касается NPC за пределами видимости ГГ. Реально ли как-то в AST это изменить? Может если рендерить не всех NPC (во избежании перенагрузки) можно зарендерить близ определенных координат? Например игрок находится в башне ксардаса, но вокруг позиции 0.0.0 в радиусе 2500 рендерятся NPC, у них выполняется рутина и т.п.
Насколько я знаю, нпц вставляются в радиусе 3500 от гг, а исчезают - если он отойдет на 4000 от героя. Но это не точно) Может у вас значения другие. Если есть желание - смотрите и изменяйте как вам надо.

C++:
float& SPAWN_INSERTRANGE = *(float*)0x008BACD0;
float& SPAWN_REMOVERANGE = *(float*)0x008BACD4;
 

OsmithREV

Участник форума
Регистрация
17 Мар 2016
Сообщения
35
Благодарности
59
Баллы
65
Насколько я знаю, нпц вставляются в радиусе 3500 от гг, а исчезают - если он отойдет на 4000 от героя. Но это не точно) Может у вас значения другие. Если есть желание - смотрите и изменяйте как вам надо.

C++:
float& SPAWN_INSERTRANGE = *(float*)0x008BACD0;
float& SPAWN_REMOVERANGE = *(float*)0x008BACD4;
Спасибо, то что искал. А как и спрашивал еще - нет ли возможности рендерить NPC в произвольном радиусе на карте?
 

Haart

Участник форума
Регистрация
24 Окт 2011
Сообщения
132
Благодарности
22
Баллы
170
А как и спрашивал еще - нет ли возможности рендерить NPC в произвольном радиусе на карте?
Т.е. совсем в конкретном радиусе, а не в радиусе от героя ?
Технически, аст для этого не нужен - нужно просто вставить нпц в этом радиусе, и нигде больше.

На счет Аст - не скажу, я не понимаю ТЗ, что-бы сказать, как это сделать.
 
Последнее редактирование:

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
1.234
Благодарности
1.333
Баллы
230
Спасибо, то что искал. А как и спрашивал еще - нет ли возможности рендерить NPC в произвольном радиусе на карте?
Прежде всего надо понимать что конкретно ты хочешь. Есть большая вероятность поломать AI неписей. Резкие изменения радиуса отрисовки/исполнения циклофункций крайне нежелательны.
 

OsmithREV

Участник форума
Регистрация
17 Мар 2016
Сообщения
35
Благодарности
59
Баллы
65
Мне необходимо сделать хук функций _Forward и JumpForward (методы oCAniCtrl_Human), но появилась проблема. По отдельности эти хуки работают, а вот вместе - нет. При запуске получаю ошибку (скрин прикреплен). Может кто помочь разобраться? Код прикрепляю. Я бы может и избежал проблемы через пару часов методом тыка, но хочется конкретно понять в чем проблема, чтобы в будущем не допускать :)

C++:
int wmode = -1;
// 0 - stay
// 1 - fwd
// 2 - bwd
// 3 - jmp

void __fastcall Hook_JMPFWD(oCAniCtrl_Human* _this, void* vtable);
CInvoke <void(__thiscall*) (oCAniCtrl_Human* _this)> pHook_JMPFWD(0x006B21E0, Hook_JMPFWD, IVK_AUTO);

void __fastcall Hook_JMPFWD(oCAniCtrl_Human* _this, void* vtable) {
    if (wmode != 3) {
        Say::Box("Jump");
        wmode = 3;
    }
    pHook_JMPFWD(_this);
};

//------------------------------------------------------------------------------------

void __fastcall Hook_FWD(oCAniCtrl_Human* _this, void* vtable);
CInvoke <void(__thiscall*) (oCAniCtrl_Human* _this)> pHook_FWD(0x006B7900, Hook_FWD, IVK_AUTO);

void __fastcall Hook_FWD(oCAniCtrl_Human* _this, void* _vtable) {
    if (wmode != 1) {
        Say::Box("Forward");
        wmode = 1;
    }
    pHook_FWD(_this);
};
 

Вложения

  • 7,1 KB Просмотры: 0

Haart

Участник форума
Регистрация
24 Окт 2011
Сообщения
132
Благодарности
22
Баллы
170
@OsmithREV,
Первое что бросается в глаза
0x006B21E0 public: int __thiscall oCAniCtrl_Human::JumpForward(void)
0x006B7900 public: void __thiscall oCAniCtrl_Human::_Forward(void)
 

OsmithREV

Участник форума
Регистрация
17 Мар 2016
Сообщения
35
Благодарности
59
Баллы
65
@OsmithREV,
Первое что бросается в глаза
0x006B21E0 public: int __thiscall oCAniCtrl_Human::JumpForward(void)
0x006B7900 public: void __thiscall oCAniCtrl_Human::_Forward(void)
Понял, я невнимательный. Все теперь работает правильно. Спасибо.
 

OsmithREV

Участник форума
Регистрация
17 Мар 2016
Сообщения
35
Благодарности
59
Баллы
65
Реально ли как-то узнать длительность анимации? Желательно в миллисекундах. Вроде видел что-то на уровне numFrames в zCModelAni, но не уверен, что это нужное.
 

Jr13San

Участник форума
Регистрация
1 Апр 2010
Сообщения
470
Благодарности
151
Баллы
210
Реально ли как-то узнать длительность анимации
C++:
   zCModel* pModel = player->GetModel();
    if (!pModel)
        return;
    int aniID = pModel->GetAniIDFromAniName("S_RUN");
    zCModelAni* pAni = pModel->GetAniFromAniID(aniID);
    if (!pAni)
        return;

    screen->Print(100, 150 * 1, zSTRING(pAni->fpsRate, 5));    // (25 кадров / сек)
    screen->Print(100, 150 * 2, zSTRING(pAni->numFrames)); // (50 кадров анимации)
    screen->Print(100, 150 * 3, zSTRING(pAni->numFrames * 1000 / pAni->fpsRate, 5)); // выполнится за (50 / 25 = 2 сек или 2000 мсек)
Ps: Исправлено. Ошибочка была, тысячу в левую сторону нужно было перенести, а не в правую по отношению к делению.
 
Последнее редактирование:

OsmithREV

Участник форума
Регистрация
17 Мар 2016
Сообщения
35
Благодарности
59
Баллы
65
Вопрос - можно ли как-то правильно идентифицировать все объекты в мире? Имя может быть не всегда установлено, а просто простой список может быть не точен даже если сортировать его по имени 3ds файла, т.к. весь список может быть бесполезен при дропе предмета и т.п. Может у объектов есть какой-то уникальный ID или что-то вроде того?
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
1.234
Благодарности
1.333
Баллы
230
Вопрос - можно ли как-то правильно идентифицировать все объекты в мире? Имя может быть не всегда установлено, а просто простой список может быть не точен даже если сортировать его по имени 3ds файла, т.к. весь список может быть бесполезен при дропе предмета и т.п. Может у объектов есть какой-то уникальный ID или что-то вроде того?
Нет. Прямого способа идентифицировать объект не существует. Не сложно реализовать свой, но придется немного изменить формат архиватора.

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