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

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

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

Готика 2: НВ Неофициальное обновление для Г2 НВ

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.124
Благодарности
3.215
Баллы
485
  • Первое сообщение
  • #1
Неофициальное обновление для игры "Готика 2: Ночь Ворона" представляет собой модификацию, направленную на исправление многочисленных ошибок и недоработок игры различной степени критичности. Данное обновление не включает новые квесты или глобальные изменения баланса и рекомендуется всем, кто хочет играть в Г2НВ без багов.
Разработка обновления ведется с 2005 года и по сегодняшний день. Камрад Efectivo (aka Нефариус) русифицировал патч от Fizzban и внес несколько дополнительных исправлений (так что получилась не русификация, а самостоятельный продукт на его основе).
В неофициальном обновлении камрад Dimus значительно расширил список исправлений и добавил некоторые улучшения. Дальнейшая работа над обновлением продолжена силами D36.
Также в данную сборку включены исправленные миры от Kvincius (Рудниковая долина, Яркендар, Хоринис и Ирдорат), исправленные шрифты от N1kX, неофициальное исправление русской озвучки от Dimus и полезные плагины для Union от Slavemaster (zBugFixes, zMiscUtils, zPicklockAnis, zTorchControl и другие).

Текущая версия:
29 от 14.08.2023

Ссылки:
Установщик модификации (76.5 МБ);
Версия для Мастерской Steam;
Исходники скриптов и архив релизов.

Установка:
Запустить установщик обновления, указать каталог с установленной игрой и выбрать набор устанавливаемых компонентов.
Внимание: Для того, чтобы все изменения вступили в силу, после установки обновления нужно начать новую игру!

Загрузка текста...

Удаление:
Удалить данное обновление можно через раздел "Программы и компоненты" в панели управления или запустив исполняемый файл G2a_NR_ScriptPatch_v29_uninstall.exe в каталоге с установленной игрой.

Примечания:
1. Для предотвращения возможных конфликтов с различными модами обновление устанавливается в формате модификации, поэтому для её работы необходимо наличие мод-стартера Player Kit. Также настоятельно рекомендуется установить последнюю версию Union;
2. Каждая версия неофициального обновления запускается через GothicStarter.exe отдельно и использует собственные папки сохранений. Удаление разных версий из панели управления также происходит раздельно;
3. Начало новой игры обязательно. Не поддерживаются сохранения, сделанные в оригинале, в любом другом моде или в любой предшествующей версии неофициального обновления.
Игнорирование данного предупреждения может привести к непредсказуемым последствиям: от невозможности продвижения по сюжету до вылетов.
Для тестирования доступна предварительная сборка 30 версии неофициального обновления. Подробности здесь.
 
Последнее редактирование:

Traven

Участник форума
Регистрация
16 Июн 2015
Сообщения
40
Благодарности
39
Баллы
175

heckler

Участник форума
Регистрация
25 Апр 2017
Сообщения
413
Благодарности
109
Баллы
210
Вроде баг: Рандольф от фермы Акила идёт в таверну через мост. В простой готике там только пара гоблинов было, в аддоне же семь бандитов и он там однозначно должен погибнуть.
 

Zack Fair

Участник форума
Регистрация
27 Ноя 2009
Сообщения
34
Благодарности
9
Баллы
160
Вроде баг: Рандольф от фермы Акила идёт в таверну через мост. В простой готике там только пара гоблинов было, в аддоне же семь бандитов и он там однозначно должен погибнуть.
Это же хорошо что не погибает , хотя можно же бандитов сначала убить , а потом Рэндольфа на пьянку отправлять . Да и не баг это , игра поросто телепортирует NPC в нужное место когда вы отходите от него на определенное расстояние .
 

heckler

Участник форума
Регистрация
25 Апр 2017
Сообщения
413
Благодарности
109
Баллы
210
Я имел в виду, что может ему забыли поменять маршрут движения в аддоне, как например сделали Гаану
ReadMe-Addon.txt написал(а):
( 2.5 -> 2.6 )
Einige Monster entfernt, damit Gaan bessere berlebenschancen hat
 

Kvincius

