public void Fire(ServerShip ship, bool isLeft, int number, int idTarget, Ecm jammer) { lock (m_locker) { if (ship.Missiles == 0) { return; } var target = Ships.ById(idTarget); if (target == null || isLeft != ship.IsLeftBoard(target)) { return; } var board = isLeft ? ship.Left : ship.Right; var missileClass = board.GetRack(number).MissileClass; if (!board.Fire(number)) { return; } ship.Missiles--; int id = Interlocked.Increment(ref IdNext); var missile = new Missile { Id = id, Position = ship.Position, Speed = ship.Speed, Acceleration = ship.Acceleration, }; var control = new MissileControl { Id = id, Arrow = missile, Origin = ship, Target = target, IdOrigin = ship.Id, IdTarget = target.Id, Jammer = jammer, Thrust = missileClass.Acceleration, Remaining = missileClass.FlyTime, HitDistance = missileClass.HitDistance, Started = Time.TotalSeconds, }; Missiles.Add(id, control); } }
public IParticle ById(ParticleType type, int id) { if (id == 0) { return(null); } switch (type) { case ParticleType.Star: return(Stars.ById(id)); case ParticleType.Ship: return(Ships.ById(id)); case ParticleType.Missile: return(Missiles.ById(id)); } throw new IndexOutOfRangeException("Unknown particle type."); }