Не могу записать значение из функции abc
function abc takes nothing returns nothing
local unit u = GetEnumUnit()
local player p = GetOwningPlayer(u)
if (( IsUnitSelected(u,p)== true)) then
/ Сюда записать юнитов которые выделены
И вернуть эти значения в myaction
endif
return
endfunction
function myaction takes nothing returns nothing
local unit d = GetDyingUnit()
local real x = GetUnitX(d)
local real y = GetUnitY(d)
local group g = CreateGroup()
local group g2 = CreateGroup() добавить юнитов из abc в g2
call GroupEnumUnitsInRange( g, x, y, 512, null)
endfunction

Steal nerves, в Вашем способе, если был выбран вражеский воин, то он обратно не выбирается.
- Предлагаю такой вариант:
    globals
        group  array  selectedUnits
    endglobals


    function HideEnumUnit takes nothing returns nothing
        call ShowUnit( GetEnumUnit( ), false )
    endfunction


    function ShowEnumUnit takes nothing returns nothing
        call ShowUnit( GetEnumUnit( ), true )
    endfunction
    
    
    function actions takes nothing returns nothing
        local  unit     triggerUnit  =  GetTriggerUnit( )
        local  integer  playerId     =  GetPlayerId( GetTriggerPlayer( ) )
        local  group    tGroup       =  null
        local  unit     tUnit        =  null
        local  real     x            =  0.0
        local  real     y            =  0.0

        if ( GetTriggerEventId( ) == EVENT_PLAYER_UNIT_SELECTED ) then

            if ( selectedUnits[ playerId ] == null ) then
                set  selectedUnits[ playerId ]  =  CreateGroup( )
                call GroupAddUnit( selectedUnits[ playerId ], triggerUnit )
                call BJDebugMsg( GetUnitName( triggerUnit ) + " selected" )

            elseif ( selectedUnits[ playerId ] != null ) then
                call GroupAddUnit( selectedUnits[ playerId ], triggerUnit )
                call BJDebugMsg( GetUnitName( triggerUnit ) + " selected" )
            endif



        elseif ( GetTriggerEventId( ) == EVENT_PLAYER_UNIT_DESELECTED ) then
            call GroupRemoveUnit( selectedUnits[ playerId ], triggerUnit )
            call BJDebugMsg( GetUnitName( triggerUnit ) + " deselected" )



        elseif( GetTriggerEventId( ) == EVENT_PLAYER_UNIT_DEATH ) then

            set  x  =  GetUnitX( triggerUnit )
            set  y  =  GetUnitY( triggerUnit )

            if ( GetUnitTypeId( triggerUnit ) == 'halt' ) then

                call ClearSelection( )

                set  tGroup  =  CreateGroup( )
                call GroupEnumUnitsInRange( tGroup, x, y, 512.0, null )
                call ForGroup( tGroup, function HideEnumUnit )
                call CreateUnit( Player( 0 ), 'halt', x, y, bj_UNIT_FACING )
                call ForGroup( tGroup, function ShowEnumUnit )

                call SelectGroupForPlayerBJ( selectedUnits[ 0 ], Player( 0 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 1 ], Player( 1 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 2 ], Player( 2 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 3 ], Player( 3 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 4 ], Player( 4 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 5 ], Player( 5 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 6 ], Player( 6 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 7 ], Player( 7 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 8 ], Player( 8 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 9 ], Player( 9 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 10 ], Player( 10 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 11 ], Player( 11 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 12 ], Player( 12 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 13 ], Player( 13 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 14 ], Player( 14 ) )
                call SelectGroupForPlayerBJ( selectedUnits[ 15 ], Player( 15 ) )
            endif

        endif

        call DestroyGroup( tGroup )
        set  triggerUnit  =  null
    endfunction


