Перейти к контенту

Уроки по модостроению


Рекомендуемые сообщения

Как изменить эффекты при нахождении в оазисе [ЗП]

В скрипте

xr_effects (по default) на строке 2688 есть функция:
Она и отвечает за эффекты в оазисе.
function oasis_heal()
    local d_health = 0.005
    local d_power = 0.01
    local d_bleeding = 0.05
    local d_radiation = -0.05
    if(db.actor.health<1) then
        db.actor.health = d_health
    end
    if(db.actor.power<1) then
        db.actor.power = d_power
    end
    if(db.actor.radiation>0) then
        db.actor.radiation = d_radiation
    end
    if(db.actor.bleeding>0) then
        db.actor.bleeding = d_bleeding
    end
        db.actor.satiety = 0.01
end

например, так:

function oasis_heal()
    local d_health = 0.005
    local d_power = 0.01
    local d_bleeding = 0.05
    local d_radiation = 0.05
    if(db.actor.health<1) then
        db.actor.health = d_health
    end
    if(db.actor.power<1) then
        db.actor.power = d_power
    end
    if(db.actor.radiation>0) then
        db.actor.radiation = d_radiation
    end
    if(db.actor.bleeding>0) then
        db.actor.bleeding = d_bleeding
    end
        db.actor.satiety = 0.01
end

теперь находясь в оазисе, радиация будет прибавляться.


Как сделать изношенное снаряжение в начале игры ЗП

В скрипте xr_effects есть такая функция:
(Находится она на строке: 2787)
Она и отвечает за изношенность предметов.

function damage_actor_items_on_start(actor, npc)
    local actor = db.actor

    local obj = actor:object("helm_respirator")
    if obj ~= nil then
        obj:set_condition(0.8)
    end

    obj = actor:object("stalker_outfit")
    if obj ~= nil then
        obj:set_condition(0.76)
    end

    obj = actor:object("wpn_pm_actor")
    if obj ~= nil then
        obj:set_condition(0.9)
    end

    obj = actor:object("wpn_ak74u")
    if obj ~= nil then
        obj:set_condition(0.7)
    end

end

Если вы добавили в начало игры новое оружие, можно расширить функцию например так:

function damage_actor_items_on_start(actor, npc)
    local actor = db.actor

    local obj = actor:object("helm_respirator")
    if obj ~= nil then
        obj:set_condition(0.8)
    end

    obj = actor:object("stalker_outfit")
    if obj ~= nil then
        obj:set_condition(0.76)
    end

    obj = actor:object("wpn_pm_actor")
    if obj ~= nil then
        obj:set_condition(0.9)
    end

    obj = actor:object("wpn_ak74u")
    if obj ~= nil then
        obj:set_condition(0.7)
    end

    obj = actor:object("wpn_vintorez")
    if obj ~= nil then
        obj:set_condition(0.7)
    end

end

Теперь добавленное оружие тоже будет немного повреждено.

 

Изменено пользователем World_Stalker
  • Полезно 1
Ссылка на комментарий

[ЧН] Спавн сквадов и их параметры

Все параметры вытащил из

sim_squad_scripted.script, итак следующие параметры можно указать в ltx-файлах squad_descr_*
[squad_name] ;Имя сквада
auto_id = true/false ;Автоматический выбор командира
faction = army ;группировка
npc = npc_1, npc_2, npc_3, npc_4, npc_5 ;НПС
target_smart = smart_terrain_name ;Смарт в который пойдет отряд
on_death = %+infoportion% ;Инфа после смерти отряда
attack_power = 400 ;Число прибавляеющееся при атаке на смарт(чем больше тем лучше)
invulnerability = true/false ;Бессмертие
relationship = friend/enemy/neutral ;Отношение к ГГ
sympathy = 0.1 ;Симпатия
show_spot = true/false ;Показывать отметку на карте
always_walk = true/false ;Состояние в котором передвигается отряд
spawn_point = spawn_point_smart ;Спавн точка смарта

 

 

