Exemplo n.º 1
0
        static private Client CreateRandomClient()
        {
            var random = new Random();

            var clientId = random.Next(1000, 999999);
            var password = random.Next(1000, 999999).ToString();

            var nameList = new List <string> {
                "Juan Pérez", "Rodrigo Noya", "Fabián Flores", "Manuel Ramírez"
            };
            var nameIndex = random.Next(nameList.Count);
            var name      = nameList[nameIndex];

            ClientSegment clientSegment = random.NextDouble() < 0.75 ? ClientSegment.Selecta : ClientSegment.VIP;

            Client client = new Client()
            {
                ClientId = clientId,
                Password = password,
                Name     = name,
                Segment  = clientSegment
            };

            return(client);
        }
            public void ProcessReceivedMessage(Connection connection, ref byte messageCode, ref byte[] data)
            {
                switch (messageCode)
                {
                case MessageCodes.Chat:
                    string chatMessage = Encoding.ASCII.GetString(data, 1, data[0]);
                    ChatMessage(connection, chatMessage);
                    break;

                case MessageCodes.Disconnecting:
                    string reason = Encoding.ASCII.GetString(data, 1, data[0]);

                    DisconnectingNotification(connection, reason);
                    break;

                case MessageCodes.EntityCreateUpdate:
                    Entity entity = Entity.CreateFromByteArray(data);

                    EntityCreateOrUpdateNotification(connection, entity);
                    break;

                case MessageCodes.EntityDelete:
                    ushort deleteEntityId = BitConverter.ToUInt16(data, 0);

                    EntityDeleteNotification(connection, deleteEntityId);
                    break;

                case MessageCodes.FileDataExchangeAdd:
                    byte   addExchangeType = 0;
                    byte[] addHash         = null;
                    byte[] addFileData     = null;
                    FileDataExchangeUtils.ParseAddFileMessage(ref data, out addExchangeType, out addHash, out addFileData);

                    AddFile(connection, addExchangeType, addHash, addFileData);
                    break;

                case MessageCodes.FileDataExchangeRequest:
                    byte   requestExchangeType = 0;
                    byte[] requestHash         = null;
                    FileDataExchangeUtils.ParseCheckFileExistRequest(ref data, out requestExchangeType, out requestHash);

                    CheckFileExistRequest(connection, requestExchangeType, requestHash);
                    break;

                case MessageCodes.FileDataExchangeResponse:
                    byte   responseExchangeType = 0;
                    byte[] responseHash         = null;
                    bool   responseExists       = false;
                    FileDataExchangeUtils.ParseCheckFileExistResponse(ref data, out responseExchangeType, out responseHash, out responseExists);

                    CheckFileExistResponse(connection, responseExchangeType, responseHash, responseExists);
                    break;

                case MessageCodes.FileDataRequest:
                    byte   fileExchangeType = 0;
                    byte[] fileHash         = null;

                    FileDataExchangeUtils.ParseFileRequest(ref data, out fileExchangeType, out fileHash);

                    RequestFile(connection, fileExchangeType, fileHash);
                    break;

                case MessageCodes.GeneralNo:
                    break;

                case MessageCodes.GeneralYes:
                    break;

                case MessageCodes.Login:
                    byte   result               = data[0];
                    ushort entityId             = BitConverter.ToUInt16(data, 1);
                    byte   additionalInfoLength = data[3];
                    string additionalInfo       = null;
                    if (additionalInfoLength > 0)
                    {
                        additionalInfo = Encoding.ASCII.GetString(data, 4, additionalInfoLength);
                    }

                    LoginResponse(connection, result, entityId, additionalInfo);
                    break;

                case MessageCodes.Moved:
                    ushort  movedEntityId = BitConverter.ToUInt16(data, 0);
                    Point3D movedLocation = new Point3D();
                    movedLocation.InitializeFromByteArray(ref data, 2);
                    float movedRotationLeft = BitConverter.ToSingle(data, Point3D.SerializedSize + 2);
                    float movedRotationUp   = BitConverter.ToSingle(data, Point3D.SerializedSize + 6);
                    int   movedTime         = BitConverter.ToInt32(data, Point3D.SerializedSize + 10);

                    EntityMovedNotification(connection, movedEntityId, movedLocation, movedRotationLeft, movedRotationUp, movedTime);
                    break;

                case MessageCodes.Moving:
                    break;

                //case MessageCodes.MultipartCompressed:
                //   connection.ProcessMultipartMessage(ref data);
                //   break;
                case MessageCodes.PlaceOrRemoveCube:
                    bool   place      = (data[0] > 0);
                    int    key        = BitConverter.ToInt32(data, 1);
                    int    x          = BitConverter.ToInt32(data, 5);
                    int    y          = BitConverter.ToInt32(data, 9);
                    int    z          = BitConverter.ToInt32(data, 13);
                    ushort materialId = BitConverter.ToUInt16(data, 17);
                    uint   version    = BitConverter.ToUInt32(data, 19);

                    lock (_TerrainUpdateLock)
                    {
                        ClientSegment segment = ClientWorldManager.Instance.GetSegment(key);
                        if (segment != null)
                        {
                            PlaceOrRemoveCubeNotification(connection, place, segment, x, y, z, materialId, version);
                        }
                        else
                        {
                            if (!_DelayedSegmentUpdates.ContainsKey(key))
                            {
                                _DelayedSegmentUpdates.Add(key, new List <DelayedSegmentUpdate>());
                            }
                            _DelayedSegmentUpdates[key].Add(new DelayedSegmentUpdate()
                            {
                                MaterialID = materialId,
                                Place      = place,
                                SegmentKey = key,
                                Version    = version,
                                X          = x,
                                Y          = y,
                                Z          = z
                            });
                        }
                    }
                    break;

                case MessageCodes.Terrain:
                    int  terrainMessageId = BitConverter.ToInt32(data, 0);
                    byte current          = data[4];
                    byte total            = data[5];
                    int  areaCount        = data[6];

                    //Console.WriteLine("Received terrain data: terrainMessageId = {0}, current = {1}, total = {2}, areaCount = {3}", terrainMessageId, current, total, areaCount);

                    // clean areas prior to deserialization
                    lock (_TerrainUpdateLock)
                    {
                        ClientWorldManager.Instance.CleanAreas(ref terrainMessageId);
                    }

                    // deserialize the terrain
                    List <ClientArea> areas = new List <ClientArea>(areaCount);
                    int offset = 7;
                    for (int i = 0; i < areaCount; i++)
                    {
                        ClientArea area = new ClientArea();
                        area.InitializeFromByteArray <ClientSegment, ClientBox>(data, ref offset);
                        areas.Add(area);
                    }

                    TerrainDataResponse(connection, terrainMessageId, areas, current, total);
                    break;
                }
            }
Exemplo n.º 3
0
 /// <summary>
 /// Creates a box from given cube and segment owner.
 /// </summary>
 /// <param name="cube">Base cube</param>
 /// <param name="segment">Segment owner</param>
 public ClientBox(Cube cube, ClientSegment segment)
     : base(cube, segment)
 {
     OnInitialized();
 }