Участник форума
Регистрация
6 Ноя 2012
Сообщения
257
Благодарности
234
Баллы
210
Парочка багов и предложений.
1.При прошлых прохождениях, всегда отдавал учётную книгу Френсису и получал ключ от дома Грега. В этот же раз, просто тупо избил его и забрал ключ. Если так сделать, то Френсис будет готов заплатить за свою книгу 500 золотых. Однако, если не отдать ему книгу вовремя, то после того как вернётся Грег и отправит пилить Френсиса доски, сделать этого будет уже нельзя. На мой взгляд, когда бы ни нашёл игрок эту книгу, Френсис всегда должен быть готов выкупить её у ГГ, а не только до возвращения Грега.
2.Если при диалоге с Пардосом, когда выбираешь какое зелье ему дать, нажать "назад", то данная возможность исчезнет и больше не появится.
3.Рози может напасть на ГГ, если открыть сундук Ксардаса в доме Секоба, когда она рядом.
4.Вроде бы очень старый баг. Нашёл мёртвого Кроноса в Хоринисе в той самой пещере(сейв).
5.Вылет при попытке вернуться в Яркендар(сейв).
https://yadi.sk/d/1z-EiF4S3KM9ih
Также, есть 2 предложения:
1.Самюэль продаёт быструю селёдку через диалоговое окно. И всё бы ничего, но он продаёт её по всего одной штуке за раз. Из-за этого, если хочешь купить бутылок 30(как я всегда и делаю), нужно сделать огромное количество кликов. Было бы удобно, если бы появилась опция в диалоговом окне, покупать к примеру сразу по 10 бутылок за клик.
2.Сильвио и Буллко стоят у входа в ледяную долину и Сильвио говорит ГГ зачистить зачистить всё там, а они мол пойдут следом. Затем, уже после убийства дракона, если вернуться к ним, то Сильвио скажет что-то вроде - "Ледяной дракон мёртв! А ты отдашь мне всё что у тебя есть". Тут появляется 2 вопроса. Откуда Сильвио знает про то, что ГГ убил дракона, если он всё это время проторчал у входа в долину? И почему они вообще за ГГ не пошли, ведь логичней взять ГГ тёпленьким, сразу после того как он повалил дракона, а не ошиваться у входа. Собственно, на мой взгляд сцена должна выглядеть так:
После разговора с драконом, Сильвио и Буллко появляются где-то в пределах видимости, за спиной ГГ, и наблюдают как он убивает дракона, но не помогают ему и не агрятся на дракона. После убийства дракона, ГГ может подойти к ним, Сильвио говорит про то, что ледяной дракон мёртв, бла-бла-бла, и они нападают на ГГ. Данная правка также позволит не забывать про этих 2-их и не телепортироваться сразу же после убийства дракона в замок.
 

heckler

Участник форума
Регистрация
25 Апр 2017
Сообщения
413
Благодарности
109
Баллы
210
1. Заметил, что пофиксеные текстуры шрифтов и рамки интерфейса скомпилированы с mipmap, а тексура брони наоборот без . Это конечно не ошибка, но и не правильно.
2. Большие шрифты тоже имеют красные наплывы, почему их тоже не пофиксить?
3. Для удобства можно было бы разделить патч на:

g2a_nr_scriptpatch
Anims_g2a_nr_scriptpatch
Meshes_g2a_nr_scriptpatch
Speech_g2a_nr_scriptpatch
Textures_g2a_nr_scriptpatch
Worlds_g2a_nr_scriptpatch


4. В исходники неплохо бы добавить небольшое описание как их собирать.

Вылет при попытке вернуться в Яркендар
У меня нормально.
 
Последнее редактирование:

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.124
Благодарности
3.215
Баллы
485
"Изжога" в записи о квесте "Боязнь Торлофа людей в черном" - косяк перевода?

5.Вылет при попытке вернуться в Яркендар(сейв).
У меня с этого сейва не вылетает.

рамки интерфейса скомпилированы с mipmap, а тексура брони наоборот без
Исправленные текстуры в аттаче.
 

Вложения

  • textures.rar
    51,7 KB · Просмотры: 68

heckler

Участник форума
Регистрация
25 Апр 2017
Сообщения
413
Благодарности
109
Баллы
210
косяк перевода

En:
There are supposed to be some of those black-hooded guys at the bandits' camp in the mountains in the south of the valley. They give Torlof heartburn. I'm to solve that problem for him
De:
Beim Banditenlager in den Bergen im Sьden des Tals sollen sich einige dieser schwarzen Kapuzentypen aufhalten. Torlof bekommt bei ihrer Anwesendheit Sodbrennen. Ich soll die Sache fьr ihn erledigen

на урбандиктонари пишут что это такой сленг
 
Последнее редактирование:

Kvincius

Участник форума
Регистрация
6 Ноя 2012
Сообщения
257
Благодарности
234
Баллы
210
У меня с этого сейва не вылетает.
Блин, очень странно, так как у меня даже на свежеустановленной игре + SystemPack + Патч Димуса, есть данный вылет при каждой попытке пройти через портал.

Релиз исправленного файла мира Рудниковой Долины
Что исправлено:
- Исправлены неаккуратно расстановленные объекты в мире игры.
- Частично восстановлены провалившиеся под меш объекты.
- Исправлен параметр cdDyn(проницаемость) у требуемых того объектов.
- Восстановлены пропавшие pfx эффекты.
- Исправлены визуалы сундуков. Закрытый сундук - на сундук с замком, открытый - на сундук без замка соответственно.
- Теперь Добар и Парлаф не застревают по дороге утром в кузницу.
- Триггер видеоролика о нападении драконов перенесён так, чтобы не пересекаться с пещерой на горе.
- Исправлена сетка вейпоинтов в некоторых местах, а также создана в башне Ксардаса и вокруг замка.
- Дым больше не привязан к огню, из-за чего мог слететь со своих координат.
И много других мелких правок. Кому интересно подробнее, можно посмотреть здесь(Архив со скринами 1.6гб. На скринах хоть и большинство, но не все правки!) - https://yadi.sk/d/J_7Tl6E93KRg8c.
Сам ZEN здесь - https://yadi.sk/d/j0W0KgEQ3KRgHP
Для установки, нужно вытащить данный файл из архива и скопировать его в Gothic II\Data
Ах, да. Данные исправления совместимы с патчем от Димуса.