Изменено пользователем World_Stalker
  • Нравится 4
Ссылка на комментарий

Внесу и свою лепту которую все знают кроме новичков разве что.

Лезем в файл

gamedata\configs\weapons\weapons.ltx
под секцией [ammo_base] есть строка:
;belt = true;

меняем её на это:

belt = true

И можем вешать патроны на пояс. Когда там нет игра автоматом берёт из рюкзака.
В зп на версии 1.6.00 при смене автоматных патронов на патроны для дробовика случался вылет stace trase. Но вроде бы только один раз.

 

Изменено пользователем World_Stalker
Ссылка на комментарий

Язык программирования Lua. Учебник для начинающих.
Скачать в формате .txt

Взято с сайта:
http://big.vip-zone.su/doc/devel/lua.xml

Изменено пользователем World_Stalker
Ссылка на комментарий

Ставим новые метки в ПДА [ЗП]
Дело было как ни странно, днём... Появилась необходимость поставить метки переходов с одной локации на другую - покопавшись малость в теме "ковырялки ЗП" увидел, что до меня были такие попытки создания меток, но по-крупному копаться в скриптах я не люблю по причине неопытности в скриптах - решил сделать сам.
 
Для начала идём в pda.script:
После таблицы под названием sleep_zones_tbl добавим ещё одну, должно получиться так:

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 = "escape_podval_sr_sleep_id",    hint = "st_ui_pda_sleep_place"},
    {target = "garbage_base_sr_sleep_1_id",    hint = "st_ui_pda_sleep_place"},
    {target = "garbage_base_sr_sleep_2_id",    hint = "st_ui_pda_sleep_place"},
    {target = "garbage_dolg_zastava_sr_sleep_id",    hint = "st_ui_pda_sleep_place"},
}       -- это таблица отметок спального места, её мы не трогаем
 
local level_changer_tbl =
{
    {target = "perehod_darks_esc",        hint="perehod_darks_esc_name"},
    {target = "id_перехода",                    hint="надпись над переходом"},
}     --А это наша новая таблица, содержащие переходы и надписи над ними

 

 
После этой добавки идём в самый конец файла и добавляем саму функцию показания перехода

function fill_level_changers()
    for k,v in pairs(level_changer_tbl) do
        local obj_id = get_story_object_id(v.target)
        if(obj_id) then
            level.map_add_object_spot(obj_id, "level_changer_up", v.hint)
        end
    end
end

 


Где, ui_inGame2_icon_level_changer - имя значка нашего перехода, можно поставить из оригинальной игры, но я создам свой
Итак, теперь нам нужно создать вызов нашей функции - далеко ходить не будем (ибо лень :russian_ru: ): находим функцию fill_primary_objects и добавляем вызов нашей: 

function fill_primary_objects()
    for k,v in pairs(primary_objects_tbl) do
        local obj_id = get_story_object_id(v.target)
        if(obj_id) then
            level.map_add_object_spot(obj_id, "primary_object", v.hint)
        end
    end
    change_anomalies_names()
    fill_sleep_zones()
    fill_level_changers() --Вот вызов нашей функции
end

 


Со скриптами мы закончили, теперь нужно создать наш переход и текст к нему.
Для того, чтобы наш переход отображался нужно придать ему id, для этого создадим его секцию в all.spawn, но с одной добавкой:

[8057]
; cse_abstract properties
section_name = level_changer
name = perehod_darks_esc
position = -618.825927,-2.623994,-380.298706
direction = 0,0,0
cse_abstract__unk1_h16 = 0x1
; cse_alife_object properties
game_vertex_id = 1789
distance = 0
level_vertex_id = 404
object_flags = 0xffffff3e
custom_data = <<END ;Вот тут и нужно добавить его id, а далее - как раньше
[story_object]
story_id = perehod_darks_esc
END

