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);
        }
    }
Ejemplo n.º 2
0
 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);
    }
Ejemplo n.º 7
0
    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);
 }