По поводу провалившихся под меш объектов - восстановлены они не полностью лишь потому, что потеряли свою актуальность. Подавляющее большинство объектов, торчащих под мешем Рудниковой долины Г2, это объекты которые провалились туда ещё со времён Г1. В основном это булыжники и разного рода растительность. И если к булыжникам у меня нет никаких претензий, то к растительности есть, а именно - к кустарниковым растениям(Ow_lob_bush_V1 и Ow_lob_bush_V4). Ведь рудниковая долина в Г1, это не тоже самое, что рудниковая долина в Г2. Тут вам и драконы и всякая другая нечисть, из-за которой видимо количество данных видов растений резко поубавилось. Поэтому, восстанавливать их все и озеленять Рудниковую долину было бы ошибкой. Однако... парочку кустарников я всё же восстановил, в некоторых местах в качестве исключения, хотя и не уверен, что стоило.
 

Вложения

  • 21.png
    21.png
    4 MB · Просмотры: 534
  • 22.png
    22.png
    3,9 MB · Просмотры: 421
  • 1.png
    1.png
    2,1 MB · Просмотры: 384
  • 2.png
    2.png
    2,1 MB · Просмотры: 392
  • 3.png
    3.png
    1,6 MB · Просмотры: 409
  • 4.png
    4.png
    1,7 MB · Просмотры: 352
Последнее редактирование:

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.124
Благодарности
3.215
Баллы
485
Шикарная работа! Низкий тебе поклон.

Поэтому, восстанавливать их все и озеленять Рудниковую долину было бы ошибкой.
В Gothic Russobit-M Fix скрытые модели, неуместные для восстановления я просто удаляла. Для экономии памяти.

Тоже хочу сделать несколько дополнений.

1) Исправление исправленного зена Ирдората:
- передвинуто несколько висящих в воздухе моделей;
- многострадальный сундук в каюте капитана открывается с анимацией и звуком, его модель непроницаемая;
- развернут вейпоинт, на который телепортируется игрок после победы над драконом-нежитью. В ролике мы видим, как ГГ выходит из его логова, но в итоге почему-то оказывался к нему лицом. Исправлено.
Extro_PAL.bik_snapshot_00.52_[2017.06.25_09.52.02].jpg tpend.jpg

2) Исправление текстур средней и тяжелой брони наемника в инвентаре. Они использовали текстуры из Г1 с элементами синего цвета, которых в Г2 уже, конечно, нет.
ar_o.png ar_f.png

3) Переведена секретная надпись-пасхалка за стеной орков.
eggrus.png

Для установки скопируйте все файлы vdf в папку Gothic II/Data.
 

Вложения

  • dragonislandfix2.rar
    3,9 MB · Просмотры: 71
  • sld_armor_fix.rar
    70,3 KB · Просмотры: 98
  • egg_sign_rus.rar
    33,6 KB · Просмотры: 60

Kvincius

Участник форума
Регистрация
6 Ноя 2012
Сообщения
257
Благодарности
234
Баллы
210
В Gothic Russobit-M Fix скрытые модели, неуместные для восстановления я просто удаляла. Для экономии памяти.
Я так и делал*right*
Только и осталось, что над мешем поколдовать и можно будет приступать к следующему..
 

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.124
Благодарности
3.215
Баллы
485
И ещё несколько дополнений. Первое и второе уже включены в Gothic 2 Steam Fix последней версии.

1) Исправление полного отсутствия музыки в заснеженной части Рудниковой долины. Триггеры карты ссылались на несуществующие треки.
Установка: скопировать musicfix.vdf в папку Gothic II/Data. Новая игра не требуется.

2) Немного улучшенное главное меню. Добавлено несколько дополнительных настроек, исправлены интервалы и положение текста.
Установка: скопировать newmenu.vdf в папку Gothic II/Data. Новая игра не требуется.
menu.png

3) Мантия Ксардаса на черном маге Ищущих на Ирдорате, это, конечно, очень странно. Не по лору как-то. Я считаю это недоработкой, поэтому сделала для него новую одежду на основе легкой мантии магов Огня с текстурой мантии Ищущих. Теперь он будет выглядеть как все остальные и не иметь никакой связи с Ксардасом. Установка: скопировать armor_dementor_boss.vdf в папку Gothic II/Data. Нужно внести несколько дополнений в скрипты, новая игра не требуется:
//для начала, инстанция новой мантии, на основе мантии Ксардаса, но с новым визуалом:

