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

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

Господа, а каким образом можно реализовать сохранение\загрузку значения своей глобальной переменной? Условная глобальная переменная всегда будет иметь какое-то одно числовое значение, которое будет изменяться. Каким образом её правильно объявить как глобальную, чтобы она писалась в сейв и читалась потом? 

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

@_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.

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

@_Sk8_AsTeR_, условную одну переменную, не занимающую много места (а числовое значение именно такое), вполне можно сохранять в pstor актора без огорода с дополнительными модулями или новыми движками - см. штатные xr_logic.pstor_store и xr_logic.pstor_retrieve и их применение в оригинале. Вот с таблицами, длинными строками или множественными переменными - другое дело, в этом случае уже стоит последовать совету @Zander_driver.

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

@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 с каждым выполнением функции, т.е. всё работает, однако невозможно сохраниться. Что может быть?

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

@_Sk8_AsTeR_, функциями нужно пользоваться так:

Сохранение переменной: xr_logic.pstor_store(db.actor, "variable_name", value)

Загрузка  переменной: xr_logic.pstor_retrieve(db.actor, "variable_name", default_value)

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

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

naxac.gif

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

@naxac, прошу прощения, а я вроде этим же синтаксисом и пользовался:

xr_logic.pstor_store(db.actor, "variable_name", value)  -- твое

xr_logic.pstor_store(db.actor, bank, 0) --моё

 

Где ошибка?

Ссылка на комментарий
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.

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

xr_logic.pstor_store(db.actor, bank, 0)

Вот если б было написано "bank" - тогда да, то же самое по синтаксису. А так здесь используется некая переменная bank. Что в ней, не таблица ли?

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

Где одна, там и две, а где две, там и десять. Вот человек только начал - а уже таблицы в сохранение отправляет.

Полностью согласен! Но мы ж тут знания стараемся повышать. Я потому и написал специально: "одну переменную", да ещё и "с числовым значением". Разве что жирным и подчёркнутым не выделил. :)

Умный человек вычленит для себя важное, а глупому и модули с движком не помогут.

Изменено пользователем Kirgudu
  • Спасибо 1
  • Согласен 1
Ссылка на комментарий
1 час назад, Kirgudu сказал:

Что в ней, не таблица ли?

Кстати, интересный момент. Я эту переменную bank вприцнипе нигде и никак не объявлял. Ф-ция pstor_store тем не менее все равно ею оперирует. В какой момент движок начинает думать что это таблица? 

UPD

Аааааа, имя переменной в кавычки, хы.

Проблему устранил, снимаю шляпу перед @Kirgudu 

Тут же вопрос по теме, каким способом и какова вероятность убить сейвы подобными манипуляциями? Есть у вас печальные примеры?

Изменено пользователем _Sk8_AsTeR_
  • Нравится 1
Ссылка на комментарий

Печальные примеры есть у каждого мододела, кто более-менее глубоко погружался в правки скриптов. Моё мнение: если делаешь фигню, но не замечаешь и не исправляешь её, вероятность очень высокая. Особенно плохо, когда последствия вылезают не сразу, вот как сейчас, а где-нибудь на другой локации и спустя несколько часов игры - в таких случаях причину диагностировать бывает очень трудно.
А конкретику для данного случая тебе только двигоправы скажут.

 

Отдельно хочу ещё раз - в дополнение со своей стороны - указать на то, что написал @Zander_driver. Всё это тут не раз объяснялось, но лишний раз повторить не помешает.

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

 

Данные любого объекта, в том числе актора, передаются от клиента к серверу и обратно посредством так называемого нет-пакета, имеющего весьма ограниченный размер. В ТЧ это примерно 8 КБ, в ЧН и ЗП - 16. Учитывая то, что в пстор актора, а значит и в соответствующий нет-пакет, уже пишутся данные в добром десятке, если не больше, модулей оригинала, на долю скриптёра остаётся совсем немного доступного объёма. Именно поэтому:
- добавить в пстор одну-две-три переменные, имеющие простой тип (число, логическое значение, строку, гарантированно имеющую небольшую длину), и на этом остановиться - можно.

