![]() |
|
Скриптинг
И так, я начну:
Заходим в 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,Нет доспех |
Скриптинг
Теперь попробуем создать диалог:
Пример №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" ;); //Да ты можешь мне почь!Ты бы мог бы убить Вино? 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" ;); //Да ты можешь мне почь!Ты бы мог бы убить Вино? 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 (написано выше)! |
Скриптинг
Итак давайте подведём обобщение, создадим что-то типа мини мода. В него будет входить 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" ;); //Привет. AI_Output(self,other,"DIA_Ryxar_HI_04_01" ;); //привет-привет. AI_Output(other,self,"DIA_Ryxar_HI_15_01" ;); //что ты здесь делаешь? AI_Output(self,other,"DIA_Ryxar_HI_04_02" ;); //извини,но это не твоё дело. }; 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 НВ и наслаждайтесь то что вы сделали. Желаю всем новичкам удачи в модостроительстве. |
Скриптинг
Ещё хотел обьяснить как сделать амулет регенерации маны и жизней:
Заходим в _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, а можно у ГГ прописать в самом начале. |
Скриптинг
Создать новую, полноценную гильдию нельзя, можно только переделать под свои нужды существующие!
Давайте сделам допустим гильдию сектатнтов. Чтобы её сделать: 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 и т.п.) Потом всё это дело компилируем и вуаля, у нас новая гильдия! |
Скриптинг
Давайте теперь попробуем перенести визуалицию лица Кор Галома из Готики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" ;); TA_PotionAlchemy(22,0,15,0,"PSI_LABOR_IN" ;); }; 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, то есть на лицо теперь он будет выглядить как Кор ГАлом. |
Скриптинг
Ссылки на программы и статьи по модостроениям:
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 (очень полезный сайт по модмейкерству). |
Скриптинг
Можно сделать, чтобы при повышении уровня увеличивалось не только здоровье, но и сила\ловкость\мана.
Сначала надо открыть 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(); }; |
Скриптинг
Mengos
Оригинально придумал..Может ещё есть какие идейки? |
Скриптинг
Цитата:
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; }; |
Текущее время: 09:08. Часовой пояс GMT +3. |
|
Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd. Перевод: zCarot
Magic Team© 2006-2019, The development and modification