И так, возможно многим эта тема покажется странной и неактуальной в наши дни так как по всему интернету полно таких уроков, но я решил сделать его и на AP pro, так как не раз сталкивался с этим вопросом. И так! ===========================================================================
Давайте создавать новую группировку! Создадим к примеру группировку Чистое небо (уж очень нравится мне эта группировка)
Что нам понадобится?
Папка configs
1. Папка creatures а)файл game_relations.ltx ;----- Отношение группировки к другим фракциям и к ГГ. б)файл spawn_sections_general.ltx ;----- Регистрация character_profile дефолтных персов группировки.
3. Папка misc а)файл death_items_by_communities.ltx ;----- Предметы которые могут появится у трупа непися группировки. б)файл script_sound.ltx ;----- Звуковые схемы, просьба о помощи, различные фразы, реакций на действия. в)файл script_sound_music_and_stories.ltx ;----- Звуковые схемы, анекдоты, историй, применяется в посиделках у костра или на базах. г)файл simulation.ltx ;----- Спавен сквадов группировки при старте игры. д)файл squad_behaviours.ltx ;----- Возможность спавнить сквады группировки через смарты. е)файл squad_descr.ltx ;----- Симуляция сквадов для распавна (пока не обезателен). ё) файл dialog_manager.ltx ;----- Название говорит само за себя.
4. Папка text\rus\ui_st_pda.xml ;----- Название группировки на русском языке. ================================================================================================================== Папка scripts а)фаил _g.script ;----- Регистрация новой группировки. б)фаил death_manager.script ;----- Регистрация новой группировки. г)фаил sound_theme.script ;----- Прописывается возможность произнесения фраз группировкой. =========================================================================
Важно! Цифру после запятой ставить обязательно, т.е. если у вас была 10, то после названия клана вы должны дописать следующею цифру, 11 .
Теперь ищем такую строку:
Цитата
;коэффициенты "сочувствия" группировок ;после воздействия на одного из членов группировки ;goodwill его распространится на остальных членов группировки ;с определенным коэффициентом ;(порядок должен совпадать с communities_relations) [communities_sympathy] actor = 0.0 bandit = 0.0 dolg = 0.0 ecolog = 0.0 freedom = 0.0 killer = 0.0 army = 0.0 monolith = 0.0 monster = 0.0 stalker = 0.0 ;0.01 zombied = 0.0
И дописываем наш клан:
Цитата
;коэффициенты "сочувствия" группировок ;после воздействия на одного из членов группировки ;goodwill его распространится на остальных членов группировки ;с определенным коэффициентом ;(порядок должен совпадать с communities_relations) [communities_sympathy] actor = 0.0 bandit = 0.0 dolg = 0.0 ecolog = 0.0 freedom = 0.0 killer = 0.0 army = 0.0 monolith = 0.0 monster = 0.0 stalker = 0.0 ;0.01 zombied = 0.0 nebo = 0.0
Всё сохраняем и закрываем!
А теперь давайте сделаем нашу группировку говорящей. Это делается всего двумя файлами: Список: configs/misc/script_sound.ltx configs/misc/script_sound_music_and_stories.ltx
И везде где есть список группировок, как тут пишем свою. Аналогично и со следующим файлом.
Далее можно добавить разные продукты для группировки, заходим в файл gamedata\configs\misc\death_items_by_communities.ltx и добавляем в самом низу секцию нашей группировки.
Цитата
[nebo]:stalker
Теперь весь список продуктов, а так же вероятность их спавна в инвентаре НПС новой группировки будет, как у сталкеров. Если вы захотите добавить свои продукты или изменить вероятность спавна старых, то под секцией своей группировки дописываем нужный продукт с другой вероятностью. Например: У сталкеров возьмём секцию респа какого-нибудь арта: [stalker] af_cristall_flower = 0 И перетащим её в нашу группировку с другой вероятностью спавна [nebo]:stalker af_cristall_flower = 0.1
Можно вобще не трогать этот файл, всё продукты будут спавниться по дефолту без вылетов.
Теперь "научим" НПС новой группировки общаться с ГГ. Открываешь файл dialog_manager
"Научим" НПС просить аптечку. Я буду делать на секции сталкеров. Ищем секцию Wounded dialogs и дописываем через запятую свой клан:
Цитата
;Wounded dialogs [dm_help_0] category = hello npc_community = stalker, trader, monolith, nebo level = all wounded = true
[dm_help_1] category = hello npc_community = stalker, trader, monolith, nebo level = all wounded = true
Ну а теперь "научим" НПС здороваться. Ищем следующие:
Цитата
[dm_hello_0] category = hello npc_community = stalker, trader, monolith, nebo level = all
[dm_hello_1] category = hello npc_community = stalker, trader, monolith, nebo level = all
[dm_hello_2] category = hello npc_community = stalker, monolith, nebo level = all
Вот и всё! Теперь наши НПС могут говорить без вылетов.
Сделаем наш клан понятным игроку. Идём в файл ui_st_pda.xml
Начинаем с этого файла. Давайте создадим пять профилей группировки: новичок, бывалый, опытный, ветеран, мастер. В самом низу списка создаём пять секции:
Цитата
;**************************************************************** ; nebo ;****************************************************************
[sim_default_nebo_0]:stalker $spawn = "respawn\sim_default_nebo_0" character_profile = sim_default_nebo_0 spec_rank = novice community = nebo
[sim_default_nebo_1]:stalker $spawn = "respawn\sim_default_nebo_1" character_profile = sim_default_nebo_1 spec_rank = regular community = nebo
[sim_default_nebo_2]:stalker $spawn = "respawn\sim_default_nebo_2" character_profile = sim_default_nebo_2 spec_rank = experienced community = nebo
[sim_default_nebo_3]:stalker $spawn = "respawn\sim_default_nebo_3" character_profile = sim_default_nebo_3 spec_rank = veteran community = nebo
[sim_default_nebo_4]:stalker $spawn = "respawn\sim_default_nebo_4" character_profile = sim_default_nebo_4 spec_rank = master community = nebo
Сохраняем, закрываем.
Создаём секцию своих НПС в самом низу. Я буду показывать на одной секции, т.к. все займут много места.
Цитата
<specific_character id="sim_default_nebo_0_default_0" team_default = "1"> ;- ID <name>GENERATE_NAME_stalker</name> ;-ИМЯ (в данном случае генерирутся из файлов сталкерских имён и кличек) <icon>ui_inGame2_neutral_1</icon> ;- иконка <map_icon x="1" y="0"></map_icon> <bio>Опытный сталкер. Детальная информация отсутствует.</bio>
<class>sim_default_nebo_0</class> - класс <community>nebo</community> <terrain_sect>stalker_terrain</terrain_sect> <snd_config>characters_voice\human_01\stalker\</snd_config> ;- голос
В данном файле пишем следующие(чтобы не запутаться, пишите свой клан после секции зомбей(zombied)).
Цитата
[nebo]:default_behaviour
Тут создаём сквады нашего клана. В Simulation SQUADS пишем:
Цитата
[nebo_sim_squad_novice]:online_offline_group ;--id отряда с указанием скриптового класса. faction = nebo - клан npc_random = sim_default_nebo_0, sim_default_nebo_1 ;- НПС заданные для спавна npc_in_squad = 2, 3 - количество НПС в скваде (в данном случае 2 или 3)
Теперь лезем в папку scripts и ищем файл death_manager.ltx
Открываем и ищем такую строку:
Цитата
function init_drop_settings() local community_list = { "stalker", "dolg", "freedom", "bandit", "army", "zombied", "ecolog", "killer", "monolith" }
И дописываем свой клан:
Цитата
function init_drop_settings() local community_list = { "stalker", "dolg", "freedom", "bandit", "army", "zombied", "ecolog", "killer", "monolith", "nebo" }
Важно! Делать именно так! После последнего клана ставим запятую, открываем кавычки, пишем название своего клана, закрываем кавычки.
Для чего надо регистрировать клан в этом скрипте?
Если вы не зарегистрируете его там, то при убийстве НПС нового клана у вас вылетит игра, другими словами этот файл является менеджером убийств всех ИИ существ в игре, от сталкеров до мутантов разных фракций.
В данном файле ищем строку squad_community_by_behaviour = { После секции Монолита пишем свою группировку:
Цитата
["nebo"] = "nebo",
Не забываем про запятые!
В данном файле ищем строку local avail_communities = parse_names(utils.cfg_get_string(snd_ini, section, "avail_communities", nil, false, "", "stalker, ecolog, bandit, dolg, freedom, army, zombied, monolith, killer")) И вписываем свой клан:
Тут ищем таблицу поведения относительно смартов. И после monster_special пишем следующие:
Цитата
nebo = { squad = nil, smart = { base = { prec = function(squad, target) return in_time_interval(18,8) and not xr_conditions.surge_started() and not travel_manager.check_squad_for_enemies(squad) and (target:name() == "zat_stalker_base_smart" or target:name() == "jup_a6" or target:name() == "pri_a16") end }, surge = { prec = function() return xr_conditions.surge_started() end }, territory= { prec = function() return in_time_interval(8,18) and not xr_conditions.surge_started() end }, resource = { prec = function(squad, target) return in_time_interval(8,18) and not xr_conditions.surge_started() end } -- and squad:has_detector() }, actor = nil },
[nebo_sim_squad_novice]:online_offline_group faction = nebo - клан npc_random = sim_default_nebo_0, sim_default_nebo_1 npc_in_squad = 2, 3 - количество НПС в скваде (в данном случае 2 или 3)
Expression : no_assert Function : CIni_IdToIndex<1,struct COMMUNITY_DATA,class shared_str,int,class CHARACTER_COMMUNITY>::GetById File : d:\prog_repository\sources\trunk\xrgame\ini_id_loader.h Line : 134 Description : item not found, id Arguments : nebo
[error]Expression : !m_error_code [error]Function : raii_guard::~raii_guard [error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp [error]Line : 748 [error]Description : ...all of pripyat\gamedata\scripts\death_manager.script:32: attempt to perform arithmetic on a nil value
stack trace:
Добавлено (17.06.2015, 14:14) --------------------------------------------- там загрузка началась,А потом резко это
Сообщение отредактировал Arhnagel228 - Среда, 17.06.2015, 14:13
--' Ключем является группировка персонажа. Значением является таблица, содержашая имена секций предметов. local item_by_community = {}
--' Зависимости в спауне предметов. Предмет спауниться только если есть хотя бы один из зависимых. local item_dependence = {}
--' Множители и минимаксы для выпадения вещей в зависимости от уровня local mul_by_level = {} local count_by_level = {}
--' Предметы, которые нельзя удалять (квестовые например) local always_keep_item = {}
--' Предметы, относящиеся к патронам. Их надо спаунить другим методом. ammo_sections = {}
local death_ini = ini_file("misc\\death_generic.ltx")
function init_drop_settings() local community_list = { "stalker", "dolg", "freedom", "bandit", "army", "zombied", "ecolog", "killer", "monolith", "nebo" }
for k,v in pairs(community_list) do --' Необходимо заполнить таблицу item_by_community[v] = {} if death_ini:section_exist(v) then local n = death_ini:line_count(v) local id, value = "", "" for i=0,n-1 do result, id, value = death_ini:r_line(v,i,"","") item_by_community[v][id] = 100*tonumber(value) end end end
--' Заполняем таблицу зависимостей local n = death_ini:line_count("item_dependence") local id, value = "", "" for i=0,n-1 do result, id, value = death_ini:r_line("item_dependence",i,"","") item_dependence[id] = {} local vvv = parse_names(value) for k,v in pairs(vvv) do item_dependence[id][v] = true end end
--' Множители и минимаксы для выпадения вещей в зависимости от уровня local level_name = level.name()