/// <summary>
        /// Writes room info onto a packet
        /// </summary>
        /// <param name="packet"></param>
        /// <param name="room"></param>
        public static void WriteRoomInfo(this ServerBasePacket packet, RoomInstance room)
        {
            packet.WriteString(Configuration.Global.GameHost); // Room server... If this does not match current server, it does a switch

            packet.WriteInt(room.Id);                          // Room Id
            packet.WriteInt(room.MasterId);                    // Unknown - maybe master?
            packet.WriteInt((int)room.GameType);               // Game type


            packet.WriteString(room.Name);
            packet.WriteString(room.Password); // Unknown - Empty in packet
            packet.WriteString("Face Off");    // Map name?
            packet.WriteString(room.Master != null ? room.Master.Callsign : "UNKNOWN");

            packet.WriteInt(room.Capacity);
            packet.WriteInt(room.Users.Count());

            packet.WriteBool(!string.IsNullOrEmpty(room.Password));                            // Game is private?
            packet.WriteByte(1);                                                               // Unknown

            packet.WriteInt((int)room.GameStatus);                                             // Status?
            packet.WriteUInt(room.GameTemplate);                                               // Not sure why this is sent twice?
            packet.WriteUInt(room.GameTemplate);                                               // This was supposed to be adhoc id

            packet.WriteBool(room.SdMode);                                                     // SD Battle

            packet.WriteInt(0);                                                                // Unknown - zero on packet
            packet.WriteInt(0x000927c0);                                                       // Unknown - zero on packet
            packet.WriteInt(0x000668a0);                                                       // Unknown
            packet.WriteInt(0x000927c0);                                                       // Unknown
            packet.WriteInt(0);                                                                // Unknown

            packet.WriteBool(room.Balance);                                                    // Unknown

            packet.WriteInt(room.GameType == GameType.defensivebattle ? room.Difficulty : -1); // Unknown

            packet.WriteBool(room.FiveMinute);                                                 // Unknown

            packet.WriteInt(room.MaxLevel);                                                    // max level
            packet.WriteInt(room.MinLevel);                                                    // min Level
            packet.WriteInt(0);                                                                // Unknown
            packet.WriteInt(0);                                                                // Unknown
            packet.WriteInt(0);                                                                // Unknown
        }
        /// <summary>
        /// Writes pilot info into a packet
        /// </summary>
        /// <param name="packet"></param>
        /// <param name="info"></param>
        public static void WritePilotInfo(this ServerBasePacket packet, PilotInfo info)
        {
            packet.WriteInt(info.AbilityPointsAvailable);

            packet.WriteByte((byte)info.HpLevel);
            packet.WriteByte((byte)info.MoveSpeedLevel);
            packet.WriteByte((byte)info.EnLevel);
            packet.WriteByte((byte)info.ScanRangeLevel);
            packet.WriteByte((byte)info.SpLevel);
            packet.WriteByte((byte)info.AimLevel);

            packet.WriteByte(0); // Unknown
            packet.WriteByte(0); // Unknown

            packet.WriteInt(info.MeleeLevel);
            packet.WriteInt(info.RangedLevel);
            packet.WriteInt(info.SiegeLevel);
            packet.WriteInt(info.RocketLevel);

            //packet.WriteInt(0); // Unknown
            packet.WriteByte(0); // NOTE: Not sure why everything after here is offset by one, so i am just doing 3 bytes instead of 4 here
            packet.WriteByte(0);
            packet.WriteByte(0);
        }
        /// <summary>
        /// Writes a parts info into a packet
        /// </summary>
        /// <param name="packet"></param>
        /// <param name="part"></param>
        public static void WritePartInfo(this ServerBasePacket packet, PartBase part)
        {
            if (!(part is NullWeapon))
            {
                packet.WriteInt(part.Id);
                packet.WriteUInt(part.TemplateId);

                packet.WriteUShort(0x86a0); // Parameter - Possibly for permanent / cannot delete items?
                packet.WriteUShort(0);      // Type? - Zero in packets

                packet.WriteByte(part.Color.R);
                packet.WriteByte(part.Color.G);
                packet.WriteByte(part.Color.B);

                // 0 - Head
                // 1 - Chest
                // 2 - Arm
                // 3 - Leg
                // 4 - Backpack
                // 5 - Fist
                // 6 - Gun
                // 7 - Shield

                // Quick and dirty, get first digit
                var partsType = part.TemplateId;
                while (partsType >= 10)
                {
                    partsType /= 10;
                }

                partsType--;

                packet.WriteByte((byte)partsType); // Looks like 0 indexed version of part type
                packet.WriteByte(0);               // Unknown

                packet.WriteInt(0);                // Unknown

                // FArray - Unknown
                packet.WriteInt(0); // Array size

                // Array contents would go here

                packet.WriteInt(-1);         // Expiry time / current durability
                packet.WriteInt(0x14997000); // Max Durability - Value from server packet capture
                packet.WriteInt(2);          // If 1, durability, if 2, expired?
                packet.WriteInt(0);          // Unknown
            }
            else
            {
                packet.WriteInt(-1);
                packet.WriteUInt(0);

                packet.WriteUShort(0);
                packet.WriteUShort(0);

                packet.WriteByte(0);
                packet.WriteByte(0);
                packet.WriteByte(0);

                packet.WriteByte(0); // Unknown
                packet.WriteByte(0); // Unknown

                packet.WriteInt(0);  // Unknown

                // FArray - Unknown
                packet.WriteInt(0); // Array size

                // Array contents would go here

                packet.WriteInt(0); // Unknown
                packet.WriteInt(0); // Unknown
                packet.WriteInt(0); // If 1, durability, if 2, expired?
                packet.WriteInt(0); // Unknown
            }
        }
        public static void WriteRoomUserInfo(this ServerBasePacket packet, RoomInstance room, ExteelUser user)
        {
            packet.WriteString(user.Callsign); // Unknown - Looks like 2x callsign from packet cap
            packet.WriteString(user.Callsign);
            packet.WriteString("");            // Clan name

            packet.WriteInt(0);                // Unknown
            packet.WriteInt(0);                // Unknown - clan id?

            packet.WriteInt(user.Id);
            packet.WriteUInt(user.Team);

            packet.WriteUInt(user.Rank); // Unknown
            packet.WriteInt(0);          // Unknown
            packet.WriteInt(0);          // Unknown
            packet.WriteInt(0);          // Unknown
            packet.WriteInt(0);          // Unknown
            packet.WriteInt(0);          // Unknown


            packet.WriteBool(user.IsReady); // Unknown - ready?
            packet.WriteBool(user.Id == room.MasterId);

            for (var i = 0; i < 13; i++)
            {
                packet.WriteInt(0); //Unknown
            }

            for (var i = 0; i < 12; i++)
            {
                packet.WriteInt(0); //Unknown
            }

            for (var i = 0; i < 13; i++)
            {
                packet.WriteInt(0); //Unknown
            }

            for (var i = 0; i < 14; i++)
            {
                packet.WriteInt(0); // Unknown
            }

            for (var i = 0; i < 11; i++)
            {
                packet.WriteInt(0); // Unknown
            }

            for (var i = 0; i < 11; i++)
            {
                packet.WriteInt(0); // Unknown
            }

            // Unknown struct
            packet.WriteInt(0); //
            packet.WriteInt(0); //
            packet.WriteInt(0); //
            packet.WriteInt(0); //
            packet.WriteInt(0); //
            packet.WriteInt(0); //
            packet.WriteInt(0); //
            packet.WriteInt(0); //

            // Another unknown struct. Seems to be an array?
            packet.WriteInt(0); // Size?



            packet.WritePilotInfo(user.PilotInfo);
        }