Ruslan
Почетный житель
Здесь выкладываем свои советы - вопросы по модификациям.
Я начну...
УРОК 1: СОЗДАНИЕ НОВОГО НПС И ВСТАВКА ЕГО В ИГРУ
!ВНИМАНИЕ!: Урок создавал VenDigo, данный урок был выложен на всеобщее обозрение на сайте www.gothic.ozl.ru
ТУТОР №1 - СОЗДАНИЕ НПС И ЕГО ВСТАВКА
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Существует множество туторов для начинающих скриптеров, однако они не совсем для "НАЧИНАЮЩИХ"! Когда чел. не знает что такое НПС и что такое скрипт, ему сложно понять фразу типа "теперь компилируем скрипт и создаём новые ou файлы".
Вот пара советов для начала:
1. Обязательно иметь MDK(МодДевелопментКит) для Вашей Готики.
Объясняю зачем:
а)Необходим Спейсер, который поставляется не со всеми версиями игры.
б)Нужны примеры скриптов
в)MDK добавляет в корневой каталог игры очень нужные, для скриптеров и текстурщиков особенно, файлы.
г)И вообще пакет очень нужный. Без коментариев. Качаем.
2. Необходимо(ну не совсем необходимо, но я бы советовал) иметь тутор "Уроки скриптологии" от Vam'а.
а) В нём содержатся все основные и продвинутые функции, встречающиеся не только повсеместно, но и в частности в играх Готики.
б) Если у Вас в школе нет\не было информатики, он просто НЕОБХОДИМ!
в) Если Вы не знаете значение той или иной функции или значка, совсем не обязательно сразу доканывать вопросами других людей. Достаточно просто посмотреть в гениальный тутор Вама. Тем более что самому докапываться до истины гораздо приятнее, ибо, поверьте мне, она всегда рядом
3. Желательно хорошо знать сюжет оригинальной игры, помнить мелочи каждого квеста, лица различных НПСей.
Это нужно для того, чтобы при "тормозе" в собственном скрипте, на примере скриптов проффесионалов(Пираньи имеются в виду) понять и проанализировать свою ошибку.
Начну с самого начала и максимально подробно:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Создаём файл под названием Гильдия_id_Имя.d
где:
Гильдия: BAU - крестьянин;
BDT - бандит;
KDW - маг воды;
MIL - милиция;
PIR - пират;
VLK - горожанин;
DJG - охотник на драконов;
KDF - маг огня;
NOV - послушник;
PAL - паладин;
SLD - наёмник;
NONE - нейтрал, без гильдии.
id - порядковый номер НПС. Нужно выбирать из головы, но такой, которого уже нет в игре. Возьмите для начала 999. Потом будет понятней.
Имя - имя вашего персонажа (!по-английски!)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Прим. Знак // отвечает за комментарии, т.е. поставив его в любой строчке, можно писать ПОСЛЕ него всё, что придёт в голову. Именно после него я буду писать пояснения к той или иной строке.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Открываем только что созданный файл. У меня это NONE_999_Vendigo.d И начинаем творить:
instance NONE_999_Vendigo (Npc_Default) //слово instance отвечает за ввод функции, в данном случае, ввод непися NONE_999_Vendigo
{ //эти скобочки очень важны в скрипте! Ни в коем случае не пропускайте их! Иначе весь скрипт на смарку.
//-------------Данные персонажа-------------
name = "Вендиго"; //Непосредственно имя персонажа, которое высвечивается над ним, когда он в фокусе. Не забывайте ставить ";"! Ситуация такая же, как и с "{"!
guild = GIL_NONE; //Принадлежность непися к той или иной гильдии. после "GIL_" пишем свою гильдию. Сокращения приведены выше.
npctype = NPCTYPE_MAIN; //Везде по-разному. Вроде бы отношение к главному герою. Короче, это точно флаг НПС. Ещё есть NpcType_Friend, NpcType_Ambient, NpcType_Bl_Main и NpcType_Ocambient. Особенно этот параметр ни на чё не влияет, так что пишите, что больше потравится.
flags = 0; //Определяет "бессмертие" НПС. 0 - смертный, Npc_Flag_Immortal - бессмертный, Npc_Flag_Ghost - призрак(чё такое призрак, сам не понял).
id = 999; //Порядковый номер персонажа(да-да, как на зоне!)
level = 15; //Уровень, которого достиг НПС
voice = 8; //Голос персонажа.
//-------------Аттрибуты--------------------
//Здесь описаны параметры вашего персонажа. Сила, кол-во жизни и т.д.
attribute[ATR_STRENGTH] = 70; //Сила
attribute[ATR_DEXTERITY] = 50; //Ловкость
attribute[ATR_MANA_MAX] = 10; //Максимальная мана, которую может иметь персонаж
attribute[ATR_MANA] = 10; //Текущая мана
attribute[ATR_HITPOINTS_MAX] = 200; //Максимальное здоровье
attribute[ATR_HITPOINTS] = 200; //Текущее здоровье
//-------------Защита----------------------
//Обеспечивает естесственную защиту персонажа. Для неписей, ИМХО, не нужна, потому как по задумке они броню носят, которая им протекшн и добавляет. Лучше ставить везде по нулям. В противном случае можно сделать мутанта, у которого нездоровый иммунинет к повреждениям. В скриптах Готики 2, да и Г1, помойму тоже, этот раздел вообще можно опустить.
protection [PROT_BLUNT] = 0; //От тупого оружия
protection [PROT_EDGE] = 0; //От лезвия
protection [PROT_POINT] = 0; //От стрел
protection [PROT_FIRE] = 0; //От огня
protection [PROT_FLY] = 0; //От падения (когда вниз с горы)
protection [PROT_MAGIC] = 0; //От магии
//-------------Урон------------------------
//Отвечает за урон. Как и в пердыдущем случае, по нулям, или вообще не писать. За это отвечает оружие.
damage [DAM_INDEX_BLUNT] = 0; //Тупым оружием
damage [DAM_INDEX_EDGE] = 0; //Лезвием
damage [DAM_INDEX_POINT] = 0; //Стрелами
damage [DAM_INDEX_FIRE] = 0; //Огнем
damage [DAM_INDEX_FLY] = 0; //???
damage [DAM_INDEX_MAGIC] = 0; //Магией
//-------------Таланты---------------------
//Как круто будет обращаться с оружием, луком, умения вскрывать замки, ковать и т.д и т.п пишем те умения, которыми бы вы хотели наделить вашего персонажа.
//Умения владения оружием Для Г1:
Npc_SetTalentSkill (self,NPC_TALENT_1H,2); // Умения махать одноручником. Цифра 2 означает Master. Ещё можно ставит 0 и 1. Чем выше, тем круче.
Npc_SetTalentSkill (self,NPC_TALENT_2H,2); // Умение махать двурушником. Аналогично.
Npc_SetTalentSkill (self,NPC_TALENT_BOW,2); // Луком
Npc_SetTalentSkill (self,NPC_TALENT_CROSSBOW,2); //Арбалетом
//В Г2 всё гораздо проще. За Вас всё делает одна единственная функция:
B_GiveNpcTalents (self);
B_SetFightSkills (self, 60); //Проценты владения всеми видами оружия. В данном случае по 60%. Хотите для каждого вида отдельно? Без проблем. Додумайтесь сами.
//Хотя ладно, скажу... это же тутор. Вот так:
HitChance [NPC_TALENT_1H] = 60; //Одноручник
HitChance [NPC_TALENT_2H] = 50; //Двуручник
HitChance [NPC_TALENT_BOW] = 60; //Лук
HitChance [NPC_TALENT_CROSSBOW] = 30; //Арбалет
//Для Г1 и Г2. Значение 1 - выучено, 0 - невыучено.
Npc_SetTalentSkill (self, NPC_TALENT_MAGE,6); //Каким кругом магии владеет данный непись(если маг, хотя, можете побаловаться и сделать универсала). В данном случае шестым.
Npc_SetTalentSkill (sеlf, NPC_TALENT_PICKLOCK, 1); //Взлом замков
Npc_SetTalentSkill (sеlf, NPC_TALENT_SNEAK, 1); //Подкрадывание
Npc_SetTalentSkill (sеlf, NPC_TALENT_ACROBAT, 1); //Акробатика
Npc_SetTalentSkill (sеlf, NPC_TALENT_PICKPOCKET, 1); //Тоже взлом, чем отличается от PICKLOCK не знаю. Если кто знает немецкий, то первое hдngt ab von DEX (auf Programmebene), а второе - hдngt ab von DEX (auf Scriptebene).
Npc_SetTalentSkill (sеlf, NPC_TALENT_SMITH, 1); //??? Не помню я...
Npc_SetTalentSkill (sеlf, NPC_TALENT_RUNES, 1); //Создание рун
Npc_SetTalentSkill (sеlf, NPC_TALENT_ALCHEMY, 1); //Алхимия
Npc_SetTalentSkill (sеlf, NPC_TALENT_TAKEANIMALTROPHY,1); //Разделка животных
//-------------Визуализация------------------
//Это раздел скрипта, отвечающий за внешний вид вашего НПС
Mdl_ApplyOverlayMds (self, "humans_Militia.mds"); //Внешняя анимация. Ещё есть Humans_Relaxed.mds, Humans_Arrogance.mds, Humans_Mage.mds. Это для Готики2! Для г1 анимация совсем другая. Точно я не помню, скрипчу сейчас в Г2. Точно есть humans_mage.mds - это маг, и ещё, кажется, humans_fighter.mds - боец. Разница, впрочем, невеликая.
Mdl_SetModelFatness (self, 0); //Это так называемая "толстость" персонажа, будет ли он плотненький, с животиком. Поставить 2 для полноты вполне достаточно.
B_SetNpcVisual (self, Male, "Hum_Head_Bald", Face_N_Corristo, BodyTex_N, ItAr_Djg_Crawler);
// Теперь по порядку:
// Male - пол. Male - мужской, Female - женский
// "Hum_Head_Bald" - вид головы. ИМХО не очень важный параметр. Хотите другой, посмотрите в скриптах других неписей.
// Face_N_Corristo - лицо вашего персонажа. В моём случае он имеет лицо Корристо. Другие лица можно "стырить" со скиптов других неписей. Если вы помните их лица. Можно и поэкспериментировать.
// BodyTex_N - текстура тела. Аналогично виды головы.
// ItAr_Djg_Crawler - доспехи, одетые на персонажа. В моём случае доспехи из пластин ползунов. Все названия доспехов можно найти в файлах _work\Data\Scripts\Content\Items\It_Armor.d и _work\Data\Scripts\Content\Items\It_Addon_Armor.d
//---------------Экипировка--------------------
//Здесь то, что непосредственно надето на персонаже
EquipItem (self, ItMw_1H_Special_01); //после self пишем название вещи, которую необходимо надеть на непися. Всё, что можно надеть ищите здесь: _work\Data\Scripts\Content\Items\IT_Addon_Amulette.d
EquipItem (self, ItRw_Sld_Bow); // _work\Data\Scripts\Content\Items\IT_Addon_Runes.d
// _work\Data\Scripts\Content\Items\IT_Addon_Weapons.d
// _work\Data\Scripts\Content\Items\IT_Amulette.d
// _work\Data\Scripts\Content\Items\IT_Melee_Weapons.d
// _work\Data\Scripts\Content\Items\IT_Ranged_Weapons.d
// _work\Data\Scripts\Content\Items\IT_Ringe.d
// _work\Data\Scripts\Content\Items\IT_Runen.d
//----------------Инвентарь--------------------
//Сюда можно пихать абсолютно все предметы. Они будут лежать у персонажа в инвентаре. Пример:
CreateInvItems (self, ItPo_Health_03, 30); //Помещает в инвентарь бутылки сильного лечения количеством 30 штук.
//Все итемки(предметы) можно найти в файлах папки _work\Data\Scripts\Content\Items
//---------------Чувства-----------------------
//Отвечает за восприятие НПС окружающего мира. Все эти чувства проявляются в том, на каком расстоянии персонаж увидит или услышит например, монстра, чтобы вытащить меч и наброситься на него. Или если ваш перс захочет с поговорить с Безымянным, то сделает это, когда ГГ подойдёт к нему на расстояние senses_range.
senses = SENSE_SEE | SENSE_SMELL | SENSE_HEAR; //Зрение, обаняние, слух. Хотите зделать НПС глухим? Пожалуста, удаляйте | SENSE_HEAR.
senses_range = 2000; //Расстояние действия чувств !в см!, потому что спейсер воспринимает только сантиметры!
//----------------Искусственный интеллект------
//Ёлы-палы, как звучит! Но ничего сложного тут нет.
fight_tactic = FAI_HUMAN_MASTER; //Функция отвечает за тактику боя. Ещё есть FAI_HUMAN_STRONG и... ещё третье чё-то... ламо короче.
daily_routine = Rth_start_999; //Ввод распорядка дня. 999 - это порядковый номер Вашего НПС. Это у меня он 999, у Вас он может быть другим. Смотрите id в данных персонажа.
};
//----------------Распорядок дня---------------
func void Rtn_Start_999 () //Сама функция распорядка дня
{
TA_Stand_Guarding (07,00,09,00,"NW_XARDAS_TOWER_03");
//TA_Stand_Guarding - стоит руки в боки. Все действия можно найти в файле …\_work\Data\Scripts\Content\AI\Human\TA.d
//07,00,09,00 - время, в течении которого непись соверщает действие. В данном случае с семи утра до девяти утра.
//"NW_XARDAS_TOWER_03" - название вайпоинта, на котором персонаж совершает действие. Лучшего способа узнать название нужного вайпоинта, чем загрузить в спейсере мир и полетать по нему, я не нашол. Т.е. заходим в спейсер, открываем file\OPEN ZEN, находим нужный нам мир в папке …\_work\Data\Worlds, когда мир загрузится и послышется знакомая муза, жмём F3 и с помощью мышки и стрелок летим до того места, куда хотим ставить непися. На узкой панельке слева внизу жмём на кнопку с разветвлёнными указателями. Потом наводим взгляд на варпоинт(оранжево-красная стрелка на земле) и запоминаем\записываем название.
//Есть способ легче, но не лучше. В файле …\_work\Data\Script\Content\Story\Startup.d в кавычках напротив функций есть названия варпоинтов. Но это только названия. Увы, вы не узнаете, где ваш НПС появится. А появится он или у какого-нибудь НПС или рядом с каким-нибудь монстром. Конечно же лучше использовать первый вариант. Для начала используйте мой варпоинт. Ваш НПС окажется прямо по тропинке на выходе из башни Ксардаса между башней и Кавалорном.
//теперь персонаж стоит на вайпоинте. И только. Чтобы научить его ходить, надо прописать как минимум две функции. Добавляем, например эту:
TA_Practice_Sword (09,00,07,00,"NW_XARDAS_TOWER_VIEW_03_01"); // Теперь персонаж ровно в 9:00 пойдёт к Кавалорну и будет рядом с ним тренироваться на мечах. !ВАЖНО! Чтобы распорядок проходил полный круг! Т.е. время начало первой функции совпадало с временем конца последней.
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Закрываем и сохраняем файл. Вот как ПРИМЕРНО должен выглядеть окончательный скрипт:
instance NONE_999_Vendigo (Npc_Default)
{
//-------------Данные персонажа-------
name = "Вендиго";
guild = GIL_NONE;
npctype = NPCTYPE_MAIN;
level = 15;
voice = 8;
id = 999;
//-------------Аттрибуты---------------
attribute[ATR_STRENGTH] = 70;
attribute[ATR_DEXTERITY] = 90;
attribute[ATR_MANA_MAX] = 10;
attribute[ATR_MANA] = 10;
attribute[ATR_HITPOINTS_MAX] = 200;
attribute[ATR_HITPOINTS] = 200;
//-------------Визуализация------------
B_SetNpcVisual (self, MALE, "Hum_Head_Bald", Face_N_Corristo, BodyTex_N, ItAr_Djg_Crawler);
Mdl_ApplyOverlayMds (self, "humans_Militia.mds");
Mdl_SetModelFatness (self, 0);
//-------------Таланты----------------
B_GiveNpcTalents (self);
B_SetFightSkills (self, 60);
//-------------Инвентарь---------------
EquipItem (self, ItMw_1H_Special_01);
EquipItem (self, ItRw_Sld_Bow);
CreateInvItems (self, ItPo_Health_03, 30);
CreateInvItems (self, ItWr_Timber_Guard_1, 1);
CreateInvItems (self, ItWr_Timber_Guard_2, 1);
CreateInvItems (self, ItWr_Timber_Guard_3, 1);
CreateInvItems (self, ItWr_Timber_Guard_4, 1);
CreateInvItems (self, ItWr_Timber_Guard_5, 1);
CreateInvItems (self, ItWr_Timber_Guard_6, 1);
CreateInvItems (self, ItWr_Timber_Guard_7, 1);
CreateInvItems (self, ItWr_Timber_Guard_8, 1);
//-------------Чувства-------------------
senses = SENSE_SEE | SENSE_SMELL | SENSE_HEAR;
senses_range = 2000;
//-------------АИ------------------------
fight_tactic = FAI_HUMAN_MASTER;
daily_routine = Rth_start_999;
};
func void Rth_Start_999 ()
{
TA_Stand_Guarding (07,00,09,00,"NW_XARDAS_TOWER_03");
TA_Practice_Sword (09,00,12,00,"NW_XARDAS_TOWER_VIEW_03_01");
TA_Smoke_Waterpipe (12,00,15,00,"NW_XARDAS_TOWER_VIEW_03_01");
TA_Guard_Hammer (15,00,18,00,"NW_XARDAS_TOWER_03");
TA_Smith_Fire (18,00,21,00,"NW_XARDAS_TOWER_03");
TA_Saw (21,00,07,00,"NW_XARDAS_TOWER_VIEW_03_01");
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Теперь о том, как вставить этот самый НПС в игру:
ШАГ 1-ый
Копируем наш *.d файл в папку со всеми неписями у Gothic II\_work\Data\Scripts\Content\StoryNULLPC
ШАГ 2-ой
В файле Gothic II\_work\data\Scripts\Content\StoryNULLPC_Globals.d находим строчку var C_NPC Lester; и дописываем под ней var C_NPC Vendigo;(имя вашего НПС). Теперь в этом же файле находим Lester = Hlp_GetNpc(PC_Psionic); и дописываем ниже Vendigo = Hlp_GetNpc(NONE_999_VenDigo); где NONE_999_VenDigo название файла Вашего непися.
Почему именно под этой строчкой. Важно не под какой строчкой, а в каком разделе файла, в какой функции. Лестер, так же как и наш новенький непись попадает в в функцию, которая вставляет персов в окрестностях башни ксардаса. А так как Вендиго(или кого у вас там) мы вставляем именно у его башни, то соответственно прописывать нужно именно здесь.
ШАГ 3-ий
Открываем файл Gothic II\_work\Data\Scripts\Content\Story\StartUp.d Находим в нём строку Wld_InsertNpc (PC_Psionic, "NW_XARDAS_TOWER_PATH_01"); И дописываем ниже Wld_InsertNpc (NONE_999_Viktor, ""NW_XARDAS_PATH_FARM1_08");
ШАГ 4-ый
Открываем Spacer, прогу, поставляющуюся из Девелопменкита или вместе с игрой. Экзешник в папке System. Нажимаем World\Repare Script(Мир – заменить скрипты), выбираем Gothic.scr и нажимаем открыть. После чего начнётся компиляция скриптов. Продолжаться она может достаточно долго. В идиале не должно выскочить ни одной ошибки. Если они всё-таки повыскакивали, не отчаивайтесь, персонаж и с ними может вставиться. Конец компиляции выдаст окно Аутпут-Юнитс, которе заменится на окно Материалз.
ШАГ 5-ый
Теперь заходим в игру и начинаем новую (обязательно! не загружаем!). Проверяем, стоит ли персонаж на месте. Если же персонажа на указанном вайпоинте не оказалось, детально, по строчечке проверте правильность ваших скриптов (везде ли стоят ‘;’ и "{", нету ли описок в словах и т.д.).
Внимание : если вы нашли и исправили ошибку, нужно снова компилить Gothic.src
///////////////////////////////////////////////////////////////////////////////////////
Я начну...
УРОК 1: СОЗДАНИЕ НОВОГО НПС И ВСТАВКА ЕГО В ИГРУ
!ВНИМАНИЕ!: Урок создавал VenDigo, данный урок был выложен на всеобщее обозрение на сайте www.gothic.ozl.ru
ТУТОР №1 - СОЗДАНИЕ НПС И ЕГО ВСТАВКА
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Существует множество туторов для начинающих скриптеров, однако они не совсем для "НАЧИНАЮЩИХ"! Когда чел. не знает что такое НПС и что такое скрипт, ему сложно понять фразу типа "теперь компилируем скрипт и создаём новые ou файлы".
Вот пара советов для начала:
1. Обязательно иметь MDK(МодДевелопментКит) для Вашей Готики.
Объясняю зачем:
а)Необходим Спейсер, который поставляется не со всеми версиями игры.
б)Нужны примеры скриптов
в)MDK добавляет в корневой каталог игры очень нужные, для скриптеров и текстурщиков особенно, файлы.
г)И вообще пакет очень нужный. Без коментариев. Качаем.
2. Необходимо(ну не совсем необходимо, но я бы советовал) иметь тутор "Уроки скриптологии" от Vam'а.
а) В нём содержатся все основные и продвинутые функции, встречающиеся не только повсеместно, но и в частности в играх Готики.
б) Если у Вас в школе нет\не было информатики, он просто НЕОБХОДИМ!
в) Если Вы не знаете значение той или иной функции или значка, совсем не обязательно сразу доканывать вопросами других людей. Достаточно просто посмотреть в гениальный тутор Вама. Тем более что самому докапываться до истины гораздо приятнее, ибо, поверьте мне, она всегда рядом
3. Желательно хорошо знать сюжет оригинальной игры, помнить мелочи каждого квеста, лица различных НПСей.
Это нужно для того, чтобы при "тормозе" в собственном скрипте, на примере скриптов проффесионалов(Пираньи имеются в виду) понять и проанализировать свою ошибку.
Начну с самого начала и максимально подробно:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Создаём файл под названием Гильдия_id_Имя.d
где:
Гильдия: BAU - крестьянин;
BDT - бандит;
KDW - маг воды;
MIL - милиция;
PIR - пират;
VLK - горожанин;
DJG - охотник на драконов;
KDF - маг огня;
NOV - послушник;
PAL - паладин;
SLD - наёмник;
NONE - нейтрал, без гильдии.
id - порядковый номер НПС. Нужно выбирать из головы, но такой, которого уже нет в игре. Возьмите для начала 999. Потом будет понятней.
Имя - имя вашего персонажа (!по-английски!)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Прим. Знак // отвечает за комментарии, т.е. поставив его в любой строчке, можно писать ПОСЛЕ него всё, что придёт в голову. Именно после него я буду писать пояснения к той или иной строке.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Открываем только что созданный файл. У меня это NONE_999_Vendigo.d И начинаем творить:
instance NONE_999_Vendigo (Npc_Default) //слово instance отвечает за ввод функции, в данном случае, ввод непися NONE_999_Vendigo
{ //эти скобочки очень важны в скрипте! Ни в коем случае не пропускайте их! Иначе весь скрипт на смарку.
//-------------Данные персонажа-------------
name = "Вендиго"; //Непосредственно имя персонажа, которое высвечивается над ним, когда он в фокусе. Не забывайте ставить ";"! Ситуация такая же, как и с "{"!
guild = GIL_NONE; //Принадлежность непися к той или иной гильдии. после "GIL_" пишем свою гильдию. Сокращения приведены выше.
npctype = NPCTYPE_MAIN; //Везде по-разному. Вроде бы отношение к главному герою. Короче, это точно флаг НПС. Ещё есть NpcType_Friend, NpcType_Ambient, NpcType_Bl_Main и NpcType_Ocambient. Особенно этот параметр ни на чё не влияет, так что пишите, что больше потравится.
flags = 0; //Определяет "бессмертие" НПС. 0 - смертный, Npc_Flag_Immortal - бессмертный, Npc_Flag_Ghost - призрак(чё такое призрак, сам не понял).
id = 999; //Порядковый номер персонажа(да-да, как на зоне!)
level = 15; //Уровень, которого достиг НПС
voice = 8; //Голос персонажа.
//-------------Аттрибуты--------------------
//Здесь описаны параметры вашего персонажа. Сила, кол-во жизни и т.д.
attribute[ATR_STRENGTH] = 70; //Сила
attribute[ATR_DEXTERITY] = 50; //Ловкость
attribute[ATR_MANA_MAX] = 10; //Максимальная мана, которую может иметь персонаж
attribute[ATR_MANA] = 10; //Текущая мана
attribute[ATR_HITPOINTS_MAX] = 200; //Максимальное здоровье
attribute[ATR_HITPOINTS] = 200; //Текущее здоровье
//-------------Защита----------------------
//Обеспечивает естесственную защиту персонажа. Для неписей, ИМХО, не нужна, потому как по задумке они броню носят, которая им протекшн и добавляет. Лучше ставить везде по нулям. В противном случае можно сделать мутанта, у которого нездоровый иммунинет к повреждениям. В скриптах Готики 2, да и Г1, помойму тоже, этот раздел вообще можно опустить.
protection [PROT_BLUNT] = 0; //От тупого оружия
protection [PROT_EDGE] = 0; //От лезвия
protection [PROT_POINT] = 0; //От стрел
protection [PROT_FIRE] = 0; //От огня
protection [PROT_FLY] = 0; //От падения (когда вниз с горы)
protection [PROT_MAGIC] = 0; //От магии
//-------------Урон------------------------
//Отвечает за урон. Как и в пердыдущем случае, по нулям, или вообще не писать. За это отвечает оружие.
damage [DAM_INDEX_BLUNT] = 0; //Тупым оружием
damage [DAM_INDEX_EDGE] = 0; //Лезвием
damage [DAM_INDEX_POINT] = 0; //Стрелами
damage [DAM_INDEX_FIRE] = 0; //Огнем
damage [DAM_INDEX_FLY] = 0; //???
damage [DAM_INDEX_MAGIC] = 0; //Магией
//-------------Таланты---------------------
//Как круто будет обращаться с оружием, луком, умения вскрывать замки, ковать и т.д и т.п пишем те умения, которыми бы вы хотели наделить вашего персонажа.
//Умения владения оружием Для Г1:
Npc_SetTalentSkill (self,NPC_TALENT_1H,2); // Умения махать одноручником. Цифра 2 означает Master. Ещё можно ставит 0 и 1. Чем выше, тем круче.
Npc_SetTalentSkill (self,NPC_TALENT_2H,2); // Умение махать двурушником. Аналогично.
Npc_SetTalentSkill (self,NPC_TALENT_BOW,2); // Луком
Npc_SetTalentSkill (self,NPC_TALENT_CROSSBOW,2); //Арбалетом
//В Г2 всё гораздо проще. За Вас всё делает одна единственная функция:
B_GiveNpcTalents (self);
B_SetFightSkills (self, 60); //Проценты владения всеми видами оружия. В данном случае по 60%. Хотите для каждого вида отдельно? Без проблем. Додумайтесь сами.
//Хотя ладно, скажу... это же тутор. Вот так:
HitChance [NPC_TALENT_1H] = 60; //Одноручник
HitChance [NPC_TALENT_2H] = 50; //Двуручник
HitChance [NPC_TALENT_BOW] = 60; //Лук
HitChance [NPC_TALENT_CROSSBOW] = 30; //Арбалет
//Для Г1 и Г2. Значение 1 - выучено, 0 - невыучено.
Npc_SetTalentSkill (self, NPC_TALENT_MAGE,6); //Каким кругом магии владеет данный непись(если маг, хотя, можете побаловаться и сделать универсала). В данном случае шестым.
Npc_SetTalentSkill (sеlf, NPC_TALENT_PICKLOCK, 1); //Взлом замков
Npc_SetTalentSkill (sеlf, NPC_TALENT_SNEAK, 1); //Подкрадывание
Npc_SetTalentSkill (sеlf, NPC_TALENT_ACROBAT, 1); //Акробатика
Npc_SetTalentSkill (sеlf, NPC_TALENT_PICKPOCKET, 1); //Тоже взлом, чем отличается от PICKLOCK не знаю. Если кто знает немецкий, то первое hдngt ab von DEX (auf Programmebene), а второе - hдngt ab von DEX (auf Scriptebene).
Npc_SetTalentSkill (sеlf, NPC_TALENT_SMITH, 1); //??? Не помню я...
Npc_SetTalentSkill (sеlf, NPC_TALENT_RUNES, 1); //Создание рун
Npc_SetTalentSkill (sеlf, NPC_TALENT_ALCHEMY, 1); //Алхимия
Npc_SetTalentSkill (sеlf, NPC_TALENT_TAKEANIMALTROPHY,1); //Разделка животных
//-------------Визуализация------------------
//Это раздел скрипта, отвечающий за внешний вид вашего НПС
Mdl_ApplyOverlayMds (self, "humans_Militia.mds"); //Внешняя анимация. Ещё есть Humans_Relaxed.mds, Humans_Arrogance.mds, Humans_Mage.mds. Это для Готики2! Для г1 анимация совсем другая. Точно я не помню, скрипчу сейчас в Г2. Точно есть humans_mage.mds - это маг, и ещё, кажется, humans_fighter.mds - боец. Разница, впрочем, невеликая.
Mdl_SetModelFatness (self, 0); //Это так называемая "толстость" персонажа, будет ли он плотненький, с животиком. Поставить 2 для полноты вполне достаточно.
B_SetNpcVisual (self, Male, "Hum_Head_Bald", Face_N_Corristo, BodyTex_N, ItAr_Djg_Crawler);
// Теперь по порядку:
// Male - пол. Male - мужской, Female - женский
// "Hum_Head_Bald" - вид головы. ИМХО не очень важный параметр. Хотите другой, посмотрите в скриптах других неписей.
// Face_N_Corristo - лицо вашего персонажа. В моём случае он имеет лицо Корристо. Другие лица можно "стырить" со скиптов других неписей. Если вы помните их лица. Можно и поэкспериментировать.
// BodyTex_N - текстура тела. Аналогично виды головы.
// ItAr_Djg_Crawler - доспехи, одетые на персонажа. В моём случае доспехи из пластин ползунов. Все названия доспехов можно найти в файлах _work\Data\Scripts\Content\Items\It_Armor.d и _work\Data\Scripts\Content\Items\It_Addon_Armor.d
//---------------Экипировка--------------------
//Здесь то, что непосредственно надето на персонаже
EquipItem (self, ItMw_1H_Special_01); //после self пишем название вещи, которую необходимо надеть на непися. Всё, что можно надеть ищите здесь: _work\Data\Scripts\Content\Items\IT_Addon_Amulette.d
EquipItem (self, ItRw_Sld_Bow); // _work\Data\Scripts\Content\Items\IT_Addon_Runes.d
// _work\Data\Scripts\Content\Items\IT_Addon_Weapons.d
// _work\Data\Scripts\Content\Items\IT_Amulette.d
// _work\Data\Scripts\Content\Items\IT_Melee_Weapons.d
// _work\Data\Scripts\Content\Items\IT_Ranged_Weapons.d
// _work\Data\Scripts\Content\Items\IT_Ringe.d
// _work\Data\Scripts\Content\Items\IT_Runen.d
//----------------Инвентарь--------------------
//Сюда можно пихать абсолютно все предметы. Они будут лежать у персонажа в инвентаре. Пример:
CreateInvItems (self, ItPo_Health_03, 30); //Помещает в инвентарь бутылки сильного лечения количеством 30 штук.
//Все итемки(предметы) можно найти в файлах папки _work\Data\Scripts\Content\Items
//---------------Чувства-----------------------
//Отвечает за восприятие НПС окружающего мира. Все эти чувства проявляются в том, на каком расстоянии персонаж увидит или услышит например, монстра, чтобы вытащить меч и наброситься на него. Или если ваш перс захочет с поговорить с Безымянным, то сделает это, когда ГГ подойдёт к нему на расстояние senses_range.
senses = SENSE_SEE | SENSE_SMELL | SENSE_HEAR; //Зрение, обаняние, слух. Хотите зделать НПС глухим? Пожалуста, удаляйте | SENSE_HEAR.
senses_range = 2000; //Расстояние действия чувств !в см!, потому что спейсер воспринимает только сантиметры!
//----------------Искусственный интеллект------
//Ёлы-палы, как звучит! Но ничего сложного тут нет.
fight_tactic = FAI_HUMAN_MASTER; //Функция отвечает за тактику боя. Ещё есть FAI_HUMAN_STRONG и... ещё третье чё-то... ламо короче.
daily_routine = Rth_start_999; //Ввод распорядка дня. 999 - это порядковый номер Вашего НПС. Это у меня он 999, у Вас он может быть другим. Смотрите id в данных персонажа.
};
//----------------Распорядок дня---------------
func void Rtn_Start_999 () //Сама функция распорядка дня
{
TA_Stand_Guarding (07,00,09,00,"NW_XARDAS_TOWER_03");
//TA_Stand_Guarding - стоит руки в боки. Все действия можно найти в файле …\_work\Data\Scripts\Content\AI\Human\TA.d
//07,00,09,00 - время, в течении которого непись соверщает действие. В данном случае с семи утра до девяти утра.
//"NW_XARDAS_TOWER_03" - название вайпоинта, на котором персонаж совершает действие. Лучшего способа узнать название нужного вайпоинта, чем загрузить в спейсере мир и полетать по нему, я не нашол. Т.е. заходим в спейсер, открываем file\OPEN ZEN, находим нужный нам мир в папке …\_work\Data\Worlds, когда мир загрузится и послышется знакомая муза, жмём F3 и с помощью мышки и стрелок летим до того места, куда хотим ставить непися. На узкой панельке слева внизу жмём на кнопку с разветвлёнными указателями. Потом наводим взгляд на варпоинт(оранжево-красная стрелка на земле) и запоминаем\записываем название.
//Есть способ легче, но не лучше. В файле …\_work\Data\Script\Content\Story\Startup.d в кавычках напротив функций есть названия варпоинтов. Но это только названия. Увы, вы не узнаете, где ваш НПС появится. А появится он или у какого-нибудь НПС или рядом с каким-нибудь монстром. Конечно же лучше использовать первый вариант. Для начала используйте мой варпоинт. Ваш НПС окажется прямо по тропинке на выходе из башни Ксардаса между башней и Кавалорном.
//теперь персонаж стоит на вайпоинте. И только. Чтобы научить его ходить, надо прописать как минимум две функции. Добавляем, например эту:
TA_Practice_Sword (09,00,07,00,"NW_XARDAS_TOWER_VIEW_03_01"); // Теперь персонаж ровно в 9:00 пойдёт к Кавалорну и будет рядом с ним тренироваться на мечах. !ВАЖНО! Чтобы распорядок проходил полный круг! Т.е. время начало первой функции совпадало с временем конца последней.
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Закрываем и сохраняем файл. Вот как ПРИМЕРНО должен выглядеть окончательный скрипт:
instance NONE_999_Vendigo (Npc_Default)
{
//-------------Данные персонажа-------
name = "Вендиго";
guild = GIL_NONE;
npctype = NPCTYPE_MAIN;
level = 15;
voice = 8;
id = 999;
//-------------Аттрибуты---------------
attribute[ATR_STRENGTH] = 70;
attribute[ATR_DEXTERITY] = 90;
attribute[ATR_MANA_MAX] = 10;
attribute[ATR_MANA] = 10;
attribute[ATR_HITPOINTS_MAX] = 200;
attribute[ATR_HITPOINTS] = 200;
//-------------Визуализация------------
B_SetNpcVisual (self, MALE, "Hum_Head_Bald", Face_N_Corristo, BodyTex_N, ItAr_Djg_Crawler);
Mdl_ApplyOverlayMds (self, "humans_Militia.mds");
Mdl_SetModelFatness (self, 0);
//-------------Таланты----------------
B_GiveNpcTalents (self);
B_SetFightSkills (self, 60);
//-------------Инвентарь---------------
EquipItem (self, ItMw_1H_Special_01);
EquipItem (self, ItRw_Sld_Bow);
CreateInvItems (self, ItPo_Health_03, 30);
CreateInvItems (self, ItWr_Timber_Guard_1, 1);
CreateInvItems (self, ItWr_Timber_Guard_2, 1);
CreateInvItems (self, ItWr_Timber_Guard_3, 1);
CreateInvItems (self, ItWr_Timber_Guard_4, 1);
CreateInvItems (self, ItWr_Timber_Guard_5, 1);
CreateInvItems (self, ItWr_Timber_Guard_6, 1);
CreateInvItems (self, ItWr_Timber_Guard_7, 1);
CreateInvItems (self, ItWr_Timber_Guard_8, 1);
//-------------Чувства-------------------
senses = SENSE_SEE | SENSE_SMELL | SENSE_HEAR;
senses_range = 2000;
//-------------АИ------------------------
fight_tactic = FAI_HUMAN_MASTER;
daily_routine = Rth_start_999;
};
func void Rth_Start_999 ()
{
TA_Stand_Guarding (07,00,09,00,"NW_XARDAS_TOWER_03");
TA_Practice_Sword (09,00,12,00,"NW_XARDAS_TOWER_VIEW_03_01");
TA_Smoke_Waterpipe (12,00,15,00,"NW_XARDAS_TOWER_VIEW_03_01");
TA_Guard_Hammer (15,00,18,00,"NW_XARDAS_TOWER_03");
TA_Smith_Fire (18,00,21,00,"NW_XARDAS_TOWER_03");
TA_Saw (21,00,07,00,"NW_XARDAS_TOWER_VIEW_03_01");
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Теперь о том, как вставить этот самый НПС в игру:
ШАГ 1-ый
Копируем наш *.d файл в папку со всеми неписями у Gothic II\_work\Data\Scripts\Content\StoryNULLPC
ШАГ 2-ой
В файле Gothic II\_work\data\Scripts\Content\StoryNULLPC_Globals.d находим строчку var C_NPC Lester; и дописываем под ней var C_NPC Vendigo;(имя вашего НПС). Теперь в этом же файле находим Lester = Hlp_GetNpc(PC_Psionic); и дописываем ниже Vendigo = Hlp_GetNpc(NONE_999_VenDigo); где NONE_999_VenDigo название файла Вашего непися.
Почему именно под этой строчкой. Важно не под какой строчкой, а в каком разделе файла, в какой функции. Лестер, так же как и наш новенький непись попадает в в функцию, которая вставляет персов в окрестностях башни ксардаса. А так как Вендиго(или кого у вас там) мы вставляем именно у его башни, то соответственно прописывать нужно именно здесь.
ШАГ 3-ий
Открываем файл Gothic II\_work\Data\Scripts\Content\Story\StartUp.d Находим в нём строку Wld_InsertNpc (PC_Psionic, "NW_XARDAS_TOWER_PATH_01"); И дописываем ниже Wld_InsertNpc (NONE_999_Viktor, ""NW_XARDAS_PATH_FARM1_08");
ШАГ 4-ый
Открываем Spacer, прогу, поставляющуюся из Девелопменкита или вместе с игрой. Экзешник в папке System. Нажимаем World\Repare Script(Мир – заменить скрипты), выбираем Gothic.scr и нажимаем открыть. После чего начнётся компиляция скриптов. Продолжаться она может достаточно долго. В идиале не должно выскочить ни одной ошибки. Если они всё-таки повыскакивали, не отчаивайтесь, персонаж и с ними может вставиться. Конец компиляции выдаст окно Аутпут-Юнитс, которе заменится на окно Материалз.
ШАГ 5-ый
Теперь заходим в игру и начинаем новую (обязательно! не загружаем!). Проверяем, стоит ли персонаж на месте. Если же персонажа на указанном вайпоинте не оказалось, детально, по строчечке проверте правильность ваших скриптов (везде ли стоят ‘;’ и "{", нету ли описок в словах и т.д.).
Внимание : если вы нашли и исправили ошибку, нужно снова компилить Gothic.src
///////////////////////////////////////////////////////////////////////////////////////