Пример #1
0
        public bool IsInReservedArea(string areaName, Vector3D position)
        {
            Dictionary <long, ReservedAreaData> dictionary = null;

            if (m_reservedAreas.TryGetValue(areaName, out dictionary))
            {
                using (Dictionary <long, ReservedAreaData> .ValueCollection.Enumerator enumerator = dictionary.Values.GetEnumerator())
                {
                    while (true)
                    {
                        if (!enumerator.MoveNext())
                        {
                            break;
                        }
                        ReservedAreaData current = enumerator.Current;
                        Vector3D         vectord = current.WorldPosition - position;
                        if (vectord.LengthSquared() < (current.Radius * current.Radius))
                        {
                            return(true);
                        }
                    }
                }
            }
            return(false);
        }
Пример #2
0
        private static void OnReserveAreaRequest(ref ReserveAreaMsg msg, MyNetworkClient sender)
        {
            if (!Sync.IsServer)
            {
                return;
            }

            if (!m_reservedAreas.ContainsKey(msg.ReservationName))
            {
                m_reservedAreas.Add(msg.ReservationName, new Dictionary <long, ReservedAreaData>());
            }

            var  reservations      = m_reservedAreas[msg.ReservationName];
            bool reservedBySomeone = false;

            MyPlayer.PlayerId requestId = new MyPlayer.PlayerId(sender.SteamUserId, msg.SenderSerialId);

            foreach (var r in reservations)
            {
                var  currentReservation = r.Value;
                var  sqDist             = (currentReservation.WorldPosition - msg.Position).LengthSquared();
                bool inRadius           = sqDist <= currentReservation.Radius * currentReservation.Radius;

                if (inRadius)
                {
                    reservedBySomeone = true;
                    break;
                }
            }

            if (!reservedBySomeone)
            {
                reservations[AreaReservationCounter++] = new ReservedAreaData()
                {
                    WorldPosition    = msg.Position,
                    Radius           = msg.Radius,
                    ReservationTimer = MySandboxGame.Static.UpdateTime + MyTimeSpan.FromMiliseconds(msg.ReservationTimeMs),
                    ReserverId       = requestId,
                };

                var allMsg = new ReserveAreaAllMsg()
                {
                    Id              = AreaReservationCounter,
                    Position        = msg.Position,
                    Radius          = msg.Radius,
                    ReservationName = msg.ReservationName,
                };

                Sync.Layer.SendMessageToAll(ref allMsg, MyTransportMessageEnum.Success);
                Sync.Layer.SendMessage(ref msg, sender.SteamUserId, MyTransportMessageEnum.Success);
            }
            else
            {
                Sync.Layer.SendMessage(ref msg, sender.SteamUserId, MyTransportMessageEnum.Failure);
            }
        }
Пример #3
0
 private static void OnReserveAreaSuccess(Vector3D position, float radius, int senderSerialId)
 {
     if (OnAreaReservationResult != null)
     {
         ReservedAreaData entityData = new ReservedAreaData {
             WorldPosition = position,
             Radius        = radius,
             ReserverId    = new MyPlayer.PlayerId(0L, senderSerialId)
         };
         OnAreaReservationResult(ref entityData, true);
     }
 }
 private static void OnReserveAreaFailure(Vector3D position, float radius, int senderSerialId)
 {
     if (OnAreaReservationResult != null)
     {
         var reservationData = new ReservedAreaData()
         {
             WorldPosition = position,
             Radius        = radius,
             ReserverId    = new MyPlayer.PlayerId(0, senderSerialId)
         };
         OnAreaReservationResult(ref reservationData, false);
     }
 }
Пример #5
0
        private static void OnReserveAreaAllSuccess(long id, string reservationName, Vector3D position, float radius)
        {
            if (!m_reservedAreas.ContainsKey(reservationName))
            {
                m_reservedAreas[reservationName] = new Dictionary <long, ReservedAreaData>();
            }
            ReservedAreaData data = new ReservedAreaData {
                WorldPosition = position,
                Radius        = radius
            };

            m_reservedAreas[reservationName].Add(id, data);
        }
