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

Скриптование


Svoboда

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

Привет, нужна помощь, я в скриптах пока не особо разбираюсь, поэтому хотелось бы спросить у знающих.
Нашёл личный дневник для зп (тык)
Это типа дневник с записями и в нём есть такая проблема, что когда записей становится больше 9, то начиная от 10  и до 19 записи у них используется описание от первой записи, следовательно, у 20-29 описание от второй записи.
И я вот думаю, что проблема в скрипте, но в них я не очень разбираюсь вот сам скрипт:

Скрытый текст
local list_of_pages = {}
local list_of_note     = {}
local note_of_pages = {}
local pages_list     = {}
local diary_ini = ini_file("misc\\diary_records.ltx")

function give_diary_record(record_name)
    if not diary_ini:section_exist(record_name)
    or note_of_pages[record_name] ~= nil then
        return
    end
    local diary_text = diary_ini:r_string(record_name, "text")
    local diary_page = diary_ini:r_string(record_name, "page")
    if not list_of_pages[diary_page] then
        list_of_pages[diary_page] = {}
        table.insert(pages_list, diary_page)
    end
    note_of_pages[record_name] = {}
    note_of_pages[record_name].text = diary_text
    table.insert(list_of_pages[diary_page], record_name)
    table.insert(list_of_note, record_name)
end

function get_pages_list()
    local count = diary_ini:line_count("records") - 1
    local info, value = "", "", result
    for i = 0, count do
        result, info, value = diary_ini:r_line("records",i,"","")
        if has_alife_info(info) then
            give_diary_record(info)
        end
    end
end

class "list_item" (CUIListBoxItem)

function list_item:__init(height) super(height)
    self.text                    = self:GetTextItem()
    self:SetTextColor            (GetARGB(255, 92, 84, 69))
    self.text:SetFont            (GetFontLetterica25())
    self.text:SetWndSize        (vector2():set(325,height))
    self.text:SetEllipsis        (true)
end

class "diary_dialog" (CUIScriptWnd)

function diary_dialog:__init() super()
     self:InitControls    ()
     self:InitCallBacks    ()
     self:FillList        (pages_list, true)
end

function diary_dialog:__finalize()
end

function diary_dialog:FillList(tbl, is_pages)
    self.list:Clear()
    
    self.is_pages = is_pages
    self.tbl = tbl
    
    for i = 1, #tbl do
        self:AddItemToList(tbl, i)
    end
end

function diary_dialog:InitControls()
    local xml                = CScriptXmlInit()
    self:SetWndRect            (Frect():set(0,0,1024,768))
    local ctrl
    
    xml:ParseFile            ("ui_diary.xml")
    xml:InitFrame            ("background",self)

    self.text = xml:InitTextWnd ("paragraph", self)
    self.header = xml:InitTextWnd ("header", self)

    self.list = xml:InitListBox    ("list",self)

    self.list:ShowSelectedItem    (true)
    self:Register                (self.list, "list_window")

    local ctrl = xml:Init3tButton        ("back",self)
    self:Register                (ctrl, "btn_close")
    
    self.header:SetTextST    ("st_diary_header")
end

function diary_dialog:InitCallBacks()
    self:AddCallback("btn_close",        ui_events.BUTTON_CLICKED,             self.OnButton_close_clicked,    self)
    self:AddCallback("list_window",        ui_events.WINDOW_LBUTTON_DB_CLICK,      self.OnButton_create_clicked,    self)
end

function diary_dialog:OnButton_create_clicked()
    if self.list:GetSize()==0 then
        return
    end

    local item    = self.list:GetSelectedItem()
    
    if not item then
        return
    end
    local itmname        = item.text:GetText()

    local itemnum = tonumber(itmname:sub(1, itmname:find(".")))
    
    if self.is_pages then
        self:FillList(list_of_pages[pages_list[itemnum]], false)
        self.text:SetText("")
        self.header:SetTextST(pages_list[itemnum])
    else
        local tbl = note_of_pages[self.tbl[itemnum]]
        self.text:SetTextST(tbl.text)
        self.header:SetTextST(self.tbl[itemnum])
    end
