Crazy_Dead
New Member
- Reaction score
- 24
I was wondering, how to detect distance traveled by an missile, and deal 35/40/45% of that range?
Can someone help me?
DotA Enchantress - Impetus.
Can someone help me?
DotA Enchantress - Impetus.
local real x1 = GetUnitX(GetTriggerUnit())
local real y1 = GetUnitY(GetTriggerUnit())
local real x2 = GetSpellTargetX()
local real y2 = GetSpellTargetY()
local real Distance = SquareRoot((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1))
local real Damage = 0.40*Distance
call UnitDamageTarget(GetTriggerUnit(),GetSpellTargetUnit(),Damage,true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
// if you are responding to a "Unit Attacked" event use:
local real x1 = GetUnitX(GetAttacker())
local real y1 = GetUnitY(GetAttacker())
local real x2 = GetUnitX(GetTriggerUnit())
local real y2 = GetUnitY(GetTriggerUnit())
local real Distance = SquareRoot((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1))
local real Damage = 0.40*Distance
call UnitDamageTarget(GetAttacker(),GetTriggerUnit(),Damage,true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
Impetus damage depends on distance between caster and target when it hit, hope you know that.
You have to use a dummy, or projectile system or whatever they are if you want to detect travelled distance.
find travelled distance
Impetus damage depends on distance between caster and target when it hit
//! zinc
library RangeDamage requires Projectile
{
constant integer SPELL_ID = 039;A000039; ;
constant integer DUMMY_ID = 039;n000039; ; /* Dummy must be the "Dummy.mdx" model file from XE */
constant string SkinPath = "Abilities\\Weapons\\DemonHunterMissile\\DemonHunterMissile.mdl";
location loc = Location(0.,0.);
struct data extends projectile
{
effect skin; vector o;
method onFinish()
{
real damage=0.4* SquareRoot((o.x-x)*(o.x-x)+(o.y-y)*(o.y-y));
UnitDamageTarget(source,target,damage,true,false,ATTACK_TYPE_CHAOS,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS);
DestroyEffect(skin); o.destroy();
}
static method NewMissile (unit u,unit v)
{
/* Setup vectors */
thistype this; vector
from = vector.create(GetWidgetX(u),GetWidgetY(u),0.),
dest = vector.create(GetWidgetX(v),GetWidgetY(v),0.);
MoveLocation(loc,from.x,from.y);
UnitAddAbility(u,039;Amrf039;); UnitRemoveAbility(u,039;Amrf039;);
from.z= GetLocationZ(loc) +60. +GetUnitFlyHeight(u);
//
MoveLocation(loc,dest.x,dest.y);
UnitAddAbility(v,039;Amrf039;); UnitRemoveAbility(v,039;Amrf039;);
dest.z=GetLocationZ(loc) +GetUnitFlyHeight(v);
/* Create Missile */
this = create(CreateUnit(GetTriggerPlayer(),DUMMY_ID,from.x,from.y,GetUnitFacing(u)));
/* Configure settings */
o = from; toRemove = true; source = u; target = v;
//
activeUnitCollision = false; activeDestCollision = false; activeTargetFollow = true;
/* Attach the missile "skin" */
skin = AddSpecialEffectTarget(SkinPath,toUnit,"origin");
//
doLaunch(from,dest,900.,0.15); dest.destroy();
}
static method Conditions()-> boolean
{
if (GetSpellAbilityId()==SPELL_ID)
//
NewMissile(GetTriggerUnit(),GetSpellTargetUnit());
//
return false;
}
static method onInit()
{
trigger t=CreateTrigger();
TriggerRegisterAnyUnitEventBJ(t,EVENT_PLAYER_UNIT_SPELL_EFFECT);
TriggerAddCondition(t,Condition(static method thistype.Conditions));
}
}
}
//! endzinc