/// <summary> /// Sends the messages which have not been sent yet. Static overrides are applied. /// </summary> /// <returns></returns> public IEnumerable<DequeueResultItem> SendQueuedMessages() { var filters = new DequeueFilterList().And(new SentStatusDequeueFilter(false)); var overrides = new OverrideList(); return SendQueuedMessages(filters, overrides, true); }
/// <summary> /// Sends the messages which have not been sent yet. Static overrides are applied. /// </summary> /// <returns></returns> public IEnumerable <DequeueResultItem> SendQueuedMessages() { var filters = new DequeueFilterList().And(new SentStatusDequeueFilter(false)); var overrides = new OverrideList(); return(SendQueuedMessages(filters, overrides, true)); }
private MailMessage GetMailMessage(EmailQueueItem message, OverrideList overrides) { var mailMessage = new MailMessage(); mailMessage.From = Config.FromAddress; if (!string.IsNullOrWhiteSpace(message.To)) { mailMessage.To.Add(message.To); } if (!string.IsNullOrWhiteSpace(message.Cc)) { mailMessage.CC.Add(message.Cc); } if (!string.IsNullOrWhiteSpace(message.Bcc)) { mailMessage.Bcc.Add(message.Bcc); } mailMessage.Subject = message.Subject; mailMessage.Body = message.Body; mailMessage.IsBodyHtml = message.IsBodyHtml; mailMessage = StaticOverridesesProvider.StaticOverrides.ApplyOverrides(mailMessage); mailMessage = overrides.ApplyOverrides(mailMessage); return(mailMessage); }
/// <summary> /// Sends the messages which match the filters and applies the overrides prior to sending /// </summary> /// <param name="filters"></param> /// <param name="overrides"></param> /// <param name="audit">whether to change the sent status and number of tries for an email</param> /// <returns></returns> public IEnumerable<DequeueResultItem> SendQueuedMessages(DequeueFilterList filters, OverrideList overrides, bool audit = true) { if(filters == null) throw new ArgumentNullException("filters"); if(overrides == null) throw new ArgumentNullException("overrides"); TroutLog.Log.Info(string.Format("Beginning dequeuing with{0} auditing at", audit ? "" : "out")); List<DequeueResultItem> results = new List<DequeueResultItem>(); var messages = filters.Filter(Repository); foreach (var message in messages.ToList()) { MailMessage mailMessage = GetMailMessage(message, overrides); foreach (var attachment in AttachmentFileSystem.GetAttachments(message)) { mailMessage.Attachments.Add(attachment); } var result = SmtpClient.Send(mailMessage); results.Add(new DequeueResultItem(message, result.IsSuccess, result.Message, mailMessage, result.Tries)); TroutLog.Log.Info(string.Format("{0} was {1}sent with message - {2} after {3} tries.", message.ID, result.IsSuccess ? "" : "not ", result.Message, result.Tries)); if (audit) { if (result.IsSuccess) { message.IsSent = true; message.SendDate = DateTime.Now; } else { message.IsSent = false; message.SendDate = null; } message.NumberTries++; message.LastTryDate = DateTime.Now; } } TroutLog.Log.Info(string.Format("Saving of dequeue results")); Repository.SaveChanges(); return results; }
private OverrideList CreateStaticOverrideList() { OverrideList list = new OverrideList(); StaticOverrideConfigurationSectionGroup section = (StaticOverrideConfigurationSectionGroup)ConfigurationManager.GetSection("staticOverrides"); if (section != null) { foreach (StaticOverrideConfigurationElement overrideConfig in section.StaticOverrides) { MailMessageOverride mmOverride = (MailMessageOverride)Activator.CreateInstance(overrideConfig.StaticOverrideType); if(overrideConfig.DoOverride) { mmOverride.Override(overrideConfig.Override); } if (overrideConfig.DoAppend) { mmOverride.Append(overrideConfig.Append); } if (overrideConfig.DoPrepend) { mmOverride.Prepend(overrideConfig.Prepend); } if (overrideConfig.Clear) { mmOverride.Clear(); } list.Add(mmOverride); } } return list; }
private OverrideList CreateStaticOverrideList() { OverrideList list = new OverrideList(); StaticOverrideConfigurationSectionGroup section = (StaticOverrideConfigurationSectionGroup)ConfigurationManager.GetSection("staticOverrides"); if (section != null) { foreach (StaticOverrideConfigurationElement overrideConfig in section.StaticOverrides) { MailMessageOverride mmOverride = (MailMessageOverride)Activator.CreateInstance(overrideConfig.StaticOverrideType); if (overrideConfig.DoOverride) { mmOverride.Override(overrideConfig.Override); } if (overrideConfig.DoAppend) { mmOverride.Append(overrideConfig.Append); } if (overrideConfig.DoPrepend) { mmOverride.Prepend(overrideConfig.Prepend); } if (overrideConfig.Clear) { mmOverride.Clear(); } list.Add(mmOverride); } } return(list); }
public void StaticOverridesAreApplied() { var testingStaticOverrides = new OverrideList(); testingStaticOverrides.Add(new ToOverride().Prepend("*****@*****.**")); testingStaticOverrides.Add(new CcOverride().Prepend("*****@*****.**")); testingStaticOverrides.Add(new BccOverride().Prepend("*****@*****.**")); testingStaticOverrides.Add(new SubjectOverride().Prepend("SubjectSpecialString")); testingStaticOverrides.Add(new BodyOverride().Prepend("BodySpecialString")); var staticOverridesProviderMock = new Mock <IStaticOverridesProvider>(); staticOverridesProviderMock.Setup(m => m.StaticOverrides).Returns(testingStaticOverrides); MailMessageQueue queue = new MailMessageQueue(Repository, AttachmentFileSystem); MailMessageDequeuer dequeuer = new MailMessageDequeuer(Config, SmtpClient, Repository, AttachmentFileSystem, staticOverridesProviderMock.Object); var mm = new MailMessage(); queue.EnqueueMessage(mm); var emailQueueItem = Repository.Fetch().First(); var fl = new DequeueFilterList(); fl.And(new IdDequeueFilter(emailQueueItem.ID)); var result = dequeuer.SendQueuedMessages(fl, new OverrideList()); var sent = result.First().SentMailMessage; Assert.AreEqual("*****@*****.**", sent.To.ToString(), "Static To Override was not applied"); Assert.AreEqual("*****@*****.**", sent.CC.ToString(), "Static Cc Override was not applied"); Assert.AreEqual("*****@*****.**", sent.Bcc.ToString(), "Static Bcc Override was not applied"); Assert.AreEqual("SubjectSpecialString", sent.Subject, "Static Subject Override was not applied"); Assert.AreEqual("BodySpecialString", sent.Body, "Static Body Override was not applied"); }
public PropertyGrid() { Overrides = new OverrideList(); Initialize(); }
public void StaticOverridesAreApplied() { var testingStaticOverrides = new OverrideList(); testingStaticOverrides.Add(new ToOverride().Prepend("*****@*****.**")); testingStaticOverrides.Add(new CcOverride().Prepend("*****@*****.**")); testingStaticOverrides.Add(new BccOverride().Prepend("*****@*****.**")); testingStaticOverrides.Add(new SubjectOverride().Prepend("SubjectSpecialString")); testingStaticOverrides.Add(new BodyOverride().Prepend("BodySpecialString")); var staticOverridesProviderMock = new Mock<IStaticOverridesProvider>(); staticOverridesProviderMock.Setup(m => m.StaticOverrides).Returns(testingStaticOverrides); MailMessageQueue queue = new MailMessageQueue(Repository, AttachmentFileSystem); MailMessageDequeuer dequeuer = new MailMessageDequeuer(Config, SmtpClient, Repository, AttachmentFileSystem, staticOverridesProviderMock.Object); var mm = new MailMessage(); queue.EnqueueMessage(mm); var emailQueueItem = Repository.Fetch().First(); var fl = new DequeueFilterList(); fl.And(new IdDequeueFilter(emailQueueItem.ID)); var result = dequeuer.SendQueuedMessages(fl, new OverrideList()); var sent = result.First().SentMailMessage; Assert.AreEqual("*****@*****.**", sent.To.ToString(), "Static To Override was not applied"); Assert.AreEqual("*****@*****.**", sent.CC.ToString(), "Static Cc Override was not applied"); Assert.AreEqual("*****@*****.**", sent.Bcc.ToString(), "Static Bcc Override was not applied"); Assert.AreEqual("SubjectSpecialString", sent.Subject, "Static Subject Override was not applied"); Assert.AreEqual("BodySpecialString", sent.Body, "Static Body Override was not applied"); }
private MailMessage GetMailMessage(EmailQueueItem message, OverrideList overrides) { var mailMessage = new MailMessage(); mailMessage.From = Config.FromAddress; if (!string.IsNullOrWhiteSpace(message.To)) mailMessage.To.Add(message.To); if (!string.IsNullOrWhiteSpace(message.Cc)) mailMessage.CC.Add(message.Cc); if (!string.IsNullOrWhiteSpace(message.Bcc)) mailMessage.Bcc.Add(message.Bcc); mailMessage.Subject = message.Subject; mailMessage.Body = message.Body; mailMessage.IsBodyHtml = message.IsBodyHtml; mailMessage = StaticOverridesesProvider.StaticOverrides.ApplyOverrides(mailMessage); mailMessage = overrides.ApplyOverrides(mailMessage); return mailMessage; }
/// <summary> /// Returns emails which match the filter with the provided overrides applied. /// </summary> /// <param name="filters"></param> /// <param name="overrides"></param> /// <returns></returns> public IEnumerable<DequeueListItem> GetQueuedMessages(DequeueFilterList filters, OverrideList overrides) { if (filters == null) throw new ArgumentNullException("filters"); if (overrides == null) throw new ArgumentNullException("overrides"); TroutLog.Log.Info(string.Format("Retrieving messages")); List<DequeueListItem> results = new List<DequeueListItem>(); var messages = filters.Filter(Repository); foreach (var message in messages.ToList()) { MailMessage mailMessage = GetMailMessage(message, overrides); results.Add(new DequeueListItem(message, mailMessage)); } TroutLog.Log.Info(string.Format("Retrieved {0} messages", results.Count)); return results; }
protected override Stream UnParse() { var s = new MemoryStream(); var w = new BinaryWriter(s); w.Write(this.version); w.Write(0); // tgi offset w.Write(this.presetCount); BigEndianUnicodeString.Write(s, this.name); w.Write(this.sortPriority); w.Write(this.secondarySortIndex); w.Write(this.propertyID); w.Write(this.auralMaterialHash); w.Write((byte)this.parmFlags); w.Write((ulong)this.excludePartFlags); if (this.version >= 36) { w.Write(this.excludeModifierRegionFlags); } else { w.Write((uint)this.excludeModifierRegionFlags); } this.flagList = this.flagList ?? new FlagList(this.OnResourceChanged); if (this.version >= 37) { this.flagList.UnParse(s); } else { this.flagList.WriteUInt16Flags(s); } w.Write(this.deprecatedPrice); w.Write(this.partTitleKey); w.Write(this.partDesptionKey); w.Write(this.uniqueTextureSpace); w.Write((uint)this.bodyType); w.Write(this.bodySubType); w.Write((uint)this.ageGender); if (this.version >= 0x20) { w.Write(this.reserved1); } if (this.version >= 34) { w.Write(this.packID); w.Write((byte)this.packFlags); if (this.reserved2 == null) { this.reserved2 = new byte[9]; } w.Write(this.reserved2); } else { w.Write(this.unused2); if (this.unused2 > 0) { w.Write(this.unused3); } } if (this.swatchColorCode == null) { this.swatchColorCode = new SwatchColorList(this.OnResourceChanged); } this.swatchColorCode.UnParse(s); w.Write(this.buffResKey); w.Write(this.varientThumbnailKey); if (this.version >= 0x1C) { w.Write(this.voiceEffectHash); } if (this.version >= 0x1E) { w.Write(this.usedMaterialCount); if (this.usedMaterialCount > 0) { w.Write(this.materialSetUpperBodyHash); w.Write(this.materialSetLowerBodyHash); w.Write(this.materialSetShoesHash); } } if (this.version >= 0x1F) { w.Write((uint)this.hideForOccultFlags); } w.Write(this.nakedKey); w.Write(this.parentKey); w.Write(this.sortLayer); if (this.lodBlockList == null) { this.lodBlockList = new LODBlockList(this.OnResourceChanged); } this.lodBlockList.UnParse(s); if (this.slotKey == null) { this.slotKey = new SimpleList <byte>(this.OnResourceChanged); } w.Write((byte)this.slotKey.Count); foreach (var b in this.slotKey) { w.Write(b); } w.Write(this.diffuseShadowKey); w.Write(this.shadowKey); w.Write(this.compositionMethod); w.Write(this.regionMapKey); if (this.overrides == null) { this.overrides = new OverrideList(this.OnResourceChanged); } this.overrides.UnParse(s); w.Write(this.normalMapKey); w.Write(this.specularMapKey); if (this.version >= 0x1B) { w.Write(this.sharedUVMapSpace); } if (this.version >= 0x1E) { w.Write(this.emissionMapKey); } var tgiPosition = w.BaseStream.Position; w.BaseStream.Position = 4; w.Write(tgiPosition - 8); w.BaseStream.Position = tgiPosition; if (this.tgiList == null) { this.tgiList = new CountedTGIBlockList(this.OnResourceChanged); } w.Write((byte)this.tgiList.Count); foreach (var tgi in this.tgiList) { tgi.UnParse(s); } return(s); }
protected override bool ParseArguments(string[] args) { filterList = new DequeueFilterList(); overrideList = new OverrideList(); bool dateRangeApplied = false; DateTime dateFrom = DateTime.MinValue, dateTo = DateTime.MaxValue; bool idRangeApplied = false; int idMin = 0, idMax = int.MaxValue; OptionSet optionSet = new OptionSet() //filters .Add("tf=|tofilter=", v => filterList.And(new ToFilter(v))) .Add("bcf=|bodycontainsfilter=", v => filterList.And(new BodyContainsFilter(v))) .Add("bef=|bodyexactfilter=", v => filterList.And(new BodyExactFilter(v))) .Add("fd=|fromdate=", (DateTime v) => { dateRangeApplied = true; dateFrom = v; }) .Add("td=|todate=", (DateTime v) => { dateRangeApplied = true; dateTo = v; }) .Add("idf=|idfilter=|id=", (int v) => filterList.And(new IdDequeueFilter(v))) .Add("rtf=|retriesfilter=", (byte v) => filterList.And(new RetriesFilter(v))) .Add("sent=|sentfilter=|issent=", (bool v) => filterList.And(new SentStatusDequeueFilter(v))) .Add("scf=|subjectcontainsfilter=", v => filterList.And(new SubjectContainsFilter(v))) .Add("sef=|subjectexactfilter=", v => filterList.And(new SubjectExactFilter(v))) .Add("idrf=|idfrom=", (int v) => { idRangeApplied = true; idMin = v; }) .Add("idrt=|idto=", (int v) => { idRangeApplied = true; idMax = v; }) .Add("haf|hasattachmentsfilter", "filter on whether an email has attachments", v => filterList.And(new HasAttachmentsFilter(true))) //overrides .Add("to=|tooverride=", v=> overrideList.Add(new ToOverride().Override(v))) .Add("cc=|ccoverride=", v => overrideList.Add(new CcOverride().Override(v))) .Add("bcc=|bccoverride=", v => overrideList.Add(new BccOverride().Override(v))) .Add("subject=|subjectoverride=", v => overrideList.Add(new SubjectOverride().Override(v))) .Add("body=|bodyoverride=", v => overrideList.Add(new BodyOverride().Override(v))) .Add("toa=|toappend=", v => overrideList.Add(new ToOverride().Append(v))) .Add("cca=|ccappend=", v => overrideList.Add(new CcOverride().Append(v))) .Add("bcca=|bccappend=", v => overrideList.Add(new BccOverride().Append(v))) .Add("subjecta=|subjectappend=", v => overrideList.Add(new SubjectOverride().Append(v))) .Add("bodya=|bodyappend=", v => overrideList.Add(new BodyOverride().Append(v))) .Add("top=|toprepend=", v => overrideList.Add(new ToOverride().Prepend(v))) .Add("ccp=|ccprepend=", v => overrideList.Add(new CcOverride().Prepend(v))) .Add("bccp=|bccprepend=", v => overrideList.Add(new BccOverride().Prepend(v))) .Add("subjectp=|subjectprepend=", v => overrideList.Add(new SubjectOverride().Prepend(v))) .Add("bodyp=|bodyprepend=", v => overrideList.Add(new BodyOverride().Prepend(v))) .Add("da|donotaudit", "whether to audit whether the email was sent (default=true)" , v => Audit = false) ; try { optionSet.Parse(args); } catch (OptionException) { Console.WriteLine("Error"); return false; } if (dateRangeApplied) { filterList.And(new DateRangeFilter(dateFrom, dateTo)); } if (idRangeApplied) { filterList.And(new IdRangeDequeueFilter(idMin, idMax)); } return true; }
/// <summary> /// Sends the messages which match the filters and applies the overrides prior to sending /// </summary> /// <param name="filters"></param> /// <param name="overrides"></param> /// <param name="audit">whether to change the sent status and number of tries for an email</param> /// <returns></returns> public IEnumerable <DequeueResultItem> SendQueuedMessages(DequeueFilterList filters, OverrideList overrides, bool audit = true) { if (filters == null) { throw new ArgumentNullException("filters"); } if (overrides == null) { throw new ArgumentNullException("overrides"); } TroutLog.Log.Info(string.Format("Beginning dequeuing with{0} auditing at", audit ? "" : "out")); List <DequeueResultItem> results = new List <DequeueResultItem>(); var messages = filters.Filter(Repository); foreach (var message in messages.ToList()) { MailMessage mailMessage = GetMailMessage(message, overrides); foreach (var attachment in AttachmentFileSystem.GetAttachments(message)) { mailMessage.Attachments.Add(attachment); } var result = SmtpClient.Send(mailMessage); results.Add(new DequeueResultItem(message, result.IsSuccess, result.Message, mailMessage, result.Tries)); TroutLog.Log.Info(string.Format("{0} was {1}sent with message - {2} after {3} tries.", message.ID, result.IsSuccess ? "" : "not ", result.Message, result.Tries)); if (audit) { if (result.IsSuccess) { message.IsSent = true; message.SendDate = DateTime.Now; } else { message.IsSent = false; message.SendDate = null; } message.NumberTries++; message.LastTryDate = DateTime.Now; } } TroutLog.Log.Info(string.Format("Saving of dequeue results")); Repository.SaveChanges(); return(results); }
/// <summary> /// Returns emails which match the filter with the provided overrides applied. /// </summary> /// <param name="filters"></param> /// <param name="overrides"></param> /// <returns></returns> public IEnumerable <DequeueListItem> GetQueuedMessages(DequeueFilterList filters, OverrideList overrides) { if (filters == null) { throw new ArgumentNullException("filters"); } if (overrides == null) { throw new ArgumentNullException("overrides"); } TroutLog.Log.Info(string.Format("Retrieving messages")); List <DequeueListItem> results = new List <DequeueListItem>(); var messages = filters.Filter(Repository); foreach (var message in messages.ToList()) { MailMessage mailMessage = GetMailMessage(message, overrides); results.Add(new DequeueListItem(message, mailMessage)); } TroutLog.Log.Info(string.Format("Retrieved {0} messages", results.Count)); return(results); }
protected override bool ParseArguments(string[] args) { filterList = new DequeueFilterList(); overrideList = new OverrideList(); bool dateRangeApplied = false; DateTime dateFrom = DateTime.MinValue, dateTo = DateTime.MaxValue; bool idRangeApplied = false; int idMin = 0, idMax = int.MaxValue; OptionSet optionSet = new OptionSet() //filters .Add("tf=|tofilter=", v => filterList.And(new ToFilter(v))) .Add("bcf=|bodycontainsfilter=", v => filterList.And(new BodyContainsFilter(v))) .Add("bef=|bodyexactfilter=", v => filterList.And(new BodyExactFilter(v))) .Add("fd=|fromdate=", (DateTime v) => { dateRangeApplied = true; dateFrom = v; }) .Add("td=|todate=", (DateTime v) => { dateRangeApplied = true; dateTo = v; }) .Add("idf=|idfilter=|id=", (int v) => filterList.And(new IdDequeueFilter(v))) .Add("rtf=|retriesfilter=", (byte v) => filterList.And(new RetriesFilter(v))) .Add("sent=|sentfilter=|issent=", (bool v) => filterList.And(new SentStatusDequeueFilter(v))) .Add("scf=|subjectcontainsfilter=", v => filterList.And(new SubjectContainsFilter(v))) .Add("sef=|subjectexactfilter=", v => filterList.And(new SubjectExactFilter(v))) .Add("idrf=|idfrom=", (int v) => { idRangeApplied = true; idMin = v; }) .Add("idrt=|idto=", (int v) => { idRangeApplied = true; idMax = v; }) .Add("haf|hasattachmentsfilter", "filter on whether an email has attachments", v => filterList.And(new HasAttachmentsFilter(true))) //overrides .Add("to=|tooverride=", v => overrideList.Add(new ToOverride().Override(v))) .Add("cc=|ccoverride=", v => overrideList.Add(new CcOverride().Override(v))) .Add("bcc=|bccoverride=", v => overrideList.Add(new BccOverride().Override(v))) .Add("subject=|subjectoverride=", v => overrideList.Add(new SubjectOverride().Override(v))) .Add("body=|bodyoverride=", v => overrideList.Add(new BodyOverride().Override(v))) .Add("toa=|toappend=", v => overrideList.Add(new ToOverride().Append(v))) .Add("cca=|ccappend=", v => overrideList.Add(new CcOverride().Append(v))) .Add("bcca=|bccappend=", v => overrideList.Add(new BccOverride().Append(v))) .Add("subjecta=|subjectappend=", v => overrideList.Add(new SubjectOverride().Append(v))) .Add("bodya=|bodyappend=", v => overrideList.Add(new BodyOverride().Append(v))) .Add("top=|toprepend=", v => overrideList.Add(new ToOverride().Prepend(v))) .Add("ccp=|ccprepend=", v => overrideList.Add(new CcOverride().Prepend(v))) .Add("bccp=|bccprepend=", v => overrideList.Add(new BccOverride().Prepend(v))) .Add("subjectp=|subjectprepend=", v => overrideList.Add(new SubjectOverride().Prepend(v))) .Add("bodyp=|bodyprepend=", v => overrideList.Add(new BodyOverride().Prepend(v))) .Add("da|donotaudit", "whether to audit whether the email was sent (default=true)", v => Audit = false) ; try { optionSet.Parse(args); } catch (OptionException) { Console.WriteLine("Error"); return(false); } if (dateRangeApplied) { filterList.And(new DateRangeFilter(dateFrom, dateTo)); } if (idRangeApplied) { filterList.And(new IdRangeDequeueFilter(idMin, idMax)); } return(true); }
private void Parse(Stream s) { s.Position = 0; var r = new BinaryReader(s); this.version = r.ReadUInt32(); this.TGIoffset = r.ReadUInt32() + 8; this.presetCount = r.ReadUInt32(); if (this.presetCount != 0) { throw new Exception("Found non-zero one"); } this.name = BigEndianUnicodeString.Read(s); this.sortPriority = r.ReadSingle(); this.secondarySortIndex = r.ReadUInt16(); this.propertyID = r.ReadUInt32(); this.auralMaterialHash = r.ReadUInt32(); this.parmFlags = (ParmFlag)r.ReadByte(); this.excludePartFlags = (ExcludePartFlag)r.ReadUInt64(); if (this.version >= 36) { this.excludeModifierRegionFlags = r.ReadUInt64(); } else { this.excludeModifierRegionFlags = r.ReadUInt32(); } if (this.version >= 37) { this.flagList = new FlagList(this.OnResourceChanged, s); } else { this.flagList = FlagList.CreateWithUInt16Flags(this.OnResourceChanged, s, recommendedApiVersion); } this.deprecatedPrice = r.ReadUInt32(); this.partTitleKey = r.ReadUInt32(); this.partDesptionKey = r.ReadUInt32(); this.uniqueTextureSpace = r.ReadByte(); this.bodyType = (BodyType)r.ReadInt32(); this.bodySubType = r.ReadInt32(); this.ageGender = (AgeGenderFlags)r.ReadUInt32(); if (this.version >= 0x20) { this.reserved1 = r.ReadUInt32(); } if (this.version >= 34) { this.packID = r.ReadInt16(); this.packFlags = (PackFlag)r.ReadByte(); this.reserved2 = r.ReadBytes(9); } else { this.packID = 0; this.unused2 = r.ReadByte(); if (this.unused2 > 0) { this.unused3 = r.ReadByte(); } } this.swatchColorCode = new SwatchColorList(this.OnResourceChanged, s); this.buffResKey = r.ReadByte(); this.varientThumbnailKey = r.ReadByte(); if (this.version >= 0x1C) { this.voiceEffectHash = r.ReadUInt64(); } if (this.version >= 0x1E) { this.usedMaterialCount = r.ReadByte(); if (this.usedMaterialCount > 0) { this.materialSetUpperBodyHash = r.ReadUInt32(); this.materialSetLowerBodyHash = r.ReadUInt32(); this.materialSetShoesHash = r.ReadUInt32(); } } if (this.version >= 0x1F) { this.hideForOccultFlags = (OccultTypesDisabled)r.ReadUInt32(); } this.nakedKey = r.ReadByte(); this.parentKey = r.ReadByte(); this.sortLayer = r.ReadInt32(); // Don't move any of this before the ----- // TGI block list var currentPosition = r.BaseStream.Position; r.BaseStream.Position = this.TGIoffset; var count4 = r.ReadByte(); this.tgiList = new CountedTGIBlockList(this.OnResourceChanged, "IGT", count4, s); r.BaseStream.Position = currentPosition; this.lodBlockList = new LODBlockList(null, s, this.tgiList); //------------- var count = r.ReadByte(); this.slotKey = new SimpleList <byte>(null); for (byte i = 0; i < count; i++) { this.slotKey.Add(r.ReadByte()); } this.diffuseShadowKey = r.ReadByte(); this.shadowKey = r.ReadByte(); this.compositionMethod = r.ReadByte(); this.regionMapKey = r.ReadByte(); this.overrides = new OverrideList(null, s); this.normalMapKey = r.ReadByte(); this.specularMapKey = r.ReadByte(); if (this.version >= 0x1B) { this.sharedUVMapSpace = r.ReadUInt32(); } if (this.version >= 0x1E) { this.emissionMapKey = r.ReadByte(); } }