instance ITAR_Dementor_Boss(C_Item)
{
name = "Мантия";
mainflag = ITEM_KAT_ARMOR;
flags = 0;
protection[PROT_EDGE] = 100;
protection[PROT_BLUNT] = 100;
protection[PROT_POINT] = 100;
protection[PROT_FIRE] = 50;
protection[PROT_MAGIC] = 50;
value = VALUE_ITAR_Xardas;
wear = WEAR_TORSO;
visual = "ItAr_Xardas.3ds";
visual_change = "Armor_Dementor_Boss.asc";
visual_skin = 0;
material = MAT_LEATHER;
description = name;
text[1] = NAME_Prot_Edge;
count[1] = protection[PROT_EDGE];
text[2] = NAME_Prot_Point;
count[2] = protection[PROT_POINT];
text[3] = NAME_Prot_Fire;
count[3] = protection[PROT_FIRE];
text[4] = NAME_Prot_Magic;
count[4] = protection[PROT_MAGIC];
text[5] = NAME_Value;
count[5] = value;
};

//затем экипировка этой мантии на мага вместо ITAR_Dementor:

instance DMT_1299_OberDementor_DI(Npc_Default)
{
...
B_SetNpcVisual(self,MALE,"Hum_Head_Bald",Face_N_MadPsi,BodyTex_N,ITAR_Dementor_Boss);
robe2.png
 

Вложения

  • musicfix.rar
    3,1 KB · Просмотры: 46
  • newmenu.rar
    18,4 KB · Просмотры: 47
  • armor_dementor_boss.rar
    44,2 KB · Просмотры: 55

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.562
Благодарности
4.153
Баллы
915
Хорошая работа!*thumbs up*

Чтобы включить ваши наработки в неофициальное обновление, прошу указать изменения в скриптах MENU.DAT и MUSIC.DAT.
Хотя я сомневаюсь, что введение новой инстанции мантии чёрного мага не потребует начала новой игры.
 

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.124
Благодарности
3.215
Баллы
485
Хотя я сомневаюсь, что введение новой инстанции мантии чёрного мага не потребует начала новой игры.
А ты добавь и отойди подальше проверь.;)

Про MENU.DAT не могу сказать точно, почти везде были изменения, удаления и дополнения.
В MUSIC.DAT добавлено:
instance NCO_DAY_STD(C_MUSICTHEME_STANDARD)
{
file = "owd_daystd.sgt";
};

instance NCO_DAY_THR(C_MUSICTHEME_THREAT)
{
file = "owd_daystd.sgt";
};

instance NCO_DAY_FGT(C_MUSICTHEME_FIGHT)
{
file = "owp_dayfgt.sgt";
};

instance NCO_NGT_STD(C_MUSICTHEME_STANDARD)
{
file = "owd_daystd.sgt";
};

instance NCO_NGT_THR(C_MUSICTHEME_THREAT)
{
file = "owd_daystd.sgt";
};

instance NCO_NGT_FGT(C_MUSICTHEME_FIGHT)
{
file = "owp_dayfgt.sgt";
};

instance NCI_DAY_STD(C_MUSICTHEME_STANDARD)
{
file = "dlc_daystd.sgt";
};

instance NCI_DAY_FGT(C_MUSICTHEME_FIGHT)
{
file = "dlc_dayfgt.sgt";
};
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.562
Благодарности
4.153
Баллы
915
Включил в тестовую сборку все последние исправления, кроме сильно изменённого нового меню:
- в главном меню переименованы пункты "Заставка" и "Титры";
- в разделе "Опции" нет пункта "Производительность/качество";
- параметры из раздела "Расширенная конфигурация" перенесены в раздел "Опции визуализации";
- в разделе "Опции звука" неправильно отображается подсказка у пункта "Звук";
- в разделе "Опции управления" нельзя переключиться между стандартными и альтернативными настройками.

