В данном разделе я буду вылаживать всю инфу по модостроению.Хочю сказать тем кто будет просматривать топик.Это учебник модостроения.Поэтому можно оставить сдесь пожелания,чему бы вы хотели научица,но НЕ СТОИТ задавать здесь вопросы по модам так конкретно,чтобы ответы некому не послужили,кроме вас,и уж ТЕМ БОЛЕЕ не стоит задавать сильно много вопросов
Как добавить своё оружие? Нужно: 1. Нужен HEX-редактор или другой, но главное, что бы редактировал OGF модели (проверял: стандартный блокнот не работает) 2. Блокнот или другая прога 3. Умение создавать моды
Итак, делаем мод АК47: 1. Скопировать папку ak74 (gamedata\meshes\weapons) и назвать её ak47 и в ней wpn_ak74.ogf и wpn_ak74_hud.ogf переименовать на wpn_ak47.ogf и wpn_ak47_hud.ogf. 2. Нужно в 3D - шке (gamedata\meshes\weapons\ak47\wpn_ak47_hud.ogf и gamedata\meshes\weapons\ak47\wpn_ak47.ogf) с помощью HEX - редактора поменять все 74 на 47 3. Скопировать конфиг АК74 (gamedata\config\weapons\w_ak74.ltx) и назвать его w_ak74.ltx 4. В gamedata\config\weapons\w_ak47.ltx все "74" поменять на "47" 5. В gamedata\config\weapons\weapons.ltx после: #include "w_ak74.ltx" добавить #include "w_ak47.ltx" 6. В gamedata\config\text\rus\string_table_enc_weapons.xml добавить своё оружие. Я сделал так: ...
Эффективный глушитель, собранный в Зоне какими-то умельцами. С ним в комплекте идёт набор переходников под оружие любого калибра.
Автомат складной образца 1974 года под патрон 5,45x39 мм. Представляет собой простое и надёжное оружие, хотя дешёвизна в производстве несколько сказалась на удобстве использования и точности боя. В Зоне это основное оружие военных сталкеров и многих одиночек.\n Боеприпасы:\n обычный 5,45x39 мм,\n бронебойный 5,45x39 мм БП.
...теперь идёт моё...
Автомат образца 1947 года под патрон 7,62x39 мм. Представляет собой простое, надёжное и мощное оружие. В Зоне это оружие найти очень тяжело.\n Боеприпасы:\n обычный 7,62x39 мм,\n бронебойный 7,62x39 мм БП.
...мой текст закончился...
Модифицированный затворный механизм увеличивает скорость стрельбы.
По своим габаритам и массе Акм 74/2у (укороченный) близок к пистолетам-пулеметам, однако принцип действия механизма данного оружия и применяемый в нём патрон делают его представителем класса автоматов. К достоинствам относятся малые габариты, что крайне полезно при ведении боя в городских условиях, и довольно высокая пробивающая способность патрона. Главные недостатки - малая прицельная дальность и склонность к быстрому перегреву при стрельбе очередями.\n Боеприпасы:\n обычный 5,45x39 мм,\n бронебойный 5,45x39 мм БП.
и назвать: ak47_draw.ogg ak47_reload.ogg ak47_shoot.ogg ak47_shot_1.ogg ak47_shot_3.ogg ak47_shot_0.ogg ak47_shot_2.ogg
(можно поставить свои звуки оружия)
8. В gamedata\textures\wpn: wpn_ak74.dds wpn_ak74_bump#.dds wpn_ak74_bump.dds
и заменить:
wpn_ak47.dds wpn_ak47_bump#.dds wpn_ak47_bump.dds
(можно поставить свои текстуры)
9. В gamedata\textures\ui открываем ui_icon_equipment.dds и редактируем. Нужно поставить значок на оружие (появлиется при купле/продаже и просмотре описания). Можно скопировать на свободное место иконку АК74, а можно добавить свою. 10. Открываем gamedata\config\weapons\w_ak47.ltx
inv_grid_width - ширина в сетке 50х50 inv_grid_height - высота в сетке 50х50 inv_grid_x - местонахождение по х inv_grid_y - местонахождение по y
(если не поняли, я про значок для оружия)
В принципе мод готов, но при убийстве ГГ, игра вылетает. Дополняем мод.
10. В gamedata\config\mp\mp_ranks.ltx, все фразы, содержащие "ak74", копируем и называем "ak47"
11. В gamedata\config\mp\artefacthunt_game.ltx, фразу "mp_wpn_ak74" копируем и называем "mp_wpn_ak47"
12. В gamedata\config\mp\weapons_mp\weapons_mp.ltx, копируем:
...
[mp_wpn_ak74]:wpn_ak74 $spawn = "" class = W_AK74 ; class of the weapon that corresponding to CPP class scope_name = mp_wpn_addon_scope silencer_name = mp_wpn_addon_silencer grenade_launcher_name = mp_wpn_addon_grenade_launcher ammo_class = mp_ammo_5.45x39_fmj, mp_ammo_5.45x39_ap ; name of the ltx-section of used ammo grenade_class = mp_ammo_vog-25, mp_ammo_vog-25p tracers = on tracers_color_ID = 0
;params of weapon recoil fire_dispersion_base = 0.125;0.14;0.18;0.2 ;угол (в градусах) базовой дисперсии оружия (оружия зажатого в тисках) control_inertion_factor = 1.25f ;отдача cam_relax_speed = 0.75;0.6;0.15 ;скорость возврата в исходное положение cam_dispersion = 0.15 ;увеличения угла (в градусах) с каждым выстрелом cam_dispersion_inc = 0.3 ;увеличениe cam_dispersion с каждым выстрелом cam_dispertion_frac = 0.9 ;ствол будет подыматься на cam_dispersion*cam_dispertion_frac +- cam_dispersion*(1-cam_dispertion_frac) cam_max_angle = 30.0 ;максимальный угол отдачи cam_max_angle_horz = 20.0 ;(degree) maximum shot horizontal degree cam_step_angle_horz = 1.0 ;(degree) size of step camera moved in horizontal position while shooting
fire_dispersion_condition_factor = 5 ;увеличение дисперсии в процентах при максимальном износе misfire_probability = 0.0003 ;вероятность осечки при максимальном износе condition_shot_dec = 0.00003 ;увеличение износа при каждом выстреле
; ttc hit_power = 0.81;0.825;90 ; size of damage by bullet hit_impulse = 140 ; size of physic impulse by bullet hit_type = fire_wound ; [] type of the wound fire_distance = 1000 ; maximum fire distance that bullet can fly bullet_speed = 900; starting bullet speed rpm = 600 ; max round per minute
;params when silencer is attached ;similar to corresponding params without prefix silencer_
[mp_wpn_ak47]:wpn_ak47 $spawn = "" class = W_AK47 ; class of the weapon that corresponding to CPP class scope_name = mp_wpn_addon_scope silencer_name = mp_wpn_addon_silencer grenade_launcher_name = mp_wpn_addon_grenade_launcher ammo_class = mp_ammo_5.45x39_fmj, mp_ammo_5.45x39_ap ; name of the ltx-section of used ammo grenade_class = mp_ammo_vog-25, mp_ammo_vog-25p tracers = on tracers_color_ID = 0
;params of weapon recoil fire_dispersion_base = 0.125;0.14;0.18;0.2 ;угол (в градусах) базовой дисперсии оружия (оружия зажатого в тисках) control_inertion_factor = 1.25f ;отдача cam_relax_speed = 0.75;0.6;0.15 ;скорость возврата в исходное положение cam_dispersion = 0.15 ;увеличения угла (в градусах) с каждым выстрелом cam_dispersion_inc = 0.3 ;увеличениe cam_dispersion с каждым выстрелом cam_dispertion_frac = 0.9 ;ствол будет подыматься на cam_dispersion*cam_dispertion_frac +- cam_dispersion*(1-cam_dispertion_frac) cam_max_angle = 30.0 ;максимальный угол отдачи cam_max_angle_horz = 20.0 ;(degree) maximum shot horizontal degree cam_step_angle_horz = 1.0 ;(degree) size of step camera moved in horizontal position while shooting
fire_dispersion_condition_factor = 5 ;увеличение дисперсии в процентах при максимальном износе misfire_probability = 0.0003 ;вероятность осечки при максимальном износе condition_shot_dec = 0.00003 ;увеличение износа при каждом выстреле
; ttc hit_power = 0.81;0.825;90 ; size of damage by bullet hit_impulse = 140 ; size of physic impulse by bullet hit_type = fire_wound ; [] type of the wound fire_distance = 1000 ; maximum fire distance that bullet can fly bullet_speed = 900; starting bullet speed rpm = 600 ; max round per minute
;params when silencer is attached ;similar to corresponding params without prefix silencer_
Всё! Мод готов! Теперь осталось прописать оружие торговцу или кинуть на карту. Таким же способом можно добавить патроны 5,45x39 для этого оружия, но при желании можно играть и так.
Введение Многие часто сталкиваются с тем, что при попытке добавления монстров не попавшими в финальную версию игра может вылетать. Попробую рассказать, как это дело можно исправить. Для примера возьму кошек (уж очень они мне нравятся)
Добавить их можно отредактировать файл all.spawn, либо динамически создать в игре через функцию alife:create().
Вылет при появлении Обычно сопровождается сообщением в логе:
Arguments : Can't open section 'cat_weak' Это значит, что монстр у нас не до конца описан. В файле конфигурации идет секция
[m_cat_e]:monster_base Но для создания разных по силе конфигураций монстров обычно используется такая штука. Создается секция вида
[cat_weak]:m_cat_e то есть ссылка на основную конфигурацию, а потом указываются параметры, которые отличаются от нее. Например сила, здоровье, угол обзора и тд. Мы пока ограничимся просто добавлением этой секции. В файле config\creatures\m_cat.ltx в конце допишем [cat_weak]:m_cat_e. Запускаем, добавляем кошку, вылетаем с ошибкой:
Arguments : Can't find variable smart_terrain_choose_interval in [cat_weak] Что ж, добавим и этот параметр. Посмотрим, какой он у собак, и сделаем также:
smart_terrain_choose_interval = 00:15:00 Запускаем, вылетаем с ошибкой:
Arguments : Can't find variable satiety_threshold in [cat_weak] Вобщем, добавляем параметры, по кошка не станет нормально появлятся. Такие ошибки легко локализуются и исправляются.
Ну, на всякий случай, нужно добавить еще две строчки:
critical_wound_threshold = 0.4 critical_wound_decrease_quant = 0. После этого кошка появляется, бегает, с 30 метров бежит нас кушать. Мы этого не хотим, стреляем в нее, и у нас происходит
Вылет при убийстве Это знаменитая ошибка:
Arguments : LUA error: e:\stalker\gamedata\scripts\_g.script:20 ........ Самое просто и неправильное решение - закоментировать 20-ю строку скрипта _g.script, вылет исчезнет, но ошибка никуда не денется. Я не могу сказать с уверенностью, к чему игнорирование этого факта может привести, так как исправлял причину, а не следствие.
Путем нехитрых логических размышлений решение было найдено. Вернее тупым перебором всего, что относилось к делу, криками на форумах, битьем головой о стенку... Потом пришло озарение, вместе с сакраментальным вопросом "что происходит после смерти?" А происходит добавление в статистику убитого объекта (монстра, нпс-а). Поэтому лезем в скрипт xr_statistic.script. В самом начале видим объявление переменной
local killCountProps = {...} в которой кошек нет. Поэтому добавляем их туда (например, в конец), для начисления очков опыта:
cat_weak = 1, cat_normal = 2, cat_strong = 3, Хотя мы сделали только cat_weak, но на будущее добавим и остальных. Затем идет перечисление используемых классов монстров:
monster_classes = { кошек нет и здесь, добавляем:
[clsid.cat_s] = "cat", Смотрим дальше, видим функцию addKillCount(npc), которая определяет сообщество (community) убитого. Функция вызывает getNpcType(npc), которая находится в этом же скрипте. А там идет обращение к функции IsStalker(npc), и возвращает сообщество и ранг убиенного.
Но тут про мостров ни слова, а значит идем дальше. Функция IsStalker(npc) обнаруживается в скрипте _g.script. Просматривая его обнаруживаем следующие интересующие нас функции:
is_object_monster(obj) кошек нет, добавляем рядом с собаками:
otype == clsid.cat or IsMonster (object, class_id) кошки есть, ничего не трогаем.
Для страховки проверим еще одни файл, class_registrator.script. Находим в нем строку
cs_register (object_factory, "CCat", "se_monster.se_monster", "SM_CAT_S", "cat_s") и успокаиваемся на этом. Запускаем, убиваем, подходим, пытаемся обыскать - вылетаем. Потому что случился
Вылет при обыске Ну тут уже проще. Вспоминаем, что у нас показывается в инвентаре убитого? Иконка растерзанного трупа. Проверяем m_cat.ltx - действительно, параметр icon отсутствует. Тут появляется два пути.
Первый - нарисовать новую иконку, вставить ее в файл ui_npc_monster.dds, определить координаты и добавить их в xml-описатель ui_npc_monster.xml. И так для каждого нового монстра.
Второй - использовать общую иконку для всех монстров, у которых отсутствует этот параметр. Мы им и воспользуемся, так как для тестовых целей сойдет, а для серьезного применения все равно необходимо иметь хоть какие-то художественные навыки (если кто видел мой тестовый мод "15 кошек", то помнят тот ужас вместо иконки кошки smile ) Для этого отредактируем файл defines.ltx , так как именно в нём содержится секция monster_base, общая для всех монстров. Открываем, ищем секцию, и вставляем
icon = ui_frame_error_sign_red Это будет такой красный крест в круге. Запускаем, убиваем, обыскиваем и не вылетаем.
Итак, свежедобавленный монстр бегает, живет, нападает. Однако та же кошка по умолчанию невероятно сильна, убивает с одного удара, поэтому для нормальной жизни необходимо подредактировать секцию атаки.
Для того, чтобы создать нового НПС нам понадобятся координаты нужного места, где и будет заспаунен наш NPC. Возьмём Кордон, лагерь новичков. Можете снять координаты сами, а можете взять мною уже снятые: (-218.20,-20.2,-145.63),35362,47). Далее. Создаём файл в папке gamedata/scripts файл, скажем esc_unik_npc.script. В нём создаём функцию. Код: function esc_unik_npc () alife():create("esc_unik_npc",vector():set(-218.20,-20.2,-145.63),35362,47) end Теперь мы в файле npc_profile.xml (в папке gameplay) добавляем нашего НПС. Код: Trader escape_trader
esc_unik_npc esc_unik_npc
Копируем или создаём по образцу только нижний блок Второго торговца нам ненадо. Теперь моздадим секцию нашего персоонажа. В файле spawn_section.ltx (gamedata/config/creatures) в блоке:
Создаём секцию. Код: [esc_unik_npc]:stalker $spawn = "respawn\esc_unik_npc" character_profile = esc_unik_npc spec_rank = regular community = dolg
В строке community можете вместо долга вписать другую группировку. Однако если мы хотим, чтоба наш персоонаж не гулял по Зоне, пока не наткнётся на первуюю аномалию, то пропишем чтобы он стоял на месте. Для этого под community вставляем: custom_data = scripts\esc_unik_npc.ltx Далее создаём в gamedata/config папку scripts в в папке создаём файл esc_unik_npc.ltx В наш созданый файл вставляем: Код: [logic] active = remark1 danger = danger_ignore
[danger_ignore] ignore_distance = 5
[remark1] no_move = true
Всё наш НПС будет стоять на месте своего спауна. Едем дальше. Нам надо активировать нашего персоонажа. для этого мы должны вставить строку: esc_unik_npc.esc_unik_npc Либо в диалог, либо в какой-нибудь квест. Давайте вставим строку в файл info_portions.xml (gamedata/gameplay) под Код:
Однако мы не прописали самого НПС, как личность В файле character_desc_escape.xml (gamedata/gameplay) добавляем: Код: GENERATE_NAME_bandit ui_npc_u_stalker_bandit_3 esc_wolf_bio
esc_otbrosi_1 dolg stalker_terrain
367 -60
characters_voice\human_01\monolith\ -1
actors\bandit\stalker_bandit_3 [spawn] \n
wpn_groza \n
ammo_9x39_pab9 \n
1. include "gameplay\character_items.xml" \n 2. include "gameplay\character_food.xml"
1. include "gameplay\character_criticals_3.xml"
1. include "gameplay\character_dialogs.xml"
Правда тут получится у нас долговец в одежде бандита и говорящего голосом монолитовца xD Всё сохроняем. НПС готов.
Но так же можно добавить нашему НПС диалог) Как добавлять диалоги написано в нашем факе) Если хотяте сделать нашему НПС своё имя то в файле stable_bio_name.xml (gamedata/config/text/rus) добавляем: Код: Факер-мазафакер
А в файле сharacter_desc_escape.xml (gamedata/gameplay) находим нашего уже прописаного НПС и вставляем в секцию (у нас в ней написано GENERATE_NAME_bandit) esc_unik_npc Всё Поздравляю)
Основы и Принципы Конфиги про которые речь зайдет находиться, по пути /config/misc берём любой конфиг, зависит от того что хотим сделать.. unique_items.ltx если хотим создать уникальный бронежилет или оружие только там создаётся апргрейд минимальных набор функций на основе уже созданного базового оружия или броника, quest_items.ltx там придметы которые выдаться по квестам / диалогам или который находиться по заданию квеста, devices.ltx там две вещи вроде тоже мона засунуть ящик какой-нить или устройство,, items.ltx там практически все предметы. Можно конечно свой конфиг создать в любом из выше перечисленных файлов засунуть его по средствам инклуда. Значит первый вариант: 1. инклуд добавляем в основной файл строчку #include "путь относительно файла" в начала файла и создаём новый файл с таким-же именем; 2. Записать просто в файл.
Конфиг, и создание --------------------------------------------- К примеру создадим новый придмет.. Колбаса которая дает прирост силы и здоровье, чуток читерный мод получается :[ открываем items.ltx и тут два варианта, ну выбираем и начинаем копировать обычную колбасу.. потом в конец пишем комментарии они обозначаться точкой с запятой. К примеру ; Супер Колбаса мод Death_man вставляем что скопировали и меняем некоторые строчки Конечно я не стану описывать что и как и где происходит и на что влияет, слишком долго и муторно. Да и эта статья не к этому расположена. значит вставили! наше описание description = enc_equipment_food_kolbasa1 заменим после знака равно на super_kolbasa. inv_name = Kolbasa наше имя объекта, что будет в заголовке при просмотре или продаже. inv_name_short = Kolbasa короткое имя которое будет обозначаться когда вы смотри на объект, и возможно хотим взять. Дальше пойдет конфиги, я просто скажу что менять. У всех значений есть как плюсовое значение так и минусовое.. eat_health = 0 это та самая заветная строчку которая прибавляет нам жизни заменим значение на 1.0 eat_satiety = 0.3 эта сытость мона тоже поменять для пропорци ведь в конце концов это колбаса супер колбаса biggrin изменим на 0.8 eat_power = 0 эта силы как у энерга напитка не будем делать но сделаем к примеру 0.4 eat_radiation = 0 значение радиации к примеру ну тут если мы хотим добиться уменьшение в актери радиации то ставить надо минусовое значение Ну сохраняем.
Описание и принцип его --------------------------------------------- Текстовики по пути /config/text/rus/ Теперь описание готовим.. Описание может различаться местами записи, в зависимости где мы добавляли или исправляли. Для items.ltх в основном это файл string_table_enc_equipment.xml для unique_items.ltx это два файла как я понял для оружия string_table_enc_weapons.xml и для брони костюма string_table_outfit.xml. Для quest_items.ltx это string_table_items.xml
Добавление описание для предмета нашего --------------------------------------------- Вернёмся к нашей суперской колбасе. Выбираем способ добавление информации. пишем в файл
здесь из inv_name На вид обычная колбаса, но залежавшись в зоне быть можеть, а может их кто-то подкидывает к нам.. Она по истине волшебная
здесь inv_short Волшебная колбаса
здесь устанавливается инфа из дискриптора Не известного производства волшебная колбаса
Добавление к торговцу --------------------------------------------- Сохраняем и закрываем.. Проверяем на работу способность. Как вы спросите? Тут есть много путей но самый легкий это через продавца.. Мы можем сбавить цену на придмет к примеру на один рубль в конфиги: cost = 1 ну есть путь спауна к НПС, убийства потом оного.. И отбираение у него. Спаун в ящиках в инвентаре под нагами через скрипты. Но, все это в другой статье... Это требует других знаний у вас, и времени на написание статьи. Так вернемся к продавцу. Выбираем кому хотим добавить вещь. Самая лучшая статья по этой теме находиться вот здесь тут говорим спасибо автору. Просто нефиг изобретать новый велосипед, а то ещё на авторство в суд подадут. Наша колбаса готова. В общем о других конфигах --------------------------------------------- Чуток о других файлах.. В файле unique_items.ltx можно использовать какие угодно параметр имеющиеся в игре для стволов это weapons начиная просто сменой класса патронов заканчивая видом, дальностью и тому подобное. В нем-же можно добавлять апгрейд броника, там тоже можно практически все параметры, все для броника находиться в файле config/misc/outfit.ltx. Что сказать про unique_items.ltx там динамиты флешки документы и артов парочку.. Не чего сложного. Если что забыл прошу простить.. Статья создана была Nekt'om почти полгода назад.. Правда я её чуть изменил, добавил некоторые вещи, и приукрасил. Ввиду отстуствия доступа к этой инфы виложить исходники не мог.
На примере статьи из Artefact Activation Mod разберем их добавление в PDA: * Добавим в файл config\gameplay\encyclopedia_zone.xml новую статью:
ui_icon_photo enc_zone_anomalies_activation_basic
Здесь:
* o article id - внутреннее имя статьи, именно на него ссылаются в файлах игры o name - имя статьи, отображаемое в игре, подгружается из строкового массива o texture - картинка и её позиция в статье, в данном случае мы использовали обычный белый шум o text - текст статьи, отображаемый в игре, подгружается из строкового массива
* Добавим в, например, config\gameplay\info_l01escape.xml (инфопорции уровня "Кордон") ссылку на получение статьи - скажем, к трупу у туннеля, при обыске которого выдается информация о аномалиях в туннеле (вы его обнаруживаете, проходя второе спецзадание от Сидоровича). Найдем эти строки и дополним их:
tutorial_moving_anomaly
''' zone_anomalies_activation_basic '''
Главное - никогда не путайте article id, name и text статьи. Я в данном примере это сделать легко. Лучше называйте их непохожими друг на друга названиями.
* Так как в статье у нас есть такое поле:
enc_zone_anomalies_activation_basic
Да и название тоже не написано прямо, а ссылается на определенную строку, то добавим этот самый text в config\text\rus\string_table_enc_zone.xml, в нашем случае:
Активация - базис
С артефактами связана, помимо всего прочего, ''(ну, и так далее, там большой текст)''...
Дополнительно
Чтобы статья добавлялась при получении определенного задания, в ..._task.xml (вместо ... стоит название уровня) нужно прописать конструкцию вида:
название_задания_descr
В данном примере мы будем добавлять новый костюм со 100% защитой от всего XD Совершенно новый костюм добавлять не будем, возьмем за основу существующий костюм сталкера Нам понадобятся: Фотошоп + dds плагин. Блокнот
И файлы из игры:
gamedata\config\misc\outfit.ltx
gamedata\config\misc\trader_trader.ltx
gamedata\config\text\rus\string_table_outfit.xml
И так, по порядку. Открываем при помощи блокнота файл outfit.ltx
Крутим в низ пока не увидим: Копируем от начала до конца и вставляем перед костюмом новичка. И заменяем stalker_outfit,stalker_outfit_name, stalker_outfit_description на допустим stalkernew_outfit и т.д.
;--------------------------------------------------------------------------------------------- ; КОСТЮМ НЕЙТРАЛЬНОГО СТАЛКЕРА ;--------------------------------------------------------------------------------------------- [stalker_outfit]:outfit_base GroupControlSection = spawn_group discovery_dependency = $spawn = "outfit\stalker_outfit" //Дабы наш костюм был только у нас и во избежании разных багов перед $spawn ставим точку с запятой -> ;$spawn'' ;$prefetch = 32 class = E_STLK cform = skeleton visual = equipments\stalker_suit actor_visual = actors\hero\stalker_hood.ogf
cost = 15000 slot = 6 full_scale_icon = 14,11 ;иконка сталкера в костюме в полный рост nightvision_sect = effector_nightvision_bad //тут можно вместо _bad поставить _good для лучшего освещения =)
Далее открываем файл trader_trader.ltx - это файл конфигурации магазина Cидоровича.
Крутим вниз до [trader_start_sell]
Добавляем строчку stalkernew_outfit = 1, 1
Новая группировка Сегодня мы создадим новую группировку. Назовем её, скажем, "Ветер". Не суть важно. Практика Базовый уровень
1. Для начала в game_relations.ltx и в таблицу отношений группировок в конце и в заголовке добавляем название своей группировки и коэффициенты отношений к ней у других группировок. Также, не забываем прописать её собственное отношение к другим группировкам:
Отсчет идет построчно начиная сверху. Хотя есть небольшой нюанс. У первых трех строк - нумерация начинается с нуля, с остальных группировок она идет как надо. Для wind выставили 18, так как мы эту группировку отделили от других.
Далее, в разделе [communities_sympathy] в конце добавляем свою группировку и коэффициент "впечатлительности" - чем он меньше, тем меньше отношение группировки будет меняться к вам в целом:
4. Если предусматривается респавн бойцов новой группировки, в se_respawn.script прописываем в local simMaxCount = { после строчек с зомбированными сталкерами строку:
7. Чтобы у персонажа в графе "Группировка" отображалось не "wind", а "Ветер", зарегистрируем соответствующую строку в файле string_table_general.xml:
Ветер
Одиночка
[...]
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. Квесты
Добавим квесты, которые нужно выполнить для группировки. Пока - простые поручения распространенных типов.
Во-первых, пропишите в список диалогов персонажа следующие строки:
Этим мы добавили ему ветку диалога "Есть работа?", а также ветку для награды за квест/отказа от него. Теперь зарегистрируем в task_manager.ltx набор новых заданий.
[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. Вот пример того, как это сделано для заданий "Долга":
Соответственно, пройдем туда, куда указывает строка 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 ("actor_wind", 0, 0) end return true end
После чего создадим диалог, и сделаем в нем фразу с action'ом вида actor_set_wind. Советую изучить урок, посвященный диалогам. Новые NPC
Продолжение...
Теория В скриптах есть одна единственная функция, отвечающая за спавн объектов: alife():create(section,position,levelvertex,gamevertex)Строго говоря, их две: create create_ammo но различия между ними не существенны. Imp 22:45, 23 июля 2007 (EEST)
Первый параметр - секция в конфигурациях, описывающая объект, например "bolt","med_kit" - это простые секции, простых объектов а есть объекты, которые переходят в онлайн/оффлайн, это неписи, монстры и так далее, например mil_killer_respawn_2 - спавнится снайпер группировки киллеров.
С позицией, думаю объяснять не надо, только существует нюанс - высота это Y, а не Z. Задать позицию можно такой конструкцией vector():set(x,y,z), где x, y и z - координаты точки на уровне, где спавним объект.
Дальше сложнее, так как сам толком сформулировать не могу.
Начнем от простого к сложному. На каждом уровне много объектов, все объекты состоят из полигонов, у каждого полигона есть вершины – вертексы.
Именно они и должны здесь указываться, зачем - не особо понимаю, скорее всего для точного позиционирования объекта. Например, можно получить вертекс ближайший к актору - db.actor:level_vertex()
Дальше идет гораздо более интересный параметр game_vertex, это почти то же самое, что и level_vertex, но (!) это глобальные величины! Если level_vertex считается для уровня, то game_vertex - для всей игры, и нужен он для того, чтобы указать на какой карте спавнить объект (более вразумительного объяснения я не нашел).
Соответственно, чтобы заспавнить что-нибудь на другой карте, достаточно указать game_vertex в четвертом параметре Например:
db.actor:game_vertex()Итак, чтобы, например, заспавнить болт под ногами актора, пишем:
alife():create("bolt",db.actor():position(),1,db.actor:game_verte())Почему 1, а не level_vertex? Проверено - разницы особой нет, какой level_vertex, хотя в некоторых случаях надо прописывать валидный вертекс, а то предмет может просто заспавнится не там, где планировалось... Но по большей части все проходит нормально и с единицей. (Игнорирование level_vertex может приводить к проваливанию произведенных предметов/персонажей под землю.) А вот game_vertex решает все - он указывает на каком уровне спавнить предмет, поэтому его надо указывать. Теоретически можно просто найти для каждого уровня по одному game_vertex'у и использовать их в скриптах. На самом деле game_vertex показывает какой фрагмент карты используется (вся карта разбита на кусочки имеющие сквозную нумерацию по всем уровням и game_vertex выбирает нужный) соответсвенно неправильное использование черевато....
Кроме того - есть еще один параметр - ID объекта, если указать ID NPC или актора - то предмет заспавнится у него в инвентаре.
Пример (спавним артефакт Медуза в инвентаре у актора):
alife()
Сообщение отредактировал Vоvan_killer - Среда, 11.01.2012, 15:12