function InitTrig_Untitled_Trigger_001_Copy_Copy takes nothing returns nothing
    local  trigger  trig  =  CreateTrigger( )

    call TriggerRegisterPlayerUnitEvent( trig, Player( 0 ), EVENT_PLAYER_UNIT_SELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 1 ), EVENT_PLAYER_UNIT_SELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 2 ), EVENT_PLAYER_UNIT_SELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 3 ), EVENT_PLAYER_UNIT_SELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 4 ), EVENT_PLAYER_UNIT_SELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 5 ), EVENT_PLAYER_UNIT_SELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 6 ), EVENT_PLAYER_UNIT_SELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 7 ), EVENT_PLAYER_UNIT_SELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 8 ), EVENT_PLAYER_UNIT_SELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 9 ), EVENT_PLAYER_UNIT_SELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 10 ), EVENT_PLAYER_UNIT_SELECTED,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 11 ), EVENT_PLAYER_UNIT_SELECTED,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 12 ), EVENT_PLAYER_UNIT_SELECTED,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 13 ), EVENT_PLAYER_UNIT_SELECTED,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 14 ), EVENT_PLAYER_UNIT_SELECTED,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 15 ), EVENT_PLAYER_UNIT_SELECTED,  null )

    call TriggerRegisterPlayerUnitEvent( trig, Player( 0 ), EVENT_PLAYER_UNIT_DESELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 1 ), EVENT_PLAYER_UNIT_DESELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 2 ), EVENT_PLAYER_UNIT_DESELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 3 ), EVENT_PLAYER_UNIT_DESELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 4 ), EVENT_PLAYER_UNIT_DESELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 5 ), EVENT_PLAYER_UNIT_DESELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 6 ), EVENT_PLAYER_UNIT_DESELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 7 ), EVENT_PLAYER_UNIT_DESELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 8 ), EVENT_PLAYER_UNIT_DESELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 9 ), EVENT_PLAYER_UNIT_DESELECTED,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 10 ), EVENT_PLAYER_UNIT_DESELECTED,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 11 ), EVENT_PLAYER_UNIT_DESELECTED,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 12 ), EVENT_PLAYER_UNIT_DESELECTED,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 13 ), EVENT_PLAYER_UNIT_DESELECTED,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 14 ), EVENT_PLAYER_UNIT_DESELECTED,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 15 ), EVENT_PLAYER_UNIT_DESELECTED,  null )

    call TriggerRegisterPlayerUnitEvent( trig, Player( 0 ), EVENT_PLAYER_UNIT_DEATH,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 1 ), EVENT_PLAYER_UNIT_DEATH,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 2 ), EVENT_PLAYER_UNIT_DEATH,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 3 ), EVENT_PLAYER_UNIT_DEATH,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 4 ), EVENT_PLAYER_UNIT_DEATH,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 5 ), EVENT_PLAYER_UNIT_DEATH,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 6 ), EVENT_PLAYER_UNIT_DEATH,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 7 ), EVENT_PLAYER_UNIT_DEATH,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 8 ), EVENT_PLAYER_UNIT_DEATH,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 9 ), EVENT_PLAYER_UNIT_DEATH,   null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 10 ), EVENT_PLAYER_UNIT_DEATH,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 11 ), EVENT_PLAYER_UNIT_DEATH,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 12 ), EVENT_PLAYER_UNIT_DEATH,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 13 ), EVENT_PLAYER_UNIT_DEATH,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 14 ), EVENT_PLAYER_UNIT_DEATH,  null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 15 ), EVENT_PLAYER_UNIT_DEATH,  null )

    call TriggerAddAction( trig, function actions )

    set trig = null
