Помогите, пожалуйста. Как сделать ульт Лича из Доты? Лич кидает ледяной шар, который отскакивает между противниками, нанося урон и замедляя + с каждым отскоком идёт прирост урона, а таких отскоков 10. Хотел по готовым наработкам из интернета сделать, но там как-то непонятно и странно работает ульт, на своей карте по ним не смог реализовать.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
32
4 месяца назад
Отредактирован quq_CCCP
0
Там примитивный код, создается дамми юнит с моделью ледяного шара, и его двигают от лича к указанной цели, если дистанция между шаром и целью меньше N, то наносят урон цели (дамми каст ледяной звезды, урон по цели убран, оставлен только урон по области) ну и ищем в радиусе 500 еще одну цель, которой не является юнит которого мы ударили, ну и летим дальше.

function SH4 takes nothing returns boolean
    local trigger t = GetTriggeringTrigger( )
    local integer S5I = GetHandleId( t )
    local unit P7I = ( LoadUnitHandle( HashData, ( S5I ), ( 2 ) ) )
    local unit P8I = ( LoadUnitHandle( HashData, ( S5I ), ( 17 ) ) )
    local unit WF3 = ( LoadUnitHandle( HashData, ( S5I ), ( 374 ) ) )
    local integer SUI = ( LoadInteger( HashData, ( S5I ), ( 5 ) ) )
    local integer SZ4 = ( LoadInteger( HashData, ( S5I ), ( 233 ) ) )
    local integer MKO = ( LoadInteger( HashData, ( S5I ), ( 12 ) ) )
    local real x = GetUnitX( WF3 )
    local real y = GetUnitY( WF3 )
    local real tx = GetUnitX( P8I )
    local real ty = GetUnitY( P8I )
    local real a = AngleBetweenCords( x,y,tx,ty )
    local integer DT1 = ( LoadInteger( HashData, ( S5I ), ( 720 ) ) )

    if DT1 > 0 then
        call SaveInteger( HashData, ( S5I ), ( 720 ), DT1 - 1 )
        set t = null
        set P7I = null
        set P8I = null
        set WF3 = null
        return false
    endif

    if DistBetweenCods( x, y, tx, ty ) > 20.00 then
        call SetUnitFacing( WF3, a )
        set x = PTI( x + 18.0 * Cos( a * bj_DEGTORAD ) )
        set y = PUI( y + 18.0 * Sin( a * bj_DEGTORAD ) )
        call SetUnitX( WF3, x )
        call SetUnitY( WF3, y )
    else
        if not( IsUnitDead( P8I ) or IsUnitType( P8I, UNIT_TYPE_MAGIC_IMMUNE ) ) then
            set tx = GetUnitX( P8I )
            set ty = GetUnitY( P8I )
            set bj_lastCreatedUnit = CreateUnit( GetOwningPlayer( P7I ), DUMMY, tx, ty, a ) 
            call SetUnitPathing( bj_lastCreatedUnit, false )
            call SetUnitX( bj_lastCreatedUnit, tx )
            call SetUnitY( bj_lastCreatedUnit, ty )
            call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', 2.00 )
            call UnitAddAbility( bj_lastCreatedUnit, 'A091' )
            call SetUnitAbilityLevel( bj_lastCreatedUnit, 'A091', SUI )
            if not IsUnitHasNegation(P8I) and IssueTargetOrder( bj_lastCreatedUnit, "frostnova", P8I ) then
                call UnitDamageTarget( P7I, P8I, LoadReal( HashData, S5I, 3 ), false, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_FIRE, WEAPON_TYPE_WHOKNOWS )
            else 
                call KillUnit( bj_lastCreatedUnit )
            endif
        endif
        if SZ4 > MKO then
            call RemoveUnit( WF3 )
            call FlushChildHashtable( HashData, ( S5I ) )
            call S0I( t )
        else
            call GroupClear( bj_TempGroup )
            set bj_groupEnumOwningPlayer = GetOwningPlayer( P7I )
            call GroupEnumUnitsInRange( bj_TempGroup, tx, ty, 625.00, Condition( function Cond_EnemyVisibleNoVardVulAlive ) )
            call GroupRemoveUnit( bj_TempGroup, P8I )
            set P8I = GroupPickRandomUnit( bj_TempGroup )
            
            if P8I == null then
                call RemoveUnit( WF3 )
                call FlushChildHashtable( HashData, ( S5I ) )
                call S0I( t )
            else
                call SaveInteger( HashData, ( S5I ), ( 720 ), ( 10 ) )
                call SaveInteger( HashData, ( S5I ), ( 233 ), ( SZ4 + 1 ) )
                call SaveUnitHandle( HashData, ( S5I ), ( 17 ), ( P8I ) )
            endif
        endif
    endif

    set t = null
    set P7I = null
    set P8I = null
    set WF3 = null
    return false
