Перейти к содержанию
AziatkaVictor

[CoP] Селекция артефактов

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

 

Автор: AziatkaVictor
Исходники: GitHub
Пример для ЗП: GitHub

Огромная благодарность @Ferveks. Данный скрипт был основан на его блокноте из Игра Душ: Эксельсиор.

Давным-давно, от нечего делать, я решил сделать небольшой скрипт, для селекции артефактов, основанный на GUI. Это было не легко и в итоге я не могу утверждать, что сделал все до конца, но теперь оно работает. Так как я использовать это не буду, а как-то выкидывать на помойку не хочется, то просто выложу это сюда.

При наличии вопросов о работе или еще о чем-то - пишите сюда в тему или задавайте вопрос на GitHub. Постараюсь ответить.

Реализован такой функционал:

  • Выдача рецептов селекции
  • Шанс успеха селекции
  • Информация о зонах селекции. Проверка нахождения в определённой зоне селекции, относительно каждого артефакта
  • Вывод информации об артефакте
  • Вывод информации о необходимых компонентах, их наличии или отсутствии
Спойлер

ss-04-06-23-20-32-46-zaton.jpg  ss-04-06-23-20-32-47-zaton.jpg

ss-04-06-23-20-32-49-zaton.jpg  ss-04-06-23-20-32-59-zaton.jpg

ss-04-06-23-20-32-45-zaton.jpg  ss-04-06-23-20-33-10-zaton.jpg


Спойлер

Процесс добавления достаточно прост. Для начала необходимо создать объект, используя который, мы сможем открывать диалог селекции. Делайте на своё усмотрение, но вот пример секции, который я создал в configs\misc\items.ltx:


[art_selection]:booster
$spawn 				        = "devices\art_selection"
visual				        = dynamics\devices\dev_aptechka\dev_aptechka_low.ogf
inv_name			        = st_art_selection
inv_name_short			    = st_art_selection
description			        = st_art_selection_descr
inv_weight			        = 0.5

inv_grid_width			    = 1
inv_grid_height			    = 1
inv_grid_x			        = 6
inv_grid_y			        = 14
cost				        = 2500

boost_time			        = 0
boost_health_restore		= 0
boost_radiation_restore		= 0
boost_bleeding_restore		= 0

use_sound			        = interface\inv_medkit

Далее нужно добавить вызов при использовании. Для этого мы открываем файл scripts\bind_stalker.script, ищем в нём функцию actor_binder:use_inventory_item(obj). После того как нашли, мы увидим что-то такое:


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
end

Тут уже зарегистрирован приём анабиотика. Для корректной работы нужно добавить ui_art_selection.RunDialog() и alife():create(), так как мы сделали наш предмет как booster и после использования он пропадает. По аналогии необходимо добавить эти строки:


if(s_obj) and (s_obj:section_name() == "art_selection") then
    ui_art_selection.RunDialog()
    alife():create("art_selection", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
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
        if(s_obj) and (s_obj:section_name() == "art_selection") then
            ui_art_selection.RunDialog()
            alife():create("art_selection", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
        end
    end
end

Спойлер

Все настраивается в scripts\ui_art_selection.script. Там хранится вся нужная информация.

Регистарция рецепта

Самое важное, добавление своего рецепта. Сделано всё просто. Добавляем новый блок, и можем указать такие переменные как:

  • result - результат селекции
  • items - необходимые ингредиенты
  • image - иконка (опционально)
  • places - места селкции из таблицы places_table (опционально)
  • chance - шанс селекции (опционально)
  • needRecipe - необходимость в наличии инфо (опционально)
  • recipe - название инфо, если needRecipe = true. Если не указать, то название инфо должно быть result + _info. Например: af_medusa_info (опционально)

Например, таблица рецептов может выглядеть так:


local selection_table = {
    {
        result = "af_medusa",
        items = {"wpn_pm_actor"},
        image = "ui_art_selection_items_1",
        chance = 80,
    },
    {
        result = "af_mincer_meat",
        items = {"af_fireball", "af_electra_moonlight", "af_dummy_dummy", "af_eye"},
        places = places_table.toxic,
        needRecipe = true
    },
}

Регистрация зоны селекции

Перечень зон, со своими StoryID. Нужен для указания типа зоны в рецепте селекции, ради проверки на нахождение ГГ в неё.


local places_table = {
    toxic = {"StoryID_Toxic_Zone1", "StoryID_Toxic_Zone2"},
    gravi = {"StoryID_Gravi_Zone"},
    heat = {"StoryID_Heat_Zone"},
}

 

  • Лайк 6
  • Мастер! 2
  • Жму руку 1
  • Хабар 1
  • Спасибо 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Селекция это типа варка/крафт?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Эй-йоу, Мистер Уайт!
Я сварил Мет! (плёнка)

  • Смех 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

пока квесты и сюжет прохожу sgm2/2 , а селекцию после пробовать буду, имба думаю

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Витька Kolkison хотел бы предупредить, это не полноценный мод, а лишь наработки (думаю, это заметно по "дизайну" интерфейса). Увы, но полноценно этим пользоваться, без дополнительного вмешательства, проблематично. Я не настраивал места селекции на локациях ЗП, а так же не настраивал рецепты должным образом. Это лишь небольшая демонстрация для тех, кто думает, стоит ли брать такое себе в проект.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

AziatkaVictor SGM 2.2 + Gunslinger Mod там уже вшита своя какая-то селекция ) я не пробовал ещё 123 или это твоя и есть?

 

Изменено пользователем Витька Kolkison

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
В 08.04.2023 в 20:19, AziatkaVictor сказал:

Витька Kolkison нет конечно)

Как создать вот эту зону StoryId_Toxic_Zone чтобы зашёл туда и доступна селекция?


 

Защитим мир от заразы - Зоны                   Долг.gif

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

SoDizzari просто создай рестриктор в СДК, настрой, какого размера он должен быть, и укажи у него story_id. Потом идёшь в этот конфиг и указываешь там story_id этого рестриктора. Это фича работает на основе функции xr_conditions.actor_in_zone.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
Только что, AziatkaVictor сказал:

SoDizzari просто создай рестриктор в СДК, настрой, какого размера он должен быть, и укажи у него story_id. Потом идёшь в этот конфиг и указываешь там story_id этого рестриктора. Это фича работает на основе функции xr_conditions.actor_in_zone.

Типо назвать рестриктор: Toxic_Zone и в логике прописать: [story_objext] story id = Toxic_Zone и всё?


 

Защитим мир от заразы - Зоны                   Долг.gif

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

SoDizzari называть можешь как хочешь, главное чтобы в custom data было написано:

[story_object]
story_id = restr_story_id

А так, да.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
2 часа назад, AziatkaVictor сказал:

SoDizzari называть можешь как хочешь, главное чтобы в custom data было написано:


[story_object]
story_id = restr_story_id

А так, да.

Сделал как ты сказал, но Рестриктор должен быть назван также как и стори айди!
Спасибо за помощь :)

 

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

 

Защитим мир от заразы - Зоны                   Долг.gif

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу