Имеется Функция Мемхака IsKeyPressed (virtual key) , Она позволяет узнать нажата ли определённая кнопка в данный момент, Вопрос, как отследить, какой именно из игроков нажимает кнопку?
Если обернуть функцию в GetLocalPlayer() , то это нужно как-то синхронизировать, как точно работают TriggerSyncStart() и TriggerSyncReady() я так и не понял, хотя читал какие-то статьи, а что можно использовать помимо GetLocalPlayer() я не знаю, пробовал ещё другие различные функции Варкрафта, но они не помогали, как-то так
Ниже это то, к чему я пришёл за эти часы, но оно не работает (размеется, там для игрока #2 не будет известно что игрок #1 нажал кнопку, синхронизации то нет)
function Trig_VirtualKeyFast_Actions takes nothing returns nothing
    local string pl = "123"
    call SaveStr(Hash, 123, 123, pl)
    local boolean Key_Q = false
    //call TriggerSyncStart()
    if GetLocalPlayer() == Player(0) then
        Key_Q = IsKeyPressed (81) 
    endif
    //call TriggerSyncReady()
    if Key_Q == true then
        call DisplayTextToForce( GetPlayersAll(), LoadStr(Hash, 123, 123)) 
    endif
endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...
23
Похожие вопросы:

ответ
Можно дать юниту какую-нить абилку и все время через Force UI Key заставлять игрока ее нажимать пока этот юнит выбран
И как только он эту абилку использует, значит меню закрыто

15
нормального универсального синка своих данных нет ни в джассе ни в мемхаке. Есть способы средней убогости (1, 2) для джасса и вджасса, можешь с ними пострадать. Для нормального синка на 1.24-1.28 можешь юзать UjAPI
32
function GetAsyncKeyState takes integer vk_key_code returns integer
	local integer retval = 0
	local integer nOffset1
	if pGetAsyncKeyState == 0 then
		set pGetAsyncKeyState = GetModuleProcAddress("User32.dll", "GetAsyncKeyState" )
	endif
	if pGetAsyncKeyState != 0 then 
		return CallStdcallWith1Args(pGetAsyncKeyState,vk_key_code)
	endif
	return retval
endfunction
Я думаю этот код сразу даёт понять, сингл плеер онли!
Для игр по сети там другой код используется...
28
привяжи просто клавишу к юниту и через выделение юнита синхай нажатие клавиши

11
Создаёшь глобалку SyncCache тип буфер игры.
Инициализируешь кэш
set udg_SyncCache = InitGameCacheBJ("Sync")
Пишешь первый триггер на отправку числа в кэш и синхронизацию значения в кэше. Который реагирует на событие выбор пехотинца в центре карты.
    local string vKeyLocalPlayer
    set vKeyLocalPlayer = I2S(GetPlayerId(GetLocalPlayer()))
    call StoreInteger(udg_SyncCache ,"Select",vKeyLocalPlayer,1)
    call SyncStoredInteger(udg_SyncCache ,"Select",vKeyLocalPlayer)
    call DisplayTextToForce( GetPlayersAll(), vKeyLocalPlayer)
Пишешь второй триггер на перебор всех игроков в кэше и если значение получено по выводишь сообщение. Триггер реагирует на событие таймер каждую секунду.
    local integer vvi = 0
    local integer MAX_PLAYERS = 2
    local string vKeyLocalPlayer
    loop
        exitwhen vvi>=MAX_PLAYERS
        set vKeyLocalPlayer = I2S(vvi)
        if (GetStoredInteger(udg_SyncCache,"Select",vKeyLocalPlayer ) == 1) then
	    call DisplayTextToForce( GetPlayersAll(), "NPlayer = " + vKeyLocalPlayer )
            call StoreInteger(udg_SyncCache ,"Select",vKeyLocalPlayer,0)
	    endif
        set vvi = vvi + 1
    endloop
Первое сообщение появляется сразу по выбору пехотинца. Второе через секунду как придёт синхронизация данных в кэше.
Прикрепляю тестовую карту.
Загруженные файлы
Чтобы оставить комментарий, пожалуйста, войдите на сайт.