protected override void Disconnect(Event netEvent)
        {
            Debug.Log($"Client disconnected - ID: {netEvent.Peer.ID}, IP: {netEvent.Peer.IP}  Reason: {netEvent.Data}");
            Peer            peer = netEvent.Peer;
            NetworkedObject nobj = null;

            if (m_peers.TryGetValue(peer.ID, out nobj))
            {
                uint id = peer.ID;

                m_peers.Remove(peer.ID);

                Destroy(nobj.gameObject);

                // notify everyone else
                if (m_peers.Count > 0)
                {
                    m_buffer.AddEntityHeader(peer, OpCodes.Destroy);
                    var packet  = m_buffer.GetPacketFromBuffer(PacketFlags.Reliable);
                    var command = GameCommandPool.GetGameCommand();
                    command.Type    = CommandType.BroadcastAll;
                    command.Packet  = packet;
                    command.Channel = 0;
                    m_commandQueue.Enqueue(command);
                }
            }
        }
Beispiel #2
0
        private void HandlePacket(ref Event netEvent)
        {
            _packetsReceived++;
            var readBuffer = new byte[64];
            var readStream = new MemoryStream(readBuffer);
            var reader     = new BinaryReader(readStream);

            readStream.Position = 0;
            netEvent.Packet.CopyTo(readBuffer);
            var packetId = (NetworkEvents)reader.ReadByte();

            DebugLog($"HandlePacket received: {_packetsReceived}");

            if (packetId == NetworkEvents.UpdatePositionRequest)
            {
                var playerId = reader.ReadUInt32();
                var x        = reader.ReadSingle();
                var y        = reader.ReadSingle();
                var z        = reader.ReadSingle();
                var data     = new TransformData
                {
                    EventId   = (byte)packetId,
                    PlayerId  = playerId,
                    xPos      = x,
                    yPos      = y,
                    zRotation = z
                };
                BroadcastPositionUpdateEvent(data);
            }
        }
        private void HandleIncomingEvent(Event @event)
        {
#if LOG_NETWORK
            m_Logger.LogDebug("Processing network event: " + @event.Type);
#endif
            INetworkPeer networkPeer = null;
            if (@event.Peer.IsSet)
            {
                networkPeer = GetPeerByNetworkId(@event.Peer.ID, false);
            }

            switch (@event.Type)
            {
            case EventType.Connect:
                RegisterPeer(new NetworkPeer(@event.Peer));
                break;

            case EventType.Timeout:
            case EventType.Disconnect:
                UnregisterPeer(networkPeer);
                break;
            }

            ENetNetworkEvent enetEvent = new ENetNetworkEvent(@event, networkPeer);
            m_EventBus.Emit(this, enetEvent);

            if (enetEvent.IsCancelled)
            {
                return;
            }

            m_NetworkEventProcessor.ProcessNetworkEvent(@event, networkPeer);
        }
Beispiel #4
0
        private void HandleDisconnectEvent(Event netEvent)
        {
#if UNITY_EDITOR
            Debug.Log("Client disconnected from server");
#endif
            HandleDisconnectClient(netEvent);
        }
Beispiel #5
0
        private void HandleTimeoutEvent(Event netEvent)
        {
#if UNITY_EDITOR
            Debug.Log("Client connection timeout");
#endif
            HandleDisconnectClient(netEvent);
        }
Beispiel #6
0
        /// <summary>
        /// ENet Clients Callbacks
        /// </summary>
        void switch_callbacks(ENet.Event netEvent)
        {
            switch (netEvent.Type)
            {
            case ENet.EventType.None:
                break;

            case ENet.EventType.Connect:
                Debug.Log("Client connected to server");
                ExecuteTrigger("Connect", netEvent);

                break;

            case ENet.EventType.Disconnect:
                Debug.Log("Client disconnected from server");
                ExecuteTrigger("Disconnect", netEvent);

                break;

            case ENet.EventType.Timeout:
                Debug.Log("Client connection timeout");
                ExecuteTrigger("Timeout", netEvent);

                break;

            case ENet.EventType.Receive:
                Debug.Log("Packet received from server - Channel ID: " + netEvent.ChannelID + ", Data length: " + netEvent.Packet.Length);

                ExecuteTriggerBytes(netEvent);
                netEvent.Packet.Dispose();
                break;
            }
        }
        private bool Service(ref ENetEvent @event)
        {
            switch (@event.Type)
            {
            case ENetEventType.None:
                return(false);

            case ENetEventType.Connect:
                HandleConnect();
                return(true);

            case ENetEventType.Disconnect:
                HandleDisconnect();
                return(true);

            case ENetEventType.Timeout:
                HandleTimeout();
                return(true);

            case ENetEventType.Receive:
                Debug.Log("Packet received from server - Channel ID: " + @event.ChannelID + ", Data length: " + @event.Packet.Length);
                @event.Packet.Dispose();
                return(true);
            }

            return(false);
        }
Beispiel #8
0
        /// <summary>
        /// Add new Peer
        /// </summary>
        /// <returns>index of Peer</returns>
        public int AddPeer(ENet.Event net_event)
        {
            clients.Add(net_event.Peer);
            int index = clients.IndexOf(net_event.Peer);

            return(index);
        }
Beispiel #9
0
 protected override void Disconnect(Event netEvent)
 {
     Debug.Log("Disconnect detected!");
     if (Application.isEditor == false)
     {
         Application.Quit();
     }
 }
