Добавлен Meddin
Всем доброго времени суток! Не нашел подобного вопроса, поэтому спрошу, не могу понять концепцию работы со способностями с ядом. Я задумал заклинание, при использовании которого герой поджигает свой меч и наносит огненный урон врагам. При этом враги должны гореть в течение некоторого времени после атаки героя. Я пробовал яд дриады и яд от предмета Клинок убийцы, переделанные под горение. Когда герой кастует способность-пустышку, даю ему способность на основе яда, но при атаке на цель не вешается яд. Если дать герою предмет с ядом, то все будет работать, если просто дать саму способность - нет. Подскажите пожалуйста, в чем дело?
Принятый ответ
ладно, ты наверное не разобрался либо занят, в общем я решил сделать пример
вот основной код
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
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
https://xgm.guru/p/wc3/114895
саму абилку яда выдать всем юнитам, чья атака должна отлавливаться
вариковский - проверяющий наличие дебаффа на юните, не стакающийся яд который сбивается тем, кто атакует, обновляется при атаке
нубский - тупо таймер каждый раз периодический вешать, стакающийся яд
нормальный - сохраняется таймер в атакующего по ключу жертвы, таким образом яд от разных юнитов будет стакаться, но от одного и того же нет, только обновляться, то есть яды не перебивают друг друга и при этом работают как вариковские
Ред. rsfghd
Ред. rsfghd
Ред. Meddin
Ред. Meddin
https://xgm.guru/p/wc3/hashtable/comments/view/486699
Ред. Meddin
Что касается героя - нет, несколько способностей основанных на яде я не планирую, однако будет несколько героев, каждый с одной способностью с ядом. Буду проверять и тестить. Я не стремлюсь слишком уж злоупотреблять этим, хочу придумать разнообразные способности.