Пример #1
0
        public void TestMessageReadDefaults()
        {
            // Make sure reading past the end of a message will apply defaults.
            IncomingMessage incomingMsg;

            using (var outgoingMsg = new OutgoingMessage())
            {
                incomingMsg = new IncomingMessage(outgoingMsg.ToByteArray());
            }

            Assert.AreEqual(false, incomingMsg.ReadBoolean());
            Assert.AreEqual(true, incomingMsg.ReadBoolean(defaultValue: true));

            Assert.AreEqual(0, incomingMsg.ReadInt32());
            Assert.AreEqual(42, incomingMsg.ReadInt32(defaultValue: 42));

            Assert.AreEqual(0.0f, incomingMsg.ReadFloat32());
            Assert.AreEqual(1337.0f, incomingMsg.ReadFloat32(defaultValue: 1337.0f));

            Assert.AreEqual(default(string), incomingMsg.ReadString());
            Assert.AreEqual("foo", incomingMsg.ReadString(defaultValue: "foo"));

            Assert.AreEqual(default(float[]), incomingMsg.ReadFloatList());
            Assert.AreEqual(new float[] { 1001, 1002 }, incomingMsg.ReadFloatList(new float[] { 1001, 1002 }));
        }
Пример #2
0
        public void TestMessageReadWrites()
        {
            var boolVal      = true;
            var intVal       = 1337;
            var floatVal     = 4.2f;
            var floatListVal = new float[] { 1001, 1002 };
            var stringVal    = "mlagents!";

            IncomingMessage incomingMsg;

            using (var outgoingMsg = new OutgoingMessage())
            {
                outgoingMsg.WriteBoolean(boolVal);
                outgoingMsg.WriteInt32(intVal);
                outgoingMsg.WriteFloat32(floatVal);
                outgoingMsg.WriteString(stringVal);
                outgoingMsg.WriteFloatList(floatListVal);

                incomingMsg = new IncomingMessage(outgoingMsg.ToByteArray());
            }

            Assert.AreEqual(boolVal, incomingMsg.ReadBoolean());
            Assert.AreEqual(intVal, incomingMsg.ReadInt32());
            Assert.AreEqual(floatVal, incomingMsg.ReadFloat32());
            Assert.AreEqual(stringVal, incomingMsg.ReadString());
            Assert.AreEqual(floatListVal, incomingMsg.ReadFloatList());
        }
Пример #3
0
        public override void ReadSyncData(IncomingMessage m)
        {
            wo.SetMaxHealth(m.ReadSingle());
            wo.SetHealth(m.ReadSingle());

            ActionEnum act = (ActionEnum)m.ReadInt32();

            if (wo.GetAction() == ActionEnum.Move && act != ActionEnum.Move)
            {
                //We were moving and now we are not. Clearing the path
                Owner.FindComponent <MovementBehavior>().SetPathForClient(new List <LayerTile>());
            }
            //If its a building, and we have finished, recover it
            if (wo.GetAction() == ActionEnum.Build && act == ActionEnum.Idle && !wo.Mobile())
            {
                Owner.FindComponent <Sprite>().TintColor = Color.White;
            }



            wo.SetAction(act);

            wo.genericSpeed = m.ReadSingle();
            wo.attacking    = m.ReadBoolean();
            Player p = UIBehavior.ui.activePlayer;

            if (p != null && p.selectedWO == this.wo)
            {
                UIBehavior.ui.UpdateSpeedSlider();
            }
        }
 public void LocalNetworkConnection_OneMessage()
 {
     LocalNetworkConnection localNetworkConnectionA = new LocalNetworkConnection(1300);
     LocalNetworkConnection localNetworkConnectionB = localNetworkConnectionA.GetPairedNetworkConnection();
     {
         OutgoingMessage outgoingMessage = localNetworkConnectionA.GetOutgoingMessageToSend();
         Assert.AreEqual(1300, outgoingMessage.MessageData.Length);
         outgoingMessage.Write(true);
         outgoingMessage.Write(123);
         outgoingMessage.Write("yes");
         Assert.AreEqual(9, outgoingMessage.Length);
         localNetworkConnectionA.SendMessage(outgoingMessage);
     }
     {
         IncomingMessage incomingMessage = localNetworkConnectionB.GetNextIncomingMessage();
         Assert.IsNotNull(incomingMessage);
         Assert.AreEqual(1300, incomingMessage.MessageData.Length);
         Assert.AreEqual(9, incomingMessage.Length);
         Assert.AreEqual(0, incomingMessage.Position);
         Assert.AreEqual(true, incomingMessage.ReadBoolean());
         Assert.AreEqual(1, incomingMessage.Position);
         Assert.AreEqual(8, incomingMessage.BytesLeft);
         Assert.AreEqual(123, incomingMessage.ReadInt32());
         Assert.AreEqual(5, incomingMessage.Position);
         Assert.AreEqual(4, incomingMessage.BytesLeft);
         Assert.AreEqual("yes", incomingMessage.ReadString());
         Assert.AreEqual(9, incomingMessage.Position);
         Assert.AreEqual(0, incomingMessage.BytesLeft);
         Assert.IsNull(localNetworkConnectionB.GetNextIncomingMessage());
     }
 }
Пример #5
0
 /// <summary>
 /// Read this instance fields from an incoming message.
 /// </summary>
 /// <param name="incomingMessage">The incoming message</param>
 internal void Read(IncomingMessage incomingMessage)
 {
     this.RoomName   = incomingMessage.ReadString();
     this.IsVisible  = incomingMessage.ReadBoolean();
     this.MaxPlayers = incomingMessage.ReadByte();
     this.PropertiesListedInLobby = new HashSet <string>(incomingMessage.ReadStringArray());
 }
Пример #6
0
        private void ExecuteAction(object sender, IncomingMessage receivedMessage)
        {
            Entity owner = networkedScene.EntityManager.Find(receivedMessage.ReadString());
            Entity other = networkedScene.EntityManager.Find(receivedMessage.ReadString());

            if (owner != null && !owner.IsDisposed && other != null && !other.IsDisposed)
            {
                WorldObject wo  = owner.FindComponent <WorldObject>();
                CommandEnum cmd = (CommandEnum)receivedMessage.ReadInt32();
                foreach (ActionBehavior act in wo.allActions)
                {
                    if (act.GetCommand() == cmd)
                    {
                        bool store = receivedMessage.ReadBoolean();
                        if (store)
                        {
                            wo.EnqueueAction(() => act.Act(other.FindComponent <WorldObject>()));
                        }
                        else
                        {
                            act.Act(other.FindComponent <WorldObject>());
                        }
                        break;
                    }
                }
            }
        }
        public void LocalNetworkConnection_ManyMessages_Queued()
        {
            LocalNetworkConnection localNetworkConnectionA = new LocalNetworkConnection(1300);
            LocalNetworkConnection localNetworkConnectionB = localNetworkConnectionA.GetPairedNetworkConnection();

            for (int i = 0; i < 20; i++)
            {
                OutgoingMessage outgoingMessage = localNetworkConnectionA.GetOutgoingMessageToSend();
                outgoingMessage.Write(((i % 2) == 0));
                outgoingMessage.Write(i);
                outgoingMessage.Write(i / 2.0f);
                outgoingMessage.Write(i.ToString());
                localNetworkConnectionA.SendMessage(outgoingMessage);
            }
            for (int i = 0; i < 20; i++)
            {
                IncomingMessage incomingMessage = localNetworkConnectionB.GetNextIncomingMessage();
                Assert.IsNotNull(incomingMessage);
                Assert.AreEqual(0, incomingMessage.Position);
                Assert.AreEqual(((i % 2) == 0), incomingMessage.ReadBoolean());
                Assert.AreEqual(i, incomingMessage.ReadInt32());
                Assert.AreEqual(i / 2.0f, incomingMessage.ReadSingle());
                Assert.AreEqual(i.ToString(), incomingMessage.ReadString());
            }
            Assert.IsNull(localNetworkConnectionB.GetNextIncomingMessage());
        }
Пример #8
0
        /**
         * <summary>
         * Modifies the color or team of a player
         * </summary>
         */
        private void ChangePlayerData(object sender, IncomingMessage receivedMessage)
        {
            string playerIdentifier = receivedMessage.ReadString();
            int    dataType         = receivedMessage.ReadInt32();
            Entity ent = networkedScene.EntityManager.Find("playerInfo" + playerIdentifier);

            if (ent != null)
            {
                PlayerInfo info = ent.FindComponent <PlayerInfo>();
                bool       next = receivedMessage.ReadBoolean();
                switch (dataType)
                {
                case PlayerInfo.READY:
                    info.ready = !info.ready;
                    info.ChangeReady();

                    break;

                case PlayerInfo.COLOR:
                    if (!info.ready)
                    {
                        info.playerColor           = FindNextColor(info.playerColor);
                        info.nextColor.Text        = ClientDispatcher.colorNames[info.playerColor];
                        info.nextColor.Foreground  = ClientDispatcher.colors[info.playerColor];
                        info.nextColor.BorderColor = ClientDispatcher.colors[info.playerColor];
                    }
                    break;

                case PlayerInfo.TEAM:
                    if (!info.ready)
                    {
                        if (next)
                        {
                            info.playerTeam = info.playerTeam + 1;
                            if (info.playerTeam >= ids.Count)
                            {
                                info.playerTeam = -1;
                            }
                        }
                        else
                        {
                            if (info.playerTeam == -1)
                            {
                                info.playerTeam = info.playerTeam + ids.Count;
                            }
                            else
                            {
                                info.playerTeam = info.playerTeam - 1;
                            }
                        }
                        info.textTeam.Text = info.playerTeam == -1 ? "No team" : "Team " + info.playerTeam;
                    }
                    break;

                default:
                    break;
                }
            }
        }
