Colder 12 Опубликовано 3 Марта 2023 Поделиться Опубликовано 3 Марта 2023 (изменено) @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 = { "ПМ", "ПБ", и т.д } Я так понимаю это не реализовать? Изменено 3 Марта 2023 пользователем Colder Подарки Ссылка на комментарий
Kirgudu 940 Опубликовано 3 Марта 2023 Поделиться Опубликовано 3 Марта 2023 (изменено) @Colder Вот поэтому и стоит для начала сделать то, о чём писали выше: 19 часов назад, mole venomous сказал: Вообще не понял... Может, стоит для начала рандомно определить оружие? Нужно получить список имён оружия и вывести его в новости. Какого оружия, где? В слоте? В инвентаре? На уровне? Вообще любого в игре? Передаваемого покупателю/продавцу (если отталкиваться от on_trade? Если берёшь в работу один единственный предмет, который передаётся в параметр item функции on_trade, то о каких множественных строках, перебор которых ты хочешь сделать, может идти речь? И т. д. Цель непонятна, условия непонятны, а гадать, что именно требуется сделать, - неблагодарное занятие. Изменено 3 Марта 2023 пользователем Kirgudu 2 Инструмент Ссылка на комментарий
Colder 12 Опубликовано 3 Марта 2023 Поделиться Опубликовано 3 Марта 2023 @Kirgudu 7 минут назад, Kirgudu сказал: Вообще любого в игре? Именно Подарки Ссылка на комментарий
Kirgudu 940 Опубликовано 3 Марта 2023 Поделиться Опубликовано 3 Марта 2023 (изменено) Перебирает все предметы в игре (на всех локациях), помещает уникальные записи оружия в таблицу, затем выводит в новость случайное название из этой таблицы: 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 Вот только затратная это штука благодаря перебору. Куда проще было бы пройтись по всем конфигам и вычитать из них секции с оружием по какому-то признаку, но я так никогда не делал, не могу подсказать способ. Изменено 3 Марта 2023 пользователем Kirgudu 1 1 Инструмент Ссылка на комментарий
Norman Eisenherz 225 Опубликовано 3 Марта 2023 Поделиться Опубликовано 3 Марта 2023 10 hours ago, Kirgudu said: пройтись по всем конфигам и вычитать из них секции с оружием Сходная задача: надо получить все входящие секции из конфига [weapons.ltx]. Перебор через line_count + r_line требует указания общей секции "list", которой в этом конфиге нет. Версия игры – ТЧ 1.0006, библиотека io. недоступна. Какое есть решение? Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Это популярное сообщение. Zander_driver 10 166 Опубликовано 3 Марта 2023 Это популярное сообщение. Поделиться Опубликовано 3 Марта 2023 32 минуты назад, Norman Eisenherz сказал: библиотека io. недоступна. Какое есть решение? Не мучиться для подобных задач костылями на базе оригинального игрового движка и/или работающих из-под него Луа-скриптов. Они НЕ подходят для подобных задач. Я для таких и сходных задач, использовал решение путем: 0) Берем все файлы конфигов, скриптов, (а в моем случае и код движка), и закидываем в базу данных. 1) Далее путем нехитрой оболочки API на языке php, 2) И столь же нехитрой обвязки скриптами javaScript 4) Получаем в web-интерфейсе на локалке или на своем хостинге, в пару кликов выше-упомянутую или любую другую подобную информацию, по конфигам, скриптам и движку своего мода. Плюсы - как уже говорилось куча всего в духе выше-упомянутого но не только, доступна в пару-тройку кликов. В принципе вам доступна любая мыслимая аналитика ваших скриптов и конфигов (и движка) по щелчку пальца. Кроме того, если использовать свой сервер, то доступна она не только с вашего модостроительного ПК, но и с планшета/смартфона. Минусы - Для редактирования под свои нужды, надо понимать SQL, php, javaScript. А вовсе никакой не Луа. И я так понимаю, что за такие минусы здесь меня сейчас тухлыми помидорами наверное закидают, да? Или нет? ЗЫ. Мораль сей басни - для некоторых вещей и некоторых задач, разумнее оторваться взглядом от сталкера и осмотреться по другим технологиям. Авось найдется что-то намного более подходящее для того что вы хотите. P.P.S. Если тут кто-нибудь проявит позитивный интерес к такому инструменту. Готов выложить все исходники... Если хоть кому-то оно надо. 3 3 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Ссылка на комментарий
UriZzz 992 Опубликовано 4 Марта 2023 Поделиться Опубликовано 4 Марта 2023 (изменено) 4 часа назад, Zander_driver сказал: И я так понимаю, что за такие минусы здесь меня сейчас тухлыми помидорами наверное закидают, да? Или нет? За что тебя тухлыми яйцами закидывать? СУБД вообще норм штука, сам пользую postgres на дому. Правда без php морды. Изменено 4 Марта 2023 пользователем UriZzz Моя нычка, Нычка в арендованном у Опричника холодильнике Мы хорошие ребята, жаль патронов маловато:) Ссылка на комментарий
AndrewMor 517 Опубликовано 4 Марта 2023 Поделиться Опубликовано 4 Марта 2023 Полагаю, вообще и в частности, если исходный (ванильный) движок не позволяет сделать что-то конкретное (хотелку), самый правильный вариант - править движок под свои нужды. Ясен пень, изучать исходники, научиться все это дело собирать и все выйдет, как надо. Правда процесс сей муторный и длительный, но результат будет! Не всем сей совет подойдет. Мне вот не подошел 2 Сталкер - наше всё! Ссылка на комментарий
Kirgudu 940 Опубликовано 4 Марта 2023 Поделиться Опубликовано 4 Марта 2023 (изменено) 10 часов назад, AndrewMor сказал: Мне вот не подошел Аналогично, но с советом целиком и полностью согласен. Но я на работе настолько наедаюсь программированием (full stack от БД до фронта), что лезть и в движок Сталкера тупо не хотелось, хотя при нужде могу просто посмотреть, что там в нужном месте написано. Для меня чистые Lua скрипты на ванильном движке - это редкий отдых. @Zander_driver почему бы просто не выложить куда-нибудь в инструментарий мододела? Кому надо - найдёт и возьмёт не сейчас, так позже. Я вот тоже обязательно полюбопытствую, а может и воспользуюсь однажды. Изменено 4 Марта 2023 пользователем Kirgudu 1 1 Инструмент Ссылка на комментарий
naxac 2 372 Опубликовано 7 Марта 2023 Поделиться Опубликовано 7 Марта 2023 (изменено) 04.03.2023 в 06:10, Norman Eisenherz сказал: получить все входящие секции из конфига [weapons.ltx] Нужно что-то типа этого: сканирование конфигов с помощью FS. Только тут нужно, чтобы конфиги были не в архивах. Изменено 7 Марта 2023 пользователем naxac 1 3 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Подарки Ссылка на комментарий
Zander_driver 10 166 Опубликовано 7 Марта 2023 Поделиться Опубликовано 7 Марта 2023 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. Ссылка на комментарий
imcrazyhoudini 177 Опубликовано 8 Марта 2023 Поделиться Опубликовано 8 Марта 2023 Есть такой код: Скрытый текст 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. кто может помочь - пишите в ЛС. Ссылка на комментарий
ted.80 223 Опубликовано 8 Марта 2023 Поделиться Опубликовано 8 Марта 2023 (изменено) 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 Изменено 8 Марта 2023 пользователем ted.80 Ссылка на комментарий
imcrazyhoudini 177 Опубликовано 8 Марта 2023 Поделиться Опубликовано 8 Марта 2023 52 минуты назад, ted.80 сказал: Функцию целиком выложи, а то не очень понятно что к чему Это вся функция и есть, впихнул в on_use в биндер. Впрочем вот все скрипты касательно этого сна: тык То, что ты кинул не помогло. ищу человека, который смог бы заняться разработкой погоды на OGSR. кто может помочь - пишите в ЛС. Ссылка на комментарий
Norman Eisenherz 225 Опубликовано 9 Марта 2023 Поделиться Опубликовано 9 Марта 2023 Для перебора NPC в онлайне лучше использовать for id, v in pairs(db.storage) – так всего пара сотен объектов будет. 1 1 2 Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
ted.80 223 Опубликовано 9 Марта 2023 Поделиться Опубликовано 9 Марта 2023 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 ни какого отношения к сну вообще не имеет А нужное тебе окно запускается через - 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 Ссылка на комментарий
imcrazyhoudini 177 Опубликовано 10 Марта 2023 Поделиться Опубликовано 10 Марта 2023 @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. кто может помочь - пишите в ЛС. Ссылка на комментарий
UriZzz 992 Опубликовано 10 Марта 2023 Поделиться Опубликовано 10 Марта 2023 (изменено) @imcrazyhoudinidell Изменено 10 Марта 2023 пользователем UriZzz Моя нычка, Нычка в арендованном у Опричника холодильнике Мы хорошие ребята, жаль патронов маловато:) Ссылка на комментарий
ted.80 223 Опубликовано 10 Марта 2023 Поделиться Опубликовано 10 Марта 2023 2 часа назад, imcrazyhoudini сказал: Что не так? 2 часа назад, imcrazyhoudini сказал: if db.actor.satiety < 0.70 and ui_sleep_init == true then Тут ui_sleep_init всегда будет "фолс" а не "тру" всегда!!! потому что в предыдущей функции она объявлена local и живёт она только внутри этой функции , и её значение в другую функцию а тем более в другой скрипт не передаётся 1 Ссылка на комментарий
UriZzz 992 Опубликовано 10 Марта 2023 Поделиться Опубликовано 10 Марта 2023 @ted.80 false? Хм, а точно не nil сопровождаемый вылетом с ругонью на эту самую переменную? Моя нычка, Нычка в арендованном у Опричника холодильнике Мы хорошие ребята, жаль патронов маловато:) Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти