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

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

@Kirgudu 

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

local gts = game.translate_string

local weapon_classes  = {
    [clsid.wpn_svu] = true,
    [clsid.wpn_svu_s] = true,
    [clsid.wpn_usp45] = true,
    [clsid.wpn_usp45_s] = true,
    [clsid.wpn_val] = true,
    [clsid.wpn_val_s] = true,
    [clsid.wpn_vintorez] = true,
    [clsid.wpn_vintorez_s] = true,
    [clsid.wpn_walther] = true,
    [clsid.wpn_walther_s] = true
}

function irWeapon(object, class_id)
    local id = class_id or get_clsid(object)
    return id and weapon_classes[id]
end

 

function show_news(item)
    if irWeapon(item) then
    local name = system_ini():r_string(item:section(), "inv_name")
    local n = name[math.random(#name)]
    local ww = gts(n)

    local news_text = "%c[ui_gray_1]".. ww
    db.actor:give_game_news(news_text, "ui\\cop\\ui_cop_iconstotal", Frect():set(415,0,83,47), 0, 5000)
end
end

 

Вызываю с ui_main_menu по кнопке

 

Можно было сделать так :

 

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

function show_news()
    local where_trade = txr_utils.collect_translations("st_dyn_news_lvl_",true)
    if (not where_trade) then
    return false
end
    local wt = where_trade[math.random(#where_trade)]
    local news_text = "%c[ui_gray_1]".. wt
    db.actor:give_game_news(news_text, "ui\\cop\\ui_cop_iconstotal", Frect():set(415,0,83,47), 0, 5000)
end

 

txr_utils:

 

local cache_translated = {}
local cache_untranslated = {}
local string_find = string.find

 

function collect_translations(st, is_translated)
    if is_translated and cache_translated[st] then
    return cache_translated[st]
    elseif cache_untranslated[st] then
    return cache_untranslated[st]
end
    local string_count = 1
    local tr_t = {}
    while true do 
    local tr_s = game.translate_string(st .. string_count)
    if (tr_s == st .. string_count) then
    break
    else
    if is_translated then
    tr_t[#tr_t + 1] = tr_s
    else
    tr_t[#tr_t + 1] = st .. tostring(string_count)
end
end
    string_count = string_count + 1
end
    if (#tr_t == 0) then
    if (not string_find(st,"st_msg")) then
    printf("! WARNING: collect_translations | strings of (%s) don't exist!", st)
end
    return false
end
    if is_translated then
    cache_translated[st] = tr_t
    else
    cache_untranslated[st] = tr_t
end
    return tr_t
end

 

Но это не решает проблему, ведь он будет читать строку в виде ...._1, ..._2 и т.д. А мне нужны имена оружий.

 

Ну не писать же длинющий список:

 

local where_trade = {
    "ПМ",
    "ПБ",
    и т.д
}

Я так понимаю это не реализовать?

 

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

Подарки

  • Ссылка на комментарий

    @Colder  Вот поэтому и стоит для начала сделать то, о чём писали выше:

    19 часов назад, mole venomous сказал:

    Вообще не понял...

    Может, стоит для начала рандомно  определить оружие?

    Нужно получить список имён оружия и вывести его в новости. Какого оружия, где? В слоте? В инвентаре? На уровне? Вообще любого в игре? Передаваемого покупателю/продавцу (если отталкиваться от on_trade? Если берёшь в работу один единственный предмет, который передаётся в параметр item функции on_trade, то о каких множественных строках, перебор которых ты хочешь сделать, может идти речь? И т. д.
    Цель непонятна, условия непонятны, а гадать, что именно требуется сделать, - неблагодарное занятие.

    Изменено пользователем Kirgudu
    • Согласен 2
    Ссылка на комментарий

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

    local weapon_names, weapon_sections, cnt, sini, al = {}, {}, 0, system_ini(), alife()
    for i=1, 65535 do
    	local obj = al:object(i)
    	if obj and isWeapon(obj) then
    		local section = obj.section_name and obj:section_name()
    		if section and (not weapon_names[section]) and sini:section_exist(section) and sini:line_exist(section, "inv_name") then
    			local name = sini:r_string(section, "inv_name")
    			weapon_names[section] = name
    			table.insert(weapon_sections, section)
    			cnt = cnt + 1
    		end
    	end
    end
    if cnt > 0 then
    	local news_text = "%c[ui_gray_1]"..game.translate_string(weapon_names[weapon_sections[math.random(cnt)]])
    	db.actor:give_game_news(news_text, "ui\\cop\\ui_cop_iconstotal", Frect():set(415,0,83,47), 0, 5000)
    end

    Вот только затратная это штука благодаря перебору.

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

    Изменено пользователем Kirgudu
    • Спасибо 1
    • Нравится 1
    Ссылка на комментарий
    10 hours ago, Kirgudu said:

    пройтись по всем конфигам и вычитать из них секции с оружием

    Сходная задача: надо получить все входящие секции из конфига [weapons.ltx]. Перебор через line_count + r_line требует указания общей секции "list", которой в этом конфиге нет. Версия игры – ТЧ 1.0006, библиотека io. недоступна. Какое есть решение?

    Мини-моды: ТЧ ЧН ЗП

    Шпаргалка

    Ссылка на комментарий
    4 часа назад, Zander_driver сказал:

    И я так понимаю, что за такие минусы здесь меня сейчас тухлыми помидорами наверное закидают, да? Или нет?

    За что тебя тухлыми яйцами закидывать? СУБД вообще норм штука, сам пользую postgres на дому. Правда без php морды.

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

     Моя нычкаНычка в арендованном у Опричника холодильнике  

    Мы хорошие ребята, жаль патронов маловато:):ukostra:

    UriZzz.gif

    Ссылка на комментарий

    Полагаю, вообще и в частности, если исходный (ванильный) движок не позволяет сделать что-то конкретное (хотелку), самый правильный вариант - править движок под свои нужды. Ясен пень, изучать исходники, научиться все это дело собирать и все выйдет, как надо. Правда процесс сей муторный и длительный, но результат будет!

     

    Не всем сей совет подойдет. Мне вот не подошел :)

    • Согласен 2

    Сталкер - наше всё!

    Ссылка на комментарий
    10 часов назад, AndrewMor сказал:

    Мне вот не подошел

    Аналогично, но с советом целиком и полностью согласен. :)
    Но я на работе настолько наедаюсь программированием (full stack от БД до фронта), что лезть и в движок Сталкера тупо не хотелось, хотя при нужде могу просто посмотреть, что там в нужном месте написано.

    Для меня чистые Lua скрипты на ванильном движке - это редкий отдых. :)


    @Zander_driver почему бы просто не выложить куда-нибудь в инструментарий мододела? Кому надо - найдёт и возьмёт не сейчас, так позже. Я вот тоже обязательно полюбопытствую, а может и воспользуюсь однажды.

    Изменено пользователем Kirgudu
    • Спасибо 1
    • Нравится 1
    Ссылка на комментарий
    04.03.2023 в 06:10, Norman Eisenherz сказал:

    получить все входящие секции из конфига [weapons.ltx]

    Нужно что-то типа этого: сканирование конфигов с помощью FS. Только тут нужно, чтобы конфиги были не в архивах.

    Изменено пользователем naxac
    • Согласен 1
    • Полезно 3

    Аддон для ОП-2.09.2: Яндекс/Google/GitHub

    naxac.gif


    Подарки

    Ссылка на комментарий
    04.03.2023 в 17:21, Kirgudu сказал:

    почему бы просто не выложить куда-нибудь в инструментарий мододела?

    В ближайшие дни отмахаюсь с навалившейся работой, приведу свой инструмент в порядок в плане оснащения инструкцией и комментариями.

    И выложу в новой теме в инструментарии.

    1 час назад, naxac сказал:

    что-то типа этого

    БД сканировать всяко удобнее :)

    • Нравится 2

    Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

    Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

    AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

    Ссылка на комментарий

    Есть такой код:
     

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

        if obj:section() == "sleepingbag" then
            local can_sleep = true    
            local actor = db.actor
            for id=1,65535 do
                local object = level.object_by_id(id)
                if object ~= nil then
                    if (IsStalker(object) and object:relation(actor) == game_object.enemy) or IsMonster(object) then
                        if object:position():distance_to(actor:position()) < ENEMY_RADIUS and object:see(actor) then
                            news_manager.send_tip(actor, "sleep_warning_enemy", nil, "default", 5000)
                            can_sleep = false
                            break
                        end
                    end
                end
            end

            -- проверка на радиацию
            if actor.radiation > 0 and can_sleep then
                news_manager.send_tip(actor, "sleep_warning_radiation", nil, "default", 5000)
                can_sleep = false
            end

            if actor.satiety < 0.5 and can_sleep then
                news_manager.send_tip(actor, "satiety_warning_radiation", nil, "default", 5000)
                can_sleep = false
            end
            
            if can_sleep then
            end

        end

     

        -- ATM Sleeping Bag start
        if self.already_jumped==false and jump_level.need_jump==true and (device().frame > self.spawn_frame+2000) then
            jump_level.try_to_jump()
            self.already_jumped = true
            return
        end


    Что мне нужно:
    Если все проверки проходят, то запускаем окно сна, а если нет, то нет соответственно.

    Проблема в чём: если проверка не проходит то окно открывается.

    Что не так с кодом?

    ищу человека, который смог бы заняться разработкой погоды на OGSR.
    кто может помочь - пишите в ЛС.

    Ссылка на комментарий
    2 часа назад, imcrazyhoudini сказал:

    Есть такой код:

    Функцию целиком выложи, а то не очень понятно что к чему

     

    ну или как-то так:

    Скрытый текст
        if obj:section() == "sleepingbag" then
            local can_sleep = true    
            local actor = db.actor
            for id=1,65535 do
                local object = level.object_by_id(id)
                if object ~= nil then
                    if (IsStalker(object) and object:relation(actor) == game_object.enemy) or IsMonster(object) then
                        if object:position():distance_to(actor:position()) < ENEMY_RADIUS and object:see(actor) then
                            news_manager.send_tip(actor, "sleep_warning_enemy", nil, "default", 5000)
                            can_sleep = false
                            break
                        end
                    end
                end
            end
    
            -- проверка на радиацию
            if actor.radiation > 0 and can_sleep then
                news_manager.send_tip(actor, "sleep_warning_radiation", nil, "default", 5000)
                can_sleep = false
            end
    
            if actor.satiety < 0.5 and can_sleep then
                news_manager.send_tip(actor, "satiety_warning_radiation", nil, "default", 5000)
                can_sleep = false
            end
    		
             -- ATM Sleeping Bag start
            if can_sleep then
                if self.already_jumped==false and jump_level.need_jump==true and (device().frame > self.spawn_frame+2000) then
                    jump_level.try_to_jump()
                    self.already_jumped = true
                    return
                end		
            end
        end

     

     

    Изменено пользователем ted.80
    Ссылка на комментарий
    52 минуты назад, ted.80 сказал:

    Функцию целиком выложи, а то не очень понятно что к чему

    Это вся функция и есть, впихнул в on_use в биндер.
    Впрочем вот все скрипты касательно этого сна: тык

    То, что ты кинул не помогло.

    ищу человека, который смог бы заняться разработкой погоды на OGSR.
    кто может помочь - пишите в ЛС.

    Ссылка на комментарий

    Для перебора NPC в онлайне лучше использовать for id, v in pairs(db.storage) – так всего пара сотен объектов будет.

    • Спасибо 1
    • Согласен 1
    • Полезно 2

    Мини-моды: ТЧ ЧН ЗП

    Шпаргалка

    Ссылка на комментарий
    15 часов назад, imcrazyhoudini сказал:

    Что не так с кодом?

    да там всё "нитак" - все проверки у тебя находятся в bind_stalker.script > actor_binder:use_object(obj)

    но и одна из них не запускает "окно сна", а конструкция:

        -- ATM Sleeping Bag start
        if self.already_jumped==false and jump_level.need_jump==true and (device().frame > self.spawn_frame+2000) then
            jump_level.try_to_jump()
            self.already_jumped = true
            return
        end

    ни какого отношения к сну вообще не имеет :big_boss:

    А нужное тебе окно запускается через - bind_stalker.script > actor_binder:on_item_drop (obj) > atmmain.on_item_drop(obj)

    function on_item_drop(obj)
    	if obj:section() == "sleepingbag" then
    		sleepingbag_id = obj:id();
    		ui_sleep_init = true;		
    	end
    --	atmdebug.abundance(obj);	
    end

    тут проверяется секция и переменная  ui_sleep_init  становится "тру"

    потом эта переменная в функции    atmmain.update()  которая как нистрано висит апдейте актора

    в строке 59 запускает нужное или нет окно 

    level.start_stop_menu(atmsleep.UISleep(), true);

     

    • Спасибо 1
    • Согласен 1
    • Полезно 1
    Ссылка на комментарий

    @ted.80 выбросил всё лишнее и оставил лишь в on_use такую рабочую конструкцию:
     

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

    function update(obj)

        if obj:section() == "sleepingbag" then
            local ui_sleep_init = true    
            local actor = db.actor
            for id, v in pairs(db.storage) do
                local object = level.object_by_id(id)

                if object ~= nil then
                    if (IsStalker(object) and object:relation(actor) == game_object.enemy) or IsMonster(object) then
                        if object:position():distance_to(actor:position()) < ENEMY_RADIUS and object:see(actor) then
                            news_manager.send_tip(actor, "sleep_warning_enemy", nil, "default", 5000)
                            ui_sleep_init = false
                            break
                        end
                    end
                end
            end

            if actor.radiation > 0 and ui_sleep_init then
                news_manager.send_tip(actor, "sleep_warning_radiation", nil, "default", 5000)
                ui_sleep_init = false
            end


            if actor.satiety < 0.70 and ui_sleep_init then
                news_manager.send_tip(actor, "sleep_warning_satiety", nil, "default", 5000)
                ui_sleep_init = false
            end
            
            if ui_sleep_init == true then
                level.start_stop_menu(atmsleep.UISleep(), true)
            end     
        end
    end

    Теперь остался такий вопрос: а как можно остановить сон если ГГ проголодается?
    Впихнул на апдейт такое:
     

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

            if db.actor.satiety < 0.70 and ui_sleep_init == true then
                    news_manager.send_tip(actor, "satiety_sleep", nil, "default", 5000)
                    atmsleep.sleep_stop()
            end


    Но сон не останавливает.

    Что не так?

    ищу человека, который смог бы заняться разработкой погоды на OGSR.
    кто может помочь - пишите в ЛС.

    Ссылка на комментарий

    @imcrazyhoudinidell

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

     Моя нычкаНычка в арендованном у Опричника холодильнике  

    Мы хорошие ребята, жаль патронов маловато:):ukostra:

    UriZzz.gif

    Ссылка на комментарий
    2 часа назад, imcrazyhoudini сказал:

    Что не так?

     

    2 часа назад, imcrazyhoudini сказал:

       if db.actor.satiety < 0.70 and ui_sleep_init == true then

    Тут    ui_sleep_init    всегда будет "фолс" а не "тру" всегда!!!

    потому что в предыдущей функции она объявлена  local   

    и живёт она только внутри этой функции :spiteful:, и её значение в другую функцию

    а тем более в другой скрипт не передаётся

    • Спасибо 1
    Ссылка на комментарий

    @ted.80 false? Хм, а точно не nil сопровождаемый вылетом с ругонью на эту самую переменную?

     Моя нычкаНычка в арендованном у Опричника холодильнике  

    Мы хорошие ребята, жаль патронов маловато:):ukostra:

    UriZzz.gif

    Ссылка на комментарий

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

    Комментарии могут оставлять только зарегистрированные пользователи

    Создать аккаунт

    Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

    Зарегистрировать новый аккаунт

    Войти

    Есть аккаунт? Войти.

    Войти
    • Недавно просматривали   0 пользователей

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

    AMK-Team.ru

    ×
    ×
    • Создать...