end

function diary_dialog:OnButton_close_clicked()
    if not self.is_pages then
        self:FillList        (pages_list, true)
        self.text:SetText    ("")
        self.header:SetTextST    ("st_diary_header")
    else
        self:HideDialog()
    end
end

function diary_dialog:OnKeyboard(dik, keyboard_action)
    CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)

    local bind = dik_to_bind(dik)
    
    if bind == key_bindings.kQUIT then
        self:HideDialog()
    end

    return true
end

function diary_dialog:AddItemToList(item_name, number)
    local _itm                    = list_item(30)
    _itm.text:SetText            (string.format("%d. %s", number, game.translate_string(item_name)))
    self.list:AddExistingItem    (_itm)
end

function ShowNotepad ()
    get_pages_list ()
    diary_dialog():ShowDialog(true)
end

 

а вот скрины самой проблемы

https://disk.yandex.ru/a/qgq0mhJvjFU2uw

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


Ссылка на сообщение
13 часов назад, Norman Eisenherz сказал:

find(".", 1, true)

Спасибо большое! помогло

Сделал скрипт в ЗП чтоб при поднятии арта приходило сообщение "артефакт найден"(скрипт вызываю из биндера on_item_take)

    if db.actor:object("af_medusa") and not db.actor:has_info("medusa") then
	db.actor:give_info_portion("medusa")
	news_manager.send_tip(db.actor, "st_find_af", 0, "got_artefact", 3000)
    end

И вот вопрос: можно как нибудь сделать чтоб писало "Найден артефакт: (арт)" 

сейчас я пока что вижу одну возможность как это реализовать, просто прописать для каждого арта свою надпись в text\rus, но артов у меня 160... и хотелось бы упростить себе задачу. Поэтому прошу помощи может кто знает. Спасибо.

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


Ссылка на сообщение

@Kirgudu @ted.80 Спасибо, в конечном результате получилось так:

    if db.actor:object("af_medusa") and not db.actor:has_info("medusa") then
	    db.actor:give_info_portion("medusa")
        local art_name = game.translate_string("st_find_af")..": %c[255,255,50,50]"..game.translate_string(system_ini():r_string("af_medusa", "inv_name")).."%c[default]"
        news_manager.send_tip(db.actor, art_name, 0, "got_artefact", 3000)
    end

Результат(тык)

У меня новый вопрос. Не могу найти где в зп прописан спавн квестовых трупов типо Баржи, Майрона в пещере контролёра и тому подобных

  • Нравится 3

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


Ссылка на сообщение

Здравствуйте, заметил что в повелителе зоны во вкладке "локации" прописаны все смарты сталкеров и их описания написаны как сталкеры в диалоге пишут, захотел сделать так что бы в списке локации были только сами локации: скадовск, янов, внз круг и тд...

нашёл функцию которая за это отвечает

Скрытый текст

-- Локации
if n=="2" then
mode = "level"

local tbl
local name
tbl = god_tbl.god_smart_table

if db.actor~=nil then
for i=1, 65535 do
    local obj = alife():object(i)
          if obj~=nil then
          if obj:section_name()=="smart_terrain" then
             local s_name = game.translate_string("st_stalker_"..obj:name())

             if s_table[s_name]~=nil then s_name = s_table[s_name] end

           self:AddItemToList(s_name, i)
            end
          end
end
end

end

 

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

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

Скрытый текст

 local s_name = game.translate_string("st_"..obj:name().."_name")

теперь переводит нормально основные места, но в списке есть и другие места которые попросту не переводятся, а ещё заметил что есть таблица с этими основными местами, но как я понял она не используется(точнее их две)

Скрытый текст

