Как узнать какой воин был выбран игроком если их несколько?

  1. есть проверка boolean "юнит выделен игроком"
constant native IsUnitSelected takes unit whichUnit, player whichPlayer returns boolean
  1. есть пик в группу, которая выделяет всех выбранных игроком
native GroupEnumUnitsSelected takes group whichGroup, player whichPlayer, boolexpr filter returns nothing
  1. событие "юнит выбран игроком"/"юнит не выбран"
call TriggerRegisterPlayerUnitEvent( trig, Player( 0 ), EVENT_PLAYER_UNIT_SELECTED,  null )
call TriggerRegisterPlayerUnitEvent( trig, Player( 0 ), EVENT_PLAYER_UNIT_DESELECTED,   null )

  1. В мем хаке можно узнать первого выделенного юнита
много букв
Выдает адрес выделенного юнита, панель интерфейса, которая отображена на экране у локального игрока. Допустим выделив рамкой 2 юнитов: героя и раба, у вас будет отображаться в окне посерединке 2 иконки выделенных юнитов. Но сбоку меню будет переключено на героя (механика вара)
Если взять нажать Tab, можно переключать меню на другого юнита, так с героя на раба
так функции GetActiveUnitInSelection можно было узнать какой юнит нажал кнопку строить
globals    
	integer pGameUICurrentSelection
	integer pConvertUnitAddressToHandleIDNative=0
endglobals

//где-нибудь при инициализации
	set pGameClass2 = GameDLL + 0xAB4F80
	set pGameUICurrentSelection = RMem(RMem(pGameClass2)+0x3F4) //для выделения юнита
	set pConvertUnitAddressToHandleIDNative=GameDLL+0x2DCC40
	
	//конвентирует адрес в handle объекта
	//короче обратная сторона ConvertHandle
	function ConvertUnitAddressToHandleIDNative takes integer address returns integer
		return CallThisCallWith1Args(pConvertUnitAddressToHandleIDNative,address)
	endfunction

	//конвентирует адрес юнита в юнита
	//# +nosemanticerror
	function I2Unit takes integer i returns unit
		call setInt2Unit(ConvertUnitAddressToHandleIDNative(i))
		return l__Int2Unit
	endfunction
	
	//возвращает адрес активного юнита
	function GetActiveUnitInSelection takes nothing returns integer
        return RMem(pGameUICurrentSelection+0x238)
    endfunction
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
23
Похожие вопросы:

