void SendRegisterData(Player player)
        {
            Log("SendRegisterData on " + player.IPInfo);
            var writer  = m_Server.m_Writer;
            var players = m_Server.m_Players;

            writer.Reset();
            ReaderGameHelper.AddCommand(writer, ServerCommands.Register);
            var playerID = player.ID;

            //players.AddPlayer(player);
            writer.Put(playerID);
            writer.Put(player.PlayerName);
            writer.Put(players.Count - 1);
            for (int i = players.Count - 1; i >= 0; i--)
            {
                var otherPlayer = players[i];
                if (!otherPlayer.IsConnected)
                {
                    continue;
                }
                var id = otherPlayer.ID;
                if (id == playerID)
                {
                    continue;
                }
                writer.Put(id);
                //writer.Put(otherPlayer.PlayerName);
            }
            player.Peer.Send(writer, DeliveryMethod.ReliableUnordered);
        }
    public void OnNetworkReceive(NetPeer peer, NetPacketReader reader, DeliveryMethod deliveryMethod)
    {
        try
        {
            //if (m_IsLog) Log(string.Format("ReceiveData ID={0} DataLen={1}", peer.EndPoint, reader.AvailableBytes));
            //if (m_IsLog) Log("OnNetworkReceive " + peer.EndPoint + " method=" + deliveryMethod);

            var command = ReaderGameHelper.GetCommand(reader);
            switch (command)
            {
            case ServerCommands.UpdateWorld: UpdateWorld(peer, reader); break;

            case ServerCommands.Verify: m_ProcessConnect.Verification(reader); break;

            case ServerCommands.Register: m_ProcessConnect.Register(reader); break;
            }
        }
        catch (Exception e)
        {
            if (m_IsLog)
            {
                Log("OnNetworkReceive bad data from " + (peer == null ? "Empty" : peer.EndPoint.ToString()) + " error=" + e, true);
            }
            return;
        }
    }
        void SendRegisterAccept(Player player)
        {
            Log("SendRegisterAccept on " + player.IPInfo);
            var writer = m_Client.m_Writer;

            writer.Reset();
            ReaderGameHelper.AddClientState(writer, player.State);
            player.Peer.Send(writer, DeliveryMethod.ReliableUnordered);
        }
        void SendVerificationData(Player player)
        {
            Log("SendVerificationData on " + player.IPInfo);
            var writer = m_Server.m_Writer;

            writer.Reset();
            ReaderGameHelper.AddCommand(writer, ServerCommands.Verify);
            //writer.Put(player.ID);
            player.Peer.Send(writer, DeliveryMethod.ReliableUnordered);
        }
        void SendVerifyData(Player player)
        {
            Log("SendVerifyData on " + player.IPInfo);
            var writer = m_Client.m_Writer;

            writer.Reset();
            ReaderGameHelper.AddClientState(writer, player.State);
            writer.Put(player.PlayerName);
            writer.Put((byte)player.TypeUnit);
            player.Peer.Send(writer, DeliveryMethod.ReliableUnordered);
        }