1.При прошлых прохождениях, всегда отдавал учётную книгу Френсису и получал ключ от дома Грега. В этот же раз, просто тупо избил его и забрал ключ. Если так сделать, то Френсис будет готов заплатить за свою книгу 500 золотых. Однако, если не отдать ему книгу вовремя, то после того как вернётся Грег и отправит пилить Френсиса доски, сделать этого будет уже нельзя. На мой взгляд, когда бы ни нашёл игрок эту книгу, Френсис всегда должен быть готов выкупить её у ГГ, а не только до возвращения Грега.
А я считаю, что после возвращения Грега и наказания Френсиса ГГ теряет возможность шантажировать этого персонажа. После последней вылазки Грег потерял корабль и половину своей команды, поэтому он всего лишь отправляет пилить доски провинившихся Френсиса и Моргана.
2.Если при диалоге с Пардосом, когда выбираешь какое зелье ему дать, нажать "назад", то данная возможность исчезнет и больше не появится.
Очень странно, потому что моё единственное изменение в скрипте диалогов с Пардосом - полное исцеление при выдаче ему мясного супа. Т.к. в имеющейся у меня коллекции своих и чужих сэйвов нет сэйва после получения от Торуса разрешения войти в верхнюю часть лагеря, пожалуйста поделись своим.
3.Рози может напасть на ГГ, если открыть сундук Ксардаса в доме Секоба, когда она рядом.
Так и должно быть, т.к. что это помещение принадлежит крестьянам (GIL_BAU). Поэтому надо использовать момент, когда рядом с сундуком нет его хозяев (спят или изгнаны ищущими).
4.Вроде бы очень старый баг. Нашёл мёртвого Кроноса в Хоринисе в той самой пещере(сейв).
Дело в том, что в стандартном морге Хориниса не хватает места для трупов всех NPC, у которых указан посмертный перенос туда функцией Rtn_xxx_Tot.
1.Самюэль продаёт быструю селёдку через диалоговое окно. И всё бы ничего, но он продаёт её по всего одной штуке за раз. Из-за этого, если хочешь купить бутылок 30(как я всегда и делаю), нужно сделать огромное количество кликов. Было бы удобно, если бы появилась опция в диалоговом окне, покупать к примеру сразу по 10 бутылок за клик.
Лично я против подобных упрощений для казуальных игроков, поэтому покупка алкоголя останется без изменений.
2.Сильвио и Буллко стоят у входа в ледяную долину и Сильвио говорит ГГ зачистить зачистить всё там, а они мол пойдут следом. Затем, уже после убийства дракона, если вернуться к ним, то Сильвио скажет что-то вроде - "Ледяной дракон мёртв! А ты отдашь мне всё что у тебя есть". Тут появляется 2 вопроса. Откуда Сильвио знает про то, что ГГ убил дракона, если он всё это время проторчал у входа в долину? И почему они вообще за ГГ не пошли, ведь логичней взять ГГ тёпленьким, сразу после того как он повалил дракона, а не ошиваться у входа. Собственно, на мой взгляд сцена должна выглядеть так:
После разговора с драконом, Сильвио и Буллко появляются где-то в пределах видимости, за спиной ГГ, и наблюдают как он убивает дракона, но не помогают ему и не агрятся на дракона. После убийства дракона, ГГ может подойти к ним, Сильвио говорит про то, что ледяной дракон мёртв, бла-бла-бла, и они нападают на ГГ. Данная правка также позволит не забывать про этих 2-их и не телепортироваться сразу же после убийства дракона в замок.
Тогда предложи для них безопасные места внутри бывшего НЛ с учётом того, что игрок может не зачищать территорию, а проскочить до Финкрега в облике какого-нибудь зверя.
 
Последнее редактирование:

Kvincius

Участник форума
Регистрация
6 Ноя 2012
Сообщения
257
Благодарности
234
Баллы
210
Т.к. в имеющейся у меня коллекции своих и чужих сэйвов нет сэйва после получения от Торуса разрешения войти в верхнюю часть лагеря, пожалуйста поделись своим.
Увы, сейва нет. Возможно через пару недель..
Лично я против подобных упрощений для казуальных игроков, поэтому покупка алкоголя останется без изменений.
Димус, я не прошу тебя переделать весь баланс в игре, чтобы даже 5-тилетний ребёнок, одной левой мог с ней справится. Я всего лишь прошу ввести нормальную покупку алкоголя. Причём здесь вообще оказуаливание? То, что игрок не может купить сразу столько бухла, сколько нужно, это просто дурацкая условность. Зачем она нужна? И что вообще хорошего, в глупом закликивании строчки диалога, на протяжении нескольких минут?
Тогда предложи для них безопасные места внутри бывшего НЛ с учётом того, что игрок может не зачищать территорию, а проскочить до Финкрега в облике какого-нибудь зверя.
Чтож и правда, игрок может сделать что-то подобное. В таком случае, лучше им не спавниться в пещере. Тогда как насчёт вейпоинтов OW_DJG_ICEREGION_WAIT2_01 и OW_DJG_ICEREGION_WAIT2_02 находящихся возле пещеры? Возможно даже, что они для этих двоих и созданы.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.331
Благодарности
3.178
Баллы
525
Дело в том, что в стандартном морге Хориниса не хватает места для трупов всех NPC, у которых указан посмертный перенос туда функцией Rtn_xxx_Tot.
Вариант 1. Сделать другой "морг". Тут потребуется правка ZENа.
Вариант 2. Удалять неписей из мира, вместо назначения им распорядка с нахождением в "морге".
Код:
Wld_RemoveNpc(var int instanceNpc);

Например:
Wld_RemoveNpc(Hlp_GetInstanceID(NONE_100_Xardas)); (нельзя использовать, когда на данного непися указывает одна из глобальных ссылок self, other, victim)

Так и должно быть, т.к. что это помещение принадлежит крестьянам (GIL_BAU).
Но можно добавить исключение для конкретного непися или группы неписей, помеченных аивариной, например, в функции B_AssessUseMob. ;)

Тогда предложи для них безопасные места внутри бывшего НЛ с учётом того, что игрок может не зачищать территорию, а проскочить до Финкрега в облике какого-нибудь зверя.
Если очень захотеть, то можно кое-что сделать. Например, можно создать персональные инстанции для населения логова ледяного дракона и отслеживать их убиение в специальной функции, выбирая для Сильвио и Буллко одну из позиций, вокруг которой монстры уже зачищены. Да, это геморрно. Но если задаться целью, то способ реализации найти можно.
 
Последнее редактирование:

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.562
Благодарности
4.153
Баллы
915
Чтож и правда, игрок может сделать что-то подобное. В таком случае, лучше им не спавниться в пещере. Тогда как насчёт вейпоинтов OW_DJG_ICEREGION_WAIT2_01 и OW_DJG_ICEREGION_WAIT2_02 находящихся возле пещеры? Возможно даже, что они для этих двоих и созданы.
Всё верно, вэйпойнты созданы именно для этих персов. Оказалось, что PB закомментировали большой кусок диалогов с Сильвио, в котором он и Буллко помогают ГГ зачистить территорию бывшего НЛ - смотри скрипт из G2 MDK. Поэтому в локализации нет озвучки этих диалогов.

P.S.: Попробовал перевести эти диалоги:
Код:
///////////////////////////////////////////////////////////////////////
//    Info AngebotMachen
///////////////////////////////////////////////////////////////////////
instance DIA_SylvioDJG_ANGEBOTMACHEN        (C_INFO)
{
    npc         =     DJG_700_Sylvio;
    condition     =     DIA_SylvioDJG_ANGEBOTMACHEN_Condition;
    information     =     DIA_SylvioDJG_ANGEBOTMACHEN_Info;



    description     =     "Мне нужна ваша помощь в ледяном районе!";
};

func int DIA_SylvioDJG_ANGEBOTMACHEN_Condition ()
{
    if (
    (Npc_KnowsInfo(other, DIA_SylvioDJG_HelloAgain))
    && ((Npc_IsDead(IceDragon))== FALSE)
    )
    {
    return TRUE;
    };
};

func void DIA_SylvioDJG_ANGEBOTMACHEN_Info ()
{
    AI_Output            (other, self, "DIA_SylvioDJG_ANGEBOTMACHEN_15_00"); //Смотри, я делаю тебе предложение.
    AI_Output            (self, other, "DIA_SylvioDJG_ANGEBOTMACHEN_09_01"); //Ну, тогда я тебя слушаю.
    AI_Output            (other, self, "DIA_SylvioDJG_ANGEBOTMACHEN_15_02"); //Вы не случайно сидите здесь, в ледяном районе. Вы собираетесь пойти и захватить там добычу.
    AI_Output            (self, other, "DIA_SylvioDJG_ANGEBOTMACHEN_09_03"); //А что, если это так?
    AI_Output            (other, self, "DIA_SylvioDJG_ANGEBOTMACHEN_15_04"); //Мы могли бы пойти вместе!
    AI_Output            (self, other, "DIA_SylvioDJG_ANGEBOTMACHEN_09_05"); //Почему ты думаешь, что МЫ должны это сделать?
    AI_Output            (other, self, "DIA_SylvioDJG_ANGEBOTMACHEN_15_06"); //Меня не интересуют сокровища дракона. Поэтому вы можете забрать их.
    AI_Output            (self, other, "DIA_SylvioDJG_ANGEBOTMACHEN_09_07"); //Хмм!
    AI_Output            (other, self, "DIA_SylvioDJG_ANGEBOTMACHEN_15_08"); //Вы оба неплохи, но втроем мы можем сделать это гораздо быстрее.
    AI_Output            (self, other, "DIA_SylvioDJG_ANGEBOTMACHEN_09_09"); //Не думай, что сможешь обмануть нас! Кроме того, ледяной дракон - неплохая добыча. Ты сказал, что мы получим все?
    AI_Output            (other, self, "DIA_SylvioDJG_ANGEBOTMACHEN_15_10"); //Точно! Теперь, когда я знаю, что это насчет дракона...
    AI_Output            (self, other, "DIA_SylvioDJG_ANGEBOTMACHEN_09_11"); //Черт! Хорошо, я согласен! Дай мне знать, когда будешь готов!

    Log_AddEntry (TOPIC_Dragonhunter,"Сильвио подозревает, что в ледяном районе есть дракон.");
};


//---------------------------------------------------------------------
//    Info WAIT
//---------------------------------------------------------------------
INSTANCE DIA_SylvioDJG_WAIT (C_INFO)
{
    npc            = DJG_700_Sylvio;
    condition    = DIA_SylvioDJG_WAIT_Condition;
    information    = DIA_SylvioDJG_WAIT_Info;
    important    = 0; 
    permanent    = 1;
    description    = "Немного подожди!";
};                     

FUNC INT DIA_SylvioDJG_WAIT_Condition()
{
    if    (
        (self.aivar[AIV_PARTYMEMBER] == TRUE)
        && ((Npc_IsDead(IceDragon))== FALSE)
        )
    {
        return TRUE;
    };
};

func VOID DIA_SylvioDJG_WAIT_Info()
{
    AI_Output             (other,self,"DIA_SylvioDJG_WAIT_15_00"); //Немного подожди!
    AI_Output             (self,other,"DIA_SylvioDJG_WAIT_09_01"); //Что такое? Давай-ка идем дальше!
    AI_StopProcessInfos    (self);
};

