Pavel_2000 5 Опубликовано 3 Февраля Привет, нужна помощь, я в скриптах пока не особо разбираюсь, поэтому хотелось бы спросить у знающих. Нашёл личный дневник для зп (тык) Это типа дневник с записями и в нём есть такая проблема, что когда записей становится больше 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 Поделиться этим сообщением Ссылка на сообщение
Pavel_2000 5 Опубликовано 4 Февраля 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... и хотелось бы упростить себе задачу. Поэтому прошу помощи может кто знает. Спасибо. Поделиться этим сообщением Ссылка на сообщение
Pavel_2000 5 Опубликовано 4 Февраля @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 Поделиться этим сообщением Ссылка на сообщение
Pavel_2000 5 Опубликовано 19 Февраля Здравствуйте, заметил что в повелителе зоны во вкладке "локации" прописаны все смарты сталкеров и их описания написаны как сталкеры в диалоге пишут, захотел сделать так что бы в списке локации были только сами локации: скадовск, янов, внз круг и тд... нашёл функцию которая за это отвечает Скрытый текст -- Локации 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 - скрин Поделиться этим сообщением Ссылка на сообщение
Pavel_2000 5 Опубликовано 19 Февраля 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 Поделиться этим сообщением Ссылка на сообщение
Pavel_2000 5 Опубликовано 25 Февраля потихоньку изучаю модинг появилась идея заставить эту штуку выстрелить при опускании рычага(типо чтоб последовательно появились например эффекты элекрты ну и звук) https://disk.yandex.ru/i/6bf1M-KjrKliQQ но появилась загвоздка я даже понятия не имею куда лезть что бы посмотреть как это можно реализовать и возможно ли это вообще если есть кто знает где смотреть и что курить, подскажите пожалуйста Поделиться этим сообщением Ссылка на сообщение
Pavel_2000 5 Опубликовано 26 Февраля (изменено) Интересно, а есть проверка на наличие определённого предмета в inventory box? Пытался гуглить ничего не нашёл. Может какие то костыли есть? Изменено 27 Февраля пользователем Опричник Поделиться этим сообщением Ссылка на сообщение
Pavel_2000 5 Опубликовано 27 Февраля 1 час назад, Kirgudu сказал: iterate_inventory_box вот я в зп ковыряюсь, мало что о скриптах знаю и гуг ничего не выдаёт как пользоваться этой функцией на ап про спрашивал тоже про это, тоже написали про iterate_inventory_box Скрытый текст Суть такова: Даете своему inventory box стори_ид, затем передаете в самописную функцию параметры - стори_ид ящика и имя секции искомого предмета. Затем в скрипте xr_conditions создаете функцию в которой по стори_ид получаете inventory box, как объект, применяете к нему метод iterate_inventory box, один из аргументов этого метода - функция которая будет вызвана для каждого объекта из ящика, и в этой функции вы сравниваете имя секции предмета с искомым и если есть совпадение выставляете флаг - нашел. Результат работы вашей самописной функции и есть этот флаг. но мне бы пример живой увидеть хотя бы Поделиться этим сообщением Ссылка на сообщение
Pavel_2000 5 Опубликовано 27 Февраля (изменено) @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 Изменено 27 Февраля пользователем Pavel_2000 Поделиться этим сообщением Ссылка на сообщение
Pavel_2000 5 Опубликовано 27 Февраля Скрытый текст 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 5 Опубликовано 27 Февраля @Zander_driver мне нужно было проверить наличие артефакта в invectory_box я добавил эту функцию в xr_condition начал вызывать из логики on_press = {=item_in_inventory_box(box_b400_story_id:af_oasis_heart)} ph_button@switch и ничего не происходило поменял на на :section() и всё заработало, почему так? и ящик в онлайне Поделиться этим сообщением Ссылка на сообщение
Pavel_2000 5 Опубликовано 27 Февраля ну я прошу прощения (я не очень сильно во всём этом разбираюсь) и в любом случае большое спасибо за помощь 1 Поделиться этим сообщением Ссылка на сообщение
Pavel_2000 5 Опубликовано 28 Февраля Здравствуйте, у меня есть скрипт на телепортацию который вызывается из 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)% прописал в логике рестриктора запуск пост процесса на чёрный экран и при использовании актёр мгновенно телепортируется и это выглядит не очень как можно сделать задержку телепортации на две секунды? а именно скорее всего мне нужно таймер в скрипт добавить Поделиться этим сообщением Ссылка на сообщение