Я бы не советовал новичками т.к сам не до конца понимаю что тут к чему...
Новая группировка

Сегодня мы создадим новую группировку. Назовем её, скажем, "Ветер". Не суть важно.
[править]Практика

[править]Базовый уровень
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_dolg", "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
Не забудьте прописать описания заданий в текстовые массивы. Подробнее о редактировании task_manager.ltx читайте в уроке, посвященном однотипным квестам.
Да, и зарегистрируйте сами ветки диалогов в файле 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")
По аналогии делаем и с нашим "Ветром".
[править]Вступление в группировку
Реализуем возможность вступления в группировку.
Прописываем в 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>. Советую изучить урок, посвященный диалогам.
[править]Новые NPC
Лучше всего всё вышеприведенное повесить на нового, уникального персонажа. Способ его спавна описан здесь.
[править]Авторы

Статья BAC9-FLCL.
Способ открыт Arhet (SRP Team) Статью поправил: Vikman

Альтернатива - статья SenseyVit