//---------------------------------------------------------------------
//    Info IceWait1
//---------------------------------------------------------------------
INSTANCE DIA_SylvioDJG_IceWait1 (C_INFO)
{
    npc            = DJG_700_Sylvio;
    condition    = DIA_SylvioDJG_IceWait1_Condition;
    information    = DIA_SylvioDJG_IceWait1_Info;
    important    = 0; 
    permanent    = 0;
    description    = "Я готов!";
};                     

FUNC INT DIA_SylvioDJG_IceWait1_Condition()
{
    if    ((self.aivar[AIV_PARTYMEMBER] == FALSE)
        && (Npc_KnowsInfo(other, DIA_SylvioDJG_ANGEBOTMACHEN))
        && ((Npc_IsDead(IceDragon))== FALSE)
         )
    {
        return TRUE;
    };
};

func VOID DIA_SylvioDJG_IceWait1_Info()
{
    AI_Output             (other,self,"DIA_SylvioDJG_IceWait1_15_00"); //Я готов! Пошли!
    AI_Output             (self,other,"DIA_SylvioDJG_IceWait1_09_01"); //Посмотрим, насколько ты хорош.
    Info_AddChoice        (DIA_SylvioDJG_IceWait1, "losgehen", DIA_SylvioDJG_IceWait1_losgehen );


};
func void DIA_SylvioDJG_IceWait1_losgehen ()
{
    self.aivar[AIV_PARTYMEMBER] = TRUE;
    DJG_Bullco.aivar[AIV_PARTYMEMBER] = TRUE;
    AI_StopProcessInfos    (self);

    Npc_ExchangeRoutine    (self,        "IceWait1");

    if     ((Hlp_IsValidNpc (DJG_Bullco))
        && (!Npc_IsDead (DJG_Bullco)))
        {
            Npc_ExchangeRoutine    (DJG_Bullco,"IceWait1");
            AI_ContinueRoutine (DJG_Bullco);
        };
};




//***************************************************************************
//    Info IceWait2
//***************************************************************************
INSTANCE DIA_SylvioDJG_IceWait2 (C_INFO)
{
    npc            = DJG_700_Sylvio;
    condition    = DIA_SylvioDJG_IceWait2_Condition;
    information    = DIA_SylvioDJG_IceWait2_Info;
    important    = 1; 
    permanent    = 0;
};                     

FUNC INT DIA_SylvioDJG_IceWait2_Condition()
{
    if (
        (Npc_GetDistToWP(self,"OW_DJG_ICEREGION_WAIT1_01")<1000)               
        && ((Npc_IsDead(IceDragon))== FALSE)
        )
    {
        return TRUE;
    };
};

func VOID DIA_SylvioDJG_IceWait2_Info()
{
    AI_GotoNpc    (self,    other);

    AI_Output (self, other,"DIA_SylvioDJG_IceWait2_09_00"); //Итак, первый уровень пройден!
    AI_Output (other, self,"DIA_SylvioDJG_IceWait2_15_01"); //Идем дальше!
    AI_Output (self, other,"DIA_SylvioDJG_IceWait2_09_02"); //Послушай! Неужели тебе этого недостаточно, малыш?
    Info_AddChoice    (DIA_SylvioDJG_IceWait2, DIALOG_ENDE, DIA_SylvioDJG_IceWait2_weiter );
};

func void DIA_SylvioDJG_IceWait2_weiter ()
{
    AI_Output (self, other,"DIA_SylvioDJG_IceWait2Weiter_09_00"); //Ну, тогда идем!

    AI_StopProcessInfos    (self);

    self.aivar[AIV_PARTYMEMBER] = TRUE;
    DJG_Bullco.aivar[AIV_PARTYMEMBER] = TRUE;

    Npc_ExchangeRoutine    (self,        "IceWait2");

    if     ((Hlp_IsValidNpc (DJG_Bullco))
        && (!Npc_IsDead (DJG_Bullco)))
        {
            Npc_ExchangeRoutine    (DJG_Bullco,"IceWait2");
            AI_ContinueRoutine (DJG_Bullco);
        };
};

  



//***************************************************************************
//    Info GoForIceDragon
//***************************************************************************
INSTANCE DIA_SylvioDJG_GoForIceDragon (C_INFO)
{
    npc            = DJG_700_Sylvio;
    condition    = DIA_SylvioDJG_GoForIceDragon_Condition;
    information    = DIA_SylvioDJG_GoForIceDragon_Info;
    important    = 1; 
    permanent    = 0;
};                     

FUNC INT DIA_SylvioDJG_GoForIceDragon_Condition()
{
    if (
    (Npc_GetDistToWP(self,"OW_DJG_ICEREGION_WAIT2_01")<1000)
    && ((Npc_IsDead(IceDragon))== FALSE)
    )
    {
        return TRUE;
    };
};

