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

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Это снова вы, и это снова я - MEG@VOLT, какаяя радость.
    А значит нас всех снова скоро ожидают технические работы на форуме.
    Очередные работы запланированы на начало марта, 7-9 числа.

Вопросы по union

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
10.902
Благодарности
7.547
Баллы
1.910
Вопрос, наверно, больше не к union...
Как мне понимать,какую функцию мне нужно расширять/хукать и прочее?
Конкретный случай:
Вот запустил я игру, начал кастовать какое-нить заклинание - bodystate остается BS_STAND, хотя по идее должен меняться на BS_CASTING. Думал плагин привязать к этому но нет, привязать к GetWeaponMode() ? - то же не правильно.
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.461
Благодарности
4.825
Баллы
625
Сформулируй задачу
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.461
Благодарности
4.825
Баллы
625
Ну пусть будет MagicMode. Вся основная логика для игрока там
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
10.902
Благодарности
7.547
Баллы
1.910
Хорошо, как ты это узнал?
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.461
Благодарности
4.825
Баллы
625
Опыт. Что ты хочешь услышать? Документации на движок нет, и пока не нашлось сумасшедших его писать.
Можешь исходники скачать, мб будет проще с ними
 

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
140
Благодарности
5
Баллы
60
Хорошо, как ты это узнал?
Есть файлик с сигнатурами функций - "Names.txt", в Gothic API, в зависимости от платформы игры. Эмпирическим путем, методом перебора хукаешь их и смотришь на результат. Обычно их имя отражает то, что они делают, логически можно догадаться. (но не всегда...)
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
10.902
Благодарности
7.547
Баллы
1.910
Это понятно, т.е. нет ни какой супер-пупер проги(че-нить еще) которая запускается вместе с игрой параллельно и показывает адрес(подобное)?
Или все проггеры, кто плагины пишут, все так же как и я действуют - просто на обум, по похожим названиям?
Эмпирическим путем, методом перебора хукаешь их и смотришь на результат. Обычно их имя отражает то, что они делают, логически можно догадаться.
Я так и делаю))
 

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
140
Благодарности
5
Баллы
60
Это понятно, т.е. нет ни какой супер-пупер проги(че-нить еще) которая запускается вместе с игрой параллельно и показывает адрес(подобное)?
Или все проггеры, кто плагины пишут, все так же как и я действуют - просто на обум, по похожим названиям?

Я так и делаю))
так ты все правильно делаешь, все страдают и ты страдай!
Пост автоматически объединён:

Это понятно, т.е. нет ни какой супер-пупер проги(че-нить еще) которая запускается вместе с игрой параллельно и показывает адрес(подобное)?
Или все проггеры, кто плагины пишут, все так же как и я действуют - просто на обум, по похожим названиям?
Ну есть дизассемблеры: IDA, Ghidra. Если научишься пользоваться - будет полегче. Из собственной практики: очень полезными оказались partial хуки. Вещаешь их на адреса, где ты подозреваешь, что какая либа переменная помещается в какой-то определенный регистр или помещается в стек и выводишь это значение в консоль.
 
Последнее редактирование:

STARK

Участник форума
Регистрация
20 Янв 2011
Сообщения
657
Благодарности
164
Баллы
220
Опыт. Что ты хочешь услышать? Документации на движок нет, и пока не нашлось сумасшедших его писать.
Можешь исходники скачать, мб будет проще с ними
Можно где-нибудь найти исходники движка Готики, с содержимым функций, а не только API, в котором только заголовки функций?
Помогло бы понимать происходящее и писать что-то новое.
 

Gratt


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

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
10.902
Благодарности
7.547
Баллы
1.910
Очередной вопрос, над которым бьюсь уже больше недели:
Диалог. Нужно чтобы ГГ воспроизводил S_ анимацию. Но если запустить анимацию через стандартные скрипты AI_PlayAni во время диалога - диалог зависнет, т.к. S_ анимации зацикленные.
Если в плагине хукнуть void __fastcall OnInfo( oCInfo* ) в нем написать что-то типа: player->GetEM(FALSE)->OnMessage(new oCMsgConversation(oCMsgConversation::EV_PLAYANI_NOOVERLAY, "S_SNEAK"), player); То диалог так же зависнет, т.к. по сути это то же самое, что через обычные скрипты(AI_PlayAni).
Пытался сделать "ход конем": во время диалога вызываю перемещение игрока в другого npc через SetAsPlayer, закрываю диалог и в новом диалоге прописываю important = true(или 1). Но эта сволочь не хочет сама говорить с новым ГГ, пока сам(уже новым персонажем) не обратишься к неписю. Но если переместиться в старого ГГ, то эта сволочь тут же обращается к игроку.
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.175
Благодарности
2.048
Баллы
320
MEG@VOLT, можно попробовать с этой функцией
Daedalus:
// Ставит вызов функции funcName в AI очередь
// и при ее вызове помещает значения slf & oth
// в глобальные self & other (соотвественно)
func void AI_CallScript(var string funcName, var C_Npc slf, var C_Npc oth)
Внутри функции уже запустить анимацию через NPC_PlayAni