Beispiel #10
0
        private void HandleConnectEvent(Event netEvent)
        {
#if UNITY_EDITOR
            Debug.Log("Client connected to server - ID: " + _peerServer.ID);
#endif
            var packetReceivedEventArgs = new PacketReceivedEventArgs();
            OnClientConnect(packetReceivedEventArgs);
        }
    private void HandleEnetMessageReceived(Event netEvent, SendMode mode)
    {
        MessageBuffer message = MessageBuffer.Create(netEvent.Packet.Length);

        netEvent.Packet.CopyTo(message.Buffer);
        message.Offset = 0;
        message.Count  = netEvent.Packet.Length;
        HandleMessageReceived(message, SendMode.Reliable);
    }
Beispiel #12
0
        /// <summary>
        /// Remove new Peer
        /// </summary>
        /// <returns>index of Peer</returns>
        public int RemovePeer(ENet.Event net_event)
        {
            //Debug.LogError("Client delete");

            int index = clients.IndexOf(net_event.Peer);

            clients.Remove(net_event.Peer);
            return(index);
        }
Beispiel #13
0
 public int CheckEvents(out Event @event)
 {
     CheckCreated();
     Native.ENetEvent nativeEvent;
     var ret = Native.enet_host_check_events(_host, out nativeEvent);
     if (ret <= 0)
     {
         @event = new Event();
         return ret;
     }
     @event = new Event(nativeEvent);
     return ret;
 }
Beispiel #14
0
        private void HandleReceiveEvent(ref Event netEvent)
        {
#if UNITY_EDITOR
            Debug.Log("Packet received from server - Channel ID: " + netEvent.ChannelID + ", Data length: " +
                      netEvent.Packet.Length);
#endif
            byte[] packetBytes = new byte[netEvent.Packet.Length];
            netEvent.Packet.CopyTo(packetBytes);
            var packetReceivedEventArgs = new PacketReceivedEventArgs(packetBytes);
            OnPacketReceived(packetReceivedEventArgs);

            netEvent.Packet.Dispose();
        }
    private void ParsePacket(ref ENet.Event netEvent)
    {
        Protocol protocol   = new Protocol();
        var      readBuffer = new byte[1024];

        netEvent.Packet.CopyTo(readBuffer);
        protocol.Deserialize(readBuffer, out PacketInfo packetInfo);

        Debug.Log("ParsePacket received: " + packetInfo.PacketId);

        if (packetInfo.PacketId == EPacketId.LoginResponse)
        {
            protocol.Deserialize(readBuffer, out Login login);
            playerId = login.PlayerId;
            Debug.Log(login);
        }
        else if (packetInfo.PacketId == EPacketId.LoginEvent)
        {
            protocol.Deserialize(readBuffer, out Login login);

            Player2Name.text  = string.Concat(login.PlayerName);
            Player2Score.text = "0";

            Player1Name.text  = _localPlayerName;
            Player1Score.text = "0";

            waiting_pannel.SetActive(false);
            StopCoroutine(waiting_animation);

            Debug.Log($"OtherPlayerId: { login.PlayerId }, OtherPlayerName: { login.PlayerName }");
        }
        else if (packetInfo.PacketId == EPacketId.BoardUpdateEvent)
        {
            protocol.Deserialize(readBuffer, out GameUpdate gameUpdate);
            Player1Score.text = $"{(playerId == gameUpdate.Player1ID? gameUpdate.Player1Score : gameUpdate.Player2Score)}";
            Player2Score.text = $"{(playerId == gameUpdate.Player1ID ? gameUpdate.Player2Score : gameUpdate.Player1Score)}";

            bool myTurn = playerId == gameUpdate.PlayerTurn;

            Player1Name.gameObject.GetComponent <Outline>().enabled = myTurn;
            Player2Name.gameObject.GetComponent <Outline>().enabled = !myTurn;

            UpdateBoard(gameUpdate.Board);
        }
        else if (packetInfo.PacketId == EPacketId.LogoutEvent)
        {
            protocol.Deserialize(readBuffer, out Login login);
            Debug.Log($"{string.Concat(login.PlayerName)} was disconnected!");
        }
    }
Beispiel #16
0
        protected override void ProcessPacket(Event netEvent)
        {
            byte channel = netEvent.ChannelID;

            m_buffer = netEvent.Packet.GetBufferFromPacket(m_buffer);
            var buffer = m_buffer;
            var header = m_buffer.GetEntityHeader();
            var op     = header.OpCode;
            var id     = header.ID;

            NetworkedObject nobj = null;

            switch (op)
            {
            case OpCodes.Spawn:
                nobj = SpawnNetworkedObject(id, buffer);
                break;

            case OpCodes.BulkSpawn:
                var cnt = m_buffer.ReadInt();
                for (int i = 0; i < cnt; i++)
                {
                    header = m_buffer.GetEntityHeader();
                    SpawnNetworkedObject(header.ID, buffer);
                }
                break;

            case OpCodes.Destroy:
                if (m_peers.TryGetValue(id, out nobj) && nobj.ID == id)
                {
                    m_peers.Remove(id);
                    Destroy(nobj.gameObject);
                }
                break;

            case OpCodes.PositionUpdate:
            case OpCodes.SyncUpdate:
                if (m_peers.TryGetValue(id, out nobj))
                {
                    nobj.ProcessPacket(op, buffer);
                }
                else
                {
                    Debug.LogWarning($"Unable to locate entity ID: {id}");
                }
                break;
            }
        }
 public bool Connect(IPEndPoint serverAddress)
 {
     client.Connect(serverAddress, 0, 2);
     ENet.Event e = new ENet.Event();
     if (client.Service(CONNECTIONTIMEOUT, out e) && e.Type == ENet.EventType.Connect)
     {
         Console.Out.WriteLine("Successful connection to " + serverAddress.Address.ToString() + ":" + serverAddress.Port);
         server = e.Peer;
         listeningThread = new Thread(this.listen);
         listeningThread.Start();
         return true;
     }
     else
     {
         Console.Out.WriteLine("Connection failure to " + serverAddress.Address.ToString() + ":" + serverAddress.Port);
         return false;
     }
 }
        protected override void ProcessPacket(Event netEvent)
        {
            Profiler.BeginSample("Process Packet");
            //Debug.Log($"Packet received from - ID: {netEvent.Peer.ID}, IP: {netEvent.Peer.IP}, Channel ID: {netEvent.ChannelID}, Data Length: {netEvent.Packet.Length}");

            m_buffer = netEvent.Packet.GetBufferFromPacket(m_buffer);
            var buffer = m_buffer;
            var header = buffer.GetEntityHeader();
            var op     = header.OpCode;
            var id     = header.ID;

            if (netEvent.Peer.ID != id)
            {
                Debug.LogError($"ID Mismatch! {netEvent.Peer.ID} vs. {id}");
                Profiler.EndSample();
                return;
            }

            switch (op)
            {
            case OpCodes.PositionUpdate:
                Profiler.BeginSample("Process Packet - Position Update");
                var command = GameCommandPool.GetGameCommand();
                command.Type    = CommandType.BroadcastOthers;
                command.Source  = netEvent.Peer;
                command.Channel = 1;
                command.Packet  = netEvent.Packet;

                m_commandQueue.Enqueue(command);

                NetworkedObject nobj = null;
                if (m_peers.TryGetValue(netEvent.Peer.ID, out nobj))
                {
                    nobj.ProcessPacket(op, buffer);
                }
                Profiler.EndSample();
                break;

            default:
                netEvent.Packet.Dispose();
                break;
            }
            Profiler.EndSample();
        }
