28

» WarCraft 3 / Проблема с ядом

Meddin,
  1. абилка яда, т.е. заклинание (дебафф)
  2. это целочисленная, ключ вджасса позволяет генерировать уникальное константное число, это по сути улучшенная версия StringHash
  3. библиотека позволяет блокировать урон, по сути как доспехи элуны против магии или как там правильно, только намного более гибкое ибо ты сам решаешь сколько блочить на каждый случай, мне не понадобилось, я по привычке закинул
  4. да, это время
да, в остальных триггерах я просто налепил всяких эффектов, они не важны
28

» WarCraft 3 / Проблема с ядом

Meddin, я думал над тем чтобы сразу писать на чистом джассе, зная тебя, но стало лень когда библиотеку на блок урона закинул (она кстати не пригодилась), если нужна будет помощь с переписыванием, то напишешь, потому что там 2 хэштаблицы понадобятся если сохранять именно такой тип ядов, потому что возможна перезапись значений
28

» WarCraft 3 / Проблема с ядом


яд можно разделить на несколько категорий
вариковский - проверяющий наличие дебаффа на юните, не стакающийся яд который сбивается тем, кто атакует, обновляется при атаке
нубский - тупо таймер каждый раз периодический вешать, стакающийся яд
нормальный - сохраняется таймер в атакующего по ключу жертвы, таким образом яд от разных юнитов будет стакаться, но от одного и того же нет, только обновляться, то есть яды не перебивают друг друга и при этом работают как вариковские
я сделал на примере последнего
Загруженные файлы
28

» WarCraft 3 / Проблема с ядом

ладно, ты наверное не разобрался либо занят, в общем я решил сделать пример
вот основной код
globals
    constant hashtable H = InitHashtable( )
    constant group TempGroup = CreateGroup( )
endglobals

function addEff takes nothing returns nothing
    local timer t = GetExpiredTimer( )
    local unit u  = LoadUnitHandle( H, GetHandleId( t ), 0 )
    local EffectS A = LoadInteger( H, GetHandleId( u ), EffectStructKey )
    
    set A.eff  = AddSpecialEffectTarget( "Abilities\\Weapons\\FarseerMissile\\FarseerMissile.mdl", u, "weapon" )
    set A.eff2 = AddSpecialEffectTarget( "Abilities\\Weapons\\ZigguratMissile\\ZigguratMissile.mdl", u, "weapon" )
    
    call FlushChildHashtable( H, GetHandleId( t ) )
    call DestroyTimer( t )
    
    set t = null
    set u = null
endfunction

function poisonDamage takes nothing returns nothing
    local timer t = GetExpiredTimer( )
    local integer i = GetHandleId( t )
    local unit attacker = LoadUnitHandle( H, i, 0 )
    local unit damaged  = LoadUnitHandle( H, i, 1 )
    local real r = LoadReal( H, i, 3 ) - 1.00
    
    call UnitDamageTarget( attacker, damaged, 20.00, false, false, null, null, null )
    
    if r <= 0.00 or not UnitAlive( damaged ) then
        call RemoveSavedHandle( H, GetHandleId( attacker ), GetHandleId( damaged ) )
        call DestroyEffect( LoadEffectHandle( H, i, 2 ) )
        call DestroyTimer( t )
        call FlushChildHashtable( H, i )
    else
        call SaveReal( H, i, 3, r )
    endif
    
    set t = null
    set attacker = null
    set damaged  = null
endfunction

function FlamingAttacks_Actions takes nothing returns nothing
    local unit attacker = GetEventDamageSource( )
    local unit damaged  = GetTriggerUnit( )
    local real damage   = GetEventDamage( )
    local unit u
    local timer t
    local EffectS A
    
    if GetUnitAbilityLevel( damaged, 'Bssd' ) > 0 then
        call UnitRemoveAbility( damaged, 'Bssd' )
        
        // потужні удари
        if GetUnitAbilityLevel( attacker, 'A002' ) > 0 then
            call GroupEnumUnitsInRange( TempGroup, GetUnitX( damaged ), GetUnitY( damaged ), 300.00, null )
            
            loop
                set u = FirstOfGroup( TempGroup )
                exitwhen u == null
                call GroupRemoveUnit( TempGroup, u )
                
                if IsUnitEnemy( u, GetOwningPlayer( attacker ) ) and UnitAlive( u ) then
                    call UnitDamageTarget( attacker, u, damage, false, false, null, null, null )
                endif
            endloop
            
            set t = CreateTimer( )
            
            set A = LoadInteger( H, GetHandleId( attacker ), EffectStructKey )
    
            call DestroyEffect( A.eff )
            call DestroyEffect( A.eff2 )
            call DestroyEffect( AddSpecialEffect( "Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl", GetUnitX( damaged ), GetUnitY( damaged ) ) )
            call SaveUnitHandle( H, GetHandleId( t ), 0, attacker )
            call TimerStart( t, 1.00, false, function addEff )
            
            set t = null
        elseif GetUnitAbilityLevel( attacker, 'A003' ) > 0 then
            // вогняна атака
            call GroupEnumUnitsInRange( TempGroup, GetUnitX( damaged ), GetUnitY( damaged ), 150.00, null )
            
            loop
                set u = FirstOfGroup( TempGroup )
                exitwhen u == null
                call GroupRemoveUnit( TempGroup, u )
                
                if u != damaged and IsUnitEnemy( u, GetOwningPlayer( attacker ) ) and UnitAlive( u ) then
                    call UnitDamageTarget( attacker, u, damage / 2.00, false, false, null, null, null )
                endif
            endloop
            
            set t = LoadTimerHandle( H, GetHandleId( attacker ), GetHandleId( damaged ) )
            
            if t == null then
                set t = CreateTimer( )
                
                call SaveTimerHandle( H, GetHandleId( attacker ), GetHandleId( damaged ), t )
                
                call SaveUnitHandle( H, GetHandleId( t ), 0, attacker )
                call SaveUnitHandle( H, GetHandleId( t ), 1, damaged )
                call SaveEffectHandle( H, GetHandleId( t ), 2, AddSpecialEffectTarget( "Abilities\\Spells\\Other\\BreathOfFire\\BreathOfFireDamage.mdl", damaged, "origin" ) )
                
                call TimerStart( t, 1.00, true, function poisonDamage )
            endif
            
            call SaveReal( H, GetHandleId( t ), 3, 5.00 )
            call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Spells\\Items\\AIfb\\AIfbSpecialArt.mdl", damaged, "chest" ) )
            call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Weapons\\RedDragonBreath\\RedDragonMissile.mdl", damaged, "chest" ) )
            
            set t = null
        endif
    endif
    
    set damaged  = null
    set attacker = null
