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

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, спешите принять участие в поэтическом конкурсе "Весенние поэты 2024"!
    Ждем именно вас!

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

Вопросы по скриптингу

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.803
Баллы
995
  • Первое сообщение
  • #1
Прежде чем задавать вопросы, ознакомьтесь с документацией..
1) Читать онлайн
2) Архив с офлайн-версией(chm) во вложении
 

Вложения

  • Vam_tutor.rar
    171,6 KB · Просмотры: 511
Последнее редактирование модератором:

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Читаю, :D
Идея из серии "красивая, а нужная ли?"
Если бы ГГ отыгрывал охранника тюрьмы - тогда да, но тогда и реализация по-другому (через диалог сдачи оружия и т.д.)
А в данном случае - что арестант голый сидит, что в танке - одинаково. Он за решеткой. И кроме как "по сюжету" он оттуда никак не выберется. Как и оружие использовать не сможет. Или добавим еще возможность "подкопа мечом с побегом"? :D
ЗЫ. Хотя удовольствие от реализации идеи вы получите... И возможных глюков... А в игре игрок увидит арестантов только пару раз на пару минут, и не думаю что среднестатистический игрок будет "заморачиваться" "а почему на нем топор одет?". На геймплей данная идея ну никак не повлияет и игру не разнообразит. ИМХО только получение удовольствия от "изысков". Хотя есть достаточное количество идей на которые стоит потратить время и которые изменят геймплей, а не только "сиюминутное восприятие". :)
 

kraw


Модостроитель
Регистрация
11 Окт 2005
Сообщения
2.095
Благодарности
871
Баллы
295
А в игре игрок увидит арестантов только пару раз на пару минут, и не думаю что среднестатистический игрок будет "заморачиваться" "а почему на нем топор одет?". На геймплей данная идея ну никак не повлияет и игру не разнообразит. ИМХО только получение удовольствия от "изысков". Хотя есть достаточное количество идей на которые стоит потратить время и которые изменят геймплей, а не только "сиюминутное восприятие". :)

Ну, когда проходил Г3, меня сильно покоробил паладин в плену у орков в доспехах и при оружии.
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.205
Благодарности
6.181
Баллы
1.565
kraw, ну ты сравнил, или Г3 или Г2 - небо и земля
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
kraw написал(а):
Ну, когда проходил Г3, меня сильно покоробил паладин в плену у орков в доспехах и при оружии.
"Плен" и "за решеткой" не совсем слова-синонимы :)
Если охрана "за решеткой" может обеспечить собственную безопасность и исключить возможность побега (вплоть до "слова чести - не бежать до конца срока" - нравов вы же полностью не знаете? Где в Готике намек на то, что пленный должен сдать оружие-броню? Решетки - просто "символ ограничения свободы передвижения") - почему не разрешить носить все что хочешь?. ::)
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.803
Баллы
995
Dimus,
Полная очистка от оружия инвентаря арестованного - не выход, учитывая следующие факторы:
А если с другой стороны посмотреть?
Завести новые Инстанции этих Непесей с префиксом "арестант", прописать для них строки в мдс-ах и подчистить их на предмет использования любого вида оружия ?! ::)
 

kraw


Модостроитель
Регистрация
11 Окт 2005
Сообщения
2.095
Благодарности
871
Баллы
295
А можно на момент пленения ставить соотвестствующий атрибут в самом экземпляре, и модифицировать функции, ответственные за реакцию на опасность, с учетом атрибута. Потом, по освобождении, этот атрибут сбрасывать.
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.803
Баллы
995
kraw, Это все так или иначе будет глючить, плюс айвары ограничены числом и могут быть заняты. А вот когда на Нпс натянут оверлей штрафника/пленника и соответствующее расписание, всё, доступы к оружию зашиты, в игре уже ничего не сбойнет, + не потребуется писать километры кода в функции. Но это только теория, а сработает или нет, надо уже в живую тестить в игре. :)
 

kraw


Модостроитель
Регистрация
11 Окт 2005
Сообщения
2.095
Благодарности
871
Баллы
295
Ну, айвары тоже можно строить по принципу "битовых признаков"
 

Shevchenko

Участник форума
Регистрация
26 Ноя 2010
Сообщения
391
Благодарности
0
Баллы
180
Вопрос : Как сделать так, чтобы после определенного момента нпц становился смертным?
 

Ilot

Участник форума
Регистрация
17 Сен 2010
Сообщения
798
Благодарности
297
Баллы
245
(ссыль на нпс).flag=0;
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.803
Баллы
995
Shevchenko,
Если кратко и применительно к диалогам, то:
1. Если произошло требуемое событие, то должен появится новый диалог.
2. В условии которого ставим проверку на активацию этого события.
3. В теле самого диалога, в начале или его конце, меняем флаг для требуемого НПС, - "бессмертного" на "смертного".
По завершении которого НПС становится смертным, все.

Более подробно читаем в туториале Вама, что есть что...
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.339
Благодарности
3.183
Баллы
525
Не знаю, насколько это известный баг, но я с таким столкнулся впервые.

