_Sk8_AsTeR_ 117 Опубликовано 13 Января 2020 Поделиться Опубликовано 13 Января 2020 Господа, а каким образом можно реализовать сохранение\загрузку значения своей глобальной переменной? Условная глобальная переменная всегда будет иметь какое-то одно числовое значение, которое будет изменяться. Каким образом её правильно объявить как глобальную, чтобы она писалась в сейв и читалась потом? Ссылка на комментарий
Zander_driver 10 341 Опубликовано 13 Января 2020 Поделиться Опубликовано 13 Января 2020 @_Sk8_AsTeR_, если на старых движках, то смотреть в сторону модуля se_stor от Artos`a, а если на движке OGSR, то почитать про script_vars_storage. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Kirgudu 1 240 Опубликовано 14 Января 2020 Поделиться Опубликовано 14 Января 2020 @_Sk8_AsTeR_, условную одну переменную, не занимающую много места (а числовое значение именно такое), вполне можно сохранять в pstor актора без огорода с дополнительными модулями или новыми движками - см. штатные xr_logic.pstor_store и xr_logic.pstor_retrieve и их применение в оригинале. Вот с таблицами, длинными строками или множественными переменными - другое дело, в этом случае уже стоит последовать совету @Zander_driver. 1 1 Инструмент Ссылка на комментарий
_Sk8_AsTeR_ 117 Опубликовано 14 Января 2020 Поделиться Опубликовано 14 Января 2020 @Kirgudu, Приветствую! Твой метод работает, но при попытке сохраниться получаю: Скрытый текст Arguments : LUA error: ....t.a.l.k.e.r\gamedata\scripts\fake_net_packet.script:60: bad argument #1 to 'len' (string expected, got table) вот какой кусок кода для теста написал: Скрытый текст function edit() local mmoney = xr_logic.pstor_retrieve(db.actor, bank) if mmoney == nil then amk.send_tip("нил", "нил", 1, 15, "common_channel") --отчет что значение = нил xr_logic.pstor_store(db.actor, bank, 0) --сразу присвоем переменной нуль else xr_logic.pstor_store(db.actor, bank, mmoney + 100) --прибавим для теста соточку local itog = xr_logic.pstor_retrieve(db.actor, bank) amk.send_tip(itog, itog, 2, 15, "common_channel") -- глянем что получается end end В итоге на экран у меня выводится значение переменной, которая увеличивается на 100 с каждым выполнением функции, т.е. всё работает, однако невозможно сохраниться. Что может быть? Ссылка на комментарий
naxac 2 447 Опубликовано 15 Января 2020 Поделиться Опубликовано 15 Января 2020 (изменено) @_Sk8_AsTeR_, функциями нужно пользоваться так: Сохранение переменной: xr_logic.pstor_store(db.actor, "variable_name", value) Загрузка переменной: xr_logic.pstor_retrieve(db.actor, "variable_name", default_value) Изменено 15 Января 2020 пользователем naxac 1 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
_Sk8_AsTeR_ 117 Опубликовано 15 Января 2020 Поделиться Опубликовано 15 Января 2020 @naxac, прошу прощения, а я вроде этим же синтаксисом и пользовался: xr_logic.pstor_store(db.actor, "variable_name", value) -- твое xr_logic.pstor_store(db.actor, bank, 0) --моё Где ошибка? Ссылка на комментарий
Zander_driver 10 341 Опубликовано 15 Января 2020 Поделиться Опубликовано 15 Января 2020 16 часов назад, _Sk8_AsTeR_ сказал: string expected, got table Вот тут... В 14.01.2020 в 10:51, Kirgudu сказал: условную одну переменную, не занимающую много места (а числовое значение именно такое), вполне можно сохранять в pstor актора без огорода с дополнительными модулями или новыми движками Одну то можно, но вы ж сами знаете, как это бывает. Где одна, там и две, а где две, там и десять. Вот человек только начал - а уже таблицы в сохранение отправляет. Так шо я против пстора вашего, и против того чтоб его новичкам советовать. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
_Sk8_AsTeR_ 117 Опубликовано 15 Января 2020 Поделиться Опубликовано 15 Января 2020 @Zander_driver, но я же вроде просто числовую переменную сохранить пытаюсь, что не так я делаю? Ссылка на комментарий
Kirgudu 1 240 Опубликовано 15 Января 2020 Поделиться Опубликовано 15 Января 2020 (изменено) 2 часа назад, _Sk8_AsTeR_ сказал: xr_logic.pstor_store(db.actor, bank, 0) Вот если б было написано "bank" - тогда да, то же самое по синтаксису. А так здесь используется некая переменная bank. Что в ней, не таблица ли? 2 часа назад, Zander_driver сказал: Где одна, там и две, а где две, там и десять. Вот человек только начал - а уже таблицы в сохранение отправляет. Полностью согласен! Но мы ж тут знания стараемся повышать. Я потому и написал специально: "одну переменную", да ещё и "с числовым значением". Разве что жирным и подчёркнутым не выделил. Умный человек вычленит для себя важное, а глупому и модули с движком не помогут. Изменено 15 Января 2020 пользователем Kirgudu 1 1 Инструмент Ссылка на комментарий
_Sk8_AsTeR_ 117 Опубликовано 15 Января 2020 Поделиться Опубликовано 15 Января 2020 (изменено) 1 час назад, Kirgudu сказал: Что в ней, не таблица ли? Кстати, интересный момент. Я эту переменную bank вприцнипе нигде и никак не объявлял. Ф-ция pstor_store тем не менее все равно ею оперирует. В какой момент движок начинает думать что это таблица? UPD Аааааа, имя переменной в кавычки, хы. Проблему устранил, снимаю шляпу перед @Kirgudu Тут же вопрос по теме, каким способом и какова вероятность убить сейвы подобными манипуляциями? Есть у вас печальные примеры? Изменено 15 Января 2020 пользователем _Sk8_AsTeR_ 1 Ссылка на комментарий
Kirgudu 1 240 Опубликовано 16 Января 2020 Поделиться Опубликовано 16 Января 2020 Печальные примеры есть у каждого мододела, кто более-менее глубоко погружался в правки скриптов. Моё мнение: если делаешь фигню, но не замечаешь и не исправляешь её, вероятность очень высокая. Особенно плохо, когда последствия вылезают не сразу, вот как сейчас, а где-нибудь на другой локации и спустя несколько часов игры - в таких случаях причину диагностировать бывает очень трудно. А конкретику для данного случая тебе только двигоправы скажут. Отдельно хочу ещё раз - в дополнение со своей стороны - указать на то, что написал @Zander_driver. Всё это тут не раз объяснялось, но лишний раз повторить не помешает. Скрытый текст Данные любого объекта, в том числе актора, передаются от клиента к серверу и обратно посредством так называемого нет-пакета, имеющего весьма ограниченный размер. В ТЧ это примерно 8 КБ, в ЧН и ЗП - 16. Учитывая то, что в пстор актора, а значит и в соответствующий нет-пакет, уже пишутся данные в добром десятке, если не больше, модулей оригинала, на долю скриптёра остаётся совсем немного доступного объёма. Именно поэтому: - добавить в пстор одну-две-три переменные, имеющие простой тип (число, логическое значение, строку, гарантированно имеющую небольшую длину), и на этом остановиться - можно. - добавить в пстор сегодня 1-2-3 переменные, завтра ещё столько же, потом забыть и через месяц добавить ещё пяток, потом ещё - нельзя! Смотреть в сторону модуля se_stor или нового движка. - добавить в пстор переменную типа "строка", предельная длина которой неизвестна (и может составлять тысячи знаков) - нельзя! Смотреть в сторону модуля se_stor или нового движка. - добавить в пстор переменную типа "таблица" - нельзя! Смотреть в сторону модуля se_stor или нового движка. - добавить в пстор любую простую переменную, но при этом основываться на чужом моде, в котором пстор уже мог дополняться - нельзя! Смотреть в сторону модуля se_stor или нового движка. Можно ещё контролировать размер нет-пакетов посредством лога (см. штатные вызовы метода set_save_marker(...), особенно в ответственном за актора модуле bind_stalker), но это уже более высокий пилотаж. Тогда в большинстве случаев проблем с переполнением нет-пакетов удастся избежать. 1 2 Инструмент Ссылка на комментарий
_Sk8_AsTeR_ 117 Опубликовано 16 Января 2020 Поделиться Опубликовано 16 Января 2020 @Kirgudu, а какая симптоматика при переполнении нет пакетов? Битые сейвы, или ещё чего? Ссылка на комментарий
Kirgudu 1 240 Опубликовано 16 Января 2020 Поделиться Опубликовано 16 Января 2020 (изменено) @_Sk8_AsTeR_, либо они, либо искажение/потеря каких-либо данных после загрузки. (Второе, как я уже писал, не всегда заметно сразу! Поэтому контроль и ещё раз контроль записи чего-либо куда-либо.) Например, в одном из модов для ЧН это приводило к тому, что инвентарь какого-либо НПС начинал содержать абсолютно невразумительный набор предметов, а при взаимодействии с этим НПС (с целью, скажем, торговли) следовал вылет. Поройся в поиске, тут хватает нужных сведений. Изменено 16 Января 2020 пользователем Kirgudu 1 Инструмент Ссылка на комментарий
mole venomous 3 488 Опубликовано 17 Января 2020 Поделиться Опубликовано 17 Января 2020 (изменено) 11 часов назад, _Sk8_AsTeR_ сказал: симптоматика Частенько вылет со ссылкой на ф-ию actor_binder:load(reader) при загрузке уровня сложности из bind_stalker А если игра загрузилась, многое, что висело на таймерах, не работает. Изменено 17 Января 2020 пользователем mole venomous 1 Здесь могла быть ваша реклама. Ссылка на комментарий
AndrewMor 529 Опубликовано 19 Января 2020 Поделиться Опубликовано 19 Января 2020 В 16.01.2020 в 17:33, _Sk8_AsTeR_ сказал: @Kirgudu, а какая симптоматика при переполнении нет пакетов? Битые сейвы, или ещё чего? Чаще всего вылеты при загрузке сейва с руганью на несуществующую секцию, что-то типа "ac" или нечто подобное. 1 Сталкер - наше всё! Ссылка на комментарий
Norman Eisenherz 317 Опубликовано 27 Января 2020 Поделиться Опубликовано 27 Января 2020 Здрасьте. Делаю перебор пустующих, но все еще отмеченных тайников. Запуск после прогрузки (скажем, при использовании бинта) проходит успешно – с выводом списка. Запуск из actor_binder:net_spawn(data) проходит без какого-либо результата – видимо, тайники/метки еще не успевают прогрузиться. Как правильно отложить запуск скрипта, чтобы получать список сразу после загрузки? Пробовал условия if alife(), if level.present(), if device().precache_frame <= 1 – без эффекта. На всякий случай, код: Spoiler function search() for sid = 5000, 5480 do local stash = level_object_by_sid(sid) if stash then if level_tasks.is_map_spot_present(sid, "treasure") and stash:is_inv_box_empty() then local ini = ini_file("misc\\treasure_manager.ltx") local n = ini:line_count("list") for i = 1, n do local useless, sect, empty = ini:r_line("list", i, "", "") if string.len(sect) > 0 and ini:r_u32(sect, "target") == sid then local name = game.translate_string( ini:r_string(sect, "name") ) news_manager.send_tip(db.actor, sid .. ": " .. sect .. " = " .. name) end end end end end end Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Zander_driver 10 341 Опубликовано 27 Января 2020 Поделиться Опубликовано 27 Января 2020 58 минут назад, Norman Eisenherz сказал: Запуск из actor_binder:net_spawn(data) проходит без какого-либо результата – видимо, тайники/метки еще не успевают прогрузиться. Не успевают прогрузиться клиентские объекты, да. Тут можно двумя путями пойти. 1) Переписать все действия на работу с только серверными объектами. Оно как бы можно и тогда спокойно вызывать из нет_спавна актора. Я бы так делал... 2) После нет_спавна подождать некоторое время. 5 секунд например. И тогда уже вызывать свои манипуляции с объектами клиентскими. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Norman Eisenherz 317 Опубликовано 27 Января 2020 Поделиться Опубликовано 27 Января 2020 1. Если под проверкой серверных объектов имеется в виду проверка меток напрямую через story_id тайников, то такая проверка выдает все известные тайники на локации, включая те, что давно облутаны и уже не имеют видимых меток. 2. Вот я и спрашиваю, как научить скрипт ждать. Мне известен только костыль через level.client_spawn_manager с ожиданием регистрации лишнего объекта и последующим его удалением, но это занимает не больше 0,5 с. Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Zander_driver 10 341 Опубликовано 27 Января 2020 Поделиться Опубликовано 27 Января 2020 только что, Norman Eisenherz сказал: включая те, что давно облутаны и уже не имеют видимых меток. Наличие лута и метки тоже можно проверять. только что, Norman Eisenherz сказал: как научить скрипт ждать. В качестве пищи для размышлений: В метод update биндера (чего угодно, но и ГГ в том числе), передается параметр delta. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Norman Eisenherz 317 Опубликовано 27 Января 2020 Поделиться Опубликовано 27 Января 2020 1. Проблема: прямая проверка через sid (по видимым меткам) выдает пустые тайники, которые уже были облутаны ранее (стали пустыми нормальным путем, а не в результате сбоя загрузки) и не имеют видимых меток, то есть в текущей задаче только мешают. Ответ: Наличие лута и метки тоже можно проверять. Какова содержательная этого ответа, если в скрипте я как раз проверяю метку и лут? 2. Можно пример с разовым действием на апдейте? С таким, условие запуска которого не проверяется на каждом кадре или каждые несколько секунд. Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти