Spell Help

_whelp

New Member
Reaction score
54
When I cast it, it works, but the unit is still stunned and gets damaged until they die.

I don't know what's wrong with it, but I'm guessing it's because I'm using T32 wrong?
JASS:
scope spell initializer onInit

    globals
        private integer ABILITY_ID = 'A000'
        private integer STUN_ID = 'Tstn'
        private integer STUN_BUFF = 'BPSE'
        private string STUN_ORDER = "thunderbolt"
        private integer DUMMY_ID = 'Tdmy'
        private string HOLD_EFFECT = "Objects\\Spawnmodels\\Other\\HumanBloodCinematicEffect\\HumanBloodCinematicEffect.mdl"
        private attacktype ATTACK_TYPE = ATTACK_TYPE_CHAOS
        private damagetype DAMAGE_TYPE = DAMAGE_TYPE_UNIVERSAL
        private weapontype WEAPON_TYPE = WEAPON_TYPE_WHOKNOWS
        private real TIMER_PERIOD = 0.03125
        private integer CROW_FORM = 'Amrf'
        private real HEIGHT_DIFFERENCE = 25
    endglobals
    
    private function AIR_HEIGHT takes integer lvl returns real
        return 250 * I2R(lvl) + 25
    endfunction
    
    private function AIR_DURATION takes integer lvl returns real
        return 5 + I2R(lvl)
    endfunction
    
    private function SPELL_DAMAGE takes integer lvl, integer phase returns real
        if (phase == 0) then
            return I2R(lvl) * 2
        elseif (phase == 1) then
            return I2R(lvl) * AIR_HEIGHT(lvl) - 50
        endif
        
        return 0.
    endfunction

//The naming convention is changed in this part of the code for no reason.

    native UnitAlive takes unit u returns boolean

    globals
        private trigger trig = CreateTrigger()
        private group grp = CreateGroup()
        private unit dummy = CreateUnit(Player(15), DUMMY_ID, 0, 0, 0)
    endglobals
    
    private struct data
        unit caster
        unit victim
        effect fx
        integer phase = 0
        real height = 0
        real time = 0
        
        private method periodic takes nothing returns nothing
            local integer lvl = GetUnitAbilityLevel(this.caster, ABILITY_ID)
            local real height = GetUnitFlyHeight(this.victim)
            
            call BJDebugMsg("hello")
            
            if(height < AIR_HEIGHT(lvl) and time < AIR_DURATION(lvl)) then
                call UnitAddAbility(this.victim, CROW_FORM)
                call SetUnitFlyHeight(this.victim, height + HEIGHT_DIFFERENCE, 100000)
                call UnitRemoveAbility(this.victim, CROW_FORM)
            elseif(time >= AIR_DURATION(lvl)) then
                if(height == 0) then
                    set phase = 1
                endif
                call UnitAddAbility(this.victim, CROW_FORM)
                call SetUnitFlyHeight(this.victim, height - HEIGHT_DIFFERENCE, 100000)
                call UnitRemoveAbility(this.victim, CROW_FORM)
            endif
            
            call UnitDamageTarget(this.caster, this.victim, SPELL_DAMAGE(lvl, phase), false, false, ATTACK_TYPE, DAMAGE_TYPE, WEAPON_TYPE)

            if(not(UnitAlive(this.caster) or UnitAlive(this.victim)) or phase == 1) then
                call this.stopPeriodic()
                call UnitRemoveAbility(this.victim, STUN_ID)
                call DestroyEffect(this.fx)

                set this.caster = null
                set this.victim = null
                set this.fx = null
                call this.destroy()
            endif
            set this.time = this.time + TIMER_PERIOD
        endmethod
        
        implement T32x
    endstruct
    
    private function actions takes nothing returns nothing
        local data d = data.create()
        set d.caster = GetTriggerUnit()
        set d.victim = GetSpellTargetUnit()
        set d.fx = AddSpecialEffectTarget(HOLD_EFFECT, d.victim, "chest")
        
        call IssueTargetOrder(dummy, STUN_ORDER, d.victim)
        
        call d.startPeriodic()
    endfunction
    
    private function conditions takes nothing returns boolean   
        if(GetSpellAbilityId() == ABILITY_ID) then
            call actions()
        endif
        
        return false
    endfunction
    
    private function onInit takes nothing returns nothing
        local integer i = 0
        
        loop
            exitwhen i == 16
            call TriggerRegisterPlayerUnitEvent(trig, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
            set i = i + 1
        endloop
        
        call TriggerAddCondition(trig, Condition(function conditions))
    endfunction
endscope
 

Sickle

New Member
Reaction score
13
He is using the T32x module, which provides the startPeriodic and stopPeriodic methods.

Try replacing [lJASS]height == 0[/lJASS] with [lJASS]height <= 0[/lJASS] and see if that works. It might, it might not. Real values in Warcraft III are inaccurate and act eccentrically when compared to other values. If that doesn't work, try [lJASS]height <= 1[/lJASS]. You should really be using an integer that counts the amount of ticks that the spell lasts.
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top