Ejemplo n.º 1
0
 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);
     }
 }
Ejemplo n.º 2
0
        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.");
        }