Не могу записать значение из функции 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.
Загруженные файлы
0
19
6 лет назад
0
Похожие вопросы:

ответ
способности написаны не на jass
способности это часть движка
и стоит хоть иногда читать статьи прежде чем задавать вопросы
а если тебя интересуют функции jass то это в common.j
ответ
Нигде. Нет их. Стандартные спеллы не написаны на JASS, тебе же уже сказали.
ответ
Farrien, попробуй скопировать функции в отдельную карту и глянь будет ли там работать
и зачем ты написал udg_ перед 2 переменными?
ответ
тут дело в конфликте
ибо системные функции(создание стартовых точек,main и прочее) депротектор автоматически переносит в файл для пользовательских функций
и теперь тебе надо просто удалить их из этого файла
файл называется war3map.wct
вот на будущее статья

0
13
6 лет назад
0
В myaction после добавления в группу
loop
d = FirstUnitOfGroup(g)
условие
GroupAddUnit(g2,d)
endif
GroupRemoveUnit(g,d)
endloop
0
3
6 лет назад
0
Я запутался совсем(
вот как сделал
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)
Что-то не выходит
0
21
6 лет назад
Отредактирован scopterectus
0
лучше сделайте 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
0
13
6 лет назад
0
hell_bent, exitwhen u == null
0
3
6 лет назад
0
лучше сделайте 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
Как себя поведет функция если будут юниты несколько игроков ??
0
21
6 лет назад
Отредактирован scopterectus
0
Как себя поведет функция если будут юниты несколько игроков ??
в группу будут добавлены абсолютно все воины, которые выделены своими владельцами в радиусе 512.0.
В вашем коде Вы добавляете воина в ту же группу, в котором перебираете воинов.
0
13
6 лет назад
0
hell_bent, не 0, а null
0
27
6 лет назад
Отредактирован MpW
0
мб ты так хотел? ошибка
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 выше, А то придется юзать более страшные конструкции, например вторую группу заюзать, чтобы добавить в нее.
0
3
6 лет назад
0
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
Вот карта если что
Загруженные файлы
0
27
6 лет назад
Отредактирован MpW
0
hell_bent, честно, не понял что ты хочешь сделать. Ты хочешь выделить (SelectGroupForPlayerBJ дать по контроль игроку) юнитов, которые уже и так выделены этим игроком?
0
21
6 лет назад
Отредактирован scopterectus
0
Наверное, так. Правда тут какой-то бред у меня получился. Нам будет гораздо легче, если Вы скажите нам, что Вы хотели реализовать, а не какой код вы хотите.
	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
0
3
6 лет назад
Отредактирован hell_bent
0
Я постараюсь объяснить!
Я делаю триггер в котором на месте убитого здание будет создано новое здание.
(не построено а именно создано, как-бы подмена!)
Вроде ничего сложного одна функция) но есть проблема. Новое здание скачет, не
создается на том-же месте если вблизи(точки создание) есть юниты.
Эту проблему мне решить удалось.
Всего то нужно до создания здания (CreateNUnitsAtLoc )
пикнуть всех ближайших юнитов, скрыть их(ShowUnitHide)
потом после создание показать, (ShowUnitShow)
все идеально работает!!!
Но есть минус с пикнутых юнитов после (ShowUnitHide) снимается выделение.
Я попробовал решить эту проблему, отследив выделенных юнитов с помошью функции abc,
(так как не все юниты могут быть выделены игроками)
записать их в группу, и после (ShowUnitShow) вернуть выделение.
У меня получилось вернуть выделение только хозяину здания!
А нужно вернуть всем игрокам чьи юниты находились в эпицентре.
не могу их отследить и записать игроков.
В общем нужно скрыть действие ShowUnitHide,ShowUnitShow.
0
21
6 лет назад
0
теперь понятно. насколько я знаю, по юниту невозможно определить игрока, который его держит выделенным. думаю, что тут нужна г. переменные типа группа, в которых будут хранится выделенные юниты для каждого игрока. а после того, как вы спрятали юнита выбираете для игроков юнитов из группы. если не понятно, то вечером напишу решение.
0
3
6 лет назад
0
вечером напишу решение.
Было-бы здорово! Я новичок в этих делах, мне пока тяжело решать задачи подобного уровня. Но триггер необходим для моей карты.
0
27
6 лет назад
Отредактирован MpW
0
вот
function Trig_Untitled_Trigger_001_Copy_Conditions takes nothing returns boolean
    return( GetUnitTypeId(GetDyingUnit()) == 'halt' )
endfunction

function abc takes nothing returns boolean
local player p = GetOwningPlayer(GetFilterUnit())
 return IsUnitSelected(GetFilterUnit(),p)
endfunction 

function ASS takes nothing returns nothing
local unit u = GetEnumUnit()
local player p = GetOwningPlayer(u)
local integer i = GetPlayerId(p)

set udg_B[i] = IsUnitSelected(u,p)

set u = null
endfunction