god_smart_table = {
["zat_b100"]  =  "st_zat_b100_name",
["zat_b104"]  =  "st_zat_b104_name",
["zat_b38"]  =   "st_zat_b38_name",
["zat_b40"]  =   "st_zat_b40_name",
["zat_b56"]  =   "st_zat_b56_name",
["zat_b5"]  =    "st_zat_b5_name",
["zat_a2"]  =    "st_zat_a2_name",
["zat_b20"]  =   "st_zat_b20_name",
["zat_b53"]  =   "st_zat_b53_name",
["zat_b101"]  =  "st_zat_b101_name",
["zat_b106"]  =  "st_zat_b106_name",
["zat_b7"]  =    "st_zat_b7_name",
["zat_b14"]  =   "st_zat_b14_name",
["zat_b52"]  =   "st_zat_b52_name",
["zat_b39"]  =   "st_zat_b39_name",
["zat_b33"]  =   "st_zat_b33_name",
["zat_b18"]  =   "st_zat_b18_name",
["zat_b54"]  =   "st_zat_b54_name",
["zat_b12"]  =   "st_zat_b12_name",
["zat_b28"]  =   "st_zat_b28_name",
["zat_b103"]  =  "st_zat_b103_name",
["jup_b1"]  =    "st_jup_b1_name",
["jup_b46"]  =   "st_jup_b46_name",
["jup_b202"]  =  "st_jup_b202_name",
["jup_b211"]  =  "st_jup_b211_name",
["jup_b200"]  =  "st_jup_b200_name",
["jup_b19"]  =   "st_jup_b19_name",
["jup_a6"]  =    "st_jup_a6_name",
["jup_b25"]  =   "st_jup_b25_name",
["jup_b6"]  =    "st_jup_b6_name",
["jup_b205"]  =  "st_jup_b205_name",
["jup_b206"]  =  "st_jup_b206_name",
["jup_b32"]  =   "st_jup_b32_name",
["jup_a10"]  =   "st_jup_a10_name",
["jup_b209"]  =  "st_jup_b209_name",
["jup_b208"]  =  "st_jup_b208_name",
["jup_a12"]  =   "st_jup_a12_name",
["jup_b212"]  =  "st_jup_b212_name",
["jup_b9"]  =    "st_jup_b9_name",
["jup_b201"]  =  "st_jup_b201_name",
["jup_a9"]  =    "st_jup_a9_name",
["pri_a28"]  =   "st_pri_a28_name",
["pri_b36"]  =   "st_pri_b36_name",
["pri_b303"]  =  "st_pri_b303_name",
["pri_b301"]  =  "st_pri_b301_name",
["pri_a17"]  =   "st_pri_a17_name",
["pri_b306"]  =  "st_pri_b306_name",
["pri_a16"]  =   "st_pri_a16_name",
["pri_a25"]  =   "st_pri_a25_name",
["pri_b35"]  =   "st_pri_b35_name",
["pri_a21"]  =   "st_pri_a21_name",
["pri_b304"]  =  "st_pri_b304_name",
["pri_a18"]  =   "st_pri_a18_name"
}

 

Скрытый текст