func VOID DIA_SylvioDJG_GoForIceDragon_Info()
{
    AI_GotoNpc    (self,    other);

    AI_Output     (self, other,"DIA_SylvioDJG_GoForIceDragon_09_00"); //Итак, теперь надо разобраться с драконом. Что будешь делать? Впрочем, это уже неважно...
    AI_Output    (other, self,"DIA_SylvioDJG_GoForIceDragon_15_01"); //Я предупреждаю тебя, Сильвио, не пытайся надуть меня!
    AI_Output     (self, other,"DIA_SylvioDJG_GoForIceDragon_09_02"); //До этого момента тебе... скажем... была нужна помощь. Но теперь, когда мы проделали большую часть работы на равнине с големами, будь же профессионалом. Иначе с тобой может произойти что-то иное.
    AI_Output    (other, self,"DIA_SylvioDJG_GoForIceDragon_15_03"); //Ни за что!
    AI_Output    (self, other,"DIA_SylvioDJG_GoForIceDragon_09_04"); //Ну что ж! Если ты хочешь по-плохому. Но потом не жалуйся...
    AI_Output    (other, self,"DIA_SylvioDJG_GoForIceDragon_15_05"); //Заткнись!

    Log_AddEntry (TOPIC_Dragonhunter,"Сильвио должен был первым прикрывать мне спину после того, как мы покинули равнину големов. Наконец-то мы вместе напали на ледяного дракона.");
  
    B_GivePlayerXP (XP_SylvioDJGIceClear);
  
    Info_AddChoice    (DIA_SylvioDJG_GoForIceDragon, "Идти дальше", DIA_SylvioDJG_GoForIceDragon_weitergehen );
};

func void DIA_SylvioDJG_GoForIceDragon_weitergehen ()
{
    AI_Output    (self, other, "DIA_SylvioDJG_GoForIceDragon_weitergehen_09_00"); //Пошли дальше!

    AI_StopProcessInfos    (self);

    Npc_ExchangeRoutine    (self,    "IceDragon");

    if     ((Hlp_IsValidNpc (DJG_Bullco))
        && (!Npc_IsDead (DJG_Bullco)))
        {
            Npc_ExchangeRoutine    (DJG_Bullco,"IceDragon");
            AI_ContinueRoutine (DJG_Bullco);
        };

    self.flags =0;
    DJG_Bullco.flags =0;

    self.aivar[AIV_PARTYMEMBER] = FALSE;
    DJG_Bullco.aivar[AIV_PARTYMEMBER] = FALSE;
};



///////////////////////////////////////////////////////////////////////
//    Info WhatNext
///////////////////////////////////////////////////////////////////////
instance DIA_SylvioDJG_WHATNEXT        (C_INFO)
{
    npc             =     DJG_700_Sylvio;
    condition     =     DIA_SylvioDJG_WHATNEXT_Condition;
    information     =     DIA_SylvioDJG_WHATNEXT_Info;
    important     =     TRUE;


};

func int DIA_SylvioDJG_WHATNEXT_Condition ()
{
    if (
        ((Npc_IsDead(IceDragon))== TRUE) 
        )
    {
        return TRUE;
    };
};

func void DIA_SylvioDJG_WHATNEXT_Info ()
{
    AI_Output    (self, other, "DIA_SylvioDJG_WHATNEXT_09_00"); //Ледяной дракон мертв! А теперь ты отдашь мне все, что у тебя есть!
    AI_Output    (other, self, "DIA_SylvioDJG_WHATNEXT_15_01"); //В чем дело? Я так не думаю! 
    AI_Output    (self, other, "DIA_SylvioDJG_WHATNEXT_09_02"); //Это я получу всю славу за убийство ледяного дракона. А твоя маленькая роль в этом деле окончена!
  
    AI_StopProcessInfos    (self);
  
    self.flags =0;
    DJG_Bullco.flags =0;

    Log_AddEntry (TOPIC_Dragonhunter,"Эта грязная свинья Сильвио собирался присвоить себе мою победу над ледяным драконом. Мы немного повздорили.");

    B_Attack (self, other, AR_NONE, 1); 
    B_Attack (DJG_Bullco, other, AR_NONE, 1); 
  
    Npc_ExchangeRoutine (self,    "Start");

    if     ((Hlp_IsValidNpc (DJG_Bullco))
        && (!Npc_IsDead (DJG_Bullco)))
        {
            Npc_ExchangeRoutine    (DJG_Bullco,"Start");
            AI_ContinueRoutine (DJG_Bullco);
        };
};
 

Вложения

  • DIA_DJG_700_Sylvio.rar
    5,5 KB · Просмотры: 61
Последнее редактирование:

heckler

Участник форума
Регистрация
25 Апр 2017
Сообщения
413
Благодарности
109
Баллы
210
Хуан из пещеры на болотах продает 20 бутылок украденого у пиратов грога. По сюжету его надо убить и забрать их, но они пропадают после его гибели. Остаются только пакеты для Фиска и Хуно.
В патче он продает ещё и перец. Так и должно быть?
Бандит рядом с ним никак не реагирует, хотя из реплик Хуана следует что должен.
 
Последнее редактирование:
Сверху Снизу