21

» WarCraft 3 / Помогите с триггерным спеллом

Wadimiru, можно еще сделать через одного дамми-юнита. Нужно поставить на ноль анимацию каста и удалить способность 'Amov'. Не знаю как это влияет, но таким образом можно применять сколь угодно много способностей одновременно через одного дамми-юнита.
21

» WarCraft 3 / Ошибка сборки карты

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

» WarCraft 3 / vJass: как перебрать все экземпляры структуры?

Zahanc, не третий экземпляр, а то что хранится в ячейке c индексом 3.
struct data
	real x
	real y
endstruct
21

» WarCraft 3 / vJass: как перебрать все экземпляры структуры?

Zahanc, проще говоря, thistype( 0 ) вернет 0, то есть нулевую ячейку структуры. Слово thistype используется для того, чтобы не было ошибок при компиляции. Действует примерно также, как и integer( this ).
21

» WarCraft 3 / Как после смерти игрока выкинуть все вещи которые он понасобирал

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

» WarCraft 3 / vJass: как перебрать все экземпляры структуры?

- Я использую это:
struct linkedList
        private  static  constant  timer     period  =  CreateTimer( )
        private                    thistype  prev
        private                    thistype  next


        private stub method destroy takes nothing returns nothing

//          Здесь должен находится Ваш код.

            set  this.prev.next  =  this.next
            set  this.next.prev  =  this.prev

            if ( thistype( 0 ).next == 0 ) then
                call PauseTimer( thistype.period )
            endif

            call thistype.deallocate( this )
        endmethod


        private static method iterate takes nothing returns nothing
            local  thistype  this  =  thistype( 0 ).next

            loop
                exitwhen ( this == 0 )

//              Здесь должен находится Ваш код.

                call this.destroy( )

                set  this  =  this.next
            endloop
        endmethod


        private static method create takes nothing returns thistype
            local  thistype  this  =  thistype.allocate( )

            set  this.next         =  thistype( 0 )
            set  this.prev         =  thistype( 0 ).prev
            set  this.next.prev    =  this
            set  this.prev.next    =  this

//          Здесь должен находится Ваш код.
            
            if ( this.prev == 0 ) then
                call TimerStart( thistype.period, 0.03125, true, function thistype.iterate )
            endif

            return this
        endmethod


    endstruct
static method create takes nothing returns nothing
static method iterate takes nothing returns nothing
method destroy takes nothing returns nothing
Для работы этого двусвязного списка требуется создать 2-е переменные с именами next, prev.
21

» WarCraft 3 / Не удаляются группы игроков через цикл

Alexey103, ну так покажите свои попытки.
И вообще, Steal nerves сказал вам как сделать лучше всего.
call DisplayTextToPlayer( Player( bj_forLoopAIndex ), 0.0, 0.0, "|cFFFFFFFFНа вашем депозитном счету: |r" + I2S( udg_deposit[ bj_forLoopAIndex  ] ) )
21

» WarCraft 3 / Как задетектить написавшего в чат игрока?

Maniac_91, а я вообще все события пихаю всё в один триггер...))
А какое событие прокнуло проверяю в условии через функции GetTriggerEventId( ) и запускаю соответствующую action-функцию.
раскрыть
	private function conditions takes nothing returns boolean
        if     ( GetTriggerEventId( ) == EVENT_PLAYER_HERO_SKILL ) then
            call onAbilityLearn( GetLearningUnit( ) )

        elseif ( GetTriggerEventId( ) == EVENT_PLAYER_UNIT_ISSUED_ORDER ) then
            call onAutoCast( GetOrderedUnit( ) )

        elseif ( GetTriggerEventId( ) == EVENT_PLAYER_UNIT_ATTACKED ) then
            call onUnitAttacked( GetAttacker( ) )

        elseif ( GetTriggerEventId( ) == EVENT_UNIT_DAMAGED ) then
            call onUnitDamaged( GetEventDamageSource( ), GetTriggerUnit( ) )
        endif

        return false
    endfunction


    globals
        constant  trigger  BATTLE_TRANCE_TRIGGER  =  CreateTrigger( )
    endglobals


    public function Initialization takes nothing returns nothing
        call PreloadAbility( 'A00B' )

        call TriggerRegisterAnyGladiatorEvent  ( BATTLE_TRANCE_TRIGGER, EVENT_PLAYER_HERO_SKILL,        null )
        call TriggerRegisterAnyGladiatorEvent  ( BATTLE_TRANCE_TRIGGER, EVENT_PLAYER_UNIT_ISSUED_ORDER, null )
        call TriggerRegisterAnyGladiatorEvent  ( BATTLE_TRANCE_TRIGGER, EVENT_PLAYER_UNIT_ATTACKED,     null )
        call TriggerRegisterAnyUnitDamagedEvent( BATTLE_TRANCE_TRIGGER )
        call TriggerAddCondition               ( BATTLE_TRANCE_TRIGGER, Condition( function conditions ) )
    endfunction
