/// <summary> /// Returns the missile position after time time. /// </summary> public Vector2 GetMissilePosition(int time) { var t = Math.Max(0, Environment.TickCount + time - StartTick - SpellData.Delay); t = (int)Math.Max(0, Math.Min(CollisionEnd.Distance(Start), t * SpellData.MissileSpeed / 1000)); return(Start + Direction * t); }
public Vector2 GetMissilePosition(int time) { var t = Math.Max(0, Utils.GameTimeTickCount + time - StartTick - SpellData.Delay); int x; if (SpellData.MissileAccel == 0) { x = t * SpellData.MissileSpeed / 1000; } else { var t1 = (SpellData.MissileAccel > 0 ? SpellData.MissileMaxSpeed : SpellData.MissileMinSpeed - SpellData.MissileSpeed) * 1000f / SpellData.MissileAccel; x = t <= t1 ? (int) (t * SpellData.MissileSpeed / 1000d + 0.5d * SpellData.MissileAccel * Math.Pow(t / 1000d, 2)) : (int) (t1 * SpellData.MissileSpeed / 1000d + 0.5d * SpellData.MissileAccel * Math.Pow(t1 / 1000d, 2) + (t - t1) / 1000d * (SpellData.MissileAccel < 0 ? SpellData.MissileMaxSpeed : SpellData.MissileMinSpeed)); } t = (int)Math.Max(0, Math.Min(CollisionEnd.Distance(Start), x)); return(Start + Direction * t); }
/// <summary> /// Returns the missile position after time time. /// </summary> public Vector2 GetMissilePosition(int time) { var t = Math.Max(0, Utils.TickCount + time - StartTick - SpellData.Delay); var x = 0; // Missile with acceleration = 0. if (SpellData.MissileAccel == 0) { x = t * SpellData.MissileSpeed / 1000; } // Missile with constant acceleration. else { var t1 = (SpellData.MissileAccel > 0 ? SpellData.MissileMaxSpeed : SpellData.MissileMinSpeed - SpellData.MissileSpeed) * 1000f / SpellData.MissileAccel; if (t <= t1) { x = (int)(t * SpellData.MissileSpeed / 1000d + 0.5d * SpellData.MissileAccel * Math.Pow(t / 1000d, 2)); } else { x = (int)(t1 * SpellData.MissileSpeed / 1000d + 0.5d * SpellData.MissileAccel * Math.Pow(t1 / 1000d, 2) + (t - t1) / 1000d * (SpellData.MissileAccel < 0 ? SpellData.MissileMinSpeed : SpellData.MissileMaxSpeed)); } } t = (int)Math.Max(0, Math.Min(CollisionEnd.Distance(Start), x)); return(Start + Direction * t); }