/// <summary>
        /// Reads from a DarkRift reader and creates a new instance of the type written in the buffer (which has to implement ISync) and as tag it uses the parameter tag
        /// </summary>
        /// <param name="reader">The DarkRift reader to read from</param>
        /// <param name="tag">The tag to use in DeserializeOptional</param>
        /// <returns></returns>
        public static ISync ReadSerializableSmart(this DarkRiftReader reader, int tag)
        {
            ExtraSyncData _extraSyncData = (ExtraSyncData)reader.ReadByte();
            ISync         _syncObject    = default;
            int           _typeID;
            int           _tag;

            switch (_extraSyncData)
            {
            case ExtraSyncData.Nothing:
                Console.WriteLine("No TypeID provided!");
                break;

            case ExtraSyncData.TypeID:
                _typeID     = reader.ReadInt32();
                _syncObject = (ISync)Activator.CreateInstance(MLAPI.SyncTypes[_typeID]);
                _syncObject.DeserializeOptional(reader, tag);
                break;

            case ExtraSyncData.Tag:
                Console.WriteLine("No TypeID provided!");
                break;

            case ExtraSyncData.TypeIDANDTag:
                _typeID     = reader.ReadInt32();
                _tag        = reader.ReadInt32();
                _syncObject = (ISync)Activator.CreateInstance(MLAPI.SyncTypes[_typeID]);
                _syncObject.DeserializeOptional(reader, tag);
                break;
            }

            return(_syncObject);
        }
Exemple #2
0
    void MessageReceived(object sender, MessageReceivedEventArgs e)
    {
        using (Message message = e.GetMessage() as Message)
        {
            using (DarkRiftReader reader = message.GetReader())
            {
                switch (message.Tag)
                {
                //////////////////////////////////////////////////////////////////////////////
                //// LOGIC
                case MessageTags.VIDEO_RESOLUTION:
                {
                    uint checkflag = reader.ReadUInt32();
                    int  width     = reader.ReadInt32();
                    int  height    = reader.ReadInt32();

                    camera.targetTexture = new RenderTexture(width, height, 0);

                    Debug.Log($"W : {width}, H: {height}");
                }
                break;
                }
            }
        }
    }
        /// <summary>
        /// Reads from a DarkRift reader and updates the given instance (which has to implement ISync) and as tag it uses the parameter tag
        /// </summary>
        /// <param name="sync"></param>
        /// <param name="reader"></param>
        /// <param name="tag"></param>
        public static void ReadSerializableSmart(this ISync sync, DarkRiftReader reader, int tag)
        {
            ExtraSyncData _extraSyncData = (ExtraSyncData)reader.ReadByte();
            int           _typeID;
            int           _tag;

            switch (_extraSyncData)
            {
            case ExtraSyncData.Nothing:
                sync.DeserializeOptional(reader, tag);
                break;

            case ExtraSyncData.TypeID:
                _typeID = reader.ReadInt32();
                sync.DeserializeOptional(reader, tag);
                break;

            case ExtraSyncData.Tag:
                _tag = reader.ReadInt32();
                sync.DeserializeOptional(reader, tag);
                break;

            case ExtraSyncData.TypeIDANDTag:
                _typeID = reader.ReadInt32();
                _tag    = reader.ReadInt32();
                sync.DeserializeOptional(reader, tag);
                break;
            }
        }
 private void RemovePiece(object sender, MessageReceivedEventArgs e)
 {
     if (e.Tag == NetworkTags.InGame.DEFEAT)
     {
         using (Message message = e.GetMessage() as Message)
         {
             using (DarkRiftReader reader = message.GetReader())
             {
                 int tX = reader.ReadInt32();
                 int tY = reader.ReadInt32();
                 BoardGenerator.instance.RemovePiece(tX, tY);
             }
         }
     }
 }
Exemple #5
0
    void MessageReceived(object sender, MessageReceivedEventArgs e)
    {
        using (Message message = e.GetMessage() as Message)
        {
            // MOVE PLAYER
            if (message.Tag == Tags.MovePlayerTag)
            {
                try
                {
                    using (DarkRiftReader reader = message.GetReader())
                    {
                        // Wrap In While so we dont go outsite the bounts of the message
                        while (reader.Position < reader.Length)
                        {
                            //Read message
                            Vector3 newPosition = new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
                            Vector3 newRotation = new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
                            ushort  id          = reader.ReadUInt16();

                            //Update characters to move to new positions
                            networkPlayers[id].NewPosition = newPosition;
                            networkPlayers[id].NewRotation = newRotation;
                        }
                    }
                }
                catch (Exception ex)
                {
                    Debug.LogError("Error: " + ex + "\r\n\r\n" + ex.StackTrace);
                }
            }
            // PLAYER ANIMATION STATE
            if (message.Tag == Tags.AnimationPlayerTag)
            {
                try
                {
                    using (DarkRiftReader reader = message.GetReader())
                    {
                        // Wrap In While so we dont go outsite the bounts of the message
                        while (reader.Position < reader.Length)
                        {
                            //Read message
                            int    speed    = reader.ReadInt32();
                            byte   jump     = reader.ReadByte();
                            byte   grounded = reader.ReadByte();
                            ushort id       = reader.ReadUInt16();

                            //Update characters to move to new positions
                            networkPlayers[id].speed    = speed;
                            networkPlayers[id].jump     = jump;
                            networkPlayers[id].grounded = grounded;
                        }
                    }
                }
                catch (Exception ex)
                {
                    Debug.LogError("Error: " + ex + "\r\n\r\n" + ex.StackTrace);
                }
            }
        }
    }
