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

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

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

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

MaGoth

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

Вложения

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

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Saturas
Поройся в файле VisualFX.DAT и может поймешь что я имею в виду
Поделился бы опытом, что и где искать. :)
 

DEDROIT


Модостроитель
Регистрация
8 Ноя 2005
Сообщения
424
Благодарности
993
Баллы
235
Вопрос с тем, чтобы ГГ появился ночью удалось решить. Причём очень просто. Нужно было всего на всего прописать в ini файле, например, force_Parameters="-time:23:55"
Но теперь возник новый вопрос.
Мне нужно, чтобы нужный мне НПС, после определённого момента, телепортнулся к ГГ..
Пробывал воспользоваться функцией:
B_StartOtherRoutine(none_200_Scar,"KillHero"
AI_Teleport(none_200_Scar,Npc_GetNextWP(hero));
Распорядок дня сработал, но вот телепорт нет.
 
Последнее редактирование модератором:

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.238
Благодарности
2.579
Баллы
455
DEDROIT
А у тебя там в определенный момент рядом с ГГ есть сетка с вейпоинтами? Не лучше ли сделать абсолютную цель для телепортации, чтобы впоследствии не было с этим проблем.
 

DEDROIT


Модостроитель
Регистрация
8 Ноя 2005
Сообщения
424
Благодарности
993
Баллы
235
ukur
Сетка есть. Что имеется ввиду под абсолютной? Конкретный веппоинт? Если да, то не могу его указать, так как не знаю где ГГ будет находится в это время.
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.238
Благодарности
2.579
Баллы
455
DEDROIT написал(а):
ukur
Конкретный веппоинт? Если да, то не могу его указать, так как не знаю где ГГ будет находится в это время.
Думаю, всегда можно придумать как ограничить ГГ в пространстве, например ГГ заходит в комнату за ним закрывается дверь... Но если уж так нужно.
Играл в один мод, название не помню. Там новый ГГ сражался со старым, который типа стал злым. Ну старый ГГ все время использовал телепортацию для перемещения по пространству. Помоему тоже самое было в Безымянном моде, когда ГГ сражался с темным магом в Храме Спящего.
Но! Там враг был в поле видимости и уже был инициализирован движком, а невидимые враги как ты знаешь, временно упакованы движком и думаю не все функции могут получить доступ к таким НПЦ.

Попробуй инициализировать требуемого НПЦ церез глобальную переменную.
var C_Npc Scar;
B_InitNpcGlobals()
Scar = Hlp_GetNpc(none_200_Scar);

и эту переменную потом вызывать в:
B_StartOtherRoutine(Scar,"KillHero");
AI_Teleport(Scar,Npc_GetNextWP(hero));
 
Последнее редактирование модератором:

Друид

Участник форума
Регистрация
21 Ноя 2009
Сообщения
1.169
Благодарности
395
Баллы
285
Всем привет.
Подскажите по такому вопросу:
Происходит диалог в таверне с одним неписем. Во время диалога респаунится стражник, вбегает в таверну и вклинивается в разговор.
Реализую так: появляется страж (в стороне) используется функция B_StartOtherRoutine - он бежит в таверну. Когда заходит - диалог с первым неписем обрывается, но этот стражник, поворачивается задницей и входит в диалог не сразу - а когда обратит внимание на ГГ. Как реализовать так, чтобы диалог прерывался только на мгновение? И возможно ли сделать проще - чтобы вообще 3 непися разговаривали сразу?
Пытался использовать AI_LookAtNpc(PAL_1012_Ritter,hero) но толку никакого - как и AI_GotoNpc(self,other); работает только когда диалог активен с данным неписем.
 

kraw


Модостроитель
Регистрация
11 Окт 2005
Сообщения
2.095
Благодарности
871
Баллы
295
Black Djinn написал(а):
И возможно ли сделать проще - чтобы вообще 3 непися разговаривали сразу?
Пытался использовать AI_LookAtNpc(PAL_1012_Ritter,hero) но толку никакого - как и AI_GotoNpc(self,other); работает только когда диалог активен с данным неписем.

Возможно. Я так сделал в "Народе Миненталя". Но там нужно много шаманить и здорово увязывать действия персонажей, т. к. движок синхронизирует только 2-х персонажей, один из которых ГГ. А остальные идут асинхронно.

Приведу в качестве примера фрагмент кода:

идет диалог с Чани. Добавляются еще 3 персонажа

.......
AI_WaitTillEnd(npc1319, npc1337);
AI_TurnToNPC(npc1319, self);
AI_Output(npc1319, NULL, "DIA_Chani_friends1_27"); //Ладно. Можешь проваливать.

AI_WaitTillEnd(self, npc1319);
AI_Output(self,other,"DIA_Chani_friends1_28"); //А Гуго твои слова передать?

AI_WaitTillEnd(npc1319, self);
AI_Output(npc1319, NULL,"DIA_Chani_friends1_29"); //Какие слова? Я ничего такого не говорил.

AI_WaitTillEnd(self, npc1319);
AI_Output(self, other,"DIA_Chani_friends1_30"); //Ну что ты плевал на него...

AI_WaitTillEnd(npc1319, self);
AI_Output(npc1319, NULL,"DIA_Chani_friends1_31"); //Не говорил я этого. Тебе показалось.

AI_WaitTillEnd(self, npc1319);
AI_Output(self,other,"DIA_Chani_friends1_32"); //А это уже Гуго решать будет, говорил ты или нет. Ну так что? Передать?

AI_WaitTillEnd(npc1319, self);
AI_Output(npc1319, NULL,"DIA_Chani_friends1_33"); //Не надо.

Но такие диалоги нужно очень хорошо отлаживать. На любой чих они рассыпаются.
 
Последнее редактирование модератором:

Мільтен

Участник форума
Регистрация
27 Июн 2008
Сообщения
862
Благодарности
427
Баллы
265
Такой вопрос возник: если ГГ - паладин, а некий НПС - бандит, но отношение бандита как НПС дружелюбное, будет ли он атаковать ГГ? То есть что в игре стоит выше: отношение между гильдией ГГ и гильдией НПС или персональное отношение НПС к ГГ?
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.238
Благодарности
2.579
Баллы
455
Мільтен написал(а):
Такой вопрос возник: если ГГ - паладин, а некий НПС - бандит, но отношение бандита как НПС дружелюбное, будет ли он атаковать ГГ? То есть что в игре стоит выше: отношение между гильдией ГГ и гильдией НПС или персональное отношение НПС к ГГ?
Гильдия выше. Но кроме этого есть еще "флаг терпимости"- AIV_EnemyOverride, т.е. когда бандиты не атакуют ГГ, пока он сам не спровоцирует, кроме того, как"флаг терпимости"в аддоне может выступать бандитская броня. А вообще гильдия и отношения - это всего лишь переменные, контролируемые через функции восприятия и все исключения из правил задаются собственно в них: функция восприятии противника - B_AssessEnemy.d и ГГ - B_AssessPlayer.d
 
Последнее редактирование модератором:

DEDROIT


Модостроитель
Регистрация
8 Ноя 2005
Сообщения
424
Благодарности
993
Баллы
235
Возник очередной вопрос.
Как заставить Орка-охранника после например вхождения в тригер заснуть и не реагировать на ГГ?
Пробывал для начала после диалоги(чтобы протестить) сделать следующее:
AI_StartState(Orc_2000,ZS_MagicSleep,0,"");
Но когда я прибегаю к нему, сна и в помине нет.
Пробывал убрать ему восприятия(а потом уже хотел сделать чтобы он спал):
Npc_PercEnable(Orc_2000,PERC_ASSESSPLAYER,B_AssessPlayer);
Npc_PercEnable(Orc_2000,PERC_ASSESSENEMY,B_AssessEnemy);
Убирал воспроятий намного больше, но на ГГ Орк так и продолжает реагировать.
Есть у кого-нить идеи, как можно заставить орка не реагировать на ГГ(а именно не лезть к нему со своим диалогом) и чтобы он находился в состоянии сна(пробывал распорядок дня ему менять на новый, где он должен спать и при этом убираются восприятия, но всё равно на ГГ реагирует) ?
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.238
Благодарности
2.579
Баллы
455
DEDROIT
Я так понял, на диалоге орка стоит флаг Important, если он обращается к ГГ сам? Тогда почему бы не поставить в условие диалога этот самый триггер.

Если ты используешь для орка состояния человеческих TA распорядков, например TA_Sleep, то соответствующая функция Zs_Sleep имеет в себе стандартный набор включенных восприятий Perception_Set_Normal(); как и многие другие функции.
 

DEDROIT


Модостроитель
Регистрация
8 Ноя 2005
Сообщения
424
Благодарности
993
Баллы
235
ukur
Что-то я ступил.. Сделал новый распорядок дня(где Орк спит) и при вхождение в тригер срабатывает этот распорядок + нарушает условие, которое вызывает диалог.
 

Друид

Участник форума
Регистрация
21 Ноя 2009
Сообщения
1.169
Благодарности
395
Баллы
285
При первом запуске игры (до перезагрузки винды) и начале заскрипченного мной квеста игра тормозит на несколько секунд. Потом идет нормально. Если даже перегрузить готику (но не перегружать винду), то квест после этого начинается без тормозов.
Это как-нибудь лечится?

Можно ли сделать так, чтобы определенный непись стоял в одном месте сутки, а потом сам менял свое расписание и уходил прочь?

Как сделать запись в дневник, сразу после того как ГГ прикончил определенного непися? Возможно ли это?

Можно ли удалить из контейнера предмет? Команда, которая удаляет его из мира тут бессильна. :(
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.238
Благодарности
2.579
Баллы
455
Black Djinn написал(а):
При первом запуске игры (до перезагрузки винды) и начале заскрипченного мной квеста игра тормозит на несколько секунд. Потом идет нормально. Если даже перегрузить готику (но не перегружать винду), то квест после этого начинается без тормозов.
Это как-нибудь лечится?
А твой скрипт телепатией представлять?

Black Djinn написал(а):
Можно ли сделать так, чтобы определенный непись стоял в одном месте сутки, а потом сам менял свое расписание и уходил прочь?
Можно, распорядки дня задаются у любого НПЦ, открывай и смотри.

Black Djinn написал(а):
Как сделать запись в дневник, сразу после того как ГГ прикончил определенного непися? Возможно ли это?
Смотри функцию Zs_dead, вызывается после смерти любого НПЦ.

Black Djinn написал(а):
Можно ли удалить из контейнера предмет? Команда, которая удаляет его из мира тут бессильна. :(
Можно добавлять.
void Mob_CreateItems (string mobName, int itemInstance, int amount); - создает в контейнере с именем mobName (например сундук) предметы с ID itemInstance количеством amount.
 
Последнее редактирование модератором:

Друид

Участник форума
Регистрация
21 Ноя 2009
Сообщения
1.169
Благодарности
395
Баллы
285
А твой скрипт телепатией представлять?
Эм... я как бы новичок, поэтому переспрошу - какие файлы конкретно нужно предоставить?
Впрочем, у меня тормоза начались сразу после этого (диалог с Ксардасом):
instance DIA_Xardas_HI3(C_Info)
{
npc = NONE_100_Xardas;
nr = 99;
condition = DIA_Xardas_HI3_Condition;
information = DIA_Xardas_HI3_Info;
permanent = FALSE;
important = TRUE;

};

func int DIA_Xardas_HI3_Condition()
{
return TRUE;
};

func void DIA_Xardas_HI3_Info()
{
AI_Output(self,other,"DIA_Xardas_HI3_04_00"); // Да, чуть было не запамятовал, еще кое-что!
AI_Output(other,self,"DIA_Xardas_HI3_15_00"); // В чем дело?
AI_Output(self,other,"DIA_Xardas_HI3_04_01"); // Холан передает, что хочет встретиться с тобой.
AI_Output(other,self,"DIA_Xardas_HI3_15_01"); // Где?
AI_Output(self,other,"DIA_Xardas_HI3_04_02"); // Не знаю. Тебе ведь известно, что он большой любитель тайн и загадок… Впрочем, в нашем деле это очень полезно.
AI_Output(other,self,"DIA_Xardas_HI3_15_02"); // Но как же я узнаю место встречи?
AI_Output(self,other,"DIA_Xardas_HI3_04_03"); // Холан оставит для тебя записку в... хм... тайном месте.
AI_Output(other,self,"DIA_Xardas_HI3_15_03"); // Это под деревом за казармой что ли?
AI_Output(self,other,"DIA_Xardas_HI3_04_04"); // Нет. Я не знаю, что там у вас с ним было под деревом, но для тайника он выбрал действительно неожиданное место.
AI_Output(self,other,"DIA_Xardas_HI3_04_05"); // Он оставит записку на складе паладинов, что за лавкой торговца Маттео. Она должна лежать в одном из сундуков.
AI_Output(other,self,"DIA_Xardas_HI3_15_05"); // Действительно, остроумно!
Mob_CreateItems("CHEST_HOLAN",ITWr_Trustme_Holan_Wrt,1);
B_StartOtherRoutine(MIL_1011_Holan,"Trustme_Holan");
Log_CreateTopic(TOPIC_Trustme,LOG_MISSION);
MIS_Trustme = LOG_Running;
Log_SetTopicStatus(TOPIC_Trustme,LOG_Running); // дневник
B_LogEntry(TOPIC_Trustme,"Может заглянуть на склад паладинов, где Холан должен оставить для меня записку?"); // запись в дневник
AI_StopProcessInfos (self); // после реплики сам выходит из диалога
};

НО: тормозит ТОЛЬКО в первый раз после перезагрузки готы, в любом месте квеста, если с сейва.
Если перегрузить винду и запустить готу - снова в первый раз тормоза на пару сек.

Можно, распорядки дня задаются у любого НПЦ, открывай и смотри.
Мне нужно чтобы изменил распорядок... Значит, там можно это сделать через условие Wld_GetDays ?

void Mob_CreateItems (string mobName, int itemInstance, int amount); - создает в контейнере с именем mobName (например сундук) предметы с ID itemInstance количеством amount.
Добавить-то добавил, но вот после определенной ситуации, нужно чтобы исчезла...
или можно добавить "-1"предметов? :eek:
 
Последнее редактирование модератором:

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.803
Баллы
995
Black Djinn написал(а):
При первом запуске игры (до перезагрузки винды) и начале заскрипченного мной квеста игра тормозит на несколько секунд. Потом идет нормально. Если даже перегрузить готику (но не перегружать винду), то квест после этого начинается без тормозов.
Это как-нибудь лечится?
Возможно не правильно написан скрипт.

Можно ли сделать так, чтобы определенный непись стоял в одном месте сутки, а потом сам менял свое расписание и уходил прочь?
Можно, делаешь одно расписание где НПС стоит в определенной точке сутки, затем второе расписание для следующего дня, ну и меняй их...

Как сделать запись в дневник, сразу после того как ГГ прикончил определенного непися? Возможно ли это?
Можно, через файл .\AI\Human\ZS_Human\ZS_Dead.d
В нем прописывай свою живность, с записью в дневник после ее смерти.
 
Последнее редактирование модератором:

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.238
Благодарности
2.579
Баллы
455
Black Djinn написал(а):
Эм... я как бы новичок, поэтому переспрошу - какие файлы конкретно нужно предоставить?
Впрочем, у меня тормоза начались сразу после этого (диалог с Ксардасом):
Странно, судя по контексту диалога - эта не первая встреча ГГ с Ксардасом, а условия на начало диалога нет вообще.. Кстати, пробела в диалогах между фразой и // быть не должно. Проблемы с тормозами могут быть в любом скрипте, и не только зависеть от скриптов, но и от ошибок в локации. Чтобы локализовать проблему, иногда приходится перепроверять все.

Black Djinn написал(а):
Мне нужно чтобы изменил распорядок... Значит, там можно это сделать через условие Wld_GetDays ?
Условие можешь ставить любое, смена распорядка осуществляется функцией B_StartOtherRoutine(нпц,"РАСПОРЯДОК"), например StartOtherRoutine(lester,"FORTRESSWAIT");

Black Djinn написал(а):
Добавить-то добавил, но вот после определенной ситуации, нужно чтобы исчезла...
или можно добавить "-1"предметов? :eek:
Нет, -1 не сработает. А смысл, добавлять предмет, чтобы потом удалить? Ведь если ГГ уже обчистит контейнер, нечего и будет удалять.
 
Последнее редактирование модератором:

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.803
Баллы
995
Мне нужно чтобы изменил распорядок... Значит, там можно это сделать через условие Wld_GetDays?
Нет, не так.
Например задано условие, для его проверки ставим какой нибудь диалог, в нем прописываем смену расписания, например так:
B_StartOtherRoutine(KDF_1169_Balar,"Begin1");
где - Begin1 твое новое расписание, а KDF_1169_Balar инстанция Непеся.

Добавить-то добавил, но вот после определенной ситуации, нужно чтобы исчезла...
Попробуй обратную логику, например:
Код:
void Mob_RemoveItems (string mobName, int itemInstance, int amount);
Хотя не уверен что сработает... ::)
 
Последнее редактирование модератором:

Друид

Участник форума
Регистрация
21 Ноя 2009
Сообщения
1.169
Благодарности
395
Баллы
285
MaGoth, ukur, насчет тормозов - сделал дефрагментацию диска - все проходит быстро (ну может совсем чуток притормаживает - почти не видно).

Можно, делаешь одно расписание где НПС стоит в определенной точке сутки, затем второе расписание для следующего дня, ну и меняй их...
А, мне нужно чтобы он ушел с концами, так можно??
То есть стоит в этой точне сутки, если день+1 - берет и уходит на другую - и его уже ГГ не встретит, а значит, провалит квест.
Если бы это в квесте можно было привязать к конкретному диалогу с другим ключевым неписем - вопроса бы не возникло.

MaGoth
Попробуй обратную логику, например:
Код: [Выделить]
void Mob_RemoveItems (string mobName, int itemInstance, int amount);
Хотя не уверен что сработает...
уже пробовал, не вышло :)

ukur
А смысл, добавлять предмет, чтобы потом удалить? Ведь если ГГ уже обчистит контейнер, нечего и будет удалять.
Смысл такой: подкинули в сундучок записку. Если ее забрать - то нифига. А если оставить - находим после сдачи квеста награду. Обломно находить там еще и свою записку - лучше бы ее якобы забрали.

if(Mob_HasItems ("THIEF_JOE",ITWr_Trustme_Nexs_Wrt) == 1)
{
Mob_CreateItems("THIEF_JOE",ITWr_Trustme_Thief_Wrt,1);
Mob_CreateItems("THIEF_JOE",ItMi_Gold,200);
};

ЗЫ:
Странно, судя по контексту диалога - эта не первая встреча ГГ с Ксардасом, а условия на начало диалога нет вообще..
Это тестовый квест. Ксардас дает его сразу после разговора про глаз.
 
Последнее редактирование модератором:

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.238
Благодарности
2.579
Баллы
455
MaGoth написал(а):
Попробуй обратную логику, например:
Код:
void Mob_RemoveItems (string mobName, int itemInstance, int amount);
Хотя не уверен что сработает... ::)
Правильно что не уверен, такой функции в екзешнике нет ;)

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

Black Djinn написал(а):
Если бы это в квесте можно было привязать к конкретному диалогу с другим ключевым неписем - вопроса бы не возникло.
Дык, если бы ты изучил для начала оригинальную игру, вопросов было бы еще меньше. Кто мешает привязать функцию смены распорядка B_StartOtherRoutine(нпц,"РАСПОРЯДОК"); к диалогу?

Black Djinn написал(а):
Смысл такой: подкинули в сундучок записку. Если ее забрать - то нифига. А если оставить - находим после сдачи квеста награду. Обломно находить там еще и свою записку - лучше бы ее якобы забрали.
Ну придется пересмотреть квест, т.к. удалять предметы из контейнера низя.
 
Последнее редактирование модератором:
Сверху Снизу