/// <summary> /// Ticks the VM one step. /// Should be called once every loop. /// </summary> public void Tick() { foreach (VirtualThread Thread in m_Threads) { Thread.Tick(); } m_TickCounter++; if (m_TickCounter == 4) { //TODO: Change ID... PacketStream SimulationStatePacket = new PacketStream(0x10, 0x00); SimulationStatePacket.WriteByte(0x10); //TODO: Change ID SimulationStatePacket.WriteByte((byte)m_TickCounter); //Number of ticks since last update. SimulationStatePacket.WriteInt32(m_Threads.Count); //Number of objects in this VM. BinaryFormatter BinFormatter = new BinaryFormatter(); foreach (VirtualThread VThread in m_Threads) BinFormatter.Serialize(SimulationStatePacket, VThread); //TODO: Compress packet... NewSimulationStateEvent(SimulationStatePacket); m_TickCounter = 0; } }
public static void HandleCharacterCreate(PacketStream P, CityClient Client) { byte PacketLength = (byte)P.ReadByte(); //Length of the unencrypted data, excluding the header (ID, length, unencrypted length). byte UnencryptedLength = (byte)P.ReadByte(); //Accountname isn't encrypted in this packet. string AccountName = P.ReadString(); PacketStream FetchKeyPack = new PacketStream(0x01, 00); FetchKeyPack.WriteString(AccountName); Client.Send(FetchKeyPack.ToArray()); //TODO: Wait until the key has been received... AResetEvent.WaitOne(); P.DecryptPacket(Client.EncKey, Client.CryptoService, UnencryptedLength); PacketStream OutPacket = new PacketStream(0x01, 0x00); OutPacket.WriteByte((byte)0x01); OutPacket.WriteByte((byte)AccountName.Length); OutPacket.Write(Encoding.ASCII.GetBytes(AccountName), 0, AccountName.Length); Logger.LogDebug("Received CharacterCreate!"); Guid ID = new Guid(); Sim Character = new Sim(ID.ToString()); Character.Timestamp = P.ReadString(); Character.Name = P.ReadString(); Character.Sex = P.ReadString(); //TODO: This should check if the character exists in the DB... Database.CreateCharacter(Character); }
/// <summary> /// The VM for this lot has ticked 5 ticks and compiled a /// SimulationState packet. /// </summary> /// <param name="Packet">The SimulationState packet.</param> private void m_VM_NewSimulationStateEvent(PacketStream Packet) { m_Owner.Send(Packet.ToArray()); foreach (CityClient Client in m_Clients) Client.Send(Packet.ToArray()); }
public static void HandleCreateSimulationObject(PacketStream P, ref CityClient C) { byte PacketLength = (byte)P.ReadByte(); //Length of the unencrypted data, excluding the header (ID, length, unencrypted length). byte UnencryptedLength = (byte)P.ReadByte(); BinaryFormatter BinFormatter = new BinaryFormatter(); SimulationObject CreatedSimObject = (SimulationObject)BinFormatter.Deserialize(P); //TODO: Add the object to the client's lot's VM... }
private void m_Listener_OnReceiveEvent(PacketStream P, CityClient Client) { byte ID = (byte)P.ReadByte(); switch (ID) { case 0x00: PacketHandlers.HandleCharacterCreate(P, Client); break; case 0x01: PacketHandlers.HandleClientKeyReceive(P, ref Client); break; } }
private void ReceiveCallback(IAsyncResult AR) { try { Socket Sock = (Socket)AR.AsyncState; int NumBytesRead = Sock.EndReceive(AR); Logger.LogInfo("Received: " + NumBytesRead + " bytes!"); byte[] TmpBuf = new byte[NumBytesRead]; Buffer.BlockCopy(m_RecvBuf, 0, TmpBuf, 0, NumBytesRead); //The packet is given an ID of 0x00 because its ID is currently unknown. PacketStream TempPacket = new PacketStream(0x00, NumBytesRead, TmpBuf); byte ID = TempPacket.PeekByte(0); int PacketLength = 0; bool FoundMatchingID = false; FoundMatchingID = FindMatchingPacketID(ID); if (FoundMatchingID) { PacketLength = m_PacketIDs[ID]; Logger.LogInfo("PacketLength: " + PacketLength); Logger.LogInfo("Found matching PacketID (" + ID + ")!\r\n\r\n"); if (NumBytesRead == PacketLength) { Logger.LogInfo("Got packet - exact length!\r\n\r\n"); m_RecvBuf = new byte[11024]; OnReceivedData(new PacketStream(ID, PacketLength, TempPacket.ToArray())); } else if (NumBytesRead < PacketLength) { m_TempPacket = new PacketStream(ID, PacketLength); byte[] TmpBuffer = new byte[NumBytesRead]; //Store the number of bytes that were read in the temporary buffer. Logger.LogInfo("Got data, but not a full packet - stored " + NumBytesRead.ToString() + "bytes!\r\n\r\n"); Buffer.BlockCopy(m_RecvBuf, 0, TmpBuffer, 0, NumBytesRead); m_TempPacket.WriteBytes(TmpBuffer); //And reset the buffers! m_RecvBuf = new byte[11024]; TmpBuffer = null; } else if (PacketLength == 0) { Logger.LogInfo("Received variable length packet!\r\n"); if (NumBytesRead > 2) { PacketLength = TempPacket.PeekByte(1); if (NumBytesRead == PacketLength) { Logger.LogInfo("Received exact number of bytes for packet!\r\n"); m_RecvBuf = new byte[11024]; m_TempPacket = null; OnReceivedData(new PacketStream(ID, PacketLength, TempPacket.ToArray())); } else if (NumBytesRead < PacketLength) { Logger.LogInfo("Didn't receive entire packet - stored: " + PacketLength + " bytes!\r\n"); TempPacket.SetLength(PacketLength); m_TempPacket = TempPacket; m_RecvBuf = new byte[11024]; } else if (NumBytesRead > PacketLength) { Logger.LogInfo("Received more bytes than needed for packet. Excess: " + (NumBytesRead - PacketLength) + "\r\n"); byte[] TmpBuffer = new byte[NumBytesRead - PacketLength]; Buffer.BlockCopy(TempPacket.ToArray(), 0, TmpBuffer, 0, TmpBuffer.Length); m_TempPacket = new PacketStream(TmpBuffer[0], NumBytesRead - PacketLength, TmpBuffer); byte[] PacketBuffer = new byte[PacketLength]; Buffer.BlockCopy(TempPacket.ToArray(), 0, PacketBuffer, 0, PacketBuffer.Length); m_RecvBuf = new byte[11024]; OnReceivedData(new PacketStream(ID, PacketLength, PacketBuffer)); } } } } else { if (m_TempPacket != null) { if (m_TempPacket.Length < m_TempPacket.BufferLength) { //Received the exact number of bytes needed to complete the stored packet. if ((m_TempPacket.BufferLength + NumBytesRead) == m_TempPacket.Length) { byte[] TmpBuffer = new byte[NumBytesRead]; Buffer.BlockCopy(m_RecvBuf, 0, TmpBuffer, 0, NumBytesRead); m_RecvBuf = new byte[11024]; TmpBuffer = null; } //Received more than the number of bytes needed to complete the packet! else if ((m_TempPacket.BufferLength + NumBytesRead) > m_TempPacket.Length) { int Target = (int)((m_TempPacket.BufferLength + NumBytesRead) - m_TempPacket.Length); byte[] TmpBuffer = new byte[Target]; Buffer.BlockCopy(m_RecvBuf, 0, TmpBuffer, 0, Target); m_TempPacket.WriteBytes(TmpBuffer); //Now we have a full packet, so call the received event! OnReceivedData(new PacketStream(m_TempPacket.PacketID, (int)m_TempPacket.Length, m_TempPacket.ToArray())); //Copy the remaining bytes in the receiving buffer. TmpBuffer = new byte[NumBytesRead - Target]; Buffer.BlockCopy(m_RecvBuf, Target, TmpBuffer, 0, (NumBytesRead - Target)); //Give the temporary packet an ID of 0x00 since we don't know its ID yet. TempPacket = new PacketStream(0x00, NumBytesRead - Target, TmpBuffer); ID = TempPacket.PeekByte(0); //This SHOULD be an existing ID, but let's sanity-check it... if (FindMatchingPacketID(ID)) { m_TempPacket = new PacketStream(ID, m_PacketIDs[ID], TempPacket.ToArray()); //Congratulations, you just received another packet! if (m_TempPacket.Length == m_TempPacket.BufferLength) { OnReceivedData(new PacketStream(m_TempPacket.PacketID, (int)m_TempPacket.Length, m_TempPacket.ToArray())); //No more data to store on this read, so reset everything... m_TempPacket = null; TmpBuffer = null; m_RecvBuf = new byte[11024]; } } else { //Houston, we have a problem (this should never occur)! } } } } } m_Sock.BeginReceive(m_RecvBuf, 0, m_RecvBuf.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), m_Sock); } catch (SocketException E) { Logger.LogWarning("SocketException: " + E.ToString()); Disconnect(); } }
private void ConnectCallback(IAsyncResult AR) { try { Socket Sock = (Socket)AR.AsyncState; Sock.EndConnect(AR); m_Connected = true; BeginReceive(); //Send information about this CityServer to the LoginServer... PacketStream Packet = new PacketStream(0x00, 0x00); Packet.WriteByte(0x00); Packet.WriteString(GlobalSettings.Default.CityName); Packet.WriteString(GlobalSettings.Default.CityDescription); Packet.WriteUInt64(GlobalSettings.Default.CityThumbnail); Packet.WriteUInt64(GlobalSettings.Default.Map); Packet.WriteString(m_IP); Packet.WriteInt32(GlobalSettings.Default.Port); Packet.Flush(); Send(Packet.ToArray()); } catch (SocketException E) { OnNetworkError(E); } }
public static void HandleCharacterCreate(NetworkClient Client, ProcessedPacket P) { try { Logger.LogInfo("Received CharacterCreate!"); bool ClientAuthenticated = false; byte AccountStrLength = (byte)P.ReadByte(); byte[] AccountNameBuf = new byte[AccountStrLength]; P.Read(AccountNameBuf, 0, AccountStrLength); string AccountName = Encoding.ASCII.GetString(AccountNameBuf); byte HashLength = (byte)P.ReadByte(); byte[] HashBuf = new byte[HashLength]; P.Read(HashBuf, 0, HashLength); using (var db = DataAccess.Get()) { byte KeyLength = (byte)P.ReadByte(); byte[] EncKey = new byte[KeyLength]; P.Read(EncKey, 0, KeyLength); Client.ClientEncryptor = new ARC4Encryptor(Convert.ToBase64String(HashBuf), EncKey); Client.ClientEncryptor.Username = AccountName; string Token = P.ReadString(); string GUID = ""; int AccountID = 0; foreach (ClientToken CToken in NetworkFacade.TransferringClients.GetList()) { if (CToken.ClientIP == Client.RemoteIP) { if (CToken.Token == Token) { PacketStream SuccessPacket = new PacketStream((byte)PacketType.CHARACTER_CREATE_CITY, (int)(PacketHeaders.ENCRYPTED + 1)); SuccessPacket.WriteByte((byte)CityDataModel.Entities.CharacterCreationStatus.Success); Client.SendEncrypted((byte)PacketType.CHARACTER_CREATE_CITY, SuccessPacket.ToArray()); ClientAuthenticated = true; GUID = CToken.CharacterGUID; AccountID = CToken.AccountID; } break; } } Sim Char = new Sim(new Guid(GUID)); Char.Timestamp = P.ReadPascalString(); Char.Name = P.ReadPascalString(); Char.Sex = P.ReadPascalString(); Char.Description = P.ReadPascalString(); Char.HeadOutfitID = P.ReadUInt64(); Char.BodyOutfitID = P.ReadUInt64(); Char.Appearance = (AppearanceType)P.ReadByte(); Char.CreatedThisSession = true; var characterModel = new Character(); characterModel.Name = Char.Name; characterModel.Sex = Char.Sex; characterModel.Description = Char.Description; characterModel.LastCached = Char.Timestamp; characterModel.GUID = Char.GUID; characterModel.HeadOutfitID = (long)Char.HeadOutfitID; characterModel.BodyOutfitID = (long)Char.BodyOutfitID; characterModel.AccountID = AccountID; characterModel.AppearanceType = (int)Char.Appearance; var status = db.Characters.CreateCharacter(characterModel); } //Invalid token, should never occur... if (!ClientAuthenticated) { PacketStream SuccessPacket = new PacketStream(0x65, (int)(PacketHeaders.ENCRYPTED + 1)); SuccessPacket.WriteByte((byte)CityDataModel.Entities.CharacterCreationStatus.GeneralError); Client.SendEncrypted(0x64, SuccessPacket.ToArray()); Client.Disconnect(); } } catch (Exception E) { Logger.LogDebug("Exception in HandleCharacterCreate: " + E.ToString()); } }
public static void HandleClientKeyReceive(PacketStream P, ref CityClient C) { //TODO: Read packet and assign the key to the client. AResetEvent.Set(); }
/// <summary> /// Sends a pulse to the LoginServer, to let it know this server is alive. /// </summary> private void m_PulseTimer_Elapsed(object sender, ElapsedEventArgs e) { PacketStream Packet = new PacketStream(0x02, 2); Packet.WriteByte(0x02); Packet.WriteByte(0x00); Packet.Flush(); m_LoginClient.Send(Packet.ToArray()); Packet.Dispose(); }
public void OnReceivedData(IAsyncResult AR) { //base.OnReceivedData(AR); //Not needed for this application! try { Socket Sock = (Socket)AR.AsyncState; int NumBytesRead = Sock.EndReceive(AR); if (NumBytesRead > 0) { byte[] TmpBuf = new byte[NumBytesRead]; Buffer.BlockCopy(m_RecvBuffer, 0, TmpBuf, 0, NumBytesRead); //The packet is given an ID of 0x00 because its ID is currently unknown. PacketStream TempPacket = new PacketStream(0x00, NumBytesRead, TmpBuf); byte ID = TempPacket.PeekByte(0); int PacketLength = 0; bool FoundMatchingID = false; /*foreach (KeyValuePair<byte, int> Pair in m_PacketIDs) * { * if (ID == Pair.Key) * { * Console.WriteLine("Found matching Packet ID!"); * * FoundMatchingID = true; * PacketLength = Pair.Value; * break; * } * }*/ FoundMatchingID = FindMatchingPacketID(ID); if (FoundMatchingID) { PacketLength = m_PacketIDs[ID]; Logger.LogInfo("Found matching PacketID!\r\n\r\n"); if (NumBytesRead == PacketLength) { Logger.LogInfo("Got packet - exact length!\r\n\r\n"); m_RecvBuffer = new byte[11024]; m_Listener.OnReceivedData(new PacketStream(ID, PacketLength, TempPacket.ToArray()), this); } else if (NumBytesRead < PacketLength) { m_TempPacket = new PacketStream(ID, PacketLength); byte[] TmpBuffer = new byte[NumBytesRead]; //Store the number of bytes that were read in the temporary buffer. Logger.LogInfo("Got data, but not a full packet - stored " + NumBytesRead.ToString() + "bytes!\r\n\r\n"); Buffer.BlockCopy(m_RecvBuffer, 0, TmpBuffer, 0, NumBytesRead); m_TempPacket.WriteBytes(TmpBuffer); //And reset the buffers! m_RecvBuffer = new byte[11024]; TmpBuffer = null; } else if (PacketLength == 0) { Logger.LogInfo("Received variable length packet!\r\n"); if (NumBytesRead > 2) { PacketLength = TempPacket.PeekByte(1); if (NumBytesRead == PacketLength) { Logger.LogInfo("Received exact number of bytes for packet!\r\n"); m_RecvBuffer = new byte[11024]; m_TempPacket = null; m_Listener.OnReceivedData(new PacketStream(ID, PacketLength, TempPacket.ToArray()), this); } else if (NumBytesRead < PacketLength) { Logger.LogInfo("Didn't receive entire packet - stored: " + PacketLength + " bytes!\r\n"); TempPacket.SetLength(PacketLength); m_TempPacket = TempPacket; m_RecvBuffer = new byte[11024]; } else if (NumBytesRead > PacketLength) { Logger.LogInfo("Received more bytes than needed for packet. Excess: " + (NumBytesRead - PacketLength) + "\r\n"); byte[] TmpBuffer = new byte[NumBytesRead - PacketLength]; Buffer.BlockCopy(TempPacket.ToArray(), 0, TmpBuffer, 0, TmpBuffer.Length); m_TempPacket = new PacketStream(TmpBuffer[0], NumBytesRead - PacketLength, TmpBuffer); byte[] PacketBuffer = new byte[PacketLength]; Buffer.BlockCopy(TempPacket.ToArray(), 0, PacketBuffer, 0, PacketBuffer.Length); m_RecvBuffer = new byte[11024]; m_Listener.OnReceivedData(new PacketStream(ID, PacketLength, PacketBuffer), this); } } } } else { if (m_TempPacket != null) { if (m_TempPacket.Length < m_TempPacket.BufferLength) { //Received the exact number of bytes needed to complete the stored packet. if ((m_TempPacket.BufferLength + NumBytesRead) == m_TempPacket.Length) { byte[] TmpBuffer = new byte[NumBytesRead]; Buffer.BlockCopy(m_RecvBuffer, 0, TmpBuffer, 0, NumBytesRead); m_RecvBuffer = new byte[11024]; TmpBuffer = null; } //Received more than the number of bytes needed to complete the packet! else if ((m_TempPacket.BufferLength + NumBytesRead) > m_TempPacket.Length) { int Target = (int)((m_TempPacket.BufferLength + NumBytesRead) - m_TempPacket.Length); byte[] TmpBuffer = new byte[Target]; Buffer.BlockCopy(m_RecvBuffer, 0, TmpBuffer, 0, Target); m_TempPacket.WriteBytes(TmpBuffer); //Now we have a full packet, so call the received event! m_Listener.OnReceivedData(new PacketStream(m_TempPacket.PacketID, (int)m_TempPacket.Length, m_TempPacket.ToArray()), this); //Copy the remaining bytes in the receiving buffer. TmpBuffer = new byte[NumBytesRead - Target]; Buffer.BlockCopy(m_RecvBuffer, Target, TmpBuffer, 0, (NumBytesRead - Target)); //Give the temporary packet an ID of 0x00 since we don't know its ID yet. TempPacket = new PacketStream(0x00, NumBytesRead - Target, TmpBuffer); ID = TempPacket.PeekByte(0); //This SHOULD be an existing ID, but let's sanity-check it... if (FindMatchingPacketID(ID)) { m_TempPacket = new PacketStream(ID, m_PacketIDs[ID], TempPacket.ToArray()); //Congratulations, you just received another packet! if (m_TempPacket.Length == m_TempPacket.BufferLength) { m_Listener.OnReceivedData(new PacketStream(m_TempPacket.PacketID, (int)m_TempPacket.Length, m_TempPacket.ToArray()), this); //No more data to store on this read, so reset everything... m_TempPacket = null; TmpBuffer = null; m_RecvBuffer = new byte[11024]; } } else { //Houston, we have a problem (this should never occur)! } } } } } } else { //Client disconnected! m_Listener.RemoveClient(this); } m_Socket.BeginReceive(m_RecvBuffer, 0, m_RecvBuffer.Length, SocketFlags.None, new AsyncCallback(OnReceivedData), m_Socket); } catch (SocketException) { Disconnect(); } }
/// <summary> /// Called by LoginClient instances /// when they've received some new data /// (a new packet). Should not be called /// from anywhere else. /// </summary> /// <param name="P"></param> public void OnReceivedData(PacketStream P, CityClient Client) { OnReceiveEvent(P, Client); }