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

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!

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

MaGoth

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

Вложения

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

Друид

Участник форума
Регистрация
21 Ноя 2009
Сообщения
1.170
Благодарности
398
Баллы
285
ukur
Дык, если бы ты изучил для начала оригинальную игру, вопросов было бы еще меньше. Кто мешает привязать функцию смены распорядка B_StartOtherRoutine(нпц,"РАСПОРЯДОК"); к диалогу?
Тю... не то сказал. Как раз таки мне и не нужно через диалог. Мне нужно, чтобы сам по себе - через определенное время. Через диалог - это я вкурил.
Можно ли в одном расписании сделать условие, чтобы через сутки непись его поменял на другое расписание?
Или, тут проще изменить сценарий...
Ну придется пересмотреть квест, т.к. удалять предметы из контейнера низя.
Ладно, пусть остается... тем более, это не отражается в дневнике - если только игрок сам догадается вернуться к сундуку.
 
Последнее редактирование модератором:

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
ukur написал(а):
Правильно что не уверен, такой функции в екзешнике нет ;)
Я это и так знаю, ибо эта функция в туторах Вама никогда не свитилась...

Black Djinn написал(а):
Тю... не то сказал. Как раз таки мне и не нужно через диалог. Мне нужно, чтобы сам по себе - через определенное время. Через диалог - это я вкурил.
Можно ли в одном расписании сделать условие, чтобы через сутки непись его поменял на другое расписание?
Или, тут проще изменить сценарий...
Именно так как ты хочешь возможно и получится сделать, но только с триггером. Тогда непесь сам по себе без диалогов будет менять свое расписание. Но это все теория, нужно код написать и тестить, тебе естественно.

Ладно, пусть остается... тем более, это не отражается в дневнике - если только игрок сам догадается вернуться к сундуку.
Можно попробовать немного другой вариант. Если записка в сундуке и Гг ее не брал, то при сдаче квеста попробуй создать какого ни будь левого Непеся и вставить его в мир возле сундука. Его расписание должно быть таким: подойти к сундуку и забрать записку из него(при условии что Непеси вообще умеет брать предметы из сундуков). Далее, отслеживаем наличие у Нпс записки в инвентаре и как только она у него появится, запускается триггер по ликвидации этого НПС из мира, или отправкой в ТОТ, например.
Но это только теория, а как будет на практике проверять нужно. :)
 
Последнее редактирование модератором:

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
MaGoth написал(а):
Я это и так знаю, ибо эта функция в туторах Вама никогда не свитилась...
Зачем же постом выше предлагал? :D

MaGoth написал(а):
Можно попробовать немного другой вариант. Если записка в сундуке и Гг ее не брал, то при сдаче квеста попробуй создать какого ни будь левого Непеся и вставить его в мир возле сундука. Его расписание должно быть таким: подойти к сундуку и забрать записку из него(при условии что Непеси вообще умеет брать предметы из сундуков). Далее, отслеживаем наличие у Нпс записки в инвентаре и как только она у него появится, запускается триггер по ликвидации этого НПС из мира, или отправкой в ТОТ, например.
Но это только теория, а как будет на практике проверять нужно. :)
На практике вариант бесполезен, именно из-за указанного тобой условия.
 
Последнее редактирование модератором:

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
ukur написал(а):
Зачем же постом выше предлагал?
Чтобы у человека была надежда, в его начинаниях...
 
Последнее редактирование модератором:

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
MaGoth написал(а):
Чтобы у человека была надежда, в его начинаниях...
Без комментариев *flowers*

Все же я дам дельный совет, как можно реализовать исчезновение записки.
Берется два мувера, и к каждому аттачится чайлдом по сундуку. В первый сундук помещается записка, а после отработки квеста сдвигается мувером вместе с первым сундуком под землю. Второй же сундук с наградой поднимается вторым мувером на место первого. Для игрока при ровных руках модостроителя подмена будет незаметна. Способ рабочий - проверял лично!
Кстати, тем же макаром можно реализовать и гробо кладокопание, как в Ризен с извлечением сундука из земли.
Про работу с муверами детально расписано в этой статье Работа с редактором мира Spacer (G2a)
 
Последнее редактирование модератором:

DeathKnight

Участник форума
Регистрация
1 Дек 2009
Сообщения
3
Благодарности
0
Баллы
145
ukur написал(а):
MaGoth написал(а):
Чтобы у человека была надежда, в его начинаниях...
Без комментариев *flowers*

Все же я дам дельный совет, как можно реализовать исчезновение записки.
Берется два мувера, и к каждому аттачится чайлдом по сундуку. В первый сундук помещается записка, а после отработки квеста сдвигается мувером вместе с первым сундуком под землю. Второй же сундук с наградой поднимается вторым мувером на место первого. Для игрока при ровных руках модостроителя подмена будет незаметна. Способ рабочий - проверял лично!
Кстати, тем же макаром можно реализовать и гробо кладокопание, как в Ризен с извлечением сундука из земли.
Про работу с муверами детально расписано в этой статье Работа с редактором мира Spacer (G2a)
А зачемже мувером? Есть же в двиге г2а функция
int Mob_HasItems (string mobName, int itemInstance); - получить количество предметов с ID itemInstance, находящихся в контейнере с именем mobName
Она позволяет убрать из контейнера один или более предметов и переложить как я понял комунить в инвертарь.
 
Последнее редактирование модератором:

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
DeathKnight написал(а):
А зачемже мувером? Есть же в двиге г2а функция
int Mob_HasItems (string mobName, int itemInstance); - получить количество предметов с ID itemInstance, находящихся в контейнере с именем mobName
Она позволяет убрать из контейнера один или более предметов и переложить как я понял комунить в инвертарь.
Да неужели? А мне почему-то кажется что эта функция только сообщает о количестве предметов в контейнере и более никаких действий с ними не производит. Все остальное - твои фантазии, как уже говорил:
MaGoth написал(а):
Чтобы у человека была надежда, в его начинаниях...
 
Последнее редактирование модератором:

DeathKnight

Участник форума
Регистрация
1 Дек 2009
Сообщения
3
Благодарности
0
Баллы
145
ukur написал(а):
DeathKnight написал(а):
А зачемже мувером? Есть же в двиге г2а функция
int Mob_HasItems (string mobName, int itemInstance); - получить количество предметов с ID itemInstance, находящихся в контейнере с именем mobName
Она позволяет убрать из контейнера один или более предметов и переложить как я понял комунить в инвертарь.
Да неужели? А мне почему-то кажется что эта функция только сообщает о количестве предметов в контейнере и более никаких действий с ними не производит. Все остальное - твои фантазии, как уже говорил:
MaGoth написал(а):
Чтобы у человека была надежда, в его начинаниях...
Да верно я протупил просто) тогда буит прще завязать на на мувере по тригер скрипту чтобы в определенное время один ящик убирался другой появлялся.
 
Последнее редактирование модератором:

Друид