- добавить в пстор сегодня 1-2-3 переменные, завтра ещё столько же, потом забыть и через месяц добавить ещё пяток, потом ещё - нельзя! Смотреть в сторону модуля se_stor или нового движка.

- добавить в пстор переменную типа "строка", предельная длина которой неизвестна (и может составлять тысячи знаков) - нельзя! Смотреть в сторону модуля se_stor или нового движка.

- добавить в пстор переменную типа "таблица" - нельзя! Смотреть в сторону модуля se_stor или нового движка.

- добавить в пстор любую простую переменную, но при этом основываться на чужом моде, в котором пстор уже мог дополняться - нельзя! Смотреть в сторону модуля se_stor или нового движка.

Можно ещё контролировать размер нет-пакетов посредством лога (см. штатные вызовы метода set_save_marker(...), особенно в ответственном за актора модуле bind_stalker), но это уже более высокий пилотаж.

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

 

 

  • Нравится 1
  • Полезно 2
Ссылка на комментарий

@_Sk8_AsTeR_, либо они, либо искажение/потеря каких-либо данных после загрузки. (Второе, как я уже писал, не всегда заметно сразу! Поэтому контроль и ещё раз контроль записи чего-либо куда-либо.)

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

Поройся в поиске, тут хватает нужных сведений.

Изменено пользователем Kirgudu
  • Спасибо 1
Ссылка на комментарий
11 часов назад, _Sk8_AsTeR_ сказал:

симптоматика

Частенько вылет со ссылкой на ф-ию actor_binder:load(reader) при загрузке уровня сложности из bind_stalker

А если игра загрузилась, многое, что висело на таймерах, не работает.

Изменено пользователем mole venomous
  • Спасибо 1

Здесь могла быть ваша реклама.

Ссылка на комментарий
В 16.01.2020 в 17:33, _Sk8_AsTeR_ сказал:

@Kirgudu, а какая симптоматика при  переполнении нет пакетов? Битые сейвы, или ещё чего? 

Чаще всего вылеты при загрузке сейва с руганью на несуществующую секцию, что-то типа "ac" или нечто подобное.

  • Спасибо 1

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

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

Здрасьте.

 

Делаю перебор пустующих, но все еще отмеченных тайников. Запуск после прогрузки (скажем, при использовании бинта) проходит успешно – с выводом списка. Запуск из 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

 

 

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

Шпаргалка

Ссылка на комментарий
58 минут назад, Norman Eisenherz сказал:

Запуск из actor_binder:net_spawn(data) проходит без какого-либо результата – видимо, тайники/метки еще не успевают прогрузиться.

Не успевают прогрузиться клиентские объекты, да.

 

Тут можно двумя путями пойти.

1) Переписать все действия на работу с только серверными объектами. Оно как бы можно :rolleyes: и тогда спокойно вызывать из нет_спавна актора. Я бы так делал...

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.

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

1. Если под проверкой серверных объектов имеется в виду проверка меток напрямую через story_id тайников, то такая проверка выдает все известные тайники на локации, включая те, что давно облутаны и уже не имеют видимых меток.

2. Вот я и спрашиваю, как научить скрипт ждать. Мне известен только костыль через level.client_spawn_manager с ожиданием регистрации лишнего объекта и последующим его удалением, но это занимает не больше 0,5 с.

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

Шпаргалка

Ссылка на комментарий
только что, 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.

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

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

Ответ: Наличие лута и метки тоже можно проверять.

Какова содержательная этого ответа, если в скрипте я как раз проверяю метку и лут?

 

2. Можно пример с разовым действием на апдейте? С таким, условие запуска которого не проверяется на каждом кадре или каждые несколько секунд.

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

Шпаргалка

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

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

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

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

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

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

Войти

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

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

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