Форум команды Magic Team

Форум команды Magic Team (//magic-team.net.ru/index.php)
-   Модостроение к Gothic (//magic-team.net.ru/forumdisplay.php?f=18)
-   -   Скриптинг (//magic-team.net.ru/showthread.php?t=7)

DEDROIT 01.02.2006 20:59

Скриптинг
 
И так, я начну:
Заходим в
Gothic II\_work\Data\Scripts\Content\Story\NPC
и создаём там файл
NONE_1000_DEDROIT.d

где
NONE – принадлежность к гильдии (в данном случае нейтрал,без гильдии).
1000 – уникальный порядковый номер НПС.
DEDROIT – имя вашего НПС.

Вот содержимое файла:

instance NONE_1000_DEDROIT (Npc_Default) //это создание персонажа (инстанции) от общего прототипа НПС
{
//-------------
//Данные персонажа
//-------------
name = "Арес"; //Имя нпс.
guild = GIL_NONE; //Принадлежность к гильдии.
npctype = NpcType_Friend; //Это отношение к главному герою(в нашем случае дружелюбный).
flags = 0; //Определяет "бессмертие" НПС. 0 - смертный, Npc_Flag_Immortal - бессмертный, Npc_Flag_Ghost - призрак.
id = 1000; //Порядковый номер персонажа.
level = 25; //Уровень НПС.
voice = 6; //Голос персонажа.
//-------------
//Аттрибуты
//--------------------
attribute[ATR_STRENGTH] = 170; //Сила
attribute[ATR_DEXTERITY] = 150; //Ловкость
attribute[ATR_MANA_MAX] = 110; //Максимальная мана
attribute[ATR_MANA] = 110; //Текущая мана
attribute[ATR_HITPOINTS_MAX] = 200; //Максимальное здоровье
attribute[ATR_HITPOINTS] = 200; //Текущее здоровье
//-------------
//Защита
//----------------------
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_MAGIC] = 0; //Магией
//-------------
//Таланты
//---------------------
HitChance [NPC_TALENT_1H] = 60; //Владение Одноручником
HitChance [NPC_TALENT_2H] = 50; //Владение Двуручником
HitChance [NPC_TALENT_BOW] = 60; //Умение обращаться с Луком
HitChance [NPC_TALENT_CROSSBOW] = 30; //Умение обращаться с Арбалетом
Npc_SetTalentSkill (self, NPC_TALENT_PICKLOCK, 1); //Взлом замков
Npc_SetTalentSkill (self, NPC_TALENT_SNEAK, 1);//Подкрадывание
Npc_SetTalentSkill (self, NPC_TALENT_ACROBAT, 1); //Акробатика
//Значение 1 - выучено, 0 - невыучено.
//-------------
//Визуализация
//------------------
Mdl_SetModelFatness (self, 0); //Это как будет выглядеть персонаж толстым или худым.
Mdl_ApplyOverlayMds (self, "Humans_Relaxed.mds"); //оверлей анимаций.
B_SetNpcVisual (self, MALE, "Hum_Head_FatBald", Face_N_NormalBart03, BodyTex_N, ITAR_Bau_M);
//Male - мужской пол, Female - женский пол.
//Hum_Head_FatBald->вид головы.
//Face_N_NormalBart03->лицо вашего персонажа.
//BodyTex_N->текстура тела.
//ITAR_Bau_M->доспехи, одетые на персонажа.
//---------------
//Экипировка
//--------------------
EquipItem (self, ItMW_Addon_Stab01); //то, что надето на персонаже(в дано случаи волчий нож)!
EquipItem (self, ItRw_Addon_MagicBow); //Магический лук
//Все вещи,которыесть в игре можно посмотреть в папке Items.
//----------------
//Инвентарь
//--------------------
CreateInvItems (self, ItAm_Prot_Fire_01, 2); //Это то что будет находится в Инвентаре(в данном случаи амулет огня).
//Как я уже и сказал все вещи можно посмотреть в папке Items.
//---------------
//Чувства
//-----------------------
senses = SENSE_SEE | SENSE_SMELL | SENSE_HEAR; //Зрение, обаняние, слух.
senses_range = 2000; //Расстояние действия чувств !
//----------------
//Искусственный интеллект
//------
fight_tactic = FAI_HUMAN_STRONG; //Эта функция отвечает,за то как будет драться нпс,ещё есть FAI_HUMAN_MASTER и FAI_HUMAN_COWARD!
daily_routine = rtn_start_1000; //Ввод распорядка дня.
};
//----------------
//Распорядок дня
//---------------
func void rtn_start_1000() //функция распорядка дня
{
TA_Smoke_Joint (8, 0, 22, 0, "NW_FARM1_OUT_01");
TA_Smoke_Joint (22, 0, 8, 0, "NW_FARM1_OUT_01");
};
//TA_Smoke_Joint->стоит и курит болотник!
//8, 0, 22, 0->время, в течении которого нпс совершает действие.
//NW_FARM1_OUT_01->название вайпоинта,где будет стоять ваш нпс (В даном случае возле Лобарта)!
//Самый быстрый способ посмотреть нужный вам вейпоинт,это зайти в Spacer и полетать по нему! Вот так приблизительно должен выглядеть скрипт без комментариев:

instance NONE_1000_DEDROIT (Npc_Default)
{
//-------------
//Данные персонажа
//-------
name = "Арес";
guild = GIL_NONE;
npctype = NpcType_Friend;
level = 25;
voice = 6;
id = 1000;
//-------------
//Аттрибуты
//---------------
attribute[ATR_STRENGTH] = 170;
attribute[ATR_DEXTERITY] = 150;
attribute[ATR_MANA_MAX] = 110;
attribute[ATR_MANA] = 110;
attribute[ATR_HITPOINTS_MAX] = 200;
attribute[ATR_HITPOINTS] = 200;
//-------------
//Визуализация
//------------
Mdl_SetModelFatness (self, 0);
Mdl_ApplyOverlayMds (self, "Humans_Relaxed.mds");
B_SetNpcVisual (self, MALE, "Hum_Head_FatBald", Face_N_NormalBart03, BodyTex_N, ITAR_Bau_M);
//-------------
//Таланты
//----------------
HitChance [NPC_TALENT_1H] = 60;
HitChance [NPC_TALENT_2H] = 50;
HitChance [NPC_TALENT_BOW] = 60;
HitChance [NPC_TALENT_CROSSBOW] = 30;
//-------------
//Инвентарь
//---------------
CreateInvItems (self, ItAm_Prot_Fire_01, 2);
EquipItem (self, ItMW_Addon_Stab01);
EquipItem (self, ItRw_Addon_MagicBow);
//-------------
//Чувства
//-------------------
senses = SENSE_SEE | SENSE_SMELL | SENSE_HEAR;
senses_range = 2000;
//-------------
//АИ
//------------------------
fight_tactic = FAI_HUMAN_MASTER;
daily_routine = Rtn_Start_1000;
};
func void Rtn_Start_1000()
{
TA_Smoke_Joint (8,0,22,0,"NW_FARM1_OUT_01");
TA_Smoke_Joint (22,0,8,0,"NW_FARM1_OUT_01");
};Теперь вставляем нпс в игру!

Открываем файл Gothic II\_work\Data\Scripts\Content\Story\StartUp.d Находим в нём строку Wld_InsertNpc(BAU_950_Lobart,”NW_FARM1_OUT_01”);
дописываем ниже Wld_InsertNpc(NONE_1000_DEDROIT,”NW_FARM1_OUT_01”) ;
Открываем прогу Spacer(она находится в Gothic II\System)
Нажимаем World\Reparse Script(заменить скрипты), выбираем Gothic.src и нажимаем открыть. Будет идти компиляция скриптов.
Всё теперь заходим в игру,только обязательно начинаем игру с начала!И вооля !!

Примечание: Если во время компиляции будут ошибки,вы должны их исправить и произвести компиляцию заново. Убедитесь, что файл NONE_1000_DEDROIT.d включен в процесс компиляции (добавлен в gothic.src либо как STORY\NPC\*.d, либо как Story\NPC\NONE_1000_DEDROIT.d).

Список распорядка дня нпс:

TA_Announce_Herold – Объявления Герольда
TA_Circle – Ритуал в Круге солнца
TA_Concert – Концерт InExtremo в аддоне
TA_Cook_Cauldron – Приготовление пищи в котле
TA_Cook_Pan – Приготовление пищи на сковороде
TA_Cook_Stove – Приготовление пищи в печи
TA_Dance – Танцы НПС
TA_FleeToWp – НПС убегает на свою точку
TA_Follow_Player – НПС следует за ГГ
TA_Ghost – Поведение призраков
TA_GhostWusel – Поведение Радемеса
TA_Guard_Hammer – Охрана Святого молота
TA_Guard_Passage – Охрана прохода
TA_Guide_Player – ГГ следует за НПС
TA_Pee – НПС справляет малую нужду
TA_Pick_FP – НПС бродит по PICK фрипоинтам (что-то ищет или собирает)
TA_Pick_Ore – Добыча руды
TA_Play_Lute – Игра на лютне
TA_Potion_Alchemy – Приготовление алхимических напитков
TA_Practice_Magic – Тренировка магии (не используется)
TA_Practice_Sword – Упражнения с мечом
TA_Pray_Innos – Молитва статуям Инноса
TA_Pray_Innos_FP – Молитва Инносу на заданной точке PRAY
TA_Pray_Sleeper – Молитва статуям Белиара (не используется)
TA_Pray_Sleeper_FP – Молитва Белиару на заданной точке PRAY (не используется)
TA_Preach_Vatras – Проповедь Ватраса
TA_Rake_FP – Работа в поле
TA_Read_Bookstand – Чтение книг
TA_RangerMeeting – Собрание “Кольца Воды” у Орлана
TA_Repair_Hut – Ремонт хижины
TA_Roast_Scavenger – Барбекю из Падальщика
TA_RunToWP – НПС бежит на охраняемую точку
TA_Saw – Распиловка древесины
TA_Sit_Bench – Сидеть на скамье
TA_Sit_Campfire – Сидеть у костра
TA_Sit_Chair – Сидеть на стуле
TA_Sit_Throne – Сидеть на троне
TA_Sleep – Спать на кровати
TA_Sleep_Deep – Очень крепко спать на кровати (не используется)
TA_Smalltalk – Мини диалог между НПС
TA_Smith_Anvil – Использование наковальни (ковка оружия)
TA_Smith_Cool – Закалка заготовки оружия
TA_Smith_Fire – Разогрев заготовки оружия в горне
TA_Smith_Sharp – Заточка оружия
TA_Smoke_Joint – Курение болотника
TA_Smoke_Waterpipe – Курение кальяна
TA_Spit_Fire – Игра с факелами (не используется)
TA_Stand_ArmsCrossed – Стоять скрестив руки
TA_Stand_Dementor – Состояние ожидания Черных магов (Ищущие)
TA_Stand_Drinking – Пить самогон стоя
TA_Stand_Eating – Употреблять пищу стоя
TA_Stand_Guarding – Охрана территории
TA_Stand_Sweeping – Уборка территории
TA_Stand_WP – Стоять на вайпоинте
TA_Stomp_Herb – Толочь траву
TA_Study_WP – Заниматься науками (передача листа бумаги (записки) ГГ)
TA_Sweep_FP – Работа щеткой
TA_Wash_FP – Умываться (не используется)

Есть ещё одна функция распорядка дня (не оформлена через ТА)
ZS_Bandit – Поведение бандита

Полный список гильдий:

NONE – нейтрал, без гильдии.
BAU – крестьянин;
BDT – бандит;
KDW – маг воды;
MIL – милиция;
PIR – пират;
VLK – горожанин;
DJG – охотник на драконов;
KDF – маг огня;
NOV – послушник;
PAL – паладин;
SLD – наёмник;

Список бронь, которые есть в игре:

ITAR_MIL_L,Легкие доспехи стражника
ITAR_MIL_M,Тяжелые доспехи стражника
ITAR_PAL_M,Доспехи рыцаря
ITAR_PAL_H,Доспехи паладина
ITAR_SLD_L,Легкие доспехи наемника
ITAR_SLD_M,Средние доспехи наемника
ITAR_SLD_H,Тяжелые доспехи наемника
ITAR_DJG_Crawler,Доспехи из панцирей ползунов
ITAR_DJG_L,Легкие доспехи ОнД
ITAR_DJG_M,Средние доспехи ОнД
ITAR_DJG_H,Тяжелые доспехи ОнД
ITAR_DJG_BABE,Кольчуга охотницы за драконами
ITAR_NOV_L,Ряса послушника
ITAR_KDF_L,Мантия Мага Огня
ITAR_KDF_H,Тяжелая мантия Мага Огня
ITAR_Leather_L,Кожаные доспехи
ITAR_BDT_M,Средняя бандитская кольчуга
ITAR_BDT_H,Тяжелая бандитская кольчуга
ITAR_RANGER_Addon,Кольчуга ‘Кольца Воды’
ITAR_Fake_RANGER,Разорванная кольчуга
ITAR_KDW_L_Addon,Легкая мантия Магов Воды
ITAR_KDW_H,Мантия Мага Воды
ITAR_PIR_L_Addon,Одежда пирата
ITAR_PIR_M_Addon,Доспехи пирата
ITAR_PIR_H_Addon,Одежда капитана
ITAR_VLK_L,Одежда горожанина
ITAR_VLK_M,Одежда горожанина
ITAR_VLK_H,Одежда горожанина
ITAR_VlkBabe_L,Одежда горожанки 1
ITAR_VlkBabe_M,Одежда горожанки 2
ITAR_VlkBabe_H,Одежда горожанки 3
ITAR_BAU_L,Одежда крестьянина 1
ITAR_BAU_M,Одежда крестьянина 2
ITAR_BauBabe_L,Одежда крестьянки 1
ITAR_BauBabe_M,Одежда крестьянки 2
ITAR_Bloodwyn_Addon,Кольчуга Бладвина
ITAR_FireArmor_Addon,Магическая кольчуга
ITAR_MayaZombie_Addon,Древняя кольчуга
ITAR_OreBaron_Addon,Броня барона
ITAR_Raven_Addon,Кольчуга Равена
ITAR_Thorus_Addon,Тяжелая кольчуга гардиста
ITAR_BARKEEPER,Одежда трактирщика
ITAR_CorAngar,Кольчуга Кор Ангара
ITAR_Dementor,Темная накидка
ITAR_Diego,Кольчуга Диего
ITAR_Governor,Накидка гор. советника
ITAR_JUDGE,Одежда судьи
ITAR_LESTER,Роба Лестера
ITAR_SMITH,Одежда кузнеца
ITAR_XARDAS,Мантия Темных Искусств
ITAR_Prisoner,Одежда заключенного
ITAR_PAL_SKEL,Древняя кольчуга
NO_ARMOR,Нет доспех


DEDROIT 01.02.2006 21:01

Скриптинг
 
Теперь попробуем создать диалог:
Пример №1.

В папке
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&quo t;); //Я могу чем нибудь помочь?
AI_Output(self,other,"DIA_Dedroit_q_3_01&quot ;); //Да ты можешь мне почь!Ты бы мог бы убить Вино?
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&q uot;); //Я не буду помогать тебе!
AI_Output(self,other,"dia_Dedroit_q_w_03_01&q uot;); //Тогда не жди и отменя помощи.
};

//Если игрок соглашается,то
func void dia_Dedroit_q_e()
{
AI_Output(other,self,"dia_Dedroit_q_e_15_00&q uot;); //Хорошо я погу тебе.
AI_Output(self,other,"dia_Dedroit_q_e_03_01&q uot;); //Вот и отлично,еслт ты его убьёшь я щедро вознагрожу тебя!
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_0 1"); //Великолепно, как я и обещал - мой подарок!
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 NONE_1000_Dedroit_EXIT(C_Info)
{
npc = NONE_1000_Dedroit;
nr = 999;
condition = NONE_1000_Dedroit_EXIT_Condition;
information = NONE_1000_Dedroit_EXIT_Info;
permanent = TRUE;
description = "Конец";
};

func int NONE_1000_Dedroit_EXIT_Condition()
{
return TRUE;
};

func void NONE_1000_Dedroit_EXIT_Info()
{
AI_StopProcessInfos(self);
};Вот так должен выглядеть наш диалог без комментариев:

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&quo t;); //Я могу чем нибудь помочь?
AI_Output(self,other,"DIA_Dedroit_q_3_01&quot ;); //Да ты можешь мне почь!Ты бы мог бы убить Вино?
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&q uot;); //Я не буду помогать тебе!
AI_Output(self,other,"dia_Dedroit_q_w_03_01&q uot;); //Тогда не жди и отменя помощи.
AI_StopProcessInfos(self);
};
func void dia_Dedroit_q_e()
{
AI_Output(other,self,"dia_Dedroit_q_e_15_00&q uot;); //Хорошо я погу тебе.
AI_Output(self,other,"dia_Dedroit_q_e_03_01&q uot;); //Вот и отлично,еслт ты его убьёшь я щедро вознагрожу тебя!
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);
};
instance NONE_1000_Dedroit_EXIT(C_Info)
{
npc = NONE_1000_Dedroit;
nr = 999;
condition = NONE_1000_Dedroit_EXIT_Condition;
information = NONE_1000_Dedroit_EXIT_Info;
permanent = TRUE;
description = “Конец”;
};
func int NONE_1000_Dedroit_EXIT_Condition()
{
return TRUE;
};
func void NONE_1000_Dedroit_EXIT_Info()
{
AI_StopProcessInfos(self);
};
Дальше заходим в Story_Globals и в самом конце прописываем
var int MIS_KillVino;
Потом заходим допустим в
LOG_Constants_Yoly
(находится в папке \Story\Log_Entries)
и в самом конце прописываем
const string TOPIC_KillVino= “Убийство Вино”;

Удаляем существующие Ou.bin и Ou.csl, находятся в Gothic II\_work\Data\Scripts\Content\Cutscene.
Потом запускаем Spacer2, выбираем окно Output-units->update (ждем) и потом Output-units->save. Нажимаем World->Reparse Script->gothic.src.

Скомпилировать gothic.dat и ou.bin можно также прогой от Vam’а.

Убедитесь, что файл DIA_NONE_1000_DEDROIT.d включен в процесс компиляции (добавлен в gothic.src либо как STORY\DIALOGE\DIA*.d, либо как Story\Dialoge\DIA_NONE_1000_DEDROIT.d).

Пример №2
Давайте создадим миссию допустим что-то принести:

В том файле пишем:

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&qu ot;); //Я могу ещё чем нибудьпомочь
AI_Output(self,other,"DIA_DEDEROIT_q_03_01&qu ot;); //Да ты бы мог мне принести кольцо защиты от пламени!
Info_ClearChoices(DIA_DEDEROIT_q3);
Info_AddChoice(dia_DEDEROIT_q3,"Хорошо я принесу.",dia_DEDEROIT_q3_w); //Варианты ответов
Info_AddChoice(dia_DEDEROIT_q3,"Нет, забудь",dia_DEDEROIT_q3_e); //Варианты ответов
Info_AddChoice(dia_DEDEROIT_q3,"Ты мне уже надоел.",dia_DEDEROIT_q3_r); //Варианты ответов
};
//Если игрок соглашается
func void dia_DEDEROIT_q3_w()
{
AI_Output(other,self,"dia_DEDEROIT_q3_w_15_00 "); //Хорошо я принесу тебе кольцо.
AI_Output(self,other,"dia_DEDEROIT_q3_w_03_01 "); //Вот и отлично!
AI_StopProcessInfos (self);
Log_CreateTopic(TOPIC_q_r,LOG_MISSION);//дневник.
Log_SetTopicStatus(TOPIC_q_r,LOG_Running);//дневник(миссия началась)!
B_LogEntry(TOPIC_q_r,"Нужно принести кольцо для Ареса"); //запись в дневнике.
};
//если игрок отказывается
func void dia_DEDEROIT_q3_e()
{
AI_Output(other,self,"dia_DEDEROIT_q3_e_15_00 "); //Нет, забудь.
AI_Output(self,other,"dia_DEDEROIT_q3_e_03_01 "); //Ну и ладно!
AI_StopProcessInfos (self);
};
//Если игрок говорит третий вариант ответа
func void dia_DEDEROIT_q3_r()
{
AI_Output(other,self,"dia_DEDEROIT_q3_r_15_00 "); //Забудь!
AI_Output(self,other,"dia_DEDEROIT_q3_r_03_01 "); //Тогда умри!
AI_StopProcessInfos (self);
B_Attack(self,other,AR_NONE,1);//функция атаки,после разговора непись будет вас атаковать
};
instance DIA_DEDEROIT_q4 (C_Info)
{
npc = NONE_1000_Dedroit;//опятьже имя
nr = 1;
condition = dia_DEDEROIT_q4_condition;
information = dia_DEDEROIT_q4_info;
permanent = FALSE;
important = FALSE;
description = "Вот, я прнёс тебе кольцо";//отображение в меню диалога
};
func int dia_DEDEROIT_q4_condition()
{
if(Npc_HasItems(other, ItRi_Prot_Fire_01)>= 1) //он начнётся если привас будет это кольцо
{
return TRUE;
};
};
func void dia_DEDEROIT_q4_info()
{
AI_Output(other,self,"DIA_DEDEROIT_q4_15_00&q uot;); //Вот, я прнёс тебе кольцо!
AI_Output(self,other,"dia_DEDEROIT_q4_03_01&q uot;); //Отлично!
b_giveinvitems(other,self, ItRi_Prot_Fire_01,1);//вы отдаёте это кольцо!
B_GivePlayerXP(250);//это сеолько опыта вы получили
Log_SetTopicStatus(TOPIC_q_r,LOG_SUCCESS);//миссия закончена
B_LogEntry(TOPIC_q_r,"Я отдал Арксу кольцо.");//запись в дневнике
};TOPIC_q_r прописываем в \Story\Log_Entries\LOG_Constants_Yoly.d
и в конце прописываем const string TOPIC_q_r= “Кольцо для Ареса”;

А дальше тоже самое со Spacer’ом или прогой от Vam’a (написано выше)!

DEDROIT 01.02.2006 21:03

Скриптинг
 
Итак давайте подведём обобщение, создадим что-то типа мини мода. В него будет входить 2 новых НПС, 1 задание, новое оружие,новое письмо.

Всё что будет приведено ниже делается с помощью декомпилятора.

1) Давайте создадим новый меч;
Для этого заходим в DECOMPILED\_work\data\Scripts\_decompiled\Items
и открываем файл IT_Melee_weapons

там создаём скрипт:

instance ItMw_2h_Sld_Sword2(C_Item)
{
name = "Магический меч Тима";

mainflag = ITEM_KAT_NF;
flags = ITEM_2HD_SWD;

material = MAT_METAL;
wear = WEAR_EFFECT;
effect = "SPELLFX_CROSSBOW";

value = Value_Sld2hSchwert;

damageTotal = Damage_Sld2hSchwert;
damagetype = DAM_EDGE;
range = Range_Sld2hSchwert;

cond_atr[2] = ATR_STRENGTH;
cond_value[2] = Condition_Sld2hSchwert;

visual = "ItMw_035_2h_sld_sword_01.3DS";

description = name;

text[2] = NAME_Damage;
count[2] = damageTotal;
text[3] = NAME_Str_needed;
count[3] = cond_value[ 2];
text[4] = NAME_TwoHanded;
text[5] = NAME_Value;
count[5] = value;
};Я думаю здесь комментировать не надо и так всё понятно, просто подмечу что эти 2 строчки

wear = WEAR_EFFECT;
effect = "SPELLFX_CROSSBOW";означают что наш меч будет сверкать как магический арбалет.

2) Теперь создадим письмо;

заходим в DECOMPILED\_work\data\Scripts\_decompiled\Items
и открываем файл IT_Addon_Written

Там пишем скрипт нашего письма:

instance ITWr_Addon_Hinweis_05(C_Item)
{
name = "Письмо Ксардасу"; // название письма
mainflag = ITEM_KAT_DOCS;
flags = ITEM_MISSION; // флаг
value = 250; // сколько стоит
visual = "ItWr_Scroll_01.3DS"; // как выглядит
material = MAT_LEATHER;
on_state[0] = Use_Hinweis_05;
scemeName = "MAP";
description = name;
text[0] = "";
};

func void Use_Hinweis_05()
{
var int nDocID;
nDocID = Doc_Create();
Doc_SetPages(nDocID,1);
Doc_SetPage(nDocID,0,"letters.TGA",0);
Doc_SetFont(nDocID,0,FONT_BookHeadline);
Doc_SetMargins(nDocID,-1,50,50,50,50,1);
Doc_PrintLine(nDocID,0,"");
Doc_SetFont(nDocID,0,FONT_Book);
Doc_PrintLine(nDocID,0,"");
Doc_PrintLine(nDocID,0,"Парни,");
Doc_PrintLines(nDocID,0,"");
Doc_PrintLines(nDocID,0,"Привет мой старый друг,вот решил");
Doc_PrintLines(nDocID,0,"тебя поведать");
Doc_PrintLines(nDocID,0,"Давай встретимся в знакомом мне месте");
Doc_PrintLines(nDocID,0,"Возле таверны мёртвая гарпия.");
Doc_PrintLine(nDocID,0,"");
Doc_PrintLine(nDocID,0,"Рухар");
Doc_PrintLine(nDocID,0,"");
Doc_Show(nDocID);
};Ну а дальше идёт сам текст. Тут думаю всё понятно.

Теперь создаём скрипты 2 неписей:

Для этого заходим в DECOMPILED\_work\data\Scripts\_decompiled\Story\NP C и создаём там файл
под названием VLK_666_Tim:

instance VLK_666_Tim(Npc_Default)
{
name[ 0] = "Тим"; // имя
guild = GIL_VLK; // Гильдия(в нашем случае горожанин)
id = 666; // уникальный идентификатор.
voice = 13; // голос персонажа
flags = 0; // флаг (в нашем случае смертный)
npcType = NPCTYPE_AMBIENT; // тип персонажа (несюжетный)

// Ниже атрибуты,там всё понятно

attribute[ATR_STRENGTH] = 150;
attribute[ATR_DEXTERITY] = 150;
attribute[ATR_MANA_MAX] = 110;
attribute[ATR_MANA] = 110;
attribute[ATR_HITPOINTS_MAX] = 250;
attribute[ATR_HITPOINTS] = 250;

// Здесь таланты,оже понятно

HitChance [NPC_TALENT_1H] = 100;
HitChance [NPC_TALENT_2H] = 100;
HitChance [NPC_TALENT_BOW] = 100;
HitChance [NPC_TALENT_CROSSBOW] = 100;

B_GiveNpcTalents(self);
B_SetFightSkills(self,15);
fight_tactic = FAI_HUMAN_COWARD; // владение оружием

EquipItem(self, ItRw_Bow_M_04); // Лук одет
B_CreateAmbientInv(self);

B_SetNpcVisual(self,MALE,"Hum_Head_Bald" ,Face_N_NormalBart_Dusty,BodyTex_N, ITAR_VLK_L); // Внешность
Mdl_SetModelFatness(self,1);
Mdl_ApplyOverlayMds(self,"Humans_Relaxed.mds& quot;);

daily_routine = Rtn_Start_666;
};

func void Rtn_Start_666()
{
TA_Smoke_Joint (7,55,19,55,"NW_FARM1_OUT_01");
TA_Smoke_Joint (19,55,7,15,"NW_FARM1_OUT_01");
};Чувак стоит на ферме Лобарта и курит болотник.

Теперь создаём скрипт второго НПС под названием KDF_999_Ryxar:

instance KDF_999_Ryxar(Npc_Default)
{
name [0] = "Рухар";
guild = GIL_KDF;
id = 999;
voice = 13;
flags = 0;
npcType = NPCTYPE_AMBIENT;

attribute[ATR_STRENGTH] = 50;
attribute[ATR_DEXTERITY] = 50;
attribute[ATR_MANA_MAX] = 1000;
attribute[ATR_MANA] = 1000;
attribute[ATR_HITPOINTS_MAX] = 1000;
attribute[ATR_HITPOINTS] = 1000;

HitChance [NPC_TALENT_1H] = 100;
HitChance [NPC_TALENT_2H] = 100;
HitChance [NPC_TALENT_BOW] = 100;
HitChance [NPC_TALENT_CROSSBOW] = 100;

B_SetFightSkills(self,15);
fight_tactic = FAI_HUMAN_COWARD;

CreateInvItems(self,ItMw_2h_Sld_Sword2,1);
EquipItem(self,ItMw_1h_Nov_Mace);
B_CreateAmbientInv(self);

B_SetNpcVisual(self,MALE,"Hum_Head_Bald" ,Face_N_NormalBart10,BodyTex_N, ItAr_KDF_L);
Mdl_SetModelFatness(self,0);
Mdl_ApplyOverlayMds(self,"Humans_Mage.mds&quo t;);

daily_routine = Rtn_Start_999;
};

func void Rtn_Start_999()
{
TA_Practice_Magic (7,55,19,55,"NW_CITY_MERCHANT_TEMPLE_IN" );
TA_Practice_Magic (19,55,7,15,"NW_CITY_MERCHANT_TEMPLE_IN" );
};Я повторятся не буду, то же самое.
Только этот НПС стоит в Городе возле Ватраса..

Теперь давайте создадим для них диалоги, сначала создадим диалог Тима;

Для этого заходим в
DECOMPILED\_work\data\Scripts\_decompiled\Story\Di aloge и создаём файл под названием DIA_VLK_666_Tim

Теперь его внутренность:

instance DIA_VLK_666_Tim_EXIT(C_Info)
{
npc = VLK_666_Tim;
nr = 999;
condition = DIA_VLK_666_Tim_EXIT_Condition;
information = DIA_VLK_666_Tim_EXIT_Info;
permanent = TRUE;
description = Dialog_Ende;
};

func int DIA_VLK_666_Tim_EXIT_Condition()
{
return TRUE;
};

func void DIA_VLK_666_Tim_EXIT_Info()
{
AI_StopProcessInfos(self);
};

// Вот эта часть чтобы можно было завершить диалог.

instance DIA_Tim_Hello(C_Info)
{
npc = VLK_666_Tim;
nr = 1;
condition = DIA_Tim_Hello_Condition;
information = DIA_Tim_Hello_Info;
permanent = FALSE;
important = TRUE; // НПС сам начинает разговор.
};

func int DIA_Tim_Hello_Condition()
{
return TRUE;
};

func void DIA_Tim_Hello_Info()
{
AI_Output(self,other,"DIA_Tim_Hello_14_00&quo t;); //Привет,у тебя есть время?
AI_Output(other,self,"DIA_Tim_Hello_15_01&quo t;); //Есть,а что?
AI_Output(self,other,"DIA_Tim_Hello_14_01&quo t;); //Мне нужна твоя помощь, понимаешь меня ограбили какие-то бандиты, теперь ищи их свищи, а мне предстоит дальний путь не мог бы ты мне помочь?
Info_ClearChoices(DIA_Tim_Hello); //разветвление
Info_AddChoice(DIA_Tim_Hello,"Конечно помогу.",DIA_Tim_Hello_yes); // Варианты ответов
Info_AddChoice(DIA_Tim_Hello,"Извини но у меня нет времени.",DIA_Tim_Hello_no); // Варианты ответов
};

// Если говорим первый (помогаем),то

func void dia_Tim_Hello_yes ()
{
AI_Output(other,self,"DIA_Tim_Hello_yes_15_00 ");//Конечно,но что я могу сделать?
AI_Output(self,other,"DIA_Tim_Hello_yes_03_01 "); //Я знаю что в городе есть маг,может быть он смог бы сделать магическое оружия.
AI_Output(other,self,"DIA_Tim_Hello_yes_15_01 ");//Хорошо,я посмотрю что можно сделать.
MIS_Weapons = LOG_Running;
Log_CreateTopic(TOPIC_Weapons ,LOG_MISSION);
Log_SetTopicStatus(TOPIC_Weapons,LOG_Running); // дневник
B_LogEntry(TOPIC_Weapons,"Я согласился помочь одному страннику принести волшебный меч,в этом мне может помочь один Маг в городе"); // запись в дневник
AI_StopProcessInfos (self); // после реплики сам выходит из диалога
};

// Если отказываемся,то

func void DIA_Tim_Hello_no ()
{
AI_Output(other,self,"DIA_Tim_Hello_no _15_00"); //Извини,но у меня мало времени и я не смогу помочь тебе.
AI_Output(self,other,"DIA_Tim_Hello_no _03_01"); //Ну ладно(тяжко вздыхает).
AI_StopProcessInfos (self); // после реплики сам выходит из диалога
};

instance DIA_Tim_HI2(C_Info)
{
npc = VLK_666_Tim;
nr = 99;
condition = DIA_Tim_HI2_Condition;
information = DIA_Tim_HI2_Info;
description = "Я принёс тебе то что ты просил.";//выбор диалога
};

func int DIA_Tim_HI2_Condition()
{
if(Npc_HasItems(other,ItMw_2h_Sld_Sword2)>= 1) //Появляется,если у нас есть это оружия(скрипт выше)
{
return TRUE;
};
};

func void DIA_Tim_HI2_Info()
{
AI_Output(other,self,"DIA_Tim_HI2_15_00" ); // Я принёс тебе то что ты просил.
AI_Output(self,other,"DIA_Tim_HI2_04_01" ); //Это замечательно,давай скорей
AI_Output(other,self,"DIA_Tim_HI2_15_01" ); //Вот он.
b_giveinvitems(self,other,ItMw_2h_Sld_Sword2,1); //Отдаём меч
AI_Output(self,other,"DIA_Tim_HI2_04_02" ); //Я поздравляю ты прошёл проверку,поэтому я заканчиваю твою игру на этом этапе(смеётся).
Log_SetTopicStatus(TOPIC_Weapons, LOG_SUCCESS); //заканчиваем мисию
B_LogEntry(TOPIC_Weapons,"Когда я ему отдал он был в вострге."); //запись в дневнике
B_Extro_Avi(); //А вот это попробуйте пропишите,увидите эффект.
};Теперь скрипт Руфуса;

Для этого создаём файл под названием DIA_KDF_999_Ryxar (повторяться не буду, напишу то что не было написано выше):

nstance DIA_KDF_999_Ryxar_EXIT(C_Info)
{
npc = KDF_999_Ryxar;
nr = 999;
condition = DIA_KDF_999_Ryxar_EXIT_Condition;
information = DIA_KDF_999_Ryxar_EXIT_Info;
permanent = TRUE;
description = Dialog_Ende;
};

func int DIA_KDF_999_Ryxar_EXIT_Condition()
{
return TRUE;
};

func void DIA_KDF_999_Ryxar_EXIT_Info()
{
AI_StopProcessInfos(self);
};

instance DIA_Ryxar_HI(C_Info)
{
npc = KDF_999_Ryxar;
nr = 99;
condition = DIA_Ryxar_HI_Condition;
information = DIA_Ryxar_HI_Info;
description = "Привет.";
};

func int DIA_Ryxar_HI_Condition()
{
return TRUE;
};

func void DIA_Ryxar_HI_Info()
{
AI_Output(other,self,"DIA_Ryxar_HI_15_00&quot ;); //Привет.
AI_Output(self,other,"DIA_Ryxar_HI_04_01&quot ;); //привет-привет.
AI_Output(other,self,"DIA_Ryxar_HI_15_01&quot ;); //что ты здесь делаешь?
AI_Output(self,other,"DIA_Ryxar_HI_04_02&quot ;); //извини,но это не твоё дело.
};

instance DIA_Ryxar_HI2(C_Info)
{
npc = KDF_999_Ryxar;
nr = 99;
condition = DIA_Ryxar_HI2_Condition;
information = DIA_Ryxar_HI2_Info;
description = "Не мог бы ты мне помочь?";
};

func int DIA_Ryxar_HI2_Condition()
{
if(MIS_Weapons ==LOG_Running) //Диалог появится при условии что мы начали задание.
{
return TRUE;
};
};

func void DIA_Ryxar_HI2_Info()
{
AI_Output(other,self,"DIA_Ryxar_HI2_15_00&quo t;); //Не мог бы ты помочь?
AI_Output(self,other,"DIA_Ryxar_HI2_04_01&quo t;); //Ну это смотря в чём?
AI_Output(other,self,"DIA_Ryxar_HI2_15_01&quo t;); //Мне нужно сделать магические меч.
AI_Output(self,other,"DIA_Ryxar_HI2_04_02&quo t;); //А зачем он тебе?
AI_Output(other,self,"DIA_Ryxar_HI2_15_02&quo t;); //Он нужен не мне просто я помогаю одному человеку.
AI_Output(self,other,"DIA_Ryxar_HI2_04_03&quo t;); //Ты совершаешь заслуженный поступок я сделаю тебе магическое оружия,как раз у меня всё для этого есть,Но для этого ты должен отнести письмо Ксардасу,просто я плохо знаю эту местность.
AI_Output(other,self,"DIA_Ryxar_HI2_15_03&quo t;); //Но откуда ты знаешь Ксардаса,он говорил что онём практичекси никто не знает или хотя бы думают что он умер.
AI_Output(self,other,"DIA_Ryxar_HI2_04_04&quo t;); //Ксардас-мой друг и мне лучше знать жив он или нет,просто мы давно с ним не виделись я и приехал с ним поведаться.Вобщем передай эту записку.
B_GivePlayerXP(250); //Получаем 250 опыта.
b_giveinvitems(self,other,ITWr_Addon_Hinweis_05,1) ;
B_LogEntry(TOPIC_Weapons,"Для того чтобы мне сделали волшебный меч,мне нужно передать записку Ксардасу.");
};

instance DIA_Ryxar_HI3(C_Info)
{
npc = KDF_999_Ryxar;
nr = 99;
condition = DIA_Ryxar_HI3_Condition;
information = DIA_Ryxar_HI3_Info;
description = "Я отдал записку.";
};

func int DIA_Ryxar_HI3_Condition()
{
if(Npc_KnowsInfo(other, DIA_Xardas_HI3))
{
return TRUE;
};
};

func void DIA_Ryxar_HI3_Info()
{
AI_Output(other,self,"DIA_Ryxar_HI3_15_00&quo t;); //Я отдал записку Ксардасу.
AI_Output(self,other,"DIA_Ryxar_HI3_04_01&quo t;); //Очень хорошо,наконец то я смогу встретится с другом.
AI_Output(other,self,"DIA_Ryxar_HI3_15_01&quo t;); //Я выполнил свою часть,теперь дело за тобой.
AI_Output(self,other,"DIA_Ryxar_HI3_04_02&quo t;); //Конечно.Я выполнил и свою часть,держи свой волшебный меч.
B_GivePlayerXP(550);
b_giveinvitems(self,other, ItMw_2h_Sld_Sword2,1);
B_LogEntry(TOPIC_Weapons,"Я получил меч от мага,теперь осталось передать его Странику.");
};

Ещё есть диалог Ксардаса, но там совсем легко,просто в конце его скрипта прописываем (none_100_xardas):

instance DIA_Xardas_HI3(C_Info)
{
npc = NONE_100_Xardas;
nr = 99;
condition = DIA_Xardas_HI3_Condition;
information = DIA_Xardas_HI3_Info;
description = "У меня для тебя записка.";
};

func int DIA_Xardas_HI3_Condition()
{
if(Npc_HasItems(other,ITWr_Addon_Hinweis_05)>= 1)
{
return TRUE;
};
};

func void DIA_Xardas_HI3_Info()
{
AI_Output(other,self,"DIA_Xardas_HI3_15_00&qu ot;); // У меня для тебя записка.
AI_Output(self,other,"DIA_Xardas_HI3_04_01&qu ot;); //Очень интересно.
AI_Output(other,self,"DIA_Xardas_HI3_15_01&qu ot;); //Вот она
B_GivePlayerXP(100);
b_giveinvitems(other,self,ITWr_Addon_Hinweis_05,1) ;
B_LogEntry(TOPIC_Weapons,"Я передал записку,тперь маг должен дать мне Волшебный меч.");
};Так эта часть закончена,осталась самая нудная это везде прописать, ну давайте сначала пропишем наших 2 неписей

Для этого заходим в DECOMPILED\_work\data\Scripts\_decompiled\Story и открываем файл Startup.d
Ищем там строчку
Wld_InsertNpc(VLK_439_Vatras,”NW_CITY_ENTRANCE_01” );
и пишем после неё
Wld_InsertNpc(KDF_999_Ryxar,” NW_CITY_MERCHANT_TEMPLE_IN ”);

(это только первый НПС) теперь второй,
ищем строчку

Wld_InsertNpc(BAU_950_Lobart,”NW_FARM1_OUT_01”);
и после неё прописываем:
Wld_InsertNpc(VLK_666_Tim,”NW_FARM1_OUT_01”);

Теперь заходим в файл Story_Globals и ищем строку
var int CurrentLevel;
(она почти в самом конце) и прописываем
var int MIS_Weapons;

Так дальше заходим в DECOMPILED\_work\data\Scripts\_decompiled\Story\Lo g_Entries и заходим в файл
LOG_Constants_Yoly и в самом конце прописываем
const string TOPIC_Weapons = “Меч для тима”;
(наша миссия).

Последний шаг,заходим в DECOMPILED\_work\data\Scripts\_decompiled и открываем файл gothic.SRC
Там прописываем в любом месте где НПС:
STORY\NPC\VLK_666_Tim.d
STORY\NPC\KDF_999_Ryxar.d

Ну и так же прописываем в любом месте где диалоги:
STORY\DIALOGE\DIA_VLK_666_Tim.d
STORY\DIALOGE\DIA_KDF_999_Ryxar.d

Ну а дальше компиляция.
У нас появляются 2 файла Gothic.dat и OU.BIN .

Gothic.dat вставляем в
Gothic II\_work\Data\Scripts\_compiled

OU.BIN вставляем в
Gothic II\_work\Data\Scripts\Content\Cutscene

Всё теперь заходим в Готику2 НВ и наслаждайтесь то что вы сделали.

Желаю всем новичкам удачи в модостроительстве.

DEDROIT 01.02.2006 21:06

Скриптинг
 
Ещё хотел обьяснить как сделать амулет регенерации маны и жизней:

Заходим в
_work\data\Scripts\_decompiled\Items
и открываем файл
IT_Amulette.d

Там пишем скрипт:

instance ITAM_ME(C_Item)
{
name = "Амулет регенерации жизни";
mainflag = ITEM_KAT_MAGIC;
flags = ITEM_MISSION | ITEM_AMULET;
value = 0;
visual = "ItAm_Hp_01.3ds";
material = MAT_STONE;
on_equip = Equip_ITMI_ME;
on_unequip = UnEquip_ITMI_ME;
wear = WEAR_EFFECT;
effect = "SPELLFX_ITEMGLIMMER";
description = name;
text[0] = "Очень нужная вещь";
text[1] = "особенно воину";
inv_zbias = INVCAM_ENTF_AMULETTE_STANDARD;
};

func void Equip_ITMI_ME ()
{
self.attribute[ATR_REGENERATEHP] = 1;
};

func void UnEquip_ITMI_ME ()
{
self.attribute[ATR_REGENERATEHP] = 0;
};После того как вставили этот скрипт, закомпилируйте и усё готово. В игре либо с помощью марвина вызовите, либо пропишите ГГ в инвентарь.

А вот скрипт амулета востановление маны:

instance ITAM_MY(C_Item)
{
name = "Амулет регенерации маны";
mainflag = ITEM_KAT_MAGIC;
flags = ITEM_MISSION | ITEM_AMULET;
value = 0;
visual = "ItAm_Hp_01.3ds";
material = MAT_STONE;
on_equip = Equip_ITMI_MY;
on_unequip = UnEquip_ITMI_MY;
wear = WEAR_EFFECT;
effect = "SPELLFX_ITEMGLIMMER";
description = name;
text[0] = "Очень нужная вещь";
text[1] = "особенно магу";
inv_zbias = INVCAM_ENTF_AMULETTE_STANDARD;
};

func void Equip_ITMI_MY ()
{
self.attribute[ATR_REGENERATEMANA] = 1;
};

func void UnEquip_ITMI_MY()
{
self.attribute[ATR_REGENERATEMANA] = 0;
};Потом компиляция. И всё амулеты можно вызывать с помощью insert, а можно у ГГ прописать в самом начале.


DEDROIT 01.02.2006 21:07

Скриптинг
 
Создать новую, полноценную гильдию нельзя, можно только переделать под свои нужды существующие!

Давайте сделам допустим гильдию сектатнтов.

Чтобы её сделать:

1) заходим в _Intern\Constants.d

там заменяем допустим
const int GIL_EMPTY_D= 15;
на
const int GIL_SEC= 15;
(где SEC—сокращёное название гильдии)

2) Заходим в Scripts\Content\Story\TEX.d

и в разделе const string TXT_GUILDS[ 66] =

прописываем вместо “D”,ставим “Сектант”,

3)заходим в _work\data\Scripts\_decompiled\AI\Human\Guilds.d
Там вместо этого

ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL };
ставим нужные нам отношения между гильдиями (ATT_FRIENDLY, ATT_HOSTILE и т.п.)

Потом всё это дело компилируем и вуаля, у нас новая гильдия!


DEDROIT 01.02.2006 21:08

Скриптинг
 
Давайте теперь попробуем перенести визуалицию лица Кор Галома из Готики1 в Готику 2 НВ.

Для этого нужно:

1) Зайти в скрипт Кор Галома посмотреть на строчку визуалиции, для этого заходим в _work\data\Scripts\_decompiled\Story\NPCи открываем файл
GUR_1201_CorKalom.d

Вот его скрипт:

instance GUR_1201_CorKalom(Npc_Default)
{
name [0] = "Кор Галом";
npcType = npctype_friend;
guild = GIL_GUR;
level = 30;
voice = 10;
id = 1201;
flags = NPC_FLAG_IMMORTAL;

attribute[ATR_STRENGTH] = 80;
attribute[ATR_DEXTERITY] = 50;
attribute[ATR_MANA_MAX] = 50;
attribute[ATR_MANA] = 50;
attribute[ATR_HITPOINTS_MAX] = 400;
attribute[ATR_HITPOINTS] = 400;

Mdl_SetVisual(self,"HUMANS.MDS");
Mdl_ApplyOverlayMds(self,"Humans_Mage.mds&quo t;);
Mdl_SetVisualBody(self,"hum_body_Naked0" ,1,0,"Hum_Head_Psionic",19,0,gur_armor_h );
B_Scale(self);
Mdl_SetModelFatness(self,0);

Npc_SetTalentSkill(self,NPC_TALENT_MAGE,6);

EquipItem(self,Kaloms_Schwert);
CreateInvItem(self,ItArRuneSleep);

daily_routine = Rtn_start_1201;
fight_tactic = FAI_HUMAN_MAGE;
};

func void Rtn_start_1201()
{
TA_PotionAlchemy(15,0,22,0,"PSI_LABOR_IN&quot ;);
TA_PotionAlchemy(22,0,15,0,"PSI_LABOR_IN&quot ;);
};

func void Rtn_CallSleeper_1201()
{
TA_Stay(0,0,12,0,"PSI_TEMPLE_STAIRS_RIGHT&quo t;);
TA_Stay(12,0,24,0,"PSI_TEMPLE_STAIRS_RIGHT&qu ot;);
};

func void Rtn_Flee_1201()
{
TA_Stay(0,0,12,0,"");
TA_Stay(12,0,24,0,"");
};Смотрим на строку
Mdl_SetVisualBody(self,”hum_body_Naked0”,1,0,”Hum_ Head_Psionic”,19,0,gur_armor_h);
Видим что стоит число 19, значит у Кор Галома визуалиция под числом номер 19.

2) Распаковываем(из Готики1) с помощью VDFS паку textures.vdf (находится в Gothic\Data). Теперь ищем там
визуализацию под номером 19, вот она HUM_HEAD_V19_C0-C.TEX.

3) Открываем эту текстуру в GoMan,и сохраняем её под названием HUM_HEAD_V180_C0-C.TEX (мы изменили на 180 чтобы эта текстура не повторилась с текстурой в Готике2 НВ, если хотите вставить текстуры то начинайте с номера приблизительно 180.

4) Теперь эту текстуру (HUM_HEAD_V180_C0-C.TEX) вставляем в
Gothic II\_work\Data\Textures\_compiled

Всё теперь у нас в Готике2 НВ есть текстура лица Кор ГАлома и эту визуализацию можно присвоить любому NPC.

5) Давайте попробуем прописать эту текстуру Ксардасу (просто чтобы далеко не ходить), то есть заходим в
_work\data\Scripts\_decompiled\Story\NPC открываем файл none_100_xardas.d и вместо его визуализации прописываем например :

B_SetNpcVisual(self,MALE,"Hum_Head_Psionic&qu ot;,180,0,itar_tpl_m);
Mdl_SetModelFatness(self,0);
Mdl_ApplyOverlayMds(self,"Humans_Militia.mds& quot;);Видите у нас стоит число 180, то есть на лицо теперь он будет выглядить как Кор ГАлом.


DEDROIT 01.02.2006 21:17

Скриптинг
 
Ссылки на программы и статьи по модостроениям:
1) http://forums.ag.ru/?board=gothic&action=d...&num=1098161614
(уроки скриптологии)
2) http://mod.worldofgothic.ru/2S_scripting/2...tiki1-v-gotiku2 (самый лучший сайт по модостроению)
3) http://forums.ag.ru/?board=gothic&action=d...&num=1105304206
(список прог и модов)
4) http://www.basilio58.narod.ru/Start.htm
(очень полезный сайт по модмейкерству).

Mengos 18.03.2006 10:35

Скриптинг
 
Можно сделать, чтобы при повышении уровня увеличивалось не только здоровье, но и сила\ловкость\мана.

Сначала надо открыть story\B_Story\b_giveplayerxp.d
Его содержимое надо изменить на :

func void B_GivePlayerXP(var int add_xp)
{
var string concatText;
if(hero.level == 0)
{
hero.exp_next = 500;
};
hero.exp = hero.exp + add_xp;
concatText = PRINT_XPGained;
concatText = ConcatStrings(concatText,IntToString(add_xp));
PrintScreen(concatText,-1,YPOS_XPGained,FONT_ScreenSmall,2);
if(hero.exp >= hero.exp_next)
{
hero.level = hero.level + 1;
hero.exp_next = hero.exp_next + ((hero.level + 1) * 500);
hero.attribute[ATR_HITPOINTS_MAX] = hero.attribute[ATR_HITPOINTS_MAX] + 10; \\+10 здоровья при повышении уровня.
hero.attribute[ATR_HITPOINTS] = hero.attribute[ATR_HITPOINTS] + 10;
hero.attribute[ATR_STRENGTH] = hero.attribute[ATR_STRENGTH] + 1; \\ + 1 силы при повышении уровея
hero.attribute[ATR_DEXTERITY] = hero.attribute[ATR_DEXTERITY] + 1; \\ + 1 ловкости при повышении
hero.lp = hero.lp + 12; \\ + 12 LP
PrintScreen(PRINT_LevelUp,-1,YPOS_LevelUp,FONT_Screen,2);
Snd_Play("LevelUp");
};
B_CheckLog();
};

DEDROIT 18.03.2006 14:04

Скриптинг
 
Mengos
Оригинально придумал..Может ещё есть какие идейки?

Mengos 18.03.2006 14:17

Скриптинг
 
Цитата:

Может ещё есть какие идейки?


instance ItRi_fly_02(C_Item)
{
name = NAME_Ring;
mainflag = ITEM_KAT_MAGIC;
flags = ITEM_RING;
value = 200;
visual = "ItRi_Prot_Point_02.3ds";
visual_skin = 0;
material = MAT_METAL;
on_equip = Equip_fly_02;
on_unequip = UnEquip_fly_02;
wear = WEAR_EFFECT;
effect = "SPELLFX_ITEMGLIMMER";
description = "кольцо Полета";
text[5] = NAME_Value;
count[5] = value;
inv_zbias = INVCAM_ENTF_RING_STANDARD;
inv_rotz = INVCAM_Z_RING_STANDARD;
inv_rotx = INVCAM_X_RING_STANDARD;
};

func void equip_fly_02()
{
Mdl_ApplyOverlayMds(self,"humans_skeleton_fly .mds");
};

func void unequip_fly_02()
{
Mdl_RemoveOverlayMds(self,"humans_skeleton_fl y.mds");
};


instance ItMw_1h_Torch(C_Item)
{
name = "факел";
mainflag = ITEM_KAT_NF;
flags = ITEM_AXE;
material = MAT_WOOD;
value = 2500;
damageTotal = 40;
damagetype = DAM_FIRE;
range = Range_VLKDolch;
cond_atr[2] = ATR_DEXTERITY;
cond_value[2] = 40;
visual = "ItLs_Torch_01.3ds"; \\ оружие выглядит как факел.
description = name;
text[2] = NAME_Damage;
count[2] = damageTotal;
text[3] = NAME_DEX_needed;
count[3] = cond_value[2];
text[4] = NAME_OneHanded;
text[5] = NAME_Value;
count[5] = value;
};


Текущее время: 23:36. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot
Magic Team© 2006-2013, The development and modification