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; } }
/// <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(); }