Действительно, если забрать меч у Шрама и экипировать (!) его, а затем попасть в поле его зрения, то он говорит "У тебя мой меч" и нападает на ГГ.

...

Дальше самое интересное:

Если Шрам нашего героя вырубает, то сразу же успокаивается и уходит, но меч себе обратно не забирает!

Если же мы захотим вступить с ним в бой, и начнём доставать меч из ножен, то игра тут же намертво виснет!
Lafor выше говорит, что "игра лочится, даже Esc ничего не дает и персоонаж бьет главного героя", но у меня она просто повисает.

Зависание из-за отсутствия правильного выхода из режима диалога уже пофиксил. Изымание оружия тоже уже работает, но пока не так, как хотелось бы. Нужно подумать, как сделать это более элегантно.
ElderGamer,
Там скрипты анимации, да и сами анимы скорее всего придется править, иначе никак. Поэтому я бы не назвал это - элегантным... :D

Поскольку вопрос из области скриптинга, отвечу и спрошу здесь.

Не совсем понял, при чём здесь анимации, если не трудно, поясни. Проблема заключается в следующем. Команды выполняются движком не совсем в той последовательности, в которой они прописаны в скриптах. Если команды AI_XXX выстраиваются в очередь, то прочие команды могут выполняться раньше, минуя эту очередь. Это приводит к тому, что оружие удаляется из инвентаря ГГ раньше, чем непись подходит к нему, нагибается, "отбирает оружие" и экипируется им сам. Надпись на экран тоже выводится раньше времени. Может, кто подскажет способ, как обойти эту особенность движка?

На всякий случай, вот текст правок в скриптах.
Код:
func void B_CheckStolenEquipment()
{
    var C_Item melee;
    var C_Item ranged;
    var C_Item armor;
    melee = Npc_GetEquippedMeleeWeapon(other);
    ranged = Npc_GetEquippedRangedWeapon(other);
    armor = Npc_GetEquippedArmor(other);
    if(Npc_OwnedByNpc(melee,self))
    {
        PrintDebugNpc(PD_ZS_Check,"...SC trдgt Nahkampf-Waffe des NSCs offen!");
        self.aivar[AIV_WANTEDITEM] = Hlp_GetInstanceID(melee);
        if(!Npc_HasNews(self,NEWS_DEFEAT,other,self) && (self.aivar[AIV_PCISSTRONGER] == 0))
        {
            PrintDebugNpc(PD_ZS_Check,"...NSC ist nicht vom SC besiegt worden & hat noch nicht danach gefragt!");
            Npc_ClearAIQueue(self);
           [COLOR=Green] if(C_BodyStateContains(self,BS_SIT))
            {
                AI_Standup(self);
            };[/COLOR]
            C_LookAtNpc(self,other);
            AI_TurnToNPC(self,other);
            AI_PointAtNpc(self,other);
            B_Say(self,other,"$THATSMYWEAPON");
            [COLOR=Green]AI_StopProcessInfos(self);[/COLOR]
            AI_StartState(self,ZS_GetBackBelongings,1,"");
            return;
        };
    }
    else if(Npc_OwnedByNpc(ranged,self))
    {
        PrintDebugNpc(PD_ZS_Check,"...SC trдgt Fernkampf-Waffe des NSCs offen!");
        self.aivar[AIV_WANTEDITEM] = Hlp_GetInstanceID(ranged);
        if(!Npc_HasNews(self,NEWS_DEFEAT,other,self) && (self.aivar[AIV_PCISSTRONGER] == 0))
        {
            Npc_ClearAIQueue(self);
            C_LookAtNpc(self,other);
            [COLOR=Green]if(C_BodyStateContains(self,BS_SIT))
            {
                AI_Standup(self);
            };[/COLOR]
            AI_TurnToNPC(self,other);
            AI_PointAtNpc(self,other);
            B_Say(self,other,"$THATSMYWEAPON");
            [COLOR=Green]AI_StopProcessInfos(self);[/COLOR]
            AI_StartState(self,ZS_GetBackBelongings,1,"");
            return;
        };
    };
};
Код:
func void ZS_Attack_End()
{
    PrintDebugNpc(PD_ZS_FRAME,"ZS_Attack_End");
    other = Hlp_GetNpc(self.aivar[AIV_LASTTARGET]);
    PrintGlobals(PD_ZS_Check);
[COLOR=Green]    if(Npc_HasItems(other,self.aivar[AIV_WANTEDITEM]))
    {
        AI_RemoveWeapon(self);
        AI_TurnToNpc(self,other);
        AI_GotoNpc(self,other);
        B_Say(self,other,"$GiveItToMe");
        AI_PlayAni(self,"T_PLUNDER");
        B_GiveInvItems(other,self,self.aivar[AIV_WANTEDITEM],1);
        AI_EquipBestMeleeWeapon(self);
        AI_EquipBestRangedWeapon(self);
        self.aivar[AIV_WANTEDITEM] = 0;
    };
    Npc_PerceiveAll(self);
    if(Wld_DetectItem(self,ITEM_KAT_NF))
    {
        if(!Npc_IsPlayer(self) && (self.aivar[AIV_WANTEDITEM] == Hlp_GetInstanceID(item)))
        {
            PrintDebugNpc(PD_ZS_CHECK,"...NSC hebt seine Nahkampf-Waffe wieder auf!");
            AI_RemoveWeapon(self);
            AI_GotoItem(self,item);
            B_Say(self,other,"$GiveItToMe");
            AI_TakeItem(self,item);
            AI_EquipBestMeleeWeapon(self);
            self.aivar[AIV_WANTEDITEM] = 0;
        };
    };
    Npc_PerceiveAll(self);
    if(Wld_DetectItem(self,ITEM_KAT_FF))
    {
        if(!Npc_IsPlayer(self) && (self.aivar[AIV_WANTEDITEM] == Hlp_GetInstanceID(item)))
        {
            PrintDebugNpc(PD_ZS_CHECK,"...NSC hebt seine Nahkampf-Waffe wieder auf!");
            AI_RemoveWeapon(self);
            AI_GotoItem(self,item);
            B_Say(self,other,"$GiveItToMe");
            AI_TakeItem(self,item);
            AI_EquipBestRangedWeapon(self);
            self.aivar[AIV_WANTEDITEM] = 0;
        };
    };[/COLOR]
...
};
 