21

» WarCraft 3 / Как задетектить написавшего в чат игрока?

- Видимо, автор хотел сделать вместо вот этого:
- Вот так в целях оптимизации:
- Но поверьте, на JASS это никакая не оптимизация, и то, что вы видите на втором скрине преобразуется в тоже самое, что и на первом скрине. Вот во что:
ScopteRectuS, Было бы прикольно если бы было событие просто любой игрок написал сообщение, ведь во многих случаях именно она и нужна, Хотя вроде события же не производять операций так что это чисто для удобства.
Такой функции даже на JASS нету. Несмотря на то, что это есть в GUI ( как на втором скрине ). Cобытия добавляются для каждого игрока отдельно.
Загруженные файлы
21

» WarCraft 3 / Как задетектить написавшего в чат игрока?

GetTriggerPlayer( ) - это функция, которая возвращает ( в данном случае ) написавшего в чат игрока. То есть игрок уже написал в чат и мы этой функцией ловим этого игрока. А как в событии отловить написавшего в чат игрока, если это событие и создаётся для того, чтобы отловить написавшего в чат игрока?
21

» WarCraft 3 / Система отлова нанесённого урона

	private function onUnitDecay takes nothing returns nothing
        call GroupRemoveUnit(allUnits, GetLeavingUnit())
    endfunction
21

» WarCraft 3 / Уровень боевой единицы

ClotPh, я знаю, но создание боевой единицы ресурсозатратно. В моем случае это вызовет фриз на несколько секунд, так как данная функция будет использоваться большое количество раз.
21

» WarCraft 3 / Когда-то уже просил найти утечки тут, и через годы... Снова...

nvc123, можно ещё сделать так:
- Заменить это:
- На это:
только не udg_playerforce, а udg_playergroup. Очепятку допустил.
Загруженные файлы
21

» WarCraft 3 / Существует ли карта способностей?

PrincePhoenix, да, не подумал об этом, если честно. Но в любом случае придётся соединять эти два кода, что может быть проблематично для начинающих.
21

» WarCraft 3 / Существует ли карта способностей?

Например, если вы хотите, чтобы при применении способности, воин прыгал в указанную точку, отбрасывая всех, кто оказался на точке приземления, а все, кого оттолкнули разлетаются по разные стороны и при столкновении в с другими воинами хилят их, если это союзник или наносит урон, если это враг...

Такой код можно только в ручную написать.
21

» WarCraft 3 / Существует ли карта способностей?

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

» WarCraft 3 / Опять утечка, может ли утекать переменная типа строка?

Alexey103, боюсь, что никак! Ведь в условии нельзя писать Custom Script, а на JASS вы отказываетесь переходить.
21

» WarCraft 3 / [jass] Кроме констант как можно добавить в массив?

globals
    integer array myVar [20999]
endglobals

function myFunc takes nothing returns nothing  
    set myVar[ 9999 ] = 1
endfunction
globals
	integer array s__myVar
	integer array s__2myVar
	integer array s__3myVar
endglobals

function sg__myVar_get takes integer i returns integer
    if(i<8191) then
        return s__myVar[i]
    elseif(i<16382) then
        return s__2myVar[i-8191]
    else
        return s__3myVar[i-16382]
    endif
endfunction

function sg__myVar_set takes integer i,integer v returns nothing
    if(i<8191) then
        set s__myVar[i]=v
    elseif(i<16382) then
        set s__2myVar[i-8191]=v
    else
        set s__3myVar[i-16382]=v
    endif
endfunction

function myFunc takes nothing returns nothing
    call sg__myVar_set(9999,1)
endfunction
Как видите, указывать размер нужно лишь в тех случая, когда размер массива больше 8192 или в структурах, в противном случае указывать размер массива не надо.

Конкретно в Вашем случае рекомендую использовать возможное максимальное число.

В vJASS тоже есть ограничения, максимальный размер массива в vJASS - 409550.
21

» WarCraft 3 / [jass] Кроме констант как можно добавить в массив?

Это же нужно специально для vJASS, чтобы использовать размер массива больше 8192. Если указать, например, 16384, то будут созданы два массива указанного типа, но ячейка массива с индексом больше 8191 уже будет храниться во втором массиве с индексом 0 и т. д.. А указывать меньше 8192 нет смысла, все равно будет создан обычный массив.