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

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

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

PS Честно раздражает, и сильно, когда пишут "можно проверить"
Можно проверить все, но зачем тогда вообще другие люди, если все делать самостоятельно
4
21
6 лет назад
Отредактирован Raised
4
Проверить обычно получается быстрее чем дождаться ответа.
2
28
6 лет назад
2
вот через ForceUIKey без локального игрока - еще могло бы
Почему? Ты же не создаёшь хендл или что-то в этом роде.
через call SelectUnitForPlayerSingle
Дело в том, что чтобы нажать L только у конкретного игрока тоже нужно условие с GetLocalPlayer(), а если использовать эту функцию, то тогда одно и тоже условие вычислится два раза. Зачем? Потому я и написал
if GetLocalPlayer() == owner then
    call ClearSelection()
    call SelectUnit(u, true)
    call ForceUIKey("L")
endif
SelectUnit() ДОБАВЛЯЕТ юнита в выделение игрока, если flag == true, потому написал ещё и ClearSelection(), что очищает выделение у игрока. Но необходимость этой функции зависит от контекста.
Raised:
Проверить обычно быстрее чем дождаться ответа.
Я так на много своих вопросов и ответил.
0
21
6 лет назад
0
Raised, в этом случае нет
у меня сто лет на том, что когда-то было варкрафтом, не настроен нетплей
так что ни о каких "с другом по сетке" и речи не идет
JNGP с эмуляцией вообще только не так давно в ЛС прислали, спасибо, и вот прям ща устанавливать его и разбираться ни времени, ни желания
и вообще если задается вопрос очевидно что в данном случае проще ответ от других получить
PT153, "одно и тоже условие вычислится два раза" - т. е. тут речь только о производительности? Тогда не сильно важно, это все равно прелоад при загрузке карты всего и вся, если там на долю секунды какую-то он будет дольше - это не критично. Мне важно отсутствие десинка.
Ятп, десинка не будет. Да, даже через ForceUIKey без локального игрока не получается... просто подумалось, что у других игроков могли бы быть выделены юниты с абилами с хоткеем L (хотя у меня такие если и есть, то очень мало), но все равно десинка-то не получается, выделения-то эти не локальные.
Всё, спасибо.
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, это комментарий не для функции а для блока (т.е. для всего ифа)
чтобы не пихали в этот блок создание юнитов и прочие
его написали как предупреждение для тех кто собирается редактировать этот код
либо копировать и потом редактировать
Чтобы оставить комментарий, пожалуйста, войдите на сайт.