ответ
Steal nerves:
Какие декорации? Пытаешься навести на дерево или что? Вот, если юниты выделены у игрока, и их наводишь на дерево или на бочок/стены, то можно отловить приказ. Но не все юниты наводятся на дерево (только рабочие или каменный голем у ночных эльфов), даже игрок без юнитов не может выбрать деревце.
Но обычно когда игрок просто щелкает и наводит на такие декорации как бочок или ворота, то никак это отследить нельзя Стандартным способом никак, такого события нет =(( Если надо делать невыделяемым, то можно переделать декор на дерево попробовать, но на ворота и бочок зачем такое делать?
ответ
Слишком сложно.
Вот так попроще будет.
Код
function StringToPlayerColor takes string color returns playercolor
    set color = StringCase(color, false)
	
    if color == "red" then
        return PLAYER_COLOR_RED
    elseif color == "blue" then
        return PLAYER_COLOR_BLUE
    elseif color == "teal" then
        return PLAYER_COLOR_CYAN
    elseif color == "purple" then
        return PLAYER_COLOR_PURPLE
    elseif color == "yellow" then
        return PLAYER_COLOR_YELLOW
    elseif color == "orange" then
        return PLAYER_COLOR_ORANGE
    elseif color == "green" then
        return PLAYER_COLOR_GREEN
    elseif color == "pink" then
        return PLAYER_COLOR_PINK
    elseif color == "gray" then
        return PLAYER_COLOR_LIGHT_GRAY
    elseif color == "light blue" then
        return PLAYER_COLOR_LIGHT_BLUE
    elseif color == "dark green" then
        return PLAYER_COLOR_AQUA
    elseif color == "brown" then
        return PLAYER_COLOR_BROWN
    elseif color == "maroon" then
        return PLAYER_COLOR_MAROON
    elseif color == "navy" then
        return PLAYER_COLOR_NAVY
    elseif color == "turquoise" then
        return PLAYER_COLOR_TURQUOISE
    elseif color == "violet" then
        return PLAYER_COLOR_VIOLET
    elseif color == "wheat" then
        return PLAYER_COLOR_WHEAT
    elseif color == "peach" then
        return PLAYER_COLOR_PEACH
    elseif color == "mint" then
        return PLAYER_COLOR_MINT
    elseif color == "lavender" then
        return PLAYER_COLOR_LAVENDER
    elseif color == "coal" then
        return PLAYER_COLOR_COAL
    elseif color == "snow" then
        return PLAYER_COLOR_SNOW
    elseif color == "emerald" then
        return PLAYER_COLOR_EMERALD
    elseif color == "peanut" then
        return PLAYER_COLOR_PEANUT
    endif
	
    return null
endfunction

function StringToPlayer takes string color returns player
    local integer i
    set bj_setPlayerTargetColor = StringToPlayerColor(color)
	
    if bj_setPlayerTargetColor != null then
        set i = 1
        loop
            set bj_forceRandomCurrentPick = Player(i)
			if GetPlayerSlotState(bj_forceRandomCurrentPick) == PLAYER_SLOT_STATE_PLAYING and /*
            */ GetPlayerColor(bj_forceRandomCurrentPick) == bj_setPlayerTargetColor then
				return bj_forceRandomCurrentPick
			endif
			
            set i = i + 1
			
            exitwhen i == bj_MAX_PLAYERS
        endloop
    endif
	
    return null
endfunction

function KickPlayer takes nothing returns boolean
    call KillUnit(GetFilterUnit())
    return false
endfunction

function MyTrig_Actions takes nothing returns nothing
    local string color = GetEventPlayerChatString()
    local player p = StringToPlayer(SubString(color, 3, StringLength(color)))
    if p != null then
        call GroupEnumUnitsOfPlayer(bj_lastCreatedGroup, p, Filter(function KickPlayer))
        set p = null
    endif
endfunction

function InitMyTrig takes nothing returns nothing
    set gg_trg_My = CreateTrigger(  )
    call TriggerRegisterPlayerChatEvent( gg_trg_My, Player(0), "gg", false )
    call TriggerAddAction( gg_trg_My, function MyTrig_Actions )
endfunction
Должно работать.
Чутка подправил.
ответ
массиве кнопок будет пустое место
Пусть переменная А считает игроков, а переменная B считает кнопки.
Перед циклом B ставим на 0, если игрок есть, увеличиваем В и записываем в массив[В] твою кнопку.
ответ
Первая проблема решается просто, ещё один массив PlayerIndex.
Set PlayerIndex[Buf_B] = Integer A

А ещё после цикла ячейка Buf_B пропускается, потому новая кнопка записывается в ячейку Buf_B + 1.
ответ
Должно работать:
function GetRandomPlayerIndex takes nothing returns integer
    set udg_Buf_A = 0
    set bj_forLoopAIndex=0 //red
    set bj_forLoopAIndexEnd=10  //light blue
    loop
        exitwhen(bj_forLoopAIndex>bj_forLoopAIndexEnd)
        if(GetPlayerSlotState(Player(bj_forLoopAIndex))==PLAYER_SLOT_STATE_PLAYING)and(GetPlayerController(Player(bj_forLoopAIndex)))==MAP_CONTROL_USER)and(udg_AccEmpPlayer[bj_forLoopAIndex]==false)then
                set udg_PlayersPlay[udg_Buf_A]=Player(bj_forLoopAIndex)
                set udg_Buf_A=(udg_Buf_A+1)
        endif
    set bj_forLoopAIndex=bj_forLoopAIndex+1
    endloop
    set udg_Random=GetRandomInt(0,udg_Buf_A)
    set udg_RndPlayer=udg_PlayersPlay[udg_Random]
    return udg_RndPlayer
endfunction

27
  1. есть проверка boolean "юнит выделен игроком"
constant native IsUnitSelected takes unit whichUnit, player whichPlayer returns boolean
  1. есть пик в группу, которая выделяет всех выбранных игроком
native GroupEnumUnitsSelected takes group whichGroup, player whichPlayer, boolexpr filter returns nothing
  1. событие "юнит выбран игроком"/"юнит не выбран"
call TriggerRegisterPlayerUnitEvent( trig, Player( 0 ), EVENT_PLAYER_UNIT_SELECTED,  null )
call TriggerRegisterPlayerUnitEvent( trig, Player( 0 ), EVENT_PLAYER_UNIT_DESELECTED,   null )

  1. В мем хаке можно узнать первого выделенного юнита
много букв
Выдает адрес выделенного юнита, панель интерфейса, которая отображена на экране у локального игрока. Допустим выделив рамкой 2 юнитов: героя и раба, у вас будет отображаться в окне посерединке 2 иконки выделенных юнитов. Но сбоку меню будет переключено на героя (механика вара)
Если взять нажать Tab, можно переключать меню на другого юнита, так с героя на раба
так функции GetActiveUnitInSelection можно было узнать какой юнит нажал кнопку строить
globals    
	integer pGameUICurrentSelection
	integer pConvertUnitAddressToHandleIDNative=0
endglobals

//где-нибудь при инициализации
	set pGameClass2 = GameDLL + 0xAB4F80
	set pGameUICurrentSelection = RMem(RMem(pGameClass2)+0x3F4) //для выделения юнита
	set pConvertUnitAddressToHandleIDNative=GameDLL+0x2DCC40
	
	//конвентирует адрес в handle объекта
	//короче обратная сторона ConvertHandle
	function ConvertUnitAddressToHandleIDNative takes integer address returns integer
		return CallThisCallWith1Args(pConvertUnitAddressToHandleIDNative,address)
	endfunction

	//конвентирует адрес юнита в юнита
	//# +nosemanticerror
	function I2Unit takes integer i returns unit
		call setInt2Unit(ConvertUnitAddressToHandleIDNative(i))
		return l__Int2Unit
	endfunction
	
	//возвращает адрес активного юнита
	function GetActiveUnitInSelection takes nothing returns integer
        return RMem(pGameUICurrentSelection+0x238)
    endfunction
Загруженные файлы
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.