|
|
04.07.2005, 21:08
|
#521
|
|
Re: Скриптинг в Готике
У меня вот такой вопрос: Создал диалог(DIA_NONE_666_Leo),вот его содержимое: instance None_666_Leo_AskForSword (C_INFO) { npc = None_666_Leo; condition = None_666_Leo_AskForSword_Condition; information = None_666_Leo_AskForSword_Info; important = TRUE; permanent = FALSE; description = ""; };
FUNC int None_666_Leo_AskForSword_Condition() { if (hero.level >= 0) { return TRUE; }; return FALSE; };
func void None_666_Leo_AskForSword_Info() { AI_Output ( self, other, "None_666_Leo_AskForSword_Info_8_01"); // Эй, ты занят ?
Info_ClearChoices (None_666_Leo_AskForSword); Info_AddChoice (None_666_Leo_AskForSword, "Нет, а что?", None_666_Leo_AskForSword_Yes); Info_AddChoice (None_666_Leo_AskForSword, "Боюсь, что да", None_666_Leo_AskForSword_No); }; Func void None_666_Leo_AskForSword_No () { AI_Output(other,self, "None_666_Leo_AskForSword_Info_8_02"); // Я занят... AI_Output(self,other, "None_666_Leo_AskForSword_Info_8_03"); //Ну и вали отсюда... AI_StopProcessInfos (self); }; func void None_666_Leo_AskForSword_Yes () { AI_Output(other,self,"None_666_Leo_AskForSword_Inf o_8_04"); // Да,вроде,нет. AI_Output(self,other,"None_666_Leo_AskForSword_Inf o_8_05"); // Тогда *убей Вино. Log_CreateTopic(TOPIC_KillVino,LOG_MISSION); Log_SetTopicStatus(TOPIC_KillVino,LOG_Running); B_LogEntry(TOPIC_KillVino,"Лео хочет чтобы я убил Вино."); }; // ************************ EXIT ************************** instance None_666_Leo_AskForSword_Exit (C_INFO) { npc = None_666_Leо; condition = None_666_Leo_AskForSword_Exit_Condition; information = None_666_Leo_AskForSword_Exit_Info; important = 0; permanent = 1; description = "конец"; };
FUNC int None_666_Leo_AskForSword_Exit_Condition() { return 1; };
FUNC VOID None_666_Leo_AskForSword_Exit_Info() { AI_StopProcessInfos ( self ); }; instance DIA_Leo_VinoDead(C_Info) { * * *npc = NONE_666_Leo; * * *nr = 8; * * *condition = DIA_Leo_VinoDead_Condition; * * *information = DIA_Leo_VinoDead_Info; * * *permanent = FALSE; * * *description = "Вино мёртв!"; };
func int DIA_Leo_VinoDead_Condition() { * * *if(Npc_IsDead(Vino) && (MIS_KillVino == LOG_Running)) * * *{ * * * * * *return TRUE; * * *}; };
func void DIA_Leo_VinoDead_Info() { * * *AI_Output(other,self,"DIA_Leo_VinoDead_15_00"); * * *//Вино мёртв! * * *AI_Output(self,other,"DIA_Leo_VinoDead_11_01"); * * *//Отлично. * * * * * *AI_Output(self,other,"DIA_Leo_VinoDead_11_02"); * * *//Я думаю, это позволит нам получить передышку, по крайней мере, на неделю. * * *MIS_KillVino = LOG_SUCCESS; * * *B_GivePlayerXP(250); }; потом прописал диалог в Story_Globals.d(в самом конце) следующее: var int MIS_KillVino; И прописал диалог в Gothic src: после этого *Story\Dialoge\DIA_NONE_100_Xardas.d прописпл это Story\Dialoge\DIA_NONE_666_Leo.d.Но прикомпиляции вылаёт 3 ошибки: 1) 00:14 Fault:0 U: PAR:STORY\DIALOGE\DIA_NONE_666_Leo.D:’TOPIC_KILLVI NO’undeclared name (line 40)…<zError.cpp,#477> 2) 00:14 Fault:0 U: PAR:STORY\DIALOGE\DIA_NONE_666_Leo.D:’TOPIC_KILLVI NO’undeclared name (line 41)…<zError.cpp,#477> 3) 00:14 Fault:0 U: PAR:STORY\DIALOGE\CDIA_NONE_666_Leo.D:’TOPIC_KILLV INO’undeclared name (line 42)…<zError.cpp,#477> Правильно ли я прописал в Story_Globals.d?Делал по примеру мага,который просит убить черного волка в 1 главе и паладина в долине который просит убить Гош пака.
|
|
|
04.07.2005, 22:26
|
#522
|
|
|
|
|
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
|
|
|
|
|
|
Re: Скриптинг в Готике
2Bliz@rd:
Правильно ли я прописал в Story_Globals.d?
|
Вроде да.
1) 00:14 Fault:0 U: PAR:STORY\DIALOGE\DIA_NONE_666_Leo.D:’TOPIC_KILLVI NO’undeclared name (line 40)…<zError.cpp,#477> 2) 00:14 Fault:0 U: PAR:STORY\DIALOGE\DIA_NONE_666_Leo.D:’TOPIC_KILLVI NO’undeclared name (line 41)…<zError.cpp,#477> 3) 00:14 Fault:0 U: PAR:STORY\DIALOGE\CDIA_NONE_666_Leo.D:’TOPIC_KILLV INO’undeclared name (line 42)…<zError.cpp,#477>
|
’TOPIC_KILLVINO’undeclared name - необъявленное имя. Нужно объявить TOPIC_KillVino в story/log_entries/LOG_Constants_*.d (в любом). В принципе, необязательно именно там, как и во многих других случаях с прописыванием глобальных переменных\констант.
|
|
|
05.07.2005, 11:28
|
#524
|
|
Re: Скриптинг в Готике
2Bliz@rd:
Если нет он даёт задание,но после того как даёт задание "Конец" не появляется, а появляется опция "я занят".
|
Чтобы появился "конец" допиши в функциях
Func void None_666_Leo_AskForSword_No ()
|
и
func void None_666_Leo_AskForSword_Yes ()
|
в конце Info_ClearChoices (None_666_Leo_AskForSword); а вообще, опять хочется сказать фразу
Просто забей на скриптинг... =( Больше посоветовать нечего...
|
- неужели было сложно поглядеть аналогичные скрипты у готических неписей?
|
|
|
07.07.2005, 16:00
|
#526
|
|
Re: Скриптинг в Готике
Доброго времени суток уважаемые модостроители! Позвольте представиться - VenDigo, сценарист-скриптер мод. команды NWMT. За подомными темами на АГ слежу уже давольно таки давно, но в вопросах не было необходимости. До сягодняшнего дня... Спрашиваю в этой теме, потому как вопросы по этому поводу уже затрагивалась здесь когда-то. Теперь к делу. Я научился снимать ролик в спейсере при помощи камер, но возникло пара проблем. Что я делал: создал камеру и кейфреймы, подогнал их как мне надо(получился облёт Хориниса сверху), сохранил зен файл(NEWWORLD.ZEN), запаковал его вместе с остальными зенами в Worlds.mod, переименовал в Worlds.vdf и заменил уже существующий в папке ...\Data. Вроде пока всё правильно делал. Если не прав, поправьте плиз. Кстати, зен получился примерно на 10 метров больше исходника. И это из-за одной то камеры?! Открывал новый NEWWORLD - камера на месте и работает. А теперь вопросы:
1. Как изменить скорость движения камеры и сгладить её передвежение? А то в некоторых переходах кейфреймов оно скачкообразно. 2. Как врубить камеру в игре? Подозреваю что через триггер Wld_SendTrigger("Название камеры"), но как и где его прописывать? Пробовал в диалоге, но ничего не получилось :( Может его где расписывать надо? Или достаточно добавить данную строку в условие? Если так, то не помагает... 3. Можно ли врубить камеру, которая находится на порядочном расстоянии от ГГ? Т.е. нужно врубить камеру, которая находится на противоположенном ГГ конце острова? 4. На практике нужно чтобы ролик врубался сразу по началу игры. Но если триггер Wld_SendTrigger прописывается или в диалоге, или в условии, то как это сделать? Возможно ли такое вообще? 5. Может мне кто-нибудь помочь? Буду очень благодарен ::)
|
|
|
08.07.2005, 17:33
|
#528
|
|
Re: Скриптинг в Готике
2Vendiga:
Ну что никто не знает? В урокох Вама об этом триггере тоже ничего не известно
|
Триггер задается в Спейсере, там же в свойствах VOB объекта прописывается имя функции, которая будет вызвана, сама функция размещается в скриптах (желательно в папке ..Story\Events). Более подробно пока сказать больше нечего. Саму функцию Wld_SendTrigger можно вызвать из любого места скриптов.
|
|
|
08.07.2005, 17:54
|
#530
|
|
Re: Скриптинг в Готике
2Vendiga:
А нет примеров таких функций в Готике?
|
В Готике2 + аддон они не встречаются, в других модах Готик (1 и 2) я не искал, возможно где-нибудь и есть. Есть в скриптах Готики1, этой функцией включается концерт InExtremo, файл ..Story\InExtremo.d
|
|
|
08.07.2005, 21:02
|
#532
|
|
Re: Скриптинг в Готике
У меня есть вопрос: Я в спайсере создал веппоинт(NW_FARM4_Leo) он находится *на ферме Секоба. Потом сохранил мир и закомпелировал.Без ошибок. Дальше создал непися(NONE_999_Leo),вот его содержимое: instance NONE_999_Leo (Npc_Default) { * * *// ------ NSC ------ * * *name * * * * * *= "Лео"; * * *guild * * * * * *= GIL_NONE; * * *id * * * * * * * * *= 999; * * *voice * * * * * *= 3; * * *flags * * * = 0; * * * * * * * * * * * * * * * * * * * * *//NPC_FLAG_IMMORTAL oder 0 * * *npctype * * * * * *= NPCTYPE_OCMAIN; * * * * * *// ------ Attribute ------ * * *B_SetAttributesToChapter (self, 1); * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//setzt Attribute und LEVEL entsprechend dem angegebenen Kapitel (1-6) * * * * * * * * *// ------ Kampf-Taktik ------ * * *fight_tactic * * * * * *= FAI_HUMAN_COWARD; * * *// MASTER / STRONG / COWARD * * * * * *// ------ Equippte Waffen ------ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//Munition wird automatisch generiert, darf aber angegeben werden * * *EquipItem * * * * * * * * *(self, ItMw_1h_Bau_Mace); * * * * * *// ------ Inventory ------ * * *B_CreateAmbientInv * * *(self); * * * * * * * * * * * *// ------ visuals ------ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//Muss NACH Attributen kommen, weil in B_SetNpcVisual die Breite abh. v. STR skaliert wird * * * * * *B_SetNpcVisual * * * * * *(self, MALE, "Hum_Head_Bald", Face_N_NormalBart_Huno, BodyTex_N, ITAR_Mil_L); * * * * * *Mdl_SetModelFatness * * *(self, 0); * * *Mdl_ApplyOverlayMds * * *(self, "Humans_Relaxed.mds"); // Tired / Militia / Mage / Arrogance / Relaxed * * * * * *// ------ NSC-relevante Talente vergeben ------ * * *B_GiveNpcTalents (self); * * * * * *// ------ Kampf-Talente ------ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//Der enthaltene B_AddFightSkill setzt Talent-Ani abhдngig von TrefferChance% - alle Kampftalente werden gleichhoch gesetzt * * *B_SetFightSkills (self, 30); //Grenzen fьr Talent-Level liegen bei 30 und 60
* * *// ------ TA anmelden ------ * * *daily_routine * * * * * *= Rtn_Start_999; };
FUNC VOID Rtn_Start_999 () { * * * TA_Stand_Eating * *(08,00,23,00,"NW_FARM4_Leo");
TA_Stand_ArmsCrossed * (23,00,08,00,"NW_FARM4_Leo"); * * * }; Потом прописал его везде.Т.е в NPC_Globals прописал После var C_NPC Till; прописал var C_NPC Leo; *и После Till = Hlp_GetNpc (BAU_931_Till);прописал Leo = Hlp_GetNpc (NONE_999_Leo); Так же прописал в статупе после Wld_InsertNpc * * *(BAU_931_Till, "BIGFARM"); Прописал это Wld_InsertNpc * * *(NONE_999_Leo, "NW_FARM4_Leo"); И соответственно прописал в Gothic src. Дальше компилирую.Закомпилировалось без ошибок. Захожу в игру А моего непися там нет.А когда вызываю с помощью марвина,то он появляется. Почему он не появляется сам(без марвина)?
|
|
|
08.07.2005, 21:13
|
#533
|
|
Re: Скриптинг в Готике
2Bliz@rd:
Захожу в игру А моего непися там нет.А когда вызываю с помощью марвина,то он появляется. Почему он не появляется сам(без марвина)?
|
А как ты заходишь в игру? Если загружая сейв, то НПС и не будет, если заходить с нуля, то будет.
|
|
|
09.07.2005, 03:03
|
#535
|
|
Re: Скриптинг в Готике
2Bliz@rd:
Може быть ещё что нибудь посоветуешь?
|
Неписей в файле Startup.d прописывал?
|
|
|
09.07.2005, 13:46
|
#536
|
|
Re: Скриптинг в Готике
Короче устроил я вчера исследовательскую работу по теме триггеры и вот к чему это привело:
Для начала я изучил одну камеру из Диккурика(ту которая падальщиков призывает в самом начале игры) и её свойства. Начиналось всё из рук вон плохо - только замучился открывать зен диккурика - забыл содержимое модфайла перекинуть в каталог игры, а он блин и не хочет открываться! Камера та называлась CAMERA_HOCHSTAND(zCCSCamera). Долгим экспериментальным путём я нашол два триггера, прикреплённых к этой камере. Экскурс для тех кто не знает: каждый триггер несёт в себе какую-то скриптовую функцию, которая должна быть расписана в *d. файле. Т.е. scriptFUNC по-научному(занимаеет последнее место по порядку, но первое по важности в свойствах триггера). Так вот, первым триггером был TS_HOCHSTAND(oCTriggerScript) c scriptFunc HOCHSTANDWOELFE. Визуально выглядит как "коробочка" из красных линий(когда отсутствует 3дс файл обычно такое бывает - это пример, тут совершенно не к месту) на всю площадь поверхности башни(на которой должен стоять ГГ в момент включения камеры. Второй триггер выглядет так: TS_CAMERA_HOCHSTAND(oCTriggerScript) со скриптфунцией START_CAMERA_HOCHSTAND. Прикреплён к камере как кейфрейм, но совсем близко, можно сказать на неё.
Далее я задался целью найти эти триггеры в датнике Диккурика. Учитывая то, что прогой Вама я пользовался второй раз, для меня распаковать модовский файл было трудновато. Но ничего, и с этим я справился :) Первое что я нашол, был скрипт рога, который приводит в движение саму камиру:
instance SCAVHORN(C_Item) { name = "mysteriцses Horn";\\Загадочный рог mainflag = ITEM_KAT_NONE; flags = ITEM_MULTI; value = 0; visual = "ItMi_Alarmhorn_01.3DS"; material = MAT_WOOD; scemeName = "HORN";\\Рог on_state[0] = use_scavhorn;\\Функция использования description = name; text[5] = NAME_Value; count[5] = value; };
func void use_scavhorn()\\Описание функции использования { if((Npc_GetDistToWP(self,"SEE_VOR_STADT_12") <= 1000) && (DC_1_TOWER != 3) && !SCAVHORNUSED)\\если ГГ стоит на расстоянии <= 1000 от варпоинта и вроде на башне, то....
{ Wld_SetGuildAttitude(GIL_WOLF,ATT_ANGRY,GIL_SCAVE NGER);\\Волки вдруг стали врагами падальщиков Wld_InsertNpc(v_scav1,"SEE_VOR_STADT_06");\\Появл яются сами падальщики Wld_InsertNpc(v_scav2,"SEE_VOR_STADT_06"); Wld_InsertNpc(v_scav3,"SEE_VOR_STADT_06"); Wld_InsertNpc(v_scav4,"SEE_VOR_STADT_06"); SCAVHORNUSED = TRUE;\\Не нашол где эта функция декларирована Wld_SendTrigger("TS_CAMERA_HOCHSTAND");\\Подключа ется камера } else { PrintScreen("Nichts passiert...",-1,-1,"font_old_20_white.tga",3);\\Вывод текста "Ничего не произошло" }; };
Привожу с комментариями на том уровне, на котором могу. Сам файл scavhorn.d нашолся по адресу _Work\Data\Scripts\Content\_misc_ В эту же папку разрабы диккурика скидывали все триггеры. А в оссобенности в файл schrank_a_nah.d. Там я и нашол скриптфункции триггеров камеры CAMERA_HOCHSTAND.
func void hochstandwoelfe() { if(HOCHSTANDAKTIVIERT == 0)\\??? Вроде условие если камера включена... { HOCHSTANDAKTIVIERT = HOCHSTANDAKTIVIERT + 1;\\Вопросы, кругом вопросы ::) if(Npc_GetDistToWP(sld_b,"AM_HOCHSTAND_00") < 800))\\ если дистанция до варпоинта меньше 800 { Npc_ExchangeRoutine(sld_b,"RALF");\\Убежали неписи, которые ГГ подставили Npc_ExchangeRoutine(sld_a,"RAL"); AI_ContinueRoutine(sld_b); AI_ContinueRoutine(sld_a); }; AI_OutputSVM_Overlay(hero,hero,"TurmGefangen_15_0 0");");//Это реплика Ардарика, когда приходят волки. «Откуда взялись эти волки...» говорит он AI_StandupQuick(hero);\\Перевод ГГ в стоячее состояние Wld_SendTrigger("TS_CAMERA_HOCHSTAND");\\Опят ь камера bh_wolfspawn();\\Функция такая. Приведена в отдельном одноимённом файле }; };
bh_wolfspawn.d:
func void bh_wolfspawn() { Wld_InsertNpc(v_wolf1,"SEE_VOR_STADT_06");\\Появл яются четыре волка Wld_InsertNpc(v_wolf2,"SEE_VOR_STADT_06"); Wld_InsertNpc(v_wolf3,"SEE_VOR_STADT_06"); Wld_InsertNpc(v_wolf4,"SEE_VOR_STADT_06"); };
И для триггера TS_CAMERA_HOCHSTAND(oCTriggerScript) скрипт нашолся:
func void start_camera_hochstand() { Wld_SendTrigger("CAMERA_HOCHSTAND");\\Просто опять включает камеру. Они что перестраховывались чтоли три раза писали? lol... };
И ещё одна вещь. В своём посте с вопросами, некоторые из которых уже сам разобрал, я спрашивал возможно ли включить камеру с самого начала игры и как, ведь в таком случае невозможно включить триггер скриптово! Тему такую замутить можно. Те кто играл в Диккурик, вспомните - там в самом начале вокруг Ардарика, когда тот говорит крутится камера. Причём крутится по кругу, циклично! Я проверял, кейфремы там не замкнуты! Камера называется CAMERA_GAME_START. И триггеров к ней действительно НЕТ! Я всё облазил, но не нашол ни одного. В свойствах от камеры CAMERA_HOCHSTAND она отличается только одним параметром. Что за параметр и на что он влияет я не знаю. Если кому интересно какой, спрашивайте, щас нет желания смотреть - может и не нужен он вовсе... Однако скрипт с этой камерой всё же есть. Это тот самый разговор Ардарика, но запихнут он почему-то всё в тот же файл schrank_a_nah.d, а не в диалоги ГГ.
func void vor_hochstand() { if(STARTDIALOGGESPROCHEN == 0)\\Опять какая-то малопонятная функция { IntroduceChapter("Kapitel 1","Ardarics Leben","chapter.tga","levelup.wav",6000);\\Окно первой главы "Жизнь Ардарика" с файлом заставки chapter.tga и звуковым файлом levelup.wav на время 6000 AI_Standup(self);\\Перевод ГГ в стоячее положение Wld_SendTrigger("CAMERA_GAME_START");\\Наша камера! AI_Output(hero,hero,"DIA_DIC_Monolog_15_00");\\Бл а, бла, бла и всё такое... ::) AI_Wait(hero,1);\\Чего ждать? AI_StandupQuick(hero); AI_Output(hero,hero,"DIA_DIC_Monolog_15_01"); AI_Output(hero,hero,"DIA_DIC_Monolog_15_02"); AI_Wait(hero,1); AI_StandupQuick(hero); AI_Output(hero,hero,"DIA_DIC_Monolog_15_03"); AI_TurnAway(hero,sld_b); AI_Wait(hero,1); AI_StandupQuick(hero); AI_Output(hero,hero,"DIA_DIC_Monolog_15_04"); AI_Output(hero,hero,"DIA_DIC_Monolog_15_05"); AI_Wait(hero,1); AI_StandupQuick(hero); AI_Output(hero,hero,"DIA_DIC_Monolog_15_06"); AI_Wait(hero,1); AI_StandupQuick(hero); AI_Output(hero,hero,"DIA_DIC_Monolog_15_07"); AI_Wait(hero,1); AI_StandupQuick(hero); AI_Output(hero,hero,"DIA_DIC_Monolog_15_08"); AI_Output(hero,hero,"DIA_DIC_Monolog_15_09"); AI_Wait(hero,1); AI_StandupQuick(hero); AI_GotoNpc(hero,sld_a);\\Ардарик идёт к Солдатику. AI_GotoNpc(sld_b,sld_a);\\К другому солдатику. STARTDIALOGGESPROCHEN = 1;\\Опять неизвестно где декларированная функция... }; };
Исходя из всего вышесказанного думаю что вопросы возникли не только у меня. Попробую их сформулировать для ясности и давайте их вместе как-нибудь решим.
1. С какой целью к камере приязали два триггера, одним из которых ещё заключили стоящего на вышке ГГ в "кубик"? 2. Зачем второй триггер "прилипили" прямо на камеру? 3. Где декларированны все эти функции: SCAVHORNUSED = TRUE; if(HOCHSTANDAKTIVIERT == 0); HOCHSTANDAKTIVIERT = HOCHSTANDAKTIVIERT + 1; if(STARTDIALOGGESPROCHEN == 0); STARTDIALOGGESPROCHEN = 1; и что они все означают? 4. Зачем задавать подобного типа условия: if((Npc_GetDistToWP(self,"SEE_VOR_STADT_12") <= 1000) && (DC_1_TOWER != 3) && !SCAVHORNUSED); if(Npc_GetDistToWP(sld_b,"AM_HOCHSTAND_00") < 800))??? 5. Почему нельзя было все эти скрипты соединить в один? Зачем разбрасывать по файлам? 6. Если я не ошибаюсь, триггер Wld_SendTrigger("CAMERA_HOCHSTAND") включает функционирование камеры. Зачем его писать три раза разных скриптах? Ведь они все выполняются одновременно! 7. Как Amatheur Gothic Mod Team(кажется так они называются) врубили камеру без триггера? Откуда скрипт vor_hochstand? Или я что-то просмотрел? Но в списке триггеров на камеру CAMERA_GAME_START точно ничего нет! 8. Как разрабы зациклили камеру CAMERA_GAME_START?
Надеюсь на сильных мира сего. Модостроительством занимаюсь около двух месяцев, думаю тут у многих опыта больше, поэтому ПАМАГИТЕ ::)
Спешиал сэнкс камраду Отцу Левонтию за помощь в столь трудном деле :)
|
|
|
09.07.2005, 14:38
|
#537
|
|
|
|
|
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
|
|
|
|
|
|
Re: Скриптинг в Готике
2Vendiga:Во-первых, респект за исследование :pivo: [q]3. Где декларированны все эти функции: SCAVHORNUSED = TRUE; if(HOCHSTANDAKTIVIERT == 0); HOCHSTANDAKTIVIERT = HOCHSTANDAKTIVIERT + 1; if(STARTDIALOGGESPROCHEN == 0); STARTDIALOGGESPROCHEN = 1; и что они все означают?[/q] Переменные (а не функции) HochstandAktiviert и StartDialogGesprochen введены в файле Story_Globals.d и они нужны лишь для одной цели: дабы увериться, что функция выполнится только один раз. Потому что при следующем входе переменная HochstandAktiviert будет уже иметь значение один, и самое первое условие не выполнится. [q]4. Зачем задавать подобного типа условия: if((Npc_GetDistToWP(self,"SEE_VOR_STADT_12") <= 1000) && (DC_1_TOWER != 3) && !SCAVHORNUSED); if(Npc_GetDistToWP(sld_b,"AM_HOCHSTAND_00") < 800))???[/q] Чтобы проверить, находится ли Ардарик там, где нужно, активируя рог, не использовался ли уже рог для этой же цели, а DC_1_TOWER - это какая-то глобальная вспомогательная переменная, которая довольно часто меняет свое значение в диалогах, в общем, какое-то состояние сюжета или игры, а вообще точно сказать не могу.
5. Почему нельзя было все эти скрипты соединить в один? Зачем разбрасывать по файлам?
|
Гм, возможно разрабы специально хотели нас запутать. Или неаккуратные они :) На остальные вопросы попытаюсь ответить позже, поисследовав немного ZEN Диккурика, просто сейчас времени нет ::)
|
|
|
09.07.2005, 16:27
|
#540
|
|
Re: Скриптинг в Готике
2Vendiga:
Потому мне это странным показалось... в одну папку запихивать совершенно разные скрипты - жуть!
|
Если ты про папку _misk_, то туда файлы запихивает только Декомпилятор, когда не может точно определить к какой папке относится файл. Настройка папок в Декомпиляторе сделана только под оригинальные версии игр Готика1 и Готика2 + аддон.
Откуда скрипт vor_hochstand?
|
Данная функция повешена на триггер TS_VOR_HOSHSTAND, при каком условии он срабатывает надо смотреть zen файл. Таких триггеров в файле даже четыре.
8. Как разрабы зациклили камеру CAMERA_GAME_START?
|
Вот эти параметры camTrjFOR и targetTrjFOR камеры зацикливают её движение (имхо), параметров у камеры очень много, нужно разбираться.
|
|
|
09.07.2005, 19:54
|
#541
|
|
Re: Скриптинг в Готике
Вношу некоторые поправки к переменным: func void use_scavhorn()\\Описание функции использования { if((Npc_GetDistToWP(self,"SEE_VOR_STADT_12") <= 1000) && (DC_1_TOWER != 3) && !SCAVHORNUSED)\\Здесь яно видно, что функуция выполняется, если не определена переменная SCAVHORNUSED (!SCAVHORNUSED) { Wld_SetGuildAttitude(GIL_WOLF,ATT_ANGRY,GIL_SCAVE NGER);\\Волки вдруг стали врагами падальщиков Wld_InsertNpc(v_scav1,"SEE_VOR_STADT_06");\\Появл яются сами падальщики Wld_InsertNpc(v_scav2,"SEE_VOR_STADT_06"); Wld_InsertNpc(v_scav3,"SEE_VOR_STADT_06"); Wld_InsertNpc(v_scav4,"SEE_VOR_STADT_06"); SCAVHORNUSED = TRUE;\\А вот тут она и определяется как TRUE. Т.е. выполнение функции вторично уже неозможно. Wld_SendTrigger("TS_CAMERA_HOCHSTAND");\\Подключа ется камера } func void hochstandwoelfe() { if(HOCHSTANDAKTIVIERT == 0)\\Тут условие выполняется если HOCHSTANDAKTIVIERT равно 0. { HOCHSTANDAKTIVIERT = HOCHSTANDAKTIVIERT + 1;\\HOCHSTANDAKTIVIERT + 1 уже не рано 0. поэтому вторично функция не выполняется. if(Npc_GetDistToWP(sld_b,"AM_HOCHSTAND_00") < 800))\\ если дистанция до варпоинта меньше 800 func void vor_hochstand() { if(STARTDIALOGGESPROCHEN == 0)\\Всё тоже самое. { STARTDIALOGGESPROCHEN = 1;\\STARTDIALOGGESPROCHEN уже не рана 0 поэтому вторично функция не вызывается. }; Но я всё-равно не пойму - ЗАЧЕМ??? Все переменные выполняют одну функцию - не дать вторично запустить функцию. Но в первром случае всё достаточно просто и грамматно, а востальных... по-карсацки... наверно скрипты писали два разных человека со своим пониманием и своими тараканими. Другого объяснения у меня нет... Добавление от 07/09/05, в 16:24:56 2Vam:
Данная функция повешена на триггер TS_VOR_HOSHSTAND, при каком условии он срабатывает надо смотреть zen файл. Таких триггеров в файле даже четыре.
|
Где ты их нашол??? :dead:
Вот эти параметры camTrjFOR и targetTrjFOR камеры зацикливают её движение (имхо), параметров у камеры очень много, нужно разбираться.
|
Ща проверю... Добавление от 07/09/05, в 18:53:42
Так, блин, теперь одно всаёт на своиё место, но появляются новые вопросы!!! Короче вот как этоо выглядет в игре: Когда Ардарик забирается на башню, попадает в поле действия триггера TS_HOCHSTAND, срабатывает его скриптфункция HOCHSTANDWOELFEfunc void hochstandwoelfe() { if(HOCHSTANDAKTIVIERT == 0)\\??? Вроде условие если камера включена... { HOCHSTANDAKTIVIERT = HOCHSTANDAKTIVIERT + 1;\\Вопросы, кругом вопросы ::) if(Npc_GetDistToWP(sld_b,"AM_HOCHSTAND_00") < 800))\\ если дистанция до варпоинта меньше 800 { Npc_ExchangeRoutine(sld_b,"RALF");\\Убежали неписи, которые ГГ подставили Npc_ExchangeRoutine(sld_a,"RAL"); AI_ContinueRoutine(sld_b); AI_ContinueRoutine(sld_a); }; AI_OutputSVM_Overlay(hero,hero,"TurmGefangen_15_0 0");");//Это реплика Ардарика, когда приходят волки. «Откуда взялись эти волки...» говорит он AI_StandupQuick(hero);\\Перевод ГГ в стоячее состояние Wld_SendTrigger("TS_CAMERA_HOCHSTAND");\\ bh_wolfspawn();\\Функция такая. Приведена в отдельном одноимённом файле }; }; Который врубает другой триггер TS_CAMERA_HOCHSTAND, а тот в свою очередь выполняет свою скриптфункцию START_CAMERA_HOCHSTAND и врубает камеру в первый раз(да-да, именно в первый, так как она включается два раза - сначала при появлении волков, потом при появлении падальщиков. Но в первый раз камеру включает триггер, а во второй скрипт рога) Потом чтобы избавиться от волков ГГ использует рог, который снова активирует триггер TS_CAMERA_HOCHSTAND, который активирует во второй раз функцию START_CAMERA_HOCHSTAND. Но я никак не могу отследить каким образом триггер реагирует на появление ГГ в своём фокусе! Единственное что приходит в голову свойство триггера reapondToPC(дословно переводится как отзыв на Player Characters - игровой характер). Думаю это и есть реакция на ГГ. Но вот проблема - этот параметр выставлен на TRUE у всех триггеров! То есть они все должны реагировать на ГГ, даже если несут другую функцию. На мой взгляд объясняется это тем, что эти триггеры точечные и не должны функционировать при приближении к ним главного героя. Чёрт, я сам запутался! Короче триггер TS_HOCHSTAND отличается от остальных тем, что не реагирует ни на объекты, ни на НПС. Только на ГГ. Вношу ещё несколько поправок: Я ошибся. Мне стыдно. Камера начала Диккурика не зациклина. Она Просто не выключается, когда пройдёт цикл, а смотрит на ГГ в точке своей последней остановки. ГГ поварачивается к камере и продолжает свой монолог. И ещё я ошибся на счёт того, что она включается сразу сначала игры. Нет, сначала мы видим ГГ. Нужно сделать один шаг в любую сторону, чтобы камера активировалась. Но я всё-таки не нашол ни одного триггера, привязанного к ней! Vam триггера TS_vor_hochstand не существует! Более того нет ни одного триггера со скриптфункцией vor_hochstand. Так как же разрабы Диккурика включили камеру? Так как же отследить в триггере появление ГГ? Добавление от 07/09/05, в 19:14:55
А может быть камера реагирует на ГГ не триггером, а скриптом? Вот этой функциейif (Npc_GetDistToWP(sld_b,"AM_HOCHSTAND_00") < 800))
|
|
|
09.07.2005, 23:27
|
#542
|
|
Re: Скриптинг в Готике
2Vendiga:
Vam триггера TS_vor_hochstand не существует! Более того нет ни одного триггера со скриптфункцией vor_hochstand.
|
Ты триггера ищещь в Спейсере, а я прямо в zene, вот текст этого триггера: [% oCTriggerScript:zCTrigger:zCVob 24577 11141] pack=int:0 presetName=string: bbox3DWS=rawFloat:41520.625 13904.0352 -10567.6445 42020.625 14104.0352 -10467.6445 trafoOSToWSRot=raw:0000803f0000000000000000000000 000000803f0000000000000000000000000000803f trafoOSToWSPos=vec3:41770.625 14004.0352 -10517.6445 vobName=string:TS_VOR_HOCHSTAND visual=string: showVisual=bool:1 visualCamAlign=enum:0 cdStatic=bool:0 cdDyn=bool:1 staticVob=bool:0 dynShadow=enum:0 [visual % 0 0] [] [ai % 0 0] [] triggerTarget=string: flags=raw:07 filterFlags=raw:3f respondToVobName=string: numCanBeActivated=int:-1 retriggerWaitSec=float:0 damageThreshold=float:0 fireDelaySec=float:0 scriptFunc=string:VOR_HOCHSTAND [] их всего четыре, а где они находятся на карте я не знаю. :( Может в Спейсере есть какой-нибудь поиск по имени или по номеру.
|
|
|
10.07.2005, 02:13
|
#543
|
|
Re: Скриптинг в Готике
2Vam:
их всего четыре, а где они находятся на карте я не знаю. Может в Спейсере есть какой-нибудь поиск по имени или по номеру.
|
Четыре одинаковых? Хм... странно, вроде везде где могут быть триггеры я смотрел... поиска тоже вроде в спейсере нет :(
|
|
|
14.07.2005, 00:41
|
#544
|
|
Re: Скриптинг в Готике
Привет всем! Давно хотел зарегиться и вот решил наконец... Вот мой первый вопрос, который я уже на АЛЛГОТИК задавал, но мне ни чего не ответили :( Надеюсь,тут мне помогут... ::) Я хочу сдалать такую штуку, чтобы если ГГ подходит к варпоинту, то на нем появляется монстр. Вот мой скрипт: func void B_Ins_Monstr() { if(Npc_GetDistToWP(Dragon_PLOT_DEMON, "NW_XARDAS_TOWER_PATH_01") < 2000)//если ГГ до варпоинта осталось меньше 20 метров, то { Wld_InsertNpc(Giant_Bug,"NW_XARDAS_TOWER_PATH_01") ;// на этом варпоинте появляется Полевой жук }; };
Для моего скрипта я создал отдельный файл B_Ins_Monstr.d в папке B_Content(более подходящей не нашел), при компиляции нет ни каких ошибок, но в игре эта штука не работает. Запускаю не с сейва, а начинаю новую игру. Помогите, кто может! З.Ы. Dragon_PLOT_DEMON - это мой дракон ::)
|
|
|
14.07.2005, 07:30
|
#545
|
|
Re: Скриптинг в Готике
2Отец Левонтий: может я не так понял, но:
if(Npc_GetDistToWP(Dragon_PLOT_DEMON, "NW_XARDAS_TOWER_PATH_01") < 2000)//если ГГ до варпоинта осталось меньше 20 метров
|
- то, если
Dragon_PLOT_DEMON - это мой дракон
|
значит получается, что если драгон находится в 20 метрах от вайпоинта, то тогда инсертнется
, а тебе надо, чтобы монстр появлялся при подходе ГГ, значит надо заменить
if(Npc_GetDistToWP(Dragon_PLOT_DEMON, "NW_XARDAS_TOWER_PATH_01") < 2000)//
|
на
if(Npc_GetDistToWP(self, "NW_XARDAS_TOWER_PATH_01") < 2000)//
|
|
|
|
14.07.2005, 11:03
|
#546
|
|
Re: Скриптинг в Готике
2Отец Левонтий:
на if(Npc_GetDistToWP(self, "NW_XARDAS_TOWER_PATH_01") < 2000)
|
а лучше на if(Npc_GetDistToWP( hero, "NW_XARDAS_TOWER_PATH_01") < 2000)
|
|
|
14.07.2005, 11:06
|
#547
|
|
Re: Скриптинг в Готике
2finch:
а лучше на if(Npc_GetDistToWP(hero, "NW_XARDAS_TOWER_PATH_01") < 2000)
|
а чем лучше?
|
|
|
14.07.2005, 12:13
|
#548
|
|
Re: Скриптинг в Готике
2finch:
а лучше на if(Npc_GetDistToWP(hero, "NW_XARDAS_TOWER_PATH_01") < 2000)
|
2Borisoff:
Всё зависит от того, откуда вызывается данная функция, на self, если ГГ в этот момент не self, может не сработать, на hero же сработает всегда. Если использовать self, то надо добавить условие if(Npc_IsPlayer(self))
|
|
|
14.07.2005, 15:35
|
#551
|
|
Re: Скриптинг в Готике
Цитата:
Сообщение от TycoooN link=board=gothic&t=1105030050&start=525#548 date=07/14/05, в 12:39:45
А чего вы тут спорите? Скрипт-то все равно работать не будет, пока функция B_Ins_Monstr() не будет вызвана. Ее можно вызвать через триггер, но тут уж я не силен :)
|
Почему через триггер? Вот, например, в скриптах одного наемника, с которым ГГ идет убивать Полевых жуков в конце *одной из фраз прописана вставка 4-х Полевых жуков и без триггеров. Просто прописан инсерт, как в Стартупе... З.Ы. Вопрос не в тему: как сохранить странички с этого форума? Жму файл -> сохранить как..., но ни чего не происходит... Кнопка для печати открывает новое окно, в котором не найдена страница... Как мне скачать страничу с форума?
|
|
|
14.07.2005, 15:54
|
#552
|
|
Re: Скриптинг в Готике
2Отец Левонтий:
Вот, например, в скриптах одного наемника, с которым ГГ идет убивать Полевых жуков в конце *одной из фраз прописана вставка 4-х Полевых жуков и без триггеров. Просто прописан инсерт, как в Стартупе...
|
потому что инсерт прописан в функции диалога. А там у тебя отдельная функция. 2TycoooN: а если ссылку на функцию вставить в диалоговую функцию, тоже что ли не будет пахать? Имхо, должна, но только пока идет диалог. То есть если во время диалога ГГ в двух метрах от ваупоинта, то монстр инсертнется, иначе же ничего не произойдет. Я прав?
|
|
|
14.07.2005, 16:02
|
#553
|
|
Re: Скриптинг в Готике
2Отец Левонтий:2Borisoff: Товарищи, чтобы функция выполнилась, её надо откуда-нибудь вызвать (из диалога, из циклов состояний, через триггер и т.д.), без разницы откуда. А чтобы пахало, то внутри функции не должно быть ошибок.
А там у тебя отдельная функция и ее надо э... инициализировать.
|
Инициализация как раз уже есть, это объявление имени функции с её телом. Это всё банально просто.
как сохранить странички с этого форума?
|
Выделяешь, копируешь, вставляешь :D
|
|
|
14.07.2005, 16:04
|
#554
|
|
|
|
|
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
|
|
|
|
|
|
Re: Скриптинг в Готике
Почему через триггер? Вот, например, в скриптах одного наемника, с которым ГГ идет убивать Полевых жуков в конце *одной из фраз прописана вставка 4-х Полевых жуков и без триггеров. Просто прописан инсерт, как в Стартупе...
|
а если ссылку на функцию вставить в диалоговую функцию, тоже что ли не будет пахать? Имхо, должна, но только пока идет диалог. То есть если во время диалога ГГ в двух метрах от ваупоинта, то монстр инсертнется, иначе же ничего не произойдет. Я прав?
|
Да я не об инсерте говорил, а о том, что функция в любом случае не сработает, что бы в ней ни было прописано, т.к. ее нужно как-то вызвать. А уж как - это проблема. Можно через триггер.
|
|
|
14.07.2005, 20:12
|
#555
|
|
Re: Скриптинг в Готике
чтобы функция выполнилась, её надо откуда-нибудь вызвать (из диалога, из циклов состояний, через триггер и т.д.), без разницы откуда.
|
А если ее вызвать из диалога(сделать переменную, если диалог совершен, то TRUE), то обязательно находиться во время разговора на расстоянии <20 метров от данного варпоинта?
|
|
|
14.07.2005, 21:19
|
#556
|
|
Re: Скриптинг в Готике
2Отец Левонтий:
А если ее вызвать из диалога(сделать переменную, если диалог совершен, то TRUE), то обязательно находиться во время разговора на расстоянии <20 метров от данного варпоинта?
|
Все можно сделать гораздо проще, т.е. через триггер (как говорил товарищ TycoooN:). Ставишь триггер (этак, 40х40 метров :)) вокруг своего вэйпоинта, ГГ попадает в зону триггера, монстр инсертится... Это будет стопудово проще! ;)
|
|
|
15.07.2005, 01:51
|
#559
|
|
Re: Скриптинг в Готике
2Vendiga:
я так понял размеры задавать надо координатами через Boundingbox-Dialog, но они не меняются! Какие не задаёшь, всё равно остаются прежними...
|
Правильно понял! ;) Выделяешь свой тригер, на закладке modify нажимаешь
, выскакивает
, нажимаешь Define, там будет три показателя (x, y, z), поставь например везде по 100, вокруг триггера появится такой красный куб... вот и все! :) 2Отец Левонтий:
И как этот триггер реализовать в скриптах? Че и где надо прописывать?
|
Млин... Достаточно долго все объяснять... попробуй разобраться на готовом примере.. возле двора Онара есть склеп со скелетами... там когда сундуки открываешь, эти скелеты как раз и появляются... все это реализовано при помощи триггеров... посмотри, попробуй разобраться! ;) если что будет непонятно - спрашивай!
|
|
|
15.07.2005, 11:48
|
#560
|
|
|
|
|
Регистрация: 19.06.2004
Адрес: г. Белая Калитва.
Сообщений: 204
|
|
|
|
|
|
Re: Скриптинг в Готике
Вопрос такой: Замучился я уже с этими диалогов после боя. Оказалось, что у всех работает нормально, а у наемников не хотел. Сделал я так, чтобы говорил он мне мой диалог. Но... Наемник сначала говорит SVM 'Хорошо, ты победил', и открывает диалог с ним. Если выйти, то только тогда он скажет МОЙ диалог. Задача. Нужно как то отключить для определенного NPC вывод SVM после боя.
З.Ы. Я делал через B_AssignToughGuyNews.d. Сначала сделал так, чтобы не говорил он, не говорит, но все равно открывал диалог с собой. Тогда я сделал, чтобы он делал AI_StopProcessInfos(self); - т.е. не говорил и автоматом закрывал диалог, вроде все работает как надо, но камера дергается от диалога к простой. Вообщем вы поняли через какое место это реализовано :), хотелось бы по нормальному реализовать.
|
|
|
Здесь присутствуют: 25 (пользователей: 0 , гостей: 25)
|
|
Опции темы |
Поиск в этой теме |
|
|
Ваши права в разделе
|
|
|
|
Текущее время: 23:51. Часовой пояс GMT +4.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|