Пример #6
0
 private static void OnReserveAreaFailure(ref ReserveAreaMsg msg, MyNetworkClient sender)
 {
     if (OnAreaReservationResult != null)
     {
         var reservationData = new ReservedAreaData()
         {
             WorldPosition = msg.Position,
             Radius        = msg.Radius,
             ReserverId    = new MyPlayer.PlayerId(0, msg.SenderSerialId)
         };
         OnAreaReservationResult(ref reservationData, false);
     }
 }
        private static void OnReserveAreaRequest(string reservationName, Vector3D position, float radius, long reservationTimeMs, int senderSerialId)
        {
            EndpointId sender;

            if (MyEventContext.Current.IsLocallyInvoked)
            {
                sender = new EndpointId(Sync.MyId);
            }
            else
            {
                sender = MyEventContext.Current.Sender;
            }

            if (!m_reservedAreas.ContainsKey(reservationName))
            {
                m_reservedAreas.Add(reservationName, new Dictionary <long, ReservedAreaData>());
            }

            var  reservations      = m_reservedAreas[reservationName];
            bool reservedBySomeone = false;

            MyPlayer.PlayerId requestId = new MyPlayer.PlayerId(sender.Value, senderSerialId);

            foreach (var r in reservations)
            {
                var  currentReservation = r.Value;
                var  sqDist             = (currentReservation.WorldPosition - position).LengthSquared();
                bool inRadius           = sqDist <= currentReservation.Radius * currentReservation.Radius;

                if (inRadius)
                {
                    reservedBySomeone = true;
                    break;
                }
            }

            if (!reservedBySomeone)
            {
                reservations[AreaReservationCounter++] = new ReservedAreaData()
                {
                    WorldPosition    = position,
                    Radius           = radius,
                    ReservationTimer = MySandboxGame.Static.UpdateTime + MyTimeSpan.FromMilliseconds(reservationTimeMs),
                    ReserverId       = requestId,
                };

                MyMultiplayer.RaiseStaticEvent(s => MyAiTargetManager.OnReserveAreaAllSuccess, AreaReservationCounter, reservationName, position, radius);

                if (MyEventContext.Current.IsLocallyInvoked)
                {
                    OnReserveAreaSuccess(position, radius, senderSerialId);
                }
                else
                {
                    MyMultiplayer.RaiseStaticEvent(s => MyAiTargetManager.OnReserveAreaSuccess, position, radius, senderSerialId, sender);
                }
            }
            else
            {
                if (MyEventContext.Current.IsLocallyInvoked)
                {
                    OnReserveAreaFailure(position, radius, senderSerialId);
                }
                else
                {
                    MyMultiplayer.RaiseStaticEvent(s => MyAiTargetManager.OnReserveAreaFailure, position, radius, senderSerialId, sender);
                }
            }
        }
 private static void OnReserveAreaFailure(ref ReserveAreaMsg msg, MyNetworkClient sender)
 {
     if (OnAreaReservationResult != null)
     {
         var reservationData = new ReservedAreaData()
         {
             WorldPosition = msg.Position,
             Radius = msg.Radius,
             ReserverId = new MyPlayer.PlayerId(0, msg.SenderSerialId)
         };
         OnAreaReservationResult(ref reservationData, false);
     }
 }
        private static void OnReserveAreaRequest(ref ReserveAreaMsg msg, MyNetworkClient sender)
        {
            if (!Sync.IsServer)
                return;

            if (!m_reservedAreas.ContainsKey(msg.ReservationName))
                m_reservedAreas.Add(msg.ReservationName, new Dictionary<long, ReservedAreaData>());

            var reservations = m_reservedAreas[msg.ReservationName];
            bool reservedBySomeone = false;
            MyPlayer.PlayerId requestId = new MyPlayer.PlayerId(sender.SteamUserId, msg.SenderSerialId);

            foreach (var r in reservations)
            {
                var currentReservation = r.Value;
                var sqDist = (currentReservation.WorldPosition - msg.Position).LengthSquared();
                bool inRadius = sqDist <= currentReservation.Radius * currentReservation.Radius; 
                
                if (inRadius)
                {
                    reservedBySomeone = true;
                    break;
                }
            }

            if (!reservedBySomeone)
            {
                reservations[AreaReservationCounter++] = new ReservedAreaData()
                {
                    WorldPosition = msg.Position,
                    Radius = msg.Radius,
                    ReservationTimer = MySandboxGame.Static.UpdateTime + MyTimeSpan.FromMiliseconds(msg.ReservationTimeMs),
                    ReserverId = requestId,
                };

                var allMsg = new ReserveAreaAllMsg()
                {
                    Id = AreaReservationCounter,
                    Position = msg.Position,
                    Radius = msg.Radius,
                    ReservationName = msg.ReservationName,
                };

                Sync.Layer.SendMessageToAll(ref allMsg, MyTransportMessageEnum.Success);
                Sync.Layer.SendMessage(ref msg, sender.SteamUserId, MyTransportMessageEnum.Success);
            }
            else
            {
                Sync.Layer.SendMessage(ref msg, sender.SteamUserId, MyTransportMessageEnum.Failure);
            }

            
        }