Ну или создать не S_ анимацию
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
10.902
Благодарности
7.547
Баллы
1.910
Внутри функции уже запустить анимацию через NPC_PlayAni
Пробовал, тоже не хочет)) А сама NPC_PlayAni - вообще толком не работает, запускается анимация и тут же перекрывается стандартным S_RUN...
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.685
Благодарности
3.451
Баллы
525
Нужно чтобы ГГ воспроизводил S_ анимацию.
Если нужен режим подкрадывания, то, может быть, стоит попробовать
Daedalus:
AI_SetWalkMode(other,NPC_SNEAK);

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

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
10.902
Благодарности
7.547
Баллы
1.910
Если нужен режим подкрадывания, то, может быть, стоит попробовать
Попробовать можно, и даже если сработает, то сработает только с подкрадыванием... А вот с S_LGUARD не сработает))
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.175
Благодарности
2.048
Баллы
320

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
10.902
Благодарности
7.547
Баллы
1.910
@MEG@VOLT, ну мне лень скрипты диалога писать, чтобы это проверять
вот ты лентяй!
Daedalus:
instance SLD_700_LEE_TEST(C_Info)
{
    npc = Sld_700_Lee;
    nr = 1;
    condition = sld_700_lee_test_condition;
    information = sld_700_lee_test_info;
    permanent = 0;
    description = "TEST";
};


func int sld_700_test_condition()
{
    return 1;
};

func void sld_700_lee_test_info()
{
    AI_Output(other,self,"DIA_Lee_test_15_00");    //Ленивый мартовский кот.
    AI_CallScript("abracadabra",self,other)
    AI_Output(self,other,"DIA_Lee_test_00_01");    //От лентяя слышу!
};

func void abracadabra()
{
    AI_PlayAni(other,"S_LGUARD");
};
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.175
Благодарности
2.048
Баллы
320
Костыли, конечно...
C++:
namespace GOTHIC_NAMESPACE
{
    void __fastcall Hook_StandUp(Union::Registers& registers)
    {
        if (reinterpret_cast<oCNpc*>(registers.ecx) == player)
            if (parser->GetSymbol("DONT_STANDUP")->single_intdata)
            {
                registers.esp += 8;
                registers.eip += 5;
            }
    }

    auto hook = Union::CreatePartialHook(reinterpret_cast<void*>(0x0074C008), Hook_StandUp);
}
Daedalus:
const int DONT_STANDUP = false;

func void sld_700_lee_test_info()
{
    AI_CallScript("abracadabra", other, self);
    AI_Output(other,self,"DIA_Lee_test_15_00");    //Ленивый мартовский кот.
    AI_Output(self,other,"DIA_Lee_test_00_01");    //От лентяя слышу!
    AI_CallScript("abracadabra", other, self);
    AI_WaitTillEnd(other,self);
};

func void abracadabra()
{  
    if (!DONT_STANDUP)
    {
        DONT_STANDUP = true;
        NPC_PlayAni(self,"S_LGUARD");
        return;
    };
   
    DONT_STANDUP = false;
};

WaitTillEnd, которое и само в диалогах вставляется, вызывает oCNpc::StandUp, что влияет на анимации уровней 1-8 и 20. По идее, можно просто использовать анимацию 9-го уровня и тогда её не будет сбивать движком.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.685
Благодарности
3.451
Баллы
525
А вот с S_LGUARD не сработает))
Ну, если оверлеем заменить анимку S_Stand и переходные к ней от S_Run... Главное, чтобы оверлей применялся ДО старта диалога и снимался после его окончания.

Прям таки заточены?
То, что ниже спины, не заточено ни подо что. Да. Но ты же видел, как криво работает жестикуляция, если непись сидит, наклонившись вперёд, например.
 
Сверху Снизу