private void HandleHelloPacket(ref InputMemoryBitStream input, EndPoint _inEndpoint) { if (mEndpointToPlayerIdDic.ContainsKey(_inEndpoint)) { return; } if (mPlayerCount >= 4) { OutputMemoryBitStream output = new OutputMemoryBitStream(); output.Write(kNotJoinableCC); SendPacket(output, _inEndpoint); return; } if (mIsMasterPeer) { string name = " "; input.Read(ref name); // Nếu máy nhận được là 1 master peer=> cấp phát player id cho máy gửi để nó có thêm tham gia trò chơi OutputMemoryBitStream output = new OutputMemoryBitStream(); output.Write(kWelcomeCC); mHighestPlayerId++; output.Write(mHighestPlayerId); // ghi thông tin của master peer(người chơi chính = chủ phòng chơi) và các player khác đã tham gia output.Write(mPlayerId); output.Write(mPlayerCount); // ghi player id + endpoint (ip address) của tất cả người chơi đã tham gia cho người chơi mới foreach (var pair in mPlayerIdToEndpointDic) { output.Write(pair.Key); WriteIPv4(ref output, pair.Value); } // gừi tên của tất cá người chơi cho người chơi mới foreach (var pair in mPlayerIdToName) { output.Write(pair.Key); output.Write(pair.Value); } SendPacket(output, _inEndpoint); // lưu thông tin người chơi mới. mPlayerCount++; mPlayerIdToName.Add(mHighestPlayerId, name); mPlayerIdToEndpointDic.Add(mHighestPlayerId, _inEndpoint); mEndpointToPlayerIdDic.Add(_inEndpoint, mHighestPlayerId); } else { // nếu người nhận được không phải là master peer // tiến hành gửi lại địa chỉ của master peer thực sự cho người gửi OutputMemoryBitStream output = new OutputMemoryBitStream(); output.Write(kNotMasterPeer); WriteIPv4(ref output); SendPacket(output, _inEndpoint); } }
public void Write(ref OutputMemoryBitStream output) { output.Write(mPlayerId); output.Write(mRandomValue); output.Write(mCrc); mCommandList.Write(ref output); }
public bool TryStartGame() { if (mIsMasterPeer && mState == NetworkState.Lobby) { OutputMemoryBitStream output = new OutputMemoryBitStream(); output.Write(kStartCC); int seed = CustomRandom.mInstance.GetValue_v2(); CustomRandom.mInstance.Seed(seed); output.Write(seed); foreach (var pair in mPlayerIdToEndpointDic) { SendPacket(output, pair.Value); } mTimeToStart = mMaxTimeToStart; mState = NetworkState.Starting; return(true); } else { return(false); } }
private void SendHelloPacket() { OutputMemoryBitStream output = new OutputMemoryBitStream(); output.Write(kHellocCC); output.Write(mName); SendPacket(output, mMasterPeerEndP); }
private void WriteIPv4(ref OutputMemoryBitStream output, EndPoint _inEndpoint) { int port = ((IPEndPoint)_inEndpoint).Port; string ip = ((IPEndPoint)_inEndpoint).Address.ToString(); output.Write(ip); output.Write(port); }
private void WriteIPv4(ref OutputMemoryBitStream output) { int port = ((IPEndPoint)mMasterPeerEndP).Port; string ip = ((IPEndPoint)mMasterPeerEndP).Address.ToString(); output.Write(ip); output.Write(port); }
public virtual void Write(ref OutputMemoryBitStream output) { int type = (int)mCommandType; output.Write(type); output.Write(mNetworkID); output.Write(mPlayerID); }
private void Send_blocking(OutputMemoryBitStream output, EndPoint to) { Thread thread = new Thread(() => { this.Send_thread(output, to); }); thread.IsBackground = true; thread.Start(); }
public void Write(ref OutputMemoryBitStream output) { int cout = GetCount(); output.Write(cout); foreach (Command command in mCommands) { command.Write(ref output); } }
private void SendPacket(OutputMemoryBitStream output, EndPoint to) { if (mIsBlockingMode) { Send_blocking(output, to); } else { Send_nonblocking(output, to); } }
public void SendDisconnectPacket() { OutputMemoryBitStream output = new OutputMemoryBitStream(); output.Write(kOutCC); output.Write(mTurnNumber + 2); output.Write(mPlayerId); foreach (var pair in mPlayerIdToEndpointDic) { SendPacket(output, pair.Value); } }
private void UpdateSendTurnPacket() { mSubTurnNumber++; if (mSubTurnNumber == kSubTurnPerTurn) { TurnData data = new TurnData(mPlayerId, CustomRandom.mInstance.GetValue_v2(), InputManager.mIntance.GetCommandList(), ComputeCRC()); OutputMemoryBitStream output = new OutputMemoryBitStream(); output.Write(kTurnCC); output.Write(mTurnNumber + 2); output.Write(mPlayerId); data.Write(ref output); foreach (var pair in mPlayerIdToEndpointDic) { SendPacket(output, pair.Value); } if (mTurnData.ContainsKey(mTurnNumber + 2)) { try { mTurnData[mTurnNumber + 2].Add(mPlayerId, data); } catch (ArgumentException ex) { mTurnData[mTurnNumber + 2][mPlayerId] = data; } } else { mTurnData.Add(mTurnNumber + 2, new Dictionary <int, TurnData>()); mTurnData[mTurnNumber + 2].Add(mPlayerId, data); } //Debug.Log("send " + (mTurnNumber + 2) + " " + mPlayerId); //Debug.Log((mTurnNumber + 2) + " " + data.GetCommandList().GetCount()); InputManager.mIntance.NewCommandList(); if (mTurnNumber >= 0) { TryAdvanceTurn(); } else { mTurnNumber++; mSubTurnNumber = 0; } } }
/// <summary> /// tính crc với mục đích kiểm tra sự đồng bộ hóa /// </summary> private UInt32 ComputeCRC() { OutputMemoryBitStream output = new OutputMemoryBitStream(); foreach (var pair in mNetworkIdToGameobjectDic) { NetworkObject mObject = pair.Value.GetComponent <NetworkObject>(); if (mObject != null) { mObject.WriteForCrc(ref output); } } UInt32 re = Crc32.Compute(output.GetBuffer(), 0, output.GetByteLength()); return(re); }
private void Send_nonblocking(OutputMemoryBitStream output, EndPoint to) { if (mSocket == null) { return; } if (Disconnected) { return; } try { mSocket.BeginSendTo(output.GetBuffer(), 0, output.GetByteLength(), SocketFlags.None, to, new AsyncCallback(sendto_callback), null); } catch (ObjectDisposedException ex) { Debug.Log("socket has been closed"); return; } }
/// <summary> /// Trường hợp xảy ra khi được chấp nhận kết nối từ master peer /// </summary> /// <param name="input"></param> private void HandleWelcomePacket(ref InputMemoryBitStream input) { // đọc player id được cấp phát int playerid = 0, masterPeerPlayerid = 0; input.Read(ref playerid); UpdateHighestPlayerId(playerid); mPlayerId = playerid; mPlayerIdToName.Add(mPlayerId, mName); // bây giờ đọc player id của master peer. input.Read(ref masterPeerPlayerid); UpdateHighestPlayerId(masterPeerPlayerid); mPlayerIdToEndpointDic.Add(masterPeerPlayerid, mMasterPeerEndP); mEndpointToPlayerIdDic.Add(mMasterPeerEndP, masterPeerPlayerid); // tiếp theo đọc thông tin của tất cả người chơi còn lại. int playerCount = 0; input.Read(ref playerCount); mPlayerCount = playerCount; EndPoint Endp = null; for (int i = 0; i < playerCount - 1; i++) { input.Read(ref playerid); UpdateHighestPlayerId(playerid); ReadIPv4(ref input, ref Endp); mPlayerIdToEndpointDic.Add(playerid, Endp); mEndpointToPlayerIdDic.Add(Endp, playerid); } // Đọc tên của tất cả người chơi đã tham gia trò chơi string name = " "; for (int i = 0; i < playerCount; i++) { input.Read(ref playerid); input.Read(ref name); mPlayerIdToName.Add(playerid, name); } mPlayerCount++; // Gửi 1 gói thông báo cho các player khác là tôi đã tham gia trò chơi OutputMemoryBitStream output = new OutputMemoryBitStream(); output.Write(kIntroCC); output.Write(mPlayerId); output.Write(mName); foreach (var pair in mPlayerIdToEndpointDic) { SendPacket(output, pair.Value); } mPeerToPeerManager.SetInLobby(true); // đã vào phòng đợi để sẵn sàng tham gia trò chơi mState = NetworkState.Lobby; }
private void Send_thread(OutputMemoryBitStream output, EndPoint to) { byte[] newData = new byte[output.GetByteLength()]; Array.Copy(output.GetBuffer(), newData, output.GetByteLength()); mSocket.SendTo(newData, to); }
public override void Write(ref OutputMemoryBitStream output) { base.Write(ref output); output.Write(mTargetNetworkID); }
/// <summary> /// ghi tất cả các thuộc tính cần kiểm tra tính đồng bộ /// </summary> /// <param name="output"></param> public virtual void WriteForCrc(ref OutputMemoryBitStream output) { output.Write(mPlayerID); output.Write(mNetworkID); }