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); }
public void RemoveMatchMakerObject(MatchMakerObject mmo) { foreach (MatchMakerObject current in matchMakerPool) { if (current.connectionId == mmo.connectionId) { matchMakerPool.Remove(current); return; } } }
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); } }
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 } }
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); }
public void QueueMatchMakerObject(MatchMakerObject mmo) { matchMakerPool.AddLast(mmo); }
private void PairUsers(MatchMakerObject mmo1, MatchMakerObject mmo2) { Server.Instance.PairUsers(mmo1, mmo2); }