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); }
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); } }
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); } }
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); }
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 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); } }
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); } } }
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); } }