endfunction

//===========================================================================
//function InitTrig_FlamingAttacks takes nothing returns nothing
    //set gg_trg_FlamingAttacks = CreateTrigger(  )
//endfunction
Загруженные файлы
28

» WarCraft 3 / Проблема с ядом

Meddin, кстати, ты наверное не интересовался моими ресурсами, но я уже делал огненное оружие с поджиганием в спеллпаке привратника ада
28

» WarCraft 3 / Проблема с ядом

Meddin, регистрируешь событие получения урона на каждого юнита:
смотришь есть ли у атакованного дебафф яда, если есть - снимаешь его и делаешь триггерные операции (доп. урон, свой собственный яд и так далее, всё что связанно в автоатакой)
саму абилку яда выдать всем юнитам, чья атака должна отлавливаться
28

» WarCraft 3 / Помогите сделать грамотый триггер

nazarpunk, создаёт, я не буду сотый раз объяснять про неё

JIEGEND, попробуй соображалку немного включить, у тебя событие текста игрока но ты откуда-то берёшь юнита триггера

смотри внимательно мой скрин, последнее открытое окно

там даже серым по белому написано, что соответствующего юнита использовать для сравнения
28

» WarCraft 3 / Помогите сделать грамотый триггер

JIEGEND, перестань юзать капс, это больше раздражает и сбивает с толку чем приносит пользы в принцип обмена информации, попробуй просто порыться в гуи, всё есть
Загруженные файлы
28

» WarCraft 3 / Проблема с ядом

Meddin, всё у тебя работает, как я и сказал, орб не даёт наложить эффект яда, просто сделай либо триггерный яд, либо триггерный орб, второе предпочтительнее ибо с помощью яда можно отлавливать урон с руки
28

» WarCraft 3 / Помогите сделать грамотый триггер

как-то очень хреново изъяснился, что за действие диалоговой кнопки при событии, что игрок написал текст?
28

» WarCraft 3 / Проблема с ядом

бред если честно, отобрази проблему на отдельной карте, максимум ты настройки кривые выставил либо юзаешь яд с каким-то орбом или что-то в этом духе
28

» WarCraft 3 / Несколько свойств в одной способности

EugeAl, краш, что же ещё. Когда-то был вопрос с этой темой, там древо ночных эльфов стояло или что, короче стабильно крашило из-за координат, я продемонстрировать не смогу потому что попросту не помню, если тебя и вправду это так парит, удели время для поиска вопросов/тем по крашу Вара из-за иконки
28

» WarCraft 3 / Снаряды заклинаний

Maximal1111, чтобы модель изменить нужно брать подходящую, а не любую желаемую
28

» WarCraft 3 / Условие на движение

Maximal1111, мем конечно, а какой метод ты хотел тогда? Чтобы всё волшебной палочкой решилось?
28

» WarCraft 3 / Это чё?

Похоже, это касается темы варкрафта, а не технических проблем сайта, так что отвечу на вопрос
Ро - редактор объектов, гуи - графический пользовательский интерфейс триггеров, джасс - язык придуманный близзардами, на 1.26 имеет так же различные диалекты, вроде сджасса, вджасса, зинка, вурста и так далее, помимо этого есть возможность использовать даже луа
28

» WarCraft 3 / Как запретить работать способность на конкретного героя

Real60Hz, есть ещё кое-что, дать категорию герою что он самоубийца, а в абилке указать, что на них не работает
28

» WarCraft 3 / Условие на движение

либо проверять приказ (не оч хорошо), либо проверять дистанцию между координатами
28

» WarCraft 3 / Как запретить работать способность на конкретного героя

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