; cse_shape properties
shapes = shape0
shape0:type = sphere
shape0:offset = 0,0,0
shape0:radius = 6
; cse_alife_space_restrictor properties
restrictor_type = 3
; cse_alife_level_changer properties
dest_game_vertex_id = 1407
dest_level_vertex_id = 593260
dest_position = 363.344421,15.172136,-39.722797
dest_direction = 0,0,0
dest_level_name = l01_escape
dest_graph_point = start_actor_01
silent_mode = 1
; se_level_changer properties

 


Идём в st_land_names.xml и добавляем в конец файла описания наших переходов:

<!-- Переходы -->
<string id="perehod_darks_esc_name">
        <text>На Кордон</text>
</string>
<!-- Переходы -->

 


 
1733042.jpg - Результат
 
Собственно всё, таким образом можно создать не только отметки переходов, но и для чего-другого с разными иконками (в данном случае, ну никак иконки "спального места" и "интересного места" под переход не подходили) - допустим, для любителей "читерки", можно добавить отметку к укрытиям (добавив в секцию укрытия в all.spawn строки присвоения id) или чего-другого, это зависит от потребности.

Изменено пользователем World_Stalker
  • Нравится 2

Работы на Artstationhttps://www.artstation.com/artist/stalker_lom

Ссылка на комментарий

Создание инвентарного комплекса в чистом ЗП

Перед тем, как начать урок, я хочу сказать, что скриптовой частью я обязан товарищу Ховану и Николаю Болтову. Именно благодаря их скриптам я нашел способ сделать подобную вещь! Огромное им спасибо!
А теперь перейдем к уроку.

Файлы, которые нам потребуются:
- configs/misc/items.ltx
- configs/text/rus/st_items_equipment.ltx
- scripts/_g.script
- scripts/bind_stalker.script
- scripts/my_callbacks.script

Возможно, вы когда-нибудь задумывались над вопросом создания предмета, из при использовании которого в инвентарь будут выпадать сразу несколько других, как, например, универсальный медкомплект. Долго думая, я понял, что такого эффекта можно достичь используя коллбеки на использовании предметов.
Что такое "коллбек"? Если коротко, - это что-то в роде скрипта инфопорции. Однако, коллбек может работать как единожды, так и постоянно: при подборе предметов, при их использовании, при выстреле, при попадению по нпс и так далее. Нас интересует коллбек использования предмета, который будет работать постоянно.

1. Откроем items.ltx и скопируем секцию какого-нибудь бустера. Вставим новую секцию где-нибудь в это-же файле.
2. Настроим его так, как нам этого захочется.
[medkit_complex]:booster
$spawn     = "food and drugs\medkit_complex"
visual    = dynamics\devices\dev_aptechka\dev_aptechka_mid.ogf
description   = st_medkit_complex_desc
inv_name   = st_medkit_complex
inv_name_short          = st_medkit_complex
inv_weight   = 1.8
inv_grid_width     = 2
inv_grid_height    = 2
inv_grid_x         = 10
inv_grid_y         = 27
cost    = 30000
attach_angle_offset  = 0.440521, 1.378287, -0.644026
attach_position_offset         = 0.104196, -0.010821, 0.076969
attach_bone_name  = bip01_r_hand
auto_attach   = false
bone_name   = bip01_r_hand
position_offset   = 0.0,0.0,0.0
angle_offset   = 1.570790,1.570790,3.92699
use_sound   = interface\inv_medkit
Долго здесь зацикливаться не будем. Все элементарно. Могу только сказать, что при использовании будет проигрываться звук аптечки, а модель взяли армейской аптечки.
3. В st_items_equipment.ltx создаем описание и название предмета
<string id="st_medkit_complex">
                     <text>Универсальный медкомплект</text>
                    </string>
                    <string id="st_medkit_complex_desc">
                     <text>Специальный медкомплект, разработанный для спецслужб в Зоне. Включает в себя все основные медикаменты.</text>
                    </string>
