Не могу записать значение из функции 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
Вот карта если что
Загруженные файлы
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.