function abd takes nothing returns boolean
local player p = Player(udg_A )
 return IsUnitSelected(GetFilterUnit(),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 integer i = 0

call GroupEnumUnitsInRange(g,x,y,512,Condition(function abc)) //берете выделяете всех юнитов
//самое внимание обратить на функцию ASS, добавил переменную udg_B, важную часть в следующем
//логическая переменная udg_B говорит, что у игрока были выделены юниты около алтаря, или не были
//хотя бы один юнит, и то скажет да"
call ForGroup(g, function ASS)

//цикл
//создаем для каждого игрока группу, которая запомнит всех выделенных юнитов

loop
    exitwhen i > 11 //условие выхода цикла (игроков всего 12)
    if udg_B[i] then //если номер игрока, у которого юниты выделены\, то создаем группу и пикаем всех юнитов
        set udg_GROUP[i] = CreateGroup()
        
        set udg_A = i //запоминаем номер в глобалку\, необходимо перенести значение в фильтр function abd
        call GroupEnumUnitsInRange(udg_GROUP[i],x,y,512,Condition(function abd)) //выделяем всех юнитов, которые выделены этим игроком
    endif
    set i = i + 1
endloop

call GroupClear(g) //очищаем общую группу
call GroupEnumUnitsInRange( g, x, y, 512, null ) //выделяем всех, и выделенных и не выделенных
call ForGroup( g, function hideg) //прячем

call CreateUnit(p,'eate',x,y,bj_UNIT_FACING) //создаем другой алтарь

call ForGroup( g, function unhideg) //показываем

call DestroyGroup(g) //общую группу удалить можно

//цикл
//теперь игрокам возвращаем подконтрольных юнитов

set i = 0

loop
    exitwhen i > 11
    if udg_B[i] then
        call SelectGroupForPlayerBJ( udg_GROUP[i],Player(i))
        call DestroyGroup(udg_GROUP[i])
        
        set udg_B[i] = false
    endif
    set i = i + 1
endloop

set g = null
set d = null
 
endfunction

//===========================================================================
function InitTrig_Untitled_Trigger_001_Copy_Copy takes nothing returns nothing
    set gg_trg_Untitled_Trigger_001_Copy_Copy = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Untitled_Trigger_001_Copy_Copy, EVENT_PLAYER_UNIT_DEATH )
    call TriggerAddCondition( gg_trg_Untitled_Trigger_001_Copy_Copy, Condition( function Trig_Untitled_Trigger_001_Copy_Conditions ) )
    call TriggerAddAction( gg_trg_Untitled_Trigger_001_Copy_Copy, function Trig_Untitled_Trigger_001_Copy_Actions )
endfunction
в первой карте ошибку обнаружил, поэтому выслал вторую
Загруженные файлы
2
21
6 лет назад
Отредактирован scopterectus
2
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.
Загруженные файлы
Принятый ответ
0
27
6 лет назад
Отредактирован MpW
0
ScopteRectuS, неплохо, хорошая система. Пробовал исправить, там условия неправильные и прочее. Но не получается.
IsUnitSelected - проверка не показывает, что вражеский юнит выбран игроком (только через события можно)
Можно еще попробовать через GroupEnumUnitsSelected - выбирает юнитов в группу, который может выделить другой игрок
1
32
6 лет назад
1
Это в мультиплеере синх выбора занимает время...
Имейте это в ввиду, если вам нужен выбор для не локальных действий.
3
27
6 лет назад
Отредактирован MpW
3
через GroupEnumUnitsSelected
не знаю, лучше или хуже. Пусть автор выбирает. Но по-моему лучше вариант ScopteRectuS, Пусть будет
function Trig_Untitled_Trigger_001_Copy_Conditions takes nothing returns boolean
    return( GetUnitTypeId(GetDyingUnit()) == 'halt' )
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 integer i = 0

loop
    exitwhen i > 11
    set udg_GROUP[i] = CreateGroup()
    call GroupEnumUnitsSelected(udg_GROUP[i], Player(i), null) //выделяем всех юнитов, которые выделены этим игроком
    set i = i + 1
endloop

call GroupEnumUnitsInRange( g, x, y, 512, null ) //выделяем всех вокруг
call ForGroup( g, function hideg) //прячем

call CreateUnit(p,'eate',x,y,bj_UNIT_FACING) //создаем другой алтарь

call ForGroup( g, function unhideg) //показываем

call DestroyGroup(g) //общую группу удалить можно

//цикл
//теперь игрокам возвращаем подконтрольных юнитов

set i = 0

loop
    exitwhen i > 11
    call SelectGroupForPlayerBJ( udg_GROUP[i],Player(i))
    call DestroyGroup(udg_GROUP[i])
    set i = i + 1
endloop

set g = null
set d = null
 
endfunction

//===========================================================================
function InitTrig_Untitled_Trigger_001_Copy_Copy takes nothing returns nothing
    set gg_trg_Untitled_Trigger_001_Copy_Copy = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Untitled_Trigger_001_Copy_Copy, EVENT_PLAYER_UNIT_DEATH )
    call TriggerAddCondition( gg_trg_Untitled_Trigger_001_Copy_Copy, Condition( function Trig_Untitled_Trigger_001_Copy_Conditions ) )
    call TriggerAddAction( gg_trg_Untitled_Trigger_001_Copy_Copy, function Trig_Untitled_Trigger_001_Copy_Actions )
endfunction
все-таки ошибся. простая проверка IsUnitSelected работает на врагов, но в прошлый раз в цикл в цикле не работало почему-то.
Загруженные файлы
0
3
6 лет назад
0
Работают оба варианта. Проверял по сети! Спасибо всем за помощь.
Система предложенная ScopteRectuS, впечатлила)
0
21
6 лет назад
0
Steal nerves, да не, не скромничайте! Ясное дело, что у Вас получилось лучше, потому что не создаётся куча событий.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.