На этом с конфигами все.
4. Руководствуясь материалом, взятым из сборника модостроения от Хована, мы создаем файл my_callbacks.script в папке scripts.
5. Наполняем его следующим образом
function on_use_item(sect)
--Переменные
local actor=db.actor
local item_name=sect:section()
local actor_pos=db.actor:position()
local active_slot=db.actor:active_slot()
local active_item=db.actor:active_item()
local pistol_in_slot=db.actor:item_in_slot(2)
local rifle_in_slot=db.actor:item_in_slot(3)
local outfit_in_slot=db.actor:item_in_slot(7)
local helm_in_slot=db.actor:item_in_slot(12)
--Коллбеки
if item_name=="medkit_complex" then
give_object_to_actor("drug_anabiotic")
give_object_to_actor("antirad")
give_object_to_actor("bandage")
give_object_to_actor("drug_radioprotector")
give_object_to_actor("drug_antidot")
give_object_to_actor("drug_psy_blockade")
give_object_to_actor("drug_coagulant")
give_object_to_actor("drug_booster")
end
end
give_object_to_actor - как-раз и есть скрипт выдачи ГГ предмета, опираясь на коллбек. В скобках название предмета.
Вообщем, продолжаем так-же, и добавляем, что хотим. Надеюсь, принцип ясен.
6. Зарегистрируем наш файл в bind_stalker.script. Там находим функцию function actor_binder:use_inventory_item(obj) и под вторым end прописываем
if obj~=nil then
                       my_callbacks.on_use_item(obj)
                       end
В целом выглядит так:
function actor_binder:use_inventory_item(obj)
                    if(obj) then
                     local s_obj = alife():object(obj:id())
                     if(s_obj) and (s_obj:section_name()=="drug_anabiotic") then
                      xr_effects.disable_ui_only(db.actor, nil)
                      level.add_cam_effector("camera_effects\\surge_02.anm", 10, false, "bind_stalker.anabiotic_callback")
                      level.add_pp_effector("surge_fade.ppe", 11, false)
                      give_info("anabiotic_in_process")
                      _G.mus_vol = get_console():get_float("snd_volume_music")
                      _G.amb_vol = get_console():get_float("snd_volume_eff")
                      get_console():execute("snd_volume_music 0")
                      get_console():execute("snd_volume_eff 0")
                     end
                    end
                    if obj~=nil then
                      my_callbacks.on_use_item(obj)
                       end
end
7. Осталось добавить глобальную функцию give_object_to_actor в _g.script.
Внизу пишем:
-- 'Создание предмета в рюкзаке ГГ.
function give_object_to_actor(obj,count)
                     if count==nil then count=1 end
                     for i=1, count do
                        alife():create(obj,db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())
                     end
end
На этом урок заканчивается. Осталось только прописать пак ГГ и протестировать!
 
 

Изменено пользователем FantomICW
  • Спасибо 2
  • Нравится 2

c57d8f0c86.png

Ссылка на комментарий

Добавление новых кнопок в ПДА (ЗП)

Примечание: Сей "фокус" можно проделывать только с правками от проекта X-Ray extensions, а конкретно, с правками ПДА.

 

Итак, всё-таки захотели мы создать вкладку в ПДА. Но не знаем как. Проблемы, согласен. Вот некоторая часть решения этой проблемы:

1. Заходим в pda.xml, ищем таблицу:

<tab x="443" y="57" width="468" height="27"><button x="0" y="0" width="172" height="27" id="eptTasks" hint="pda_btn_quests_hint" frame_mode="0">    <text align="c" vert_align="c" x="0" y="0" width="157" height="27" font="letterica16">pda_btn_quests</text>    <texture>ui_inGame2_pda_button</texture>    <text_color>        <t r="255" g="255" b="255"/>        <d r="255" g="255" b="255"/>        <e r="200" g="200" b="200"/>        <h r="170" g="170" b="170"/>     </text_color></button><button x="148" y="0" width="172" height="27" id="eptRanking" hint="pda_btn_ranking_hint" frame_mode="0">    <text align="c" vert_align="c" x="0" y="0" font="letterica16">pda_btn_ranking</text>    <texture>ui_inGame2_pda_button</texture>    <text_color>        <t r="255" g="255" b="255"/>        <d r="255" g="255" b="255"/>        <e r="200" g="200" b="200"/>        <h r="170" g="170" b="170"/>    </text_color></button><button x="296" y="0" width="172" height="27" id="eptLogs" hint="pda_btn_logs_hint" frame_mode="0">    <text align="c" vert_align="c" x="0" y="0" font="letterica16">pda_btn_logs</text>    <texture>ui_inGame2_pda_button</texture>    <text_color>        <t r="255" g="255" b="255"/>        <d r="255" g="255" b="255"/>        <e r="200" g="200" b="200"/>        <h r="170" g="170" b="170"/>    </text_color></button></tab>

2. Для лучшего понимания, разберём это дело по блокам:

Это блок является "колбой", в которой находятся кнопки в ПДА:

<tab x="Смещение колбы по Х" y="Смещение колбы по У" width="Ширина колбы" height="Высота колбы"></tab>

А этот блок как раз и является кнопкой:

<button x="Смещение кнопки по Х" y="Смещение кнопки по У" width="Ширина" height="Высота" id="Уникальное Айди (id) кнопки" hint="Подсказка, всплывающая при наведении на кнопку" frame_mode="0">    <text align="c" vert_align="c" x="0" y="0" font="letterica16">Ссылка на текст-описание кнопки</text>    <texture>Имя текстуры кнопки</texture>    <text_color> <!-- Цветовые настройки текста в кнопке -->        <t r="255" g="255" b="255"/>        <d r="255" g="255" b="255"/>        <e r="200" g="200" b="200"/>        <h r="170" g="170" b="170"/>    </text_color></button>

3. А теперь приступим к созданию новой кнопки:

 

В колбе, содержащей кнопки, нужно изменить параметр "Смещения по Х", отняв от значения число, равное значению "Смещения кнопки по Х" от ВТОРОЙ кнопки:

<tab x="296" y="57" width="468" height="27"></tab>

А так же, нужно к параметру "width="468"" (и последующему значению, если добавляете больше одной кнопки) прибавить число 172, которое равно ширине кнопки. Первый пункт делается для того, чтобы новая кнопка не "налезала" на другие части ПДА (Часы, другие кнопки и т.п.), а второй, чтобы кнопка была в "колбе" и была активной, то есть, доступной для нажимания.

Делается это для того, чтобы новая кнопка не "налезала" на другие части ПДА (Часы, другие кнопки и т.п.).

 

Далее, создадим саму кнопку (в данном случае для энциклопедии):

<button x="444" y="0" width="172" height="27" id="eptEncyclopedia" hint="pda_btn_encyclopedia_hint" frame_mode="0">    <text align="c" vert_align="c" x="0" y="0" font="letterica16">pda_btn_encyclopedia</text>    <texture>ui_inGame2_pda_button</texture>    <text_color>        <t r="255" g="255" b="255"/>        <d r="255" g="255" b="255"/>        <e r="200" g="200" b="200"/>        <h r="170" g="170" b="170"/>     </text_color></button>

Всё, кнопка создана и функционирует, её название некоректно отображается ("pda_btn_encyclopedia" вместо "Энциклопедия"), исправим это.

4. Идём в файл configs\text\rus\ui_st_pda.xml и добавим две секции в самый конец:

<string id="pda_btn_encyclopedia">    <text>Энциклопедия</text></string><string id="pda_btn_encyclopedia_hint">    <text>Открыть энциклопедию</text></string>

(Здесь, для энциклопедии, а вам нужно вписать ссылку на свою кнопку и её название по образцу).

Всё, теперь кнопка работает, даже отображается корректно, но не открывает новый раздел: когда нажимаем на неё, то перед нами остаётся предыдущая активная вкладка, хоть и наша новая кнопка активна.

