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.LSDistance(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, System.Environment.TickCount + time - StartTick - SkillshotData.Delay); var x = 0; //Missile with acceleration = 0. if (SkillshotData.MissileAccel == 0) { x = t * SkillshotData.MissileSpeed / 1000; } //Missile with constant acceleration. else { var t1 = (SkillshotData.MissileAccel > 0 ? SkillshotData.MissileMaxSpeed : SkillshotData.MissileMinSpeed - SkillshotData.MissileSpeed) * 1000f / SkillshotData.MissileAccel; if (t <= t1) { x = (int) (t * SkillshotData.MissileSpeed / 1000d + 0.5d * SkillshotData.MissileAccel * Math.Pow(t / 1000d, 2)); } else { x = (int) (t1 * SkillshotData.MissileSpeed / 1000d + 0.5d * SkillshotData.MissileAccel * Math.Pow(t1 / 1000d, 2) + (t - t1) / 1000d * (SkillshotData.MissileAccel < 0 ? SkillshotData.MissileMaxSpeed : SkillshotData.MissileMinSpeed)); } } t = (int)Math.Max(0, Math.Min(CollisionEnd.LSDistance(StartPosition), x)); return(StartPosition + Direction * t); }