Beispiel #6
0
    protected void PrepareSend(NetDataWriter writer)
    {
        ReaderGameHelper.AddWorldUpdate(writer, TypeWorldUpdate.Player);
        ReaderGameHelper.AddClientState(writer, State);
        writer.Put(ID);
        writer.Put(PlayerName);
        writer.Put((byte)TypeUnit);
        int index = m_DataSend.Last + 1;

        writer.Put(index);
        m_DataSend.Add(index);
    }
    void UpdateWorld(NetPeer peer, NetPacketReader reader)
    {
        var type = ReaderGameHelper.GetWorldUpdate(reader);

        switch (type)
        {
        case TypeWorldUpdate.SyncPlayersInfo: SyncPlayersInfo(reader); break;

        case TypeWorldUpdate.Player: UpdatePlayer(reader); break;

        case TypeWorldUpdate.Hits: SetHitsData(reader); break;
        }
    }
    bool GetHitsData()
    {
        if (!NetworkHitsController.Can)
        {
            return(false);
        }
        m_Writer.Reset();
        ReaderGameHelper.AddCommand(m_Writer, ServerCommands.UpdateWorld);
        ReaderGameHelper.AddWorldUpdate(m_Writer, TypeWorldUpdate.Hits);
        bool res = NetworkHitsController.I.GetData(m_Writer);

        return(res);
    }
    void SendSyncPlayers()
    {
        //Log("SendSyncPlayers");
        m_Writer.Reset();
        ReaderGameHelper.AddCommand(m_Writer, ServerCommands.UpdateWorld);
        ReaderGameHelper.AddWorldUpdate(m_Writer, TypeWorldUpdate.SyncPlayersInfo);
        int count = m_Players.Count;

        m_Writer.Put(count);
        for (int i = 0; i < count; i++)
        {
            //Log("Sync " + m_Players[i]);
            m_Writer.Put(m_Players[i].ID);
        }
        SendToAllWithState(m_Writer, DeliveryMethod.Unreliable, MiscHelper.MASK_REGISTRY_OR_CONNECTED);
    }
    public void OnNetworkReceive(NetPeer peer, NetPacketReader reader, DeliveryMethod deliveryMethod)
    {
        try
        {
            //if (m_IsLog) Log("OnNetworkReceive " + peer.EndPoint + " method=" + deliveryMethod);
            var player = m_Players.GetPlayerByPeer(peer);
            if (player == null)
            {
                return;
            }
            var state = ReaderGameHelper.GetClientState(reader);
            //var prevState = player.State;

            //TODO: добавить действия которые присылает клиент(как ответы на команды от сервера)
            if (state == ClientState.Verification)
            {
                player.PlayerName = reader.GetString();
                player.TypeUnit   = (TypeUnit)reader.GetByte();
                m_Players.ResolveDublicateName(player);
            }

            if (state != ClientState.Connected)
            {
                Log("OnNetworkReceive " + player + " setState=" + state + " frame=" + Time.frameCount);
            }

            player.State = state;
            //if (m_IsLog) Log("OnNetworkReceive " + player);
            if (player.IsConnected)
            {
                player.AddData(reader);
            }
            //if (MiscHelper.CheckIncludeInMask(state, MiscHelper.MASK_REGISTRY_OR_CONNECTED))
            //{
            //    player.AddData(reader);
            //}
        }
        catch (System.Exception e)
        {
            if (m_IsLog)
            {
                Log("OnNetworkReceive bad data from " + (peer == null ? "Empty" : peer.EndPoint.ToString()) + " error=" + e, true);
            }
            return;
        }
    }
    private void FixedUpdate()
    {
        if (Tick())
        {
            return;
        }

        //обработка событий
        m_Server.PollEvents();

        if (!IsStarted)
        {
            return;
        }

        //синхронизируем игроков на клиентах
        SendSyncPlayers();

        //данные игрока
        for (int i = m_Players.Count - 1; i >= 0; i--)
        {
            var pl = m_Players[i];
            if (!pl.IsConnected)
            {
                continue;
            }
            m_Writer.Reset();
            ReaderGameHelper.AddCommand(m_Writer, ServerCommands.UpdateWorld);
            if (!pl.GetData(m_Writer))
            {
                continue;
            }
            //if (m_IsLog) Log(string.Format("SendData ID={0} DataLen={1}", pl.ID, m_Writer.Length));
            SendToAllWithState(m_Writer, DeliveryMethod.Unreliable, MiscHelper.MASK_REGISTRY_OR_CONNECTED);
        }
        //данные о зарегистрированных попаданиях
        if (GetHitsData())
        {
            SendToAllWithState(m_Writer, DeliveryMethod.Unreliable, MiscHelper.MASK_REGISTRY_OR_CONNECTED);
        }

        //if (m_ClientPlayer != null) m_ClientPlayer.Update(m_Writer);
    }
    void UpdatePlayer(NetPacketReader reader)
    {
        //if (m_IsLog) Log(string.Format("UpdatePlayer ID={0} StartInd={1} DataLen={2}", peer.EndPoint, reader.Position, reader.AvailableBytes));
        if (!MiscHelper.CheckIncludeInMask(m_ClientPlayer.State, MiscHelper.MASK_REGISTRY_OR_CONNECTED))
        {
            return;
        }
        var state = ReaderGameHelper.GetClientState(reader);
        var id    = GetIDPlayer(reader);

        if (m_IsLog)
        {
            PeriodLog(string.Format("UpdatePlayer={0} state={1}", id, state));
        }

        bool isClient = m_ClientPlayer.ID == id;

        if (isClient && state == ClientState.Disconnected)
        {
            //CallConnectEvents(new Args() { Event = ProcessConnection.Disconnected, Reason = "Server kicked out" });
            return;
        }

        if (isClient && m_ClientPlayer.State != ClientState.Connected)
        {
            return;
        }
        var playerName = reader.GetString();
        var player     = m_Players.GetPlayer(id);
        var typeUnit   = (TypeUnit)reader.GetByte();

        if (player == null)
        {
            player = AddNewPlayer(id);
        }
        player.TypeUnit   = typeUnit;
        player.PlayerName = playerName;
        player.State      = state;
        player.AddData(reader);
    }
Beispiel #13
0
    public override void Update(NetDataWriter writer)
    {
        if (m_State != ClientState.Connected)
        {
            return;
        }
        ReaderGameHelper.AddClientState(writer, m_State);
        int index = m_DataSend.Last + 1;

        m_DataSend.Add(index);
        writer.Put(index);
        var data = m_UnitControl.GetData();

        if (writer.PutInWriter(data))
        {
            //шоб наверняка) засрем канал))
            int count = MiscHelper.CountPackets(DeliveryMethod.Unreliable);
            for (int i = 0; i < count; i++)
            {
                m_Peer.Send(writer, DeliveryMethod.Unreliable);
            }
        }
    }