Вот объяснение этого явления от тов. @Malandrinus:

 

Текущее содержимое окна при активации свой кнопки не убирается, поэтому придётся закрывать его своим содержимым с помощью помещения диалога поверх окна. К сожалению, получение текущего окна в ЧН и ЗП стало невозможно и пока решения этой проблемы не видно.

Так что новой вкладки мы не получим - только кнопочка. Даже не расскажу, как это окно сделать, т.к. я пробовал и у меня, пока, ничего не вышло. Будем пытаться, а пока - всё.

P.S. Вот так это будет выглядеть:

2082991.jpg

 

P.P.S. Добавлена информация, из за отсутствия которой не функционировала кнопка.

Изменено пользователем ColR_iT

Работы на Artstationhttps://www.artstation.com/artist/stalker_lom

Ссылка на комментарий
Файлы для работы:
Из распакованного all.spawn'а:
alife_локация.ltx

А также скрипты из gamedata\scripts :
pda.script
xr_effects.scripts


Приступим:
1) Открываем alife_локация и добавляем секцию:
[1867] ; номер секции
; cse_abstract properties
section_name = space_restrictor
name = ваше_название_места
position = -180.277893066406,9.41139984130859,77.5603179931641 ;нужная позиция (в данном случае - домик в Изумрудном)
direction = 0,0,0

; cse_alife_object properties
level_vertex_id=1233171 ; левел_вертекс
game_vertex_id=13 ; гейм_вертекс
distance = 9.09999942779541
object_flags = 0xffffff2e
custom_data = <[story_object]
story_id = ваше_название_места_id

[logic]
cfg = scripts\sr_sleep.ltx
END

; cse_shape properties
shapes = shape0,shape1
shape0:type = box
shape0:axis_x = 3.85299897193909,0,0
shape0:axis_y = 0,2.51200008392334,0
shape0:axis_z = 0,0,6.23259878158569
shape0:offset = 0,0,0
shape1:type = box
shape1:axis_x = 3.16719889640808,0,0
shape1:axis_y = 0,2.51200008392334,0
shape1:axis_z = 0,0,4.87539911270142
shape1:offset = -3.29999589920044,0,-0.199996992945671

; cse_alife_space_restrictor properties
restrictor_type = 3

Закрываем.

 

2) Заходим в pda.script, ищем:

{
{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 = "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"
}

Всё, можно запускать игру и проверять!

 

Изменено пользователем World_Stalker
  • Спасибо 2
  • Полезно 1
Ссылка на комментарий

Создание энциклопедии для ПДА в ЗП.
Примечание: Аналогично предыдущему уроку, энциклопедию реализовать можно только при помощи проекта X-Ray extensions. Для того, чтобы кнопка энциклопедии появилась, нужно выполнить мой предыдущий урок "Добавление новых кнопок в ПДА (ЗП)".
Ссылка на готовую энциклопедию+видеодемонстрация:  http://rghost.ru/47774542

 

Как мы уже знаем из слов тов. malandrinus, "родные" для ПДА вкладки нам нужно будет закрывать собственной. Для этого нам нужен свой GUI и нам нужна "ловля" инфопоршня при открытии вкладки. Мастерить велосипед самому мне не понравилось: хоть уроки по GUI есть, но мне показалось, что с моим опытом я могу сделать только несколько окошечек, не более. Про вкладку в ПДА, которая соответствовала бы стилю нашего электронного друга я вообще даже не мечтал, поэтому взял наработки тов.

DEXXX (записная книжка в ЧН) и Geonezis (Энциклопедия оружия, на основе предыдущей работы).

 

 

Скачиваем готовую энциклопедию, там есть пометки, для понимания, как это всё работает, тут объясню чуть подробней.

 

Адаптация:

С другими модами (и с оригиналом) конфликтуют только два скрипта: _g.script и bind_stalker.script. В _g.script добавлены глобальные функции:



function run_gui(gui, close_inv) --Функция для запуска GUI, в нашем случае, энциклопедии
    if close_inv == true then
        gui:ShowDialog(true)
        game_hide_menu()
        level.show_weapon(false)
    else 
	    gui:ShowDialog(true)
    end
end
function GetString(id) --Функция для инициализации имён
	if not(id) then return "" end
	return game.translate_string(id)
end

А в bind_stalker.script добавлен вызов скрипта, который отлавливает инфопоршень при открытии вкладки энциклопедии:



function actor_binder:update(delta)
gui_callbacks.on_info() --Вызов нашего "Ловчего поршней"
object_binder.update(self, delta)
...

Всё, адаптация пройдена - должна функционировать.

 

А теперь - как этой с энциклопедией работать.

Допустим, мы решили добавить нового мутанта - Тарк (Tark). Делается это так:

Добавляем этого мутанта в таблицу мутантов, что в скрипте gui_main.script:



local pda_enc_mutants={
    "Mutant_boar",
    "Flesh",
    "Pseudo_flesh",
"Tark", --Вот он
"Bloodsucker",
...

Теперь, от выбранного нами имени будет зависеть, как будет называться текстура-иконка, текст с описанием, название мутанта на "человеческом" языке (а не на машинном) и и название инфопоршня, при получении которого мы получим статью в энциклопедию.

Текстура должна иметь следующее имя: ui_enc_#Имя мутанта# .

Текст с описанием: enc_#Имя мутанта#.

Название будет равно Имени мутанта.
А инфопоршень будет "величаться": #Имя мутанта#_info.

Для лучшей ориентации и унификации, подобная структура, описанная выше, будет актуальна и для мутанта и для группировок и для всего остального. Думаю, так будет лучше.

Как я говорил ранее, инфопоршень нужно выдавать через что-либо: диалоги, награды за задания, "отловы" на то, что вы кого-то убили, либо некоторая вероятность получения поршня при обыске трупов.

Парт-текстура, по умолчанию, читается из файла ui_pda_encyclopedia.dds. Если хотим добавить иконку, то нужно вставить в файл иконку (по умолчанию, она должна быть 165 на 107 пикселей, иначе будет растянута\сплющена), измерить её координаты по аналогии с прудыдущими и задать имя, как я уже описал выше.

Описание и название указывается в фале configs\text\rus\st_notepad.xml. В принципе, можно вставить в другой файл, но лучше соблюдать порядок - вам же будет лучше.

 

Всё, на этом я удаляюсь - пользуйтесь и указывайте авторов. Доброй Зоны, сталкеры.

 

  • Спасибо 2
  • Нравится 2

Работы на Artstationhttps://www.artstation.com/artist/stalker_lom

Ссылка на комментарий

Небольшой пак уроков от меня (всего два урока, позже будут еще). Оба урока в формате .doc.

• Добавление абсолютно новых ящиков на классе inventory_box

• Показываем состояние здоровья ГГ в процентах

Надеюсь, они окажутся полезными.

Скачать : http://rghost.ru/48034494

Изменено пользователем World_Stalker
  • Нравится 3

AWRP : Re - Load 0.2 ©

Ссылка на комментарий

Это не урок, просто небольшие памятки по некоторым вещам, которые мне были нужны.

Вся информация взята из оригинальных файлов ТЧ.

 

Настройки костей у динамического источника света

166de793236328822603d692e578fe1cb0c28716

 

Настройки комментариев у звуков монстров (в различных состояниях)

dc2ce81751c9b1c96bbe16656d57535cb0c28716

 

Конечно, это все несложно выяснить самому, но иной раз надоест все это запоминать или куда-то записывать...

 

З.Ы. такое вообще надо бы оформить в таблицу, но мне было лень это делать, поэтому как есть :)

Изменено пользователем Shadows
  • Нравится 4
Ссылка на комментарий

Отключение интро-ролика, и последующий его запуск.

Примечание: Теоретически это должно работать на всех частях сталкера, но я буду показывать на примере Чистого неба.

 

Итак, начнем. Нам требуется отключить интро-ролик после начала новой игры. Проблема  в том, что запуск ролика движковый, поэтому придется изощряться. Находим в файле configs/ui/ui_movies.xml секцию "intro_game". И приводим ее к такому виду:

<intro_game>
<global_wnd x="0" y="0" width="1024" height="768">
<auto_static x="0" y="0" width="1024" height="768" stretch="1">
<texture>intro\intro_back</texture>
</auto_static>
</global_wnd>


<item type="video">
<sound>$no_sound.ogg</sound>
<delay>0</delay>
<pause_state>off</pause_state>
       <function_on_stop>xr_effects.darkness</function_on_stop>
<video_wnd x="0" y="0" width="1024" height="768" stretch="1">
<texture x="0" y="1" width="1280" height="954">intro\intro_back</texture>
</video_wnd>
</item>




</intro_game>

 

 

 

Первая часть работы сделана. Теперь при начале новой игры интро-ролика не будет. А что если нам надо его запустить впоследствии? Для этого создаем в этом же файле новую секцию, intro_game2, к примеру. И пишем в ней:

<intro_game2>
<play_each_item>1</play_each_item>
<global_wnd x="0" y="0" width="1024" height="768">
<_auto_static x="0" y="0" width="1024" height="768" stretch="1">
<window_name>back</window_name> 
<texture>intro\intro_back</texture> 
</_auto_static>
</global_wnd> 
<item type="video">
       <sound>characters_voice\scenario\video\intro</sound>
       <pause_state>on</pause_state>
       <function_on_stop>xr_effects.start_marsh_intro</function_on_stop>
       <video_wnd x="0" y="0" width="1024" height="768" stretch="1">
         <texture x="1" y="1" width="628" height="358">intro\intro_half</texture>
          </video_wnd>
          
          <background x="0" y="0" width="1024" height="768" stretch="1">
            <texture>intro\intro_back</texture>
          </background>
        </item>
<item type="image">
  <length_sec>5</length_sec>
<pause_state>off</pause_state>
<main_wnd>
<auto_static start_time="0" length_sec="5"  x="0" y="0" width="1230" height="768" light_anim="intro_1" light_anim_cyclic="0" la_alpha="1" la_texture="1" stretch="1">
<window_name>w1</window_name>
<texture>intro\intro_back</texture>
</auto_static>
</main_wnd>
</item>
</intro_game2>

 

 

Обратите внимание на поле:

<function_on_stop>xr_effects.start_marsh_intro</function_on_stop>

Здесь указывается функция, которая будет запущена по истечению туториала.

Но мы всего лишь создали новый туториал, теперь его надо запустить. Для удобства можно поместить функцию в xr_effects.script 

function go_intro()
  game.start_tutorial("intro_game2")
end

Дальше остается только запустить эту функцию, как это сделать - выбор на ваше усмотрение.

 

Изменено пользователем World_Stalker
  • Нравится 3
Ссылка на комментарий

Так как я начинающий модостроитель, но всё же поделюсь кое-каким опытом.

Когда добавляете новую функцию с приёмом-отдачей, то всегда пишите функцию отдачи первой. Дело в том, что Меченому-Стрелку никто в Зоне не верит и сначала все требуют нужный кому либо предмет.


Сначала я не понимал, почему у меня не срабатывает функция. Но я вовремя вспомнил, что в солянке сначала ГГ отдаёт что-либо, а потом получает награду. Попробовал функцию отдачи прописать первой и - вауля, скрипт срабатывает.

 

Может быть, кому нибудь пригодится.

Изменено пользователем World_Stalker
  • Сомнительно 1

Весёлые люди - это не те, кто постоянно весёлые,  а те, кто веселится даже в самых худших ситуациях.  

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...