Looking for a basic DOT spell

DubDub

New Member
Reaction score
0
I've been trying to make a basic Damage-over-time spell for a while but I can't seem to get one working so I looked for a few already made.


http://www.thehelper.net/forums/showthread.php?t=89024
This one looks perfect, except the system ABCT is outdated and after a bit of effort to switch the spell to the Timer Ticker system I can't get it to work.

Is Timer Ticker not working, as well and is there another system I can switch this spell to instead? http://www.thehelper.net/forums/showthread.php?t=79079

Or better yet can someone lay out a DOT or HOT (Heal over time) template for me that I can use for my spells? :)
 

Avaleirra

Is back. Probably.
Reaction score
128
Well, would be possible to just use a modified blizz spell? E.g, doom, rejuvenation, immolation, acid bomb, etc.
 

DubDub

New Member
Reaction score
0
Well, would be possible to just use a modified blizz spell? E.g, doom, rejuvenation, immolation, acid bomb, etc.

Right. I forgot to mention one other thing. The spells I'm making have damage that scales with the caster's stats so using the blizz spells wouldn't work out for me.
 

the Immortal

I know, I know...
Reaction score
51
Using I am TimerUtils for these purposes. Implementing it in your map and doing something similar to
JASS:
scope DoT initializer OnInit
    private struct data
        real DamagePerTick
        integer TicksDone = 0
        integer TicksToDo
        unit Caster
        unit Target
    endstruct
    
    private function OnTick takes nothing returns nothing
        local data d = GetTimerData(GetExpiredTimer())

        call UnitDamageTarget(d.Caster, d.Target, d.DamagePerTick, true, true, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, WEAPON_TYPE_WHOKNOWS)

        set d.TicksDone = d.TicksDone + 1
        if d.TicksDone == d.TicksToDo then
            call d.destroy()
            call ReleaseTimer(GetExpiredTimer())
        endif
    endfunction
    
    private function OnCast takes nothing returns nothing
        local data d = data.create()
        local timer tim = NewTimer()
        
        call SetTimerData(tim, d)
        set d.Caster = GetTriggerUnit()
        set d.Target = GetSpellTargetUnit()
        set d.DamagePerTick = 25.                       //Damage per tick
        set d.TicksToDo = 10                            //Ticks to do
        
        call TimerStart(tim, 1., true, function OnTick) //interval
        
        set tim = null
    endfunction
    
    private function ConditionCheck takes nothing returns boolean
        if GetSpellAbilityId() == 'A000' then           //Ability Id
            call OnCast()
        endif
        return false
    endfunction
    
    function OnInit takes nothing returns nothing
        local trigger t = CreateTrigger()
        call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_EFFECT)
        call TriggerAddCondition(t, Condition(function ConditionCheck))
    endfunction
endscope
should work.
/written on hand, no WE around, just JassCraft which doesn't support vJASS/
 

kingkingyyk3

Visitor (Welcome to the Jungle, Baby!)
Reaction score
216
JASS:
scope ShadowWord initializer Init

    globals
        private constant integer AID_RAW = 'A000'
        private constant string ENEMY_SFX = "Abilities\\Spells\\Orc\\Voodoo\\VoodooAuraTarget.mdl"
        private constant string ALLY_SFX = "Abilities\\Spells\\Items\\StaffOfSanctuary\\Staff_Sanctuary_Target.mdl"
        private constant string ATTACH_POINT = "chest"
    endglobals

    private constant function DAMAGE takes integer whichLvl returns real
        return whichLvl * 10.
    endfunction
    
    private constant function HEAL takes integer whichLvl returns real
        return whichLvl * 10.
    endfunction
    
    private constant function DURATION takes integer whichLvl returns integer
        return 8
    endfunction

    private struct Data
        unit hero
        unit target
        real value
        integer ticks
        effect sfx
    
        method onDestroy takes nothing returns nothing
            call DestroyEffect(.sfx)
        endmethod
    endstruct

    private function Callback takes nothing returns boolean
        local Data d = TT_GetData()
        if IsUnitAlly(d.target, GetOwningPlayer(d.hero)) or d.hero == d.target then
            call SetWidgetLife(d.target, GetWidgetLife(d.target) + d.value)
        else
            call UnitDamageTarget(d.hero, d.target, d.value, true, true, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
        endif
        set d.ticks = d.ticks - 1
        if d.ticks <= 0 or GetWidgetLife(d.target) < 0.405 then
            call d.destroy()
            return true
        endif
        return false
    endfunction

    private function Actions takes nothing returns nothing
        local Data d = Data.create()
        local integer lvl
        set d.hero = GetTriggerUnit()
        set d.target = GetSpellTargetUnit()
        set lvl = GetUnitAbilityLevel(d.hero, AID_RAW)
        if IsUnitAlly(d.target, GetOwningPlayer(d.hero)) == true or d.hero == d.target then
            set d.value = HEAL(lvl)
            set d.sfx = AddSpecialEffectTarget(ALLY_SFX, d.target, ATTACH_POINT)
        else
            set d.value = DAMAGE(lvl)
            set d.sfx = AddSpecialEffectTarget(ENEMY_SFX, d.target, ATTACH_POINT)
        endif
        set d.ticks = R2I(DURATION(lvl) / TT_PERIOD)
        call TT_Start(function Callback, d, TT_PERIOD)
    endfunction

    private function Conditions takes nothing returns boolean
        return GetSpellAbilityId() == AID_RAW
    endfunction
    
    private function Init takes nothing returns nothing
        local trigger trig = CreateTrigger()
        call TriggerRegisterAnyUnitEventBJ(trig, EVENT_PLAYER_UNIT_SPELL_EFFECT)
        call TriggerAddCondition(trig, Condition(function Conditions))
        call TriggerAddAction(trig, function Actions)
    endfunction

endscope


It should work now.
 

DubDub

New Member
Reaction score
0
Thanks. The spells work great, and this just answered a lot of questions I haven't even asked yet. :p

Now, I'm wondering what's the best way to force a check for a buff on a target so I can get the DOT or HOT to work with dispels?
 
General chit-chat
Help Users

      The Helper Discord

      Staff online

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top