Добавлен 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
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.

WC3




вариковский - проверяющий наличие дебаффа на юните, не стакающийся яд который сбивается тем, кто атакует, обновляется при атаке
нубский - тупо таймер каждый раз периодический вешать, стакающийся яд
нормальный - сохраняется таймер в атакующего по ключу жертвы, таким образом яд от разных юнитов будет стакаться, но от одного и того же нет, только обновляться, то есть яды не перебивают друг друга и при этом работают как вариковские
Ред. rsfghd
Ред. rsfghd
- абилка яда, т.е. заклинание (дебафф)
- это целочисленная, ключ вджасса позволяет генерировать уникальное константное число, это по сути улучшенная версия StringHash
- библиотека позволяет блокировать урон, по сути как доспехи элуны против магии или как там правильно, только намного более гибкое ибо ты сам решаешь сколько блочить на каждый случай, мне не понадобилось, я по привычке закинул
- да, это время
да, в остальных триггерах я просто налепил всяких эффектов, они не важныРед. Meddin
Ред. Meddin
https://www.xgm.guru/p/wc3/hashtable/comments/view/486699