endfunction

function Trig_ChainFrost_Actions takes nothing returns nothing
    local unit P7I = GetTriggerUnit( )
    local unit P8I = GetSpellTargetUnit( )
    local integer SUI = GetUnitAbilityLevel( P7I, 'A05T' )
    local integer MKO = 10
    local trigger t = CreateTrigger( )
    local integer S5I = GetHandleId( t )
    local unit dummy= CreateUnit( GetOwningPlayer( P7I ), 'e009', GetUnitX( P7I ), GetUnitY( P7I ), GetUnitFacing( P7I )  )
    
    call SetUnitPathing( dummy, false )
    
    if GetSpellAbilityId( ) == 'A08H' then
        set SUI = GetUnitAbilityLevel( P7I, 'A08H' ) + 1
        set MKO = 100000
    endif
    
    call SaveUnitHandle( HashData,  S5I ,  2,  P7I )
    call SaveUnitHandle( HashData,  S5I ,  17,  P8I )
    call SaveUnitHandle( HashData,  S5I ,  374, dummy )
    call SaveInteger( HashData, S5I ,  5, ( SUI ) )
    call SaveInteger( HashData, S5I ,  233, ( 1 ) )
    call SaveInteger( HashData, S5I ,  12, ( MKO ) )
    call SaveInteger( HashData, S5I ,  720, ( 0 ) )
    call SaveReal( HashData, S5I, 3, 190.00 + 90.00 * SUI )
    
    call TriggerRegisterTimerEvent( t, 0.02, true )
    call TriggerAddCondition( t, Condition( function SH4 ) )
    
    set P7I = null
    set P8I = null
    set dummy = null
    set t = null
endfunction

function Trig_ChainFrost_Conditions takes nothing returns boolean
    if ( GetSpellAbilityId() == 'A05T' or GetSpellAbilityId()=='A08H' ) and not IsUnitHasNegation(GetSpellTargetUnit()) then
        call  Trig_ChainFrost_Actions( )
    endif
    return false
endfunction

function Register_ChainFrost takes nothing returns nothing
    local trigger trg = CreateTrigger()
    local integer nIndex = 1
    
    call TriggerAddCondition( trg, Condition( function Trig_ChainFrost_Conditions ) )
    
    loop
        exitwhen nIndex > 11
            if IsSlotPlayer(Player(nIndex))then
                call TriggerRegisterPlayerUnitEvent( trg, Player(nIndex), EVENT_PLAYER_UNIT_SPELL_EFFECT, OnlyHero )
            endif
        set nIndex = nIndex + 1
    endloop
    
    set trg = null
endfunction
Вот как оно сделано у фрога, с небольшими доработками.
0
1
4 месяца назад
0
Знать бы, куда всё это вставлять в триггерах 0_0
А можно чистую карту с готовым триггером?
3
32
4 месяца назад
3
ALEX 101 НЕ, надо не вставлять, а писать с нуля, глядя на этот код.
Вопрос был как сделать, я вам кинул пример как это в доте сделано, изучайте и пробуйте.
0
3
3 месяца назад
0
Как вариант: сделать дамми юнита, с моделью атаки - ледяным шаром, а самого без модели, спаунить и атаковать цель
2
27
3 месяца назад
2
Знать бы, куда всё это вставлять в триггерах 0_0
А можно чистую карту с готовым триггером?
0
22
3 месяца назад
Отредактирован PROSHELDOTU
0
quq_CCCP, на самом деле, если бы он мог разобраться том обрывке, то явно не спрашивал как сделать подобный спелл
так там ещё при каждом касте новый триггер создаётся и висит потом

ALEX101НЕ, лучше научись сначала делать способность без отскока, типа стандартного Молот Бурь, а потом и с отскоками разбирайся
Этот комментарий удален
0
2
3 месяца назад
0
Знать бы, куда всё это вставлять в триггерах 0_0
А можно чистую карту с готовым триггером?
Некоторые вещи кажутся простыми на первый взгляд, но при глубинном изучении оказываются куда сложнее, чем мы могли себе представить.
Например, человеческий глаз содержит в себе тысячи микроскопических датчиков, каждый из которых отлавливает приходящие в них фотоны, определяя угол и прочую информацию, для того чтобы нарисовать в твоей голове полноценное изображение в Ultra full HD, 999fps, которое ты видишь с самого рождения и не считаешь чем то удивительным.
Так же и здесь. Чтобы запустить мяч, нужно встать, подойти к нему, нагнуться, взять его в руку, занести руку, прицелиться, произвести бросок. Без всех этих действий, мяч не полетит. Весь этот список кажется таким долгим, но это единственный путь.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.