Нове угруповання
Сьогодні ми створимо нове угруповання. Назвемо її, скажімо, "Вітер". Не має значення.
Практика
Базовий рівень
1. Для початку в game_relations.ltx і в таблицю відносин угруповань наприкінці та в заголовку додаємо назву свого угруповання та коефіцієнти відношень до неї в інших угруповань. Також, не забуваємо прописати її власне ставлення до інших угруповань:
[communities_relations] ;|actor |act_dol|act_fre|stalker|monolit|militar|killer |ecolog |dolg |freedom|bandit |zombied|strange|trader|arena_enemy|wind| ;================================================================================================================================= actor = 0, 0, 0, 0, -5000, -5000, -5000, 0, 0, 0, -5000, -5000, 0, 0, -5000, 0 actor_dolg = 0, 0, 0, 0, -5000, -500, -5000, 5000, 600, -5000, -5000, -5000, 0, 0, -5000 actor_freedom = 0, 0, 0, 0, -5000, -5000, -5000, -1500, -5000, 5000, 0, -5000, 0, 0, -5000, 0 stalker = 0, 0, 0, 0, -5000, -5000, -5000, 0, 0, 0, -5000, -5000, 0, 0, -5000, 0 monolith = -5000, -5000, -5000, -5000, 5000, -5000, -5000, -5000, -5000, -5000, 5000, 5000, -5000, 0, -5000, 0 military = -5000, -5000, -5000, -5000, -5000, 5000, -5000, 0, -5000, -5000, -5000, -5000, 0, 0, -5000, 0 killer = -5000, -5000, 0, -5000, -5000, -5000, 5000, -5000, -5000, -5000, 0, -5000, -5000, 0, -5000, 0 ecolog = 0, 600, -5000, 0, -5000, 1000, -5000, 5000, 500, -5000, -500, -5000, 0, 0, 0, 0 dolg = 0, 600, -5000, 0, -5000, -500, -5000, 5000, 5000, -5000, -5000, -5000, 0, 0, 0, 0 freedom = 0, -5000, 600, 0, -5000, -5000, -5000, -1500, -5000, 5000, 0, -5000, 0, 0, 0, 0 bandit = -5000, -5000, 0, -5000, -5000, -500, 0, -5000, -5000, 0, 0, -5000, -5000, 0, -5000, 0 zombied = -5000, -5000, -5000, -5000, 5000, -5000, -5000, -5000, -5000, -5000, -5000, 5000, -5000, 0, -5000, 0 stranger = 0, 0, 0, 0, -5000, -5000, -5000, 0, 0, 0, -500, -5000, 0, 0, 0, 0 trader = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 arena_enemy = -5000, -5000, -5000, -5000, -5000, -5000, 0, 0, 0, -5000, -5000, 0, 0, 0, 0, 0 wind = 0, 0, 0, 0, -5000, -5000, -5000, 0, 0, 0, -5000, -5000, 0, 0, -5000, 0
Також, змінимо цей рядок, додавши туди ім'я та номер угруповання:
- назви угруповань
communities = actor, 0, actor_dolg, 1, actor_freedom, 2, stalker, 5, monolith, 6, military, 7, killer, 8, ecolog, 9, dolg, 10, freedom, 11, bandit, 12, zombied, 13, stranger, 14, trader, 15, arena_enemy, 16, wind, 18
Відлік йде рядково починаючи згори. Хоча є невеликий нюанс. У перших трьох рядків - нумерація починається з нуля, з решти угруповань вона йде як слід. Для wind виставили 18, тому що ми це угруповання відокремили від інших.
Далі, в розділі [communities_sympathy] в кінці додаємо своє угруповання та коефіцієнт "вразливості" - чим він менший, тим менше ставлення угруповання буде змінюватися до вас в цілому:
[communities_sympathy] actor = 0.0 actor_dolg = 0.0 actor_freedom = 0.0 stalker = 0.0 monolith = 0.0 military = 0.0 killer = 0.0 ecolog = 0.0 dolg = 0.1 freedom = 0.1 bandit = 0.0 zombied = 0.0 trader = 0.0 stranger = 0.0 arena_enemy = 0.0 wind = 0.0
2. Після цього у файлі death_manager.script шукаємо рядок local community_list і в дужках додаємо назву свого угруповання:
function init_drop_settings ( ) local community_list = { "stalker" , "dolg" , "freedom" , "bandit" , "military" , "zombied" , "ecolog" , "killer" , "monolith" , "arena_enemy" , "actor_g " , "wind" }
3. У файлі death_items_by_communities.ltx пишемо [x]:stalker (замість x - назва вашого угруповання):
[...] af_dummy_spring = 0 af_fuzz_kolobok = 0 ;Еда vodka = 0 [arena_enemy] [actor_dolg] [wind]: stalker bread = 0 kolbasa = 0 vodka = 0 energy_drink = 0.3
4. Якщо передбачається респавн бійців нового угруповання, в se_respawn.script прописуємо в local simMaxCount = { після рядків із зомбованими сталкерами рядок:
wind_novice = 20, wind_regular = 20, wind_veteran = 20, wind_master = 6,
І у файлі misc\smart_terrain_presets.ltx , у секціях необхідних рівнів, на яких передбачається респаун бійців нового угруповання, додаємо рядки з назвою свого угруповання:
[l02_garbage] wind = novice, experienced, veteran, master
5. Щоб при вбивстві безпису нового угруповання гра не вилітала в xr_statistic.script ,
після рядка:
zombied_novice = 1 , zombied_experienced = 2 , zombied_veteran = 3 , zombied_master = 4 ,
пишемо
wind_novice = 1 , wind_experienced = 2 , wind_veteran = 3 , wind_master = 4 ,
і нижче у function getNpcType(npc) додамо:
elseif npc:character_community() == "wind" then community = "wind"
6. Ну а в character_desk_x.xml вибираємо будь-якого NPC (або групу) і змінюємо угруповання на своє:
<!---esc_wolf---> <specific_character id="esc_wolf" team_default = "1"> <name>esc_wolf_name</name> <icon>ui_npc_u_stalker_neytral_balon_1</icon> <bio>esc_wolf_bio</bio> <class>esc_wolf</class> <community>wind</community> [...]
7. Щоб у персонажа у графі "Угруповання" відображалося не "wind", а "Вітер", зареєструємо відповідний рядок у файлі string_table_general.xml:
<?xml version="1.0" encoding="windows-1251" ?> <string_table> <string id="wind"> <text>Ветер</text> </string> <string id="actor"> <text>Одиночка</text> </string> [...]
8. Існує можливість створити для нашого нового угруповання місця, де вони ходитимуть ( *_terrain брати з m_stalker.ltx ):
Тобто, наприклад, існує секція:
[stalker_terrain] 255,000,255,255 008,001,255,255 ;Разрешено ходить по опасным местам на баре 012,001,255,255 ;Разрешено ходить по опасным местам на Милитари
Тоді можна створити нову, за аналогією:
[wind_terrain] 255,000,255,255 008,001,255,255 ;Разрешено ходить по опасным местам на баре 012,001,255,255 ;Разрешено ходить по опасным местам на Милитари 010,001,255,255 ;Разрешено ходить по опасным местам на янтаре
Тут, очевидно, вказані координати рівня. До кожного рівня існує своя початкова координата.
Просунутий рівень
Такий метод досить примітивний. Це не повноцінне угруповання. Нам потрібні відповідні діалоги, можливість отримання квестів та вступ до групування, унікальні NPC.
Квести
Додамо квести, які потрібно виконати для угруповання. Поки що - прості доручення поширених типів.
По-перше, пропишіть до списку діалогів персонажа наступні рядки:
<actor_dialog>[tm_trader_diolog]_dialog</actor_dialog> <actor_dialog>[tm_wolf_diolog]_reward</actor_dialog>
Приклади назв: tm_trader_dialog , tm_wolf_dialog ...
Увага! Метод не перевірено.
Цим ми додали йому гілку діалогу "Є робота?", а також гілку для нагороди за квест/відмову від нього. Тепер зареєструємо на task_manager.ltx набір нових завдань.
[list] [...] ;--------Wind------------------------ ;----------Kill Stalker---- wind_kill_stalker ;----------Find Item---- wind_find_item [...] ;tasks for Wind [wind_find_item] type = find_item community = actor text = [ссылка на текст с рассказом заказчика о задании] description = [ссылка на текст с описанием задания] parent = [имя NPC-заказчика] target = scientific_outfit reward_money = 5000 reward_reputation = +5 reward_rank = 4 reward_item = wpn_sig_m1 time = 86400 [wind_kill_stalker] type = kill_stalker community = actor text = [ссылка на текст с рассказом заказчика о задании] description = [ссылка на текст с описанием задания] parent = [имя NPC-заказчика] target = sim_stalker_master_master reward_money = 4000 reward_reputation = +5 reward_rank = 9 reward_item = ammo_5.56x45_ap, ammo_5.56x45_ap, ammo_5.56x45_ap time = 86400
Не забудьте прописати опис завдань у текстові масиви.
Так, і зареєструйте самі гілки діалогів у файлі dialogs.xml . Ось приклад того, як це зроблено для завдань "Долгу":
<dialog id="tm_dolg_dialog" priority="-1"> <init_func>task_manager.init_dolg_task_dialog</init_func> </dialog> <dialog id="tm_dolg_reward" priority="0"> <init_func>task_manager.init_dolg_reward_dialog</init_func> <precondition>task_manager.has_active_vendor_task</precondition> </dialog>
Відповідно, пройдемо туди, куди вказує рядок task_manager.init_dolg_task_dialog - до task_manager.script :
function init_dolg_task_dialog(dlg) get_random_task():init_task_dialog(dlg, "dolg") --('эта функция для взятия квеста) function init_dolg_reward_dialog(dlg) get_random_task():init_reward_dialog(dlg, "dolg") --(а эта функция для отказа от квеста) end
За аналогією робимо і з нашим "Вітром".
Вступ до угруповання
Реалізуємо можливість вступу до угруповання.
Прописуємо в dialogs.script такі action'и:
----------------------------------------------------------------------------------- -- Community ----------------------------------------------------------------------------------- [...] function actor_set_wind(actor, npc) printf("ACTOR NOW IN [WIND] COMMUNITY") if db.actor then db.actor:set_character_community("wind", 0, 0) end return true end
Після цього створимо діалог і зробимо в ньому фразу з action'ом виду <action>dialogs.actor_set_wind</action> . Раджу вивчити урок , присвячений діалогам.