Beispiel #19
0
    private void ParsePacket(ref ENet.Event netEvent)
    {
        var readBuffer = new byte[1024];
        var readStream = new MemoryStream(readBuffer);
        var reader     = new BinaryReader(readStream);

        readStream.Position = 0;
        netEvent.Packet.CopyTo(readBuffer);
        var packetId = (PacketId)reader.ReadByte();

        Debug.Log("ParsePacket received: " + packetId);

        if (packetId == PacketId.LoginResponse)
        {
            _myPlayerId = reader.ReadUInt32();
            Debug.Log("MyPlayerId: " + _myPlayerId);
        }
        else if (packetId == PacketId.LoginEvent)
        {
            var playerId = reader.ReadUInt32();
            Debug.Log("OtherPlayerId: " + playerId);
            SpawnOtherPlayer(playerId);
        }
        else if (packetId == PacketId.PositionUpdateEvent)
        {
            var playerId = reader.ReadUInt32();
            var x        = reader.ReadSingle();
            var y        = reader.ReadSingle();
            UpdatePosition(playerId, x, y);
        }
        else if (packetId == PacketId.LogoutEvent)
        {
            var playerId = reader.ReadUInt32();
            if (_players.ContainsKey(playerId))
            {
                Destroy(_players[playerId]);
                _players.Remove(playerId);
            }
        }
    }
Beispiel #20
0
        /// <summary>
        /// ENet Server Callbacks
        /// </summary>
        void switch_callbacks(ENet.Event netEvent)
        {
            switch (netEvent.Type)
            {
            case ENet.EventType.None:
            {
                break;
            }

            case ENet.EventType.Connect:
            {
                //Debug.Log("Client connected - ID: " + netEvent.Peer.ID + ", IP: " + netEvent.Peer.IP);
                ExecuteTrigger("Connect", netEvent);
                break;
            }

            case ENet.EventType.Disconnect:
            {
                //Debug.Log("Client disconnected - ID: " + netEvent.Peer.ID + ", IP: " + netEvent.Peer.IP);
                ExecuteTrigger("Disconnect", netEvent);
                break;
            }

            case ENet.EventType.Timeout:
            {
                //Debug.Log("Client timeout - ID: " + netEvent.Peer.ID + ", IP: " + netEvent.Peer.IP);
                ExecuteTrigger("Timeout", netEvent);
                break;
            }

            case ENet.EventType.Receive:
            {
                //Debug.Log("Packet received from - ID: " + netEvent.Peer.ID + ", IP: " + netEvent.Peer.IP + ", Channel ID: " + netEvent.ChannelID + ", Data length: " + netEvent.Packet.Length);

                ExecuteTriggerBytes(netEvent);
                netEvent.Packet.Dispose();
                break;
            }
            }
        }
Beispiel #21
0
 void HandleDisconnection(Event netEvent)
 {
     Console.WriteLine("Client: " + netEvent.Peer.IP + netEvent.Peer.Port + " disconnected.");
     connections[netEvent.Peer].OnDisconnect();
     connections.Remove(netEvent.Peer);
 }
 protected unsafe void listen()
 {
     ENet.Event e = new ENet.Event();
     while (!end)
     {
         client.Service(TIMEOUT, out e);
         //Console.Out.WriteLine("Message received. Type : " + e.Type);
         switch (e.Type)
         {
                 // needs more error handling
             case ENet.EventType.Connect:
                 break;
             case ENet.EventType.Disconnect:
                 server = new ENet.Peer();
                 end = true; // no thread join in this case, fix ?
                 Console.Out.WriteLine("Connection closed by server");
                 break;
             case ENet.EventType.Receive:
                 //String message = new String((sbyte*)e.Packet.Data.ToPointer(), 0, e.Packet.Length);
                 byte[] bytes = new byte[e.Packet.Length];
                 for (int i = 0; i < e.Packet.Length; i++)
                 {
                     bytes[i] = *((byte*)(e.Packet.Data.ToPointer())+i);
                 }
                 dispatchMessage(bytes);
                 break;
             case ENet.EventType.None:
                 break;
         }
     }
 }
Beispiel #23
0
        private void HandleServerEvent(Event networkEvent)
        {
            var newConnectionID = serverConnectionCnt;

            switch (networkEvent.Type)
            {
            case EventType.Connect:
                if (m_TransportVerbosity > TransportVerbosity.SilenceIsGolden)
                {
                    Log($"Ignorance Transport: New client connection to server. Peer ID: {networkEvent.Peer.ID}, IP: {networkEvent.Peer.IP}");
                }

                // Map them into our dictonaries.
                knownPeersToConnIDs.Add(networkEvent.Peer, newConnectionID);
                knownConnIDToPeers.Add(serverConnectionCnt, networkEvent.Peer);

                if (m_TransportVerbosity > TransportVerbosity.SilenceIsGolden)
                {
                    Log($"Ignorance Transport: Peer ID {networkEvent.Peer.ID} is now known as connection ID {serverConnectionCnt}.");
                }
                OnServerConnected.Invoke(serverConnectionCnt);

                // Increment the connection counter.
                serverConnectionCnt++;
                break;

            case EventType.Disconnect:
                if (knownPeersToConnIDs.TryGetValue(networkEvent.Peer, out var deadPeerConnID))
                {
                    if (m_TransportVerbosity > TransportVerbosity.SilenceIsGolden)
                    {
                        Log($"Ignorance Transport: Connection ID {knownPeersToConnIDs[networkEvent.Peer]} has disconnected.");
                    }
                    OnServerDisconnected.Invoke(deadPeerConnID);
                    PeerDisconnectedInternal(networkEvent.Peer);
                }
                else
                {
                    if (m_TransportVerbosity > TransportVerbosity.SilenceIsGolden)
                    {
                        LogWarning($"Ignorance Transport: Unknown Peer with ID {networkEvent.Peer.ID} has disconnected. Hmm...");
                    }
                }
                break;

            case EventType.Receive:
                if (m_TransportVerbosity > TransportVerbosity.Chatty)
                {
                    Log($"Ignorance Transport: Server data channel {networkEvent.ChannelID} receiving a {networkEvent.Packet.Length} byte payload");
                }

                // Only process data from known peers.
                if (knownPeersToConnIDs.TryGetValue(networkEvent.Peer, out var knownConnectionID))
                {
                    NewMessageDataProcessor(networkEvent.Packet, true, knownConnectionID);
                }
                else
                {
                    // Emit a warning and clean the packet. We don't want it in memory.
                    networkEvent.Packet.Dispose();

                    if (m_TransportVerbosity > TransportVerbosity.Chatty)
                    {
                        LogWarning("Ignorance Transport WARNING: Discarded a packet because it was from a unknown peer. " +
                                   "If you see this message way too many times then you are likely a victim of a DoS or DDoS attack that is targeting your server's connection port." +
                                   " Ignorance will keep discarding packets but please do look into this. Failing to do so is risky and could potentially crash the server instance!");
                    }
                }
                break;

            case EventType.Timeout:
                // A client timed out. Note that this could be the same as the disconnected, but for now I'm going to seperate them for debugging reasons
                if (knownPeersToConnIDs.TryGetValue(networkEvent.Peer, out var timedOutConnID))
                {
                    if (m_TransportVerbosity > TransportVerbosity.SilenceIsGolden)
                    {
                        Log($"Ignorance Transport: Connection ID {knownPeersToConnIDs[networkEvent.Peer]} has timed out.");
                    }
                    OnServerDisconnected.Invoke(timedOutConnID);
                    PeerDisconnectedInternal(networkEvent.Peer);
                }
                else
                {
                    if (m_TransportVerbosity > TransportVerbosity.SilenceIsGolden)
                    {
                        LogWarning($"Ignorance Transport: Unknown Peer with ID {networkEvent.Peer.ID} has timed out. Hmm...");
                    }
                }
                break;
            }
        }
Beispiel #24
0
        public int Service(int timeout, out Event @event)
        {
            if (timeout < 0)
            {
                throw new ArgumentOutOfRangeException("timeout");
            }
            CheckCreated();
            Native.ENetEvent nativeEvent;

            var ret = Native.enet_host_service(_host, out nativeEvent, (uint) timeout);
            if (ret <= 0)
            {
                @event = new Event();
                return ret;
            }
            @event = new Event(nativeEvent);
            return ret;
        }
    private void ParsePacket(ref ENet.Event netEvent)
    {
        var readBuffer = new byte[1024];
        var readStream = new MemoryStream(readBuffer);
        var reader     = new BinaryReader(readStream);

        readStream.Position = 0;
        netEvent.Packet.CopyTo(readBuffer);
        var packetId = (PacketId)reader.ReadByte();

        //Debug.Log("ParsePacket received: " + packetId);

        if (packetId == PacketId.LoginResponse)
        {
            _myPlayerId = reader.ReadUInt32();
            Debug.Log("MyPlayerId: " + _myPlayerId);
        }
        else if (packetId == PacketId.LoginEvent)
        {
            var playerId = reader.ReadUInt32();
            Debug.Log("OtherPlayerId: " + playerId);
            SpawnOtherPlayer(playerId);
        }
        else if (packetId == PacketId.PositionAndRotationUpdateEvent)
        {
            var playerId = reader.ReadUInt32();

            //LEO POSICIONES
            var posX = reader.ReadSingle();
            var posY = reader.ReadSingle();
            var posZ = reader.ReadSingle();

            //LEO ROTACION
            var rotX = reader.ReadSingle();
            var rotY = reader.ReadSingle();
            var rotZ = reader.ReadSingle();

            var rotPivotWeaponX = reader.ReadSingle();
            var rotPivotWeaponY = reader.ReadSingle();
            var rotPivotWeaponZ = reader.ReadSingle();

            UpdatePosition(playerId, posX, posY, posZ);
            UpdateRotation(playerId, rotX, rotY, rotZ);
            UpdateRotationPivotWeapon(playerId, rotPivotWeaponX, rotPivotWeaponY, rotPivotWeaponZ);
        }
        else if (packetId == PacketId.LogoutEvent)
        {
            var playerId = reader.ReadUInt32();
            if (_players.ContainsKey(playerId))
            {
                Destroy(_players[playerId].myPrefab);
                _players.Remove(playerId);
            }
        }
        else if (packetId == PacketId.SpawnBulletEvent)
        {
            var playerId = reader.ReadUInt32();
            SpawnBulletOtherPlayer(playerId);
        }
        else if (packetId == PacketId.CollisionBulletTrue)
        {
            Debug.Log("PEGUE :D");
        }
        else if (packetId == PacketId.CollisionBulletFalse)
        {
            Debug.Log("NO PEGUE UNA GOMA D:");
        }
    }