Exemple #6
0
 void UpdateServerMessageRecieved(object sender, MessageReceivedEventArgs e)
 {
     using (Message message = e.GetMessage() as Message)
     {
         if (message.Tag == NetworkTags.InGame.CALLBACK_PIECE)
         {
             using (DarkRiftReader reader = message.GetReader())
             {
                 //BoardGenerator.instance.Set
                 var id      = reader.ReadInt32();
                 int targetX = reader.ReadInt32();
                 int targetY = reader.ReadInt32();
                 testText.text = id.ToString();
                 NetworkObject obj         = networkObjects.FirstOrDefault(x => x.id == id);
                 PlayerPiece   targetPiece = obj.GetComponent <PlayerPiece>();
                 BoardGenerator.instance.SetPieceLocation(targetPiece, targetX, targetY);
                 SendObjectToSpawnTo(obj, e.Client);
             }
         }
     }
 }
        public void ReadInt32Test()
        {
            // GIVEN a buffer of serialized data
            mockMessageBuffer.Setup(m => m.Buffer).Returns(new byte[] { 0x23, 0x24, 0x30, 0x5C });
            mockMessageBuffer.Setup(m => m.Offset).Returns(0);
            mockMessageBuffer.Setup(m => m.Count).Returns(4);

            // WHEN I read an int from the reader
            int result = reader.ReadInt32();

            // THEN the value is as expected
            Assert.AreEqual(589574236, result);
        }
        /// <summary>
        /// Reads from a DarkRift reader and creates a new instance of a given type T (which has to implement ISync) and as tag it uses the parameter tag
        /// </summary>
        /// <typeparam name="T">The I/O type</typeparam>
        /// <param name="reader">The DarkRift reader to read from</param>
        /// <param name="tag">The tag to use in DeserializeOptional</param>
        /// <returns></returns>
        public static T ReadSerializableSmart <T>(this DarkRiftReader reader, int tag) where T : ISync, new()
        {
            ExtraSyncData _extraSyncData = (ExtraSyncData)reader.ReadByte();
            T             _syncObject    = default;
            int           _typeID;
            int           _tag;

            switch (_extraSyncData)
            {
            case ExtraSyncData.Nothing:
                _syncObject = (T)Activator.CreateInstance(typeof(T));
                _syncObject.DeserializeOptional(reader, tag);
                break;

            case ExtraSyncData.TypeID:
                _typeID     = reader.ReadInt32();
                _syncObject = (T)Activator.CreateInstance(typeof(T));
                _syncObject.DeserializeOptional(reader, tag);
                break;

            case ExtraSyncData.Tag:
                _tag        = reader.ReadInt32();
                _syncObject = (T)Activator.CreateInstance(typeof(T));
                _syncObject.DeserializeOptional(reader, tag);
                break;

            case ExtraSyncData.TypeIDANDTag:
                _typeID     = reader.ReadInt32();
                _tag        = reader.ReadInt32();
                _syncObject = (T)Activator.CreateInstance(typeof(T));
                _syncObject.DeserializeOptional(reader, tag);
                break;
            }

            return(_syncObject);
        }
Exemple #9
0
 void RemovePiece(object sender, MessageReceivedEventArgs e)
 {
     using (Message message = e.GetMessage() as Message)
     {
         if (message.Tag == NetworkTags.InGame.DEFEAT)
         {
             using (DarkRiftReader reader = message.GetReader())
             {
                 var           id  = reader.ReadInt32();
                 NetworkObject obj = networkObjects.FirstOrDefault(x => x.id == id);
                 BoardGenerator.instance.RemovePiece(obj.GetComponent <PlayerPiece>().x, obj.GetComponent <PlayerPiece>().y);
                 SendRemovePiece(obj.GetComponent <PlayerPiece>());
             }
         }
     }
 }
