NAZWA: Selekcja artefaktów [CoP]
TWÓRCA: @AziatkaVictor
OPIS:
Spoiler
Ogromne podziękowania dla: @Ferveks Skrypt został stworzony na podstawie notatnika z Gra Dusz - Excelsior.
Dawno temu, nie mając nic do roboty, twórca postanowił zrobić mały skrypt do selekcji artefaktów na podstawie GUI. Nie było łatwo i nie można powiedzieć, że wszystko zostało zrobione, ale teraz działa. Ponieważ twórca nie będzie z niego korzystać, a nie chce go wyrzucać do kosza, to postanowił więc udostępnić.
Jeśli masz pytania dotyczące działania lub czegoś innego - napisz w temacie na ap-pro lub zadaj pytanie na GitHub.
Zrealizowano takie funkcje:
- Wydawanie receptów selekcji
- Szansa sukcesu selekcji
- Informacja o strefach selekcji. Sprawdzanie obecności w określonej strefie selekcji dla każdego artefaktu
- Wyświetlenie informacji o artefakcie
- Wyświetlenie informacji o obowiązkowych komponentach, ich braku lub posiadania
Jak dodać:
Spoiler
Proces dodawania jest dość prosty. Najpierw musimy utworzyć obiekt, za pomocą którego możemy otworzyć okno wyboru. Rób, jak chcesz. Oto przykładowa sekcja w 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
Następnie musisz dodać wywołanie przy użyciu. W tym celu otwieramy plik scripts\bind_stalker.script, szukamy w nim funkcji actor_binder:use_inventory_item(obj). Po znalezieniu zobaczymy coś takiego:
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
Istnieje już zarejestrowane przyjmowanie antybiotyków. Do poprawnego działania należy dodać ui_art_selection.RunDialog() i alife():create(), gdyż zrobiliśmy nasz przedmiot jako booster i po użyciu znika. Analogicznie musisz dodać te linie:
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
W rezultacie otrzymujemy to:
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
Dodanie recept i struktura:
Spoiler
Wszystko jest konfigurowane w scripts\ui_art_selection.script. Wszystkie niezbędne informacje są tam przechowywane.
Rejestracja recepty
Najważniejsze, dodanie swojej własnej recepty. Wszystko jest proste. Dodajemy nowy blok i możemy określić zmienne takie jak:
- result - efekt selekcji
- items - obowiązkowe składniki
- image - ikonka (opcjonalnie)
- places - miejsca selekcji z tablicy places_table (opcjonalnie)
- chance - szansa selekcji (opcjonalnie)
- needRecipe - obowiązek posiadania informacji (opcjonalnie)
- recipe - nazwa informacji, jeśli needRecipe = true. Jeśli nie wskazywać, to nazwa infy powinna być result + _info. Np.: af_medusa_info (opcjonalnie)
Na przykład tabela recept może wyglądać tak:
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
},
}
Rejestracja obszaru selekcji
Lista stref wraz z ich StoryID. Potrzebne do wskazania rodzaju strefy w recepcie selekcji, w celu sprawdzenia obecności w niej GG.
local places_table = {
toxic = {"StoryID_Toxic_Zone1", "StoryID_Toxic_Zone2"},
gravi = {"StoryID_Gravi_Zone"},
heat = {"StoryID_Heat_Zone"},
}
SCREENY:
LINKI:
Spoiler
Kody źródłowe: https://github.com/AziatkaVictor/Arts-Selection
Przykład dla ZP: https://github.com/AziatkaVictor/Arts-Selection/releases/tag/example
ŹRÓDŁO:
https://ap-pro.ru/forums/topic/4267-cop-selekciya-artefaktov/





