예제 #1
0
    private void OnDisconnect(int recHostId, int cnnId, int channelId)
    {
        MatchMakerObject mmo = new MatchMakerObject();

        mmo.connectionId = cnnId;
        MatchMaker.GetInstance().RemoveMatchMakerObject(mmo);
        if (pairedConnectionIds.TryGetValue(cnnId, out int oppCnnId)) // will be true if they were in game during disconnect
        {
            // notify opponent's client that opponent disconnected
            int         oppHostId = connectionIdToHostId[oppCnnId];
            Net_EndGame msg       = new Net_EndGame();
            msg.endGameCode = EndGameCode.Disconnect;
            SendClient(oppHostId, oppCnnId, channelId, msg);

            // remove paired connection
            pairedConnectionIds.Remove(oppCnnId);
        }

        if (pairedConnectionIds.ContainsKey(cnnId))
        {
            pairedConnectionIds.Remove(cnnId);
        }

        connectionIdToHostId.Remove(cnnId);
    }
예제 #2
0
 public void RemoveMatchMakerObject(MatchMakerObject mmo)
 {
     foreach (MatchMakerObject current in matchMakerPool)
     {
         if (current.connectionId == mmo.connectionId)
         {
             matchMakerPool.Remove(current);
             return;
         }
     }
 }
예제 #3
0
 private void EnterMMPool(int cnnId, int channelId, int recHostId, Net_EnterMMPool msg)
 {
     if (msg.inPool)
     {
         MatchMakerObject mmo = new MatchMakerObject();
         mmo.channelId    = channelId;
         mmo.connectionId = cnnId;
         mmo.hostId       = recHostId;
         MatchMaker.GetInstance().QueueMatchMakerObject(mmo);
     }
     else
     {
         MatchMakerObject mmo = new MatchMakerObject();
         mmo.channelId    = channelId;
         mmo.connectionId = cnnId;
         mmo.hostId       = recHostId;
         MatchMaker.GetInstance().RemoveMatchMakerObject(mmo);
     }
 }
예제 #4
0
 private IEnumerable mmCycle()
 {
     while (true)
     {
         // perform mm cycle
         for (int i = 0; i + 1 < matchMakerPool.Count; i += 2)
         {
             MatchMakerObject mmo1 = matchMakerPool.First.Value;
             MatchMakerObject mmo2 = matchMakerPool.First.Next.Value;
             matchMakerPool.Remove(mmo1);
             matchMakerPool.Remove(mmo2);
             PairUsers(mmo1, mmo2);
         }
         // for all users left increment their cycles waited
         foreach (MatchMakerObject mmo in matchMakerPool)
         {
             mmo.cyclesWaited++;
         }
         yield return(1f); // only do one cycle per second to save cpu
     }
 }
예제 #5
0
    public void PairUsers(MatchMakerObject mmo1, MatchMakerObject mmo2)
    {
        // add users to map and let them know they've been paired up
        pairedConnectionIds.Add(mmo1.connectionId, mmo2.connectionId);
        pairedConnectionIds.Add(mmo2.connectionId, mmo1.connectionId);
        if (!connectionIdToHostId.ContainsKey(mmo1.connectionId))
        {
            connectionIdToHostId.Add(mmo1.connectionId, mmo1.hostId);
        }
        if (!connectionIdToHostId.ContainsKey(mmo2.connectionId))
        {
            connectionIdToHostId.Add(mmo2.connectionId, mmo2.hostId);
        }

        Net_NotifyClientOfMMPairing mmNotification = new Net_NotifyClientOfMMPairing();

        // designate a player as player 1
        mmNotification.isPlayer1 = true;
        SendClient(mmo1.hostId, mmo1.connectionId, mmo1.channelId, mmNotification);
        mmNotification.isPlayer1 = false;
        SendClient(mmo2.hostId, mmo2.connectionId, mmo2.channelId, mmNotification);
    }
예제 #6
0
 public void QueueMatchMakerObject(MatchMakerObject mmo)
 {
     matchMakerPool.AddLast(mmo);
 }
예제 #7
0
 private void PairUsers(MatchMakerObject mmo1, MatchMakerObject mmo2)
 {
     Server.Instance.PairUsers(mmo1, mmo2);
 }