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