Exemple #10
0
 public void OnDataRecieved(byte tag, ushort subject, object data)
 {
     if (tag == (byte)TagsNSubjects.Tags.LOGINTAG)
     {
         if (subject == (ushort)TagsNSubjects.LoginSubjects.LOGINSUCCESS)
         {
             using (DarkRiftReader reader = data as DarkRiftReader) {
                 Globalmanager.id = reader.ReadInt32();
             }
         }
         SceneManager.LoadScene("Lobby");
         if (subject == (ushort)TagsNSubjects.LoginSubjects.LOGINFAILED)
         {
             Debug.Log("login failed");
         }
     }
 }
Exemple #11
0
 void DeserialiseAnim(object data)
 {
     if (data is DarkRiftReader)
     {
         using (DarkRiftReader reader = (DarkRiftReader)data)
         {
             plValues.running  = reader.ReadBoolean();
             plValues.grounded = reader.ReadBoolean();
             plValues.state    = reader.ReadInt32();
             plValues.speed    = reader.ReadSingle();
             plValues.hor      = reader.ReadSingle();
             plValues.ver      = reader.ReadSingle();
         }
     }
     else
     {
         Debug.LogError("Should have recieved a DarkRiftReciever but didn't! (Got: " + data.GetType() + ")");
         transform.position = transform.position;
     }
 }
        private void AnimationStateMessageReceived(object sender, MessageReceivedEventArgs e)
        {
            using (Message message = e.GetMessage() as Message)
            {
                if (message.Tag == Tags.AnimationPlayerTag)
                {
                    // Read Player Coordinates From The Message
                    try
                    {
                        using (DarkRiftReader reader = message.GetReader())
                        {
                            // Get Player ID
                            PlayerAnimationState animstate = new PlayerAnimationState();
                            animstate.Speed    = reader.ReadInt32();
                            animstate.Jump     = reader.ReadByte();
                            animstate.Grounded = reader.ReadByte();
                            animstate.ID       = e.Client.ID;

                            // Serialize Message
                            message.Serialize(animstate);

                            //Send to everyone else
                            foreach (IClient sendTo in ClientManager.GetAllClients().Except(new IClient[] { e.Client }))
                            {
                                sendTo.SendMessage(message, SendMode.Reliable);
                            }
                        }
                    }
                    catch (System.Exception ex)
                    {
                        Console.WriteLine("An error was logged when the animation state message was received: " + ex.Message);
                        Console.WriteLine(ex.InnerException);
                        Console.WriteLine(ex.Data);
                        Console.WriteLine(ex.StackTrace);
                    }
                }
            }
        }
        void MessageReceived(object sender, MessageReceivedEventArgs e)
        {
            Debug.Log("CreatePlayer entered");
            using (Message message = e.GetMessage())
            {
                using (DarkRiftReader reader = message.GetReader())
                {
                    if (message.Tag == Tags.CreatePlayerTag)
                    {
                        while (reader.Position < reader.Length)
                        {
                            ushort id    = reader.ReadUInt16();
                            int    index = reader.ReadInt32();

                            Debug.Log(id + " " + index);

                            if (id == client.ID)
                            {
                                if (index == 0)
                                {
                                    redPlayerText.text += " Connected";
                                }
                                else if (index == 1)
                                {
                                    bluePlayerText.text += " Connected";
                                }

                                connected = true;
                            }
                            else
                            {
                                players[index].SetPlayerController(networkPlayers[index]);
                                if (index == 0)
                                {
                                    redPlayerText.text += " Connected";
                                }
                                else if (index == 1)
                                {
                                    bluePlayerText.text += " Connected";
                                }
                            }
                        }
                    }
                    if (message.Tag == Tags.DespawnPlayerTag)
                    {
                        RemovePlayer(sender, e, reader);
                    }
                    else if (message.Tag == Tags.MovePieceTag)
                    {
                        while (reader.Position < reader.Length)
                        {
                            int   pieceId  = reader.ReadInt32();
                            float x        = reader.ReadSingle();
                            float z        = reader.ReadSingle();
                            float rotation = reader.ReadSingle();

                            Transform unitsParentTransform = GameObject.Find("Units").transform;
                            for (int i = 0; i < unitsParentTransform.childCount; i++)
                            {
                                if (pieceId == i)
                                {
                                    Transform t = unitsParentTransform.GetChild(i);
                                    MovePiece(t, x, z, rotation);
                                    break;
                                }
                            }

                            while (reader.Position < reader.Length)
                            {
                                GameObject.Find("RedLaserGun").transform.rotation = new Quaternion(reader.ReadSingle(),
                                                                                                   reader.ReadSingle(),
                                                                                                   reader.ReadSingle(),
                                                                                                   reader.ReadSingle());
                                GameObject.Find("BlueLaserGun").transform.rotation = new Quaternion(reader.ReadSingle(),
                                                                                                    reader.ReadSingle(),
                                                                                                    reader.ReadSingle(),
                                                                                                    reader.ReadSingle());
                            }
                            StartCoroutine(TurnEnd());
                        }
                    }
                    else if (message.Tag == Tags.ChangeLaserDirectionTag)
                    {
                        while (reader.Position < reader.Length)
                        {
                            GameObject.Find("RedLaserGun").transform.rotation = new Quaternion(reader.ReadSingle(),
                                                                                               reader.ReadSingle(),
                                                                                               reader.ReadSingle(),
                                                                                               reader.ReadSingle());
                            GameObject.Find("BlueLaserGun").transform.rotation = new Quaternion(reader.ReadSingle(),
                                                                                                reader.ReadSingle(),
                                                                                                reader.ReadSingle(),
                                                                                                reader.ReadSingle());
                        }
                    }
                }
            }
        }
