|
|
03.10.2007, 05:37
|
#1841
|
|
Re: М: Скриптинг в Готике
2MaGoth:
Попробуй использовать проверку активного оружия перед торговлей
|
ммм... а как зовут нужную ф-ию вызова торговли? с наскоку не обнаружил :(
Хм.. кстати по поводу факелов, из всей их кучи используется именно один факел ;) прием он становится сгоревшим и отделяется мож тут еще стоит порыться как оно реализовано? Ведь при использовании факела, 10 факелов не иктивируются сразу, имхо. :))
|
но горящий факел в инвентаре не отображается. при активации кол-во уменьшается на один и все. я даже не понял, как его обратно засунуть. типа ночью поджег, утро наступило и приходится выкидывать.
Персонаж появляется обычно стоя, после того как вставится в мир запускается функция распорядка дня, определяющая выполнение распорядка дня для этого вейпоинта.
|
вот только что на пути в болотный лагерь встретил Гор (не помню как), который шел вместе со Стражем. встретил аккурат на полпути, у моста с гоблинами, было 3 часа дня. а утром шел обратно, и этот Гор возвращался в болотный лагерь (по слухам, он ходит в старый лагерь). или у этого персонажа путь состоит не из двух точек "начало" и "конец", а весь путь разбит на маленькие отрезки с временным указанием каждого из них? если бы я видел, как этот Гор уходил из болотного лагеря у самых ворот, а потом оказывался в старом лагере, то вроде все понятно. но получается, что каждый день в 3 часа дня он с напарником оказывается в одной и той же точке. и в итоге имеем, что игра проверяет все доступные вейпоинты в пределах досягаемости (видимости, слышимости) игрока, а потом смотрит, не надо ли в эту точку в текущее время кого-нить заспавнить. я прав, или куда-то не в ту сторону занесло?
|
|
|
03.10.2007, 16:44
|
#1842
|
|
|
|
|
A.G.F.C.
Регистрация: 04.09.2006
Сообщений: 20
|
|
|
|
|
|
Re: М: Скриптинг в Готике
Цитата:
Сообщение от HikeR link=board=gothic&t=1105030050&start=3769400#37694 05 date=10/03/07, в 04:37:17
2MaGoth: ммм... а как зовут нужную ф-ию вызова торговли? с наскоку не обнаружил :(
|
Функция тогровли прописывается через диалог, пример:
Cпойлер(щелкните, чтобы прочесть):
instance DIA_Zuris_WAREZ(C_Info) { * * *npc = VLK_409_Zuris; * * *nr = 2; * * *condition = DIA_Zuris_WAREZ_Condition; * * *information = DIA_Zuris_WAREZ_Info; * * *permanent = TRUE; * * *trade = TRUE; * * *description = "Покажи мне свои товары"; };
func int DIA_Zuris_WAREZ_Condition() { * * *return TRUE; };
func void DIA_Zuris_WAREZ_Info() { * * *B_GiveTradeInv(self); * * *AI_Output(other,self,"DIA_Zuris_WAREZ_15_00"); * * *//Покажи мне твои товары. * * *if((Zuris_einmal == FALSE) && !Npc_KnowsInfo(other,DIA_Zuris_Potions)) * * *{ * * * * * *AI_Output(self,other,"DIA_Zuris_GREET_14_02"); * * *//Буквально только что я получил новые снадобья. Дорогой гость, сам Мастер Дарон, маг Огня, доставил их мне из монастыря. * * * * * *Zuris_einmal = TRUE; * * *}; }; В объявлении инстанции диалога: * * *trade = TRUE;
но горящий факел в инвентаре не отображается. при активации кол-во уменьшается на один и все. я даже не понял, как его обратно засунуть. типа ночью поджег, утро наступило и приходится выкидывать.
|
;D... по утру открой инвентарь и нажми на факел иконку факелов которая там изображена, это если в инвентаре будут лежать несколько факелов а не один, с одним не работает он будет в руке. Иначе, при нажатии на факелы активный факел уберется в инвентарь в виде нового прогоревшего факела если до этого там такого нет.
вот только что на пути в болотный лагерь встретил Гор (не помню как), который шел вместе со Стражем. встретил аккурат на полпути, у моста с гоблинами, было 3 часа дня. а утром шел обратно, и этот Гор возвращался в болотный лагерь (по слухам, он ходит в старый лагерь). или у этого персонажа путь состоит не из двух точек "начало" и "конец", а весь путь разбит на маленькие отрезки с временным указанием каждого из них? если бы я видел, как этот Гор уходил из болотного лагеря у самых ворот, а потом оказывался в старом лагере, то вроде все понятно. но получается, что каждый день в 3 часа дня он с напарником оказывается в одной и той же точке. и в итоге имеем, что игра проверяет все доступные вейпоинты в пределах досягаемости (видимости, слышимости) игрока, а потом смотрит, не надо ли в эту точку в текущее время кого-нить заспавнить.
|
я прав, или куда-то не в ту сторону занесло?
|
Открой скрипты. и глянь вейпоинты в распорядке, и тебе будет все ясно. :)) Вот примерчик:
Cпойлер(щелкните, чтобы прочесть):
При запуске распорядка: func void Rtn_Start_777() { * * *TA_Sit_Throne(2,35,22,50,"NW_CITY_BANDA_2"); //сидит на троне * * *TA_FleeToWp(22,50,23,0,"NW_CITY_HABOUR_TAVERN01_0 8"); //после чего перемещается в таверну. * * *TA_Sit_Chair(23,0,2,30,"NW_CITY_HABOUR_TAVERN01_0 8"); //устраивается там садясь за стол, стул и т.д. * * *TA_FleeToWp(2,30,2,35,"NW_CITY_BANDA_2"); //после товерны перемещается назад к себе в бандитский квартал }; Все это просисходит мгновенно если рядом нет Гг, если Гг есть то мона видеть как он идет, бежит, и т.д. выполняя рутину в соответствии с распорядком Нпс.
Добавление от 10/03/07, в 15:49:14
Да и еще, то что продается т.е. товары в инвентаре непесей торговцев прописываются в этой папочке: F:\Program Files\GothicSourcer V3.14\Gothic Projects\SolGlobal1.13\SolGlobal\PrjGothic\Story\B _GiveTradeInv Для примера файл Нпс Зурис: B_GiveTradeInv_Zuris.d Диск твой. ;)
|
|
|
03.10.2007, 17:09
|
#1843
|
|
Re: М: Скриптинг в Готике
Такой вопрос: Как вставить новую музыку в Г2а?.. Я просмотрел скрипт MusicInst.d, там есть инстанции музыки из Г1
Cпойлер(щелкните, чтобы прочесть):
// --- INEXTREMO ----
INSTANCE IE_Day_Std (C_MUSICTHEME_DEF) { file = "oc_day_std.sgt"; }; INSTANCE IE_Ngt_Std (C_MUSICTHEME_DEF) { file = "cam_ngt_std.sgt"; };
INSTANCE IE_Day_Thr (C_MUSICTHEME_DEF) { file = "oc_day_std.sgt"; };
INSTANCE IE_Day_Fgt (C_MUSICTHEME_DEF) { file = "oc_day_fgt.sgt"; };
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX // XXXXXXXX N E W C A M P [NCO_/NCI_] XXXXXXXX // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// Plateau davor
INSTANCE NCO_Day_Std (C_MUSICTHEME_DEF) { file = "cam_day_std.sgt"; transType = TRANSITION_TYPE_BREAK; transSubType = TRANSITION_SUB_TYPE_MEASURE; }; INSTANCE NCO_Day_Thr (C_MUSICTHEME_DEF) { file = "cam_day_thr.sgt"; transType = TRANSITION_TYPE_BREAK; transSubType = TRANSITION_SUB_TYPE_MEASURE; };
INSTANCE NCO_Day_Fgt (C_MUSICTHEME_DEF) { file = "cam_day_fgt.sgt"; transType = TRANSITION_TYPE_FILL; transSubType = TRANSITION_SUB_TYPE_MEASURE; };
INSTANCE NCO_Ngt_Std (C_MUSICTHEME_DEF) { file = "cam_ngt_std.sgt"; }; INSTANCE NCO_Ngt_Thr (C_MUSICTHEME_DEF) { file = "cam_ngt_std.sgt"; }; INSTANCE NCO_Ngt_Fgt (C_MUSICTHEME_DEF) { file = "cam_ngt_std.sgt"; };
// Hцhle
INSTANCE NCI_Day_Std (C_MUSICTHEME_DEF) { file = "nci_day_std.sgt"; transType = TRANSITION_TYPE_BREAK; transSubType = TRANSITION_SUB_TYPE_MEASURE; };
INSTANCE NCI_Day_Thr (C_MUSICTHEME_DEF) { file = "nci_day_std.sgt"; transType = TRANSITION_TYPE_BREAK; transSubType = TRANSITION_SUB_TYPE_MEASURE; };
INSTANCE NCI_Day_Fgt (C_MUSICTHEME_DEF) { file = "nci_day_fgt.sgt"; transType = TRANSITION_TYPE_FILL; transSubType = TRANSITION_SUB_TYPE_MEASURE; }; INSTANCE NCI_Ngt_Std (C_MUSICTHEME_DEF) { file = "nci_day_std.sgt"; }; INSTANCE NCI_Ngt_Thr (C_MUSICTHEME_DEF) { file = "nci_day_std.sgt"; }; INSTANCE NCI_Ngt_Fgt (C_MUSICTHEME_DEF) { file = "nci_day_fgt.sgt"; transType = TRANSITION_TYPE_FILL;
, а мне как раз надо её оттуда вставить. Я вставил файлы музыки из Г1 в папку _work\data\music\newworld И на всяк случай сделал папку _work\data\musik\orchestra - такая папка была в Г1. Далее я прописал инстанцию нужной мне музыки в спейсере, но музыка не играет :(. Может кто-нидь уже добавлял с игру свою музыку, и знает как это делать?..
|
|
|
03.10.2007, 18:34
|
#1844
|
|
Re: М: Скриптинг в Готике
2MaGoth:
Да и еще, то что продается т.е. товары в инвентаре непесей торговцев прописываются в этой папочке: F:\Program Files\GothicSourcer V3.14\Gothic Projects\SolGlobal1.13\SolGlobal\PrjGothic\Story\B _GiveTradeInv
|
это из мода? в первой готике такого нет. есть только скрипты вида B_Give_(имя_торговца)(Weapons|Runes), в которых прописан ассортимент в зависимости от главы. но ход мыслей понятен ;)
Функция тогровли прописывается через диалог, пример:
|
это получается, что поменять в одном месте нельзя, придется у ВСЕХ торговцев прописывать скрипт снятия оружия :(
|
|
|
03.10.2007, 19:08
|
#1845
|
|
|
|
|
A.G.F.C.
Регистрация: 04.09.2006
Сообщений: 20
|
|
|
|
|
|
Re: М: Скриптинг в Готике
2SMErtNIK: Побегай по страницам, темы 1000 раз уже описывалось как вставить Ин-Екстремо. ;)) 2HikeR:
это из мода? в первой готике такого нет. есть только скрипты вида B_Give_(имя_торговца)(Weapons|Runes), в которых прописан ассортимент в зависимости от главы. но ход мыслей понятен
|
Да, Глобал на Г2-НВ, но скрипт показывал оригинала Готы 2.
это получается, что поменять в одном месте нельзя, придется у ВСЕХ торговцев прописывать скрипт снятия оружия
|
Да именно так у всех прописывать.
|
|
|
03.10.2007, 20:44
|
#1846
|
|
Re: М: Скриптинг в Готике
2MaGoth:
Попробуй использовать проверку активного оружия перед торговлей, если оружие активно, т.е. взято Гг в руки, то снимай его функцией спрятать оружие, запуская одновременно торговлю. ;)
|
сделал проще:
Cпойлер(щелкните, чтобы прочесть):
func void Stt_311_Fisk_Trade_Info() { * * *AI_Output (other, self, "Stt_311_Fisk_Trade_15_00"); * * *//Покажи мне, что у тебя есть. * * *AI_UnequipWeapons(other); };
перед торговлей ВСЁ оружие снимается. проверять на активное и экипированное оружие имеет смысл для того, чтобы по окончании торговли оно автоматом вешалось обратно. назревает вопрос: как поймать момент окончания торговли? тогда был бы такой алгоритм:
Cпойлер(щелкните, чтобы прочесть):
// перед торговлей - получить id экипированного оружия. - снять всё оружие - удалить одну единицу оружия из инвентаря (чтоб не продать в куче) // после торговли - добавить в инвертарь одну единицу оружия (ранее удаленного) - повесить его на ГГ
всё это я сделать могу. не могу отследить окончание торговли.
|
|
|
03.10.2007, 22:34
|
#1848
|
|
Re: М: Скриптинг в Готике
2MaGoth:
То что тебе нужно зашито в движок
|
жаль :( тогда придется остановится на изменении констант примерно так: const int ITEM_SWD = 1 << 14 + ITEM_MULTI;чтобы не менять для каждого оружия. ну и следить самому, чтобы не продать последний ;) и очень осторожный вопрос :) первая готика на движке второй - это реально? или сразу в "модостроение" уходить? с инвентарем там по крайней мере таких проблем нет. Добавление от 10/03/07, в 21:54:06
p.s. так и не понял, как включать в лог сообщения из ф-ий вида: PrintDebugNpc (PD_ZS_LOOP, "ZS_FollowModeWait_Loop"); даже при установке 10 уровня в логе только сообщения движка.
|
|
|
04.10.2007, 02:07
|
#1849
|
|
|
|
|
A.G.F.C.
Регистрация: 04.09.2006
Сообщений: 20
|
|
|
|
|
|
Re: М: Скриптинг в Готике
2HikeR:
тогда придется остановится на изменении констант примерно так: const int ITEM_SWD = 1 << 14 + ITEM_MULTI; чтобы не менять для каждого оружия. ну и следить самому, чтобы не продать последний
|
- тоже вариант. :)
и очень осторожный вопрос первая готика на движке второй - это реально? или сразу в "модостроение" уходить? с инвентарем там по крайней мере таких проблем нет.
|
- Да реально, и мод также уже делается, смотри эту тему: M1: STRONGHAND - MOD FOR GOTHIC особо в шапочке глянь. ;) Вообще моды на Г1 проблемно делать, очень неудобные скрипты постоянно приходится лезть в спейсер чтоб что-то править, да и багов полно. Единственное что нельзя пока перенести при партировании платформ, с Г1 на Г2 это: баррер, и некоторые виды магии типа телекинез. В остальном Г1 уже полностью портирована на платформу Г2, камрадами odin68 и Ukur. По функии лога не скажу, както не было нужды с этим возится.
|
|
|
04.10.2007, 02:20
|
#1850
|
|
Re: М: Скриптинг в Готике
Цитата:
Сообщение от SMErtNIK link=board=gothic&t=1105030050&start=3770375#37703 75 date=10/03/07, в 16:09:56
Такой вопрос: Как вставить новую музыку в Г2а?.. Может кто-нидь уже добавлял с игру свою музыку, и знает как это делать?..
|
*;) http://basilio58.worldofgothic.ru/Music.htm ;D ;D ;D ;D Удачи!
|
|
|
04.10.2007, 21:24
|
#1852
|
|
|
|
|
A.G.F.C.
Регистрация: 04.09.2006
Сообщений: 20
|
|
|
|
|
|
Re: М: Скриптинг в Готике
2Владай:
Люди, а появление НПС при воздействии Гг на триггер (или при открытии сундука, как в склепе около фермы Онара) надо прописать в каком-то скрипте или просто сделать через Спейсер?
|
Да, прописываешь функцию для триггера, и в ней реализуешь вставку непеся, если Гг активировал триггер. Еестественно с проверкой на активацию Гг в первый раз триггера, после которого вставляется(ются) - нужные тебе Нпс. Функцию нужно прописывать как в Спейсере так и в скриптах. Вот в этой папочке лежат все скрипты триггеров для Г2, Г2-НВ и модов: F:\Program Files\GothicSourcer V3.14\Gothic Projects\SolGlobal1.13\SolGlobal\PrjGothic\Story\E vents Здесь и прописываем файл скрипта с нужными функциями выполнения. Так-же, смотри для примера другие триггеры и их реализацию... :)
|
|
|
07.10.2007, 10:47
|
#1853
|
|
Re: М: Скриптинг в Готике
1. смотрю на скрипт по вступлению в новый лагерь (DIA_Org_801_Lares, func void ORG_801_Lares_Reicht_Info()). Ларс проверяет условие вступления, если все в порядке, то выдает новую броню. вызывает вопрос одно действие:
Cпойлер(щелкните, чтобы прочесть):
[table] [tr][td]hero.guild = GIL_ORG;[/td][td][/td][/tr] [tr][td]Npc_SetTrueGuild (hero, GIL_ORG);[/td][td]//устанавливаем принадлежность к ворам[/td][/tr] [tr][td]CreateInvItem (hero, org_armor_l);[/td][td]//создаем "Легкое одеяние вора" у героя[/td][/tr] [tr][td]CreateInvItem (self, ItAmArrow);[/td][td]//создаем стрелу у Ларса[/td][/tr] [tr][td]B_GiveInvItems (self, hero, ItAmArrow, 1);[/td][td]//передаем стрелу герою[/td][/tr] [tr][td]Npc_RemoveInvItem (hero, ItAmArrow);[/td][td]//уничтожаем стрелу у героя[/td][/tr] [tr][td]AI_EquipBestArmor (hero);[/td][td]//одеваем самую навороченную защиту[/td][/tr] [/table]
вот махинации со стрелой и непонятны. 2. по вступлению в новый лагерь автоматом помечают проваленными некоторые квесты, даже если они уже были выполнены и сданы. я решил добавить условие проверки, если квест сдан, то не помечать его как проваленный. чем можно проверить состояние конкретного квеста? нашел только ф-ии записи в дневник. пока приходится искать переменную состояния конкретного квеста и проверять ее, то есть вместо одной строки
Код:
Log_SetTopicStatus (CH1_LostNek, LOG_FAILED);
делать такую проверку:
Код:
if (Sly_LostNek != LOG_SUCCESS || Sly_LostNek == LOG_RUNNING) { * * *Log_SetTopicStatus (CH1_LostNek, LOG_FAILED); * * *B_LogEntry (CH1_LostNek, "Теперь я в Новом Лагере");};
|
|
|
07.10.2007, 11:32
|
#1854
|
|
Re: М: Скриптинг в Готике
2HikeR:
вот махинации со стрелой и непонятны.
|
Скорее всего разрабы подстрахавались против прямой передачи ГГ доспеха от Ларса.. При таком методе возможно снимание одетого доспеха у передающего, но это обычно происходит, если владелец передает такой же доспех, который существует у него в единственном экземпляре. Т.е. создали доспех Вора напрямую у ГГ, но т.к. нужно было сделать видимость передачи предмета, заюзали для передачи Стрелу, все равно функция B_GiveInvItems в Г1 не отображает на экране Название предмета, только тип "Передано предметов (количество)". Похожий метод используется довольно часто и для передачи разных предметов.. У ГГ создаются все нужные предметы, далее ему передается общее количество Стрел для видимости передачи, которые затем удаляются. 2HikeR:
чем можно проверить состояние конкретного квеста?
|
2HikeR:
Ну собственно ты ответил на свой вопрос, всегда можно прицепиться к какой-либо переменной.
|
|
|
08.10.2007, 14:17
|
#1857
|
|
Re: М: Скриптинг в Готике
Цитата:
Сообщение от SMErtNIK link=board=gothic&t=1105030050&start=3779900#37799 05 date=10/08/07, в 13:04:06
kraw
|
Игру надо начинать сначала.
|
Не надо. Достаточно сохранить, загрузить. Вопрос в том, чтобы избежать этого. В процессе игры должна смениться гильдия.
|
|
|
08.10.2007, 15:40
|
#1859
|
|
Re: М: Скриптинг в Готике
Цитата:
Сообщение от MaGoth link=board=gothic&t=1105030050&start=3780000#37800 02 date=10/08/07, в 13:48:58
2kraw:
|
Меняем Гильдию Нпс, после чего нуна попробывать очистить ИИ Непеся, только затем запустить новую функцию распорядка дня для этой Гильдии. Может так сработает. :)
|
А как это - "очистить ИИ Непеся"? Имеется в виду распорядок дня персонажа?
|
|
|
09.10.2007, 13:29
|
#1861
|
|
Re: М: Скриптинг в Готике
Цитата:
Сообщение от MaGoth link=board=gothic&t=1105030050&start=3780175#37801 83 date=10/08/07, в 15:25:06
2kraw:
|
За Готику 1 не скажу а в скриптах Г2 есть такая функция:
|
// удаляет все команды для НПС npc из очереди AI_Queue. func void Npc_ClearAIQueue(var C_NPC npc);
|
После чего можно попробывать это: // поменять у НПС npc распорядок дня routine. func void Npc_ExchangeRoutine(var C_NPC npc, var string routine);
|
В Г1 такие функции есть. Буду пробовать. Добавление от 10/09/07, в 10:45:58
Цитата:
Сообщение от kraw link=board=gothic&t=1105030050&start=3780500#37805 13 date=10/08/07, в 18:02:05
В Г1 такие функции есть. Буду пробовать.
|
Попробовал. Не работает. Мало того, что не решает основную задачу, да еще и диалог вешает. Выйти из него получается только марвином. Добавление от 10/09/07, в 12:49:41
Еще одна проблема. Нужно инициировать диалог одного персонажа по попытке напасть на него. Т. е. ГГ вытаскивает меч (например), и идет диалог. Но тут, похоже, событие перехватывается чем-то. "Убери оружие..." и т. подобное. И состояние персонажа не меняется пока ГГ не уберет меч. Как бы решить эту проблему?
|
|
|
09.10.2007, 14:57
|
#1862
|
|
|
|
|
A.G.F.C.
Регистрация: 04.09.2006
Сообщений: 20
|
|
|
|
|
|
Re: М: Скриптинг в Готике
2kraw:
Попробовал. Не работает. Мало того, что не решает основную задачу, да еще и диалог вешает. Выйти из него получается только марвином.
|
А сам скрипт можно увидеть? Может к чему и придем. ;) Так как, если эти функции есть то они должны работать. Можно без очистки одну эту попробывать: func void Npc_ExchangeRoutine(var C_NPC npc, var string routine); Добавление от 10/09/07, в 14:00:08
Еще одна проблема. Нужно инициировать диалог одного персонажа по попытке напасть на него. Т. е. ГГ вытаскивает меч (например), и идет диалог. Но тут, похоже, событие перехватывается чем-то. "Убери оружие..." и т. подобное. И состояние персонажа не меняется пока ГГ не уберет меч.
Как бы решить эту проблему?
|
Нужно смотреть в функции восприятия непесей, она оттуда перехватывается, и как дополнительное условие выполнения восприятия ставить твой, диалог. Наверное так.
|
|
|
09.10.2007, 15:24
|
#1863
|
|
Re: М: Скриптинг в Готике
Цитата:
Сообщение от MaGoth link=board=gothic&t=1105030050&start=3782000#37820 09 date=10/09/07, в 13:57:56
2kraw:
|
А сам скрипт можно увидеть? Может к чему и придем. ;) Так как, если эти функции есть то они должны работать.
|
Можно без очистки одну эту попробывать: func void Npc_ExchangeRoutine(var C_NPC npc, var string routine);
|
С этого и начал. Если одну эту, то не меняется поведение гильдии. Но я нашел другой способ, я удаляю персонажа, потом снова его вставляю. Потом меняю ему гильдию и расписание. Тогда все в порядке
|
|
|
11.10.2007, 20:22
|
#1867
|
|
Re: М: Скриптинг в Готике
2MaGoth:
Да, прописываешь функцию для триггера, и в ней реализуешь вставку непеся, если Гг активировал триггер. Еестественно с проверкой на активацию Гг в первый раз триггера, после которого вставляется(ются) - нужные тебе Нпс. Функцию нужно прописывать как в Спейсере так и в скриптах.
|
А можно поподробнее, как и где прописывать, а то я же не совсем-таки спец по программированию :)
|
|
|
13.10.2007, 00:38
|
#1868
|
|
Re: М: Скриптинг в Готике
Привет! :) Люди добрые, может кто-нибудь объяснить, что происходит?
Картина такая: есть некий маг, в диалоге с ним вызываются три непися, ждут конца разговора и нападают на ГГ. Если маг стоит рядом и наблюдает за сражением, все в порядке. А вот если его попытаться телепортнуть подальше, то ГГ исчезает (как будто вид не из-за спины, а от него самого), камера фиксируется в одной точке и больше ничего не сдвигается и не работает. Висим. * Написано буквально следующее:
{Тру-ля-ля диалог Wld_SpawnNpcRange(hero,none_3101_ghastly,3,100); * * Npc_SetTarget (none_3101_ghastly, hero); * * AI_Attack(none_3101_ghastly); * * AI_StopProcessInfos(self); * * AI_Teleport(none_3001_MadMage,"TOT"); }; Про эффект телепортации при неоконченном диалоге что-то в этой теме было, но вроде это не тот случай? AI_StopProcessInfos(self) - это же окончание или что-то можно добавить?
Правда, есть такой момент - если ввести INVINCIBLE=FALSE для ГГ, то маг улетучивается нормально, но духи рановато начинают атаковать и успевают вынести ГГ до окончания диалога. Ожидание окончания разговора прописано у них в ZS...
С магом, его диалогами и т.д. вроде все в порядке, он вообще по природе своей вызывается из кольца и регулярно посылается в ТОТ после окончания разговора *;) *До этого места с ним не было никаких проблем...
С вызванными тоже есть фокусы - у них особая функция повреждения (как у Ворона, но наоборот - повреждения ГГ лечатся, а они при повреждении испаряются...) И это тоже работает, пока маг стоит рядом.
В общем, не пойму куда смотреть. Слишком много накручено вокруг этой ситуации и не хватает мозгов, чтоб проанализировать, где могет быть не так. Может, кто-то с чем-то подобным встречался? Если надо, могу показать еще какие-то части скриптов, не пойму только какие могут влиять... А если все, то их много...
ps В общем-то по сюжету присутствие мага даже лучше, я и обнаружила-то такое случайно... Но теперь очень хочется разобраться, где я делаю ошибку. ::) Помогите, а? Пожа-алуйста...
|
|
|
13.10.2007, 00:55
|
#1869
|
|
Re: М: Скриптинг в Готике
2okin:
{Тру-ля-ля диалог Wld_SpawnNpcRange(hero,none_3101_ghastly,3,100); Npc_SetTarget (none_3101_ghastly, hero); AI_Attack(none_3101_ghastly); AI_StopProcessInfos(self); AI_Teleport(none_3001_MadMage,"TOT"); };
|
2okin:
{Тру-ля-ля диалог Wld_SpawnNpcRange(hero,none_3101_ghastly,3,100); Npc_SetTarget (none_3101_ghastly, hero); AI_Attack(none_3101_ghastly); AI_StopProcessInfos(self); AI_Teleport(none_3001_MadMage,"TOT"); }; Про эффект телепортации при неоконченном диалоге что-то в этой теме было, но вроде это не тот случай?
|
Собственно у вас происходит именно то, что описано в скрипте.. Во время диалога происходит телепортирование без ожидания завершения диалога. AI_StopProcessInfos(self) в этом случае НЕ поможет. Телепортирование можно реализовать переводом НПЦ в заранее описанный TA_ распорядок (в примере TA_MyTeleport) дня прописываемый в файле НПЦ (444 в примере ID НПЦ) func void Rtn_GoMyPoint_444() { TA_MyTeleport(23,0,6,0,"WP_STAY01"); }; , используя в диалоге B_StartOtherRoutine(self,"GoMyPoint"); в ZS_ функции (TA_ распорядка) которого и будет прописано телепортирование. func void ZS_MyTeleport() { }; func int ZS_MyTeleport_loop() { return LOOP_END; }; func void ZS_MyTeleport_end() { AI_Teleport(self,"WP_MYPOINT"); };
|
|
|
13.10.2007, 12:31
|
#1870
|
|
Re: М: Скриптинг в Готике
Что-то я окончательно запуталась...
Цитата:
Сообщение от Ukur link=board=gothic&t=1105030050&start=3789600#37896 01 date=10/12/07, в 23:55:10
2okin: 2okin: AI_StopProcessInfos(self) в этом случае НЕ поможет.
|
1. Почему? Чем ситуация {Тру-ля-ля диалог * AI_StopProcessInfos(self); * AI_Teleport(none_3001_MadMage,"TOT"); }; которая работает, отличается от {Тру-ля-ля диалог Wld_SpawnNpcRange(hero,none_3101_ghastly,3,100); * Npc_SetTarget (none_3101_ghastly, hero); * AI_Attack(none_3101_ghastly); * AI_StopProcessInfos(self); * AI_Teleport(none_3001_MadMage,"TOT"); }; ??? Присутствием свидетелей? 2. Глупый вопрос: где и как zs превращается в TA-функцию? Уже давно ищу. Если просто создать zs-файлик в папке ТА, он не понимает... Где и что еще надо прописать? До сих пор рисовала zs для вызванных существ, у которых вместо daily_routine стоит start_aistate, а вот как сделать ТА? 3. Предложенный вариант попыталась проверить в таком виде: испортила одну из стандартных ТА-функций с условием * * *var C_Npc madm; * * *madm = Hlp_GetNpc(NONE_3001_madmage); * * *if (Hlp_GetInstanceID(self) == (Hlp_GetInstanceID(madm))) * * * return LOOP_END и AI_Teleport(self,"TOT") в соответствующих блоках; * * * Ну и B_StartOtherRoutine(self,"Goodby") в диалоге. Но при этом непись остался где был... Я пробовала отбежать от него подальше, чтоб исчез, но похоже, что у него вообще не произошла смена распорядка. У него стоит start_aistate = ZS_Mag_Summoned и он продолжал бегать за ГГ, как в ней прописано... Раньше я меняла ему распорядок, но по-другому: * * *AI_teleport(none_3001_MadMage,"TOT"); * * *Wld_InsertNpc(NONE_3001_madmage,"NW_XARDAS_START" ); * * *Npc_ExchangeRoutine(self,"Joke"); Кстати, при изменении порядка строк * AI_StopProcessInfos(self); * Wld_SpawnNpcRange(hero,none_3101_ghastly,3,100); * Npc_SetTarget (none_3101_ghastly, hero); * AI_Attack(none_3101_ghastly); * AI_Teleport(none_3001_MadMage,"TOT"); маг исчезает нормально, а в неподвижном состоянии застревают ghastly'ки. А еще был смешной вариант, когда камера перенеслась вместе с магом в ТОТ и застряла там... Личность вызванных действительно ни при чем, это я уже проверила. Но понятней пока не становится... Чайник закипает... *:o ;D Добавление от 10/13/07, в 10:44:57 2Ukur Не-а... Вынесение команды телепорта непосредственно из диалога ничего не меняет. Поскольку получилось, что start_aistate мешает изменять распорядок, я сделала мага мирно курящим на постоянном месте. При этом новый ТА с телепортацией сработал, маг исчез и... см описание из моего первого поста. Висим. В той же позе. Кстати, а почему start_aistate мешает изменять распорядок? и что с этим делать? *Npc_ClearAIQueue в разных местах не помогает. Уже писала - если вставить мага заново, то распорядок меняется... Что вообще происходит? можно убрать мага после диалога - нормально, можно вызвать неписей и закончить диалог - нормально, можно вызвать и телепортнуть - абзац. Кому-то плохо - или магу, или вызванным, или висим... :( Не понимаю, где я создаю противоречие. Каким образом вызванные связаны с магом? Вроде те и другие взаимодействуют с ГГ, а не между собой... Объясните, пожалуйста, почему возникает проблема? Добавление от 10/13/07, в 11:51:45
Убрала телепорт и посмотрела просто на окончание диалога. AI_StopProcessInfos(self) срабатывает меньше, чем в четверти случаев (то есть разговор кончается сам), в остальных - остается строчка "выход". Если выйти сразу - призраки нападают, если выбрать другой пункт диалога, после которого маг тоже телепортируется - застревают и ни на что не реагируют (маг при этом телепортируется нормально). Это что, последовательность обработки событий? Когда они происходят одновременно, результат непредсказуем? Пока говоришь с магом, вызванные забывают, что собирались делать? Похоже, я делаю какую-то особо тупую ошибку... * :-[ Условие * * *Npc_PerceiveAll(self); * * *if ((Wld_DetectNpc(self,ghastly,ZS_MM_Ghastly,-1)==FALSE)&&(Npc_KnowsInfo(o ther,DIA_madmage_transform))) как у Сатураса, тоже срабатывает нестабильно, через раз... *:(
|
|
|
13.10.2007, 18:36
|
#1871
|
|
Re: М: Скриптинг в Готике
2okin:
2. Глупый вопрос: где и как zs превращается в TA-функцию? Уже давно ищу.
|
Здесь: AI\Human\TA.d Например: Распорядок писяния :) func void TA _Pee(var int start_h,var int start_m,var int stop_h,var int stop_m,var string waypoint) { TA_Min(self,start_h,start_m,stop_h,stop_m,ZS _Pee,waypoint); }; 2okin:
Кстати, при изменении порядка строк AI_StopProcessInfos(self); Wld_SpawnNpcRange(hero,none_3101_ghastly,3,10 0); Npc_SetTarget (none_3101_ghastly, hero); AI_Attack(none_3101_ghastly); AI_Teleport(none_3001_MadMage,"TOT"); маг исчезает нормально, а в неподвижном состоянии застревают ghastly'ки. А еще был смешной вариант, когда камера перенеслась вместе с магом в ТОТ и застряла там... Личность вызванных действительно ни при чем, это я уже проверила.
Но понятней пока не становится...
|
Да, объяснить это с научной точки зрения трудно, но лучше в диалоге все же не пытаться телепортировать того, с кем ведешь диалог :) 2okin:
Это что, последовательность обработки событий? Когда они происходят одновременно, результат непредсказуем?
|
Мда, мистика! Вообщем попробуйте все же реализовать телепортирование на TA_ :)
|
|
|
13.10.2007, 19:06
|
#1872
|
|
Re: М: Скриптинг в Готике
Это что, последовательность обработки событий? Когда они происходят одновременно, результат непредсказуем?
|
вспомнилось тут, когда сдавал квесты квестодателю при выборе строки диалога типа "я принес тебе вещь" одновременно с началом данной ветки диалога всплывала надпись "передан 1 предмет, получено столько-то опыта", хотя вызов ф-ии показа данных сообщений в скрипте шёл по окончании диалога. что-то типа: AI_Output (self, other, "GUR_1201_CorKalom_BRINGWEED_10_02"); * * *//А, давай сюда. И убирайся с глаз моих! B_GiveInvItems (hero, self, ItMi_Plants_Swampherb_01, 100); Npc_RemoveInvItems (self, ItMi_Plants_Swampherb_01, 100); BaalOrun_FetchWeed = LOG_SUCCESS; B_LogEntry (CH1_DeliverWeed, "Когда я вручал ему сегодняшний урожай, Кор Галом был снова просто невыносим."); Log_SetTopicStatus (CH1_DeliverWeed, LOG_SUCCESS); B_GiveXP (XP_DeliveredWeedHarvest);то есть последняя строка вызывается одновременно с первой. это так и должно быть?
|
|
|
13.10.2007, 19:14
|
#1873
|
|
Re: М: Скриптинг в Готике
Спасибо! С ТА попробую. Но тот вариант, который я описала, с измененим другого ТА - не то же самое? По сути он стал для моего нпс ТА_телепортом, хотя для остальных остался ТА_StandEating. Результат я описывала - тот же. Попробую написать функцию отдельно (хотя бы чтоб разобраться, как это делается), но почти уверена, что ничего не изменится...
Да, объяснить это с научной точки зрения трудно, но лучше в диалоге все же не пытаться телепортировать того, с кем ведешь диалог :)
|
Да? А что мне с ним делать? Мне надо, чтоб следующий диалог начинался после вынесения ГГ всех гастликов. Пробовала через Wld_DetectNpc, она срабатывает через раз... Ну не видит он нпс даже у себя под носом! И диалог начинается слишком рано. Если important стоит false, то вообще в конце предыдущего появляется строчка, если true - диалог заканчивается, а потом через раз тут же начинается новый (интересно, откуда такая разница? ::)). Иногда все гладко прокатывает, но мне не нравится это "иногда"... ;) Смутно подозреваю, что Сатурас тоже перестает видеть гоблинов раньше времени, но он занят делом - швыряется фаерболами... И Assess_Enemy гарантирует, что гоблинов точно не останется! А у меня маг просто смотрит. Поэтому второй вариант - телепортнуть, а потом вызвать из кольца заново. Ну и - тоже фигня получается... Можно просто закончить диалог, побить духов и начать его заново - но я уже описывала работу AI_StopProcessInfos... Ну и что мне с этим делать? ::) :( Что вы думаете по поводу несрабатывания AI_StopProcessInfos и Wld_DetectNpc? Это мой глюк или его? И можно ли это победить? Добавление от 10/13/07, в 18:19:30
Цитата:
Сообщение от HikeR link=board=gothic&t=1105030050&start=3790850#37908 70 date=10/13/07, в 18:06:32
вспомнилось тут, когда сдавал квесты квестодателю при выборе строки диалога типа "я принес тебе вещь" одновременно с началом данной ветки диалога всплывала надпись "передан 1 предмет, получено столько-то опыта", хотя вызов ф-ии показа данных сообщений в скрипте шёл по окончании диалога. что-то типа:
|
то есть последняя строка вызывается одновременно с первой. это так и должно быть?
|
Я с этим тоже сталкивалась... Пыталась вставить в диалог последовательность звуков. Они исполнились в виде рева все одновременно в начале диалога. Мне объяснили, что это из-за отсутствия звуковых файлов диалога... Проверить это и сделать как надо я пока не в состоянии... ;D
|
|
|
13.10.2007, 22:44
|
#1874
|
|
Re: М: Скриптинг в Готике
2HikeR:
то есть последняя строка вызывается одновременно с первой. это так и должно быть?
|
Функции выполняются по порядку, при этом обычно не ожидая завершения диалоговой фразы. А вообще вот несколько функций по теме из Уроков Vam'a, которые могут приостанавливать некоторые действия. Примеры можно посмотреть в скриптах. void AI_Wait (c_npc n0, float n1); - НПС n0 переводится на n1 секунд в состояние ожидания, в этом состоянии он не делает ничего, но наносимый ущерб регистрируется и работает пассивное восприятие. void AI_WaitTillEnd (c_npc self, c_npc other); - НПС self ждет от НПС other ответа на свою фразу. (Не выполняется перед функцией AI_OutputSVM_Overlay). Использование этой (AI_WaitTillEnd) функции заметил в моде "Жизнь пирата", в сцене, "клятвы верности Пирата".
|
|
|
14.10.2007, 00:59
|
#1876
|
|
Re: М: Скриптинг в Готике
2okin:
Что такое C:could not copy file: D:\Akella Games\GothicII\System\MssSoft.m3d into the system directory?
|
Помоему это файл настроек\дамп звуковой системы Miles Sound System, применяемая в игре, и этот файл кажется создается\обновляется всякий раз при запуске игры или Спайсера. Вероятно у вас файл оказался заблокированным вследствие системного глюка, или вы попытались запустить игру, не выгрузив спайсер или наоборот.. Возможно вторую копию спайсера... Вообщем проверьте в Диспетчере Задач, не висит ли где Спайсер или Игра в процессах, затем перезапустите. Если системный глюк - иногда помогает перезагрузка компьютера :)
|
|
|
14.10.2007, 15:29
|
#1878
|
|
Re: М: Скриптинг в Готике
2Ukur:
Функции выполняются по порядку, при этом обычно не ожидая завершения диалоговой фразы.
|
если AI_Output есть несколько, а не одна, как в вышеприведенном примере, то все равно происходит выполнение следующих за ними ф-ий при проигрывании первой. если взять такой пример: AI_Output (self, other ... AI_Output (other, self ... AI_Output (self, other ... B_GiveXP (...то B_GiveXP сработает сразу же. вот такое поведение является стандартным? в длинных диалогах просто забываешь иногда, что в начале тебе что-то дали ;)
|
|
|
15.10.2007, 12:45
|
#1879
|
|
Re: М: Скриптинг в Готике
Не поняла... void CreateInvItem (c_npc n0, int n1) c_item Npc_GetEquippedArmor (c_npc n0) Как получается, что в первой функции n1 int, а вторая выдает с_item, если в обоих случаях может оказаться вроде бы одно и то же, например, ITAR_KDW_L_Addon? CreateInvItem (self, ITAR_KDW_L_Addon) и var C_Item myArm; myArm = Npc_GetEquippedArmor(xxx); if (Hlp_IsItem(myArm,ITAR_KDW_L_Addon) == ..... Каким образом одна и та же ITAR_KDW_L_Addon оказывается принадлежащей к разным типам??? Едина в двух лицах - и предмет, и его номер? И если так, можно ли получить номер надетого на непися доспеха? Или создать C_item? И вообще, где предметам присваивается ID? В явном виде, как у пнс, нету... Добавление от 10/15/07, в 12:05:41
Смешно... Поигралась еще немножко с AI_StopProcessInfos и Wld_DetectNpc. Поскольку {Тру-ля-ля диалог Wld_SpawnNpcRange(hero,none_3101_ghastly,3,100); *Npc_SetTarget (none_3101_ghastly, hero); *AI_Attack(none_3101_ghastly); *AI_StopProcessInfos(self); *AI_Teleport(none_3001_MadMage,"TOT"); }; через раз приводила к разным результатам и оказался важен порядок строк, решила просто продублировать строчку AI_StopProcessInfos. Вставила сразу пяток, мне не жалко! *:) В итоге маг стал ВСЕГДА нормально уходить в ТОТ, а вызванные ВСЕГДА застывают... Из двух описанных вариантов остался один. Сие приятно, но... Вопрос: нету идей, почему нарушается поведение вызванных? Хотя бы в какую сторону думать и проверять? У меня интеллехту не хватат... Кстати, что конкретно делает AI_StopProcessInfos? Например, AI_StopProcessInfos(other) и AI_StopProcessInfos(self) синонимичны или могут быть нюансы? Если убрать телепорт, то теперь диалог нормально заканчивается ВСЕГДА, дальше драка и начало нового диалога... Так что появился хоть один стабильный вариант проигрывания сюжета, ура, будем радоваться и искать следующие грабли! Глупо, но эффективно! *;D Попробовала продублировать Wld_DetectNpc. Номер не прошел...
Cпойлер(щелкните, чтобы прочесть):
Npc_PerceiveAll(self); * * *if (Npc_KnowsInfo(other,DIA_madmage_transform)) * * *{ if (Wld_DetectNpc(self,ghastly,ZS_MM_Ghastly,-1)>0) * * * * * * * * * * * *{return FALSE; * * * * * *}; * * *if (Wld_DetectNpc(self,ghastly,ZS_MM_Ghastly,-1)>0) * * * * * * * * * * * *{return FALSE; * * * * * *}; * * *if (Wld_DetectNpc(self,ghastly,ZS_MM_Ghastly,-1)>0) * * * * * * * * * * * *{return FALSE; * * * * * *}; * * *if (Wld_DetectNpc(self,ghastly,ZS_MM_Ghastly,-1)>0) * * * * * * * * * * * *{return FALSE; * * * * * *}; * * *if (Wld_DetectNpc(self,ghastly,ZS_MM_Ghastly,-1)>0) * * * * * * * * * * * *{return FALSE; * * * * * *}; * * *return TRUE; * * * * * *};
Эта штука всегда выдает true. Если написано правильно (проверьте,а? но вроде правильно, с условием ">=0" всегда честный false), то он гастликов в упор не видит... Может, призраков замечать не положено?! ;D Вот такие пироги... Мало мне самолично зарытых собак, еще и такие попадаются...
|
|
|
15.10.2007, 21:31
|
#1880
|
|
Re: М: Скриптинг в Готике
то B_GiveXP сработает сразу же. вот такое поведение является стандартным? в длинных диалогах просто забываешь иногда, что в начале тебе что-то дали
|
Вполне. Если отсутвуют звуковые файлы диалогов, так и происходит... Диалог тогда лучше разбивать на несколько веток, например: - Вот то что ты просил (передача прдемета) - Как насчет награды? (дача опыта и руды) Еще есть смысл давать предметы невидимо для игрока (как в случае с доспехами), чтобы текст не накладывался друг на друга, или переписать саму функцию вывода текста при передачи предмета.
Кстати, что конкретно делает AI_StopProcessInfos? Например, AI_StopProcessInfos(other) и AI_StopProcessInfos(self) синонимичны или могут быть нюансы?
|
AI_StopProcessInfos (c_npc npc); - режим диалога НПС npc, начатый предыдущей функцией, заканчивается. Есть особенность, что некоторые функции во время своего выполнения могут вернуть значение, которое заменит self. Т.е. вместо НПЦ А, начавшего диалог, в self будет храниться ссылка на некого НПЦ Б, вызванного например Wld_InsertNpc. И диалог с "НПЦ А" не завершиться. В таком случаее разумнее будет написать не "AI_StopProcessInfos(self)" а "AI_StopProcessInfos(Инстанция_НПЦ_А)".
|
|
|
Здесь присутствуют: 16 (пользователей: 0 , гостей: 16)
|
|
Опции темы |
Поиск в этой теме |
|
|
Ваши права в разделе
|
|
|
|
Текущее время: 14:30. Часовой пояс GMT +4.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|