Создание Модификаций для Готики 2

  • Автор темы Автор темы Ruslan
  • Дата начала Дата начала
  • Просмотры Просмотры

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
///////////////////////////////////////////////////////////////////////////////////////
 
Вот еще тутор, от этого автора:

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Туториал ПО скриптам. Часть вторая.
СОЗДАНИЕ ИТЕМОК

ЧАСТЬ ПЕРВАЯ

Итемки - это предметы инвентаря. В данном туторе описывается не создание качественно новой модели(это дело МАХ'а, может Рал научит. Кстати очень хотелось бы, я сам не умею моделить ), а создание предмета на базе имеющихся в игре моделей и текстур, со своими индивидуальными характеристиками.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ГЛАВА ПЕРВАЯ - дифференциация.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
В Готике существует 11 основных типов итемок. Все они имеют один общий принцип построения скрипта, но в то же время качественно отличаются друг от друга(кроме Amulette и Rings - они почти одинаковые).
Для простоты приведу след. Таблицу:

ПРИМЕР: Тип предмета; Mainflag ; Flag; Код предмета; Файлы.

Амулеты: ITEM_KAT_MAGIC; ITEM_AMULET; ItAm_; IT_Addon_Amulette.d и IT_Amulette.d

Трофеи: ITEM_KAT_NONE; ITEM_MULTI; ItAt_; IT_AnimalTrophy.d

Доспехи: ITEM_KAT_ARMOR; 0; ItAr_; IT_Addon_Armor.d и IT_Armor.d

Еда: ITEM_KAT_FOOD; ITEM_MULTI; ItFo_; IT_Addon_Food.d и IT_Food.d

Ключи: ITEM_KAT_NONE; 0; ItKe_; IT_Addon_Keys.d и IT_Keys.d

Оружие ближнего боя: ITEM_KAT_NF; ???; ItMw_; IT_Melee_Weapons.d

Оружие дальнего боя: ITEM_KAT_MUN; ???; ItRw_; IT_Ranged_Weapons.d

Напитки: ITEM_KAT_POTIONS; ITEM_MULTI; ItPo_; IT_Addon_Potions.d и IT_Potions.d

Кольца: ITEM_KAT_MAGIC; ITEM_RING; ItRi_; IT_Ringe.d

Руны: ITEM_KAT_RUNE; 0; ItRu_ ; IT_Addon_Runes.d IT_Runen.d

Книги и письма: ITEM_KAT_DOCS; ???; ItWr_; IT_Addon_Written.d и IT_Written.d



Создавать отдельный файл под итемку не нужно. Чтобы "написать" предмет, нужно писать с крипт в соответствующем файле(из вышеприведённой таблицы). О флагах и кодах позже.


Ну ещё есть предметы, относящиеся к типу "разное". Отмычки, табак, мотыга, кувшин и др. Их можно прописывать в IT_Addon_Misc.d и IT_Misc.d
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ГЛАВА ВТОРАЯ - общие.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Для всех итемок характерно следующее:

Две области. Первая - описывающая внешний фид предмета и его характеристики. Вторая - отвечающая за вывод текста, который мы будем видеть в инвентаре при выборе предмета.
Для некоторых типов(книги, напитки, некоторые оружия) существует ещё одна, промежуточная область, которая отвечает за условия, приписанные переменные, явления, происходящие при использовании предмета.
Чёткого разделения на области в скриптах нет! Оно воображаемое и мной выдуманное. Просто так легче и упорядоченнее.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ГЛАВА ТРЕТЬЯ - основа.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Начнём с основы создания предметов. Со скелета, который характерен абсолютно для всех типов итемок.

INSTANCE COD_Name (C_Item) //Где COD - Код предмета(см. таблицу), Name - имя будщей итемки(!по-английски!)
{
name = "имя"; //Это название вашего предмета, надпись, которая будет отображаться, когда он в фокусе. Сдесь можно по-русски писать. Только не забывайте ковычки и ";".

mainflag = Flag_Predmeta; //Это флаг предмета. См. таблицу.
flag = Flag; //Это тоже флаг, в таблице не перечислены флаги оружия и писем не потому что я их не знаю, а потому что их несколько:

Оружие ближнего боя: ITEM_SWD (одноручный меч)
ITEM_2HD_SWD (двуручный меч)
ITEM_AXE (одноручный топор)
ITEM_2HD_AXE (двуручный топор)

Оружие дальнего боя: ITEM_BOW (лук)
ITEM_CROSSBOW (арбалет)
ITEM_CROSSBOW|ITEM_MULTI (стрелы и болты)

Письмена: 0 (нейтральные листовки и книги)
ITEM_MISSION|ITEM_MULTI (карты)

К предметам, учавствующим в основной сюжетной линии и каих-либо квестах применяют флаг ITEM_MISSION;

value = 250; //Цена предмета
visual = "Файл визуализации.3DS"; //Названия визуализации возьмите из других скриптов - это самый простой вариант. Например, для обычного крестьянского кинжала он будет выглядеть так "Itmw_005_1h_dagger_01.3DS";
material = MAT_METAL; //Материал, из которого сделан предмет. В данном случае из металла. Ещё есть MAT_Wood(дерево), MAT_LEATHER(кожа), MAT_GLAS(стекло) и MAT_STONE(камень),

//Здесь заканчивается первая область и начинается вторая, ответственная за выво текста.

descriptions = name; //То, что отображается на самой верхней строке. В данном случае имя оружия, которое вы написали в функции name. Сюда можно написать и что-нибудь своё, взяв в кавычки.

TEXT[1] = "cвой текст"; //Здесь вы можете написать описание этого предмета. Если описания не будет, эти строки вообще не пишем.
TEXT[2] = функция; //Используется для ввода функций типа сколько нужно силы или ловкости, к чему и что прибавляет, количество урона для оружия, зашиты для доспехов и т.д. и т.п. Более подробно буду останавливаться когда буду описывать создание отдельных типов(далее).
TEXT[3] = функция; //Аналогично TEXT[2]
TEXT[4] = функция; //Аналогично TEXT[2], но эта строка используется редко
TEXT[5] = NAME_VALUE; //Функция цены предмета

COUNT[2] = переменная; //Назначается значение функции из TEXT[2]. Понимаю, пока не всё ясно, но позже всё встанет на свои места
COUNT[3] = переменная; //Аналогично
COUNT[4] = переменная; //Аналогично
COUNT[3] = value; //Определяет значение предмета.

Вот в принципе и всесь скелет. Если Вы хотите привязать к предмету какую либо функцию, например постоянное увеличение силы на 20, дописываем следующее:

on_equip = Equip_name; //Где name полностью совпадает с именем предмета. Эта функция означает одевание предмета.
on_unequip = UnEquip_name; //Снятие предмета

TEXT[1] = "Этот предмет даёт небывалую силу";
TEXT[2] = NAME_Bonus_Str;
COUNT[2] = 20;
};

Теперь приписываем само повышение силы:
{
FUNC VOID Equip_Name()
{
Npc_ChangeAttribute(self,ATR_STRENGTH,+ 20);
};


FUNC VOID UnEquip_Name()
{
Npc_ChangeAttribute(self,ATR_STRENGTH,- 20);
};

Готово! Вот пример моей итемки. Это квестовый лук.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
INSTANCE ItRw_KvintBow (C_Item)
{
name = "Лук Квинта";
mainflag = ITEM_KAT_FF;
flags = ITEM_BOW;
value = Value_KvintBow;
visual = "ItRw_Bow_H_04.mms";
material = MAT_WOOD;
munition = ItRw_Arrow;

cond_atr[2] = ATR_DEXTERITY;
cond_value[2] = Condition_KvintBow;

damageTotal = damage_KvintBow;
damagetype = DAM_POINT;

description = name;

TEXT[0] = "Этот лук сделан Виктором";
TEXT[1] = "по заказу Квинта";
TEXT[2] = NAME_Damage; COUNT[2] = damageTotal;
TEXT[3] = NAME_Dex_needed; COUNT[3] = cond_value[2];
TEXT[5] = NAME_Value; COUNT[5] = value;
};

Примите во внимание, что после damagetotal(повреждения), value(цена) и cond_value[2](cтоимость ловкости) стоят не числа, а функции. Чтобы приписать числа к этим функциям(т.е. скока именно дамаг, цена, и ст-ть ловкости) нужно в файле Items\Tuning_Ranged_Weapons.d дописать следующее:

const int damage_KvintBow = 130; //Повреждения 180
const int Condition_KvintBow = 90; //Требует ловкости 90
const int Value_KvintBow = 1800; //стоит 1800

КОНЕЦ! Но тутор далеко не полный. Просто решил вынести основное на ваш суд. Позже(может дня через два-три) к тутору будут добавлены пояснения о создании каждого типа предметов.

ЧАСТЬ ВТОРАЯ

Так, теперь по-порядку. Создание определённого предмета.

1.АМУЛЕТЫ

Про флаги, имена, текст распространяться не буду - надеюсь это уже понятно.
Вообще в игре есть 2 вида амулетов(резист к защите и к умениям, ну ещё квестовые). Но можно сделать ещё комбинированные, если нужно(наприм. +20 к защите от магии и +10 к ловкости) или просто как украшения, именные, и всё, на что фантазии хватит - а сделать МОЖНО!

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
INSTANCE ItAm_Prot_Fire(C_Item)
{
name = "Амулет из жерла вулкана";

mainflag = ITEM_KAT_MAGIC;
flags = ITEM_AMULET;

value = 10000;

visual = "ItAm_Prot_Fire_01.3ds";

visual_skin = 0;
material = MAT_METAL;

wear = WEAR_EFFECT; //Не помню зачем... пусть бедет.
on_equip = Equip_Prot_Fire;
on_unequip = UnEquip_Prot_Fire;

description = name;

TEXT[2] = "Защита от огня";
COUNT[2] = 50;
TEXT[5] = NAME_Value;
COUNT[5] = 10000;

INV_ZBIAS = INVCAM_ENTF_AMULETTE_STANDARD; //Чего не знаю, того не знаю. Кажется месторасположение в ивентаре. Но не точно. В любом случае эту строку не изменяйте.

};

FUNC VOID Equip_Prot_Fire()
{
self.protection [PROT_FIRE] += 50;
};


FUNC VOID UnEquip_Prot_Fire()
{
self.protection [PROT_FIRE] -= 50;
};

Это амулет для защиты от огня на 50 едениц.
Как привязать к предмету повышение хар-ки вы уже знаете.

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

2.ТРОФЕИ

Для примера возьмём мясо какого-нибудь особенного мясного жука, при съедании которго прибавляется +1 к силе.

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
INSTANCE ItAt_Meatbugflesh_Str (C_Item)
{
name = "Мясо жука-убийцы";

mainflag = ITEM_KAT_FOOD;
flags = ITEM_MULTI;

value = 200;

visual = "ItAt_Meatbugflesh.3DS";
material = MAT_LEATHER;
scemeName = "FOODHUGE";
on_state[0] = Use_Meatbugflesh_Str; //Процедура использования вещи

description = name;
TEXT[1] = NAME_Bonus_HP; COUNT[1] = 10;
TEXT[2] = NAME_Bonus_Str; COUNT[2] = 1;
TEXT[5] = NAME_Value; COUNT[5] = value;
};

FUNC VOID Use_Meatbugflesh_Str()
{
Npc_ChangeAttribute (self, ATR_HITPOINTS, 10);
Npc_ChangeAttribute (self, ATR_STRENGTH, 1);
PrintScreen ("Сила +1", -1, 45, FONT_SCREEN, 2);
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

3.ДОСПЕХИ

Создаём модифицированные доспехи из пластин ползунов, по сюжету, наприм. окраплёные кровью Инноса
Просто добавляем защиты побольше к старым и привязываем увеличение плюс манны на 100.

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

INSTANCE ITAR_DJG_Crawler_Innos (C_Item)
{
name = "Ползунки Инноса";

mainflag = ITEM_KAT_ARMOR;
flags = 0;

protection [PROT_EDGE] = 170;//Защита от острия
protection [PROT_BLUNT] = 170;//Защита от тупого оружия
protection [PROT_POINT] = 170;//защита от стрел
protection [PROT_FIRE] = 115;//Защита от огня


value = 30000;

wear = WEAR_TORSO;

visual = "ItAr_Djg_Crawler.3ds";
visual_change = "Armor_Djg_Crawler.asc";
visual_skin = 0;
material = MAT_LEATHER;

on_equip = Equip_ITAR_DJG_Crawler_Innos;
on_unequip = UnEquip_ITAR_DJG_Crawler_Innos;

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_Bonus_Mana;
COUNT[4] = 100;

TEXT[5] = NAME_Value;
COUNT[5] = value;
};
FUNC VOID Equip_ITAR_DJG_Crawler_Innos()
{
if Npc_IsPlayer (self) //Условие если одеты на ГГ
{
MCArmor_Equipped = TRUE;

if (MC_Equipped == TRUE)
{
self.protection[PROT_EDGE] += 170;
self.protection[PROT_BLUNT] += 170;
self.protection[PROT_POINT] += 170;
self.protection[PROT_FIRE] += 115;
Npc_ChangeAttribute (self, ATR_MANA, 25);
self.aivar[REAL_MANA] = self.aivar[REAL_MANA], +25;

};
};
};
FUNC VOID UnEquip_ITAR_DJG_Crawler_Innos()
{
if Npc_IsPlayer (self)
{
MCArmor_Equipped = FALSE;

if (MC_Equipped == TRUE)
{
self.protection[PROT_EDGE] -= 170;
self.protection[PROT_BLUNT] -= 170;
self.protection[PROT_POINT] -= 170;
Npc_ChangeAttribute (self, ATR_MANA, 25);
self.aivar[REAL_MANA] = self.aivar[REAL_MANA], -25;
};
};
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

4.Провиант

Случай такой же, как и с мясом жука-убийцы

5.Ключи

Сейчас сделаем обычный ключик. Какой сундук или какую дверь открывает этот ключ прописывается не в скрипте ключа, а в свойствах воба(сундука или двери).

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
INSTANCE ItKe_Key_PapaKarlo(C_Item)
{
name = "Золотой ключик от каморки папы Карло";

mainflag = ITEM_KAT_NONE;
flags = 0;

value = 500;

visual = "ItKe_Key_01.3ds";
material = MAT_METAL;

description = name;

TEXT[2] = "Этот ключь открывает замок";
TEXT[3] = "за нарисованным чайником";

};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

6. Оружие ближнего боя.

Делаем супер-меч с дамагом 300 и прибавке к владению двурушником +50%

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

INSTANCE ItMw_Zorn_of_god (C_Item)
{
name = "Месть богов";

mainflag = ITEM_KAT_NF;
flags = ITEM_SWD;
material = MAT_METAL;

value = 20000;

damageTotal = 300; //Общий урон
damagetype = DAM_EDGE; //Тип повреждений. В данном случае лезвием.


cond_atr[2] = ATR_STRENGTH; //Что требует. В данном случае силы. Ловкость - cond_atr[2] = ATR_DEXTERITY;
cond_value[2] = 205; //Стоимость силы.
visual = "ItMw_1H_Blessed_03.3DS";

on_equip = Equip_Innos_of_GOD;
on_unequip = UnEquip_Innos_of_GOD;

description = name;
TEXT[1] = NAME_Damage; COUNT[1] = damageTotal;
TEXT[2] = NAME_Str_needed; COUNT[2] = cond_value[2];
TEXT[3] = "К двуручному умению"; COUNT[3] = 50;
TEXT[4] = NAME_TwoHanded;
TEXT[5] = NAME_Value; COUNT[5] = value;
};

FUNC VOID Equip_Innos_of_GOD()
{
B_AddFightSkill (self, NPC_TALENT_1H, 50);
};


FUNC VOID UnEquip_Innos_of_GOD()
{
B_AddFightSkill (self, NPC_TALENT_1H, -50);
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

7.Оружие дальнего боя.

см. пример "Лук Квинта".

8.Напитки.
"Усложняем номер" (С)
Делаем настойку из крови дракона, дающую +25 к силе и ловкости, но только ОНД.

/////////////////////////////////////////////////////////////////////////////////////////////
INSTANCE ItPo_DragonsBlood(C_Item)
{
name = "Настойка из крови дракона";

mainflag = ITEM_KAT_POTIONS;
flags = ITEM_MULTI;

value = 7000;

visual = "ItMi_Flask.3ds";
material = MAT_GLAS;
on_state[0] = UseItPo_DragonsBlood;
scemeName = "POTIONFAST";

wear = WEAR_EFFECT;
effect = "SPELLFX_ITEMGLIMMER";

description = name;

TEXT[1] = "???"; //В игре действие будет неизвестно

TEXT[5] = NAME_Value;
COUNT[5] = value;

};

FUNC VOID UseItPo_DragonsBlood()
{
IF (hero.guild == GIL_DJG)
{
Npc_ChangeAttribute (self, ATR_STRENGTH ,25);
self.aivar[REAL_STRENGTH] = self.aivar[REAL_STRENGTH] + 25;
Npc_ChangeAttribute (self, ATR_DEXTERITY,25);
self.aivar[REAL_DEXTERITY] = self.aivar[REAL_DEXTERITY] + 25;
PrintScreen ("Я стал сильнее", -1, 45, FONT_SCREEN, 2); //Выводит строку текста "Я стал сильнее" на 2 секунды.

}
else
{

Npc_ChangeAttribute (self, ATR_STRENGTH ,0);
self.aivar[REAL_STRENGTH] = self.aivar[REAL_STRENGTH] + 0;
Npc_ChangeAttribute (self, ATR_DEXTERITY,0);
self.aivar[REAL_DEXTERITY] = self.aivar[REAL_DEXTERITY] + 0;
PrintScreen ("ничего не произошло", -1, 45, FONT_SCREEN, 2);
};
};
/////////////////////////////////////////////////////////////////////////////////////////////

9. Кольца

Аналогично амулетам.

10.Руны.

Абсолют новые руны сделать скриптово Вы не можете, т.к. для этого нужны новая визуализация и эффекты.
Можно только модифицировать кол-во манны, которое требуется для заклинания и его повреждение.

11.Книги

/////////////////////////////////////////////////////////////////////////////////////////////
INSTANCE ItWr_123 (C_Item)
{
name = "Книга";
mainflag = ITEM_KAT_DOCS;
flags = 0;
value = 500;
visual = "ItWr_Book_02_05.3ds";
material = MAT_LEATHER;
scemeName = "MAP";
on_state[0] = Use_Book;
description = name;
TEXT[2] = "Это книга для тутора по скриптам";
TEXT[3] = "В летописях строителей.";
TEXT[5] = NAME_Value;
COUNT[5] = value;
};

FUNC VOID Use_Book()//С этой функции и далее прописывается непосредственно текст книги.
{

var int nDocID;//Переменная

nDocID = Doc_Create();//DocManager
Doc_SetPages(nDocID, 2);//Сколько страниц в книге (листать книги в готике нельзя, поэтому диапозон страниц не велик - от 1 до 2)
Doc_SetPage (nDocID, 0, "BOOK_MAGE_L.tga" , 0);//Текстура первой страницы
Doc_SetPage (nDocID, 1, "BOOK_MAGE_R.tga" , 0);//Текстура второй страницы

//1.Seite //Для первой страницы

Doc_SetMargins ( nDocID, 0, 275, 20, 30, 20, 1 );//Ограничение текста. Своеоьразная рамка, куда помещён текст. Для опытных.
Doc_SetFont ( nDocID, 0, FONT_BookHeadline );//Шрифт. В данном случае крупный жирный(для заголовков)
Doc_PrintLine ( nDocID, 0, "Каляка-баляка"); //Сам текст
Doc_SetFont ( nDocID, 0, FONT_Book); //Обычный шрифт
Doc_PrintLine ( nDocID, 0, ""); //Пропуск строки
Doc_PrintLines ( nDocID, 0, "Каляка баляка"); //Текст
Doc_PrintLine ( nDocID, 0, ""); //Пропуск строки
Doc_PrintLines ( nDocID, 0, "Каляка баляка"); //И так далее и т.п. Можете пропускать строки, не пропускать... и писать что угодно.

//2.Seite //Тоже самое, только для второй страницы.

Doc_SetMargins ( nDocID, -1, 30, 20, 275, 20, 1 );
Doc_SetFont ( nDocID, 1, FONT_BookHeadline );
Doc_PrintLine ( nDocID, 1, "НАЧАЛО");
Doc_SetFont ( nDocID, 1, FONT_Book);
Doc_PrintLine ( nDocID, 1, "");
Doc_PrintLine ( nDocID, 1, "The end!");
Doc_PrintLine ( nDocID, 1, "");
Doc_PrintLines ( nDocID, 1, "КОНЕЦ!");

Doc_Show ( nDocID);
};
/////////////////////////////////////////////////////////////////////////////////////////////

Вот и весь тутор. Все функции и предметы проверены в игре лично ВенДиго (С).
Автор: ВенДиго(С). При помощи и поддержке Francisc'a
 
Кстати, для тех кто еще его не скачал, даю ссылку на тутор от Вама: VAM TUTOR

Ну, и еще статьи (Раз понравились):

Правда, это уже не столько скрипты, сколько оформление...

(С сайта modteam.ru)

Для запаковки мода:

Запускаем GothicVDFS

1) Нажимаем на вкладке (Builder)
2) Нажимаем на три точки ... на одной строке с Filename и пишем в открывшемся окне "Select volume filename..." названия файла вашего мода и нажимаем сохранить
3) Нажимаем на три точки ... на одной строке с Root Path и указываем в открывшемся окне "Обзор папок" путь к папке с вашими файлами
Внимание!
Фаши файлы, чтобы они заработали, должны лежать по следующему пути:
*/_work/Data/*/ваши файлы. Например, 1/_work/Data/Worlds/World.zen.
Т.е. будет ошибкой, если вы укажите путь к папке _work.
4) В окне File(mask)(s) to include пишем название вашего файла(-ов), и нажимаем +
Внимание!
Если вы собираетесь запаковать группу файлов, например текстуры, то указываете*.tex. Это значит, что все файлы с раширением TEX будут запакованы.
5) Если есть такие файлы (или группа), которые не должны попасть в архив,пропишите в строке File(mask)(s) to exclude их.

Все, теперь нужно запаковать их. Нажимаем кнопку Build Volume (желательно, чтобы галочка Sorted стояла).
Ваш мод готов. Теперь ваш нужно создать файл запуска.


Запускаем GothicVDFS. Скачать можно тут:

Для распаковки мода:
1) Нажимаем на вкладке (Viewer)
2) Нажимаем на три точки ... на одной строке с Filename и указываем в открывшемся окне "Select volume..." названия файла и нажимаем открыть
3) Нажимаем на три точки ... на одной строке с Root Path и указываем в открывшемся окне "Обзор папок" путь, куда распаковать файлы
4) Далее выбираем действие, которое необходимо совершить:
- Extract Volume - извлечь архив
- Extract Directory - извлечь директорию
- Extract Selected - извлечь выделенный файл или папку
Ну, вот, пожалуй и всё.

СТАТЬИ


Создание файла запуска мода:


Хочу отметить, что это для тех, кто только-только постигает азы модостроительства!


Создаем файл с именем вашего мода, например mymod.ini
В начале файла пишем:

[INFO]
Это, как бы вам сказать, блок информации о моде.
Далее, пишем:

Title=название твоего мода
Title - заголовок, название вашего мода.
Version=твоя версия мода
Версия вашего мода
Authors=Твой ник
Автор(ы)
Webpage=http://www.modteam.ru/
Ваша страничка в сети
Description={ tf1\ansi\ansicpg1251\pard\qc\lang1049\par Вот мой первый мод! Он повествует о бла-бла-бла-бла-бла-бла. В нем вы встретите бла-бла-бла-бла-бла-бла. Все вопросы задавайте в моем форуме по адресу \par http://www.forums.modteam.ru\par\par}
Текст, о чем мод
Icon=GothicStarter.exe
Иконка


[FILES]
Это файлы, которые будут включены для запуска мода:
VDF=mymod.mod
Файл твоего мира (если нужно несколько, то раздели их двумя пробелами)
Game=Content\Gothic
Далее, думаю, объяснять не надо. Тут все понятно.
FightAI=Content\Fight
Menu=System\Menu
Camera=System\Camera
Music=System\Music
SoundEffects=System\SFX
ParticleEffects=System\ParticleFX
VisualEffects=System\VisualFX
OutputUnits=OU[SETTINGS]
World=miranda.zen
Название файла мира мода относительно папки worlds (если у тебя мир ледит так worlds/*/*.zen, то и в значении пиши */*.zen!)
Player=PC_Hero
Файл с главным героем (ГГ).

[OPTIONS]
Это различные опции, которые не нужны для первого мода
show_Info=0
show_InfoX=800
show_InfoY=7200
show_Version=1
show_VersionX=6500
show_VersionY=7200
show_Focus=1
show_FocusItm=1
show_FocusMob=1
show_FocusNpc=1
show_FocusBar=1
force_Subtitles=1
force_Parameters=



В итоге, у тебя должен получиться такой файл mymod.ini:

[INFO]

Title=название твоего мода
Version=твоя версия мода
Authors=Твой ник
Webpage=http://www.modteam.ru/
Description={ tf1\ansi\ansicpg1251\pard\qc\lang1049\par Вот мой первый мод! Он повествует о бла-бла-бла-бла-бла-бла. В нем вы встретите бла-бла-бла-бла-бла-бла. Все вопросы задавайте в моем форуме по адресу \par http://www.forums.modteam.ru\par\par}
Icon=GothicStarter.exe

[FILES]

VDF=mymod.mod
Game=Content\Gothic
FightAI=Content\Fight
Menu=System\Menu
Camera=System\Camera
Music=System\Music
SoundEffects=System\SFX
ParticleEffects=System\ParticleFX
VisualEffects=System\VisualFX
OutputUnits=OU[SETTINGS]
World=miranda.zen
Player=PC_Hero

[OPTIONS]

show_Info=0
show_InfoX=800
show_InfoY=7200
show_Version=1
show_VersionX=6500
show_VersionY=7200
show_Focus=1
show_FocusItm=1
show_FocusMob=1
show_FocusNpc=1
show_FocusBar=1
force_Subtitles=1
force_Parameters=



Все. Сохраняй, запускай GothicStarter.exe

FAQ
Наидолее часто встречающиеся вопросы:

В: У меня при запуске Spacer сворачивается, и не разворачивается. Что делать?
О: Нажмите Ctrl-Alt-Del, выберите вкладку "Приложения", нажмите правой кнопкой на Spacer и выберите "Развернуть"

В: Открываю GoMan, открывается свернутым. Что делать?
О: Нажмите на него правой кнопкой - "Развернуть"

В: Запускаю Spacer, а он мне пишет, что не найден файл GothicGame.ini...
О: Вы не установили Gothic Starter. Установите.

В: Я скомпилировал скрипты, а когда вошел в игру, она вылетела с ошибкой. Spacer тоже выдает ошибку.
О: Поврежден либо DAT файл, либо BIN. Удалите их, и установите резервную копию (если она у вас есть)

В: Я менял настройки в файле gothic.ini, и неправильно установил значения. Игра не работает...
О: Скачайте с нашего сайта файл gothic.ini и установите его вместно вашего

В: При запуске Spacer пишет "Точка в процедуру _RIB_provider_library_handle@0 не найдена в библиотеке DLL mss23.dll"
О: Вы используете пиратскую версию игры. Нажмите "ОК" и редактор загрузиться, либо купите лицензионную версию игры

В: При проверке скритов Spacer выдает ошибку типа "яюI" или похожую, и дальше выдает весь скрипт как ошибку
О: Вы сохранили скрипт как Юникод. Сохраните как ANSI

В: Я запаковал мод. Создал ini файл, но при загрузке, я попадаю в черный мир, где нет ничего...
О: Скорее всего, вы не верно указали имя файла и путь к нему в ini файле. Если у вас мир лежит здесь - "_work/data/worlds/*/мир.zen", то и в ini файле в строке World= вы должны писать World=*/мир.zen
 
Последнее редактирование:
Назад
Сверху