Участник форума
Регистрация
21 Ноя 2009
Сообщения
1.170
Благодарности
398
Баллы
285
Такая незадача:
После диалога - бой насмерть. Реализовал так:
self.flags = 0;
self.npcType = NPCTYPE_BL_MAIN;
self.guild = GIL_ZOMBIE;
AI_StopProcessInfos (self);
B_Attack(self,other,AR_SuddenEnemyInferno,2);
Все как положено - непись атакует, а затем - или ГГ или он умирает. Добивать, ясное дело, не нужно - мертвяк.
Но вот как-то случайно прохожий паладин (совсем издалека) заметил непися и помог завалить. :(
Как тут сделать, чтобы горожанина можно было завалять насмерть - но и чтобы посторонние не помогали?
Ставил гильдию бандюков - после победы нужно добить.

И еще вопрос, по этому же неписю.
В файле ZS_Dead
прописал в функции func void ZS_Dead()
if(Mis_Trustme == Log_Running) && (TOPIC_HOME3_Joe == TRUE)
{
B_LogEntry(TOPIC_Trustme,"Джо мертв.");

};
Сразу после смерти непися функция срабатывает и записывает в журнал о смерти. Как и задумано.
Но. Если непись валит ГГ-я - такая же запись в журнал.
Это лечится? Само собой - раз ГГ мертв, это уже неважно, но некрасиво как-то.

И еще: можно ли "утопить"непися?
Одна баба побежала топиться в Хоринисе, дык вместо того чтобы пойти ко дну - просто плавает на поверхности. Хоть и бессметрие с нее снял. :(
 
Последнее редактирование модератором:

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Просто поставь неписю aivar[AIV_DropDeadAndKill] = TRUE; и он будет дохнуть от обычного избиения, на Зомби гильдию менять не стоит :)

Реально утопить НПЦ вряд ли получиться, просто перемести жертву на вейпоинт и убей командой B_KillNpc(self);
 

GeorG

Участник форума
Регистрация
27 Авг 2008
Сообщения
3.447
Благодарности
11
Баллы
295
Black Djinn

Но вот как-то случайно прохожий паладин (совсем издалека) заметил непися и помог завалить.
Попробуй так:

Код:
	self.guild = GIL_NONE;
	Npc_SetTrueGuild(self,GIL_NONE);


И еще вопрос, по этому же неписю.
В файле ZS_Dead

Код:
if((Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Твой НПС) && (Mis_Trustme == Log_Running) && (TOPIC_HOME3_Joe == TRUE))
		{
           B_LogEntry(TOPIC_Trustme,"Джо мертв.");
		};
 
Последнее редактирование модератором:

Друид

Участник форума
Регистрация
21 Ноя 2009
Сообщения
1.170
Благодарности
398
Баллы
285
ukur
Реально утопить НПЦ вряд ли получиться, просто перемести жертву на вейпоинт и убей командой B_KillNpc(self);
А вот я решил сделать это через диалог:
Приходит баба на побережье и стоит у самой воды. Дальше:
instance DIA_Kira_JoeDead1(C_Info)
{
npc = VLK_2013_Kira;
nr = 1;
condition = DIA_Kira_JoeDead1_Condition;
information = DIA_Kira_JoeDead1_Info;
permanent = FALSE;
important = false;
description = "Я сожалею о случившимся.";
};
func int DIA_Kira_JoeDead1_Condition()
{
if((Npc_IsDead(VLK_448_Joe)) && (Mis_Trustme == Log_SUCCESS) && (Npc_GetDistToWP(self,"NW_KIRA_SINK1") <= 500))
{
return TRUE;
};
};
func void Dia_Kira_JoeDead1_Info()
{
AI_Output(other,self,"Dia_Kira_JoeDead1_15_01"); // Я сожалею о случившимся.
AI_Output(self,other,"Dia_Kira_JoeDead1_17_01"); // (рыдает) И что с того?! Как теперь помочь моему горю?!
AI_Output(other,self,"Dia_Kira_JoeDead1_15_02"); // Успокойся. И позаботься о себе: ты ведь еще жива.
AI_Output(self,other,"Dia_Kira_JoeDead1_17_02"); // (кричит) Ненавижу тебя! Это ты виноват! И мне не жить без моего Джо!
self.flags = 0;
AI_SetWalkmode (self,NPC_RUN);
AI_GotoWP (self,"NW_KIRA_SINK");
Info_AddChoice(Dia_Kira_JoeDead1,"Подожди, не делай этого!",DIA_Kira_JoeDead1_Sink);
};
func void DIA_Kira_JoeDead1_Sink()
{
AI_Output(other,self,"DIA_Kira_JoeDead1_Sink_15_21"); // Подожди, не делай этого!
AI_StopProcessInfos (self);
B_KillNpc(self);
Как только выбираю "Падажди!"- эта баба падает замертво и диалог висит... :(
Как бы выйти перед тем как она скопытится?
 
Последнее редактирование модератором:

kraw


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

xPALADIN

Участник форума
Регистрация
5 Ноя 2008
Сообщения
119
Благодарности
5
Баллы
175
Всегда раздражало, когда NPC упирается в стенку, дерево, но продолжает двигаться...

Решил покопаться в скриптах, параллельно почитывая про написание скриптов для готики. В связи с этим возникли следующие вопросы:
1) Есть ли функции для поворота NPC на заданный угол, получение координат объекта(x,y,z, поворот относительно осей x,y,z)?
2) Как воспринимаются такие объекты, как деревья, дома - как mob или как-то иначе?

Просмотрел мануал от Vam, но не нашел ничего такого. Хотя, может быть, плохо искал.
 

Magmatic Imperius

Участник форума
Регистрация
21 Апр 2009
Сообщения
85
Благодарности
10
Баллы
160
2) Как воспринимаются такие объекты, как деревья, дома - как mob или как-то иначе?
Деревья по большей части, как и абсолютно все дома, являются неотделимой частью меша уровня, они к нему приатачены намертво (или являются отдельным зеном вроде леса в районе Хоринисских пирамид). NPC воспринимают их только как препятствия, через которые им не пройти. Есть и мобовые деревья, вставляемые через спейсер. С этими можно творить больше всяких штук. Например, можно подсветить фокусом, и заставить непися атаковать какой-нибудь дуб, швырять в него файерболы или рубить мечом. )
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
1) Есть ли функции для поворота NPC на заданный угол, получение координат объекта(x,y,z, поворот относительно осей x,y,z)?
Такой функции нет. Есть только поворот к кому\чему-либо, и разворот на месте.

