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

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

  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
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
4
19
5 лет назад
4
Похожие вопросы:

ответ
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

1
27
5 лет назад
Отредактирован MpW
1
  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
Загруженные файлы
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.