Доброго времени суток! Читал посты по теме, но все равно не выходит разобраться.
С помощью preload меняю текст описания способности красному игроку и закидываю строку в кэш.
if GetLocalPlayer() == p then
        set udg_S1 = BlzGetAbilityExtendedTooltip('Adef', 0)
        call StoreStringBJ( udg_S1, "A", "B", udg_DATA )
endif
Затем синхронизирую кэш.
if GetLocalPlayer() == p  then
        call SyncStoredString( udg_DATA, "A", "B"  )
endif

call TriggerSleepAction( 2.00 )
И выгружаю в глобалку строку из кэша.
set udg_S2 = GetStoredStringBJ("A", "B", udg_DATA)
Ожидал того, что переменная S2 отобразится всем игрокам со значением красного игрока, но все игроки видят только свои локальные значения, т.е. синхронизации не произошло.
Или на 1.33 - call SyncStoredString не работает?

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

это делается через BlzTriggerRegisterPlayerSyncEvent и BlzSendSyncData
`
ОЖИДАНИЕ РЕКЛАМЫ...
Этот комментарий удален
0
6
1 год назад
Отредактирован Real60Hz
0
SyncStoredString вроде как работает, но я сам ни разу не смог его заставить работать на 1.26а. Говорили мне что он даже самые короткие строки очень долго синкает. С этим вопросом лучше к одному пользователю quq_CCCP.
2
14
1 год назад
2
У функции SyncStoredString реализована отправка команды синхронизации, но не её прием.
Более того, все команды, что будут идти сразу за ней в одном буфере действий игрока проигнорируются.
Вызов следующего кода приведет к тому, что юнит визуально будет выделен, но на команды реагировать не будет.
call SyncStoredString(Cache, Key1, Key2)
call SelectUnit(u, True)
1
26
1 год назад
Отредактирован Hate
1
это делается через BlzTriggerRegisterPlayerSyncEvent и BlzSendSyncData
Принятый ответ
0
5
1 год назад
0
IceFog, не очень понял. Т.е. вывести Игроку 1 локальные данные Игрока 2 таким способом не получится?

Hate, только с Lua?
0
8
1 год назад
0
Artem48, при чем тут Lua? API функций одинаковый же
0
27
1 год назад
Отредактирован MpW
0
Artem48, как пример синха посмотри. Не обязательно в луа

основные нативки синха
---@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)
Есть триггер с событием синха BlzTriggerRegisterPlayerSyncEvent
local syncTrigger = CreateTrigger()
    for int = 0, bj_MAX_PLAYERS - 1 do
        BlzTriggerRegisterPlayerSyncEvent(syncTrigger, Player(int), "CreateUnitByButton", false)
    end
    TriggerAddAction(syncTrigger, function()
        local player = GetTriggerPlayer()
        CreateUnit(player, BlzGetTriggerSyncData() , GetPlayerStartLocationX(player), GetPlayerStartLocationY(player), 0)        
    end)
И есть действие вызова синха
if GetLocalPlayer() == GetTriggerPlayer() then
            BlzSendSyncData("CreateUnitByButton", selectedUnitType)
end
Есть еще prefix - название запуска, и data - то, что хочешь отправить или синхронизировать. BlzGetTriggerSyncPrefix() и BlzGetTriggerSyncData() работают внутри триггера с событием синха, отображая какой префикс и дата
0
5
1 год назад
0
Попробовал с новыми нативками и получил рассинхрон.
Взял локальное значение строки у игрока и отправил его на синхронизацию
    if GetLocalPlayer() == p then
        set s = BlzGetAbilityExtendedTooltip('Adef', 0)
    endif
    call BlzSendSyncData("A", s)
Как я понял, синхронизированное значение мне надо отловить отдельным триггером.
function Trig_SyncEvent_Actions takes nothing returns nothing
   set udg_S = BlzGetTriggerSyncData()
   call DisplayTimedTextToForce( GetPlayersAll(), 30, udg_S )
endfunction

//===========================================================================
function InitTrig_SyncEvent takes nothing returns nothing
    set gg_trg_SyncEvent = CreateTrigger(  )
    call BlzTriggerRegisterPlayerSyncEvent (gg_trg_SyncEvent, Player(0), "A", false)
    call BlzTriggerRegisterPlayerSyncEvent (gg_trg_SyncEvent, Player(1), "A", false)
    call TriggerAddAction( gg_trg_SyncEvent, function Trig_SyncEvent_Actions )
endfunction
Помимо вывода строки на экран, никаких действий с синхронизируемой переменной, грозящих дисконектом, я не проводил.
0
27
1 год назад
Отредактирован MpW
0
Artem48, и не работает ваш код? Эх.. мне самому интересно. как работает ли само событие. вроде как я их использовал в фреймах, и тестил на синх вроде норм работало.. но это не точно.

У нас Hate специалист по ним. Стучи в личку
0
5
1 год назад
0
МрачныйВорон, короч я просто тупой)
call BlzSendSyncData надо же использовать локально для игрока...
А событие работает. Всем спасибо, разобрался!
Чтобы оставить комментарий, пожалуйста, войдите на сайт.