Beispiel #26
0
 protected override void Connect(Event netEvent)
 {
     //throw new NotImplementedException();
 }
Beispiel #27
0
        private void HandleDisconnectClient(Event netEvent)
        {
            var packetReceivedEventArgs = new PacketReceivedEventArgs();

            OnClientDisconnect(packetReceivedEventArgs);
        }
Beispiel #28
0
 protected abstract void Connect(Event netEvent);
Beispiel #29
0
 protected abstract void Disconnect(Event netEvent);
Beispiel #30
0
 protected abstract void ProcessPacket(Event netEvent);
 protected override void Connect(Event netEvent)
 {
     Debug.Log($"Client connected - ID: {netEvent.Peer.ID}, IP: {netEvent.Peer.IP}");
     SpawnRemotePlayer(netEvent.Peer);
 }
Beispiel #32
0
        private void HandlePacket(ref ENet.Event netEvent)
        {
            try
            {
                var readBuffer = new byte[1024];
                var readStream = new MemoryStream(readBuffer);
                var reader     = new BinaryReader(readStream);

                readStream.Position = 0;
                netEvent.Packet.CopyTo(readBuffer);
                var packetID = (PacketType)reader.ReadByte();

                if (packetID == PacketType.ServerPositionUpdate)
                {
                    //Debug.Log("Received Server Position Update");
                    var oID = reader.ReadUInt32();
                    var oX  = reader.ReadSingle();
                    var oY  = reader.ReadSingle();
                    //Debug.Log($"ID: {oID}, X: {oX}, Y: {oY}");

                    if (GameRoom.clients.ContainsKey(oID))
                    {
                        if (GameRoom.clients[oID] == null)
                        {
                            Debug.LogWarning("oClient is null");
                            GameRoom.clients.Remove(oID);
                        }
                        else
                        {
                            //Debug.Log($"Updated position for other client ID '{oID}' x: {oX}, y: {oY}");
                            GameRoom.clients[oID].transform.position = new Vector2(oX, oY);

                            return;
                        }
                    }

                    if (oID == myID) // myID being the ID of THIS client
                    {
                        // This is just a safeguard, this was caused before because the server was using a Dict<> instead of a List<> causing the server position queue to not be in sync
                        Debug.LogWarning("Received position update for THIS client. Ignoring..");
                        return;
                    }

                    GameRoom.CreateOtherClient(oID, oX, oY);
                }

                if (packetID == PacketType.ServerClientDisconnected)
                {
                    var id = reader.ReadUInt32();

                    GameRoom.clients.Remove(id);
                    Destroy(GameObject.Find($"oClient {id}"));
                    Debug.Log($"Client {id} disconnected");
                }
            }

            catch (ArgumentOutOfRangeException)
            {
                Console.WriteLine($"Received packet but buffer was too long. {netEvent.Packet.Length}");
            }
        }
    private void ParsePacket(ref ENet.Event netEvent)
    {
        var readBuffer = new byte[TAM_BUFFER];
        var readStream = new MemoryStream(readBuffer);
        var reader     = new BinaryReader(readStream);

        readStream.Position = 0;
        netEvent.Packet.CopyTo(readBuffer);
        var packetId = (PacketId)reader.ReadByte();

        Debug.Log("ParsePacket received: " + packetId);

        if (packetId == PacketId.LoginResponse)
        {
            _myPlayerId = reader.ReadUInt32();
            _myClient   = new Client(_myPlayerId, -1, 0, myAlias, -1, false, false);
            Debug.Log("MyPlayerId: " + _myPlayerId);
        }
        else if (packetId == PacketId.LoginEvent)
        {
            var playerId = reader.ReadUInt32();
            Debug.Log("OtherPlayerId: " + playerId);
            //SpawnOtherPlayer(playerId);
        }
        else if (packetId == PacketId.LogoutEvent)
        {
            var playerId = reader.ReadUInt32();
            if (_players.ContainsKey(playerId))
            {
                Destroy(_players[playerId]);
                _players.Remove(playerId);
            }
        }
        else if (packetId == PacketId.TestMensaggeEvent)
        {
            var playerId = reader.ReadUInt32();

            Debug.Log("RESPUESTA DEL SERVIDOR: Mensaje recibido desde Id " + playerId);
        }
        else if (packetId == PacketId.CountRoomsEvent)
        {
            var playerId = reader.ReadUInt32();
            countRooms = reader.ReadInt32();
            if (countRooms > 0 && requestCountRooms)
            {
                requestCountRooms = false;
                _roomsData.Clear();
                for (int i = 0; i < countRooms; i++)
                {
                    _roomsData.Add(new RoomsData("Sin nombre", 0, 0));
                    Debug.Log("Creada room " + (i + 1));
                }
                delayRequestDataCanvasLobby = 0;
            }
            Debug.Log("Cantidad de Rooms: " + countRooms);
        }
        else if (packetId == PacketId.DataRoomsUpdateEvent)
        {
            var playerId = reader.ReadUInt32();
            var nameRoom = reader.ReadString();
            var countPlayersInThisRoom = reader.ReadInt32();
            var maxPlayersInThisRoom   = reader.ReadInt32();
            var ID_Room = reader.ReadInt32();

            if (ID_Room < _roomsData.Count && ID_Room >= 0)
            {
                _roomsData[ID_Room].nameRoom       = nameRoom;
                _roomsData[ID_Room].currentPlayers = countPlayersInThisRoom;
                _roomsData[ID_Room].maxPlayers     = maxPlayersInThisRoom;

                _roomsNames[ID_Room].text = "Sala " + (ID_Room + 1) + "\n" + "Jugadores conectados " + _roomsData[ID_Room].currentPlayers + "/" + _roomsData[ID_Room].maxPlayers;
            }
        }
        else if (packetId == PacketId.DataWaitReadyRoomEvent)
        {
            var playerID         = reader.ReadUInt32();
            var otherPlayerReady = reader.ReadBoolean();
            var otherPlayerAlias = reader.ReadString();
            countPlayersInRoom = reader.ReadInt32();
            var ID_RoomConecteed = reader.ReadInt32();
            if (_myPlayerId != playerID && ID_RoomConecteed == _myClient.ID_RoomConnect && ID_RoomConecteed != ID_ROOM_INVALIDO)
            {
                if (otherPlayerReady)
                {
                    readyImage_OtherPlayer.color = colorReady;
                }
                else
                {
                    readyImage_OtherPlayer.color = colorNotReady;
                }

                currentOtherPlayerAlias = otherPlayerAlias;

                if (countPlayersInRoom <= 1)
                {
                    aliasOtherPlayer_text.text = "Falta Jugador...";
                }
                else
                {
                    aliasOtherPlayer_text.text = otherPlayerAlias;
                }

                readyForPlaying_otherPlayer = otherPlayerReady;
                playersConnected_text.text  = "Jugadores conectados: " + countPlayersInRoom + "/2";
            }
        }
        else if (packetId == PacketId.DisconnectRoomEvent)
        {
            var playerId       = reader.ReadUInt32();
            var ID_RoomConnect = reader.ReadInt32();
            var ID_InRoom      = reader.ReadUInt32();

            if (playerId == _myClient.ID)
            {
                ClearDataDisconnect(ID_RoomConnect, ID_InRoom);
            }
        }
        else if (packetId == PacketId.DataTurnEvent)
        {
            var playerId  = reader.ReadUInt32();
            var _isMyTurn = reader.ReadBoolean();
            Debug.Log(playerId + " == " + _myClient.ID);
            if (playerId == _myClient.ID)
            {
                SwitchTurn(_isMyTurn);
                nameTurn_text.gameObject.SetActive(true);
            }
        }
        else if (packetId == PacketId.InputUpdateEvent)
        {
            var playerID       = reader.ReadUInt32();
            var ID             = reader.ReadUInt32();
            var ID_RoomConnect = reader.ReadInt32();
            var ID_InRoom      = reader.ReadUInt32();
            var alias          = reader.ReadString();
            var input          = reader.ReadInt32();
            var isMyTurn       = reader.ReadBoolean();
            var inputOK        = reader.ReadBoolean();

            if (playerID == _myClient.ID && UPDATE_DATA_DISCONNECT == input)
            {
                _myClient.ID_InRoom = ID_InRoom;
                ClearDataDisconnect(ID_RoomConnect, ID_InRoom);
                _myClient.input    = NADA_NUEVO;
                result             = "GANASTE :D";
                nameTurn_text.text = result;
                gameOver           = true;
                buttonContinue.gameObject.SetActive(true);
                readyForPlaying_myPlayer    = false;
                readyForPlaying_otherPlayer = false;
                SendDataWaitReadyRoomRequest();
            }
            if (_myClient.input == CONECTAR_A_LA_ROOM && input == INPUT_VALIDO && playerID == _myClient.ID)
            {
                SendDataRoomRequest();

                NextCanvas(3);
                _myClient.input     = NADA_NUEVO;
                _myClient.ID_InRoom = ID_InRoom;
                //Debug.Log(_myClient.ID_InRoom);
            }
            else if (_myClient.input == CONECTAR_A_LA_ROOM && input == INPUT_INVALIDO && playerID == _myClient.ID)
            {
                NextCanvas(1);
                _myClient.input = NADA_NUEVO;
            }
            else if (ID_RoomConnect == _myClient.ID_RoomConnect)
            {
                if ((input == INPUT_EMPATO_PARTIDA || input == INPUT_GANO_PARTIDA || input == INPUT_PERDIO_PARTIDA) && playerID == _myClient.ID)
                {
                    Debug.Log("TERMINO PARTIDA");
                    gameOver = true;
                    buttonContinue.gameObject.SetActive(true);
                    readyForPlaying_myPlayer    = false;
                    readyForPlaying_otherPlayer = false;
                    SendDataWaitReadyRoomRequest();
                    switch (input)
                    {
                    case INPUT_EMPATO_PARTIDA:
                        result = "EMPATE !";
                        break;

                    case INPUT_GANO_PARTIDA:
                        result = "GANASTE :D";
                        AddScore(ref myScore, ref myScore_text);
                        break;

                    case INPUT_PERDIO_PARTIDA:
                        result = "PERDISTE :'c";
                        AddScore(ref enemyScore, ref enemyScore_text);
                        break;
                    }
                }
                else
                {
                    if (ID_InRoom == _myClient.ID_InRoom)
                    {
                        if (_myClient.input == JUGAR_POSICION_0_DEL_TABLERO && input == INPUT_VALIDO)
                        {
                            //MI JUGADA
                            Instantiate(myToken, slots[0].transform);
                            SwitchTurn(isMyTurn);
                        }
                        else if (_myClient.input == JUGAR_POSICION_1_DEL_TABLERO && input == INPUT_VALIDO)
                        {
                            //MI JUGADA
                            Instantiate(myToken, slots[1].transform);
                            SwitchTurn(isMyTurn);
                        }
                        else if (_myClient.input == JUGAR_POSICION_2_DEL_TABLERO && input == INPUT_VALIDO)
                        {
                            //MI JUGADA
                            Instantiate(myToken, slots[2].transform);
                            SwitchTurn(isMyTurn);
                        }
                        else if (_myClient.input == JUGAR_POSICION_3_DEL_TABLERO && input == INPUT_VALIDO)
                        {
                            //MI JUGADA
                            Instantiate(myToken, slots[3].transform);
                            SwitchTurn(isMyTurn);
                        }
                        else if (_myClient.input == JUGAR_POSICION_4_DEL_TABLERO && input == INPUT_VALIDO)
                        {
                            //MI JUGADA
                            Instantiate(myToken, slots[4].transform);
                            SwitchTurn(isMyTurn);
                        }
                        else if (_myClient.input == JUGAR_POSICION_5_DEL_TABLERO && input == INPUT_VALIDO)
                        {
                            //MI JUGADA
                            Instantiate(myToken, slots[5].transform);
                            SwitchTurn(isMyTurn);
                        }
                        else if (_myClient.input == JUGAR_POSICION_6_DEL_TABLERO && input == INPUT_VALIDO)
                        {
                            //MI JUGADA
                            Instantiate(myToken, slots[6].transform);
                            SwitchTurn(isMyTurn);
                        }
                        else if (_myClient.input == JUGAR_POSICION_7_DEL_TABLERO && input == INPUT_VALIDO)
                        {
                            //MI JUGADA
                            Instantiate(myToken, slots[7].transform);
                            SwitchTurn(isMyTurn);
                        }
                        else if (_myClient.input == JUGAR_POSICION_8_DEL_TABLERO && input == INPUT_VALIDO)
                        {
                            //MI JUGADA
                            Instantiate(myToken, slots[8].transform);
                            SwitchTurn(isMyTurn);
                        }
                    }
                    else if (ID_InRoom != _myClient.ID_InRoom)
                    {
                        if (input == JUGAR_POSICION_0_DEL_TABLERO)
                        {
                            //JUGADA DEL CONTRINCANTE
                            Instantiate(enemyToken, slots[0].transform);
                            SwitchTurn(isMyTurn);
                        }
                        else if (input == JUGAR_POSICION_1_DEL_TABLERO)
                        {
                            //JUGADA DEL CONTRINCANTE
                            Instantiate(enemyToken, slots[1].transform);
                            SwitchTurn(isMyTurn);
                        }
                        else if (input == JUGAR_POSICION_2_DEL_TABLERO)
                        {
                            //JUGADA DEL CONTRINCANTE
                            Instantiate(enemyToken, slots[2].transform);
                            SwitchTurn(isMyTurn);
                        }
                        else if (input == JUGAR_POSICION_3_DEL_TABLERO)
                        {
                            //JUGADA DEL CONTRINCANTE
                            Instantiate(enemyToken, slots[3].transform);
                            SwitchTurn(isMyTurn);
                        }
                        else if (input == JUGAR_POSICION_4_DEL_TABLERO)
                        {
                            //JUGADA DEL CONTRINCANTE
                            Instantiate(enemyToken, slots[4].transform);
                            SwitchTurn(isMyTurn);
                        }
                        else if (input == JUGAR_POSICION_5_DEL_TABLERO)
                        {
                            //JUGADA DEL CONTRINCANTE
                            Instantiate(enemyToken, slots[5].transform);
                            SwitchTurn(isMyTurn);
                        }
                        else if (input == JUGAR_POSICION_6_DEL_TABLERO)
                        {
                            //JUGADA DEL CONTRINCANTE
                            Instantiate(enemyToken, slots[6].transform);
                            SwitchTurn(isMyTurn);
                        }
                        else if (input == JUGAR_POSICION_7_DEL_TABLERO)
                        {
                            //JUGADA DEL CONTRINCANTE
                            Instantiate(enemyToken, slots[7].transform);
                            SwitchTurn(isMyTurn);
                        }
                        else if (input == JUGAR_POSICION_8_DEL_TABLERO)
                        {
                            //JUGADA DEL CONTRINCANTE
                            Instantiate(enemyToken, slots[8].transform);
                            SwitchTurn(isMyTurn);
                        }
                    }
                }
                input = NADA_NUEVO;
            }

            //HACER QUE LA DATA DE LA UI DE LAS ROOMS SE ACTUALICE EN BASE A LO QUE LE CORRESPONDE:
            //- CANVAS PARA ELEGIR FICHA QUE VAYA ANTES DEL CANVAS DE CanvasWaitReadyRoom Y DESPUES DEL CanvasChargeRoom
            //- TERMINAR EL FLOW DE NIVELES (HACER QUE DEL CanvasLoby PASE a CanvasChargeRoom PASE a CanvasElegirFicha PASE a CanvasWaitReadyRoom
            //  Y DESPUES pase al CanvasRoom donde empezara la partida)
            //- SALA CON SU NUMERO
            //- NOMBRES DE JUGADORES
            //- CANTIDAD DE JUGADORES CONECTADOS
            //- SI EL JUGADOR ESTA LISTO O NO.
            //- FUNCIONES DE LOS BOTONES
            //- FUCIONALIDAD DE LOS BOTONES PARA COLOCAR LA FICHA
            //- PUNTAJE DE CADA JUGADOR
            //- DE QUIEN ES EL TURNO.
            //- FUNCIONALIDAD DEL CANVAS PARA SELECCIONAR FICHA.


            //TAREAS DE CONEXION PENDIENTES:
            //- CUANDO ME RETIRO DE LA ROOM QUE SE DESCONECTE DE ESTA Y VUELVA AL LOBY
            //- CUANDO CIERRO EL JUEGO ME DESCONECTO COMPLETAMENTE (DE LA ROOM Y DEL LOBY).
            //- CUANDO SALGO AL MODO OFFLINE ME DESCONECTO COMPLETAMENTE (DE LA ROOM Y DEL LOBY).
        }
    }
