public List <Participant> GetConnectedParticipants() { // If no match is connected, simply return null. if (mCurrentMatch == null) { return(null); } var list = new List <Participant>(); // First grab the connected peers. var playersNSArray = mCurrentMatch.Players; if (playersNSArray != null) { var players = playersNSArray.ToArray(p => InteropObjectFactory <GKPlayer> .FromPointer(p, ptr => new GKPlayer(ptr))); list.AddRange(players.Select(p => Participant.FromGKPlayer(p, Participant.ParticipantStatus.Joined, true))); } // Add the local player (self) as GameKit doesn't include this. list.Add(Participant.FromGKPlayer( GKLocalPlayer.LocalPlayer, Participant.ParticipantStatus.Joined, true)); // Sort the participants based on their ID and return the sorted list. return(list.OrderBy(p => p.ParticipantId).ToList()); }
public Participant GetParticipant(string participantId) { if (string.IsNullOrEmpty(participantId)) { return(null); } if (mCurrentMatch == null) { return(null); } var playersNSArray = mCurrentMatch.Players; if (playersNSArray == null) { return(null); } var players = playersNSArray.ToArray(p => InteropObjectFactory <GKPlayer> .FromPointer(p, ptr => new GKPlayer(ptr))); return(Participant.FromGKPlayer( players.FirstOrDefault(p => p.PlayerID.Equals(participantId)), Participant.ParticipantStatus.Joined, true)); }
private static void InternalDidRequestMatchWithOtherPlayersCallback(IntPtr listenerPtr, IntPtr player, IntPtr playersToInvite) { var forwarder = FromPointer(listenerPtr); if (forwarder != null && forwarder.ListenerCount > 0) { // GKPlayer. GKPlayer gkPlayer = InteropObjectFactory <GKPlayer> .FromPointer(player, ptr => new GKPlayer(ptr)); // GKPlayer[]. GKPlayer[] gkPlayersToInvite = null; if (PInvokeUtil.IsNotNull(playersToInvite)) { // Creating a one-time usage NSArray binder, no need to use the factory. using (var nsArray = new NSArray <GKPlayer>(playersToInvite)) { gkPlayersToInvite = nsArray.ToArray(ptr => InteropObjectFactory <GKPlayer> .FromPointer(ptr, p => new GKPlayer(p))); } } // Invoke consumer delegates. forwarder.InvokeOnAllListeners(l => l.PlayerDidRequestMatchWithOtherPlayers(gkPlayer, gkPlayersToInvite)); } }
public void CreateWithMatchmakerUI(MatchRequest request, IRealTimeMultiplayerListener listener) { Util.NullArgumentTest(request); Util.NullArgumentTest(listener); if (mCurrentMatchmakerVC != null) { Debug.Log("Ignoring CreateWithMatchmakerUI call because another matchmaker UI is being shown."); return; } // Create a new GKMatchmakerViewController. var vc = InteropObjectFactory <GKMatchmakerViewController> .Create( () => { using (var gkReq = request.ToGKMatchRequest()) return(new GKMatchmakerViewController(gkReq)); }, viewController => { return(viewController.ToPointer()); }); // Create a delgate for the vc. vc.MatchmakerDelegate = new InternalGKMatchmakerViewControllerDelegateImpl(this, listener); // Store the VC ref. mCurrentMatchmakerVC = vc; // Now show the VC. using (var unityVC = UIViewController.UnityGetGLViewController()) unityVC.PresentViewController(vc, true, null); }
/// <summary> /// Construct a new instance from <see cref="EasyMobile.iOS.GameKit.GKTurnBasedMatch"/> object. /// </summary> /// <returns>The GK turn based match.</returns> /// <param name="turnBasedMatch">Turn based match.</param> internal static TurnBasedMatch FromGKTurnBasedMatch(GKTurnBasedMatch turnBasedMatch) { if (turnBasedMatch == null) { return(null); } // Cache values to save on calls to native side. var currentGKParticipant = turnBasedMatch.CurrentParticipant; var nsParticipantsArray = turnBasedMatch.Participants; var nsMatchData = turnBasedMatch.MatchData; var currentGKPlayer = currentGKParticipant != null ? currentGKParticipant.Player : null; var allParticipants = nsParticipantsArray == null ? null : nsParticipantsArray.ToArray( ptr => InteropObjectFactory <GKTurnBasedParticipant> .FromPointer(ptr, p => new GKTurnBasedParticipant(p))); var matchData = nsMatchData != null && nsMatchData.Length > 0 ? nsMatchData.ToBytes() : null; // if data length == 0 we also return null to have a consistent behaviour between GC & GPG. return(new TurnBasedMatch( turnBasedMatch.MatchID, allParticipants == null ? 0 : allParticipants.Length, matchData, GKLocalPlayer.LocalPlayer == null ? null : GKLocalPlayer.LocalPlayer.PlayerID, // GKTurnBasedMatch doesn't have 'SelfParticipantId', using the equivalent local player's ID allParticipants == null ? null : allParticipants.Where(p => p.Player != null).Select(p => Participant.FromGKTurnBasedParticipant(p)).ToArray(), // only returns participants who have joined currentGKPlayer == null ? null : currentGKPlayer.PlayerID, turnBasedMatch.Status.ToTurnBasedMatchStatus()) { GC_TurnBasedMatch = turnBasedMatch }); }
public void SendMessage(bool reliable, string participantId, byte[] data) { Util.NullArgumentTest(participantId); Util.NullArgumentTest(data); if (mCurrentMatch == null) { return; } // Cache the NSArray of players. var playersNSArray = mCurrentMatch.Players; if (playersNSArray == null) { return; } var players = playersNSArray.ToArray(p => InteropObjectFactory <GKPlayer> .FromPointer(p, ptr => new GKPlayer(ptr))); var player = players.FirstOrDefault(p => p.PlayerID.Equals(participantId)); if (player == default(GKPlayer)) { return; } NSError error; mCurrentMatch.SendData( data, new GKPlayer[] { player }, reliable ? GKMatch.GKMatchSendDataMode.Reliable : GKMatch.GKMatchSendDataMode.Unreliable, out error); }
private static void InternalMultipleMatchesCallback(IntPtr matches, IntPtr error, IntPtr secondaryCallback) { if (PInvokeUtil.IsNull(secondaryCallback)) { return; } GKTurnBasedMatch[] gkMatches = null; if (PInvokeUtil.IsNotNull(matches)) { // Creating a one-time usage NSArray binder, no need to use the factory. using (var nsArray = new NSArray <GKTurnBasedMatch>(matches)) { gkMatches = nsArray.ToArray(ptr => InteropObjectFactory <GKTurnBasedMatch> .FromPointer(ptr, p => new GKTurnBasedMatch(p))); } } // A new NSError object is always created on native side, so no need // to check the binder pool for reusing an existing one. NSError nsError = PInvokeUtil.IsNotNull(error) ? new NSError(error) : null; // Invoke consumer callback. PInvokeCallbackUtil.PerformInternalCallback( "GKTurnBasedMatch#InternalMultipleMatchesCallback", PInvokeCallbackUtil.Type.Temporary, gkMatches, nsError, secondaryCallback); }
public void TakePicture(CameraType cameraType, Action <string, MediaResult> callback) { Util.NullArgumentTest(callback); if (mPickerController != null) { Debug.Log("Ignoring TakePicture call because another image picker UI is being shown."); return; } callback = RuntimeHelper.ToMainThread(callback); if (!IsCameraAvailable(cameraType)) { callback(cameraType.ToString() + " camera is not supported on this device.", null); return; } // Create a new image picker. var picker = InteropObjectFactory <UIImagePickerController> .Create( () => new UIImagePickerController(), c => c.ToPointer()); // Source type must be camera. picker.SourceType = UIImagePickerController.SourceTypeEnum.Camera; // Set camera type. picker.CameraDevice = cameraType == CameraType.Front ? UIImagePickerController.CameraDeviceEnum.Front : UIImagePickerController.CameraDeviceEnum.Rear; // Only allow image. NSMutableArray <NSString> mediaTypes = new NSMutableArray <NSString>(); mediaTypes.AddObject(UTTypeConstants.kUTTypeImage); picker.MediaTypes = mediaTypes; // Create a delegate for the TBM VC. picker.Delegate = new InternalUIImagePickerControllerDelegate(InternalUIImagePickerControllerDelegate.PickerOperation.TakePicture) { CloseAndResetVC = () => { if (mPickerController != null) { mPickerController.DismissViewController(true, null); mPickerController = null; } }, CompleteCallback = (error, result) => { callback(error, result); } }; // Store the VC ref. mPickerController = picker; // Now show the VC. using (var unityVC = UIViewController.UnityGetGLViewController()) unityVC.PresentViewController(picker, true, null); }
/// <summary> /// Returns an array of the available media types for the specified source type. /// </summary> /// <returns>An array of the available media types for the specified source type.</returns> /// <param name="sourceType">The source to use to pick an image.</param> public static NSArray <NSString> AvailableMediaTypesForSourceType(SourceTypeEnum sourceType) { var ptr = C.UIImagePickerController_availableMediaTypesForSourceType(sourceType); var nsArray = InteropObjectFactory <NSArray <NSString> > .FromPointer(ptr, p => new NSArray <NSString>(p)); CoreFoundation.CFFunctions.CFRelease(ptr); return(nsArray); }
/// <summary> /// Returns an array of NSNumber objects indicating the capture modes supported by a given camera device. /// </summary> /// <returns>An array of the capture modes.</returns> /// <param name="cameraDevice">Camera Device.</param> public static NSArray <NSString> AvailableCaptureModesForCameraDevice(CameraDeviceEnum cameraDevice) { var ptr = C.UIImagePickerController_availableCaptureModesForCameraDevice(cameraDevice); var nsArray = InteropObjectFactory <NSArray <NSString> > .FromPointer(ptr, p => new NSArray <NSString>(p)); CoreFoundation.CFFunctions.CFRelease(ptr); return(nsArray); }
public void TakeTurn(TurnBasedMatch match, byte[] data, string nextParticipantId, Action <bool> callback) { Util.NullArgumentTest(match); Util.NullArgumentTest(data); // Find the next GKTurnBasedParticipant with the given ID. var participants = match.GC_TurnBasedMatch.Participants.ToArray( ptr => InteropObjectFactory <GKTurnBasedParticipant> .FromPointer(ptr, p => new GKTurnBasedParticipant(p))); GKTurnBasedParticipant nextGKParticipant; if (string.IsNullOrEmpty(nextParticipantId)) { // No specific next player, choosing the the next vacant slot. nextGKParticipant = participants.FirstOrDefault(p => p.Player == null); } else { // Find the specified next player. nextGKParticipant = participants.FirstOrDefault(p => { var gkPlayer = p.Player; return(gkPlayer != null && gkPlayer.PlayerID.Equals(nextParticipantId)); }); } if (nextGKParticipant == default(GKTurnBasedParticipant)) { Debug.LogErrorFormat("Not found next participant for ID {0}. Aborting TakeTurn...", string.IsNullOrEmpty(nextParticipantId) ? "[NullOrEmpty]" : nextParticipantId); if (callback != null) { callback(false); } return; } match.GC_TurnBasedMatch.EndTurn( new GKTurnBasedParticipant[] { nextGKParticipant }, GKTurnBasedMatch.GKTurnTimeoutDefault, data, error => { if (error != null) { Debug.Log("Failed to take turn with error " + error.LocalizedDescription); } if (callback != null) { callback(error == null); } } ); }
private static void InternalUIDidCancelCallback(IntPtr delegatePtr, IntPtr pickerPtr) { var forwarder = FromPointer(delegatePtr); if (forwarder != null && forwarder.Listener != null) { var picker = InteropObjectFactory <UIImagePickerController> .FromPointer(pickerPtr, ptr => new UIImagePickerController(ptr)); forwarder.InvokeOnListener(l => l.ImagePickerControllerDidCancel(picker)); } }
/// <summary> /// Returns the singleton matchmaker instance. /// </summary> /// <returns>The matchmaker.</returns> public static GKMatchmaker SharedMatchmaker() { if (sSharedMatchmaker == null) { var ptr = C.GKMatchmaker_sharedMatchmaker(); sSharedMatchmaker = InteropObjectFactory <GKMatchmaker> .FromPointer(ptr, p => new GKMatchmaker(p)); CoreFoundation.CFFunctions.CFRelease(ptr); } return(sSharedMatchmaker); }
private static void InternalWasCancelledCallback(IntPtr delegatePtr, IntPtr viewController) { var forwarder = FromPointer(delegatePtr); if (forwarder != null && forwarder.Listener != null) { var vc = InteropObjectFactory <GKTurnBasedMatchmakerViewController> .FromPointer( viewController, ptr => new GKTurnBasedMatchmakerViewController(ptr)); forwarder.InvokeOnListener(l => l.TurnBasedMatchmakerViewControllerWasCancelled(vc)); } }
private static void InternalPlayerDidChangeConnectionStateCallback(IntPtr delegatePtr, IntPtr match, IntPtr player, GKPlayerConnectionState state) { var forwarder = FromPointer(delegatePtr); if (forwarder != null && forwarder.Listener != null) { var gkMatch = InteropObjectFactory <GKMatch> .FromPointer(match, ptr => new GKMatch(ptr)); var gkPlayer = InteropObjectFactory <GKPlayer> .FromPointer(player, ptr => new GKPlayer(ptr)); forwarder.InvokeOnListener(l => l.PlayerDidChangeConnectionState(gkMatch, gkPlayer, state)); } }
private static void InternalWantsToQuitMatchCallback(IntPtr listenerPtr, IntPtr player, IntPtr match) { var forwarder = FromPointer(listenerPtr); if (forwarder != null && forwarder.ListenerCount > 0) { var gkPlayer = InteropObjectFactory <GKPlayer> .FromPointer(player, ptr => new GKPlayer(ptr)); var gkTBMatch = InteropObjectFactory <GKTurnBasedMatch> .FromPointer(match, ptr => new GKTurnBasedMatch(ptr)); forwarder.InvokeOnAllListeners(l => l.PlayerWantsToQuitMatch(gkPlayer, gkTBMatch)); } }
private static void InternalMatchDidFailWithErrorCallback(IntPtr delegatePtr, IntPtr match, IntPtr error) { var forwarder = FromPointer(delegatePtr); if (forwarder != null && forwarder.Listener != null) { var gkMatch = InteropObjectFactory <GKMatch> .FromPointer(match, ptr => new GKMatch(ptr)); var nsError = InteropObjectFactory <NSError> .FromPointer(error, ptr => new NSError(ptr)); forwarder.InvokeOnListener(l => l.MatchDidFailWithError(gkMatch, nsError)); } }
private static void InternalPresentationControllerWillDismissCallback(IntPtr delegatePtr, IntPtr presentationControllerPtr) { var forwarder = FromPointer(delegatePtr); if (forwarder != null && forwarder.Listener != null) { // PresentationController. var controller = InteropObjectFactory <UIPresentationController> .FromPointer(presentationControllerPtr, ptr => new UIPresentationController(ptr)); // Invoke consumer delegates. forwarder.InvokeOnListener(l => l.PresentationControllerWillDismiss(controller)); } }
public void PickContact(Action <string, Contact> callback) { var picker = InteropObjectFactory <CNContactPickerViewController> .Create( () => new CNContactPickerViewController(), c => c.ToPointer()); picker.DisplayedPropertyKeys = GetPropertyKeys(); picker.Delegate = new iOSContactsPickerCallback(callback, picker); using (var unityVC = UIViewController.UnityGetGLViewController()) unityVC.PresentViewController(picker, true, null); }
private static void InternalDidAcceptInviteCallback(IntPtr listenerPtr, IntPtr player, IntPtr invite) { var forwarder = FromPointer(listenerPtr); if (forwarder != null && forwarder.ListenerCount > 0) { var gkPlayer = InteropObjectFactory <GKPlayer> .FromPointer(player, ptr => new GKPlayer(ptr)); var gkInvite = InteropObjectFactory <GKInvite> .FromPointer(invite, ptr => new GKInvite(ptr)); forwarder.InvokeOnAllListeners(l => l.PlayerDidAcceptInvite(gkPlayer, gkInvite)); } }
private static void InternalReceivedTurnEventForMatchCallback(IntPtr listenerPtr, IntPtr player, IntPtr match, bool didBecomeActive) { var forwarder = FromPointer(listenerPtr); if (forwarder != null && forwarder.ListenerCount > 0) { var gkPlayer = InteropObjectFactory <GKPlayer> .FromPointer(player, ptr => new GKPlayer(ptr)); var gkTBMatch = InteropObjectFactory <GKTurnBasedMatch> .FromPointer(match, ptr => new GKTurnBasedMatch(ptr)); forwarder.InvokeOnAllListeners(l => l.PlayerReceivedTurnEventForMatch(gkPlayer, gkTBMatch, didBecomeActive)); } }
private static void InternalContactPickerDidSelectContactsCallback(IntPtr delegatePtr, IntPtr pickerPtr, IntPtr contactsPtr) { var forwarder = FromPointer(delegatePtr); if (forwarder != null && forwarder.Listener != null) { var picker = InteropObjectFactory <CNContactPickerViewController> .FromPointer(pickerPtr, ptr => new CNContactPickerViewController(ptr)); var contacts = InteropObjectFactory <NSArray <CNContact> > .FromPointer(contactsPtr, ptr => new NSArray <CNContact>(ptr)); forwarder.InvokeOnListener(l => l.ContactPickerDidSelectContacts(picker, contacts)); } }
private static void InternalContactPickerDidCancelCallback(IntPtr delegatePtr, IntPtr pickerPtr) { var forwarder = FromPointer(delegatePtr); if (forwarder != null && forwarder.Listener != null) { // Picker. var picker = InteropObjectFactory <CNContactPickerViewController> .FromPointer(pickerPtr, ptr => new CNContactPickerViewController(ptr)); // Invoke consumer delegates. forwarder.InvokeOnListener(l => l.ContactPickerDidCancel(picker)); } }
public void Pick(Action <string, MediaResult[]> callback) { Util.NullArgumentTest(callback); if (mPickerController != null) { Debug.Log("Ignoring Pick call because another image picker UI is being shown."); return; } callback = RuntimeHelper.ToMainThread(callback); // Create a new image picker. var picker = InteropObjectFactory <UIImagePickerController> .Create( () => new UIImagePickerController(), c => c.ToPointer()); // Source type must be photo library. picker.SourceType = UIImagePickerController.SourceTypeEnum.PhotoLibrary; // Allow image & video. NSMutableArray <NSString> mediaTypes = new NSMutableArray <NSString>(); mediaTypes.AddObject(UTTypeConstants.kUTTypeImage); mediaTypes.AddObject(UTTypeConstants.kUTTypeMovie); picker.MediaTypes = mediaTypes; // Create a delegate for the TBM VC. picker.Delegate = new InternalUIImagePickerControllerDelegate(InternalUIImagePickerControllerDelegate.PickerOperation.PickGallery) { CloseAndResetMatchmakerVC = () => { if (mPickerController != null) { mPickerController.DismissViewController(true, null); mPickerController = null; } }, CompleteCallback = (error, result) => { callback(error, result != null ? new MediaResult[] { result } : null); } }; // Store the VC ref. mPickerController = picker; // Now show the VC. using (var unityVC = UIViewController.UnityGetGLViewController()) unityVC.PresentViewController(picker, true, null); }
private static void InternalChooseBestHostingPlayerCallback(IntPtr player, IntPtr secondaryCallback) { if (PInvokeUtil.IsNull(secondaryCallback)) { return; } var gkPlayer = InteropObjectFactory <GKPlayer> .FromPointer(player, p => new GKPlayer(p)); PInvokeCallbackUtil.PerformInternalCallback( "GKMatch#InternalChooseBestHostingPlayerCallback", PInvokeCallbackUtil.Type.Temporary, gkPlayer, secondaryCallback); }
private static void InternalDidFailWithErrorCallback(IntPtr delegatePtr, IntPtr viewController, IntPtr error) { var forwarder = FromPointer(delegatePtr); if (forwarder != null && forwarder.Listener != null) { var vc = InteropObjectFactory <GKTurnBasedMatchmakerViewController> .FromPointer( viewController, ptr => new GKTurnBasedMatchmakerViewController(ptr)); var e = InteropObjectFactory <NSError> .FromPointer(error, ptr => new NSError(ptr)); forwarder.InvokeOnListener(l => l.TurnBasedMatchmakerViewControllerDidFailWithError(vc, e)); } }
private static bool InternalPresentationControllerShouldDismissCallback(IntPtr delegatePtr, IntPtr presentationControllerPtr) { var forwarder = FromPointer(delegatePtr); if (forwarder != null && forwarder.Listener != null) { // PresentationController. var controller = InteropObjectFactory <UIPresentationController> .FromPointer(presentationControllerPtr, ptr => new UIPresentationController(ptr)); // Invoke consumer delegates. return(forwarder.InvokeOnListener(l => l.PresentationControllerShouldDismiss(controller))); } return(true); // view should be dismissible by default }
public static GKMatchRequest ToGKMatchRequest(this MatchRequest matchRequest) { var gkRequest = InteropObjectFactory <GKMatchRequest> .Create( () => new GKMatchRequest(), req => req.ToPointer()); gkRequest.MinPlayers = matchRequest.MinPlayers; gkRequest.MaxPlayers = matchRequest.MaxPlayers; /* We're not using DefaultNumberOfPlayers. */ /* We're not using InviteMessage. */ gkRequest.PlayerGroup = matchRequest.Variant; // GameKit playerGroup is equivalent to variant gkRequest.PlayerAttributes = ~matchRequest.ExclusiveBitmask; // cross-platform API uses "1" bits to exclude, while GameKit uses "0" bits. return(gkRequest); }
private static void InternalMatchDidReceiveDataCallback(IntPtr delegatePtr, IntPtr match, IntPtr data, IntPtr remotePlayer) { var forwarder = FromPointer(delegatePtr); if (forwarder != null && forwarder.Listener != null) { var gkMatch = InteropObjectFactory <GKMatch> .FromPointer(match, ptr => new GKMatch(ptr)); var nsData = InteropObjectFactory <NSData> .FromPointer(data, ptr => new NSData(ptr)); var gkRemotePlayer = InteropObjectFactory <GKPlayer> .FromPointer(remotePlayer, ptr => new GKPlayer(ptr)); forwarder.InvokeOnListener(l => l.MatchDidReceiveData(gkMatch, nsData, gkRemotePlayer)); } }
private static void PlayerBoolCallback( /* InteropGKPlayer */ IntPtr playerPtr, bool boolArg, IntPtr secondaryCallback) { if (PInvokeUtil.IsNull(secondaryCallback)) { return; } var player = InteropObjectFactory <GKPlayer> .FromPointer(playerPtr, p => new GKPlayer(p)); PInvokeCallbackUtil.PerformInternalCallback( "GKMatchmaker#PlayerBoolCallback", PInvokeCallbackUtil.Type.Temporary, player, boolArg, secondaryCallback); }