2) Как воспринимаются такие объекты, как деревья, дома - как mob или как-то иначе?
Если они вставлены как воб\моб объекты, они могут детектироваться через скриптовое восприятие с соответствующей функцией Npc_PercEnable(self,PERC_MOVEMOB,B_MoveMob);

Смотри B_MoveMob, там описано определение дверей и открывание оных НПЦ.

С этими можно творить больше всяких штук. Например, можно подсветить фокусом, и заставить непися атаковать какой-нибудь дуб, швырять в него файерболы или рубить мечом. )
Ух разогнался ;) Функция атаки не работает на вобы, только на НПЦ.
 

Bragi

Участник форума
Регистрация
5 Окт 2009
Сообщения
59
Благодарности
0
Баллы
155
не помню, задавал ли я какой то из этих вопросов уже, но если что, повторюсь.

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

2. опять таки, новый монстр, на этот раз сделан по образу кровавой мухи (тоже летун). в воде монстр дохнет сразу же, анимация плавания отсутствует (у мухи её тоже нет).
в то же время, муха по воде "летает", для неё вода - как земная поверхность.
Вот вопрос, чего такого не хватает новому монстру, чтоб он тоже "летал" по воде?
З.Ы. при вставке монстра в игру ВМЕСТО мухи, всё работает идеально...
 

Wallerstein

Участник форума
Регистрация
26 Апр 2009
Сообщения
965
Благодарности
24
Баллы
195
Рискну предположить, что ты не все параметры инстанции скопировал,поэтому муха тонет, а краулер не проходит.
 

alex_draven


Модостроитель
Регистрация
13 Сен 2007
Сообщения
2.183
Благодарности
2.880
Баллы
420
не помню, задавал ли я какой то из этих вопросов уже, но если что, повторюсь.

1. новосозданный монстр, по образу и подобию краулера\ползуна (и в структуре мдс, и, по идее, в скриптовом плане тоже) - не в состоянии преодолевать даже самые низкие препятствия.

2. в воде монстр дохнет
Вот вопрос, чего такого не хватает новому монстру, чтоб он тоже "летал" по воде?

Есть такой скрипт species.d. В нём прописаны все характеристики передвижения монстров и людей в зависимости от присвоенной гильдии.

Аналогично эти параметры можно вызвать из консоли командой ---edit species---

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

step=200

Также стоит убедиться, что у монстра есть анимация падения. Иначе толком его перемещение не отладить, особенно на наклонных поверхностях.
 

Друид

Участник форума
Регистрация
21 Ноя 2009
Сообщения
1.170
Благодарности
398
Баллы
285
Как заставить ГГ появиться при старте новой игры не в башне Ксардаса, а где-нибудь в другом месте, в Ярике например?
 
Сверху Снизу