Beispiel #34
0
    private void ParsePacket(ref ENet.Event netEvent)
    {
        var readBuffer = new byte[8000000];
        var readStream = new MemoryStream(readBuffer);
        var reader     = new BinaryReader(readStream);

        readStream.Position = 0;
        netEvent.Packet.CopyTo(readBuffer);
        var packetId = (PacketId)reader.ReadByte();

        //Debug.Log("ParsePacket received: " + packetId);

        if (packetId == PacketId.LoginResponse)
        {
            _myPlayerId = reader.ReadUInt32();
            Debug.Log("MyPlayerId: " + _myPlayerId);
        }
        else if (packetId == PacketId.LoginEvent)
        {
            var playerId = reader.ReadUInt32();
            Debug.Log("OtherPlayerId: " + playerId);
            SpawnOtherPlayer(playerId);
        }
        else if (packetId == PacketId.PositionUpdateEvent)
        {
            var playerId = reader.ReadUInt32();
            var x        = reader.ReadSingle();
            var y        = reader.ReadSingle();
            var z        = reader.ReadSingle();

            //print($"ID: {playerId}, Pos: {x}, {y}, {z}");

            UpdatePosition(playerId, x, y, z);
        }
        else if (packetId == PacketId.PlayerPositionUpdateEvent)
        {
            var playerId = reader.ReadUInt32();
            var x        = reader.ReadSingle();
            var y        = reader.ReadSingle();
            var z        = reader.ReadSingle();
            // Quaternion
            var xq = reader.ReadSingle();
            var yq = reader.ReadSingle();
            var zq = reader.ReadSingle();
            var wq = reader.ReadSingle();

            //print($"ID: {playerId}, Pos: {x}, {y}, {z}");

            UpdatePlayerPosition(playerId, x, y, z, xq, yq, zq, wq);
        }
        else if (packetId == PacketId.LogoutEvent)
        {
            var playerId = reader.ReadUInt32();
            if (_players.ContainsKey(playerId))
            {
                Destroy(_players[playerId]);
                _players.Remove(playerId);
            }
        }
        else if (packetId == PacketId.ChangeStatusEvent)
        {
            var playerId = reader.ReadUInt32();
            if (playerId != _myPlayerId)
            {
                myControl = false;
            }
            else
            {
                myControl = true;
            }
        }
        else if (packetId == PacketId.ChangeColorEvent)
        {
            var   playerId = reader.ReadUInt32();
            float red      = (float)reader.ReadSingle();
            float green    = (float)reader.ReadSingle();
            float blue     = (float)reader.ReadSingle();
            print($"color: {red}, {green}, {blue}");
            ballMaterial.color = new Color(red, green, blue, 1);
        }
        else if (packetId == PacketId.AudioEvent)
        {
            var    playerId = reader.ReadUInt32();
            var    size     = reader.ReadInt32();
            byte[] audio    = reader.ReadBytes(size);

            print("Audio Received here");

            if (playerId == _myPlayerId)
            {
                return;
            }

            var samples = new float[audio.Length / 4];
            Buffer.BlockCopy(audio, 0, samples, 0, audio.Length);

            for (int i = 0; i < samples.Length; ++i)
            {
                samples[i] = samples[i] * 0.5f;
            }

            print("Audio PlayBack");
            print(samples.Length);
            source.clip.SetData(samples, 0);
            source.Play();
        }
        else if (packetId == PacketId.UploadObjEvent)
        {
            var    playerId = reader.ReadUInt32();
            var    size     = reader.ReadInt32();
            byte[] obj      = reader.ReadBytes(size);

            if (playerId == _myPlayerId)
            {
                return;
            }

            print("Obj Received here");
            m_root = Load(obj);
        }
    }
 protected unsafe void listen()
 {
     ENet.Event e = new ENet.Event();
     while (!end) // TODO : change
     {
         server.Service(TIMEOUT, out e);
         //Console.Out.WriteLine("Message received. Type : " + e.Type);
         switch (e.Type)
         {
                 // needs more error handling
             case ENet.EventType.Connect:
                 addClient(e.Peer);
                 SendReliable(engine.getCurrentState(), NetFrame.FrameType.environment, e.Peer);
                 break;
             case ENet.EventType.Disconnect:
                 removeClient(e.Peer);
                 break;
             case ENet.EventType.Receive:
                 byte[] bytes = new byte[e.Packet.Length];
                 for (int i = 0; i < e.Packet.Length; i++)
                 {
                     bytes[i] = *((byte*)(e.Packet.Data.ToPointer())+i);
                 }
                 dispatchMessage(bytes, e.Peer);
                 break;
             case ENet.EventType.None:
                 break;
         }
     }
 }