public override int ReadFrom(byte[] Buffer, int StartIndex = 0)
        {
            int cursor = StartIndex;

            cursor += base.ReadFrom(Buffer, cursor);

            Mail = new Mail(stringResources, Buffer, cursor);
            cursor += Mail.ByteLength;

            return cursor - StartIndex;
        }
 public MailMessage(Mail Mail)
     : base(MessageTypeGameMode.Mail)
 {
     this.Mail = Mail;
 }
        /// <summary>
        /// Sets pathes to required resources.
        /// Will also remove any existing resources from the current lists.
        /// </summary>
        /// <param name="PathStrings"></param>
        /// <param name="PathRooms"></param>
        /// <param name="PathObjects"></param>
        /// <param name="PathRoomTextures"></param>
        /// <param name="PathSounds"></param>
        /// <param name="PathMusic"></param>
        /// <param name="PathMails"></param>
        public void Init(
            string PathStrings,
            string PathRooms,
            string PathObjects, 
            string PathRoomTextures, 
            string PathSounds, 
            string PathMusic, 
            string PathMails)
        {
            this.StringsFolder = PathStrings;
            this.RoomsFolder = PathRooms;
            this.ObjectsFolder = PathObjects;
            this.RoomTexturesFolder = PathRoomTextures;
            this.WavFolder = PathSounds;
            this.MusicFolder = PathMusic;
            this.MailFolder = PathMails;

            string[] files;

            // already executed once?
            if (Initialized)
            {
                StringResources.Clear();
                StringDictionaries.Clear();
                Objects.Clear();
                RoomTextures.Clear();
                Rooms.Clear();
                Wavs.Clear();
                Music.Clear();

                // detach mail listener so we don't delete them
                Mails.ListChanged -= OnMailsListChanged;

                // clear our objects
                Mails.Clear();
            }

            // register string dictionaries for different servers
            if (Directory.Exists(StringsFolder))
            {
                // get available files
                files = Directory.GetFiles(StringsFolder, '*' + FileExtensions.RSB);

                foreach (string s in files)
                    StringDictionaries.TryAdd(Path.GetFileName(s), null);
            }

            // register objects
            if (Directory.Exists(ObjectsFolder))
            {
                // get available files
                files = Directory.GetFiles(ObjectsFolder, '*' + FileExtensions.BGF);

                foreach (string s in files)
                {
                    string filename = Path.GetFileName(s);

                    if (!filename.StartsWith("grd"))
                        Objects.TryAdd(filename, null);
                }
            }

            // register roomtextures
            if (Directory.Exists(RoomTexturesFolder))
            {
                // get available files
                files = Directory.GetFiles(RoomTexturesFolder, "grd*" + FileExtensions.BGF);

                foreach (string s in files)
                    RoomTextures.TryAdd(Path.GetFileName(s), null);
            }

            // register rooms
            if (Directory.Exists(RoomsFolder))
            {
                // get available files
                files = Directory.GetFiles(RoomsFolder, '*' + FileExtensions.ROO);

                foreach (string s in files)
                    Rooms.TryAdd(Path.GetFileName(s), null);
            }

            // register wav sounds
            if (Directory.Exists(WavFolder))
            {
                // get available files
                files = Directory.GetFiles(WavFolder, '*' + FileExtensions.WAV);

                foreach (string s in files)
                    Wavs.TryAdd(Path.GetFileName(s), null);
            }

            // register music
            if (Directory.Exists(MusicFolder))
            {
                // get available files
                files = Directory.GetFiles(MusicFolder, '*' + FileExtensions.MP3);

                foreach (string s in files)
                    Music.TryAdd(Path.GetFileName(s), null);
            }

            // load mails
            if (Directory.Exists(MailFolder))
            {
                // read available mail files
                files = Directory.GetFiles(MailFolder, '*' + FileExtensions.XML);
                foreach (string s in files)
                {
                    // create mail object
                    Mail mail = new Mail();

                    // load values from xml
                    mail.Load(s);

                    // add to list
                    Mails.Add(mail);
                }
            }

            // hookup mails listener to write/delete the files
            Mails.ListChanged += OnMailsListChanged;

            // forced GC collection
            GC.Collect(2);

            // mark initialized
            Initialized = true;
        }