My solution with GUI
well making elune arrow
you need 2 GUI triggers, 3 variables, 1 dummy unit
Information About Dummy Unit
It has Locust ability
Fly moment type
Moment speed that missle should have
Missle projectile model
Variables
A Point variable named TempLoc
An Unit variable named TempUnit
An Unit Group variable named MissleGroup
[trigger="First Trigger"]Missle Lunch
Events
Unit - A unit Starts the effect of an ability
Conditions
(Ability being cast) Equal to <Your Missle Ability>
Actions
Set TempLoc = (Position of (Triggering unit))
Unit - Create 1 <Dummy Missle Unit> for (Owner of (Triggering unit)) at TempLoc facing Default building facing degrees
Unit Group - Add (Last created unit) to MissleGroup
Custom script: call IssuePointOrder(bj_lastCreatedUnit,"move",GetUnitX(GetTriggerUnit())+Cos(GetUnitFacing(GetTriggerUnit())*bj_DEGTORAD)*5000,GetUnitY(GetTriggerUnit())+Sin(GetUnitFacing(GetTriggerUnit())*bj_DEGTORAD)*5000)
Custom script: call RemoveLocation(udg_TempLoc)
Custom script: call DestroyGroup(bj_lastCreatedGroup)
[/trigger]
[trigger="Second Trigger"]Missle Check
Events
Time - Every 0.50 seconds of game time
Conditions
Actions
Unit Group - Pick every unit in MissleGroup and do (Actions)
Loop - Actions
Set TempLoc = (Position of (Picked unit))
Set TempUnit = (Picked unit)
Custom script: set bj_wantDestroyGroup = true
Unit Group - Pick every unit in (Units within <Missle Area (200 would be fine)> of TempLoc) and do (Actions)
Loop - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(TempUnit is alive) Equal to True
((Picked unit) is A structure) Equal to False
((Picked unit) belongs to an enemy of (Owner of TempUnit)) Equal to True
Then - Actions
Unit Group - Remove TempUnit from MissleGroup
Unit - Cause TempUnit to damage (Picked unit), dealing <Your Damage> damage of attack type Spells and damage type Normal
Unit - Kill TempUnit
Else - Actions
Custom script: call RemoveLocation(udg_TempLoc)
[/trigger]
This seems fine to me