21

» WarCraft 3 / Помогите с функцией

Steal nerves, да не, не скромничайте! Ясное дело, что у Вас получилось лучше, потому что не создаётся куча событий.
21

» WarCraft 3 / Помогите с функцией

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.
21

» WarCraft 3 / Помогите с функцией

теперь понятно. насколько я знаю, по юниту невозможно определить игрока, который его держит выделенным. думаю, что тут нужна г. переменные типа группа, в которых будут хранится выделенные юниты для каждого игрока. а после того, как вы спрятали юнита выбираете для игроков юнитов из группы. если не понятно, то вечером напишу решение.
21

» WarCraft 3 / Помогите с функцией

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

» WarCraft 3 / Помогите с функцией

Как себя поведет функция если будут юниты несколько игроков ??
в группу будут добавлены абсолютно все воины, которые выделены своими владельцами в радиусе 512.0.
В вашем коде Вы добавляете воина в ту же группу, в котором перебираете воинов.
21

» WarCraft 3 / Как играть онлайн?

сказали что нужна лицензия, а где её брать - неизвестно
Здесь можно приобрести лицензию.
21

» WarCraft 3 / Помогите с функцией

лучше сделайте 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
21

» WarCraft 3 / Как через улучшение, увеличить количество выходящих юнитов?

"Уровень такой-то" это уровень чего?
Как чего? ) Уровень вашего улучшения.
Если уровень равен "0", то создать таких-то юнитов в количестве "a". (это когда улучшение еще ни разу не прокачено)
Если уровень равен "1", то создать таких-то юнитов в количестве "х".
Если уровень равен "2", то создать таких-то юнитов в количестве "n"...
Эти условия нужно вставить туда, где у Вас триггер создания этих самых юнитов.
21

» WarCraft 3 / Как через улучшение, увеличить количество выходящих юнитов?

Если у Вас воины создаются триггерно, то перед призывом воинов делаете разные проверки на уровень необходимого улучшения. Если уровень такой-то, то призвать такой тип воинов в количестве n, если уровень другой, то призвать другого нужного воина в нужном количестве. - это если делать через if then else.
Также, можете создать глобальные переменные, в которых будут храниться тип юнитов и их количество. Когда боевая единица завершает исследование - меняете значение переменных.
А при призыве воинов указываете вместо конкретного типа и количества вышеперечисленные переменные.
21

» WarCraft 3 / Как заменить BJ-функции?

А это очень важный момент!
это не важный момент!
Важный момент в том, что во всех этих картах Вы не увидите никакого GUI. Потому что все оптимизаторы его удаляют!
21

» WarCraft 3 / Как заменить BJ-функции?

ЛОЛ, Dagger667, зачем мне переделывать 15000 карт, если они не мои? Все хорошие карты защищены, если их взломать, то там не будет никакого GUI! Если Вы хотели сделать доброе дело и оптимизировать 15000 карт одной своей библиотекой для GUI, которого не будет во взломанных картах, то удачи!
21

» WarCraft 3 / Как заменить BJ-функции?

Зачем что-то делать для GUI, если при сохранении карты это всё превращается в чистый JASS? Не проще ли сразу написать на JASS, при этом полностью контролируя, что пишите. Писать на JASS быстрее, легче и понятнее. Зачем тогда вообще нужен GUI?
ну разве что тем, кто не желает учиться JASS'y.
21

» WarCraft 3 / Можно ли как-то выбрать точки на карте?

Можно после использования не удалять их, а заносить в сток, когда надо - берёте из стока.
21

» WarCraft 3 / Не работает триггер на убийство переменной типа боевая единица

Возможно, проблема в событии триггера, для того, чтобы сработал триггер при выходе из региона, нужно чтобы этот юнит изначально находился внутри региона. Если у Вас не появляется текст "111" (который Вы указали), то проблема точно в этом.
21

» WarCraft 3 / triggeraction внутри triggercondition

quq_CCCP, да, было бы очень здорово! Хотел бы посмотреть, как Вы пишите не только спеллы, но и вообще код в целом. Буду весьма признателен, если у Вас еще есть код ИИ для ботов. Я просто понятия не имею, как писать ИИ. Запускать кучу таймеров с проверками, которые если истинны, то делать то, иначе это?
quq_CCCP:
в кондишенах не работают вейты и синх
Что за "синх"? Синхронизация что ли? А что там синхронизируется? Я что-то не понял.
21

» WarCraft 3 / triggeraction внутри triggercondition

quq_CCCP, точно также подумал. И пришел вот к чему: в triggercondition, если условие истинно, то функция не возвращает true, а запускает функцию triggeraction через "call FuncName( )". А так как функция запускается через "call", то можно передавать туда аргументы:
	function conditions takes nothing returns nothing
		if ( GetSpellAbilityId( ) == 'A000' ) then
			call actions( GetSpellAbilityUnit( ), GetSpellTargetUnit( ) и т. д. )
		endif

		return false
	endfunction
То есть мы на халяву получаем уже готовые инициализированные локальные переменные, которые не нужно нулить.
Имеет ли это смысл?
21

» WarCraft 3 / Найм воинов из нейтрального здания

Valentine122, так я же написал:
при этом не имея поблизости подконтрольного воина
И на карте выбрать некого. Нужно чтобы работало именно без выбора воина.
21

» WarCraft 3 / Передача аргументов в функции callback'ов

quq_CCCP, кажется, что не кешируется, данный код каждый раз выдает разные цифры:
	local  boolexpr  b  =  Condition( SetCodeOneArg( function DamageTarget_GroupCallback, HAND, GetHandleId( blademaster ) ) )
	call BJDebugMsg( I2S( GetHandleId( b ) ) )
))
21

» WarCraft 3 / Передача аргументов в функции callback'ов

quq_CCCP, да, хорошая наработка! Вот только возникли 2 вопроса к ней:
  • Может ли данная наработка где-то дать сбой?
  • Так и не понял, как передавать аргументы в boolexpr'ы. Раньше я все boolexpr'ы сохранял в глобальные переменные при инициализации, а дальше использовал эти переменные. В этой же наработке нельзя так сделать, ввиду того, что этих аргументов нету во время инициализации. Приходится каждый раз создавать boolexpr'ы, но нужно ли их после этого удалять? Кэшируются ли подобные boolexpr'ы?
21

» WarCraft 3 / Какие существуют альтернативы ветвлению ифами?

Alexey103, я почему-то думал, что автор этой темы и есть Вы. Раз уж не так, то загляните туда, там автор задавал аналогичный вопрос.