function spell1_dmg takes nothing returns nothing
local integer lhandle = GetHandleId(GetExpiredTimer())
local integer tik_count = LoadIntegerBJ(lhandle, 2, udg_spells_hashtable)
local unit target = LoadUnitHandleBJ(lhandle, 0, udg_spells_hashtable)
local unit caster = LoadUnitHandleBJ(lhandle, 1, udg_spells_hashtable)
local effect leffect = LoadEffectHandleBJ(lhandle, 3, udg_spells_hashtable)
call DestroyEffectBJ( leffect )
if ( tik_count > 0) then
call UnitDamageTargetBJ( caster, target, udg_spell1_dmg_period_count, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC )
call DisplayTextToForce( GetPlayersAll(), I2S(tik_count) )
call SaveIntegerBJ( ( tik_count - 1 ), lhandle, 2, udg_spells_hashtable )
call AddSpecialEffectTargetUnitBJ( "origin", target, "Abilities\\Spells\\Orc\\LightningBolt\\LightningBoltMissile.mdl" )
set leffect = GetLastCreatedEffectBJ()
call SaveEffectHandleBJ( leffect, lhandle, 3, udg_spells_hashtable )
else
set leffect = null
call SaveEffectHandleBJ( leffect, lhandle, 3, udg_spells_hashtable )
endif
endfunction
function Trig_spell1_cast_jass_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A000'
endfunction
function Trig_spell1_cast_jass_Actions takes nothing returns nothing
local timer ltimer = CreateTimer()
call TimerStart( ltimer, 0.05, true, function spell1_dmg)
set udg_local_handle = GetHandleId(ltimer)
call SaveUnitHandleBJ( GetSpellTargetUnit(), udg_local_handle, 0, udg_spells_hashtable )
call SaveUnitHandleBJ( GetSpellAbilityUnit(), udg_local_handle, 1, udg_spells_hashtable )
call SaveIntegerBJ( udg_spell1_time_period_count, udg_local_handle, 2, udg_spells_hashtable )
call AddSpecialEffectTargetUnitBJ( "origin", GetSpellTargetUnit(), "Abilities\\Spells\\Orc\\LightningBolt\\LightningBoltMissile.mdl" )
call SaveEffectHandleBJ( GetLastCreatedEffectBJ(), udg_local_handle, 3, udg_spells_hashtable )
endfunction
//===========================================================================
function InitTrig_spell1_cast_jass takes nothing returns nothing
set gg_trg_spell1_cast_jass = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_spell1_cast_jass, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_spell1_cast_jass, Condition( function Trig_spell1_cast_jass_Conditions ) )
call TriggerAddAction( gg_trg_spell1_cast_jass, function Trig_spell1_cast_jass_Actions )
endfunction
Где-то он там есть, но что-то не ищется...
Апд. Ну и просто советы по улучшению кода принимаются, да. Если вдруг кто захочет...
Принятый ответ
А что тут vJass требует? Глобалки?
Блок глобалок, что я объявил, и многострочные комментарии /*...*/.
PT153:
PT153:
Переписал код, оставил кое-какие комментарии.
xD, я просто скопипастил создание эффекта, а ведь нужно было убрать под таймером GetSpellTargetUnit().
Вот так верно будет.
Вот так верно будет.
раскрыть
globals
constant string Effect_A000 = "Abilities\\Spells\\Orc\\LightningBolt\\LightningBoltMissile.mdx"
constant string AttEffect_A000 = "origin"
endglobals
function spell1_dmg takes nothing returns nothing
local integer h = GetHandleId(GetExpiredTimer())
local unit target = LoadInteger(udg_spells_hashtable, h, 0)
local integer tik_count = LoadInteger(udg_spells_hashtable, h, 2)
// Вместо определения локалки для кастера, сразу пихаем его в UnitDamageTargetBJ.
// Локалку всё также можно определить, но после endif её нужно обнулить.
// set caster = null
call DestroyEffect(LoadEffectHandle(udg_spells_hashtable, h, 3))
if tik_count > 0 then
call UnitDamageTargetBJ(LoadUnitHandle(udg_spells_hashtable, h, 1),/*
*/ target, udg_spell1_dmg_period_count, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC)
call DisplayTextToPlayer(GetLocalPlayer(), 0., 0., I2S(tik_count)) // асинхронно, работает по сети.
call SaveInteger(udg_spells_hashtable, h, 2, tik_count - 1)
call SaveEffectHandle(udg_spells_hashtable, h, 3, AddSpecialEffectTarget(Effect_A000, target, AttEffect_A000))
else
call FlushChildHashtable(udg_spells_hashtable, h) // удаляет все записи с parent ключом h.
call DestroyTimer(GetExpiredTimer()) // удаляет таймер.
endif
set target = null
endfunction
function Trig_spell1_cast_jass_Actions takes nothing returns nothing
local timer t = CreateTimer()
local integer h = GetHandleId(t)
call TimerStart(t, 0.05, true, function spell1_dmg)
call SaveUnitHandle(udg_spells_hashtable, h, 0, GetSpellTargetUnit())
call SaveUnitHandle(udg_spells_hashtable, h, 1, GetSpellAbilityUnit())
call SaveInteger(udg_spells_hashtable, h, 2, udg_spell1_time_period_count)
call SaveEffectHandle(udg_spells_hashtable, h, 3, AddSpecialEffectTarget(Effect_A000, GetSpellTargetUnit(), AttEffect_A000))
set t = null // обнуление.
endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован PT153
Все локалки, что наследуются от handle, нужно обнулять в конце функции.
После окончания действия таймер нужно удалить, а хеш почистить.
PT153:
Я просто недавно решил на jass переходить, раньше всё на триггерах сидел... Но всё чаще стал замечать, что желаемое либо нельзя сделать либо можно, но как-то не просто.
Отредактирован PT153
Должен быть включён vJass в JNGP.
А что тут vJass требует? Глобалки?
PT153:
Вот так верно будет.