scope Molotov initializer Init
globals
private constant integer SPELLID = 'bomb'
private constant attacktype atk = ATTACK_TYPE_PIERCE
private constant damagetype dmg = DAMAGE_TYPE_MAGIC
private constant weapontype wtype = WEAPON_TYPE_WHOKNOWS
private constant real tick = 1
private unit TEMP
endglobals
private struct Data extends xecollider
unit c
timer tim
real dur
real maxDist
real tX
real tY
real sX
real sY
effect fx
static method Timer takes nothing returns nothing
local thistype this = GetTimerData(GetExpiredTimer())
local integer lvl = GetUnitAbilityLevel(.c, SPELLID)
local xedamage xd = xedamage.create()
local real dam = 1 + 3*lvl
call xd.useSpecialEffect(GetAbilityEffectById(SPELLID, EFFECT_TYPE_SPECIAL, 0),"origin")
set xd.exception = UNIT_TYPE_FLYING
call xd.factor ( UNIT_TYPE_STRUCTURE, 0.5)
set xd.dtype = dmg
set xd.atype = atk
set xd.damageAllies = true
set xd.damageSelf = true
set xd.allyfactor = 0.4
call xd.damageAOE(.c, .tX, .tY, 95 + 40. * lvl, dam)
call xd.destroy()
call DestroyEffect(.fx)
set .dur = .dur + tick
if .dur >= 5 then
call ReleaseTimer(.tim)
call .terminate()
else
set .fx = AddSpecialEffect(GetAbilityEffectById(SPELLID, EFFECT_TYPE_AREA_EFFECT, 0), .tX, .tY)
endif
endmethod
method onDestroy takes nothing returns nothing
endmethod
method loopControl takes nothing returns nothing
local xedamage xd
local integer lvl = GetUnitAbilityLevel(.c, SPELLID)
local real dist = SquareRoot((.tX-.x)*(.tX-.x)+(.tY-.y)*(.tY-.y))
local real maxDist = SquareRoot((.sX-.x)*(.sX-.x)+(.sY-.y)*(.sY-.y))
local real maxHeight = 225
local real t = (dist*2)/maxDist-1
local real dam = 70 + 55*lvl
set .z = (-t*t+1)*maxHeight
if dist < 25 then
set .tim = NewTimer()
set xd = xedamage.create()
set xd.exception = UNIT_TYPE_FLYING
call xd.factor ( UNIT_TYPE_STRUCTURE, 0.5)
set xd.dtype = dmg
set xd.atype = atk
set xd.damageAllies = true
set xd.allyfactor = 0.4
call DestroyEffect(AddSpecialEffect(GetAbilityEffectById(SPELLID, EFFECT_TYPE_AREA_EFFECT, 1), .x, .y))
call xd.damageAOE(.c, .x, .y, 95 + 40. * lvl, dam)
call xd.destroy()
call .hiddenDestroy()
call SetTimerData(.tim,this)
call TimerStart(.tim, tick, true, function Data.Timer)
endif
endmethod
endstruct
private function Actions takes unit c returns nothing
local real ang = Atan2(GetSpellTargetY() - GetUnitY(c), GetSpellTargetX() - GetUnitX(c))
local Data xc
set xc = Data.create(GetUnitX(c), GetUnitY(c), ang)
set xc.fxpath = GetAbilityEffectById(SPELLID,EFFECT_TYPE_MISSILE, 0)
set xc.tX = GetSpellTargetX()
set xc.tY = GetSpellTargetY()
set xc.sX = xc.x
set xc.sY = xc.y
set xc.speed = 555.0
set xc.expirationTime = 2
set xc.z = 50.0
set xc.c = c
set xc.dur = 0
endfunction
private function Conditions takes nothing returns nothing
if GetSpellAbilityId() == SPELLID then
call Actions(GetTriggerUnit())
endif
endfunction
//===========================================================================
public function Init takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddAction(t, function Conditions )
call XE_PreloadAbility(SPELLID)
endfunction
endscope