Репутация: 308
Регистрация: 03.10.2009
Город: Lost
Создание нового достижения
Для начала нужно распаковать игру анпакером.
После распаковки идём в следующие директории и ищем следующие файлы:
Code
info_x.xml ---> configs\gameplay\ (где "x" название локации на которой хотим получить достижение например jupiter) этот файл нужен для просмотра списка квестов на локации, зачем нам это узнаете позже. achievements.ltx ---> configs\misc\ st_achievement.xml ---> configs\text\rus\ ui_actor_achivments.xml ---> configs\ui\textures_descr\ xr_statistic.script ---> scripts\ ui_actor_achivments.dds ---> textures\ui\ xr_conditions.script ---> scripts\
И так, приступаем к работе.
Откроем файл achievements.ltx и ищем такую вот запись:
Code
[achievements] pioneer mutant_hunter detective one_of_the_lads kingpin herald_of_justice seeker b a ttle_sys tems_mas ter h igh_tech_master skilled_s talker leader diplomat research_man friend_of_duty friend_of_free dom b a lance_a dvocate wealthy keeper_of_secrets marked_by_zone inf ormation_dealer friend_of_stalkers
Добавим в конце название_достижения_на_английском. Пример:
Code
[achievements] pioneer mutant_hunter detective one_of_the_lads kingpin herald_of_justice seeker b a ttle_sys tems_mas ter h igh_tech_master skilled_s talker leader diplomat research_man friend_of_duty friend_of_free dom b a lance_a dvocate wealthy keeper_of_secrets marked_by_zone inf ormation_dealer friend_of_stalkers al l_stal kers_y our_fr iend
Идём в конец файла и добавляем следующее:
Code
["Название_достижения_на_английском_без_кавычек"] icon = ui_inGame2_имя_иконки_на_английском hint = st_sp_achievement_22_hint <--- То, что будет выводиться в КПК при наведении на иконку достижения (надо оставлять так же меняя только числа, чтоб они шли по порядку) name = st_sp_achievement_22_name <--- Имя достижения desc = st_sp_achievement_22_descr <--- Описание достижения functor = xr_statistic.название_достижения_на_английском_functor <--- функция для получения нашего достижения
Закрываем сохраняя изменения в файле
Далее откроем файл st_achievement.xml и добавим между:
<string id="st_sp_achievement_1_hint"> <text>Совокупность новых данных позволила профессорам Герману и Озёрскому синтезировать в условиях Зоны экспериментальный анабиотик.</text> </string>
Следующее:
Code
<string id="st_sp_achievement_22_hint"> <text>Ваш текст который будет высвечиваться в КПК при наведении мышки на иконку достижения.</text> </string> <string id="st_sp_achievement_22_descr"> <text>Полное описание достижения.</text> </string> <string id="st_sp_achievement_22_name"> <text>Имя достижения</text> </string>
Закрываем с подтверждением на сохранение изменений
Открываем xr_statistic.script идём в самый конец и добавляем следующее:
Code
function название_вашей_функции() if not has_alife_info("пишем_что_хотим_на_английсокм") then <--- проверка на раннее получение этого достижения if has_alife_info("название_квеста_или_действия") <--- квест или действие после которого будет получено достижение and has_alife_info("название_квеста_или_действия") <--- эта функция если квестов несколько db.actor:give_info_portion("пишем_что_писали_в_проверке_на_получение_ранее_достижения") news _man ager .sen d_ti p(db.actor, "st_ach_название_вашего_достижения_на_английском", nil, "название_вашего_достижения_на_английском", nil, nil) xr_effects.inc_faction_goodwill_to_actor(db.actor, nil, {"stalker", 100}) <--- прибавление репутации сталкеров при получении данного достижения (если - то убавление), можно вписать любую другую группировку (использовать несколько команд если хотите прибавить или убавить репутацию у нескольких группировок) end end return has_alife_info("пишем_что_писали_в_проверке_на_получение_ранее_достижения") end
Закрываем с подтверждением на сохранение изменений.
Если рисовали собственную иконку то вписываем её координаты (по x и y осям), если решили взять уже имеющуюся то вписывайте её координаты (координаты определяются по левому верхнему углу иконки достижения) координаты можно посмотреть через WTV (Windows Texture Viewer) Удачной игры Автор: WillsherT
Создание Места для Сна
Здравствуйте, сегодня мы рассмотрим добавление места для сна в ЗП. Это моя первая статья, так что прошу сильно ногами не бить....
1. Итак, мы решили добавить место для сна. Сначала мы распакуем all.spawn, откроем alife_zaton.ltx и добавим в конце секцию
[Ваш номер секции] ; cse_abstract properties section_name = space_restrictor name = произвольное название вашего места position=155.8231048584,-6.5563974380493,-138.71978759766 direction = 0,0,0 version = 0x7c script_version = 8
{ {target = "zat_a2_sr_sleep_id", hint = "st_ui_pda_sleep_place"}, {target = "jup_a6_sr_sleep_id", hint = "st_ui_pda_sleep_place"}, {target = "pri_a16_sr_sleep_id", hint = "st_ui_pda_sleep_place"}, }
и меняем на
local sleep_zones_tbl = { {target = "zat_a2_sr_sleep_id", hint = "st_ui_pda_sleep_place"}, {target = "jup_a6_sr_sleep_id", hint = "st_ui_pda_sleep_place"}, {target = "pri_a16_sr_sleep_id", hint = "st_ui_pda_sleep_place"}, {target = "произвольное название вашего места_id", hint = "st_ui_pda_sleep_place"}, }
3. Открываем xr_effects.script, ищем строки
function sleep(actor, npc) local sleep_zones = { "zat_a2_sr_sleep", "jup_a6_sr_sleep", "pri_a16_sr_sleep", "actor_surge_hide_2" }
и также меняем на
function sleep(actor, npc) local sleep_zones = { "произвольное название вашего места", "zat_a2_sr_sleep", "jup_a6_sr_sleep", "pri_a16_sr_sleep", "actor_surge_hide_2" }
Собираем all.spawn. Готово! Теперь после запуска игры с новым all.spawn у нас будет спальное место в барже Ноя (координаты брались оттуда).
Автор: ZeeK
Создание и радактирование худа
Раздел первый:файлы. Для работы над худом нам нужны следующие файлы(не обязательно все конешно) Текстуры: Папка - textures\ui Файлы + описание: 1- ui_hud.dds (собственно опорный файл содержащий почти все текстуры худа) 2 - cursor.dds (текстура причела без оружия в руках,попросту кругляшка) 3 - hud_map_arrow.dds (стрелка компаса) Конфиги: Папка - config\ui Файлы + описание: 1 - maingame.xml (содержит конфиги индикаторов здоровья и состояния брони,индикаторов состояния ГГ(радиация,поломка оружия и тп) , окно патронов и всё с ним связаное,пояс артефактов ,мигающая иконка ПДА и кол во контактов. Так же состояние машины) 2 - motion_icon.xml (содержит конфиги положения ГГ (сидит,стоит и тп) ,а так же полоски выносливости,уровня шума и заметности ГГ.) 3 - ui_custom_msgs.xml (часы + всякая лабуда типо укусов...вообщем худы повреждений) 4 - zone_map.xml (собственно миникарта + компас)
Собственно это стандартный набор...он естественно не полный...есть ещё пара конфигов .... типо координаты новостей на худе...но они редко правятся.
Раздел второй:правка конфигов.
Открываем файлик maingame.xml
Что там есть: <static_health - положение "колбы" здоровья <progress_bar_health - полоска здоовья
<static_armor - положение "колбы" состояния брони. <progress_bar_armor - полоска брони
<static_weapon - окно патронов + тип патронов <static_ammo - количество патронов <static_wpn_icon - иконка коробки от патронов <car_panel - состояние машины <static_pda_online - счётчик контактов <quick_info - задания и всякая лабуда типо обучения в начале игры. <icons_scroll_view - список индикаторов состояния ГГ (радиация,голод и тп.)Далее идёт сам список,НО он не поддаётся правке индивидуально. Правим только всё сразу строчкой упомянутой выше.
<hud_timer - часы <controller_fx - худ поареждения от контролёра <monster_claws - худ повреждения от мутанта(царапины) <main_task - "главное задание" <cs_psy_danger - предупреждение о сильном излучении <cs_radiation_danger - предупреждение о высоком уровне радиации <game_saved - "игра сохранена" <autosave - "автосохранение" <item_used - "использован .... " (аптечка и тп) <gun_jammed - "оружее заклинило" <cant_walk - "вы слишком истощены" <cant_walk_weight - "вы перегружены" <not_enough_money_mine - у ГГ не хватает денег <not_enough_money_other - у НПС не хватает денег
Далее идут строчки с координатами сообщений связаных с пингом.(разбирать МП не буду)
__________________________________
Файл zone_map.xml Тут всё просто:
<level_frame - сама карта <background - рамка карты <dist_text - расстояние до цели <compass - думаю понятно что это biggrin.gif <center - хз что это..предполагаю что реч о точках на миникарте
Сборка скриптовых функций
======================================================================= ВЫДАЁМ ПРЕДМЕТ АКТОРУ ======================================================================= function название функции (first_speaker, second_speaker) dialogs.relocate_item_section(second_speaker, "название предмета", "in") end
Размещается в файлах скрипт.
Выдача поршня вставляется под строку действия. <action>название скрипта.название функции</action>
Примечание, что бы выдать два одинаковых предмета пишем
function название функции (first_speaker, second_speaker) dialogs.relocate_item_section(second_speaker, "название предмета", "in",2) end
Если надо больше меняем цифру 2 на нужную нам. ========================================================================= ОТБИРАЕМ ПРЕДМЕТ У АКТОРА. ========================================================================= function название функции(first_speaker, second_speaker) dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "название предмета") end
размещается в файлах скрипт
выдача поршня вставляется под строку действия <action>название скрипта.название функции</action>
Примечание, что бы отобрать два одинаковых предмета пишем
function название функции(first_speaker, second_speaker) dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "название предмета",2) end
Если надо больше меняем цифру 2 на нужную нам. ======================================================================= СПАВНИМ ВЕЩЬ В РЮКЗАК гг ======================================================================= function название функции() local obj = alife():create("ВЕЩЬ", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) end
В диалог <action>название скрипта.название функции</action>
=========================================================================== ПРОВЕРКА НАЛИЧИЯ У АКТОРА ПРЕДМЕТА =========================================================================== Вариант первый function Название функции() if db.actor:object("название предмета") then return true end return false end
function название функции(first_speaker, second_speaker) return first_speaker:object("название предмета") ~= nil end
в диалог
<precondition>имя скрипта.название функции</precondition> =========================================================================== ПРОВЕРКА ВЕЩЕЙ У ГГ =========================================================================== function Название функции(first_speaker, second_speaker) return first_speaker:object("название предмета") ~= nil or first_speaker:object("название предмета") ~= nil or first_speaker:object("название предмета") ~= nil end
описание... если есть хотя бы одна вещь, то мы получим фразу, если нет всех нет разговора ============================================================================ ПРОВЕРКА ДЕНЕГ У ГГ ============================================================================ Вариант первый(используют ПЫС)
function название функции(first_speaker, second_speaker) return first_speaker:money() >= 2000 end
========================================================================= СПАВН ПРЕДМЕТА ========================================================================= function spawn_vintar() alife():create("Название предмета",vector():set(24.725412368774,-3.6072344779968,173.83030700684),993926,210) end
========================================================================== МГНОВЕННАЯ СМЕРТЬ ГГ ==========================================================================
function название функции(npc, actor) npc:kill(actor) end
В диалог
<action>название скрипта.название функции</action> =========================================================================== ПРОВЕРКА КОЛ_ВА ОДИНАКОВЫХ ПРЕДМЕТОВ =========================================================================== function название функции(first_speaker, second_speaker) local item_sections = {"Предмет"} local needed = количество одинаковых предметов, ставится цифра без знаков local count = 0 local item_section local function calc(temp, item) if item:section() == item_section then count = count + 1 end end for k,v in pairs(item_sections) do item_section = v get_story_object("actor"):iterate_inventory(calc, actor) end return count >= needed end
в диалог <precondition>имя скрипта.название функции</precondition> ========================================================================== ЛЕЧЕНИЕ ГГ ========================================================================== Вставим этот актион в диалог
<action>dialogs.medic_magic_potion</action> ========================================================================== ВЫДАЧА ДЕНЕГ от НПС ГГ ==========================================================================
function название функции(first_speaker, second_speaker) dialogs.relocate_money_to_actor(first_speaker, second_speaker, 2000) end
===================================================== ===================== ПРОВЕРКА НА ХОРОШЕЕ ЗДОРОВЬЕ ========================================================================== function actor_good(first_speaker, second_speaker) if db.actor.health > 0.75 or --уровень здоровья, при котором диалог уже будет появляться(от 0 до 1) db.actor.radiation < 0.1 or -- уровень радиации,при котором диалог уже будет появляться(от 0 до 1) db.actor.bleeding < 0.1 then --уровень кровотечения, при котором диалог уже будет появляться(от 0 до 1) return true end return false end ========================================================================== ПРОВЕРКА НА ОТНОШЕНИЯ ГРУППИРОВКИ К ГГ ========================================================================== function if_enemy_to_actor(first_speaker, second_speaker) local npc = dialogs.who_is_npc(first_speaker, second_speaker) local actor = dialogs.who_is_actor(first_speaker, second_speaker) return xr_conditions.is_faction_enemy_to_actor(actor, npc, {"Название группировки"}) end
если надо когда группировка не враждебна к актору, то return not если надо когда группировка друзья,то return xr_conditions.is_faction_friend_to_actor(actor, npc, {"Название группировки"}) когда нейтралы, return xr_conditions.is_faction_neutral_to_actor(actor, npc, {"Название группировки"}) ;------------------------------------------------------------------------------------------------------ ;ПРОВЕРКА НА УБИЙСТВО ;------------------------------------------------------------------------------------------------------ local npc = ТУТ НУЖНО ЗАДАТЬ НЕПИСЯ if db.actor:has_info(НАЗВАНИЕ ИНФОПОРШНЯ ВЫДАННОГО ЗАДАНИЯ) if npc:alive() then db.actor:give_info_portion(НАЗВАНИЕ ИНФОПОРШНЯ С УКАЗАНИЕМ ПОДОЙТИ К НЕПИСЮ) db.actor:disable_info_portion(НАЗВАНИЕ ИНФОПОРШНЯ ВЫДАННОГО ЗАДАНИЯ) end end ;------------------------------------------------------------------------------------------------------ ;ЛЕВЕЛ_ЧЕНДЖЕРЫ ;------------------------------------------------------------------------------------------------------ function add_new_lc(levch,levchn,levchm,info) local objt = alife():story_object(levch) if not objt then alife():create(levchn) end local obj = alife():story_object(levch) if obj then level.map_add_object_spot(obj.id, "level_changer",levchm) db.actor:give_info_portion(info) info_received() end end
Все мы знаем, что движок ведёт себя, как капризная невеста, и вылетает от малейшего чиха Причины Вылетов
1. Синтаксические ошибки в коде. Как правило, лог при этом содержит что-то вроде Код attempt to index global '<имя файла>' (a nil value) т.е. движку не удалось скомпилить модуль и его значение (модуля) равно нулю
2. Ошибки времени выполнения Lua. Лог обычно содержит указание ошибки модуль и строку, в которой ошибка произошла. Типа такого: Код LUA error: ....k.e.r. 1.0004\gamedata\scripts\<имя файла>.script:<номер строки>: attempt to index global 'npc' (a nil value) К типичным ошибка относятся попытки вызвать несуществующий метод класса (и вообще индексировать что-бы то ни было несуществующим ключом) или, к примеру, конкатенация строки с nil.
3. Ошибки времени выполнения самого игрового движка. Лога обычно нет, т.е. движок тихо слетает, сам в лог ничего не пишет, а забуферизированный до этого момента лог теряется. Иногда, правда, что-то в логе есть, но бывает это весьма редко. Ошибки движка вызваны неправильным использованием функций самого движка. Например, попытка заспавнить объект с несуществующей секцией.
Создаем файлы для работы с диалогами
Спросите для чего это надо? Отвечу коротко и надеюсь понятно.
Для более удобного совмещения модов.
Создадим файл dialogs_zver_kopdon.txt далее его с помощью тотал командера( или чем вы пользуетесь) меняем окончание .txt на .xml и получаем готовый файл. dialogs_zver_kopdon.xml открываем его и вставляем в него следущее:
Код <?xml version="1.0" encoding="windows-1251" ?> <string_table>
</string_table>
Всё наш файл готов к работе, здесь можно прописывать русскоязычные диалоги. Помещаем его по адресу .....\Program Files\GSC World Publishing\S.T.A.L.K.E.R\gamedata\config\text\rus Что бы его игра увидела нужно его прописать. Открываем файл localization.ltx который находится по адресу ....\Program Files\GSC World Publishing\S.T.A.L.K.E.R\gamedata\config Находим строку ;список xml файлов, содержащих таблицы символов
и в самом конце списка через запятую прописываем dialogs_zver_kopdon
Всё можно работать!!!
Создадим файл zver_kordon_dialogs.xml пропустим создание, так как оно подробно рассписано выше.
откроем файл и и вставим:
Код <?xml version="1.0" encoding="windows-1251" ?> <game_dialogs>
</game_dialogs>
Файл готов к работе. Здесь формулу диалога.Положим его по адресу: ...\Program Files\GSC World Publishing\S.T.A.L.K.E.R\gamedata\config\gameplay Прописываем что бы видела игра по адресу ...\Program Files\GSC World Publishing\S.T.A.L.K.E.R\gamedata\config\system.ltx Находим строку: [dialogs] в конце списка прописываем zver_kordon_dialogs
Всё работаем!!!
Создадим файл инфо где будут прописываться инфопоршни. Создадим файл info_zver_kordon.xml Откроем файл и вставим
Код <?xml version='1.0' encoding="windows-1251"?>
<game_information_portions>
</game_information_portions>
Файл готов к работе.Положим его по адресу: ...\Program Files\GSC World Publishing\S.T.A.L.K.E.R\gamedata\config\gameplay Прописываем что бы видела игра по адресу ...\Program Files\GSC World Publishing\S.T.A.L.K.E.R\gamedata\config\system.ltx Находим строку: [info_portions] в конце списка прописываем info_zver_kordon.xml
Всё можно работать!!!
Про файл скрипт, он тоже нам нужен в квестописании.
просто создаём файл zver_1.script и помещаем его по адресу: D:\Program Files\GSC World Publishing\S.T.A.L.K.E.R\gamedata\scripts
Всё можно работать!!!
И как бонус создние файла из серии character_desc_......xml
Создадим файл character_desc_zver.xml
Откроем файл и вставим:
Код <?xml version='1.0' encoding="windows-1251"?>
<xml>
</xml>
Файл готов к работе.Здесь мы прописываем профили неписей.Положим его по адресу: ...\Program Files\GSC World Publishing\S.T.A.L.K.E.R\gamedata\config\gameplay Прописываем что бы видела игра по адресу ...\Program Files\GSC World Publishing\S.T.A.L.K.E.R\gamedata\config\system.ltx Находим строку: [profiles] в конце списка прописываем character_desc_zver
Всё работаем!!!
"Я вижу мир насквозь - все счастья и проблемы земли.Я слышу мыслы все-при все, особенно сейчас твои"
Репутация: 50
Регистрация: 17.02.2011
Город: Воронеж
Ребят подскажите пожайлуста как сделать: 1.Кончающиеся болты. 2.Не исчезающие болты(чтобы после того как их выкинули, через несколько секунд они не пропадали в некуда). Я брал configs гранаты и менял визуал на болт. Ни чего не вышло...
Репутация: 50
Регистрация: 17.02.2011
Город: Воронеж
ZeeK, а можно ли сделать так чтобы болт исчезал через максимальное количество времени? То есть не через, например 5 сек, а через 30 сек. И можно ли поподробнее, как сделать болт на основе гранаты? Я брал configs гранаты и менял визуал на болт, заменял анимки на болт"овские". Болт стал отображаться в инвентаре, но: 1.Он остался бесконечным. 2.Его нельзя подобрать когда выкинешь.
1.Он остался бесконечным. 2.Его нельзя подобрать когда выкинешь.
Ох, очень давно в Зов Припяти не играл, и разумеется не копался в архивах, но кое-чем помогу: 1. В конфиге есть строки, отвечающие за количество. Видать, из гранаты ты его не перенёс. Выглядит не помню как, но поищи в АК-74 строку вроде "ammo_" где после этого 30 написано, это и будет названием нужной строки, которую надо искать. Если её нет в конфиге болта - надо будет её создать и написать там цифру "1". 2. Есть специальная строка, запрещающая подбирать предмет. Только хоть убей - не помню как называется и в конфиге ли она вообще...
Репутация: 436
Регистрация: 03.01.2012
Город: Москва
Wolfing, Советую скачать вот это, если не весь то по крайне мере процентов девяносто, сюжета, эта модификация убирает. Пока по моему самое подходящее что есть.
Mакc, Спасибо скачал, вот есть вопрос, нужны уроки: 1.Создание предметов в разных местах например: оружие,броню,медикаменты,патроны в каких нибудь местах как их создать 2.Изменение ГГ: Изменение старта,имя ГГ, снаряжение ГГ, увеличение веса 3.Как создать место сна и личного ящика 4.Как создать НПС, как бы создаёшь какого нибудь сталкера в каком нибудь месте 5.Как создать в разных местах разных мутантов, при этом что бы образовать скопление мутантов
Добавлено (15.04.2012, 22:26:57) --------------------------------------------- Просто хочется создать свой мелкий мод на основе этого Добавить ульма мутантов, образуя логово Создать несколько НПС Создать техника, который будет чинить оружие бесплатно Добавить новые тайники с оружием,медикаментами,едой,бронёй создать учёного которому можно сдавать артефакты и получать деньги, например Новиков Техник, Озёрский учёный Изменить начальное снаряжение ГГ
А вот ещё вопросы: 1.Как создать техника 2.Как создать торговцы артефактов
Добавлено (15.04.2012, 22:28:05) --------------------------------------------- Не сочтите меня очередным пользователем спрашивая всё подряд как на других крупных порталов
Знаешь, дружок, а я ведь могу счесть тебя за "того самого" очередного пользователя. Потому что те вопросы, что ты задал можно найти по интернету на всяких знаниях, да и в наших темах. К тому же если ты всерьёз решил этим заниматься, тебе стоит хоть что-то покопать самому. Ведь с подсказки ты не запомнишь, не научишься. Я это по себе знаю. Так что зайди сюда, пощарь по темам, а потом уже чего не найдёшь спрашивай. Удачи :)
Ушёл с ресурса из-за занятости. Если что-то экстренное - пишите в ЛС: приду, посмотрю, отвечу. Полноправно вернуться в сообщество планирую после релиза второй части игры. ----------------------------------------------------------------- Всем удачи и не скучать.
Репутация: 436
Регистрация: 03.01.2012
Город: Москва
Wolfing, Итак, добавляю все уроки что ты просил, пришлось не слабо покопаться и хорошенько освежить свою память. Решил не заливать на файлообменники, а написать прямо сюда для удобства:
Если вам необходимо заспавнить какой-либо объект на локации, будь то случайный тайник или квестовый предмет, то прежде всего нужно научиться работать с ACDC и сегодня я немного расскажу об этом.
Необходимо: 1) ACDC CoP 2) Activeperl 8.7. 3) Распакованная Игра 4) Базовые знания работы с конфигами
Начнём, поместим файл all.spawn из [gamedata\spawns] в папку ACDC и распакуем с помощью батника. Появятся файлы с названием секций, нам нужны файлы alife_???.ltx, они отвечают за "спавн" на какой-либо локации. Перед тем как добавлять объект на локацию, нам нужно узнать его координаты, мы сделаем это самостоятельно, без специальных программ. Открываем:
Code
gamedata\scripts\ui_main_menu
И ищем конфиги:
Code
if dik == DIK_keys.DIK_Q then self:OnMessageQuitWin() end
Удаляем их и на их место пишем:
Code
if dik == DIK_keys.DIK_Q then self:OnMessageQuitWin() elseif dik==DIK_keys.DIK_W then self:position_info() end
В самый конец файла записываем:
Code
function main_menu:position_info() local a = db.actor:position() local vid = db.actor:level_vertex_id() local gvid = db.actor:game_vertex_id() local text = "GPS:\\nX= "..a.x.."\\nY= "..a.y.."\\nZ= "..a.z.."\\nlevel_vertex= "..vid.."\\ngame_vertex_id= "..gvid news_manager.send_tip(db.actor, text, nil, nil, 30000) end
Только что мы добавили в главное меню новую функцию, которая поможет вам быстро, а главное правильно снимать координаты. Теперь заходим в игру, двигаемся до того места где собираетесь "поставить" объект, будьте внимательны и старайтесь сделать всё правильно. После, заходим в главное меню, жмём клавишу W. Возвращаемся в игру и делаем скриншот что-бы сохранить появившиеся на экране координаты. Обратите на них особое внимание, это одна из самых важных частей.
А теперь я немного расскажу как прописывать профиль объекта: Выбираем нужную нам секцию локации и прописываем там специальные конфиги, как это сделать показано ниже:
Code
[1922] ; Это порядковый номер объекта ; cse_abstract properties section_name = helicopter; Имя секции name = ??? ; Уникальное имя position = ??? ; Координаты direction = ??? ; Угол поворота
Это собственно и есть имя ГГ, ставим взамен нужное нам, так же в этом файле можно найти имена и других персонажей.
Начальное Снаряжение Для изменения стартового снаряжения ГГ нам понадобится всего один файл, переходим:
Code
gamedata\configs\gameplay\character_desc_general
В этом файле содержатся профиля всех НПС, всё что находится в снаряжении у персонажа заключено в строки:
Code
<supplies> [spawn] \n ??? <supplies>
Кроме этого существуют дополнительные опции прописывания предметам:
??? \n ; Количество
??? = 1, scope, silencer, launcher \n ; Таким образом можно прописывать обвесы для оружия
Так же можно задавать изношенность и вероятность появления предметам:
??? = 1, launcher cond=0.9 ; Таким образом изношенность 90% ??? = 1, launcher prob=0.5 ; Таким образом вероятность появления 50%
Названия предметов стоит брать из файлов st_items_???, и брать имя со строк:
Code
<string id="???">
Вес Наверное самый популярный вопрос среди начинающих модмейкеров, что-бы изменить вес нам понадобятся два файла. Переходим:
Code
gamedata\config\creatures\actor
Теперь устанавливаем нужный нам вес, лучше всего везде ставить одну цифру, так как не соблюдённые значения иногда приводили к некоторым ошибкам:
Code
max_item_mass = ??? max_walk_weight = ???
Переходим к следующему:
Code
gamedata\config\system
Теперь ещё раз пропишем вес, вставляйте те же цифры, что и в предыдущем файле:
Code
max_weight = ???
Личные ящики сделаны по той же системе что и многочисленные тайники больше всего известные по ЧН, вроде "нычек" в трубах или в сейфах. Им можно задавать определённую логику, условия открытия и многое другое, но сегодня я расскажу только о том как создавать простые тайники без лишних функций. Переходим:
Code
gamedata\configs\misc\devices
Здесь есть множество различных конфигов, немного рассмотрим общий профиль:
Code
[inventory_box] GroupControlSection = spawn_group ; Только для SDK discovery_dependency = ; Ограничение к личному ящику, необязательный конфиг $spawn = "devices\inventory box" ; Секция спавна, мала важна class = S_INVBOX ; Класс объекта cform = skeleton visual = dynamics\equipment_cache\equipment_box_01_case.ogf ; Внешний вид script_binding = bind_physic_object.init ; Механизм спавна
Это общий профиль, но так же существует упрощённый и работоспособный конфиг:
Code
[???]:inventory_box visual = Внешний вид объекта, берите пример с других профилей
Одна из самых проблематичных частей для начинающего модмейкера, но если внимательно следовать инструкциям, позже, вы научитесь легко и быстро создавать НПС любой сложности. Сегодня я расскажу о уникальных персонажей, не буду затрагивать "стандартных", ходячих в симуляции. И так, для начала нужно "заспавнить" персонажа. Об этом подробно написано в первом уроке, но создание живого существа, будь то сталкер или мутант слегка отличается. Профиль НПС:
Code
[1865] ;Порядковый номер ; cse_abstract properties section_name = stalker ; Имя секции name = ??? ; Уникальное имя position = ??? ; Координаты direction = ??? ; Угол Поворота
; cse_alife_trader_abstract properties money = 416 character_profile = ??? ; Ваше уникальное имя, используется в профиле
; cse_alife_object properties game_vertex_id = 292 ; Для каждого уровня своё значение distance = 0 level_vertex_id = 76655 ; Лучше не трогать object_flags = 0xffffffbf custom_data = <<END
[logic] cfg = ??? ; Логика, лучше приписывать стандартную, по примерам других сталкеров
; cse [smart_terrains] none = true END story_id = ??? ; Ваш уникальный номер, убедитесь что подобного нет
; cse_visual properties visual_name = ??? ; Визуал сталкера, делайте по примерам других персонажей
; cse_alife_creature_abstract properties g_team = 0 g_squad = 1 g_group = 2 health = ??? ; Статус НПС: Живой (1) или Мёртвый (0) dynamic_out_restrictions = dynamic_in_restrictions =
Теперь необходимо прописать конфиги нашему НПС, заходим:
Code
gamedata\configs\game_story_ids
И в самый конец записываем:
Code
10000 = "???" ; Ваше уникальное имя
Далее регистрируем "спавн-профиль", идём по адресу:
Code
gamedata\configs\creatures\spawn_sections_zaton
И в самый конец добавим:
Code
[???]:stalker ; Ваше уникальное имя $spawn = "respawn\???" ; Ваше уникальное имя character_profile = ??? ; Ваше уникальное имя spec_rank = novice ; Ранг НПС, оставлю базовый, не буду прописывать остальных community = ??? ; Группировка
Заходим:
Code
gamedata\configs\gameplay\npc_profile
И прописываем:
Code
<character id="???"> ; Ваше уникальное имя <class>???</class> ; Ваше уникальное имя <specific_character>???</specific_character> ; Ваше уникальное имя </character>
Переходим в файл:
Code
gamedata\configs\gameplay\character_desc_zaton
И создаём профиль:
Code
<specific_character id="mudak" team_default = "1"> <name>???</name> ; Имя персонажа, сразу прописывайте здесь. Либо делаем сами, по примеру других НПС и урока по правке имени <icon>???</icon> ; Иконка персонажа, разбирать не буду. Делайте по примеру других сталкеров <bio>???</bio> ;Нерабочее поле, задумывалось как биография персонажа
<rank>???</rank> ; Ранг, не используется <reputation>???</reputation> ; Репутация среди сталкеров <money min="???" max="???" infinitive="0"/> ; Деньги, при вставке разных чисел даётся рандомно
<snd_config>???</snd_config> ; Озвучка, указывать путь <crouch_type>-1</crouch_type>
<visual>???</visual> ; Внешний вид, указывать путь <supplies> [spawn] \n ??? ; Предметы, по примеру второго урока </supplies>
#include "gameplay\character_criticals_4.xml" ; Судя по всему файл отвечает за "живучесть" персонажа
Вот и всё, мы создали уникального НПС. Конечно здесь освещены не все нюансы и аспекты этого процесса, но вы уже кое-что об этом узнали...
Для создания механика добавьте в любое место, в создании профиля такую строку:
Code
<mechanic_mode>1</mechanic_mode>
Но будет доступен только ремонт, прописывание конфигов улучшения брони и оружия уже совсем другой урок.
Итак, прописал более подробный и действенный метод создания монстров, и соответственно логов для них. Не поленившись встать сегодня далеко до рассвета я написал весь этот урок. Здесь освещается только спавн на оригинальных локациях. Приступим: Мы создадим монстров по принципу отрядов, они же сквады. В сети уже давно есть подобный урок, но в нём затрагивается лишь спавн персонажей, весь этот процесс примерно одинаков, но монстры слегка отличаются по своим конфигурациям. На основе этого урока я расскажу о спавне и о их симуляции в Зоне. Все описания хранятся в файлах:
Code
gamedata\configs\misc\squad_descr_???
Все конфиги сквадов разделены на локации, ищем нужный нам уровень по моему примеру. Для создания отрядов требуется прежде зарегистрировать их секцию, в выбранном вами файле, рассмотрим стандартный вид, без дополнительных функций:
[???]:online_offline_group - Уникальное название отряда, лучше придерживаться стандартным правилам по заполнению, смотрите на примере других секций, дабы не было путаницы.
faction = ??? - Является одним из главный отличий между монстрами и сталкерами. В отличие от персонажей, где указывалась группировка здесь по всей видимости говорится о классе мутанта. Возможные классы: monster - Обычный класс, ничего особенного не заметил. monster_predatory_day\night - Агрессивный монстр, делятся так же на два класса (Ночной и Дневной) monster_zombied_day\night - Странный класс, прописывается либо контролёрам, либо сноркам, при том что сами зомби сюда не входят. Так же бывают дневные и ночные. monster_special - Какой-то специальный класс, прописывается только ключевым монстрам, к примеру псевдогигант на Затоне. Для чего вообще требуются классы так и не понял, видимо они дают поведение, реакцию и возможно предопределяют НПС быть мутантом.
npc = ??? - Прописывается сам отряд, кто туда входит. Заполнять подобного вида: ???_weak\normal\strong - Указывать вид мутанта, брать из "game_relations", смотрим секцию мутантов. Далее следует определённый опыт и сила монстра, прописывать обязательно. (Слабый, Нормальный и Сильный). Если необходимо включить в сквад ещё мутантов, то пишем через запитую. Ещё работаю над дополнительными конфигами этой функции, например рандом...
target_smart = ??? - Конечный смарт-терраин, куда стремится отряд. Для этого параметры существуют следующие функции позволяющие при умелом использовании создать мощный инструмент по управлению всеми НПС. Дополнительные конфиги: nil - Делает данный сквад симуляционным, он безцельно ходит по зоне без какой-либо цели. Если не прописывать функцию, автоматически будет поставлен этот конфиг. смарт_1:смарт_2:смарт_3 - Отряд будет по цепочке идти по всем смартам, последний будет заключительный. смарт_1:смарт_2:смарт_3:loop - Бесконечный цикл, отряд будет всегда, по кругу, ходить по этим смартам. Так же можно задавать смартам логическую поверку, для того что-бы они ходили по определённым путям. Примеры: {+info1} смарт_1, смарт_2 - При получении инфопоршня "info1" сквад идёт смарт_1, иначе, в смарт_2. {=is_day} смарт_1, смарт_2 - Днём отряд находится в первом смарте, ночью идёт во второй. {!is_day} смарт_1, {=is_rain} смарт_2, смарт_3 - Если ночь, сквад идёт к первому смарту, если дождь, во второй, в остальных случаях, третий смарт. {=info1} nil, смарт_1 - При получения инфопоршня отряд уходит в симуляцию, иначе, находится в первом смарте.
story_id = ??? - Сюда повторно пишем имя сквада, но есть одна загвоздка. При использовании этого конфига выбранный отряд не погибает от выброса, в другом случаи, действует так же как и все остальные НПС. Другие функции которые так же можно прописать в секцию отряда:
spawn_point = ??? - Если вам необходимо сразу спавнить мутанта в определённом месте, то ставим на уровень way point и указываем его в данном параметре.
on_death = ??? - Какие эффекты будут происходить при гибели отряда. Брать из xr_effects
sympathy = ??? - Симпатия к отряду, подробное описание в game_relations
relationship = ??? - Отношение к Актёру, действует независимо от группировки. Возможные значение: friend - Друзья neutral - Нейтралы enemy - Враги
Теперь нужно зарегистрировать нашу секцию, для этого переходим:
Code
gamedata\configs\misc\simulation_objects_props
И добавляем конфиги такого вида:
Code
[???]:default_squad ; Имя отряда sim_avail = ??? ; Параметр проверяющий доступность нашего отряда для симуляции, так же к нему можно ставить инфопоршни. (true\falce)
Для одноразового ведения нашего отряда в игру следует добавить его секцию в нужный нам файл, для этого переходим:
Code
gamedata\configs\misc\simulation
И прописываем здесь такие строки:
Code
[start_position_???] ; Уровень ID-Cквада = Смарт
Я не стал добавлять урок по созданию торговца, но советую тебе просто прописать в его инвентарь нужные предметы и получится антологичный результат, за исключением некоторых дополнительных функций.
Так как урок по добавлению места для сна довольно сложен для твоего сегодняшнего уровня, здесь требуется знание SDK, я выкладываю его на файлообменник. Урок в шапке темы не имеет вспомогательных изображений, а переводить повторно в формат форума и править будет довольно сложно.
P.S. Думаю будет разумно добавить статьи в шапку темы... P.S.S. Правка и некоторые статьи мои
Репутация: 436
Регистрация: 03.01.2012
Город: Москва
Wolfing, Расписал о мутантах, на этот раз более подробно и с изменённым методом спавна, а так же выкладываю забытый мною урок по изменению места старта игры. Удачи!
Небольшой урок в ходе которого вы научитесь создавать новое место для старта игры. Думаю многим это пригодится, преступим.
Замерев координаты места где мы собираемся создать точку спавна для новой игры и распаковав ACDC заходим в alife_zaton и правим в нём нужные координаты на свои:
Code
[982] ; cse_abstract properties section_name = actor name = zaton_actor
position = x,y,z ; Взамен ставим свои direction =0,0,0 s_flags = 0x29
; cse_alife_object properties
game_vertex_id = game_vertex ; Так же меняем distance = 38.5
Репутация: 436
Регистрация: 03.01.2012
Город: Москва
Wolfing Должно работать, в принципе сделано всё правильно. Оставь конфиги и попробуй протестировать, если встретишь своего псевдогиганта, отпишись. Так же обрати внимание на стабильность, что-бы не было багов и тем более вылетов. Но ещё кое-что, ошибка это или нет, но всё же напоминаю:
Code
squad_descr_??? ; Прописывать в файле с нужной локацией
squad_descr_??? ; Прописывать в файле с нужной локацией
А я то думаю почему вылетает, я прописал просто в squad_descr, теперь и исправил и написал в squad_descr_zaton
Добавлено (18.04.2012, 17:20:46) --------------------------------------------- А как нибудь можно заспаунить мутанта в нужную точку, я так псевдогиганта и не нашёл
Репутация: 436
Регистрация: 03.01.2012
Город: Москва
Wolfing, Ещё раз, читай внимательнее:
Code
spawn_point = ??? - Если вам необходимо сразу спавнить мутанта в определённом месте, то ставим на уровень way point и указываем его в данном параметре.
Или так же советую просто прописать побольше мутантов или создать для них пути, просто подожди их там и они непременно придут.
Репутация: 436
Регистрация: 03.01.2012
Город: Москва
Wolfing, Довольно сложная схема, не советую использовать, возможны вылеты из-за неправильных настроек путей. Вчера тестировал подобную схему, встретил твоих мутантов через пару дней около Скадовстка. Но не получилось сразу, видимо ты не приписывал одноразовое появление, смотри последний пункт в уроке, эти конфиги спамят сквад с началом новой игры, но не всегда, иногда встречались какие-то сбои и появление отряда происходило через некоторое время в самостоятельно выбранной точке, либо в автоматически выбираемую движком. В общем схема рабочая, не обязательно каждый раз её тестировать.
Mакc, Я последний пункт не понял что он делает, и какие будет последствия, спасибо что протестировал, у меня всё работало на два дня я их не ждал, буду дальше учиться