redleha


Модостроитель
Регистрация
26 Фев 2008
Сообщения
735
Благодарности
665
Баллы
245
ElderGamer, стукни в личку - расскажу способ как выстраивать абсолютно любые функции по порядку выполнения в нужной последовательности.
 

kraw


Модостроитель
Регистрация
11 Окт 2005
Сообщения
2.095
Благодарности
871
Баллы
295
ElderGamer, стукни в личку - расскажу способ как выстраивать абсолютно любые функции по порядку выполнения в нужной последовательности.
Было бы неплохо во всеуслышанье. Мне бы это тоже могло бы пригодиться.
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.803
Баллы
995
ElderGamer,
Не совсем понял, при чём здесь анимации, если не трудно, поясни. Проблема заключается в следующем. Команды выполняются движком не совсем в той последовательности, в которой они прописаны в скриптах. Если команды AI_XXX выстраиваются в очередь, то прочие команды могут выполняться раньше, минуя эту очередь. Это приводит к тому, что оружие удаляется из инвентаря ГГ раньше, чем непись подходит к нему, нагибается, "отбирает оружие" и экипируется им сам. Надпись на экран тоже выводится раньше времени. Может, кто подскажет способ, как обойти эту особенность движка?
Анимации при том, что в них с помощью их скриптов прописаны все фазы движений которые используются тобой в скриптах Готы, + любой переход от фазы анимации к фазе, по фреймам, также регулируется в них. Как и любое удаление/добавления всего и вся в инвентарь героя при взаимодействии с мобами и прочими объектами...
В Эвент-тегах ответы на многое найдешь. Поймешь как они работают поймешь как работает общая взаимосвязь скриптов анимации и скриптов игры, тогда любое расписание нужное сделать сможешь, или добавить к существующим требуемые анимы и т.д. и т.п. Если меч исчезает раньше времени, то думаю что в эту сторону и надо будет копать, ибо удаление его идет из скрипта анимации... ;)

Зы, Опять-же, если я правильно понял вопрос про удаление меча.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.339
Благодарности
3.183
Баллы
525
То есть, если я правильно понял твои намёки, нужно заставить лежащего в отключке ГГ проиграть анимацию, в сценарии которой будет вписано удаление оружия из соответствующего слота?
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.803
Баллы
995
ElderGamer, Примерно что-то типа того, когда проигрывается анима лежачего состояния, в конец ее фазы/фрейма добавляем удаление объекта откуда требуется(инстанция меча). Потом из скрипта вызываем в расписании действий требуемую аниму и она после ее завершения должна будет сама снести указанный предмет. Должно вроде сработать. ;)
 

Magmatic Imperius

Участник форума
Регистрация
21 Апр 2009
Сообщения
85
Благодарности
10
Баллы
160
Как сделать, чтобы непись становился впритык к ГГ во время диалога? Мне надо кой-чего протестить, а она (непись) не хочет подходить на нужную дистанцию.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.339
Благодарности
3.183
Баллы
525
Что понимается под "впритык к ГГ"? Если диалог начинается на большом расстоянии, и нужно, чтобы кто-то, ГГ или его собеседник, сократил дистанцию, используй команду AI_GotoNpc (self,other) илиAI_GotoNpc (other,self). В первом случае собеседник подойдёт/подбежит к ГГ, во втором - ГГ к собеседнику. Но дистанция останется не слишком короткой. Мало того, если начать диалог на слишком малом расстоянии от собеседника, то ГГ сделает отскок, чтобы увеличить дистанцию. Если нужно именно подойти на очень короткую дистанцию, то придётся править алгоритмы ИИ.
 

redleha


Модостроитель
Регистрация
26 Фев 2008
Сообщения
735
Благодарности
665
Баллы
245
Magmatic Imperius, просто в диалоге проведи анимацию ходьбы на нужное кол-во шагов вперёд. AI_PlayAni
 
Сверху Снизу