Раньше не приходилось юзать эту функцию.
Допустим, я делаю так: ставлю спеллбуку хоткей L, выделяю игроку подконтрольного юнита с ним и пишу:
call ForceUIKey("L")
Десинка при сетевой игре же не будет? В самой функции это предусмотрено?
Никакими GetLocalPlayer эти действия вокруг дополнительно не опоясываются.

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

Если просто написать ForceUIKey(), то тогда L нажмётся у всех игроков. Смотри ForceUIKeyBJ.
Да и чтобы выделить юнита только конкретному игроку, нужно также написать перед SelectUnit() условие с GetLocalPlayer().
if GetLocalPlayer() == owner then
    call ClearSelection()
    call SelectUnit(u, true)
    call ForceUIKey("L")
endif
А десинк можно проверить с другом по сетке или через эмуляцию.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
2
28
6 лет назад
Отредактирован PT153
2
Вот статья про GetLocalPlayer, если нужно.
0
21
6 лет назад
Отредактирован ClotPh
0
////////
У меня вот что крч будет:
//ПРЕЛОАД ВЫДЕЛЕНИЯ ОБЪЕКТОВ И ОТКРЫТИЯ СПЕЛЛБУКОВ

    set bj_forLoopAIndex = 1
    set bj_forLoopAIndexEnd = 12
    loop
        exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
        call SetUnitOwner( gg_unit_ogru_0009, ConvertedPlayer(GetForLoopIndexA()), true )
        call SelectUnitForPlayerSingle( gg_unit_ogru_0009, ConvertedPlayer(GetForLoopIndexA()) )
        call ForceUIKeyBJ(ConvertedPlayer(GetForLoopIndexA()),"L")
        call SetUnitOwner( gg_unit_ogru_0009, Player(PLAYER_NEUTRAL_AGGRESSIVE), true )
        
        call SelectUnitForPlayerSingle( gg_unit_ogru_0009, ConvertedPlayer(GetForLoopIndexA()) )
        call SelectUnitForPlayerSingle( gg_unit_ogru_0009, ConvertedPlayer(GetForLoopIndexA()) )
        call SelectUnitForPlayerSingle( gg_unit_ogru_0009, ConvertedPlayer(GetForLoopIndexA()) )
        call SelectUnitForPlayerSingle( gg_unit_ogru_0009, ConvertedPlayer(GetForLoopIndexA()) )
        call SelectUnitForPlayerSingle( gg_unit_ogru_0009, ConvertedPlayer(GetForLoopIndexA()) )
        call SelectUnitForPlayerSingle( gg_unit_ogru_0009, ConvertedPlayer(GetForLoopIndexA()) )

        call SelectUnitForPlayerSingle( gg_unit_ogru_0009, ConvertedPlayer(GetForLoopIndexA()) )
        call SelectUnitForPlayerSingle( gg_unit_ogru_0009, ConvertedPlayer(GetForLoopIndexA()) )
        call SelectUnitForPlayerSingle( gg_unit_ogru_0009, ConvertedPlayer(GetForLoopIndexA()) )
        call SelectUnitForPlayerSingle( gg_unit_ogru_0009, ConvertedPlayer(GetForLoopIndexA()) )
        call SelectUnitForPlayerSingle( gg_unit_ogru_0009, ConvertedPlayer(GetForLoopIndexA()) )
        call SelectUnitForPlayerSingle( gg_unit_ogru_0009, ConvertedPlayer(GetForLoopIndexA()) )

        call SelectUnitForPlayerSingle( gg_unit_ogru_0009, ConvertedPlayer(GetForLoopIndexA()) )
        call SelectUnitForPlayerSingle( gg_unit_ogru_0009, ConvertedPlayer(GetForLoopIndexA()) )
        call SelectUnitForPlayerSingle( gg_unit_ogru_0009, ConvertedPlayer(GetForLoopIndexA()) )
        call SelectUnitForPlayerSingle( gg_unit_ogru_0009, ConvertedPlayer(GetForLoopIndexA()) )
        call SelectUnitForPlayerSingle( gg_unit_ogru_0009, ConvertedPlayer(GetForLoopIndexA()) )
        call SelectUnitForPlayerSingle( gg_unit_ogru_0009, ConvertedPlayer(GetForLoopIndexA()) )

        call SelectUnitForPlayerSingle( gg_unit_ogru_0009, ConvertedPlayer(GetForLoopIndexA()) )

    call ClearSelectionForPlayer( ConvertedPlayer(GetForLoopIndexA()) )
        
        set bj_forLoopAIndex = bj_forLoopAIndex + 1
    endloop