god_smart_table_full = {
{"zat_b55",   "st_zat_b55_name"},
{"zat_b100",  "st_zat_b100_name"},
{"zat_b104",  "st_zat_b104_name"},
{"zat_b38",   "st_zat_b38_name"},
{"zat_b40",   "st_zat_b40_name"},
{"zat_b56",   "st_zat_b56_name"},
{"zat_b5",    "st_zat_b5_name"},
{"zat_a2",    "st_zat_a2_name"},
{"zat_b20",   "st_zat_b20_name"},
{"zat_b53",   "st_zat_b53_name"},
{"zat_b101",  "st_zat_b101_name"},
{"zat_b106",  "st_zat_b106_name"},
{"zat_b7",    "st_zat_b7_name"},
{"zat_b14",   "st_zat_b14_name"},
{"zat_b52",   "st_zat_b52_name"},
{"zat_b39",   "st_zat_b39_name"},
{"zat_b33",   "st_zat_b33_name"},
{"zat_b18",   "st_zat_b18_name"},
{"zat_b54",   "st_zat_b54_name"},
{"zat_b12",   "st_zat_b12_name"},
{"zat_b28",   "st_zat_b28_name"},
{"zat_b103",  "st_zat_b103_name"},
{"jup_b1",    "st_jup_b1_name"},
{"jup_b46",   "st_jup_b46_name"},
{"jup_b202",  "st_jup_b202_name"},
{"jup_b211",  "st_jup_b211_name"},
{"jup_b200",  "st_jup_b200_name"},
{"jup_b19",   "st_jup_b19_name"},
{"jup_a6",    "st_jup_a6_name"},
{"jup_b25",   "st_jup_b25_name"},
{"jup_b6",    "st_jup_b6_name"},
{"jup_b205",  "st_jup_b205_name"},
{"jup_b206",  "st_jup_b206_name"},
{"jup_b32",   "st_jup_b32_name"},
{"jup_a10",   "st_jup_a10_name"},
{"jup_b209",  "st_jup_b209_name"},
{"jup_b208",  "st_jup_b208_name"},
{"jup_a12",   "st_jup_a12_name"},
{"jup_b212",  "st_jup_b212_name"},
{"jup_b9",    "st_jup_b9_name"},
{"jup_b201",  "st_jup_b201_name"},
{"jup_a9",    "st_jup_a9_name"},
{"pri_a28",   "st_pri_a28_name"},
{"pri_b36",   "st_pri_b36_name"},
{"pri_b303",  "st_pri_b303_name"},
{"pri_b301",  "st_pri_b301_name"},
{"pri_a17",   "st_pri_a17_name"},
{"pri_b306",  "st_pri_b306_name"},
{"pri_a16",   "st_pri_a16_name"},
{"pri_a25",   "st_pri_a25_name"},
{"pri_b35",   "st_pri_b35_name"},
{"pri_a21",   "st_pri_a21_name"},
{"pri_b304",  "st_pri_b304_name"},
{"pri_a18",   "st_pri_a18_name"}
}
 

и вот то в чём вопрос как сделать так чтоб этот скрипт использовал эту таблицу?  что бы не было вот этих лишних мест

https://disk.yandex.ru/i/mK-Tbn7hWt_a2A - скрин

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


Ссылка на сообщение
8 минут назад, Zander_driver сказал:

Использовать переменную tbl в коде.

я понимаю, но не понимаю как её использовать куда вставить или как, гуглил про таблицы курил lua но так и не понял

в итоге я сам разобрался) 

нашёл в инете функцию проверки есть ли в массиве определенное значение

Скрытый текст
function check_table(arg, table, mode)
    if mode == 1 then -- Если нужен поиск по ключу
        for k, v in pairs(table) do
            if k == arg then
                return true
            end
        end
    else -- Если нужен поиск по значению
        for k, v in pairs(table) do
            if v == arg then
                return true
            end
        end
    end
    return false
end

ну и сами проверки

Скрытый текст
-- Проверка ключа:
if check_table('First', red, 1) then -- 1 аргумент - Слово для поиска, 2 аргумент - Твоя таблица, 3 аргумент - режим.
    print('Найден ключ!')
end

-- Проверка значения:
if check_table('Hello', blue, 2) then -- 1 аргумент - Слово для поиска, 2 аргумент - Твоя таблица, 3 аргумент - Режим.
    print('Найдено значение!')
end

ну и сделал вот так

Скрытый текст

if obj:section_name()=="smart_terrain" and check_table(obj:name(), tbl, 1) then

и всё получилось. 

https://disk.yandex.ru/i/92E8xUoaHDYU9w - скрин

 

  • Нравится 1

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


Ссылка на сообщение

потихоньку изучаю модинг

появилась идея заставить эту штуку выстрелить при опускании рычага(типо чтоб последовательно появились например эффекты элекрты ну и звук)

https://disk.yandex.ru/i/6bf1M-KjrKliQQ

но появилась загвоздка я даже понятия не имею куда лезть что бы посмотреть как это можно реализовать и возможно ли это вообще

если есть кто знает где смотреть и что курить, подскажите пожалуйста

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


Ссылка на сообщение

Интересно, а есть проверка на наличие определённого предмета в inventory box? Пытался гуглить ничего не нашёл.

Может какие то костыли есть?

Изменено пользователем Опричник

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


Ссылка на сообщение
1 час назад, Kirgudu сказал:

iterate_inventory_box

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

на ап про спрашивал тоже про это, тоже написали про iterate_inventory_box

Скрытый текст

Суть такова: Даете своему inventory box стори_ид, затем передаете в самописную функцию параметры - стори_ид ящика и имя секции искомого предмета. Затем в скрипте xr_conditions создаете функцию в которой по стори_ид получаете inventory box, как объект, применяете к нему метод iterate_inventory box, один из аргументов этого метода - функция которая будет вызвана для каждого объекта из ящика, и в этой функции вы сравниваете имя секции предмета с искомым и если есть совпадение выставляете флаг - нашел. Результат работы вашей самописной функции и есть этот флаг.

но мне бы пример живой увидеть хотя бы

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


Ссылка на сообщение

@Kirguduвидел его, пока искал в скриптах всё связаное с "inventory_box"

нашёл вот 

function item_in_inventory_box(actor, npc, p)
--p[1] - стори_ид_ящика
--p[2] - имя_предмета
local inv_box = get_story_object(p[1])
local items_table = {}
local item_in_box = false

local function add_items(inv_box, item)
   table.insert(items_table, item)
end

inv_box:iterate_inventory_box(add_items, inv_box)

for k,v in pairs(items_table) do
   if v:name() == p[2] then
      item_in_box = true
   end
end

return item_in_box

end

 

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

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


Ссылка на сообщение
Скрытый текст
function item_in_inventory_box(actor, npc, p)
--p[1] - стори_ид_ящика
--p[2] - имя_предмета
local inv_box = get_story_object(p[1])
local items_table = {}
local item_in_box = false

local function add_items(inv_box, item)
   table.insert(items_table, item)
end

inv_box:iterate_inventory_box(add_items, inv_box)

for k,v in pairs(items_table) do
   if v:name() == p[2] then
      item_in_box = true
   end
end

return item_in_box

end

сказали что это должно работать но я не понимаю как оно работает

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


Ссылка на сообщение

@Zander_driver  мне нужно было проверить наличие артефакта в invectory_box 

я добавил эту функцию в xr_condition начал вызывать из логики

on_press = {=item_in_inventory_box(box_b400_story_id:af_oasis_heart)} ph_button@switch

и ничего не происходило 

поменял на на :section() и всё заработало, почему так?

и ящик в онлайне

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


Ссылка на сообщение

ну я прошу прощения (я не очень сильно во всём этом разбираюсь) и в любом случае большое спасибо за помощь

  • Спасибо 1

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


Ссылка на сообщение

Здравствуйте, у меня есть скрипт на телепортацию который вызывается из gametutorials при использовании рестриктора

function gaus_laz_v_gaus()
    if xr_conditions.actor_in_zone(actor, npc, {"gaus_laz_v_gaus_sr"}) then
	    db.actor:give_info_portion("af_run_tutor")
        teleport_actor(nil, nil, {"gaus_prolez_v_gaus_way","gaus_prolez_v_gaus_look"})
	end
end

 

[logic]
active = sr_idle@start

[sr_idle@start]
on_info  = {=actor_in_zone(gaus_laz_v_gaus_sr)} %=run_tutorial(gaus_laz_v_gaus_tutor)%
on_info2 = {+af_run_tutor} sr_idle@tutorial %=run_postprocess(black:666)%

[sr_idle@tutorial]
on_info = {!actor_in_zone(gaus_laz_v_gaus_sr)} %=stop_tutorial%
on_info2 = {+af_run_tutor} %-af_run_tutor%
on_game_timer = 30 | sr_idle@start %=stop_postprocess(666)%

прописал в логике рестриктора запуск пост процесса на чёрный экран и при использовании актёр мгновенно телепортируется и это выглядит не очень

 как можно сделать задержку телепортации на две секунды?

а именно скорее всего мне нужно таймер в скрипт добавить

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


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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