Все посты %s в %S - AMK Team
Перейти к контенту

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


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)%

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

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

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

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


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

Здравствуйте, есть вот такой скрипт(зп)

Скрытый текст
function delete_af_mahovik_1()
    local lc = alife():story_object(story_ids.af_mahovik_1)
    alife():release(lc, true)
end

 

находится он у меня в xr_effects, использую в логике рестриктора %=delete_af_mahovik_1%. Сильно за скрипты не шарю. Поэтому и такой вопрос: Как переделать этот скрипт что бы в логике писать нужный мне id по типу %=delete_af(af_mahovik_1)%. Заранее спасибо.

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

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


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

@Norman Eisenherz так я и делал только у меня ничего не получается, то вылетает то вообще не работает 

Я перепробовал разные варианты, но так так синтаксис луан мне не знаком, у меня ничего не выходит

 

 

function delete_af_mahovik_1(actor, object,  p)

local lc = alife():story_object(story_ids.p[1])

    alife():release(lc, true)

end

 

Вот так вот пробовал не работает

Я пробовал переделать функции remove_npc и destroy_object под свои задачи не получилось.

Пытался с умным лицом читать статьи про Lua, но из этого ничего не вышло. Помогите написать этот скрипт пожалуйста 

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


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

Как отследить смерть вороны от рук гг?

Смотрел скрипты чн с мини игрой, так и не понял как там отслеживается смерть вороны.

Хочу сделать что-то наподобие достижения, гг убил 50 ворон.

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


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

Здравствуйте! Появился такой вопрос. Можно ли как-нибудь отследить сколько времени висит артефакт на поясе? платформа ЗП

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


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

Здравствуйте помогите пожалуйста вот в этот скрипт добавить таблицу:
 

function actor_binder:key_hold(key)
if has_alife_info("item_id_used") then
	if not has_alife_info("test_work_start") and key == DIK_keys.DIK_W then
	test_script.test_func()
	end
end
end

что бы key == DIK_keys.DIK_W перебирал значения т.е DIK_S, DIK_A, DIK_D, DIK_W 

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


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

Спасибо большое. А как сделать что бы функция

4 часа назад, Kirgudu сказал:
test_script.test_func()

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

скрипт  который вызывается когда отпускаешь кнопку
ну и тут получается что нужно что бы скрипт не вызывался при отпускании кнопки пока одна из кнопок зажата в скрипте который ловит что  кнопка нажата и зажата

function actor_binder:key_release(key)
	if has_alife_info("item_id_used") then
		if has_alife_info("test_work_start") and keys[key] == true then
			test_script.test_func_release_key()
		end
	end
end

 
в скрипте test_script.test_func() который вызывается при нажатии выдаётся test_work_start
в скрипте test_script.test_func_release_key() который вызывается при отпускании стоит таймер по истечению которого забирается test_work_start
инфопорции возможно и не нужны, просто без них у меня не получалось вообще то что мне нужно

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

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


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

@RayTwitty попытался понять как у движка узнать state гг. не получилось. зато нашёл как у движка узнать скорость гг и повесил на апдейт ту функцию

    local vec = db.actor:get_movement_speed()
    local cur_speed = math.sqrt(vec.x*vec.x+vec.y*vec.y+vec.z*vec.z)
    if has_alife_info("item_id_used") and cur_speed>0 then
	    if not has_alife_info("test_work_start") then
		    test_script.test_func_on_run()
			--news_manager.send_tip(db.actor, "moving", nil, "information_dealer", 50)
			db.actor:give_info_portion("test_work_start")
	    end
    end
	if has_alife_info("item_id_used") and cur_speed==0 then
	    if has_alife_info("test_work_start") then
            test_script.test_func_on_stay()
			--news_manager.send_tip(db.actor, "staying", nil, "information_dealer", 50)
			db.actor:disable_info_portion("test_work_start")
        end
    end

и всё заработало как я хотел

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


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

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