//ПРЕЛОАД ВЫДЕЛЕНИЯ ОБЪЕКТОВ И ОТКРЫТИЯ СПЕЛЛБУКОВ - ЗАКРЫТО.
gg_unit_ogru_0009 - это левый бугай, который гонялся на отдельной карте. Вместо него я ща посмотрю глобалки изначально расположенных 20 объектов и вставлю их (первый вот тот, где еще дополнительно меняется владелец и открывается спеллбук, остальные 19 просто нужно последовательно выделить по отдельности).
2
28
6 лет назад
Отредактирован PT153
2
local Player p
local integer i = 0
loop
    exitwhen i > 11
    set p = Player(i)
    call SetUnitOwner( gg_unit_ogru_0009, p, true )
    if GetLocalPlayer() == p then
        call SelectUnit( gg_unit_ogru_0009, true)
        call ForceUIKey("L")
        // Пиши сколько нужно SelectUnit(whichUnit, true), но не забудь прописать ClearSelection() после выбора 12 юнитов.
    endif
    // Передача юнита нейтралу будет совершена после цикла, всё равно ты его будешь давать разным игрокам.
    set i = i + 1
endloop
call ClearSelection()
call SetUnitOwner( gg_unit_ogru_0009, Player(PLAYER_NEUTRAL_AGGRESSIVE), true )
set p = null //Необязательно.
0
21
6 лет назад
0
PT153, спасибо, видно, что оптимальнее
но сложнее для копипаста, т. к. требуются локалки, а функция там прелоада очень большая и мне неудобно будет вставлять вниз и вверх
т. к. в моем коде ошибок и десинков нет, а это не для какого-нибудь часто применяемого заклинания, а для одноразового прелоада, все же использую его нврн
но все равно спасибо
просто это тот случай, когда мне удобнее написать 2+2+2+2, чем 2*4
потому что 2+2+2+2 - понятнее.
0
18
6 лет назад
0
Даже близзарды предупреждают что ForceUIKey надо использовать локально
function ForceUIKeyBJ takes player whichPlayer, string key returns nothing
    if (GetLocalPlayer() == whichPlayer) then
        // Use only local code (no net traffic) within this block to avoid desyncs.
        call ForceUIKey(key)
    endif
endfunction
6
16
6 лет назад
6
rofl знатоки английского в треде. вообще=-то они предупреждают в каждой своей функции с LocalPlayer, что там надо аккуратнее с командами, ибо асинхронный код)
0
18
6 лет назад
0
DracoL1ch:
rofl знатоки английского в треде. вообще=-то они предупреждают в каждой своей функции с LocalPlayer, что там надо аккуратнее с командами, ибо асинхронный код)
Use only local code (no net traffic) within this block to avoid desyncs.
Используйте только локальный код (нет сетевого трафика) в этом блоке чтобы избежать десинхрон
Может я неправильно понял?
4
28
6 лет назад
Отредактирован nvc123
4
UrsaBoss, это комментарий не для функции а для блока (т.е. для всего ифа)
чтобы не пихали в этот блок создание юнитов и прочие
его написали как предупреждение для тех кто собирается редактировать этот код
либо копировать и потом редактировать
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.