Exemple #14
0
    void MessageReceived(object sender, MessageReceivedEventArgs e)
    {
        using (Message message = e.GetMessage() as Message)
        {
            using (DarkRiftReader reader = message.GetReader())
            {
                switch (message.Tag)
                {
                //// Byte[] 압축 수신일 경우
                //case MessageTags.VIDEO_STREAMING:
                //    {
                //        uint checkflag = reader.ReadUInt32();
                //        short uid = reader.ReadInt16();

                //        MemoryStream input = new MemoryStream(reader.ReadBytes());
                //        MemoryStream output = new MemoryStream();
                //        using (DeflateStream dstream = new DeflateStream(input, CompressionMode.Decompress))
                //        {
                //            dstream.CopyTo(output);
                //        }
                //        SetCameraTexture(output.ToArray());
                //    }
                //    break;

                //// LOGIC  (DeflateStream Byte[]분할 수신일 경우)
                case MessageTags.VIDEO_STREAMING:
                {
                    uint  checkflag  = reader.ReadUInt32();
                    short uid        = reader.ReadInt16();
                    int   numOfDatas = reader.ReadInt32();
                    var   idx        = reader.ReadInt32();

                    if (idx == 0)
                    {
                        textureByteData.Clear();
                    }

                    textureByteData.AddRange(reader.ReadBytes());

                    if (idx == numOfDatas)
                    {
                        Debug.Log(textureByteData.Count);
                        MemoryStream input  = new MemoryStream(textureByteData.ToArray());
                        MemoryStream output = new MemoryStream();
                        using (DeflateStream dstream = new DeflateStream(input, CompressionMode.Decompress))
                        {
                            dstream.CopyTo(output);
                        }
                        SetCameraTexture(output.ToArray());
                    }
                }
                break;

                    //// LOGIC  (BitConverter Byte[]분할 수신일 경우)
                    //case MessageTags.VIDEO_STREAMING:
                    //    {
                    //        uint checkflag = reader.ReadUInt32();
                    //        short uid = reader.ReadInt16();
                    //        int numOfDatas = reader.ReadInt32();
                    //        var idx = reader.ReadInt32();

                    //        if (idx == 0)
                    //        {
                    //            textureByteData.Clear();
                    //        }

                    //        textureByteData.AddRange(reader.ReadBytes());

                    //        if (idx == numOfDatas)
                    //        {
                    //            MemoryStream ms = new MemoryStream();
                    //            var gzBuffer = textureByteData.ToArray();
                    //            int msgLength = BitConverter.ToInt32(gzBuffer, 0);
                    //            ms.Write(gzBuffer, 4, gzBuffer.Length - 4);

                    //            byte[] buffer = new byte[msgLength];

                    //            ms.Position = 0;
                    //            GZipStream zip = new GZipStream(ms, CompressionMode.Decompress);
                    //            zip.Read(buffer, 0, buffer.Length);

                    //            SetCameraTexture(buffer);
                    //        }
                    //    }
                    //    break;
                }
            }
        }
    }