Пример #10
0
        private static void OnReserveAreaRequest(string reservationName, Vector3D position, float radius, long reservationTimeMs, int senderSerialId)
        {
            EndpointId sender;
            Vector3D?  nullable;

            if (MyEventContext.Current.IsLocallyInvoked)
            {
                sender = new EndpointId(Sync.MyId);
            }
            else
            {
                sender = MyEventContext.Current.Sender;
            }
            if (!m_reservedAreas.ContainsKey(reservationName))
            {
                m_reservedAreas.Add(reservationName, new Dictionary <long, ReservedAreaData>());
            }
            Dictionary <long, ReservedAreaData> dictionary = m_reservedAreas[reservationName];
            bool flag = false;

            MyPlayer.PlayerId id2 = new MyPlayer.PlayerId(sender.Value, senderSerialId);
            foreach (KeyValuePair <long, ReservedAreaData> pair in dictionary)
            {
                ReservedAreaData data    = pair.Value;
                Vector3D         vectord = data.WorldPosition - position;
                if (vectord.LengthSquared() <= (data.Radius * data.Radius))
                {
                    flag = true;
                    break;
                }
            }
            if (flag)
            {
                if (MyEventContext.Current.IsLocallyInvoked)
                {
                    OnReserveAreaFailure(position, radius, senderSerialId);
                }
                else
                {
                    nullable = null;
                    MyMultiplayer.RaiseStaticEvent <Vector3D, float, int>(s => new Action <Vector3D, float, int>(MyAiTargetManager.OnReserveAreaFailure), position, radius, senderSerialId, sender, nullable);
                }
            }
            else
            {
                AreaReservationCounter += 1L;
                ReservedAreaData data2 = new ReservedAreaData {
                    WorldPosition    = position,
                    Radius           = radius,
                    ReservationTimer = MySandboxGame.Static.TotalTime + MyTimeSpan.FromMilliseconds((double)reservationTimeMs),
                    ReserverId       = id2
                };
                dictionary[AreaReservationCounter] = data2;
                EndpointId targetEndpoint = new EndpointId();
                nullable = null;
                MyMultiplayer.RaiseStaticEvent <long, string, Vector3D, float>(s => new Action <long, string, Vector3D, float>(MyAiTargetManager.OnReserveAreaAllSuccess), AreaReservationCounter, reservationName, position, radius, targetEndpoint, nullable);
                if (MyEventContext.Current.IsLocallyInvoked)
                {
                    OnReserveAreaSuccess(position, radius, senderSerialId);
                }
                else
                {
                    nullable = null;
                    MyMultiplayer.RaiseStaticEvent <Vector3D, float, int>(s => new Action <Vector3D, float, int>(MyAiTargetManager.OnReserveAreaSuccess), position, radius, senderSerialId, sender, nullable);
                }
            }
        }
Пример #11
0
 private static void OnReserveAreaFailure(Vector3D position, float radius, int senderSerialId)
 {
     if (OnAreaReservationResult != null)
     {
         var reservationData = new ReservedAreaData()
         {
             WorldPosition = position,
             Radius = radius,
             ReserverId = new MyPlayer.PlayerId(0, senderSerialId)
         };
         OnAreaReservationResult(ref reservationData, false);
     }
 }
Пример #12
0
        private static void OnReserveAreaRequest(string reservationName, Vector3D position, float radius, long reservationTimeMs, int senderSerialId)
        {
            EndpointId sender;
            if (MyEventContext.Current.IsLocallyInvoked)
                sender = new EndpointId(Sync.MyId);
            else
                sender = MyEventContext.Current.Sender;

            if (!m_reservedAreas.ContainsKey(reservationName))
                m_reservedAreas.Add(reservationName, new Dictionary<long, ReservedAreaData>());

            var reservations = m_reservedAreas[reservationName];
            bool reservedBySomeone = false;
            MyPlayer.PlayerId requestId = new MyPlayer.PlayerId(sender.Value, senderSerialId);

            foreach (var r in reservations)
            {
                var currentReservation = r.Value;
                var sqDist = (currentReservation.WorldPosition - position).LengthSquared();
                bool inRadius = sqDist <= currentReservation.Radius * currentReservation.Radius; 
                
                if (inRadius)
                {
                    reservedBySomeone = true;
                    break;
                }
            }

            if (!reservedBySomeone)
            {
                reservations[AreaReservationCounter++] = new ReservedAreaData()
                {
                    WorldPosition = position,
                    Radius = radius,
                    ReservationTimer = MySandboxGame.Static.UpdateTime + MyTimeSpan.FromMiliseconds(reservationTimeMs),
                    ReserverId = requestId,
                };

                MyMultiplayer.RaiseStaticEvent(s => MyAiTargetManager.OnReserveAreaAllSuccess, AreaReservationCounter, reservationName, position, radius);

                if (MyEventContext.Current.IsLocallyInvoked)
                    OnReserveAreaSuccess(position, radius, senderSerialId);
                else
                    MyMultiplayer.RaiseStaticEvent(s => MyAiTargetManager.OnReserveAreaSuccess, position, radius, senderSerialId, sender);
            }
            else
            {
                if (MyEventContext.Current.IsLocallyInvoked)
                    OnReserveAreaFailure(position, radius, senderSerialId);
                else
                    MyMultiplayer.RaiseStaticEvent(s => MyAiTargetManager.OnReserveAreaFailure, position, radius, senderSerialId, sender);
            }
        }