дантист | Дата: Пятница, 19.10.2012, 01:56 | Сообщение # 1 |
Глава Монолита. Разведчик. Старший Хабаровщик.
Группа: Администраторы
Ранг:
Сообщений: 202
Награды: 5
Репутация: 35
Пол: Сталкерша
Проживаю в-
| Создание нового достижения
Для начала нужно распаковать игру анпакером.
После распаковки идём в следующие директории и ищем следующие файлы:
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 и ищем такую вот запись:
[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
Добавим в конце название_достижения_на_английском. Пример:
[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 и добавим между:
Code
<string id="st_sp_achievement_21_name"> <text>Друг сталкеров</text> </string>
и
Code <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
Закрываем с подтверждением на сохранение изменений.
Откроем xr_conditions.script найдём:
Code friend_of_stalkers_functor = xr_statistic.friend_of_stalkers_functor
И после пишем:
Code название_вашей_функции = xr_statistic.название_вашей_функции
Закрываем с подтверждением на сохранение изменений.
Рисуем в ui_actor_achivments.dds иконку для нашего достижения (можно взять и старую).
Открываем файл ui_actor_achivments.xml и добавляем там:
Code <texture id="ui_inGame2_название_вашей_иконки" x="0" y="0" width="121" height="121" />
Если рисовали собственную иконку то вписываем её координаты (по x и y осям), если решили взять уже имеющуюся то вписывайте её координаты (координаты определяются по левому верхнему углу иконки достижения) координаты можно посмотреть через WTV (Windows Texture Viewer) Удачной игры
Создание Места для Сна
Здравствуйте, сегодня мы рассмотрим добавление места для сна в ЗП. Это моя первая статья, так что прошу сильно ногами не бить....
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
; cse_alife_object properties level_vertex_id=1233171 game_vertex_id=13 distance = 9.09999942779541 object_flags = 0xffffff2e custom_data = <<END [story_object] story_id = произвольное название вашего места_id
[logic] cfg = scripts\sr_sleep.ltx END
; cse_shape properties shapes = shape0 shape0:type = box shape0:axis_x = 5.02119588851929,0,0 shape0:axis_y = 0,5.0482006072998,0 shape0:axis_z = 0,0,2.23479747772217 shape0:offset = 0,0,0
; cse_alife_space_restrictor properties restrictor_type = 3
2. Потом идем в pda.script, ищем строки
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"}, }
и меняем на
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 у нас будет спальное место в барже Ноя (координаты брались оттуда).
Создание и редактирование худа Раздел первый:файлы. Для работы над худом нам нужны следующие файлы(не обязательно все конешно) Текстуры: Папка - 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 - список индикаторов состояния ГГ (радиация,голод и тп.)Далее идёт сам список,НО он не поддаётся правке индивидуально. Правим только всё сразу строчкой упомянутой выше.
<flashing_icons> - мигющий ПДА <pick_up_item - "поднять предмет" <artefact_panel - панелька артов.
__________________________________
Файл motion_icon.xml
Что мы видим в нём: <background - текстура на которой будет всё отображаться
Список иконок положения ГГ: начиная от <state_normal> и заканчивая <state_sprint>
<power_progress - полоска выносливости <luminosity_progress - полоска заметности ГГ <noise_progress - полоска издаваемого шума
__________________________________
Файл ui_custom_msgs.xml Что имеется:
<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
в диалог
<precondition>имя скрипта.название функции</precondition>
<---------как вариант(пользуются ПЫС)------------------>
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
в диалог
<precondition>имя скрипта.название функции</precondition>
описание... если есть хотя бы одна вещь, то мы получим фразу, если нет всех нет разговора ============================================================================ ПРОВЕРКА ДЕНЕГ У ГГ ============================================================================ Вариант первый(используют ПЫС)
function название функции(first_speaker, second_speaker) return first_speaker:money() >= 2000 end
в диалог
<precondition>имя скрипта.название функции</precondition>
<-----------Вариант два--------------> Использовал на ТЧ, но и в ЗП работает
function название функции() return db.actor:money()>=10000 end в диалог
<precondition>имя скрипта.название функции</precondition>
========================================================================= СПАВН ПРЕДМЕТА ========================================================================= function spawn_vintar() alife():create("Название предмета",vector():set(24.725412368774,-3.6072344779968,173.83030700684),993926,210) end
В диалог
<action>название скрипта.название функции</action>
========================================================================== МГНОВЕННАЯ СМЕРТЬ ГГ ==========================================================================
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
В диалог
<action>название скрипта.название функции</action> ==========================================================================
===================================================== ===================== ПРОВЕРКА НА ХОРОШЕЕ ЗДОРОВЬЕ ========================================================================== 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
Всё работаем!!!
|
|
|
|