Beispiel #1
0
        public void RequestVoxelPositionReservation(long entityId, Vector3I voxelPosition, long reservationTimeMs, int senderSerialId)
        {
            var msg = new ReserveVoxelPositionMsg()
            {
                EntityId          = entityId,
                VoxelPos          = voxelPosition,
                ReservationTimeMs = reservationTimeMs,
                SenderSerialId    = senderSerialId,
            };

            Sync.Layer.SendMessageToServer(ref msg, MyTransportMessageEnum.Request);
        }
Beispiel #2
0
 private static void OnReserveVoxelPositionFailure(ref ReserveVoxelPositionMsg msg, MyNetworkClient sender)
 {
     if (OnReservationResult != null)
     {
         var reservationData = new ReservedEntityData()
         {
             Type       = MyReservedEntityType.VOXEL,
             EntityId   = msg.EntityId,
             GridPos    = msg.VoxelPos,
             ReserverId = new MyPlayer.PlayerId(0, msg.SenderSerialId)
         };
         OnReservationResult(ref reservationData, false);
     }
 }
Beispiel #3
0
        private static void OnReserveVoxelPositionRequest(ref ReserveVoxelPositionMsg msg, MyNetworkClient sender)
        {
            if (!Sync.IsServer)
            {
                return;
            }

            MyTransportMessageEnum responseState = MyTransportMessageEnum.Success;
            ReservedEntityData     entityData;
            MyVoxelBase            voxelMap = null;

            if (!MySession.Static.VoxelMaps.Instances.TryGetValue(msg.EntityId, out voxelMap))
            {
                return;
            }

            Vector3I voxelMapSize = voxelMap.StorageMax - voxelMap.StorageMin;

            Debug.Assert(voxelMapSize.AbsMax() < 2 * 10E6, "Voxel map size too large to reserve unique voxel position");
            // Integer overflow won't even happen on the next line for voxel maps smaller than roughly (2.5M)^3, and most Vector3I member functions have broken down way before that
            var entityId = new KeyValuePair <long, long>(msg.EntityId, msg.VoxelPos.X + msg.VoxelPos.Y * voxelMapSize.X + msg.VoxelPos.Z * voxelMapSize.X * voxelMapSize.Y);

            if (m_reservedEntities.TryGetValue(entityId, out entityData))
            {
                if (entityData.ReserverId == new MyPlayer.PlayerId(sender.SteamUserId, msg.SenderSerialId))
                {
                    entityData.ReservationTimer = Stopwatch.GetTimestamp() + Stopwatch.Frequency * msg.ReservationTimeMs / 1000;
                }
                else
                {
                    responseState = MyTransportMessageEnum.Failure;
                }
            }
            else
            {
                m_reservedEntities.Add(entityId, new ReservedEntityData()
                {
                    EntityId         = msg.EntityId,
                    GridPos          = msg.VoxelPos,
                    ReservationTimer = Stopwatch.GetTimestamp() + Stopwatch.Frequency * msg.ReservationTimeMs / 1000,
                    ReserverId       = new MyPlayer.PlayerId(sender.SteamUserId, msg.SenderSerialId)
                });
            }

            Sync.Layer.SendMessage(ref msg, sender.SteamUserId, responseState);
        }
		public void RequestVoxelPositionReservation(long entityId, Vector3I voxelPosition, long reservationTimeMs, int senderSerialId)
		{
			var msg = new ReserveVoxelPositionMsg()
			{
				EntityId = entityId,
				VoxelPos = voxelPosition,
				ReservationTimeMs = reservationTimeMs,
				SenderSerialId = senderSerialId,
			};
			Sync.Layer.SendMessageToServer(ref msg, MyTransportMessageEnum.Request);
		}
		private static void OnReserveVoxelPositionFailure(ref ReserveVoxelPositionMsg msg, MyNetworkClient sender)
		{
			if (OnReservationResult != null)
			{
				var reservationData = new ReservedEntityData()
				{
					Type = MyReservedEntityType.VOXEL,
					EntityId = msg.EntityId,
					GridPos = msg.VoxelPos,
					ReserverId = new MyPlayer.PlayerId(0, msg.SenderSerialId)
				};
				OnReservationResult(ref reservationData, false);
			}
		}
		private static void OnReserveVoxelPositionRequest(ref ReserveVoxelPositionMsg msg, MyNetworkClient sender)
		{
			if (!Sync.IsServer)
				return;

			MyTransportMessageEnum responseState = MyTransportMessageEnum.Success;
			ReservedEntityData entityData;
			MyVoxelBase voxelMap = null;
			if (!MySession.Static.VoxelMaps.Instances.TryGetValue(msg.EntityId, out voxelMap))
				return;

			Vector3I voxelMapSize = voxelMap.StorageMax - voxelMap.StorageMin;
			Debug.Assert(voxelMapSize.AbsMax() < 2 * 10E6, "Voxel map size too large to reserve unique voxel position");
			// Integer overflow won't even happen on the next line for voxel maps smaller than roughly (2.5M)^3, and most Vector3I member functions have broken down way before that
			var entityId = new KeyValuePair<long, long>(msg.EntityId, msg.VoxelPos.X + msg.VoxelPos.Y * voxelMapSize.X + msg.VoxelPos.Z * voxelMapSize.X * voxelMapSize.Y);
			if (m_reservedEntities.TryGetValue(entityId, out entityData))
			{
				if (entityData.ReserverId == new MyPlayer.PlayerId(sender.SteamUserId, msg.SenderSerialId))
					entityData.ReservationTimer = Stopwatch.GetTimestamp() + Stopwatch.Frequency * msg.ReservationTimeMs / 1000;
				else
					responseState = MyTransportMessageEnum.Failure;
			}
			else
				m_reservedEntities.Add(entityId, new ReservedEntityData()
				{
					EntityId = msg.EntityId,
					GridPos = msg.VoxelPos,
					ReservationTimer = Stopwatch.GetTimestamp() + Stopwatch.Frequency * msg.ReservationTimeMs / 1000,
					ReserverId = new MyPlayer.PlayerId(sender.SteamUserId, msg.SenderSerialId)
				});

			Sync.Layer.SendMessage(ref msg, sender.SteamUserId, responseState);
		}