Пример #9
0
 /// <summary>
 /// Reads the synchronize data.
 /// </summary>
 /// <param name="reader">The reader.</param>
 internal void ReadSyncData(IncomingMessage reader)
 {
     for (int componentIndex = 0; componentIndex < this.NetworkSyncComponents.Length; componentIndex++)
     {
         if (reader.ReadBoolean())
         {
             var component = this.NetworkSyncComponents[componentIndex];
             component.ReadSyncData(reader);
         }
     }
 }
Пример #10
0
        public override void ReadSyncData(IncomingMessage binaryReader)
        {
            player.playerColor = binaryReader.ReadInt32();
            player.playerTeam  = binaryReader.ReadInt32();

            player.nextColor.Text        = ClientDispatcher.colorNames[player.playerColor];
            player.textTeam.Text         = player.playerTeam == -1 ? "No team" : "Team " + player.playerTeam;
            player.nextColor.Foreground  = ClientDispatcher.colors[player.playerColor];
            player.nextColor.BorderColor = ClientDispatcher.colors[player.playerColor];

            player.ready = binaryReader.ReadBoolean();
            player.ChangeReady();
        }
Пример #11
0
        public override void ReadSyncData(IncomingMessage binaryReader)
        {
            int nChanges = binaryReader.ReadInt32();

            for (int i = 0; i < nChanges; i++)
            {
                int changeType = binaryReader.ReadInt32();
                int x          = binaryReader.ReadInt32();
                int y          = binaryReader.ReadInt32();
                if (changeType == OCCUPIED)
                {
                    map.SetTileOccupied(x, y, binaryReader.ReadBoolean());
                }
                else
                {
                    string woName = binaryReader.ReadString();
                    if (string.IsNullOrEmpty(woName))
                    {
                        if (changeType == MOBILE)
                        {
                            map.SetMobile(x, y, null);
                        }
                        else if (changeType == WO)
                        {
                            map.SetWorldObject(x, y, null);
                        }
                    }

                    else
                    {
                        Entity ent = EntityManager.Find(woName);
                        if (ent != null)
                        {
                            if (changeType == MOBILE)
                            {
                                map.SetMobile(x, y, ent.FindComponent <WorldObject>());
                            }
                            else if (changeType == WO)
                            {
                                map.SetWorldObject(x, y, ent.FindComponent <WorldObject>());
                            }
                        }
                        else
                        {
                            recover.AddChange(x, y, woName, changeType);
                        }
                    }
                }
            }
        }
Пример #12
0
        public void OutgoingAndIncoming_Boolean()
        {
            byte[]          data            = new byte[256];
            OutgoingMessage outgoingMessage = new OutgoingMessage(data);

            Assert.AreEqual(0, outgoingMessage.Length);
            for (int value = byte.MinValue; value <= byte.MaxValue; value++)
            {
                outgoingMessage.Write(((value % 2) == 0));
            }
            Assert.AreEqual(data.Length, outgoingMessage.Length);
            IncomingMessage incomingMessage = new IncomingMessage(data);

            for (int value = byte.MinValue; value <= byte.MaxValue; value++)
            {
                Assert.AreEqual(((value % 2) == 0), incomingMessage.ReadBoolean());
            }
        }
Пример #13
0
        /// <summary>
        /// Refresh the player fields based on the given message.
        /// </summary>
        /// <param name="message">The received message</param>
        internal void ReadFromMessage(IncomingMessage message)
        {
            var changedFields = (RoomFieldsFlags)message.ReadByte();

            if (changedFields.HasFlag(RoomFieldsFlags.IsVisible))
            {
                this.IsVisible = message.ReadBoolean();
            }

            if (changedFields.HasFlag(RoomFieldsFlags.MaxPlayers))
            {
                this.MaxPlayers = message.ReadByte();
            }

            if (changedFields.HasFlag(RoomFieldsFlags.CustomProperties))
            {
                this.CustomProperties.ReadFromMessage(message);
            }

            this.OnChange(changedFields);
        }
