Уважаемые гости и новички, приветствуем Вас на нашем форуме
Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».
Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
Внимание! Летописи строителей в данный момент заполняются дальше! Поэтому если Вы нашли где-то ошибку или хотите что-либо добавить в них, то просим зайти Вас в тему: Обсуждение летописей! Так же там идет обсуждение.
Урок 1: Создание в 3D Studio MAX локации для Готики
Важно! Всё построение производилось в 3D Studio MAX 6, так что могут быть некоторые отличия от предыдущих частей (или новых. - прим. ред.).
План:
1. Основные операции при создании локаций для Готики в 3D Studio MAX
а) Создание ландшафта
б) Создание зданий
в) Наложение текстур (в том числе и с использованием текстурных координат)
2. Создание непосредственно самой “Арены”
1. а) Ландшафт:
Для начала установим метрическую систему на сантиметры (наблюдается несовпадение с метрической системой Spacera, т.е.
Spacer распознаёт только сантиметры, а при использовании других систем
измерения наблюдается несовпадение размеров) :
главное меню-> Customize-> Units Setup-> System Units Setup
Создадим поверхность, на которой всё и будет находиться. Можно конечно
взять за основу просто плоскость
панель управления справа: Create-> Geometry-> Plane
, но лучше и реалистичнее будет создать ландшафт.
Тут есть много вариантов, например, создать плоскость (Create-> Geometry->
Plane), поставить нужный размер (Length=+; Width=+ в параметрах ниже),
задать кол-во сегментов (Length Segs=+; Width Segs=+, там же где и размер
плоскости ), щёлкнуть по плоскости правой клавишей (вход в контекстное
меню), применить модификатор Edit Mesh,
контекстное меню-> Convert to:-> Convert to Editable Mesh
выбрать редактирование по вeртексам (вершинам)
панель управления-> Selection-> Vertex
и уже по своему усмотрению перемещать их вверх или вниз.
главное меню вверху-> Select & Move (значок ввиде стрелочек во все
стороны)
Но я предлагаю делать иначе, т.е. с помощью составного объекта (Compound
Object) типа ландшафт (Terrain).
Сделайте две окружности на виде сверху (Top) кривой типа кольца (Donut)
радиус внутреннего- 3000 (сама арена), внешнего- 10000
панель управления: Create-> Shapes-> Donut
Используйте кривые типа линии (Line), чтобы создать заготовки неровностей,
делайте по-больше вершин (для начала нарисуйте линии напроекции сверху).
Затем выберите одну из линий и объедините с остальными (для удобства можно
переходить лишь к одному окну проекции alt+ W)
контекстное меню-> Attach-> щёлкаете по очереди по всем вашим линиям
Перейдите к редактированию
панель управления:-> Modify (следующая вкладка после Create)
Выберите выделение вертексов
панель управления-> Selection-> Vertex
и, выбирая их на проекции сверху, поднимайте или опускайте вершины на
проекции сбоку. Выберите вершины и сделайте сглаживание (Smooth)
контекстное меню-> Smooth
Примените модификатор шум (Noise)
главное меню-> Modifiers-> Parametric Deformers-> Noise
Перейдите к типу редактируемых кривых
контекстное меню-> Convert to:-> Convert to Editable Spline
Теперь надо нормализовать кривую
главное меню-> Modifiers-> Patch/Spline Editing-> Normalize Spline
Если возникнут какие либо проблемы при нормализации, то можно всё поправить
на уровне вершин (у меня не было проблем)
главное меню-> Modifiers-> Patch/Spline Editing-> Edit Spline
Нажмите вкладку Create на панели управления, выберите 2 окружности
(Donut01), что создали в самом начале и создайте составной объект типа
ландшафт
панель управления: Create-> Geometry-> в списке выберите Compound
Objects-> Terrain-> там нажмите Pick Operand и выберите линии, что создали
в начале
Во вкладке Modify на панели управления поставьте Simplification на
Interporale Points * 2 Теперь объект надо сгладить с помощью Mesh Smooth
или HSDS
главное меню-> Modifiers-> Subdivision Surfaces-> MeshSmooth
или
главное меню-> Modifiers-> Subdivision Surfaces-> HSDS Modifier
Примените к объекту разбиение
панель управления: -> Advanced Options-> кнопка Adaptive Subdivision
Итак, ландшафт готов, теперь наложим на него текстуры.
Дадим имя “Ландшафт” нашей поверхности (так будет легче в дальнейшем её
определять)
панель управления:-> Modify (строка названия)
Теперь откройте редактор материалов
главное меню-> Rendering-> Material Editor или клавиша “М”
Выберите 1 шарик для отображения текстур, щёлкните по кнопке (Blinn Basic
Parameters-> Diffuse), из списка выбираем Bitmap и путь к текстуре (я
выбрал …\Gothic II \_work\Data\Textures\Level\NewWorld\
NW_Nature_GreatSea_Sand_01.tga), затем жмёте Assign Material to Selection
(кнопка ввиде кружка и квадратика, соединённых кривой стрелочкой)
Ну вот и всё, поверхность готова.
б) Создание дома:
Создайте плоскость (Create-> Geometry-> Plane), поставьте нужный размер
(Length= 3000; Width= 3000 в параметрах ниже), задайте кол-во сегментов
(Length Segs= 3; Width Segs= 3, там же где и размер плоскости ), щёлкните
по плоскости правой клавишей (вход в контекстное меню), примените
модификатор Edit Poly,
контекстное меню-> Convert to:-> Convert to Editable Poly
выберите редактирование по полигонам (плоскостям)
панель управления-> Selection-> Polygon
выберите центральный полигон и переместитеего вверх на окне проекции сбоку,
чтобы наш будущий дом стоял на холме.
главное меню вверху-> Select & Move (значок ввиде стрелочек во все
стороны)
Затем, не снимая выделение с полигона, примените функцию Extrude
панель управления-> Edit Geometry-> Extrude
и вытените на 300, затем на тот же полигон примените функцию Bevel
панель управления-> Edit Geometry-> Bevel
и поставьте значения Height на 0, Outline Amount на -30, а Bevel Type на By
Polygon и ОК.
На получившийся полигон сделайте Extrude на -300.
Теперь выберите боковую грань нашего здания, где будет дверь, и примените
Bevel со значениями Height на 0, Outline Amount на -30, а Bevel Type на By
Polygon, сделайте Bevel с обеих сторон стенки с одинаковыми значениями.
Получившийся полигон снаружи стены проэкструдьте на -30 и удалите, а
полигон внутри стены просто удалите. Получилась стена, но великоватая для
двери- сейчас исправим.
Выберите выделение вертексов
панель управления-> Selection-> Vertex
Выберите получившиеся вертексы на боковой грани (дверной проём) и
перетяните их на проекции сбоку, так чтобы получился прямоугольник (дверь).
Удобно перемещать сразу 4 полигона с каждого бока (всего 8 ), выделяя с
нажатым Ctrl.Также неплохо убрать и порог, он нам совершенно не нужен.
Просто опустите нижние вершины дверного проёма до уровня пола.
Так, теперь сделаем камин для дома.
Сделайте Box с размерами Length= 300; Width= 100; Height= 200.Преобразуйте
его к Editable Poly. Выберите его грань, где будет топка и примените
функцию Bevel
панель управления-> Edit Geometry-> Bevel
и поставьте значения Height на 0, Outline Amount на -30, а Bevel Type на By
Polygon.
Выберите 4 получившихся вертекса и преобразуйте их к Editable Mesh
контекстное меню-> Convert to:-> Convert to Editable Mesh
Затем примените к 2 верхним вертексам Chamfer Vertex (кромки) 2 раза, чтобы
получились закруглённые углы.
контекстное меню-> Chamfer Vertex
Нижние 2 вертекса опустите пониже, но не до самого пола.
Теперь проэкструдьте центральный полигон на -100 (внимание он состоит из
нескольких Face: панель управления-> Selection-> Face - выбирайте все).
Подиагонали получится лишний полигон- выделите его и удалите, также можно
удалить заднюю стенку камина: она не нужна.
Теперь сделаем дымоход.
Создайте Box с размерами Length= 300; Width= 100; Height= 100, примените
модификатор Edit Mesh, выделите верхний полигон и примените Scale
контекстное меню-> Scale
и сожмите верх до ширины трубы, затем поставьте дымоход точно на камин и
присоедините
контекстное меню-> Attach
Всю печку сделайте Editable Poly. Теперь выберите самый верхний полигон
дымохода (начало трубы) и проэкструдьте его на 350, не снимая выделения с
полигона сделайте Bevel на Height= 0, Outline Amount= -10, а Bevel Type- By
Polygon, затем Extrude на - 300.
Поставьте камин к стене и присоедините к дому
контекстное меню-> Attach
Сделаем ещё прилавок- Box на 200; 500; 100 и присоедините к дому.
Стены есть, дверь есть, окон не надо- в Готике они идут текстурами,
осталась крыша.
Создайте Box с размерами Length=1030; Width=1030; Height= 300 и все
сегменты на 1.
Поставьте его ровно на стены (туда, где будет крыша), примените модификатор
Edit Mesh,
контекстное меню-> Convert to:-> Convert to Editable Mesh
выделите верхний полигон и примените Scale
контекстное меню-> Scale
и сожмите верх крыши по вашему вкусу.
Присоедините крышу ко всему остальному
контекстное меню-> Attach
Теперь откройте редактор материалов
главное меню-> Rendering-> Material Editor или клавиша “М”
Выберите 1 шарик для отображения текстур, щёлкните по кнопке (Blinn Basic
Parameters-> Diffuse), из списка выбираем Bitmap и путь к текстуре (я
выбрал …\Gothic II \_work\Data\Textures\Level\NewWorld\
NW_City_DirtyGround_02.tga), затем жмёте Assign Material to Selection
(кнопка ввиде кружка и квадратика, соединённых кривой стрелочкой).
Кстати, многие меня спрашивали, как сделать башню.
Круглую башню нечего делать: создайте примитив труба (Tybe), проэкструдьте
дверь, вставьте ступеньки
панель управления : Create-> Geometry->…Stairs (в выпадающем меню)->
Spiral Stair
и сделайте крышу. С квадратной почти то же самое, а вот деревянную
смотровую вышку сделать сложнее.
Так вот сделайте Box, разделённый на 3 и более сегментов по высоте, и
примените модификатор Lattice и Edit Mesh
панель управления-> Modifier List-> Lattice
и в Parameters ставите точку около Struts Only From Edges, в Struts-
галочку напротив End Caps.
Поработайте с вершинами, чтобы сделать их менее правильными и сверху
сделайте ещё Box, примените на него Bevel, а затем Extrude, как я уже
раньше описывал- получится платформа с бортиками, соедините всё вместе- вот
вышка и готова.
в) Наложение текстур (в том числе и с использованием текстурных координат)
В 3D Studio MAX есть несколько способов наложения текстур. Начнём с самого простого.
Откройте редактор материалов
главное меню-> Rendering-> Material Editor или клавиша «М»
Выберите 1 шарик для отображения текстур, щёлкните по кнопке (Blinn Basic Parameters-> Diffuse), из списка выбираем а) Checker (шахматная доска), прописываем в Coordinates в графе Tiling U:10 и V:10 или б) Bitmap и путь к текстуре; затем жмёте Assign Material to Selection (кнопка ввиде кружка и квадратика, соединённых кривой стрелочкой). Этот способ уже упомянался при построении объектов, но он обладает существенным недостатком: наблюдается искажение текстур, значит, применять его лучше к плоскостям и неизменённым или малоизменённым примитивам в нашем случае с домом таким способом можно наложить текстуры разве что на площадь рядом с домом.
Другой способ и более надёжный состоит в следующем:
Выделите объект, примените модификатор Mesh Select
панель управления : Modify-> Mesh Select (в выпадающем меню Modifier List)
выберите один скат крыши и примените UVW Mapping
панель управления : Modify-> UVW Map (в выпадающем меню Modifier List)
В стоке модификаторов (списке применённых в панели управления) щёлкните по «+» рядом с UVW Mapping и выберите Gizmo. Теперь на виде сбоку (Front) разверните оранжевый прямоугольник (полщадь применения текстуры) так, чтобы он совпал с плоскостью ската крыши, затем отредактируйте его до совпадения по размерам со скатом крыши (Рис.1.6)
панель управления : Alignment-> Fit
Сейчас можете применять текстуру к выделенному (как и в первом случае). Важно! Для каждой новой плоскости надо заново применять UVW Mapping
Пришло время текстурных координат.
Выделите крышу, назначте в Material Editor текстуру и примените модификатор Unwrap UVW
главное меню-> Modifiers-> UV Coordinates-> Unwrap UVW
войдите в редактор текстурных координат
панель управления-> Parameters-> кнопка Edit
затем в редакторе текстурных координат
меню редактора текстурных координат-> Display-> Filter Selected Faces
Примените плоское текстурирование (Flatten Mapping)
меню редактора текстурных координат-> Mapping-> Flatten Mapping
в параметрах Flatten Mapping поставьте угол <=20 и уберите галочку возле Rotate Clusters
В полученной развёртке поместите полигоны так, чтобы текстуры ложились правильно.
Теперь выберите стены и проделайте то же самое, только с другой текстурой. Аналогично и с остальными поверхностями.
2) Создание «Арены»
Что ж поехали.
Создайте окружность (Circle) на проекции с верху (Top) с радиусом 1500
панель управления : Create-> Shapes-> Circle
Затем на виде сбоку создайте ломанную линию (это собственно будущий контур арены)
панель управления : Create-> Shapes-> Line
(Рис.2.1)
Теперь перейдите к модификатору Loft (не путайте с Лофтом в форуме )
панель управления : Create-> Geometry->…Compound Objects (в выпадающем меню)-> Loft
В Skin Parameters поставьте Shape Steps= 1, а затем щёлкните Get Path во вкладке Creation Method, получится заготовка для арены, но у нас нет дна. Приведите объект к Editable Mesh, затем выделение по вертексам и создайте дно.
контекстное меню-> Create Polyhons
и по-очереди выберите вертексы дна, получился новый полигон.
Теперь создайте 2 Box’a- комнаты за пределами арены напротив друг друга.
Сделайте 2 Box’a- коридоры, примените к ним модификатор Edit Mesh, выдклите верхний полигон п сузьте его
контекстное меню-> Scale
Расположите все объекты, т.е. арена посередине, побокам комнаты, а коридоры соединяют их (Рис.2.2)
Настало время всё соединить. Выделите одну из комнат и примените модификатор Boolean
панель управления : Create-> Geometry->…Compound Objects (в выпадающем меню)-> Boolean
В списке операций (Operation) выберите объединение Union, затем щёлкните Pick Operand B и нажмите на коридор, соответствующий данной комнате. Со второй комнатой сотворите то же самое. Выберите саму арену и присоедините к ней Boolean’ом комнаты.
Отконвертируйте полученный объект к Editable Mesh, выберите полигоны выходов и удалите их.
В дальнейшем при наложении текстур ставьте галочку напротив 2-Sided, чтобы были текстуры и внутри помещений.
Заготовка арены есть.
Теперь можно сделать помещение типа для знатных особ. Сделайте Box, примените на 1 грань Bevel
панель управления-> Edit Geometry-> Bevel
а затем Extrude
панель управления-> Edit Geometry-> Extrude
Чтобы получилось помещение. Дверь можно сделать с помощью модификатора Boolean
панель управления : Create-> Geometry->…Compound Objects (в выпадающем меню)-> Boolean
Создайте примитив с сечением, как у двери и «пронзите» им стенку, где намечается дверь,
в списке операций (Operation) выберите объединение Union, затем щёлкните Pick Operand на этот примитив (сама стена должна быть уже выделена), в итоге примитив исчезнет, а в стене останется проём. Дальше поукрашайте арену по усмотрению.
Теперь наложите текстуры, как было показано в 1.в) из учёта что на примитивы текстуры можно накладывать первым способом, а вот на объекты созданные разными модификаторами (в нашем случае сами кольца арены) лучше с использованием текстурных координат.
instance PAL_9991_Toreodore (Npc_Default) // - Стандартная переменная для всех НПС
{
// —— NSC —— // - просто разделение, чтоб не запутаться. В готовом датнике его нет/
name = “Toreodore”; // - имя
guild = GIL_PAL; // - гильдия (см. в …\_work\Data\Scripts\Content\AI\Human\guilds.d)
) id = 9991; // тот самый ID ,берётся из PAL_***9991***_Toreodore, влияет на определение НПС игрой.
voice = 14; // голос НПС, в нашем случае без разницы какой голос ))
flags = NPC_FLAG_IMMORTAL; // NPC_FLAG_IMMORTAL - НПС бессмертный, ещё есть значение (flags = 0) - НПС смертен.
level = 21; // - уравень НПС
npctype = NPCTYPE_MAIN; // - нужность НПС т.е. друг ,враг, нейтрал, главный (NpcType_Friend, NpcType_Ambient, NpcType_Bl_Main и NpcType_Ocambient , т.е. нужны для миссий)
// —— Attribute —— // - аттрибуты НПС
attribute[ATR_STRENGTH] = 40; // - сила НПС
attribute[ATR_DEXTERITY] = 30; // - ловкость НПС
attribute[ATR_MANA_MAX] = 100; // - Максимальная мана
attribute[ATR_MANA] = 10; // - мана на данный момент
attribute[ATR_HITPOINTS_MAX] = 100; // - максимальная жизнь
attribute[ATR_HITPOINTS] = 46; // - жизнь на данный момент
// —— Equippte Waffen —— // - Вооружение НПС
EquipItem (self, ItMw_1h_Bau_Mace); // - оружие которым вооружён НПС ( в нашем случае **Простой посох**)
EquipItem (self, ItRw_Mil_Crossbow); // -(см.в …\_work\Data\Scripts\Content\Items)
// —— Inventory —— ** - Инвентарь НПС
CreateInvItems (self, ItRw_SLD_Bow); // - оружие в инвентаре НПС ( в данном случае **Салдатский лук**, в основном у НПС здесь лежат деньги, драгоценности и ценные вещи
// —— visuals —— // - Визуализация НПС
B_SetNpcVisual (self, MALE,// - (Мужик, Female-женщина) “Hum_Head_FatBald”,//- (текстура головы НПС) Face_N_OldBald_Jeremiah,// - (лицо НПС) BodyTex_N,// - (текстура тела НПС) ITAR_Vlk_H);// - Броня одетая на НПС
Mdl_SetModelFatness (self, 2); // - жироность НПС )
Mdl_ApplyOverlayMds (self, “Humans_Arrogance.mds”); //- может вместо **Arrogance** быть–> Tired / Militia / Mage / Arrogance / Relaxed это походка НПС- КрутоЙ, уставший пьяный и тд.
// —— Kampf-Talente —— // - Возможности НПС
B_AddFightSkill (self, NPC_TALENT_1H, 30); // - талант владения одноручем
B_AddFightSkill (self, NPC_TALENT_2H, 30); // - талант владения двуручем
B_AddFightSkill (self, NPC_TALENT_BOW, 50); // - талант владения луком
B_AddFightSkill (self, NPC_TALENT_CROSSBOW, 50); // - талант владения арболетом
// —— TA anmelden —— Рассписание дня
daily_routine = Rtn_Start_9991; // - рассписание дня НПС (само рассписани следует НИЖЕ ===\___/===)
};
FUNC VOID Rtn_Start_9991 ()
{
TA_Sit_Throne (09,00,21,00,”МестО1″); // - Нпс сидит но стуле находящийся около вейпоинта Место1
TA_Sleep (21,00,09,00,”МестО2″); // - НПС спит на кровати, находящийся у вейпоинта Место2
};
1) - (Место1;Место2) - это вейпоинты. создаются в Спайсере, около них должно быть то, на что направлено действие (стул, кровать, дверь)
2) - Потом дописываешь в файле ***NPC_Globals**** (C:\Program Files\Gothic II\_work\data\Scripts\Content\Story\NPC_Globals) строчку (var C_NPC Toreodore; - в начале и
Toreodore = Hlp_GetNpc(PAL_9991_Toreodore); - ,ближе к концу
3)Полный состав (ТА_*****) ( TA_Sleep и т.д.) можно посмотреть в (C:\Program Files\Gothic II\_work\data\Scripts\Content\AI\Human) в разделе ***TA***
4)полный спиок лиц
// Для мужчин и женщин (по 4 штуки)
BodyTex_P = 0; //Бледнокожий
BodyTex_N = 1; //Европеец
BodyTex_L = 2; //Латиноамериканец
BodyTex_B = 3; //Негр
BodyTexBabe_P = 4; //Бледнокожая
BodyTexBabe_N = 5; //Европейка
BodyTexBabe_L = 6; //Латиноамериканка
BodyTexBabe_B = 7; //Негритянка
BodyTex_Player = 8; //ГГ
const int BodyTex_T = 10; //Татуированный мужик
const int BodyTexBabe_F = 11; //Татуированная женщина
const int BodyTexBabe_S = 12; //Чернокожий ребенок
5) - Советую поставить!G2MDK(63метра) (без него никуда)!
Теперь о том, как вставить этот самый НПС в игру:
ШАГ 1-ый
Копируем наш *.d файл в папку со всеми неписями у Gothic II\_work\Data\Scripts\Content\Story\NPC
ШАГ 2-ой
В файле Gothic II\_work\data\Scripts\Content\Story\NPC_Globals.d находим строчку var C_NPC Lester; и дописываем под ней var C_NPC Vendigo;(имя вашего НПС). Теперь в этом же файле находим Lester = Hlp_GetNpc(PC_Psionic); и дописываем ниже Vendigo = Hlp_GetNpc(PAL_9991_Toreodore); где PAL_9991_Toreodore название файла Вашего непися.
Почему именно под этой строчкой. Важно не под какой строчкой, а в каком разделе файла, в какой функции. Лестер, так же как и наш новенький непись попадает в в функцию, которая вставляет персов в окрестностях башни ксардаса. А так как нашего перса мы вставляем именно у его башни, то соответственно прописывать нужно именно здесь.(вместо строчки МестО1/2 нужно написать NW_XARDAS_PATH_FARM1_08 или любой другой вуапоинт,их можно посмтреть,открым zen файл в спайсере.)
ШАГ 3-ий
Открываем файл Gothic II\_work\Data\Scripts\Content\Story\StartUp.d Находим в нём строку Wld_InsertNpc (PC_Psionic, “NW_XARDAS_TOWER_PATH_01″); И дописываем ниже Wld_InsertNpc (PAL_9991_Toreodore, “”NW_XARDAS_PATH_FARM1_08″);
ШАГ 4-ый
Открываем Spacer, прогу, поставляющуюся из Девелопменкита или вместе с игрой. Экзешник в папке System. Нажимаем World\Repare Script(Мир – заменить скрипты), выбираем Gothic.scr и нажимаем открыть. После чего начнётся компиляция скриптов. Продолжаться она может достаточно долго. В идиале не должно выскочить ни одной ошибки. Если они всё-таки повыскакивали, не отчаивайтесь, персонаж и с ними может вставиться. Конец компиляции выдаст окно Аутпут-Юнитс, которе заменится на окно Материалз.
ШАГ 5-ый
Теперь заходим в игру и начинаем новую (обязательно! не загружаем!). Проверяем, стоит ли персонаж на месте. Если же персонажа на указанном вайпоинте не оказалось, детально, по строчечке проверте правильность ваших скриптов (везде ли стоят ‘;’ и “{”, нету ли описок в словах и т.д.).
Написание Миссий
INSTANCE DIA_Alex_MIS(C_INFO)
{
npc = bau_999_Alex;Код нпс, который будет доватьь миссию
nr = 2;Важность,месть положение в меню
condition = DIA_Alex_MIS_Condition;// название переменной
information = DIA_Alex_MIS_Info;// название переменной
permanent = FALSE;// то что диалог повторяется бесконечно, если = TRUE, если =False, то один раз
important = TRUE; // нпс начинает говорить первым =TRUE, если =False, то нечего не происходит
description = “ХХХ”; // здесь то о чём будет написанно в меню
};
FUNC INT DIA_Mager_MIS_Condition() //функция переменной, которая записана выше
{
if () //Тут записывается условие,условия можно посмотреть в других миссиях
{
return TRUE;
};
};
FUNC VOID DIA_Alex_MIS_Info() //функция переменной которая записана выше
{
AI_Output (other, self, “DIA_Alex_MIS_15_00″);// //Тут идет диалог отображается в субтитрах,если (other, self) , то начинает ГГ к НПС, если наоборот, то НПС к ГГ
AI_Output (self, other, “DIA_Alex_MIS_04_01″);//
AI_Output (self, other, “DIA_Alex_MIS_04_02″);//
AI_Output (self, other, “DIA_Alex_MIS_04_03″);//
AI_Output (self, other, “DIA_Alex_MIS_04_04″);//
AI_Output (self, other, “DIA_Alex_MIS_04_05″);//
AI_Output (other, self, “DIA_Alex_MIS_15_06″);//
Log_CreateTopic (Topic_Alex,LOG_MISSION); //создаётся запись в дневнике, в теме активных заданий……(Topic_Alex) создаёшь в (Gothic II\_work\data\Scripts\Content\Story\Log_Entries)в (LOG_Constants_Mattes)
Log_SetTopicStatus (Topic_Alex,LOG_RUNNING); // миссия НАЧАЛАСЬ
B_LogEntry (Topic_Alex,”ХХХ.”); //То, что написано в дневнике
};
сохраняем в (Gothic II\_work\data\Scripts\Content\Story\Dialoge)
Внимание : если вы нашли и исправили ошибку, нужно снова компилить Gothic.src
В папке Gothic II\_work\Data\Scripts\Content\Story\Dialoge
создаём файл DIA_NONE_1000_Dedroit.d(создадим далог допустим убить кого-нибудь)!
Вот содержимое этого файла:
instance DIA_Dedroit_q (C_Info)
{
npc = NONE_1000_Dedroit; //ваш нпс
nr = 2;
condition = dia_Dedroit_q_condition;
information = dia_Dedroit_q_info;
permanent = FALSE;
important = FALSE; //если false то диалог начмнаете вы,если TRUE нпс начинает разговор с вами!
description = “Я могу чем нибудь помочь?”;
};
func int dia_Dedroit_q_condition()
{
return TRUE;
};
func void dia_Dedroit_q_info()
{
AI_Output(other,self,”DIA_Dedroit_q_15_00″); //Я могу чем нибудь помочь?
AI_Output(self,other,”DIA_Dedroit_q_3_01″); //Да ты можешь мне почь!Ты бы мог бы убить Вино?
Info_ClearChoices(DIA_Dedroit_q);
Info_AddChoice(dia_Dedroit_q,”Нет я не буду тебе помогать.”,dia_Dedroit_q_w); //Это варианты ответом,которые будут отображаться в главном меню!
Info_AddChoice(dia_Dedroit_q,”Хорошо я убью Вино”,dia_Dedroit_q_e); //Это второй вариант ответа!
};
Если он отказывается помогать ,то
func void dia_Dedroit_q_w()
{
AI_Output(other,self,”dia_Dedroit_q_w_15_00″); //Я не буду помогать тебе!
AI_Output(self,other,”dia_Dedroit_q_w_03_01″); //Тогда не жди и отменя помощи.
};
Если игрок соглашается,то
func void dia_Dedroit_q_e()
{
AI_Output(other,self,”dia_Dedroit_q_e_15_00″); //Хорошо я погу тебе.
AI_Output(self,other,”dia_Dedroit_q_e_03_01″); //Вот и отлично,еслт ты его убьёшь я щедро вознагрожу тебя!
Log_CreateTopic(TOPIC_KillVino,LOG_MISSION);
Log_SetTopicStatus(TOPIC_KillVino,LOG_Running); //дневник
B_LogEntry(TOPIC_KillVino,”Арес попросил меня убить Вино.”); //запись в дневнике
MIS_KillVino = LOG_Running; //Это означает,что миссия началась!
};
instance DIA_Dedroit_q2 (C_Info)
{
npc = NONE_1000_Dedroit;
nr = 1;
condition = dia_Dedroit_q2_condition;
information = dia_Dedroit_q2_info;
permanent = FALSE;
important = FALSE;
description = “Я убил Вино.”;
};
func int dia_Dedroit_q2_condition()
{
if(Npc_IsDead(Vino) && (MIS_KillVino == LOG_Running)) //это означает,что если Вино мёртв то начинается этот диалог!
{
return TRUE;
};
};
func void dia_Dedroit_q2_info()
{
AI_Output(other,self,”dia_Dedroit_q2_info_15_00″); //Я убил вино.
AI_Output(self,other,”dia_Dedroit_q2_info_3_01″); //Великолепно,как я и обещал мой подарок!
MIS_KillVino=LOG_SUCCESS; //миссия завершена
Log_SetTopicStatus(TOPIC_KillVino,LOG_SUCCESS);
B_LogEntry(TOPIC_KillVino,”Я убил вино,а арес как и обещал дал мне подарок.”); //запись в дневнике
B_GivePlayerXP(500); //количество получаевомого опыта,в даном случаи 500!
b_giveinvitems(self,other,ItMW_Addon_Stab03,1); //непись даёт нам подарок посох воды!
};
instance DIA_Dedroit_q (C_Info)
{
npc = NONE_1000_Dedroit;
nr = 2;
condition = dia_Dedroit_q_condition;
information = dia_Dedroit_q_info;
permanent = FALSE;
important = FALSE;
description = “Я могу чем нибудь помочь?”;
};
func int dia_Dedroit_q_condition()
{
return TRUE;
};
func void dia_Dedroit_q_info()
{
AI_Output(other,self,”DIA_Dedroit_q_15_00″); //Я могу чем нибудь помочь?
AI_Output(self,other,”DIA_Dedroit_q_3_01″); //Да ты можешь мне почь!Ты бы мог бы убить Вино?
Info_ClearChoices(DIA_Dedroit_q);
Info_AddChoice(dia_Dedroit_q,”Нет я не буду тебе помогать.”,dia_Dedroit_q_w);
Info_AddChoice(dia_Dedroit_q,”Хорошо я убью Вино”,dia_Dedroit_q_e);
};
func void dia_Dedroit_q_w()
{
AI_Output(other,self,”dia_Dedroit_q_w_15_00″); //Я не буду помогать тебе!
AI_Output(self,other,”dia_Dedroit_q_w_03_01″); //Тогда не жди и отменя помощи.
AI_StopProcessInfos(self);
};
func void dia_Dedroit_q_e()
{
AI_Output(other,self,”dia_Dedroit_q_e_15_00″); //Хорошо я погу тебе.
AI_Output(self,other,”dia_Dedroit_q_e_03_01″); //Вот и отлично,еслт ты его убьёшь я щедро вознагрожу тебя!
Log_CreateTopic(TOPIC_KillVino,LOG_MISSION);
Log_SetTopicStatus(TOPIC_KillVino,LOG_Running);
B_LogEntry(TOPIC_KillVino,”Арес попросил меня убить Вино.”);
MIS_KillVino = LOG_Running;
AI_StopProcessInfos(self);
};
instance DIA_Dedroit_q2 (C_Info)
{
npc = NONE_1000_Dedroit;
nr = 1;
condition = dia_Dedroit_q2_condition;
information = dia_Dedroit_q2_info;
permanent = FALSE;
important = FALSE;
description = “Я убил Вино.”;
};
func int dia_Dedroit_q2_condition()
{
if(Npc_IsDead(Vino) && (MIS_KillVino == LOG_Running))
{
return TRUE;
};
};
func void dia_Dedroit_q2_info()
{
AI_Output(other,self,”dia_Dedroit_q2_info_15_00″); //Я убил вино.
AI_Output(self,other,”dia_Dedroit_q2_info_3_01″); //Великолепно,как я и обещал мой подарок!
MIS_KillVino=LOG_SUCCESS;
Log_SetTopicStatus(TOPIC_KillVino,LOG_SUCCESS);
B_LogEntry(TOPIC_KillVino,”Я убил вино,а арес как и обещал дал мне подарок.”);
B_GivePlayerXP(500);
b_giveinvitems(self,other,ItMW_Addon_Stab03,1);
};
Дальше заходим в Story_Globals и в самом конце прописываем var int MIS_KillVino; Потом заходим допустим в LOG_Constants_Yoly(находится в папке \Story\Log_Entries) и всамом конце прописываем const string TOPIC_KillVino= “Убийство Вино”;
Потом заходим в спайсер2 нажимаем world->Reparse Script->gothic.src потом выбираем окно Output-units->update->refresh(ждем,удаляем Ou.bin и Ou.csl)->save. Ou.bin и Ou.csl->находятся в Gothic II\_work\Data\Scripts\Content\Cutscene!
Если вы пользуетесь прогой от вама то просто нужно прописать диалог в Gothic.src и закомпилировать! Ну вот и всё!
Итак продолжаем:
Давайте создадим миссию допустим что-то принести:
В том файле пишем:
instance DIA_DEDEROIT_q3 (C_Info)
{
npc = NONE_1000_Dedroit;//имя непися
nr = 1; //важность,т.е в где будет стоять строка в начале в конце в середине.
condition = dia_DEDEROIT_q3_condition;
information = dia_DEDEROIT_q3_info;
permanent = FALSE;
important = FALSE;
description = “Я могу ещё чем нибудьпомочь”;//То что отображается в меню дилога
};
func int dia_DEDEROIT_q3_condition()
{
if(Npc_KnowsInfo(other, DIA_DEDROIT_q2)) //условие когда начнётся диалог,в нашем случаи после разговора о убийстве Вино
{
return TRUE;
};
};
func void dia_DEDEROIT_q3_info()
{
AI_Output(other,self,”DIA_DEDEROIT_q_15_00″); //Я могу ещё чем нибудьпомочь
AI_Output(self,other,”DIA_DEDEROIT_q_03_01″); //Да ты бы мог мне принести кольцо защиты от пламени!
Info_ClearChoices(DIA_DEDEROIT_q3);
Info_AddChoice(dia_DEDEROIT_q3,”Хорошо я принесу.”,dia_DEDEROIT_q3_w); //Варианты ответов
Потом всё это дело компилируем и вооля,у нас новая гильдия!
Писал быстро так что могут быть ошики.Если кто найдёт говорите я исправлю.Приятного обучения.
На данном сайте используются файлы cookie, чтобы персонализировать контент и сохранить Ваш вход в систему, если Вы зарегистрируетесь.
Продолжая использовать этот сайт, Вы соглашаетесь на использование наших файлов cookie.