Я занимаюсь мелким веб дизайном (шапки, скрипты и т.д.) и мододел (улучшаю характеристики "всего"{артефакты,оружие, броня и т.д.}. Творения веб дизайна: мой сайт (этот) Мод в скором времени будет выложен.
Делюсь информацией: Решил таки создать эту тему. Дело в том что мне приходит очень много сообщений с просьбами от создания личного худа то тупых вопросов по правке элементарных конфигов(честно тупейшие вопросы бывают). По этому вот полное(почти) руководство по худам.
Итак начнёмс...
Раздел первый:файлы. Для работы над худом нам нужны следующие файлы(не обязательно все конешно) Текстуры: Папка - 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 - думаю понятно что это <center - хз что это..предполагаю что реч о точках на миникарте
__________________________________
Советы: Если вам нужно убрать текстуру - просто убираем в конфиге путь к текстуре. Если нужно убрать текст - либо убираем сам текст либо ставим а="0" Многие элементы передвигаются в связке.К примеру патроны - окно,количество и иконку можно двигать меняя координаты окна.Координаты остального подразумеваются в рамках размера окна(а не всего экрана)
Если вы хотите задать текстуре определённый размер то - пишем нужный width и height а после пишем stretch="1"
В этой секции задаются параметры артефакта, начиная от внешнего вида и заканчивая коэффициентами различных эффектов вроде вывода радиации. Сделаем копию секции, принадлежающей "Медузе", и заменим её название с af_medusa на af_romashka.
Должно выйти примерно вот так: [af_romashka]:af_base GroupControlSection = spawn_group $spawn = "artifacts\moscito romashka"
Назначение некоторых параметров, влияющих на одевшего артефакт: health_restore_speed - прирост к скорости восстановления здоровья radiation_restore_speed - прирост скорость вывода радиации satiety_restore_speed - прирост к голоду power_restore_speed - прирост к выносливости bleeding_restore_speed - прирост к скорости остановки кровотечений Создание описания и имени артефакта
Заходим в gamedata\config\text\rus и открываем файл string_table_enc_zone.xml. Добавим туда строку с названием артефакта. <string id="af-romashka"> <text>"Ромашка"</text> </string>
Теперь у артефакта есть имя, но одного его недостаточно. Нужно сделать описание. Поэтому добавим и его. <string id="enc_zone_artifact_af-romaska"> <text>Очень странный артефакт. Впервые появился в Зоне где-то в 2011 году, но толку от него - ноль. Ученые не обнаружили никакого влияния артефакта на организм носителя.</text> </string>
Все, поздравляю, вы только что создали свой первый артефакт!
Разбор системы квестов в S.T.A.L.K.E.R. Зов Припяти
Разбираем конкретно параметры:
icon - иконка квеста Пример использования: icon = ui_inGame2_Put_v_pripyat
prior - приоритет квеста Пример использования: prior = 112
storyline - флаг задания (true - сюжетное, false - несюжетное) Пример использования: storyline = true
title - название задание (id из xml) - если брать название не из xml, то в игре оно будет отображаться без пробелов Пример использования: title = zat_a9_way_gates_check_transport_workshop_name
descr - описание задания (id из xml) - если брать название не из xml, то в игре оно будет отображаться без пробелов Пример использования: descr = zat_a9_way_gates_check_transport_workshop_text
target - цель на карте (метка) Примеры использования: target =zat_a2_stalker_barmen (ID нпц, на которого будет поставлена метка) target = {+название_инфопоршня}zat_a2_stalker_barmen -- проверка инфопоршня, после которого метка будет поставлена на нпц
on_init - инфопоршень, который "включает" задание Пример использования: on_init = %+название_инфопоршня%
condlist_x -- блок условий. возможные значения complete, reversed, fail Примеры использования: condlist_0 = {+название_инфопоршня} complete - если поршень есть, задание выполнено condlist_1 = {+название_инфопоршня} reversed - если поршень есть, есть возможность повторить задание condlist_2 = {+название_инфопоршня} fail - если поршень есть, задание провалено
on_complete - действия, которые выполняются, если задание выполнено on_reversed - действия, которые выполняются, если задание провалено Примеры использования: on_complete = %=inc_faction_goodwill_to_actor(stalker:200)% -- повышаем репу у сталкеров (функция юзаются из xr_effect) on_reversed = {+название_ифопоршня} %=inc_faction_goodwill_to_actor(stalker:200)% -- повышаем репу у сталкеров, только если есть опр.инфопоршень on_complete = %+название_инфопоршня% -- выдаем инфопоршень
reward_money - денежная награда Пример использования: reward_money = 5000
Далее добавляем наши диалоги Бороде. Открываем файл character_desc_zaton.xml Находим строчку <actor_dialog>zat_a2_stalker_barmen_actor_info</actor_dialog> и под ней пишем Код <actor_dialog>vodka_quest_dialog</actor_dialog> <actor_dialog>vodka_quest_prines</actor_dialog>
Сохраняем
Инфопоршни и скриптовые функции Открываем файл info_zaton.xml и добавляем перед </game_information_portions>: Код <info_portion id="quest_vodka_give"></info_portion> <info_portion id="quest_has_vodka"></info_portion> <info_portion id="quest_vodka_done"></info_portion>
Открываем файл dialogs_zaton.script и в начало записываем: Код function give_vodka_quest() task_manager.get_task_manager():give_task("quest_vodka_give") end function is_has_vodka_borode() if db.actor:object("vodka") then return true end return false end function transfer_vodka_to_boroda(first_speaker, second_speaker) dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "vodka") end
Сохраняем
Сам квест Открываем файл tm_zaton.ltx и в конец пишем: Код [quest_vodka_give] icon = ui_inGame2_Put_v_pripyat prior = 2 storyline = false title = {=actor_has_item(vodka)}vodka_barmen_prinesti_name, vodka_barmen_naiti_name descr = vodka_barmen_descr target = {=actor_has_item(vodka)}zat_a2_stalker_barmen condlist_0 = {+quest_vodka_done} complete
Открываем файл st_quests_zaton.xml и добавляем после <string_table> Код <string id="vodka_barmen_naiti_name"> <text>Найти водку для бармена</text> </string> <string id="vodka_barmen_prinesti_name"> <text>Принести водку бармену</text> </string> <string id="vodka_barmen_descr"> <text>Бармен в тестовых целях попросил найти и принести ему 2 бутылки водки</text> </string>
создаем скрипит в папке gamedata/scripts/aln_quest
в скрипт пишим функцию ----------------------------------------------------------------------]] function spawn_item(spawn_item, pos, gv,lv) if gv==nil then gv=db.actor:game_vertex_id() end if lv==nil then lv=db.actor:level_vertex_id() end return alife():create(spawn_item, pos, lv, gv) end function remove_item_from_inventory(remove_item,npc) if npc==nil then npc=db.actor end if remove_item~=nil then --npc:mark_item_dropped(remove_item) alife():release(alife():object(remove_item:id()), true) return true end return false end ----------------------------------------------------------------------]]
скрипт готов
p.s то-что я обвожу пунктиром и квадратными скобками в скрипт это невписываем иначе игра небудет видеть нашу функцию
3. теперь создаем скрипт quest в папке gamedata/scripts
в него пишим
------------------------------------------------------------------------[[ local items_count=0 local itemin=nil function have_item_namber(itm,need_namber) local actor=db.actor items_count=0 itemin=itm actor:iterate_inventory(cheking_item,actor) if items_count>=need_namber then return true else return false end end function cheking_item(actor,item) local items=item:section() if items==itemin then items_count=items_count+1 end end function create_items(npc,section,number) for i=1,number do alife():create(section, npc:position(), npc:level_vertex_id(), npc:game_vertex_id(), npc:id()) end end local reloc_params={} local stalk function out_item_namber(itm_section,need_number) reloc_params.itm_section=itm_section reloc_params.itm_cnt=need_number reloc_params.itm_cnt_found =0 db.actor:iterate_inventory(checkout_items_count,db.actor) reloc_params.itm_cnt_found=0 if reloc_params.itm_cnt_found<=reloc_params.itm_cnt then db.actor:iterate_inventory(out_items_count,db.actor) end news_manager.relocate_item(db.actor, "out", itm_section) reloc_params={} end function relocate_item_namber(stalker,itm_section,need_number) stalk=stalker reloc_params.itm_section=itm_section reloc_params.itm_cnt=need_number reloc_params.itm_cnt_found=0 db.actor:iterate_inventory(checkout_items_count,db.actor) reloc_params.itm_cnt_found=0 if reloc_params.itm_cnt_found<=reloc_params.itm_cnt then db.actor:iterate_inventory(reloc_items_count,db.actor) end news_manager.relocate_item(db.actor, "out", itm_section) reloc_params={} end function checkout_items_count(actor,item) if item.section and item:section()==reloc_params.itm_section then reloc_params.itm_cnt_found = reloc_params.itm_cnt_found + 1 end end function reloc_items_count(actor,item) if item.section and item:section()==reloc_params.itm_section and reloc_params.itm_cnt_found<reloc_params.itm_cnt then db.actor:transfer_item(item, stalk) reloc_params.itm_cnt_found = reloc_params.itm_cnt_found + 1 end end function out_items_count(actor,item) if item.section and item:section()==reloc_params.itm_section and reloc_params.itm_cnt_found<reloc_params.itm_cnt then aln_quest.remove_item_from_inventory(item, actor) reloc_params.itm_cnt_found = reloc_params.itm_cnt_found + 1 end end
---------------------------квест волка найти динамит------------------------------ function spawn_dynamite() aln_quest.alife():create("dynamite",vector():set(106.24745178223,-7.1400456428528,2.6464221477509),407116,119) end function esc_wolf_dynamite_have() return quest.have_item_namber("dynamite",1) ~= false end function give_esc_wolf_dynamite(first_speaker, second_speaker) quest.out_item_namber("dynamite",1) end function complete_esc_wolf_quest(first_speaker, second_speaker) dialogs.relocate_money(second_speaker, 2000, "in") dialogs.relocate_item_section(second_speaker, "ammo_9x18_fmj", "in") dialogs.relocate_item_section(second_speaker, "ammo_5.45x39_fmj","in") end --------------------------------------------------------------------------]]
готово
ps корды можите неменять динамит при взятие квеста будет лежать на атп где еще шустрый сидит
в награду за квест дадут 2000 руб патроны к пм и патроны к ак
5.идем дальше
создание диалога для волка идем сюда
gamedata/config/gameplay/character_decs_escape
ищим волка и вставляем ему новые диалоги ,а точнее сылки на диалоги вотак ------------------------------------------------------------------------------------------]]
<string id="esc_wolf_dynamite_quest_0"> <text>Привет Волк работа есть для меня?</text> </string> <string id="esc_wolf_dynamite_quest_1"> <text>да как раз найдется для тебя работенка тут такое дело наши ребята нашли динамит но попути когда они тащили динамит сюда в лагерь на них бандиты на пали и динамит забрали ты немог бы вернуть динамит ребята сказали что видели что бандиты динамит всторону атп тащили, вообщем верни динамит ,а я отблагадарю. ну что согласен?</text> </string> <string id="esc_wolf_dynamite_quest_2"> <text>Хорошо попробую найти динамит</text> </string> <string id="esc_wolf_dynamite_quest_3"> <text>в другой раз</text> </string> <string id="esc_wolf_dynamite_quest_completed_0"> <text>привет Волк</text> </string> <string id="esc_wolf_dynamite_quest_completed_1"> <text>ну как нашол?</text> </string> <string id="esc_wolf_dynamite_quest_completed_2"> <text>да. нашол тяжелый немного держи</text> </string> <string id="esc_wolf_dynamite_quest_completed_3"> <text>спасибо меченый ,а вот и награда как я и обещал</text> </string> <string id="tex_esc_wolf_dynamite"> <text>Волк попросил найти динамит который украли бандиты</text> -- это запись будет отображатся в пда в кладке подробно о задании </string> -----------------------------------------------------------------]]
8.создадим инфопоршни в папке gamedata/config/gameplay/ info_l01escape
9. cоздаем историю квеста в папке gamedata/config/gameplay/storyline_info_escape
открыли пишим после тага </article>
<!--квест волка найти динамит--> <article id="tex_esc_wolf_dynamite" name="найти и вернуть динамит волку" article_type="task"> -- cылка на запись из stable_dialogs_escape мы уже написали что волк просит найти динами <texture x="200" y="900" width="100" height="100">ui\ui_icon_equipment</texture> -- определяем иконку <text>tex_esc_wolf_dynamite</text> -- текст задания </article>
В общем для этого нужно создать скрипт с названием типа ваше_название.script и нужно иметь чистый файл bind_stalker.script. Сделаем свой скрипт и запишем сюда нечто типо этого -
-- Прототип динамичеких новостей local ant_spam ={ "Слышал что на АТП с Темной Долины зомбаки ходят. Осторожнее там.", "Тимыч: Кто флудить будет тому оторву кой-чего.", "Кто нибудь знает куда Стрелок делся?", "Военные вообще оборзели! Две тысячи рублей за проход на север кордона - это не хило!", "Завелся Чак Норрис в наших местах. Бандос это с прозвищем таким. Дебил полный.", "Комбат как-то говорил что Тополь пропал. Неизвестно куда. Разминулись в подземке Агропрома", "Долг: Блин переходите на свою волну. А то запалите Свободе планы", "Свобода: Секач опять на Кота наехал. Кого-то скоро по закону Зоны на бой вызывать будут.", "Похоже мне еще в лагере сидеть. Блин долг когда я этот Сидоровичу то отдам?!" }
time_news = 0 -- переменная промежутка времени
function time_update_spam() -- функция промежутка времени local time = time_global() -- переменная времени if time_news < time then time_news = time + 30000 -- время через которое будет вызываться сообщение ваше_название.update_spam() end end
function update_spam() news_manager.send_tip(db.actor, (ant_spam[math.random(9)]), nil, nil, 30000) end
Теперь зайдем в файл bind_stalker.script и после строки
xr_sound.update_actor()
пишем
ваше_название.time_update_spam()
Теперь в игре будет через несколько секунд приходить новости. Чем больше время в строке time_news = time + 30000, тем дольше будет промежуток.
Еще можно добавлять свои новости - после строки "Мод Antdiablon freeplay 2.0 - самый крутой" ставьте запятую и пишите свой текст на новой строке, в кавычках но в конце после кавычки ставьте запятую. а если это последний текст, то не ставьте. Потом высчитывайте сколько сообщение всего и в строчке
news_manager.send_tip(db.actor, (ant_spam[math.random(9)]), nil, nil, 30000) вместо 9 ставьте соответствующее количество.
В данной теме я расскажу как заспаувнить динамический вертолёт.Также в этом уроке мы рассмотрим логику вертолёта Для спавна вертолёта потребуется: Распакованный all.spawn Распакованная игра Position Informer Итак, начнем. 1. Спавн вертолета В alife_нужная локация.ltx пишем:
[1922] ; cse_abstract properties section_name = helicopter name = pri_a28_heli_1 position = 154.740036,-2.654960,182.621597 direction = 0,-0.0252000000327826,0
; cse_alife_helicopter properties startup_animation = idle engine_sound = vehicles\helicopter\helicopter [Номер секции(если в alife_локация.ltx у вас не было других секций,ставим [1]] ; cse_abstract properties section_name = helicopter <-Секция(не менять!) name = pri_a28_heli_1 <-Уникальное имя скрипта position = 154.740036,-2.654960,182.621597 <- direction = 0,-0.0252000000327826,0 <- поворот вертолета
; cse_alife_object properties game_vertex_id = 316 <- гейм вертекс уровня distance = 0 level_vertex_id = 1216486 <- левел уровень object_flags = 0xffffffb2 custom_data = < [logic] cfg = scripts\generators\heli_boom_1.ltx <-путь к логике вертолёта END
[gen_heli_patrol_fly] <-секция пути(имя произвольно) points = p0,p1 <-сколько точек перехода p0:name = wp00 <-имя точки p0:flags = 0x1 <-флаги(не трогать тем,кто с этим не знаком) p0:position = 3.06068515777588,-0.420349597930908,-51.1655464172363 <-позиция p0:level_vertex_id = 29038 <-level vertrex/вертекс уровня p0:game_vertex_id = 934 <-game vertex/вертекс игры p0:links = p1(1) <- переход в точку 1(если нужно,что верт прилетел в одну точка и завис там,то переход не пишем,а и вторую точку)
p1:name = wp01 <- 2-ая точка p1:flags = 0x2 <-флаги p1:position = -0.443285942077637,-0.312863349914551,-48.4627227783203 <-позиция p1:game_vertex_id = 934<-level vertrex/вертекс уровня p1:level_vertex_id = 29038 <-game vertex/вертекс игры p1:links = p0(1) <-переход в точку 1
Разбор логики: [logic] active = heli_move <-активная часть логики,указывается отдельно,это лишь ссылка на [heli_move]
[heli_move] <-собственно сама активная часть path_move = gar_heli_patrol_fly <-секция патрулирования вертолёта,что прописана в way_локация.ltx max_velocity = 0.5 <- максимальная скорость engine_sound = true <-включен ли звук двигателя immortal = false <- бессмертие вертолёта combat_ignore = false <-игнорирование любых обьетов,наносящих урон вертолёту или считающихся для вертолёта опасным dont_change_job = false <-не сменять работу(Оо)
enemy = 3333 min_mgun_attack_dist = 8 <-минимальная дистанция использования пулемёта max_mgun_attack_dist = 70 <-максимальная дистанция использования пулемёта min_rocket_attack_dist = 25 <-минимальная дистанция использования ракет max_rocket_attack_dist = 70 <-максимальная дистанция использования ракет use_rocket = true <-использовать ли ракеты use_mgun = true <-использовать ли миниган upd_vis = 3 <-не менять stop_fire = true <- останавливать ли огонь или стрелять на поражение fire_trail = false <линейное отставание бомбы(полосы дыма за ракетой,не включать на динамике,игра заглючит) invulnerable = false <-неуязвимость mute = false <-не атаковать кого-либо.
Примечание: В ЗП есть определённые логики вертолёта,я не помню что это за логики и как назыаются но пишутся в: path_move = gar_heli_patrol_fly|a=анимация Также можно прописать звук: s=звук.
Спасибо за внимание.Если будут проблемы,то постараюсь ответить в этой теме.Просьба не копировать это на сталкер вики
Вроде все должно пахать Если надо,то создам тему про "Обстрел NPCами корпуса вертолёта","Спавн и логика БТР`а"