|
|
16.12.2010, 22:48
|
#2361
|
|
Re: М: Скриптинг в Готике
2ForestDark:Чтобы в игре показывались субтитры, нужно изменить
Cпойлер(щелкните, чтобы прочесть):
в файле Gothic.ini значение параметра subTitles=1 (по умолчанию: 0).
|
|
|
17.12.2010, 11:34
|
#2364
|
|
Re: М: Скриптинг в Готике
2ForestDark:
Попробовал с Gothic.ini всё так же.Жмёшь на фразу "Как дела" нету ни моих титров не NPC.Самое интересное вот что когда жму первую фразу поидее над головой должны появиться титры мол "Как дела" а у меня после нажатия первой фразы открывается сразу меню с выбором второй моей фразы типа "Могу тебе я чем нибудь помочь".В чём дело может ещё варианты решения есть?
|
Скрипт диалогов с этим неписем - в студию.
|
|
|
17.12.2010, 17:04
|
#2365
|
|
Re: М: Скриптинг в Готике
2ForestDark:
Есть у меня ещё один вопрос очень интересный так что слушаем и пробуем ответить *Есть у меня два абсолютно новых ZEN(мир):Вопрос_-_-_-Можно ли через скрипты иначе GothicSource соединить две локации,по принципу вставке NPC или тех же монстров, через Вейпонты или фрипоинты.Если можно то как?
|
Соединить или сделать переход из локации в локацию? В любом случае для всего этого нужен spacer. Например, по триггерам перехода - http://mod.worldofgothic.ru/3d/octriggerchangelevel По склеиванию уровней - http://mod.worldofgothic.ru/3d/zen-files
|
|
|
17.12.2010, 19:16
|
#2369
|
|
Re: М: Скриптинг в Готике
2ForestDark:
Скрипты диалогов NPC(Wolf,Elena и т.д) если брать из оригинала то тоже не работает.А сама игра оригинал норм работает.Расскажи поподробней OU.bin может и правда в этом дело.Жду ответа
|
При компиляции соурсером в папке проекта создаются 2 файла — Gothic.dat и ou.bin Первый содержит скрипты, второй как раз субтитры. Первый размещается в _work\data\Scripts\_compiled второй в _work\data\Scripts\Content\cutscene.
|
|
|
17.12.2010, 19:49
|
#2371
|
|
Re: М: Скриптинг в Готике
2ForestDark:
А как обновить ou.Bin? * Может мой способ неправельный?
|
А как вы gothic.dat обновляете? ;)
|
|
|
18.12.2010, 10:35
|
#2379
|
|
Re: М: Скриптинг в Готике
2ForestDark:
Почему когда декомплишь Gothic.dat все скрипты DIA... в менеджере ошибок отображаются синим цветом ---Мол-- Внимание:В Библиотеке (OutPutUnits) не найден модуль DIA_BAU_Gunnar.d и т.д в том же духе.Подскажите в чём дело и как можно это исправить.Может именно поэтому у меня диалоги не отображаются?
|
Я полагаю потому, что нет соответствующего ou.bin с субтитрами.
|
|
|
19.12.2010, 20:10
|
#2385
|
|
Re: М: Скриптинг в Готике
наоборот не надо, убедись что она у тебя действительно есть и то что ты её не заменил. PS: тебе DEDROIT в репутации написал
Cпойлер(щелкните, чтобы прочесть):
Просто у тебя у зена, у которого пропадает земля, не прописана ссылка на 3дс мира. Укажи в зен меш мира, сохрани и попробуй заного соеденить.
так и сделай.
|
|
|
19.12.2010, 23:47
|
#2389
|
|
Re: М: Скриптинг в Готике
2Olympus:
Хочу изменить повреждение для одного оружия. Через соурсер создал проект, декомпилировал файл gothic.dat, изменил что мне надо, скомпилировал, взял файл gothic.dat из GothicSourcer V3.14\Gothic Projects\SolURIZEL\PrjGOTHIC и заменил им файл в Gothic\_work\data\Scripts\_compiled. Запускаю, ничего не меняется, с новой игры тоже. Занимаюсь этим впервые, может как-то по-другому надо? *
|
Судя по всему сделали все верно. Еще было бы неплохо оригинальный датник забэкапить. Уризелей в Г1 несколько, может не тот вставляете или не тот отредактировали?
|
|
|
19.12.2010, 23:58
|
#2390
|
|
Re: М: Скриптинг в Готике
Уризель тот, заряженный - mythrilklinge02. Копия оригинального датника тоже имеется. Может быть у меня в скрипте не так что-то?
Cпойлер(щелкните, чтобы прочесть):
instance Mythrilklinge02(C_Item) { name = "УРИЗЕЛЬ"; mainflag = ITEM_KAT_NF; flags = ITEM_2HD_SWD | ITEM_MISSION; material = MAT_METAL; value = 10000; damagetype = DAM_FIRE | DAM_MAGIC | DAM_EDGE; damage[DAM_INDEX_EDGE] = 150; damage[DAM_INDEX_FIRE] = 30+[ATR_MANA]; damage[DAM_INDEX_MAGIC] = 120; range = 200; cond_atr[2] = ATR_STRENGTH; cond_value[2] = 30; visual = "ItMw_2H_Sword_Sleeper_02.3DS"; description = name; text[0] = "Это меч Уризель."; text[1] = "Уризель заряжен магической энергией. Урон 150"; text[2] = NAME_Dam_Magic; count[2] = damage[DAM_INDEX_MAGIC]; text[3] = NAME_Dam_Fire; count[3] = damage[DAM_INDEX_FIRE]; text[4] = NAME_Str_needed; count[4] = cond_value[2]; text[5] = NAME_Value; count[5] = value; };
|
|
|
20.12.2010, 00:19
|
#2391
|
|
Re: М: Скриптинг в Готике
2Olympus:
*damage[DAM_INDEX_FIRE] = 30+[ATR_MANA];
|
Странная конструкция. ATR_MANA вообще числовая константа, равная 2, следовательно урон огнем вашего Уризеля — 32. А что еще не работает?
|
|
|
20.12.2010, 00:53
|
#2393
|
|
Re: М: Скриптинг в Готике
2Olympus:
Да, это я неверно сделал... А как сделать, чтоб урон огнём был равен 30+ текущий уровень маны ГГ?
|
Так просто — скорее никак. Игровые инстанции (в частности предметы) создаются в момент создания новой игры\либо в момент вставки предмета в мир. Т.е. даже если привязать параметры меча к атрибутам ГГ они привяжутся к его текущим атрибутам и не будут расти с новым уровнем. А скорее всего получим вылет в окошки %) В теории можно, конечно, при измении атрибута\левел-апе проводить проверку, находить экипированный Уризель и менять ему параметр дамага, но будет ли это работать без проверки не скажешь. *Ежели Мухомор\BlackWolf на форуме появится у него не грех будет спросить, что-то подобное он делал в своем моде. И да, количество маны у ГГ получается магической формулой hero.attribute[ATR_MANA] или если нужен максимальный запас hero.attribute[ATR_MANA_MAX]
|
|
|
20.12.2010, 01:15
|
#2394
|
|
Re: М: Скриптинг в Готике
Выходит следующее: Скрипт Моего Уризеля:
Cпойлер(щелкните, чтобы прочесть):
instance Mythrilklinge02(C_Item) { name = "УРИЗЕЛЬ"; mainflag = ITEM_KAT_NF; flags = ITEM_2HD_SWD | ITEM_MISSION; material = MAT_METAL; value = 10000; damagetype = DAM_FIRE | DAM_MAGIC | DAM_EDGE; damage[DAM_INDEX_EDGE] = 150; damage[DAM_INDEX_FIRE] = 30; damage[DAM_INDEX_MAGIC] = 120; range = 200; cond_atr[2] = ATR_STRENGTH; cond_value[2] = 30+hero.attribute[ATR_MANA_MAX]; visual = "ItMw_2H_Sword_Sleeper_02.3DS"; description = name; text[0] = "Это меч Уризель."; text[1] = "Уризель заряжен магической энергией. Урон 150"; text[2] = NAME_Dam_Magic; count[2] = damage[DAM_INDEX_MAGIC]; text[3] = NAME_Dam_Fire; count[3] = damage[DAM_INDEX_FIRE]; text[4] = NAME_Str_needed; count[4] = cond_value[2]; text[5] = NAME_Value count[5] = value; };
А в вкладке сообщения компилятор выдаёт что мол Процесс остановлен... 64 ошибки(ок), 51 внимания(ий) На мои изменения в файле Items\MissionItems_5.d не ругается. Все 64 ошибки - Функция должна возвращать значение. Я так понял, что изменённый файл не компилировался. И что, мне теперь все эти ошибки нужно самому исправить? :o
|
|
|
20.12.2010, 01:27
|
#2395
|
|
Re: М: Скриптинг в Готике
2Olympus:
30+hero.attribute[ATR_MANA_MAX];
|
Все равно это работать не будет :) При создании инстанции переменная hero никуда не ссылается, скорее всего будет вылет в винду при вставке нового Уризеля.
А в вкладке сообщения компилятор выдаёт что мол Процесс остановлен... 64 ошибки(ок), 51 внимания(ий)
|
При декомпиляции исходников Г1 или Г2 соурсером обязательно будут ошибки и внимания, и да их придётеся править вручную. В 90% там ничего сложного. Если лень этим заниматся можно поискать уже исправленные скрипты, такие точно ходили одно время по сайтам модостроителей.
|
|
|
20.12.2010, 01:37
|
#2396
|
|
Re: М: Скриптинг в Готике
Ну хорошо. Тогда как их испралять? Вот один из скриптов с ошибкой
Cпойлер(щелкните, чтобы прочесть):
func int B_SetDayTolerance() { * * *if(Wld_IsTime(22,0,23,59)) * * *{ * * * * * *return Wld_GetDay() + 1; * * *} * * *else * * *{ * * * * * *return Wld_GetDay(); * * *}; };
Ошибка в 12ой строке... Да, а каким образом к повреждению от обычных мечей добавляется сила? Может по этому же принципу можно будет добавить запас маны к огненному повреждению?
|
|
|
20.12.2010, 04:16
|
#2397
|
|
Re: М: Скриптинг в Готике
2Olympus:
Ну хорошо. Тогда как их испралять?
|
func int означает, что функция обязана возвращать числовое значение, к сожалению парсер не учитывает значения внутри блоков с условиями (при наличии else), поэтмоу вариантов минимум 2: Стандартный, чтобы отмахаться от ошибки и пойти дальше:
Cпойлер(щелкните, чтобы прочесть):
func int B_SetDayTolerance() { * * *if(Wld_IsTime(22,0,23,59)) * * *{ * * * * * *return Wld_GetDay() + 1; * * *} * * *else * * *{ * * * * * *return Wld_GetDay(); * * *}; * * *return 0; };
Более хитрый
Cпойлер(щелкните, чтобы прочесть):
func int B_SetDayTolerance() { * * if(Wld_IsTime(22,0,23,59)) * * { * * * * * return Wld_GetDay() + 1; * * }; * * return Wld_GetDay(); };
Да, а каким образом к повреждению от обычных мечей добавляется сила? Может по этому же принципу можно будет добавить запас маны к огненному повреждению?
|
Этими вычислениями занимается движок игры и лучше оставить эту функцию ему. Что можно сделать? Можно написать стороннюю функцию, которая будет при встрече с каждым врагом высчитывать необходимый нам урон от огня. Например, в функции восприятия B_AssessFighter() добавить:
Код:
// определяем игрок ли другой НПЦ? * * *if(Npc_IsPlayer(other)) { * * * * * *var C_ITEM tmpwpn; * * * * * *// определяем оружие, которым экипирован игрок * * * * * *tmpwpn = Npc_GetReadiedWeapon(other); ** * * * * * * * *if (Hlp_IsItem(tmpwpn,Mythrilklinge02)) { * * * * * * * * *tmpwpn.damage[DAM_INDEX_FIRE] = 30 + other.attribute[ATR_MANA]; // меняем урон * * * * * * * * *tmpwpn.count[3] = tmpwpn.damage[DAM_INDEX_FIRE]; * * * * * * * * // меняем сопутствующую надпись * * * * * *}; * * *};
|
|
|
20.12.2010, 09:47
|
#2398
|
|
Re: М: Скриптинг в Готике
Вот тут что-то не получается отмахнуться
Cпойлер(щелкните, чтобы прочесть):
func void B_StopShortZapped() { PrintDebugNpc(PD_MAGIC,"B_StopShortZapped"); Npc_PercDisable(self,PERC_ASSESSSTOPMAGIC); Npc_ClearAIQueue(self); AI_Standup(self); if(C_NpcIsHuman(self) || C_NpcIsOrc(self)) { AI_StartState(self,ZS_ReactToDamage,0,""); } else if(C_NpcIsMonster(self)) { AI_StartState(self,ZS_MM_Attack,0,""); }; };
func int ZS_ShortZapped() { PrintDebugNpc(PD_ZS_FRAME,"ZS_ShortZapped"); if(!Npc_HasBodyFlag(self,BS_FLAG_INTERRUPTABL E)) { PrintDebugNpc(PD_MAGIC,"bodystate not interuptable, standing up..."); AI_Standup(self); }; if(!Npc_IsDead(self) && !Npc_IsInState(self,ZS_Unconscious) && !C_BodyStateContains(self,BS_SWIM) && !C_BodyStateContains(self,BS_DIVE)) { PrintDebugNpc(PD_MAGIC,"...NSC ist nicht bewuЯtlos / tot / schwimmend / tauchend"); AI_PlayAni(self,"T_STAND_2_LIGHTNING_VICTIM") ; }; return 0; };
func int ZS_ShortZapped_Loop() { PrintDebugNpc(PD_ZS_LOOP,"ZS_ShortZapped Loop"); if(Npc_GetStateTime(self) > SPL_TIME_SHORTZAPPED) { B_StopShortZapped(); }; AI_Wait(self,1); return 0; };
func void ZS_ShortZapped_End() { PrintDebugNpc(PD_ZS_FRAME,"ZS_ShortZapped_End "); };
Ругается на 33 строку
|
|
|
20.12.2010, 10:19
|
#2399
|
|
Re: М: Скриптинг в Готике
Cпойлер(щелкните, чтобы прочесть):
func void B_StopShortZapped() { * * *PrintDebugNpc(PD_MAGIC,"B_StopShortZapped"); * * *Npc_PercDisable(self,PERC_ASSESSSTOPMAGIC); * * *Npc_ClearAIQueue(self); * * *AI_Standup(self); * * *if(C_NpcIsHuman(self) || C_NpcIsOrc(self)) * * *{ * * * * * *AI_StartState(self,ZS_ReactToDamage,0,""); * * *} * * *else if(C_NpcIsMonster(self)) * * *{ * * * * * *AI_StartState(self,ZS_MM_Attack,0,""); * * *}; };
func void ZS_ShortZapped() { * * *PrintDebugNpc(PD_ZS_FRAME,"ZS_ShortZapped"); * * *if(!Npc_HasBodyFlag(self,BS_FLAG_INTERRUPTABLE)) * * *{ * * * * * *PrintDebugNpc(PD_MAGIC,"bodystate not interuptable, standing up..."); * * * * * *AI_Standup(self); * * *}; * * *if(!Npc_IsDead(self) && !Npc_IsInState(self,ZS_Unconscious) && !C_BodyStateContains(self,BS_SWIM) && !C_BodyStateContains(self,BS_DIVE)) * * *{ * * * * * *PrintDebugNpc(PD_MAGIC,"...NSC ist nicht bewuЯtlos / tot / schwimmend / tauchend"); * * * * * *AI_PlayAni(self,"T_STAND_2_LIGHTNING_VICTIM"); * * *}; };
func int ZS_ShortZapped_Loop() { * * *PrintDebugNpc(PD_ZS_LOOP,"ZS_ShortZapped Loop"); * * *if(Npc_GetStateTime(self) > SPL_TIME_SHORTZAPPED) * * *{ * * * * * *B_StopShortZapped(); * * *}; * * *AI_Wait(self,1); * * *return LOOP_CONTINUE; };
func void ZS_ShortZapped_End() { * * *PrintDebugNpc(PD_ZS_FRAME,"ZS_ShortZapped_End"); };
См. структуру прочих ZS-функций: стартовая и конечная пустого (void) типа, _loop - бывает и void и int, возвращает чаще всего LOOP_CONTINUE (фактически тот же самый 0, но через константы как бы правильнее)
|
|
|
20.12.2010, 14:38
|
#2400
|
|
Re: М: Скриптинг в Готике
Не помогает, что-то не так здесь
Cпойлер(щелкните, чтобы прочесть):
func int ZS_ShortZapped_Loop() { PrintDebugNpc(PD_ZS_LOOP,"ZS_ShortZapped Loop"); if(Npc_GetStateTime(self) > SPL_TIME_SHORTZAPPED) { B_StopShortZapped(); }; AI_Wait(self,1); return LOOP_CONTINUE; };
Добавление от 12/20/10, в 13:57:50
В общем все ошибки исправил, кроме одной
Cпойлер(щелкните, чтобы прочесть):
func void B_StopShortZapped() { PrintDebugNpc(PD_MAGIC,"B_StopShortZapped"); Npc_PercDisable(self,PERC_ASSESSSTOPMAGIC); Npc_ClearAIQueue(self); AI_Standup(self); if(C_NpcIsHuman(self) || C_NpcIsOrc(self)) { AI_StartState(self,ZS_ReactToDamage,0,""); } else if(C_NpcIsMonster(self)) { AI_StartState(self,ZS_MM_Attack,0,""); }; };
func int ZS_ShortZapped() { PrintDebugNpc(PD_ZS_FRAME,"ZS_ShortZapped"); if(!Npc_HasBodyFlag(self,BS_FLAG_INTERRUPTABL E)) { PrintDebugNpc(PD_MAGIC,"bodystate not interuptable, standing up..."); AI_Standup(self); }; if(!Npc_IsDead(self) && !Npc_IsInState(self,ZS_Unconscious) && !C_BodyStateContains(self,BS_SWIM) && !C_BodyStateContains(self,BS_DIVE)) { PrintDebugNpc(PD_MAGIC,"...NSC ist nicht bewuЯtlos / tot / schwimmend / tauchend"); AI_PlayAni(self,"T_STAND_2_LIGHTNING_VICTIM") ; return LOOP_CONTINUE; }; }; func int ZS_ShortZapped_Loop() { Строка 33 PrintDebugNpc(PD_ZS_LOOP,"ZS_ShortZapped Loop"); if(Npc_GetStateTime(self) > SPL_TIME_SHORTZAPPED) { B_StopShortZapped(); }; AI_Wait(self,1); return LOOP_CONTINUE; };
func void ZS_ShortZapped_End() { PrintDebugNpc(PD_ZS_FRAME,"ZS_ShortZapped_End "); };
Пишет следующее: Magic/ZS/ZS_Zapped.d(33): Ошибка: Функция должна возвращать значение :rip: Добавление от 12/20/10, в 13:58:13
В общем все ошибки исправил, кроме одной
Cпойлер(щелкните, чтобы прочесть):
func void B_StopShortZapped() { PrintDebugNpc(PD_MAGIC,"B_StopShortZapped"); Npc_PercDisable(self,PERC_ASSESSSTOPMAGIC); Npc_ClearAIQueue(self); AI_Standup(self); if(C_NpcIsHuman(self) || C_NpcIsOrc(self)) { AI_StartState(self,ZS_ReactToDamage,0,""); } else if(C_NpcIsMonster(self)) { AI_StartState(self,ZS_MM_Attack,0,""); }; };
func int ZS_ShortZapped() { PrintDebugNpc(PD_ZS_FRAME,"ZS_ShortZapped"); if(!Npc_HasBodyFlag(self,BS_FLAG_INTERRUPTABL E)) { PrintDebugNpc(PD_MAGIC,"bodystate not interuptable, standing up..."); AI_Standup(self); }; if(!Npc_IsDead(self) && !Npc_IsInState(self,ZS_Unconscious) && !C_BodyStateContains(self,BS_SWIM) && !C_BodyStateContains(self,BS_DIVE)) { PrintDebugNpc(PD_MAGIC,"...NSC ist nicht bewuЯtlos / tot / schwimmend / tauchend"); AI_PlayAni(self,"T_STAND_2_LIGHTNING_VICTIM") ; return LOOP_CONTINUE; }; }; func int ZS_ShortZapped_Loop() { Строка 33 PrintDebugNpc(PD_ZS_LOOP,"ZS_ShortZapped Loop"); if(Npc_GetStateTime(self) > SPL_TIME_SHORTZAPPED) { B_StopShortZapped(); }; AI_Wait(self,1); return LOOP_CONTINUE; };
func void ZS_ShortZapped_End() { PrintDebugNpc(PD_ZS_FRAME,"ZS_ShortZapped_End "); };
Пишет следующее: Magic/ZS/ZS_Zapped.d(33): Ошибка: Функция должна возвращать значение :rip:
|
|
|
Здесь присутствуют: 3 (пользователей: 0 , гостей: 3)
|
|
Ваши права в разделе
|
|
|
|
Текущее время: 13:28. Часовой пояс GMT +4.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|