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

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

    Ссылка на конкурсную тему - тык
    Ссылка на тему с работами участников- тык

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

MaGoth

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

Вложения

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

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.562
Благодарности
4.154
Баллы
915
дай ему гильию горожанина, после разговора поменяй гильдию обратно(self.guild=монстер) и пропиши нападение.
Мега, зачем извращаться с изменением гильдии, если есть aivar[AIV_EnemyOverride]? Например, так реализован разговор ГГ с предводителями орков (антипаладинами) в скрипте B_AssignORC_AntiPaladinTalk.d:
Код:
var int AntiPaladinTalkcount;

func void B_AssignORC_AntiPaladinTalk(var C_Npc Antipaladin)
{
if(AntiPaladinTalkcount == 0)
{
AI_Output(self,other,"DIA_ORC_AntiPaladin_18_01"); //КХРОКГНАР! Хозяин говорить ты паладин теперь! Хозяин прав. Хозяин всегда прав.
AI_Output(self,other,"DIA_ORC_AntiPaladin_18_02"); //Мы, предводители гордой армии орков, теперь сами прийти убить великий паладин.
AI_Output(self,other,"DIA_ORC_AntiPaladin_18_03"); //Хаген и его люди будут уничтожены. Даже ты не смочь помочь им.
B_GivePlayerXP(XP_Ambient);
}
else if(AntiPaladinTalkcount == 1)
{
AI_Output(self,other,"DIA_ORC_AntiPaladin_18_04"); //Хозяин говорить предводителям орков, принесите голову великого паладина. Ты умирать от моей руки. КХРОКГНАР!
}
else if(AntiPaladinTalkcount == 2)
{
AI_Output(self,other,"DIA_ORC_AntiPaladin_18_05"); //Мы, предводители орков, теперь сами идти убивать тебя, паладин.
}
else
{
AI_Output(self,other,"DIA_ORC_AntiPaladin_18_06"); //КХРОКГНАР! Мы убивать тебя, паладин.
};
AntiPaladinTalkcount += 1;
TalkedTo_AntiPaladin = TRUE;
AI_StopProcessInfos(Antipaladin);
Antipaladin.aivar[AIV_EnemyOverride] = FALSE;
Npc_SetRefuseTalk(Antipaladin,20);
};
 

Test Level

Участник форума
Регистрация
1 Ноя 2011
Сообщения
1.771
Благодарности
557
Баллы
275
Скажите, вот есть проверка на причастность ГГ к гильдии - if(hero.guild == GIL_KDF)...., а есть ли проверка на непричастность? Т.е., чтоб не делать проверку на все гильдии, а сделать проверку на то, что ГГ не является "беспартийным".
 

Хелдар

Участник форума
Регистрация
3 Июл 2012
Сообщения
2.449
Благодарности
779
Баллы
375
Скажите, вот есть проверка на причастность ГГ к гильдии - if(hero.guild == GIL_KDF)...., а есть ли проверка на непричастность? Т.е., чтоб не делать проверку на все гильдии, а сделать проверку на то, что ГГ не является "беспартийным".

if(hero.guild != GIL_NONE)
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.238
Благодарности
2.579
Баллы
455
Скажите, вот есть проверка на причастность ГГ к гильдии - if(hero.guild == GIL_KDF)...., а есть ли проверка на непричастность?
if(hero.guild != GIL_KDF) - непричастность к гильдии GIL_KDF

Т.е., чтоб не делать проверку на все гильдии, а сделать проверку на то, что ГГ не является "беспартийным".
if(hero.guild == GIL_NONE) - ГГ "беспартийный", т.е. не вступил в другую гильдию.
if(hero.guild != GIL_NONE) - ГГ не "беспартийный", т.е. вступил в какую либо гильдию.
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.803
Баллы
995
Begemot666,
Скажите, вот есть проверка на причастность ГГ к гильдии - if(hero.guild == GIL_KDF)...., а есть ли проверка на непричастность?
Код:
if(hero.guild != GIL_KDF)
!= — истина, если не равно
?! ::)
Читай тутор Vam'a.
 