Пример #14
0
        private void Move(object sender, IncomingMessage receivedMessage)
        {
            Entity owner = networkedScene.EntityManager.Find(receivedMessage.ReadString());

            if (owner != null && !owner.IsDisposed)
            {
                bool recalculate = receivedMessage.ReadBoolean();
                int  pathLength  = receivedMessage.ReadInt32();
                Trace.WriteLine("moving tiles:" + pathLength);
                MovementBehavior movement = owner.FindComponent <MovementBehavior>();

                if (movement != null && pathLength > 1)
                {
                    List <LayerTile> path      = new List <LayerTile>(pathLength);
                    bool             validPath = true;
                    Map map = Map.map;
                    //First tile
                    path.Add(map.GetTileByMapCoordinates(receivedMessage.ReadInt32(), receivedMessage.ReadInt32()));
                    for (int i = 1; i < pathLength; i++)
                    {
                        LayerTile tile = map.GetTileByMapCoordinates(receivedMessage.ReadInt32(), receivedMessage.ReadInt32());

                        if (tile != null && !path.Contains(tile) && map.Adjacent(tile, path[i - 1])) //Cuando haya restricciones para pasar por una casilla se deben añadir también aquí
                        {
                            path.Add(tile);
                        }
                        else
                        {
                            validPath = false;
                            break;
                        }
                    }

                    if (validPath)
                    {
                        NewPath(owner, movement, path, recalculate);
                    }
                }
            }
        }
 public void LocalNetworkConnection_TwoMessages()
 {
     LocalNetworkConnection localNetworkConnectionA = new LocalNetworkConnection(1300);
     LocalNetworkConnection localNetworkConnectionB = localNetworkConnectionA.GetPairedNetworkConnection();
     {
         OutgoingMessage outgoingMessage = localNetworkConnectionA.GetOutgoingMessageToSend();
         Assert.AreEqual(1300, outgoingMessage.MessageData.Length);
         outgoingMessage.Write(true);
         outgoingMessage.Write(100.1f);
         outgoingMessage.Write("yes");
         localNetworkConnectionA.SendMessage(outgoingMessage);
     }
     {
         OutgoingMessage outgoingMessage = localNetworkConnectionA.GetOutgoingMessageToSend();
         Assert.AreEqual(1300, outgoingMessage.MessageData.Length);
         outgoingMessage.Write(false);
         outgoingMessage.Write(200.2f);
         outgoingMessage.Write("no");
         outgoingMessage.Write(123);
         localNetworkConnectionA.SendMessage(outgoingMessage);
     }
     {
         IncomingMessage incomingMessage = localNetworkConnectionB.GetNextIncomingMessage();
         Assert.IsNotNull(incomingMessage);
         Assert.AreEqual(1300, incomingMessage.MessageData.Length);
         Assert.AreEqual(true, incomingMessage.ReadBoolean());
         Assert.AreEqual(100.1f, incomingMessage.ReadSingle());
         Assert.AreEqual("yes", incomingMessage.ReadString());
     }
     {
         IncomingMessage incomingMessage = localNetworkConnectionB.GetNextIncomingMessage();
         Assert.IsNotNull(incomingMessage);
         Assert.AreEqual(1300, incomingMessage.MessageData.Length);
         Assert.AreEqual(false, incomingMessage.ReadBoolean());
         Assert.AreEqual(200.2f, incomingMessage.ReadSingle());
         Assert.AreEqual("no", incomingMessage.ReadString());
         Assert.AreEqual(123, incomingMessage.ReadInt32());
         Assert.IsNull(localNetworkConnectionB.GetNextIncomingMessage());
     }
 }
Пример #16
0
        public void ClientMessageDispatcher(object sender, IncomingMessage receivedMessage)
        {
            if (networkedScene.IsDisposed)
            {
                return;
            }
            int messageType = receivedMessage.ReadInt32();

            switch (messageType)
            {
            case KICK:
                KickClient(sender, receivedMessage);
                break;

            case ADD_PLAYER:
                ClientNewPlayer(sender, receivedMessage);
                break;

            case NEW_PLAYER:
                NewPlayerInfo(sender, receivedMessage);
                break;

            case REMOVE_PLAYER:
                RemovePlayerInfo(sender, receivedMessage);
                break;

            case UI:
                SetAllElementsAndStart(receivedMessage.ReadBoolean());
                break;

            case ADD_WO:
                if (!networkedScene.isHost)
                {
                    ReceiveWOMessage(sender, receivedMessage);
                }
                break;

            case ADD_CASTLE:
                if (!networkedScene.isHost)
                {
                    ReceiveCastleMessage(sender, receivedMessage);
                }
                break;

            case DESTROY_WO:
                if (!networkedScene.isHost)
                {
                    DestroyWO(sender, receivedMessage);
                }
                break;

            case SYNC:
                if (!networkedScene.isHost)
                {
                    Synchro(sender, receivedMessage);
                }
                break;

            case MOVE:
                if (!networkedScene.isHost)
                {
                    SynchroPath(sender, receivedMessage);
                }
                break;

            case FINISH:
                UIBehavior.ui.Owner.FindComponent <VictoryBehavior>().Finish(receivedMessage.ReadString(), receivedMessage.ReadString());
                break;

            default:
                Trace.WriteLine("Mensaje erróneo recibido desde el servidor");
                break;
            }
        }