/// <summary> /// A cityserver logged in! /// </summary> public static void HandleCityServerLogin(NetworkClient Client, ProcessedPacket P) { Logger.LogInfo("CityServer logged in!\r\n"); string Name = P.ReadString(); string Description = P.ReadString(); string IP = P.ReadString(); int Port = P.ReadInt32(); CityInfoStatus Status = (CityInfoStatus)P.ReadByte(); ulong Thumbnail = P.ReadUInt64(); string UUID = P.ReadString(); ulong Map = P.ReadUInt64(); CityInfo Info = new CityInfo(true); Info.Name = Name; Info.Description = Description; Info.IP = IP; Info.Port = Port; Info.Status = Status; Info.Thumbnail = Thumbnail; Info.UUID = UUID; Info.Map = Map; Info.Client = Client; Info.Online = true; NetworkFacade.CServerListener.CityServers.Add(Info); NetworkFacade.CServerListener.PotentialLogins.TryTake(out Client); NetworkClient[] Clients = new NetworkClient[NetworkFacade.ClientListener.Clients.Count]; NetworkFacade.ClientListener.Clients.CopyTo(Clients, 0); PacketStream ClientPacket = new PacketStream((byte)PacketType.NEW_CITY_SERVER, 0); ClientPacket.WriteString(Name); ClientPacket.WriteString(Description); ClientPacket.WriteString(IP); ClientPacket.WriteInt32(Port); ClientPacket.WriteByte((byte)Status); ClientPacket.WriteUInt64(Thumbnail); ClientPacket.WriteString(UUID); ClientPacket.WriteUInt64(Map); foreach(NetworkClient Receiver in Clients) Receiver.SendEncrypted((byte)PacketType.NEW_CITY_SERVER, ClientPacket.ToArray()); }
/// <summary> /// Sends a CharacterCreate packet to the LoginServer. /// </summary> /// <param name="Character">The character to create.</param> /// <param name="TimeStamp">The timestamp of when this character was created.</param> public static void SendCharacterCreate(TSOClient.VM.Sim Character, string TimeStamp) { PacketStream Packet = new PacketStream((byte)PacketType.CHARACTER_CREATE, 0); Packet.WritePascalString(PlayerAccount.Client.ClientEncryptor.Username); Packet.WritePascalString(TimeStamp); Packet.WritePascalString(Character.Name); Packet.WritePascalString(Character.Sex); Packet.WritePascalString(Character.Description); Packet.WriteUInt64(Character.HeadOutfitID); Packet.WriteUInt64(Character.BodyOutfitID); Packet.WriteByte((byte)Character.AppearanceType); Packet.WritePascalString(Character.ResidingCity.Name); Packet.WriteUInt64(Character.ResidingCity.Thumbnail); Packet.WritePascalString(Character.ResidingCity.UUID); Packet.WriteUInt64(Character.ResidingCity.Map); Packet.WritePascalString(Character.ResidingCity.IP); Packet.WriteInt32(Character.ResidingCity.Port); byte[] PacketData = Packet.ToArray(); PlayerAccount.Client.SendEncrypted((byte)PacketType.CHARACTER_CREATE, PacketData); }
/// <summary> /// Client requested information about a city. /// </summary> public static void HandleCityInfoRequest(NetworkClient Client, ProcessedPacket P) { //This packet only contains a dummy byte, don't bother reading it. PacketStream Packet = new PacketStream((byte)PacketType.CITY_LIST, 0); Packet.WriteByte((byte)NetworkFacade.CServerListener.CityServers.Count); if (NetworkFacade.CServerListener.CityServers.Count > 0) { lock (NetworkFacade.CServerListener.CityServers) { foreach (CityInfo CInfo in NetworkFacade.CServerListener.CityServers) { Packet.WriteString(CInfo.Name); Packet.WriteString(CInfo.Description); Packet.WriteString(CInfo.IP); Packet.WriteInt32(CInfo.Port); //Hack (?) to ensure status is written correctly. switch (CInfo.Status) { case CityInfoStatus.Ok: Packet.WriteByte(1); break; case CityInfoStatus.Busy: Packet.WriteByte(2); break; case CityInfoStatus.Full: Packet.WriteByte(3); break; case CityInfoStatus.Reserved: Packet.WriteByte(4); break; } Packet.WriteUInt64(CInfo.Thumbnail); Packet.WriteString(CInfo.UUID); Packet.WriteUInt64(CInfo.Map); } } } Client.SendEncrypted((byte)PacketType.CITY_LIST, Packet.ToArray()); }
public override void RemoveClient(NetworkClient Client) { CityInfo Info = CityServers.FirstOrDefault(x => x.Client == Client); if (CityServers.TryTake(out Info)) { lock (NetworkFacade.ClientListener.Clients) { PacketStream ClientPacket = new PacketStream((byte)PacketType.CITY_SERVER_OFFLINE, 0); ClientPacket.WriteString(Info.Name); ClientPacket.WriteString(Info.Description); ClientPacket.WriteString(Info.IP); ClientPacket.WriteInt32(Info.Port); ClientPacket.WriteByte((byte)Info.Status); ClientPacket.WriteUInt64(Info.Thumbnail); ClientPacket.WriteString(Info.UUID); ClientPacket.WriteUInt64(Info.Map); foreach (NetworkClient Receiver in NetworkFacade.ClientListener.Clients) Receiver.SendEncrypted((byte)PacketType.CITY_SERVER_OFFLINE, ClientPacket.ToArray()); } Debug.WriteLine("Removed CityServer!"); } }