XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
Igores
НИИ 4А-Во! Кафедра Джасс.
offline
Опыт: 5,325
Активность:
Спелл для всех
Я создал триггерный спелл, но он работает только для одного Юнита. Как сделать, чтобы работал для всех?
Старый 13.01.2009, 17:33
alexkill

offline
Опыт: 19,072
Активность:
Я бы привязывался к хэндлу таймера и глобальным массивам юнитов и т.д. Хотя, если спелл объемный, то возможно еще что-либо.
Есть вариант использовать кеш, структуры (те же глобальные массивы со своими примочками).
Вообщем, без кода или карты - никак. )
Старый 13.01.2009, 17:59
Scorched

offline
Опыт: 7,912
Активность:
Цитата:
работает только для одного Юнита. Как сделать, чтобы работал для всех?

использовать pick every... (aka ForGroup()) и вместо юнита указывать везде picked unit (aka GetEnumUnit())
Старый 13.01.2009, 18:43
Hellfim
Новичок
offline
Опыт: 79,880
Активность:
Igores, нужно использовать массив юнитов.
Старый 14.01.2009, 03:40
Gres
Кораэлестраз
offline
Опыт: 18,575
Активность:
Или может быть ты делаешь проверку на конкретного юнита, а нужно работать или с типом юнитов или с переменной... А вообще мы же не телепаты, без кода определить ошибку невозможно!
Старый 14.01.2009, 06:47
Igores
НИИ 4А-Во! Кафедра Джасс.
offline
Опыт: 5,325
Активность:
Gresя делаю поверку только на сам спелл, чтоб его любой мог применить. Только со временем незнаю что делать. Я так понял надо создать массив кастующих юнитов, создать массив таймеров и чтобы номера юнитов и таймеров в массиве соответствовали друг другу?
Старый 14.01.2009, 09:21
Hellfim
Новичок
offline
Опыт: 79,880
Активность:
Угадал, именно так :-)
Старый 14.01.2009, 09:29
Igores
НИИ 4А-Во! Кафедра Джасс.
offline
Опыт: 5,325
Активность:
А если я использовал, не таймер а wait?
Старый 14.01.2009, 10:59
Hellfim
Новичок
offline
Опыт: 79,880
Активность:
Igores, а если я все-таки разучился использовать телепатию ну и что? Лучше конечно использовать таймеры, но и вейтом тоже можно.
Старый 14.01.2009, 13:28
Igores
НИИ 4А-Во! Кафедра Джасс.
offline
Опыт: 5,325
Активность:
Ну вот, специально для телепатов код на растерзание. Тут 3 триггера. Надо их сделать для всех героев, вроде это МУИ называется, да?

Первый триггер:
Код:
function Trig_Chidori_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A000'
endfunction

function Trig_Chidori_Actions takes nothing returns nothing
    local integer level = GetUnitAbilityLevel(GetTriggerUnit(), 'A000')
    local real ms = GetUnitMoveSpeed(GetTriggerUnit())
    local gamecache gc = udg_AbilityCache
    call StoreReal(gc, "chidori", "ms", ms)
    call StoreInteger(gc, "chidori", "caster", H2I(GetTriggerUnit()))
    call StoreInteger(gc, "chidori", "level", level)
    call SetUnitMoveSpeed(GetTriggerUnit(), ms+ms*level*5/100)
    call AddSpecialEffectTargetUnitBJ( "hand, left", GetTriggerUnit(), "Abilities\\Weapons\\FarseerMissile\\FarseerMissile.mdl" )
    set udg_chid_effect = GetLastCreatedEffectBJ() 
    call StartTimerBJ( udg_chid_timer, false, 5.00 )
    call EnableTrigger( gg_trg_chidori_attack )
    set ms = 0
    set gc = null
    set level = 0
endfunction

//===========================================================================
function InitTrig_Chidori takes nothing returns nothing
    set gg_trg_Chidori = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Chidori, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Chidori, Condition( function Trig_Chidori_Conditions ) )
    call TriggerAddAction( gg_trg_Chidori, function Trig_Chidori_Actions )
endfunction


Второй триггер - изначально выключен:
Код:
function Trig_chidori_attack_Actions takes nothing returns nothing
    local gamecache gc = udg_AbilityCache
    local real x = GetUnitX(GetTriggerUnit())
    local real y = GetUnitY(GetTriggerUnit())
    local unit caster = I2U(GetStoredInteger(gc, "chidori", "caster"))
    local real ms = GetStoredReal(gc, "chidori", "ms")
    local integer level = GetStoredInteger(gc, "chidori", "level")
    if caster == GetAttacker() then
        call SetUnitMoveSpeed(caster, ms)
        call DestroyEffectBJ( udg_chid_effect )
        call UnitRemoveBuffBJ( 'B001', caster )
        call CreateNUnitsAtLoc( 1, 'h000', GetOwningPlayer(caster), GetUnitLoc(GetTriggerUnit()), bj_UNIT_FACING )
        call UnitAddAbilityBJ( 'Apg2', GetLastCreatedUnit() )
        call IssueTargetOrderBJ( GetLastCreatedUnit(), "purge", GetTriggerUnit() )
        call RemoveUnit( GetLastCreatedUnit() )
        call RemoveLocation(Location(x,y))
        call UnitDamageTargetBJ( caster, GetTriggerUnit(), level*75, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_LIGHTNING )
        set x = 0
        set y = 0
        set caster = null
        set ms = 0
        set gc = null
        set level = 0        
        call DisableTrigger( GetTriggeringTrigger() )
    else
        call DoNothing(  )
    endif
    set x = 0
    set y = 0
    set caster = null
    set ms = 0
    set gc = null
    set level = 0   
endfunction

//===========================================================================
function InitTrig_chidori_attack takes nothing returns nothing
    set gg_trg_chidori_attack = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_chidori_attack, EVENT_PLAYER_UNIT_ATTACKED )
    call TriggerAddAction( gg_trg_chidori_attack, function Trig_chidori_attack_Actions )
endfunction


Третий триггер:
Код:
function Trig_chidori_timer_Actions takes nothing returns nothing
    local gamecache gc = udg_AbilityCache
    local unit caster = I2U(GetStoredInteger(gc, "chidori", "caster"))
    local real ms = GetStoredReal(gc, "chidori", "ms")
    call SetUnitMoveSpeed(caster, ms)
    call DestroyEffectBJ( udg_chid_effect )
    call UnitRemoveBuffBJ( 'B001', caster )
    call DisableTrigger( gg_trg_chidori_attack )
endfunction

//===========================================================================
function InitTrig_chidori_timer takes nothing returns nothing
    set gg_trg_chidori_timer = CreateTrigger(  )
    call TriggerRegisterTimerExpireEventBJ( gg_trg_chidori_timer, udg_chid_timer )
    call TriggerAddAction( gg_trg_chidori_timer, function Trig_chidori_timer_Actions )
endfunction

Отредактировано ShadoW DaemoN, 14.01.2009 в 15:51.
Старый 14.01.2009, 15:20
Igores
НИИ 4А-Во! Кафедра Джасс.
offline
Опыт: 5,325
Активность:
Я с телепатов офигеваю, просили код показать. Я вам его показал. Чего молчите? Пока от вас помощи дождешься, сам разобрался, что, где и как. К тому же вывел собственную систему переделывания спелла в МУИ. Тему можно закрыть, все равно никто не помогает.
Старый 15.01.2009, 01:25
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 14:51.