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?
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 = 039;A000039;
private integer STUN_ID = 039;Tstn039;
private integer STUN_BUFF = 039;BPSE039;
private string STUN_ORDER = "thunderbolt"
private integer DUMMY_ID = 039;Tdmy039;
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 = 039;Amrf039;
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