Exemple #15
0
    void ClientMessageReceived(object sender, MessageReceivedEventArgs e)
    {
        //Messages with TRAIN_TAG are for spawning train cars
        if (e.GetMessage().Tag == TRAIN_TAG)
        {
            using (Message message = e.GetMessage())
                using (DarkRiftReader reader = message.GetReader())
                {
                    int carCount = reader.ReadInt32();
                    for (int i = 0; i < carCount; i++)
                    {
                        ushort carID   = reader.ReadUInt16();
                        ushort carType = reader.ReadUInt16();

                        GameObject newCar;
                        switch (carType)
                        {
                        case ENGINE:
                            newCar = Instantiate(enginePrefab);
                            break;

                        case DEFAULT_CAR:
                            newCar = Instantiate(carPrefab);
                            break;

                        case CABOOSE:
                            newCar = Instantiate(caboosePrefab);
                            break;

                        case KITCHEN_CAR:
                            newCar = Instantiate(kitchencarPrefab);
                            break;

                        default:
                            newCar = Instantiate(carPrefab);
                            break;
                        }

                        newCar.transform.parent        = train.transform;
                        newCar.transform.rotation      = Quaternion.identity;
                        newCar.transform.localPosition = new Vector3(0, 2.9f, -16.13f + 16.13f * i);
                        newCar.GetComponent <NetworkTrackable>().uniqueID = carID;
                        cars.Add(carID, newCar.transform);
                    }
                }
            SpawnedTrains = true;
        }
        //Message with OBJECT_TAG are for spawning Interactable Objects
        else if (e.GetMessage().Tag == OBJECT_TAG)
        {
            using (Message message = e.GetMessage())
                using (DarkRiftReader reader = message.GetReader())
                {
                    int objectCount = reader.ReadInt32();

                    for (int i = 0; i < objectCount; i++)
                    {
                        ushort  objID         = reader.ReadUInt16();
                        ushort  objType       = reader.ReadUInt16();
                        Vector3 localPosition = new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
                        Vector3 eulerRotation = new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());

                        NetworkObject netObj = new NetworkObject(objID, objType, localPosition, eulerRotation);
                        objects.Add(objID, netObj);
                    }
                }
            initializedObjects = true;
        }
        //Messages with PICKUP_TAG contain the new position and rotation of an object with "Pickup" attached
        else if (e.GetMessage().Tag == PICKUP_TAG)
        {
            using (Message message = e.GetMessage())
                using (DarkRiftReader reader = message.GetReader())
                {
                    ushort objID = reader.ReadUInt16();
                    if (objects.ContainsKey(objID))
                    {
                        GameObject obj = objects[objID].gObj;
                        Vector3    newLocalPosition = new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());

                        float angleX = reader.ReadSingle();
                        float angleY = reader.ReadSingle();
                        float angleZ = reader.ReadSingle();

                        obj.transform.localPosition             = newLocalPosition;
                        obj.GetComponent <Pickup>().lastPostion = newLocalPosition;
                        Vector3 newRotation = new Vector3(angleX, angleY, angleZ);
                        obj.transform.eulerAngles = newRotation;

                        objects[objID].localPosition = newLocalPosition;
                        objects[objID].rotation      = newRotation;
                    }
                }
        }
        //Messages with USE_TAG contain the new use state of an interactable object
        else if (e.GetMessage().Tag == USE_TAG)
        {
            using (Message message = e.GetMessage())
                using (DarkRiftReader reader = message.GetReader())
                {
                    ushort objID = reader.ReadUInt16();
                    if (objects.ContainsKey(objID))
                    {
                        GameObject obj    = objects[objID].gObj;
                        ushort     useTag = reader.ReadUInt16();

                        switch (useTag)
                        {
                        case START_USE:
                            obj.GetComponent <Interactable>().StartUse();
                            break;

                        case DURING_USE:
                            obj.GetComponent <Interactable>().DuringUse();
                            break;

                        case AFTER_USE:
                            obj.GetComponent <Interactable>().AfterUse();
                            break;

                        case ABORT_USE:
                            obj.GetComponent <Interactable>().AbortUse();
                            break;
                        }
                    }
                    else
                    {
                        Debug.LogWarning("Warning, received ID does not match an object");
                    }
                }
        }
        else if (e.GetMessage().Tag == NUM_PLAYERS_TAG)
        {
            using (Message message = e.GetMessage())
                using (DarkRiftReader reader = message.GetReader())
                {
                    int numPlayers = reader.ReadInt32();
                    numPlayerText.text = "Players: " + numPlayers.ToString();
                }
        }
        else if (e.GetMessage().Tag == DESTROY_OBJ_TAG)
        {
            using (Message message = e.GetMessage())
                using (DarkRiftReader reader = message.GetReader())
                {
                    ushort     objID     = reader.ReadUInt16();
                    GameObject toDestroy = objects[objID].gObj;
                    Destroy(toDestroy);
                    objects.Remove(objID);
                }
        }
        else if (e.GetMessage().Tag == SPAWN_OBJ_TAG)
        {
            using (Message message = e.GetMessage())
                using (DarkRiftReader reader = message.GetReader())
                {
                    ushort  objID         = reader.ReadUInt16();
                    ushort  objType       = reader.ReadUInt16();
                    Vector3 localPosition = new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
                    Vector3 eulerRotation = new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());

                    NetworkObject netObj = new NetworkObject(objID, objType, localPosition, eulerRotation);


                    GameObject newObj;
                    switch (netObj.ObjType)
                    {
                    case 0:
                        newObj = Instantiate(testInteractablePrefab, train.transform.TransformPoint(netObj.localPosition), Quaternion.Euler(netObj.rotation.x, netObj.rotation.y, netObj.rotation.z), train.transform);
                        break;

                    case 1:
                        newObj = Instantiate(testPickupPrefab, train.transform.TransformPoint(netObj.localPosition), Quaternion.Euler(netObj.rotation.x, netObj.rotation.y, netObj.rotation.z), train.transform);
                        newObj.GetComponent <Pickup>().lastPostion = train.transform.InverseTransformPoint(netObj.localPosition);
                        newObj.GetComponent <Pickup>().ID          = netObj.ID;
                        break;

                    default:
                        newObj = Instantiate(testInteractablePrefab, train.transform.TransformPoint(netObj.localPosition), Quaternion.Euler(netObj.rotation.x, netObj.rotation.y, netObj.rotation.z), train.transform);
                        break;
                    }

                    newObj.GetComponent <NetworkTrackable>().uniqueID = netObj.ID;
                    objects.Add(objID, netObj);
                }
        }
    }
Exemple #16
0
        private void Client_MessageReceived(object sender, MessageReceivedEventArgs e)
        {
            try
            {
                using (Message message = e.GetMessage())
                    using (DarkRiftReader reader = message.GetReader())
                    {
                        OpCodes opCode = (OpCodes)message.Tag;

                        if (opCode != OpCodes.AuthenticationResponse && pendingConnections.Contains(e.Client.ID))
                        {
                            pendingConnections.Remove(e.Client.ID);
                            LeaveRoom(e.Client.ID);
                            e.Client.Disconnect();
                            return;
                        }

                        switch (opCode)
                        {
                        case OpCodes.UpdateRoomData:
                            string extraData     = reader.ReadString();
                            int    newMaxPlayers = reader.ReadInt32();
                            UpdateRoomData(e, extraData, newMaxPlayers);
                            break;

                        case OpCodes.AuthenticationResponse:
                            if (reader.ReadString() == authKey)
                            {
                                pendingConnections.Remove(e.Client.ID);
                                using (DarkRiftWriter writer = DarkRiftWriter.Create())
                                {
                                    using (Message sendAuthed = Message.Create((ushort)OpCodes.Authenticated, writer))
                                        e.Client.SendMessage(sendAuthed, SendMode.Reliable);
                                }
                            }
                            else
                            {
                                pendingConnections.Remove(e.Client.ID);
                                LeaveRoom(e.Client.ID);
                                e.Client.Disconnect();
                            }
                            break;

                        case OpCodes.RequestID:
                            SendClientID(e);
                            break;

                        case OpCodes.CreateRoom:
                            CreateRoom(e, reader.ReadInt32(), reader.ReadString(), reader.ReadBoolean(), reader.ReadString(), reader.ReadBoolean(), reader.ReadString());
                            break;

                        case OpCodes.JoinServer:
                            ushort hostID        = reader.ReadUInt16();
                            bool   useRelay      = reader.ReadBoolean();
                            string clientLocalIP = reader.ReadString();
                            JoinRoom(e, hostID, useRelay, clientLocalIP);
                            break;

                        case OpCodes.SendData:
                            byte[] readBuffer = readBuffers.Rent(reader.ReadInt32());
                            reader.ReadBytesInto(readBuffer, 0);
                            ProcessData(e, reader, readBuffer, readBuffer.Length);
                            break;

                        case OpCodes.LeaveRoom:
                            LeaveRoom(e.Client);
                            break;

                        case OpCodes.KickPlayer:
                            ushort clientID = reader.ReadUInt16();
                            LeaveRoom(clientID, e.Client.ID);
                            break;

                        case OpCodes.RequestServers:
                            SendServerList(e);
                            break;
                        }
                    }
            }
            catch
            {
                // Do disconnect/kick maybe later if they do be acting up.
            }
        }
    private void Client_MessageReceived(object sender, DarkRift.Client.MessageReceivedEventArgs e)
    {
        try
        {
            using (Message message = e.GetMessage())
                using (DarkRiftReader reader = message.GetReader())
                {
                    OpCodes opCode = (OpCodes)message.Tag;
                    switch (opCode)
                    {
                    case OpCodes.ServerConnectionData:
                        string serverIP = reader.ReadString();

                        if (directConnectModule == null)
                        {
                            directConnectAddress = "";
                            return;
                        }

                        directConnectAddress = serverIP;
                        if (showDebugLogs)
                        {
                            Debug.Log("Received direct connect info from server.");
                        }
                        break;

                    case OpCodes.Authenticated:
                        isAuthenticated = true;
                        if (showDebugLogs)
                        {
                            Debug.Log("Authenticated with server.");
                        }
                        break;

                    case OpCodes.AuthenticationRequest:
                        using (DarkRiftWriter writer = DarkRiftWriter.Create())
                        {
                            writer.Write(relayPassword);
                            using (Message sendAuthenticationResponse = Message.Create((ushort)OpCodes.AuthenticationResponse, writer))
                                drClient.Client.SendMessage(sendAuthenticationResponse, SendMode.Reliable);
                        }
                        if (showDebugLogs)
                        {
                            Debug.Log("Server requested authentication key.");
                        }
                        break;

                    case OpCodes.GetData:
                        int    dataLength   = reader.ReadInt32();
                        byte[] receivedData = new byte[dataLength];
                        System.Buffer.BlockCopy(reader.ReadBytes(), 0, receivedData, 0, dataLength);

                        if (isServer)
                        {
                            OnServerDataReceived?.Invoke(connectedRelayClients.GetByFirst(reader.ReadUInt16()), new ArraySegment <byte>(receivedData), e.SendMode == SendMode.Unreliable ? 1 : 0);
                        }

                        if (isClient)
                        {
                            OnClientDataReceived?.Invoke(new ArraySegment <byte>(receivedData), e.SendMode == SendMode.Unreliable ? 1 : 0);
                        }

                        break;

                    case OpCodes.ServerLeft:

                        if (isClient)
                        {
                            isClient = false;
                            OnClientDisconnected?.Invoke();
                        }

                        break;

                    case OpCodes.PlayerDisconnected:

                        if (isServer)
                        {
                            ushort user = reader.ReadUInt16();
                            OnServerDisconnected?.Invoke(connectedRelayClients.GetByFirst(user));
                            connectedRelayClients.Remove(user);
                            if (showDebugLogs)
                            {
                                Debug.Log($"Client {user} left room.");
                            }
                        }

                        break;

                    case OpCodes.RoomCreated:
                        serverID    = reader.ReadUInt16();
                        isConnected = true;
                        if (showDebugLogs)
                        {
                            Debug.Log("Server Created on relay.");
                        }
                        break;

                    case OpCodes.ServerJoined:
                        ushort clientID = reader.ReadUInt16();

                        if (isClient)
                        {
                            isConnected = true;
                            OnClientConnected?.Invoke();
                            if (showDebugLogs)
                            {
                                Debug.Log("Successfully joined server.");
                            }
                        }

                        if (isServer)
                        {
                            connectedRelayClients.Add(clientID, currentMemberID);
                            OnServerConnected?.Invoke(currentMemberID);
                            currentMemberID++;
                            if (showDebugLogs)
                            {
                                Debug.Log($"Client {clientID} joined the server.");
                            }
                        }
                        break;

                    case OpCodes.ServerListResponse:
                        int serverListCount = reader.ReadInt32();
                        relayServerList.Clear();
                        for (int i = 0; i < serverListCount; i++)
                        {
                            relayServerList.Add(new RelayServerInfo()
                            {
                                serverName     = reader.ReadString(),
                                currentPlayers = reader.ReadInt32(),
                                maxPlayers     = reader.ReadInt32(),
                                serverID       = reader.ReadUInt16(),
                                serverData     = reader.ReadString()
                            });
                        }
                        serverListUpdated?.Invoke();
                        if (showDebugLogs)
                        {
                            Debug.Log("Received Server List.");
                        }
                        break;
                    }
                }
        }
        catch
        {
            // Server shouldnt send messed up data but we do have an unreliable channel, so eh.
        }
    }
Exemple #18
0
    public void OnDataRecieved(byte tag, ushort subject, object data)
    {
        if (tag == (byte)TagsNSubjects.Tags.MATCHMAKING_TAG)
        {
            if (subject == (ushort)TagsNSubjects.MatchmakingSubjects.OPPONENTSLIST)
            {
                using (DarkRiftReader reader = data as DarkRiftReader) {
                    int n;
                    n = reader.ReadInt32();
                    string[] nn = new string[n];
                    nn = reader.ReadStrings();
                    Globalmanager.availablePlayers.Clear();
                    Globalmanager.availablePlayers.AddRange(nn);
                    Globalmanager.availablePlayersUpdated = true;
                }
            }
        }

        if (tag == (byte)TagsNSubjects.Tags.CARDTAG)
        {
            if (subject == (ushort)TagsNSubjects.CardSubjects.AVAILABLECARDS)
            {
                using (DarkRiftReader reader = data as DarkRiftReader) {
                    ushort n;
                    n = reader.ReadUInt16();
                    List <ushort> cardIds = new List <ushort> ();
                    for (int i = 0; i < n; i++)
                    {
                        cardIds.Add(reader.ReadUInt16());
                    }
                    Globalmanager.availableCards.Clear();
                    Globalmanager.availableCards.AddRange(cardIds);
                    Globalmanager.availableCardsUpdated = true;
                }
            }
        }

        if (tag == (byte)TagsNSubjects.Tags.MATCHMAKING_TAG)
        {
            if (subject == (ushort)TagsNSubjects.MatchmakingSubjects.CHALLENGE)
            {
                string challenger;
                using (DarkRiftReader reader = data as DarkRiftReader) {
                    challenger = reader.ReadString();
                }
                StartCoroutine(Challenge(challenger));
            }

            if (subject == (ushort)TagsNSubjects.MatchmakingSubjects.GAMESTART)
            {
                SceneManager.LoadScene("Game");
                using (DarkRiftReader reader = data as DarkRiftReader) {
                    List <ushort> deck1 = new List <ushort> ();
                    List <ushort> deck2 = new List <ushort> ();
                    for (int i = 0; i < Globalmanager.deckSize; i++)
                    {
                        deck1.Add(reader.ReadUInt16());
                    }
                    for (int i = 0; i < Globalmanager.deckSize; i++)
                    {
                        deck2.Add(reader.ReadUInt16());
                    }
                    Globalmanager.deckList1         = deck1;
                    Globalmanager.deckList2         = deck2;
                    Globalmanager.deckListsRecieved = true;
                }
            }

            if (subject == (ushort)TagsNSubjects.MatchmakingSubjects.GAMESTARTFAILED)
            {
                Error.Instance.PopUp("Opponent Not Found");
            }
        }
    }
Exemple #19
0
        void ItemMessageReceived(object sender, MessageReceivedEventArgs e)
        {
            using (Message message = e.GetMessage() as Message)
            {
                // Client wants to add item to container
                if (message.Tag == Tags.AddItemToContainerTag)
                {
                    using (DarkRiftReader reader = message.GetReader())
                    {
                        int    networkID = reader.ReadInt32();
                        string itemName  = reader.ReadString();
                        int    amount    = reader.ReadInt32();

                        NetworkItemContainer.itemContainerDictionary[networkID].AddItem(CreateItem(itemName, amount));

                        using (Message newMessage = Message.Create(Tags.AddItemToContainerTag, NetworkItemContainer.itemContainerDictionary[networkID]))
                        {
                            foreach (IClient c in ClientManager.GetAllClients())
                            {
                                c.SendMessage(newMessage, SendMode.Reliable);
                            }
                        }
                    }
                }

                // Client wants to delete item from container
                if (message.Tag == Tags.DeleteItemFromContainerTag)
                {
                    using (DarkRiftReader reader = message.GetReader())
                    {
                        int    networkID = reader.ReadInt32();
                        string itemName  = reader.ReadString();
                        int    amount    = reader.ReadInt32();

                        NetworkItemContainer.itemContainerDictionary[networkID].DeleteItem(CreateItem(itemName, amount));

                        using (Message newMessage = Message.Create(Tags.DeleteItemFromContainerTag, NetworkItemContainer.itemContainerDictionary[networkID]))
                        {
                            foreach (IClient c in ClientManager.GetAllClients())
                            {
                                c.SendMessage(newMessage, SendMode.Reliable);
                            }
                        }
                    }
                }

                // Client wants to transfer item from one container to another
                if (message.Tag == Tags.TransferItemBetweenContainersTag)
                {
                    using (DarkRiftReader reader = message.GetReader())
                    {
                        int    fromContainerNetworkID = reader.ReadInt32();
                        int    toContainerNetworkID   = reader.ReadInt32();
                        string itemName = reader.ReadString();
                        int    amount   = reader.ReadInt32();

                        TransferItemBetweenContainers(CreateItem(itemName, amount), NetworkItemContainer.itemContainerDictionary[fromContainerNetworkID], NetworkItemContainer.itemContainerDictionary[toContainerNetworkID]);

                        // Update the donor container
                        using (Message newMessage = Message.Create(Tags.TransferItemBetweenContainersTag, NetworkItemContainer.itemContainerDictionary[fromContainerNetworkID]))
                        {
                            foreach (IClient c in ClientManager.GetAllClients())
                            {
                                c.SendMessage(newMessage, SendMode.Reliable);
                            }
                        }

                        // Update the receiver container
                        using (Message newMessage = Message.Create(Tags.TransferItemBetweenContainersTag, NetworkItemContainer.itemContainerDictionary[toContainerNetworkID]))
                        {
                            foreach (IClient c in ClientManager.GetAllClients())
                            {
                                c.SendMessage(newMessage, SendMode.Reliable);
                            }
                        }
                    }
                }
            }
        }