-
Число публикаций
3 438 -
Регистрация
-
Последнее посещение
-
Дней в топе
2 -
AMKoin
20,314 [Подарить AMKoin]
Закладки
-
Скриптование
СкриптованиеВыше, кстати, есть опечатка: должно быть "se_stor.get(key, default)"
Да, виноват-с...
вы правы.
проще, чем выискивать по всем скриптам
Так я же и не выискивал. Вообще понятия не имею, где у меня se_stor дергается. Не помню)
Просто сам se_stor заменил на такой.
----------------------------------------------------------------------------------------------------------- -- Заглушка для подключения всех скриптов, использующих se_stor Артоса, к SCRIPT_VARS_STORAGE движка OGSR ----------------------------------------------------------------------------------------------------------- function get(var_name, default) local s = get_stored_vars() if s[var_name] ~= nil then return s[var_name] end return default end function set(var_name, value, f_check) local s = get_stored_vars() s[var_name] = value end --~
Для движка OGSR, se_stor выглядит вот так
Это на всякий случай, если кто-то будет заморачиваться зачем-то установкой модуля se_stor на моды на этом движке.
Глобальные GetVar, SetVar, etc... на основе этих двух функций тоже дописать можно, при желании.
-
Скриптование
Скриптование@Stalkersof Бро, не советую пользоваться пстором, у движка есть некое хранилище где можешь что то сохранять.
Модуль
local xvars = get_stored_vars() --------------| Публичный интерфейс модуля |----------------------------------- function unpack_value(value) if type(value) == "userdata" then value = value(true) end return value end function value_exist(name) return xvars[name] ~= nil end function set_value(name, value) xvars[name] = value end function get_value(name, default_value) local value = xvars[name] if value == nil then ASSERT(default_value ~= nil, "get_value: neither value '%s' is exist, nor default value is provided", name) set_value(name, default_value) return default_value end return unpack_value(value) end -- в случае, если не существует, просто вернуть nil function get_value_safe(name) return unpack_value(xvars[name]) end function remove_value(name) xvars[name] = nil end function set_or_remove_value(name, value) if value then set_value(name, value) else remove_value(name) end end function get_all_vars() return xvars() end
-
Скриптование
Скриптование@UriZzz, предлагаю борьбу с невнимательностью и fps продолжить дальше и поднять не невиданный доселе уровень, увеличив твою опытность ещё больше.
Смотри.
Функция у тебя с говорящим названием, sleep(obj), предназначена теоретически только для обработки нажатия на спальный мешок. Не знаю, откуда и как она вызывается, но если проверка на то, что ты используешь именно спальник, до вызова функции есть, тогда условие if obj:section() == "sleep_bag" then является лишним.
Но скорее всего такую проверку ты до функции не делаешь, а просто всегда дёргаешь её в коллбэке на дроп (ТЧ) или использование предмета (ЧН, ЗП). Примем это допущение, и тогда возникает другой момент.
Что будет, если вокруг тебя на расстоянии 40 метров нет ни одного врага? А если ты съел колбасу? Правильно, проверка на врага сработает, а поскольку рядом никого нет, пройдёт по полному циклу, по всем 65 с лишним тысячам потенциальных объектов. И в результате ты, может, и избавился от тормозов при выдаче сообщения, зато приобрёл их при любом использовании любого предмета (если только ты не ставишь целью кушать, применять антирад, использовать бинты и аптечки и т. д. также только в спокойном месте).
Выходом является перемещение поиска врагов после условия if obj:section() == "sleep_bag" then, так чтобы цикл запускался только если ты используешь нужный предмет.
И последнее, чисто перфекционистское замечание. Если всё, что делает функция, это проверяет, можешь ли ты использовать спальник, и показывает нужный диалог или выдаёт сообщение, тогда нет нужды заморачиваться с лишними брейками и переменными. Можно выдать сообщение и сразу выйти из функции (return сработает как и break, прервёт выполнение цикла, но вдобавок ещё и обеспечит выход), а меню будет показано за пределами цикла, если всё хорошо, и прерывания не случилось.
Самое время проиллюстрировать вышесказанное.
P.S. При желании ты с Lua разберёшься, я уверен. С СДК разобрался, значит и со скриптами сможешь.
Надо лишь пройти чуть дальше, чем "работает - и ладно".
@Марка демченков, попробуй это:
exit()
-
Проблема последнего дня месяца
СкриптованиеВампир35
1. Никак не получить, т.к. АМК-таймеры не имеют соответствующего интерфейса по доступу к ним. Ну а кто патался написать ... вероятно понимал, что проще и лучше написать свои таймеры заново, чем вставлять костыли "одряхлевшему" коду.
2. А не слышал о проблеме 2000-го года? Того же порядка, т.е. в принятом формате параметра не хватает разрядности и в какой-то момент наступает "переполнение"/сброс.
В АМК-тайрах используется 32-х битный таймер game.time() и кол-во разрядов хватает на ... немного меньше месяца игрового времени. Далее наступает обнуление бахового времени и все "новые" таймеры будут заведомо с меньшим временем, чем те, которые были до "часа Х".
Лечить таймеры в общем-то бессмысленно, т.к. эта ошибка присуща не только им а имеется во многих кодах игры и следует глобально поменять использование game.time() на 64-х битный вариант game.CTime()
-
Методы управления погодой OGSR
[SoC] Ковыряемся в файлахчто это за метод level.set_weather_next? В чём его смысл? Чем он разнится с level.set_weather?
Попробую вспомнить. На всякий случай начнем с начала, как собственно погода выбирается. Допустим у нас имеется погода с названием "clear". Она состоим из нескольких секций с описанием погоды. Каждая секция описывает погоду в указанное время. Время - это имя секции. В движке имеется указание на секцию для текущего времени и следующую за ней. Назовем их C0 и C1. В процессе нахождения на локации движок плавно меняет погоду от C0 к C1. Когда наступает, время соответствующее погоде C1, текущаяя погода полностью соответствует той, что описана в секции C1 и движок делает C0 = C1 и C1 = следующаяя секция погоды, которая следует за C1 и так далее, до самого конце секции, а потом переходит к началу секции и так по кругу бесконечно. Так вот, set_weather( "clear", true ) устанавливает C0 и C1 из погоды "clear" в соответствии с текущим временем. set_weather( "clear" ) просто устанавливает из какой погоды будут браться следующие C1 и не меняет текущую погоду. Т.е. если мы сделаем set_weather( "cloudy" ), то у нас будет плавное изменение погоды "clear" от С0 к C1, и при наступлении времени, соответствующего C1, погода C1 перейдет в C0, а следующий C1 уже будет выбираться не из погоды "clear", а из погоды "cloudy". Но с динамической погодой возможна ситуация, когда у нас в 12:00 погода "clear", а в 13:00 погода "cloudy". Т.е. нам нужно, вот в этот данный момент, что бы C0 было из "clear", а C1 - из "cloudy". Именно это и делает set_weather_next( "cloudy" ), устанавливает C1 из указанной погоды, т.е. из "cloudy" и ничего более. Т.е. для нашего случая нам нужна цепочка из
-- установить C0 и С1 из погоды "clear" level.set_weather( "clear", true ) -- т.к. начиная с C1 у нас должна действовать погода "cloudy", установим C1 из неё level.set_weather_next( "cloudy" ) -- и далее, после C1 тоже должна действовать погода "cloudy" level.set_weather( "cloudy" )
-
модули Артоса
Сборочный цехНавеяно помощью @Romz по прикручиванию se_stor к ЗП, результатом чего стал его объединённый комплект скриптов. Он всем хорош, однако, во-первых, предназначен только для ЗП, а во-вторых, предлагает подключение, например, m_timers даже в том случае, если таймеры не нужны, а нужно только универсальное хранилище.
Здесь я хочу выложить немного другой комплект модулей @Artos'a, содержащий не все модули сразу, а каждый модуль по отдельности. При этом:
- реализована полная совместимость модулей между собой (можно интегрировать их в мод в любых необходимых сочетаниях);
- подключение и работа всех модулей протестированы во всех частях игры;
- для модуля универсального хранилища (se_stor) добавлено 3 разных примера подключения - для ТЧ, ЧН и ЗП соответственно. Примеры эти 100% рабочие, не требуют никакой доработки напильником. Достаточно в нужных местах добавить/закомментировать указанные куски кода.
- модуль se_stor доработан так, что теперь он позволяет не только сохранять в чанках те внешние модули, у которых есть публичные методы save/load, но и указывать кастомные названия соответствующих методов. Таким образом, теперь можно больше данных, сохраняемых в оригинале в нет-пакете главного героя, перенести в универсальное хранилище. В добавленных примерах подключения это отражено.
Состав:
lua_helper - различные часто употребляемые и/или полезные функции которые могут использоваться модмейкерами.
m_netpk - интерфейс чтения/записи net-пакетов.
m_timers - менеджер универсальных таймеров.
se_stor - универсальное хранилище данных произвольного размера.
lua_helper - https://yadi.sk/d/1_J1HVZsu7Jgy, обновлено 08.02.2025
m_netpk - https://yadi.sk/d/GtYsSbjnxqdtp, обновлено 08.02.2025
se_stor - https://yadi.sk/d/a38PlQdju7Jhr, обновлено 10.08.2016
m_timers - https://yadi.sk/d/FWJkTnAMu7Jhg, обновлено 08.02.2025
Общий комплект + скрипт для тестирования - https://yadi.sk/d/p69RQkBMu7JgR, обновлено 08.02.2025
-
Правка последнего дня месяца
[SoC] Ковыряемся в файлахБерем, и ВЕЗДЕ меняем. Либо на game.CTime(), либо сохранения делаем как-то типа вот так:
local n = 0 -- корректировка и сохранение времени for k, v in pairs( tm_sec ) do n = n + 1 end pk:w_u32( n ) for k, v in pairs( tm_sec ) do pk:w_stringZ( k ); pk:w_float( v - game_time_sec ) end n = 0 for k, v in pairs( tm_ms ) do n = n + 1 end pk:w_u32( n ) for k, v in pairs( tm_ms ) do pk:w_stringZ( k ); pk:w_float( v - game_time_ms ) end
преимущества последнего варианта - меньший объем сэйва, быстрее все вычисления, недостаток - кто-то из принципа может проторчать на одной локации не сохраняясь до 35 мая.
-
СДК от яра
[SoC] Вопросы по SDKX-Ray SDK от Yara. Это собранный из исходников SDK 0.4, в котором имеются десятки исправлений и улучшений. Прочитав чейндж-лист вывод один:
Инфа взята тут (оригинальный пост)
Приправляется все это х64 компиляторами от @hi_flyer. Скажу сразу: присущи ли им баги как у компиляторов @KD87 я не в курсе, но вроде как тут все работает нормально, без засветов лмапов и прочих страданий. (линк на ориг)
Собрал свой вариант х64 (ТЧ) компиляторов xrLC и xrDO.
xrDO использует до 8 потоков, xrLC до 11 потоков на стадии просчета лайтмапов, на процессорах с количеством потоков < 11 может работать медленнее.
Также в наличии для xrLC новые ключи на отключение просчета лайтмапа террейна, источников света hemi и sunСсылка: https://yadi.sk/d/ZeqjyINRDndl_w
И немного дополненный вариант компиляторов от @macron, чутка прибрано + инструкция. (линк на ориг)Небольшое обновление х64 (ТЧ) компиляторов:
-добавлена инструкция.
-xrLC: исправлен двойной вывод ошибок о ненайденных файлах в лог. Ошибки выделяются пустыми строчками.Ссылка: https://yadi.sk/d/MR5apdQmq3dLpw
Обновленный XrAI — сообщением выше.
-
Сборка от Adm-RAL для FM
S.T.A.L.K.E.R. F.M.Тут что-то совершенно случайно собралось...
За день.
Если честно, то я до сих пор не понимаю - с какого вообще я зацепился за...? Может когда услышал, что есть мод где ГГ зовут Леченный!? По началу даже хотел нахамил автору за такое, но уже поздно... теперь...
Начну, пожалуй...
P.S.
Ну, терь можно и погамать малёху... Попробую пройти. А потом опять в яму!
-
Ссылка на Дискорд ПП
Prosectors ProjectСсылка, кстати, была опубликована тут же
Продублирую ее- https://discord.gg/YrW38Tc