endfunction
для работы требуется JNGP.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
18
В myaction после добавления в группу
loop
d = FirstUnitOfGroup(g)
условие
GroupAddUnit(g2,d)
endif
GroupRemoveUnit(g,d)
endloop
3
Я запутался совсем(
вот как сделал
local group g = CreateGroup()
local group g2 = CreateGroup()
call GroupEnumUnitsInRange( g, x, y, 512, null)
local unit u
local player p
local integer i = CountUnitsInGroup(g)
loop
exitwhen i < 1
set u = FirstOfGroup(g)
set p = GetOwningPlayer(u)
if (( IsUnitSelected(u,p)== true)) then
call GroupAddUnit(g2,u)
endif
call GroupRemoveUnit(g,u)
set i = CountUnitsInGroup(g)
endloop
call DestroyGroup(g)
Что-то не выходит
21
лучше сделайте abc( ) boolexpr'ом. и впишите это вместо null, где у Вас GroupEnumUnitsInRange( ). В этом случае нужда в группе g2 отпадает, а нужные юниты будут добавлены в группу g.
	function abc takes nothing returns boolean
		return IsUnitSelected( GetFilterUnit( ), GetOwningPlayer( GetFilterUnit( ) ) ) 
	endfunction


	function myaction takes nothing returns nothing
		local unit  d = GetDyingUnit( )
		local real  x = GetUnitX( d )
		local real  y = GetUnitY( d )
		local group g = CreateGroup( )

		call GroupEnumUnitsInRange( g, x, y, 512.0, Condition( function abc ) )
//		в данном случае, все выделенные юниты будут в группе "g".

//		в конце не забудьте удалить группу, если она не нужна, и обнулить локальные переменные.
	endfunction
3
лучше сделайте abc( ) boolexpr'ом. и впишите это вместо null, где у Вас GroupEnumUnitsInRange( ). В этом случае нужда в группе g2 отпадает, а нужные юниты будут добавлены в группу g.
Идеально подошло спасибо!
А тут что не так:
local unit d = GetDyingUnit()
local real x = GetUnitX(d)
local real y = GetUnitY(d)
local group g = CreateGroup()
call GroupEnumUnitsInRange( g, x, y, 512, null)
local unit u
local player p
loop
exitwhen u == 0
set u = FirstOfGroup(g)
set p = GetOwningPlayer(u)
if (( IsUnitSelected(u,p)== true)) then
call GroupAddUnit(g,u)
endif
call GroupRemoveUnit(g,u)
endloop
И еще вопрос про abc
Как себя поведет функция если будут юниты несколько игроков ??
21
Как себя поведет функция если будут юниты несколько игроков ??
в группу будут добавлены абсолютно все воины, которые выделены своими владельцами в радиусе 512.0.
В вашем коде Вы добавляете воина в ту же группу, в котором перебираете воинов.
27
мб ты так хотел? ошибка
local unit d = GetDyingUnit() 
local real x = GetUnitX(d)
local real y = GetUnitY(d)
local group g = CreateGroup()
call GroupEnumUnitsInRange( g, x, y, 512, null)
local unit u
local player p = GetOwningPlayer(d) //будет так правильно, мы проверяем выделен ли владельцем GetDyingUnit
//цикл
loop
exitwhen u == null //условие выхода из цикла (выходит тогда, конца группа будет пуста)
set u = FirstOfGroup(g) //берет первого юнита группы

//если юнит не выбран, тогда удалить из группы. А те кто останутся, никогда не удаляться
if ( not IsUnitSelected(u,p)) then 
	call GroupRemoveUnit(g,u)
endif
endloop
//конец цикла 
проблема выделяется в ( not IsUnitSelected(u,p)) ты можешь не удалить всех юнитов из группы, не будет соблюдено условие выхода u == null (что группа пуста) а значит ОШИБКА. Короче нужно по-другому, например использовать вторую группу, добавляя всех выделенных, а в первой пусть удаляются до конца
посоветовал бы юзать фильтр, отсеивает не нужных. То что предложил ScopteRectuS выше, А то придется юзать более страшные конструкции, например вторую группу заюзать, чтобы добавить в нее.
3
Steal nerves:
посоветовал бы юзать фильтр, отсеивает не нужных.
Фильтр работает!
Но мне нужно записать игрока в переменную которому принадлежат выделенные юниты
и потом совершить действие выделенными юнитами для игрока
Вот весь код помогите пожалуйста, а то у меня уже голова трескается(
function abc takes nothing returns boolean
local unit u = GetFilterUnit()
local player p = GetOwningPlayer(u) нужно записать этих играков если таковы имеются
return IsUnitSelected(u,p)
endfunction
function hideg takes nothing returns nothing
call ShowUnitHide( GetEnumUnit() )
endfunction
function unhideg takes nothing returns nothing
call ShowUnitShow( GetEnumUnit() )
endfunction
function Trig_Untitled_Trigger_001_Copy_Actions takes nothing returns nothing
local unit d = GetDyingUnit()
local player p = GetOwningPlayer(d)
local real x = GetUnitX(d)
local real y = GetUnitY(d)
local group g = CreateGroup()
local group g2 = CreateGroup()
call GroupEnumUnitsInRange(g2,x,y,512,Condition(function abc))
call GroupEnumUnitsInRange( g, x, y, 512, null )
call ForGroup( g, function hideg)
call CreateNUnitsAtLoc (1,'eate',p,Location(x,y),bj_UNIT_FACING)
call ForGroup( g, function unhideg)
call SelectGroupForPlayerBJ( g2,p)// эту функцию нужно использовать не для p а для игроков чьи
юниты были фильтрованы
call DestroyGroup( g)
endfunction
Вот карта если что
Загруженные файлы
27
hell_bent, честно, не понял что ты хочешь сделать. Ты хочешь выделить (SelectGroupForPlayerBJ дать по контроль игроку) юнитов, которые уже и так выделены этим игроком?
21
Наверное, так. Правда тут какой-то бред у меня получился. Нам будет гораздо легче, если Вы скажите нам, что Вы хотели реализовать, а не какой код вы хотите.
	function Trig_Untitled_Trigger_001_Copy_Actions takes nothing returns nothing
        local unit   d   =  GetDyingUnit()
        local player p   =  GetOwningPlayer(d)
        local real   x   =  GetUnitX(d)
        local real   y   =  GetUnitY(d)
        local group  g   =  CreateGroup()
        local group  g2  =  CreateGroup()

        local unit   tUnit  =  null

        call GroupEnumUnitsInRange( g2, x, y, 512.0, Condition( function abc ) )
        call GroupEnumUnitsInRange( g, x, y, 512.0, null )
        call ForGroup( g, function hideg )
        call CreateUnit( p, 'eate', x, y, bj_UNIT_FACING )
        call ForGroup( g, function unhideg )

        loop
            set tUnit = FirstOfGroup( g2 )
            exitwhen ( tUnit == null )
            call GroupRemoveUnit( g2, tUnit )

            if ( GetLocalPlayer( ) == GetOwningPlayer( tUnit ) ) then
//              call ClearSelection( )
// 				Здесь небольшой баг. Выделенные юниты выделятся дополнительно к уже выделенным юнитам.
                call SelectUnit( tUnit, true )
//				Не совсем понятно, зачем Вы хотите выделить уже выделенных юнитов.
            endif
        endloop

        call DestroyGroup( g)     
    endfunction
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.