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

Принятый ответ

И есть ли быстрый способ синхронизации (глобализации) данных в выпуске рефордж?
---@param whichTrigger trigger
---@param whichPlayer player
---@param prefix string
---@param fromServer boolean
---@return event
function BlzTriggerRegisterPlayerSyncEvent(whichTrigger, whichPlayer, prefix, fromServer) end    -- (native)


---@param prefix string
---@param data string
---@return boolean
function BlzSendSyncData(prefix, data) end    -- (native)

---@return string
function BlzGetTriggerSyncPrefix() end    -- (native)

---@return string
function BlzGetTriggerSyncData() end    -- (native)
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
27
4 года назад
0
Скорп задаёт вопросы по LUA, на которые способны ответить 1.5 человека -_-
2
24
4 года назад
Отредактирован prog
2
Если коротко - самом в луа не синкается принудительно ничего. Все что синкается и, соответственно, может привести к десинку - находится дальше, на уровне движка и логики игры.
Из вещей на которые стоит обратить внимание - перебор таблицы через pairs - поскольку таблицы в луа не гарантируют порядок хранения ключей, это может потенциально привести к тому, что перебор на разных машинах произойдет в разном порядке. В сферическом вакууме это не опасно, но если внутри перебора используется что-то подлежащее синку - здравствуй потенциальный рандомный десинк. Близы вроде как собирались это починить, но я бы не рисковал на это ставить и избегал бы перебора через pairs в местах где важен порядок выполнения итераций.
Что касается ручной синхронизации - близы завезли новые нативки и события для этого. Если упростить, регается триггер, который ловит события синхронизации и может вынуть из них переданные данные и затем используются нативки для передачи данных на синхронизацию.
Важный нюанс, на который также стоит обратить внимание - фреймы и некоторые действия с ними, скорее всего, частично синхронизированы - я видел репорты что реакция на нажатие кнопок в фреймах происходит с задержкой на пинг и синхронизацию. Но это может быть особенностями реализации конкретных видов фреймов или вобще кривым кодом на стороне автора этих репортов - сам я не проверял.
0
37
4 года назад
0
Спасибо
Перебор, кстати, есть через ipairs и тут проблемы быть не должно
4
29
4 года назад
4
И есть ли быстрый способ синхронизации (глобализации) данных в выпуске рефордж?
---@param whichTrigger trigger
---@param whichPlayer player
---@param prefix string
---@param fromServer boolean
---@return event
function BlzTriggerRegisterPlayerSyncEvent(whichTrigger, whichPlayer, prefix, fromServer) end    -- (native)


---@param prefix string
---@param data string
---@return boolean
function BlzSendSyncData(prefix, data) end    -- (native)

---@return string
function BlzGetTriggerSyncPrefix() end    -- (native)

---@return string
function BlzGetTriggerSyncData() end    -- (native)
Принятый ответ
0
37
4 года назад
0
Благодарстввтвтв
0
24
4 года назад
0
ScorpioT1000, ipairs же только для целочисленных ключей и, насколько я помню, от 1 до первой пустой ячейки. В то время как pairs это для перебора по ключам хештаблицы, которые могут быть произвольными.
0
37
4 года назад
0
Ну, для локальных решений можно обойтись числовой индексацией массивов и избегать хешмап
0
24
4 года назад
0
ScorpioT1000, избегать итераций по хешмапам чрез pairs - сами хешмапы работают отлично, проблемы начинаются только если полагаться на не гарантированный порядок ключей и это стандартно для многих реализаций хешмапы, не только в луа.
2
37
4 года назад
Отредактирован ScorpioT1000
2
Я к тому, что это решается хранением второго массива для индексации
Пример:
local myData = { 
  a = "test A", 
  b = "test B" 
}
local myDataIndexed = { 
  "a", 
  "b" 
}

for i, key in ipairs(myDataIndexed) do
   print(myData[key])
end

-- out:
-- test A
-- test B
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.