Haart

Участник форума
Регистрация
24 Окт 2011
Сообщения
188
Благодарности
106
Баллы
185
Хм, подскажите, можно ли скриптами ускорить анимацию боя ? К примеру, хочется запилить четвертый уровень мастерства, что-то вроде ускоренной анимации уровня мастера.
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.803
Баллы
995
Эм..., ускорение анимации и четвертый уровень, это - разные вещи..
Что до вопроса, то — нет.
 

Test Level

Участник форума
Регистрация
1 Ноя 2011
Сообщения
1.771
Благодарности
557
Баллы
275
Можно чуть-чуть подробнее?

Делаю так:

Код:
instance Demon_NG_01(Mst_Default_DemonLord)
{
    name[0] = "Демон-хранитель врат";
    guild = GIL_VLK;
    level = 50;
    aivar[94] = TRUE;
    flags = Npc_Flag_Immortal;
    bodyStateInterruptableOverride = TRUE;
    attribute[ATR_STRENGTH] = 350;
    attribute[ATR_DEXTERITY] = 350;
    attribute[ATR_HITPOINTS_MAX] = 4000;
    attribute[ATR_HITPOINTS] = 4000;
    attribute[ATR_MANA_MAX] = 200;
    attribute[ATR_MANA] = 200;
    protection[PROT_BLUNT] = 300;
    protection[PROT_EDGE] = 300;
    protection[PROT_POINT] = IMMUNE;
    protection[PROT_FIRE] = 200;
    protection[PROT_FLY] = 200;
    protection[PROT_MAGIC] = 200;
    aivar[AIV_MM_REAL_ID] = ID_DEMON_LORD;
    effect = "SPELLFX_DEMONELIGOR";
    b_setvisuals_demonlord_elite_extra();
    Npc_SetToFistMode(self);
    start_aistate = ZS_MM_Rtn_DragonRest;   
};

в конце диалога пишу:

Код:
self.guild = GIL_DEMON;

Диалог не начинается. Демон стоит, как вкопанный.
 

Ilot

Участник форума
Регистрация
17 Сен 2010
Сообщения
798
Благодарности
297
Баллы
245
Диалог не начинается. Демон стоит, как вкопанный.

Если я не ошибаюсь гильдию не нужно трогать для монстра что бы написать для него диалог. Для примера смотрите диалог с драконами. Сперва ставите флаг, что у демона нет врагов и собственно пишите сам диалог. В конце диалога флаг обнуляете.
Упс, не заметил, что Dimus уже написал это.
 

Test Level

Участник форума
Регистрация
1 Ноя 2011
Сообщения
1.771
Благодарности
557
Баллы
275
Если я не ошибаюсь гильдию не нужно трогать для монстра что бы написать для него диалог. Для примера смотрите диалог с драконами. Сперва ставите флаг, что у демона нет врагов и собственно пишите сам диалог. В конце диалога флаг обнуляете.
Упс, не заметил, что Dimus уже написал это.


Получилось так (подсмотрел в диалогах с призраками рудокопов). Монстру прописал:
Код:
aivar[AIV_EnemyOverride] = TRUE;

и в диалоге:
Код:
self.aivar[AIV_EnemyOverride] = FALSE;
Теперь работает.


ВОПРОС.

Задался таким вопросом. Имею самый простенький диалог на взятие квеста. Начинаю этот диалог и появляется соответствующая запись в дневнике. Так вот, как сделать, чтоб запись появлялась только после окончания диалога, а не во время его?
 

Haart

Участник форума
Регистрация
24 Окт 2011
Сообщения
188
Благодарности
106
Баллы
185
Хм, такой вопрос, можно ли привязать появление нпц-вещи, к поднятой вещи ? Ну, т.е. вот подбираю я к примеру определенную вещь и тут же на нужных мне вейпоинтах появляются монстры или вещи...
Как привязать открытию сундука, убийству или диалогу я знаю, а вот так... подскажите плиз.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.337
Благодарности
3.182
Баллы
525
можно ли привязать появление нпц-вещи, к поднятой вещи

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

Тогда остаётся вариант циклической функции, в которой периодически контролируется наличие нужного предмета в инвентаре ГГ. Разумеется, предмет должен быть уникальным.

Так вот, как сделать, чтоб запись появлялась только после окончания диалога, а не во время его?

Вопрос ещё актуален?
 

Haart

Участник форума
Регистрация
24 Окт 2011
Сообщения
188
Благодарности
106
Баллы
185
Ок, а такой вопрос. Где взять скрипт функцию критического удара одноручного оружия ? Меня вот что интересует, это вообще в скриптах прописано, или сам движок обрабатывает ?
 

redleha


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

Вообще сам движок обрабатывает, в зависимости от умения владения оружием.
 

clumb

Участник форума
Регистрация
21 Июн 2010
Сообщения
302
Благодарности
13
Баллы
180
Я создал функцию расписания для НПС, суть: НПС крадётся к нужному вэйпоинту и там стоит , осматривается, подбирает предметы (делаит вид через PlayAni), затем идёт к другому ВП, там осматривается, а затем идёт на прошлый вп и всё по новой. Но при тестировании функции, я заметил что с НПС нельзя разговаривать, кликаешь на него а диалог не начинается, как это исправить? Скрипт в спойлере.
func void zs_Thief1()
{
AI_PlayAni (self, "T_SEARCH");
Npc_SetRefuseTalk (self, 400);
AI_SetWalkMode(self,NPC_SNEAK);
AI_GotoWP (self, "OCR_HUT_43B");
};

func void zs_Thief1_loop()
{
if (Npc_GetDistToWP (self, "OCR_HUT_43B") <= 400)
{
AI_PlayAni (self, "T_SEARCH");
AI_Wait (self, 1);
AI_Wait (self, 1);
AI_Wait (self, 1);
AI_Wait (self, 1);
AI_Wait (self, 1);
AI_PlayAni (self, "T_PLUNDER");
AI_Output (self, NULL, "SVM_2_ITakeYourWeapon"); //Я возьму это!
AI_PlayAni (self, "T_SEARCH");
AI_Wait (self, 1);
AI_Wait (self, 1);
AI_Wait (self, 1);
AI_Wait (self, 1);
AI_Wait (self, 1);
AI_PlayAni (self, "T_PLUNDER");
AI_Output (self, NULL, "SVM_3_YeahWellDone"); //Да! Отлично!
AI_PlayAni (self, "T_PLUNDER");
AI_SetWalkMode(self,NPC_Walk);
AI_GotoWP (self, "OCR_HUT_43");

}
if (Npc_GetDistToWP (self, "OCR_HUT_43") <= 400)
{
AI_Wait (self, 1);
AI_Wait (self, 1);
AI_Wait (self, 1);
AI_Wait (self, 1);
AI_PlayAni (self, "T_SEARCH");
AI_Output (self, NULL, "SVM_3_YeahWellDone"); //Да! Отлично!
AI_SetWalkMode(self,NPC_SNEAK);
AI_GotoWP (self, "OCR_HUT_43B");
}
else
{

};
};

func void zs_Thief1_end()
{
PrintDebugNpc (PD_TA_FRAME, "ZS_Thief1_End");
};
 

redleha


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

prostoaccount

Участник форума
Регистрация
22 Окт 2010
Сообщения
1.394
Благодарности
114
Баллы
235
Нужно, чтобы при вырубании НПС или игрока тот лежал вечно. Не спрашивайте, для чего, просто помогите с реализацией.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.337
Благодарности
3.182
Баллы
525
помогите с реализацией

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

Если нужно сделать так, чтобы непись валялся и после того, как ГГ отойдёт от него и снова подойдёт, то потребуются танцы с бубном. И не факт, что это будет нормально работать, ведь вырубить непися можно в произвольной точке, а привязать его местонахождения можно только к WP.
 

MaGoth

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

kraw


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