Assignment for RMIT Mixed Reality in 2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

145 lines
3.8 KiB

namespace Oculus.Platform.Samples.VrHoops
{
using UnityEngine;
using System.Collections.Generic;
using Oculus.Platform;
using Oculus.Platform.Models;
// This class coordinates with the Oculus Platform Matchmaking Service to
// establish a Quickmatch session with one or two other players.
public class MatchmakingManager
{
// the name we setup on the Developer Dashboard for the quickmatch pool
private const string NORMAL_POOL = "NORMAL_QUICKMATCH";
// the ID of the Room the matchmaking service sent to join
private ulong m_matchRoom;
// the list of players that join the match room.
// it may not be all the match players since some might disconnect
// before joining the room, but then again they might disconnect
// midway through a match as well.
private readonly Dictionary<ulong, User> m_remotePlayers;
public MatchmakingManager()
{
m_remotePlayers = new Dictionary<ulong, User>();
Matchmaking.SetMatchFoundNotificationCallback(MatchFoundCallback);
Rooms.SetUpdateNotificationCallback(MatchmakingRoomUpdateCallback);
}
public delegate void OnEnqueueResult(bool successful);
public delegate Player OnMatchPlayerAdded(int slot, User user);
private OnEnqueueResult m_enqueueCallback;
private OnMatchPlayerAdded m_playerCallback;
public OnEnqueueResult EnqueueResultCallback
{
private get { return m_enqueueCallback; }
set { m_enqueueCallback = value; }
}
public OnMatchPlayerAdded MatchPlayerAddedCallback
{
private get { return m_playerCallback; }
set { m_playerCallback = value; }
}
public void QueueForMatch()
{
Matchmaking.Enqueue (NORMAL_POOL).OnComplete(MatchmakingEnqueueCallback);
}
void MatchmakingEnqueueCallback(Message msg)
{
if (msg.IsError)
{
Debug.Log(msg.GetError().Message);
EnqueueResultCallback(false);
return;
}
}
void MatchFoundCallback(Message<Room> msg)
{
m_matchRoom = msg.Data.ID;
Matchmaking.JoinRoom(msg.Data.ID, true).OnComplete(MatchmakingJoinRoomCallback);
}
void MatchmakingJoinRoomCallback(Message<Room> msg)
{
if (msg.IsError)
{
Debug.Log (msg.GetError().Message);
EnqueueResultCallback(false);
return;
}
Debug.Log ("Match found and room joined " + m_matchRoom);
EnqueueResultCallback(true);
// this sample doesn't try to coordinate that all the players see consistent
// positioning to assigned courts, but that would be a great next feature to add
int slot = 0;
if (msg.Data.UsersOptional != null)
{
foreach (var user in msg.Data.UsersOptional)
{
var player = MatchPlayerAddedCallback(slot++, user);
if (PlatformManager.MyID != user.ID)
{
m_remotePlayers[user.ID] = user;
PlatformManager.P2P.AddRemotePlayer (player as RemotePlayer);
}
}
}
}
void MatchmakingRoomUpdateCallback(Message<Room> msg)
{
if (msg.IsError)
{
PlatformManager.TerminateWithError(msg);
return;
}
// check to make sure the room is valid as there are a few odd timing issues (for
// example when leaving a room) that can trigger an uninteresting update
if (msg.Data.ID == m_matchRoom)
{
if (msg.Data.UsersOptional != null)
{
foreach (User user in msg.Data.UsersOptional)
{
if (PlatformManager.MyID != user.ID && !m_remotePlayers.ContainsKey(user.ID))
{
m_remotePlayers[user.ID] = user;
var player = MatchPlayerAddedCallback(m_remotePlayers.Count, user);
PlatformManager.P2P.AddRemotePlayer(player as RemotePlayer);
}
}
}
}
}
public void EndMatch()
{
if (m_matchRoom != 0)
{
Rooms.Leave (m_matchRoom);
m_remotePlayers.Clear ();
PlatformManager.P2P.DisconnectAll ();
m_matchRoom = 0;
}
}
public void LeaveQueue()
{
Matchmaking.Cancel();
EndMatch();
}
}
}