diff --git a/src/DiIiS-NA/BGS-Server/Toons/Toon.cs b/src/DiIiS-NA/BGS-Server/Toons/Toon.cs index e5df517..0903f95 100644 --- a/src/DiIiS-NA/BGS-Server/Toons/Toon.cs +++ b/src/DiIiS-NA/BGS-Server/Toons/Toon.cs @@ -14,32 +14,81 @@ namespace DiIiS_NA.LoginServer.Toons { public class Toon : PersistentRPCObject { - #region Cosmetics - public int Cosmetic1 { get => DBToon.Cosmetic1; - set { lock (DBToon) { var dbToon = DBToon; dbToon.Cosmetic1 = value; DBSessions.SessionUpdate(dbToon); } } } - public int Cosmetic2 { get => DBToon.Cosmetic2; - set { lock (DBToon) { var dbToon = DBToon; dbToon.Cosmetic2 = value; DBSessions.SessionUpdate(dbToon); } } } - public int Cosmetic3 { get => DBToon.Cosmetic3; - set { lock (DBToon) { var dbToon = DBToon; dbToon.Cosmetic3 = value; DBSessions.SessionUpdate(dbToon); } } } - public int Cosmetic4 { get => DBToon.Cosmetic4; - set { lock (DBToon) { var dbToon = DBToon; dbToon.Cosmetic4 = value; DBSessions.SessionUpdate(dbToon); } } } - #endregion + #region Cosmetics - public DBToon DBToon + public int Cosmetic1 + { + get => DBToon.Cosmetic1; + set + { + lock (DBToon) + { + var dbToon = DBToon; + dbToon.Cosmetic1 = value; + DBSessions.SessionUpdate(dbToon); + } + } + } + + public int Cosmetic2 + { + get => DBToon.Cosmetic2; + set + { + lock (DBToon) + { + var dbToon = DBToon; + dbToon.Cosmetic2 = value; + DBSessions.SessionUpdate(dbToon); + } + } + } + + public int Cosmetic3 + { + get => DBToon.Cosmetic3; + set + { + lock (DBToon) + { + var dbToon = DBToon; + dbToon.Cosmetic3 = value; + DBSessions.SessionUpdate(dbToon); + } + } + } + + public int Cosmetic4 + { + get => DBToon.Cosmetic4; + set + { + lock (DBToon) + { + var dbToon = DBToon; + dbToon.Cosmetic4 = value; + DBSessions.SessionUpdate(dbToon); + } + } + } + + #endregion + + public DBToon DBToon { get; - /* + /* + { + if (LoginServer.Config.Instance.Enabled) { - if (LoginServer.Config.Instance.Enabled) - { - if (this.GameAccount.IsOnline) - this.CachedDBToon = DBSessions.SessionGet(this.PersistentID); - return this.CachedDBToon; - } - else - return DBSessions.SessionGet(this.PersistentID); + if (this.GameAccount.IsOnline) + this.CachedDBToon = DBSessions.SessionGet(this.PersistentID); + return this.CachedDBToon; } - //*/ + else + return DBSessions.SessionGet(this.PersistentID); + } + //*/ set; } @@ -49,10 +98,7 @@ namespace DiIiS_NA.LoginServer.Toons public DBActiveSkills DBActiveSkills { - get - { - return DBSessions.SessionQuerySingle(s => s.DBToon.Id == PersistentID); - } + get { return DBSessions.SessionQuerySingle(s => s.DBToon.Id == PersistentID); } set { } } @@ -60,7 +106,8 @@ namespace DiIiS_NA.LoginServer.Toons { get { - var val = new IntPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Hero, 1, 0, ClassID); + var val = new IntPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Hero, 1, 0, + ClassID); return val; } } @@ -69,7 +116,8 @@ namespace DiIiS_NA.LoginServer.Toons { get { - var val = new IntPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Hero, 2, 0, Level); + var val = new IntPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Hero, 2, 0, + Level); return val; } } @@ -80,23 +128,27 @@ namespace DiIiS_NA.LoginServer.Toons { var tFlags = Flags; if (IsHardcore) tFlags |= ToonFlags.Hardcore; - var val = new IntPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Hero, 4, 0, (int)tFlags); + var val = new IntPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Hero, 4, 0, + (int)tFlags); return val; } } - public IntPresenceField HighestUnlockedAct = new IntPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Hero, 6, 0, 3000); + public IntPresenceField HighestUnlockedAct = + new IntPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Hero, 6, 0, 3000); public IntPresenceField HeroParagonLevelField { get { - var val = new IntPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Hero, 8, 0, ParagonLevel); + var val = new IntPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Hero, 8, 0, + ParagonLevel); return val; } } - public StringPresenceField HeroNameField => new StringPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Hero, 5, 0, _heroName); + public StringPresenceField HeroNameField => new StringPresenceField(FieldKeyHelper.Program.D3, + FieldKeyHelper.OriginatingClass.Hero, 5, 0, _heroName); private D3.Hero.VisualEquipment _visualEquipment = null; public bool _visualEquipmentChanged = true; @@ -108,32 +160,34 @@ namespace DiIiS_NA.LoginServer.Toons if (_visualEquipmentChanged) { var visualItems = new[] - { - D3.Hero.VisualItem.CreateBuilder().SetEffectLevel(0).Build(), // Head - D3.Hero.VisualItem.CreateBuilder().SetEffectLevel(0).Build(), // Chest - D3.Hero.VisualItem.CreateBuilder().SetEffectLevel(0).Build(), // Feet - D3.Hero.VisualItem.CreateBuilder().SetEffectLevel(0).Build(), // Hands - D3.Hero.VisualItem.CreateBuilder().SetEffectLevel(0).Build(), // Weapon (1) - D3.Hero.VisualItem.CreateBuilder().SetEffectLevel(0).Build(), // Weapon (2) - D3.Hero.VisualItem.CreateBuilder().SetEffectLevel(0).Build(), // Shoulders - D3.Hero.VisualItem.CreateBuilder().SetEffectLevel(0).Build(), // Legs - }; + { + D3.Hero.VisualItem.CreateBuilder().SetEffectLevel(0).Build(), // Head + D3.Hero.VisualItem.CreateBuilder().SetEffectLevel(0).Build(), // Chest + D3.Hero.VisualItem.CreateBuilder().SetEffectLevel(0).Build(), // Feet + D3.Hero.VisualItem.CreateBuilder().SetEffectLevel(0).Build(), // Hands + D3.Hero.VisualItem.CreateBuilder().SetEffectLevel(0).Build(), // Weapon (1) + D3.Hero.VisualItem.CreateBuilder().SetEffectLevel(0).Build(), // Weapon (2) + D3.Hero.VisualItem.CreateBuilder().SetEffectLevel(0).Build(), // Shoulders + D3.Hero.VisualItem.CreateBuilder().SetEffectLevel(0).Build(), // Legs + }; var CosmeticItems = new[] { - D3.Hero.VisualCosmeticItem.CreateBuilder().SetGbid(Cosmetic1).Build(), // Wings - D3.Hero.VisualCosmeticItem.CreateBuilder().SetGbid(Cosmetic2).Build(), // Flag - D3.Hero.VisualCosmeticItem.CreateBuilder().SetGbid(Cosmetic3).Build(), // Pet - D3.Hero.VisualCosmeticItem.CreateBuilder().SetGbid(Cosmetic4).Build(), // Frame - }; - var visibleEquipment = DBSessions.SessionQueryWhere(inv => inv.DBToon.Id == PersistentID && inv.EquipmentSlot > 0 && inv.EquipmentSlot < 15 && inv.ForSale == false); + D3.Hero.VisualCosmeticItem.CreateBuilder().SetGbid(Cosmetic1).Build(), // Wings + D3.Hero.VisualCosmeticItem.CreateBuilder().SetGbid(Cosmetic2).Build(), // Flag + D3.Hero.VisualCosmeticItem.CreateBuilder().SetGbid(Cosmetic3).Build(), // Pet + D3.Hero.VisualCosmeticItem.CreateBuilder().SetGbid(Cosmetic4).Build(), // Frame + }; + var visibleEquipment = DBSessions.SessionQueryWhere(inv => + inv.DBToon.Id == PersistentID && inv.EquipmentSlot > 0 && inv.EquipmentSlot < 15 && + inv.ForSale == false); foreach (var inv in visibleEquipment) { var slot = inv.EquipmentSlot; - if (!visualToSlotMapping.ContainsKey(slot)) + if (!_visualToSlotMapping.ContainsKey(slot)) continue; // decode vislual slot from equipment slot - slot = visualToSlotMapping[slot]; + slot = _visualToSlotMapping[slot]; visualItems[slot] = D3.Hero.VisualItem.CreateBuilder() .SetGbid(inv.TransmogGBID == -1 ? inv.GbId : inv.TransmogGBID) .SetDyeType(inv.DyeType) @@ -141,14 +195,18 @@ namespace DiIiS_NA.LoginServer.Toons .Build(); } - _visualEquipment = D3.Hero.VisualEquipment.CreateBuilder().AddRangeVisualItem(visualItems).AddRangeCosmeticItem(CosmeticItems).Build(); + _visualEquipment = D3.Hero.VisualEquipment.CreateBuilder().AddRangeVisualItem(visualItems) + .AddRangeCosmeticItem(CosmeticItems).Build(); _visualEquipmentChanged = false; } - return new ByteStringPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Hero, 3, 0, _visualEquipment); + + return new ByteStringPresenceField(FieldKeyHelper.Program.D3, + FieldKeyHelper.OriginatingClass.Hero, 3, 0, _visualEquipment); } } - public IntPresenceField HighestUnlockedDifficulty => new IntPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Hero, 7, 0, 9); + public IntPresenceField HighestUnlockedDifficulty => new IntPresenceField(FieldKeyHelper.Program.D3, + FieldKeyHelper.OriginatingClass.Hero, 7, 0, 9); /// /// D3 EntityID encoded id. @@ -172,11 +230,7 @@ namespace DiIiS_NA.LoginServer.Toons } } - public bool IsSeasoned - { - get; - set; - } + public bool IsSeasoned { get; set; } public int SeasonCreated { @@ -241,7 +295,8 @@ namespace DiIiS_NA.LoginServer.Toons { get { - return DBSessions.SessionQueryWhere(dbi => dbi.SetId == 6 && dbi.ClaimedToon.Id == PersistentID).Any(); + return DBSessions + .SessionQueryWhere(dbi => dbi.SetId == 6 && dbi.ClaimedToon.Id == PersistentID).Any(); } set { } @@ -340,7 +395,7 @@ namespace DiIiS_NA.LoginServer.Toons HeroClassField.Value = 0x1D4681B1; break; case ToonClass.Necromancer: - HeroClassField.Value = 0x8D4D94ED;//unchecked((int)0x8D4D94ED); + HeroClassField.Value = 0x8D4D94ED; //unchecked((int)0x8D4D94ED); break; default: HeroClassField.Value = 0x0; @@ -374,6 +429,7 @@ namespace DiIiS_NA.LoginServer.Toons private byte _cachedLevel = 0; private bool _levelChanged = true; + /// /// Toon's level. /// @@ -386,6 +442,7 @@ namespace DiIiS_NA.LoginServer.Toons _cachedLevel = DBToon.Level; _levelChanged = false; } + return _cachedLevel; } private set @@ -415,6 +472,7 @@ namespace DiIiS_NA.LoginServer.Toons _cachedParagonLevel = GameAccount.DBGameAccount.ParagonLevel; _paragonLevelChanged = false; } + return _cachedParagonLevel; } private set @@ -544,24 +602,31 @@ namespace DiIiS_NA.LoginServer.Toons /// /// Killed monsters(total for account) /// - public ulong TotalKilled { + public ulong TotalKilled + { get => GameAccount.DBGameAccount.TotalKilled; - set { + set + { var dbGA = GameAccount.DBGameAccount; - lock (dbGA) { + lock (dbGA) + { dbGA.TotalKilled = value; DBSessions.SessionUpdate(dbGA); } } } + /// /// Killed elites(total for account) /// - public ulong ElitesKilled { + public ulong ElitesKilled + { get => GameAccount.DBGameAccount.ElitesKilled; - set { + set + { var dbGA = GameAccount.DBGameAccount; - lock (dbGA) { + lock (dbGA) + { dbGA.ElitesKilled = value; DBSessions.SessionUpdate(dbGA); } @@ -571,24 +636,33 @@ namespace DiIiS_NA.LoginServer.Toons /// /// Bounties completed(total for account) /// - public int TotalBounties { - get { - if (IsHardcore) { + public int TotalBounties + { + get + { + if (IsHardcore) + { return GameAccount.DBGameAccount.TotalBountiesHardcore; } - else { + else + { return GameAccount.DBGameAccount.TotalBounties; } } - set { + set + { var dbGA = GameAccount.DBGameAccount; - lock (dbGA) { - if (IsHardcore) { + lock (dbGA) + { + if (IsHardcore) + { dbGA.TotalBountiesHardcore = value; } - else { + else + { dbGA.TotalBounties = value; } + DBSessions.SessionUpdate(dbGA); } } @@ -614,24 +688,33 @@ namespace DiIiS_NA.LoginServer.Toons /// /// Total collected Gold(total for account) /// - public ulong CollectedGold { - get { - if (IsHardcore) { + public ulong CollectedGold + { + get + { + if (IsHardcore) + { return GameAccount.DBGameAccount.HardTotalGold; } - else { + else + { return GameAccount.DBGameAccount.TotalGold; } } - set { + set + { var dbGAcc = GameAccount.DBGameAccount; - lock (dbGAcc) { - if (IsHardcore) { + lock (dbGAcc) + { + if (IsHardcore) + { dbGAcc.HardTotalGold = value; } - else { + else + { dbGAcc.TotalGold = value; } + DBSessions.SessionUpdate(dbGAcc); } } @@ -685,6 +768,7 @@ namespace DiIiS_NA.LoginServer.Toons /// Settings for toon. /// private D3.Client.ToonSettings _settings = D3.Client.ToonSettings.CreateBuilder().Build(); + public D3.Client.ToonSettings Settings { get => D3.Client.ToonSettings.CreateBuilder().SetUiFlags(0xFFFFFFFF).Build(); //this._settings; @@ -704,24 +788,24 @@ namespace DiIiS_NA.LoginServer.Toons //var isSeason = Convert.ToUInt16(isSeassoned); var digest = D3.Hero.Digest.CreateBuilder().SetVersion(905) - .SetHeroId(D3EntityID) - .SetHeroName(Name) - .SetGbidClass((int)ClassID) - .SetLevel(Level) - //deprecated //.SetAltLevel(dbToon.ParagonLevel) - .SetPlayerFlags((uint)dbToon.Flags)// + isSeason) - .SetSeasonCreated((uint)SeasonCreated) - - .SetVisualEquipment(HeroVisualEquipmentField.Value) - .SetLastPlayedAct(dbToon.CurrentAct) - .SetHighestUnlockedAct(3000) - //deprecated //.SetLastPlayedDifficulty(dbToon.CurrentDifficulty) - - //deprecated //.SetHighestCompletedDifficulty(0) - .SetHighestSoloRiftCompleted(3) - .SetLastPlayedQuest(dbToon.CurrentQuestId) - .SetLastPlayedQuestStep(dbToon.CurrentQuestStepId) - .SetTimePlayed((uint)dbToon.TimePlayed); + .SetHeroId(D3EntityID) + .SetHeroName(Name) + .SetGbidClass((int)ClassID) + .SetLevel(Level) + //deprecated //.SetAltLevel(dbToon.ParagonLevel) + .SetPlayerFlags((uint)dbToon.Flags) // + isSeason) + .SetSeasonCreated((uint)SeasonCreated) + + .SetVisualEquipment(HeroVisualEquipmentField.Value) + .SetLastPlayedAct(dbToon.CurrentAct) + .SetHighestUnlockedAct(3000) + //deprecated //.SetLastPlayedDifficulty(dbToon.CurrentDifficulty) + + //deprecated //.SetHighestCompletedDifficulty(0) + .SetHighestSoloRiftCompleted(3) + .SetLastPlayedQuest(dbToon.CurrentQuestId) + .SetLastPlayedQuestStep(dbToon.CurrentQuestStepId) + .SetTimePlayed((uint)dbToon.TimePlayed); if (!IsHardcore) { @@ -736,50 +820,90 @@ namespace DiIiS_NA.LoginServer.Toons _dbQuests = DBSessions.SessionQueryWhere(dbi => dbi.DBToon.Id == PersistentID); #if DEBUG digest - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(87700)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(72095)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(72221)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(72061)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(117779)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(72738)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(72738)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(73236)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(72546)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(72801)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(136656)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(87700)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(72095)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(72221)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(72061)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(117779)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(72738)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(72738)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(73236)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(72546)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(72801)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(136656)) //2 Акт - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(80322)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(93396)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(74128)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(57331)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(78264)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(78266)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(57335)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(57337)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(121792)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(57339)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(80322)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(93396)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(74128)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(57331)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(78264)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(78266)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(57335)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(57337)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(121792)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(57339)) //3 Акт - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(93595)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(93684)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(93697)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(203595)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(101756)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(101750)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(101758)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(93595)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(93684)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(93697)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(203595)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(101756)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(101750)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(101758)) //4 Акт - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(112498)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(113910)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(114795)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(114901)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(112498)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(113910)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(114795)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(114901)) //5 Акт - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(251355)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(284683)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(285098)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(257120)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(263851)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(273790)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(269552)) - .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(273408)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(251355)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(284683)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(285098)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(257120)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(263851)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(273790)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(269552)) + .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0) + .SetSnoQuest(273408)) ; #else foreach (var inv in _dbQuests) @@ -801,9 +925,11 @@ namespace DiIiS_NA.LoginServer.Toons #endif } + return digest.Build(); } } + //*/ /// /// Hero Profile. @@ -813,13 +939,15 @@ namespace DiIiS_NA.LoginServer.Toons get { var itemList = D3.Items.ItemList.CreateBuilder(); - List heroInventoryItems = DBSessions.SessionQueryWhere(dbi => dbi.DBToon.Id == PersistentID); + List heroInventoryItems = + DBSessions.SessionQueryWhere(dbi => dbi.DBToon.Id == PersistentID); //* foreach (var invItem in heroInventoryItems) { if ((invItem.EquipmentSlot) == 0 || (invItem.EquipmentSlot == 15)) continue; var item = D3.Items.SavedItem.CreateBuilder() - .SetId(D3.OnlineService.ItemId.CreateBuilder().SetIdLow(0).SetIdHigh(0x3C000002517A293 + (ulong)invItem.Id)) + .SetId(D3.OnlineService.ItemId.CreateBuilder().SetIdLow(0) + .SetIdHigh(0x3C000002517A293 + (ulong)invItem.Id)) .SetHirelingClass(0) .SetItemSlot(272 + (invItem.EquipmentSlot * 16)) .SetOwnerEntityId(D3EntityID) @@ -827,15 +955,20 @@ namespace DiIiS_NA.LoginServer.Toons .SetUsedSocketCount(0); var generator = D3.Items.Generator.CreateBuilder() - .SetGbHandle(D3.GameBalance.Handle.CreateBuilder().SetGbid(invItem.GbId).SetGameBalanceType(2)) - .SetStackSize(0) - .SetDyeType((uint)invItem.DyeType) - .SetFlags((uint)((invItem.Version == 1 || GameServer.GSSystem.ItemsSystem.ItemGenerator.IsCrafted(invItem.Attributes)) ? 2147483647 : 10633)) - .SetSeed((uint)GameServer.GSSystem.ItemsSystem.ItemGenerator.GetSeed(invItem.Attributes)) - .SetTransmogGbid(invItem.TransmogGBID) - .SetDurability(509); - if (invItem.RareItemName != null) generator.SetRareItemName(D3.Items.RareItemName.ParseFrom(invItem.RareItemName)); - List affixes = invItem.Affixes.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList(); + .SetGbHandle(D3.GameBalance.Handle.CreateBuilder().SetGbid(invItem.GbId).SetGameBalanceType(2)) + .SetStackSize(0) + .SetDyeType((uint)invItem.DyeType) + .SetFlags((uint)((invItem.Version == 1 || + GameServer.GSSystem.ItemsSystem.ItemGenerator.IsCrafted(invItem.Attributes)) + ? 2147483647 + : 10633)) + .SetSeed((uint)GameServer.GSSystem.ItemsSystem.ItemGenerator.GetSeed(invItem.Attributes)) + .SetTransmogGbid(invItem.TransmogGBID) + .SetDurability(509); + if (invItem.RareItemName != null) + generator.SetRareItemName(D3.Items.RareItemName.ParseFrom(invItem.RareItemName)); + List affixes = invItem.Affixes.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) + .ToList(); //if (affixes.Count() > 3 ) generator.SetFlags(10633); generator.SetItemQualityLevel(invItem.Quality); foreach (string affix in affixes) @@ -844,47 +977,57 @@ namespace DiIiS_NA.LoginServer.Toons Int32.TryParse(affix, out result); generator.AddBaseAffixes(result); } - #region gems + + #region gems + if (invItem.FirstGem != -1) generator.AddContents(D3.Items.EmbeddedGenerator.CreateBuilder() - .SetId(D3.OnlineService.ItemId.CreateBuilder().SetIdLow(0).SetIdHigh(0x3C000002517A293 + (ulong)invItem.Id)) + .SetId(D3.OnlineService.ItemId.CreateBuilder().SetIdLow(0) + .SetIdHigh(0x3C000002517A293 + (ulong)invItem.Id)) .SetGenerator(D3.Items.Generator.CreateBuilder() - .SetGbHandle(D3.GameBalance.Handle.CreateBuilder().SetGbid(invItem.FirstGem).SetGameBalanceType(2)) + .SetGbHandle(D3.GameBalance.Handle.CreateBuilder().SetGbid(invItem.FirstGem) + .SetGameBalanceType(2)) .SetFlags(2147483647) .SetSeed(0) .SetDurability(509) .SetStackSize(0) ) - ); + ); if (invItem.SecondGem != -1) generator.AddContents(D3.Items.EmbeddedGenerator.CreateBuilder() - .SetId(D3.OnlineService.ItemId.CreateBuilder().SetIdLow(0).SetIdHigh(0x3C000002517A293 + (ulong)invItem.Id)) + .SetId(D3.OnlineService.ItemId.CreateBuilder().SetIdLow(0) + .SetIdHigh(0x3C000002517A293 + (ulong)invItem.Id)) .SetGenerator(D3.Items.Generator.CreateBuilder() - .SetGbHandle(D3.GameBalance.Handle.CreateBuilder().SetGbid(invItem.SecondGem).SetGameBalanceType(2)) + .SetGbHandle(D3.GameBalance.Handle.CreateBuilder().SetGbid(invItem.SecondGem) + .SetGameBalanceType(2)) .SetFlags(2147483647) .SetSeed(0) .SetDurability(509) .SetStackSize(0) ) - ); + ); if (invItem.ThirdGem != -1) generator.AddContents(D3.Items.EmbeddedGenerator.CreateBuilder() - .SetId(D3.OnlineService.ItemId.CreateBuilder().SetIdLow(0).SetIdHigh(0x3C000002517A293 + (ulong)invItem.Id)) + .SetId(D3.OnlineService.ItemId.CreateBuilder().SetIdLow(0) + .SetIdHigh(0x3C000002517A293 + (ulong)invItem.Id)) .SetGenerator(D3.Items.Generator.CreateBuilder() - .SetGbHandle(D3.GameBalance.Handle.CreateBuilder().SetGbid(invItem.ThirdGem).SetGameBalanceType(2)) + .SetGbHandle(D3.GameBalance.Handle.CreateBuilder().SetGbid(invItem.ThirdGem) + .SetGameBalanceType(2)) .SetFlags(2147483647) .SetSeed(0) .SetDurability(509) .SetStackSize(0) ) - ); + ); + #endregion item.SetGenerator(generator); itemList.AddItems(item.Build()); } + //*/ var dbToon = DBToon; string[] stats = dbToon.Stats.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); @@ -920,27 +1063,37 @@ namespace DiIiS_NA.LoginServer.Toons if (DBActiveSkills != null) { var dbActiveSkills = DBActiveSkills; - var skills = new[]{ - D3.Profile.SkillWithRune.CreateBuilder().SetSkill(dbActiveSkills.Skill0).SetRuneType(dbActiveSkills.Rune0).Build(), - D3.Profile.SkillWithRune.CreateBuilder().SetSkill(dbActiveSkills.Skill1).SetRuneType(dbActiveSkills.Rune1).Build(), - D3.Profile.SkillWithRune.CreateBuilder().SetSkill(dbActiveSkills.Skill2).SetRuneType(dbActiveSkills.Rune2).Build(), - D3.Profile.SkillWithRune.CreateBuilder().SetSkill(dbActiveSkills.Skill3).SetRuneType(dbActiveSkills.Rune3).Build(), - D3.Profile.SkillWithRune.CreateBuilder().SetSkill(dbActiveSkills.Skill4).SetRuneType(dbActiveSkills.Rune4).Build(), - D3.Profile.SkillWithRune.CreateBuilder().SetSkill(dbActiveSkills.Skill5).SetRuneType(dbActiveSkills.Rune5).Build() - }; - var passives = new[]{ - dbActiveSkills.Passive0, dbActiveSkills.Passive1, dbActiveSkills.Passive2, dbActiveSkills.Passive3 - }; + var skills = new[] + { + D3.Profile.SkillWithRune.CreateBuilder().SetSkill(dbActiveSkills.Skill0) + .SetRuneType(dbActiveSkills.Rune0).Build(), + D3.Profile.SkillWithRune.CreateBuilder().SetSkill(dbActiveSkills.Skill1) + .SetRuneType(dbActiveSkills.Rune1).Build(), + D3.Profile.SkillWithRune.CreateBuilder().SetSkill(dbActiveSkills.Skill2) + .SetRuneType(dbActiveSkills.Rune2).Build(), + D3.Profile.SkillWithRune.CreateBuilder().SetSkill(dbActiveSkills.Skill3) + .SetRuneType(dbActiveSkills.Rune3).Build(), + D3.Profile.SkillWithRune.CreateBuilder().SetSkill(dbActiveSkills.Skill4) + .SetRuneType(dbActiveSkills.Rune4).Build(), + D3.Profile.SkillWithRune.CreateBuilder().SetSkill(dbActiveSkills.Skill5) + .SetRuneType(dbActiveSkills.Rune5).Build() + }; + var passives = new[] + { + dbActiveSkills.Passive0, dbActiveSkills.Passive1, dbActiveSkills.Passive2, + dbActiveSkills.Passive3 + }; profile.SetSnoActiveSkills(D3.Profile.SkillsWithRunes.CreateBuilder().AddRangeRunes(skills)); profile.SetSnoTraits(D3.Profile.PassiveSkills.CreateBuilder().AddRangeSnoTraits(passives)); - + } + profile.SetLegendaryPowers(D3.Profile.LegendaryPowers.CreateBuilder() .AddGbidLegendaryPowers(-1) .AddGbidLegendaryPowers(-1) .AddGbidLegendaryPowers(-1) - ) - .SetPvpDamage(0) + ) + .SetPvpDamage(0) .SetPvpWins(0) .SetPvpGlory(0) .SetPvpTakedowns(0) @@ -985,48 +1138,42 @@ namespace DiIiS_NA.LoginServer.Toons case ToonClass.Necromancer: return unchecked((int)0x8D4D94ED); } + return 0x0; } } // Used for Conversations - public int VoiceClassID - { - get + public int VoiceClassID => + Class switch { - switch (Class) - { - case ToonClass.DemonHunter: - return 0; - case ToonClass.Barbarian: - return 1; - case ToonClass.Wizard: - return 2; - case ToonClass.WitchDoctor: - return 3; - case ToonClass.Monk: - return 4; - case ToonClass.Crusader: - return 5; - case ToonClass.Necromancer: - return 6; - } - return 0; - } - } + ToonClass.DemonHunter => 0, + ToonClass.Barbarian => 1, + ToonClass.Wizard => 2, + ToonClass.WitchDoctor => 3, + ToonClass.Monk => 4, + ToonClass.Crusader => 5, + ToonClass.Necromancer => 6, + _ => 0 + }; public int Gender => (int)(Flags & ToonFlags.Female); #region c-tor and setfields public readonly Core.MPQ.FileFormats.GameBalance.HeroTable HeroTable; - private readonly Dictionary visualToSlotMapping = new Dictionary { { 1, 0 }, { 2, 1 }, { 7, 2 }, { 5, 3 }, { 4, 4 }, { 3, 5 }, { 8, 6 }, { 9, 7 } }; - private static readonly Core.MPQ.FileFormats.GameBalance HeroData = (Core.MPQ.FileFormats.GameBalance)MPQStorage.Data.Assets[SNOGroup.GameBalance][19740].Data; + + private readonly Dictionary _visualToSlotMapping = new Dictionary + { { 1, 0 }, { 2, 1 }, { 7, 2 }, { 5, 3 }, { 4, 4 }, { 3, 5 }, { 8, 6 }, { 9, 7 } }; + + private static readonly Core.MPQ.FileFormats.GameBalance HeroData = + (Core.MPQ.FileFormats.GameBalance)MPQStorage.Data.Assets[SNOGroup.GameBalance][19740].Data; public Toon(DBToon dbToon, GameDBSession DBSession = null) : base(dbToon.Id) { - D3EntityID = D3.OnlineService.EntityId.CreateBuilder().SetIdHigh((ulong)EntityIdHelper.HighIdType.ToonId).SetIdLow(PersistentID).Build(); + D3EntityID = D3.OnlineService.EntityId.CreateBuilder().SetIdHigh((ulong)EntityIdHelper.HighIdType.ToonId) + .SetIdLow(PersistentID).Build(); _heroName = dbToon.Name; _flags = dbToon.Flags; GameAccountId = dbToon.DBGameAccount.Id; @@ -1053,7 +1200,12 @@ namespace DiIiS_NA.LoginServer.Toons GameAccount.ChangedFields.SetIntPresenceFieldValue(HeroParagonLevelField); } - private List _allQuests = new List() { 87700, 72095, 72221, 72061, 117779, 72738, 73236, 72546, 72801, 136656, 80322, 93396, 74128, 57331, 78264, 78266, 57335, 57337, 121792, 57339, 93595, 93684, 93697, 203595, 101756, 101750, 101758, 112498, 113910, 114795, 114901, 251355, 284683, 285098, 257120, 263851, 273790, 269552, 273408 }; + private readonly List _allQuests = new() + { + 87700, 72095, 72221, 72061, 117779, 72738, 73236, 72546, 72801, 136656, 80322, 93396, 74128, 57331, 78264, + 78266, 57335, 57337, 121792, 57339, 93595, 93684, 93697, 203595, 101756, 101750, 101758, 112498, 113910, + 114795, 114901, 251355, 284683, 285098, 257120, 263851, 273790, 269552, 273408 + }; public void UnlockAllQuests() { @@ -1061,18 +1213,20 @@ namespace DiIiS_NA.LoginServer.Toons foreach (var quest in _allQuests) { - if (!questList.Any(qh => qh.QuestId == quest)) + if (questList.All(qh => qh.QuestId != quest)) { - var questHistory = new DBQuestHistory(); - questHistory.DBToon = DBToon; - questHistory.QuestId = quest; - questHistory.QuestStep = -1; - questHistory.isCompleted = true; + var questHistory = new DBQuestHistory + { + DBToon = DBToon, + QuestId = quest, + QuestStep = -1, + isCompleted = true + }; DBSessions.SessionSave(questHistory); } else { - var questHistory = questList.Where(qh => qh.QuestId == quest).First(); + var questHistory = questList.First(qh => qh.QuestId == quest); questHistory.isCompleted = true; DBSessions.SessionUpdate(questHistory); } @@ -1085,6 +1239,7 @@ namespace DiIiS_NA.LoginServer.Toons _paragonLevelChanged = true; _visualEquipmentChanged = true; } + #region Notifications //hero class generated @@ -1133,26 +1288,28 @@ namespace DiIiS_NA.LoginServer.Toons case unchecked((int)0x8D4D94ED): return ToonClass.Necromancer; } + return ToonClass.Barbarian; } public override string ToString() { - return String.Format("{{ Toon: {0} [lowId: {1}] }}", Name, D3EntityID.IdLow); + return $"{{ Toon: {Name} [lowId: {D3EntityID.IdLow}] }}"; } } #region Definitions and Enums + //Order is important as actor voices and saved data is based on enum index - public enum ToonClass// : uint + public enum ToonClass // : uint { - Barbarian,// = 0x4FB91EE2, - Monk,//= 0x3DAC15, - DemonHunter,// = 0xC88B9649, - WitchDoctor,// = 0x343C22A, - Wizard,// = 0x1D4681B1 - Crusader,// = 0xBE27DC19 + Barbarian, // = 0x4FB91EE2, + Monk, //= 0x3DAC15, + DemonHunter, // = 0xC88B9649, + WitchDoctor, // = 0x343C22A, + Wizard, // = 0x1D4681B1 + Crusader, // = 0xBE27DC19 Necromancer, Unknown } @@ -1165,6 +1322,7 @@ namespace DiIiS_NA.LoginServer.Toons Female = 0x02, Fallen = 0x08, NeedRename = 0x20000000, + // TODO: These two need to be figured out still.. /plash //Unknown1 = 0x20, Unknown2 = 0x40, @@ -1172,5 +1330,6 @@ namespace DiIiS_NA.LoginServer.Toons Unknown4 = 0x2000000, AllUnknowns = Unknown2 | Unknown3 | Unknown4 } + #endregion -} +} \ No newline at end of file diff --git a/src/DiIiS-NA/Core/MPQ/MPQPatchChain.cs b/src/DiIiS-NA/Core/MPQ/MPQPatchChain.cs index 858c0c7..3a9040b 100644 --- a/src/DiIiS-NA/Core/MPQ/MPQPatchChain.cs +++ b/src/DiIiS-NA/Core/MPQ/MPQPatchChain.cs @@ -85,7 +85,7 @@ namespace DiIiS_NA.Core.MPQ { foreach (var mpq in pair.Value) { - Logger.Trace("MPQ: {0}, added to the system.", System.IO.Path.GetFileName(mpq)); + Logger.Debug("MPQ: {0}, added to the system.", System.IO.Path.GetFileName(mpq)); this.FileSystem.Archives.Add(new MpqArchive(new FileStream(mpq, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), true)); } } diff --git a/src/DiIiS-NA/D3-GameServer/CommandManager/Commands/DropCommand.cs b/src/DiIiS-NA/D3-GameServer/CommandManager/Commands/DropCommand.cs index 475e2d2..832c046 100644 --- a/src/DiIiS-NA/D3-GameServer/CommandManager/Commands/DropCommand.cs +++ b/src/DiIiS-NA/D3-GameServer/CommandManager/Commands/DropCommand.cs @@ -16,7 +16,7 @@ public class DropCommand : CommandGroup var amount = 1; if (@params != null && @params.Any()) if (!int.TryParse(@params[0], out amount)) - amount = 1; + return "Invalid amount."; amount = amount switch { diff --git a/src/DiIiS-NA/D3-GameServer/CommandManager/Commands/InfoCommand.cs b/src/DiIiS-NA/D3-GameServer/CommandManager/Commands/InfoCommand.cs index 1839c18..ec6baad 100644 --- a/src/DiIiS-NA/D3-GameServer/CommandManager/Commands/InfoCommand.cs +++ b/src/DiIiS-NA/D3-GameServer/CommandManager/Commands/InfoCommand.cs @@ -35,6 +35,7 @@ public class InfoCommand : CommandGroup foreach (var world in game.Worlds) { info.Add($"World: {world.SNO.ToString()} - {(int)world.SNO}"); + info.Add($"World Id: {world.GlobalID}"); info.Add($"Players: {world.Players.Count}"); info.Add($"Monsters: {world.Monsters.Count}"); info.Add($"{world.Monsters.Count} players in world: "); diff --git a/src/DiIiS-NA/D3-GameServer/Core/InventoryGrid.cs b/src/DiIiS-NA/D3-GameServer/Core/InventoryGrid.cs index 41c7181..eff62eb 100644 --- a/src/DiIiS-NA/D3-GameServer/Core/InventoryGrid.cs +++ b/src/DiIiS-NA/D3-GameServer/Core/InventoryGrid.cs @@ -275,9 +275,8 @@ namespace DiIiS_NA.GameServer.Core } item.Owner = _owner; - if (_owner is Player) + if (_owner is Player ownerPlayer) { - var ownerPlayer = _owner as Player; item.SetInventoryLocation(EquipmentSlot, column, row); if (EquipmentSlot == 15) ownerPlayer.Inventory.SaveItemToDB(ownerPlayer.Toon.GameAccount.DBGameAccount, null, EquipmentSlotId.Stash, item); @@ -416,8 +415,7 @@ namespace DiIiS_NA.GameServer.Core public Item GetItem(uint itemId) { - Item item; - if (!Items.TryGetValue(itemId, out item)) + if (!Items.TryGetValue(itemId, out var item)) return null; return item; } diff --git a/src/DiIiS-NA/D3-GameServer/Core/Types/TagMap/PowerKeys.cs b/src/DiIiS-NA/D3-GameServer/Core/Types/TagMap/PowerKeys.cs index 601bf75..6634239 100644 --- a/src/DiIiS-NA/D3-GameServer/Core/Types/TagMap/PowerKeys.cs +++ b/src/DiIiS-NA/D3-GameServer/Core/Types/TagMap/PowerKeys.cs @@ -6,7 +6,7 @@ namespace DiIiS_NA.GameServer.Core.Types.TagMap public class PowerKeys { #region compile a dictionary to access keys from ids. If you need a readable name for a TagID, look up its key and get its name - private static Dictionary tags = new Dictionary(); + private static Dictionary tags = new(); public static TagKey GetKey(int index) { @@ -24,483 +24,483 @@ namespace DiIiS_NA.GameServer.Core.Types.TagMap } #endregion - public static TagKeyInt TurnsIntoBasicMeleeAttack = new TagKeyInt(328386); - public static TagKeyInt ReuseScriptState = new TagKeyInt(274432); - public static TagKeyInt CastTargetEnemies = new TagKeyInt(328113); - public static TagKeyInt CustomTargetUnaffectedOnly = new TagKeyInt(328800); - public static TagKeyInt IsUsableInTown = new TagKeyInt(328080); - public static TagKeyInt TurnsIntoBasicRangedAttack = new TagKeyInt(328385); - public static TagKeyInt IsPrimary = new TagKeyInt(327776); - public static TagKeyScript IsInvulnerableDuring = new TagKeyScript(328609); - public static TagKeyInt OffhandAnimationTag_fordualwield = new TagKeyInt(262663); - public static TagKeyInt IsPassive = new TagKeyInt(328592); - public static TagKeyInt AnimationTag2 = new TagKeyInt(262658); - public static TagKeyInt AnimationTag = new TagKeyInt(262656); - public static TagKeyScript IsUntargetableDuring = new TagKeyScript(633616); - public static TagKeyScript IsUninterruptableDuring = new TagKeyScript(328610); - public static TagKeyScript BaseDamageScalar = new TagKeyScript(329840); - public static TagKeyInt AlwaysHits = new TagKeyInt(327904); - public static TagKeySNO CastingEffectGroup_Female = new TagKeySNO(264273); - public static TagKeySNO CastingEffectGroup_Male = new TagKeySNO(262660); - public static TagKeyInt Buff0ShowDuration = new TagKeyInt(271104); - public static TagKeyScript CooldownTime = new TagKeyScript(327768); - public static TagKeySNO Buff1EffectGroup = new TagKeySNO(270337); - public static TagKeySNO Buff0EffectGroup = new TagKeySNO(270336); - public static TagKeyInt CastTargetAllies = new TagKeyInt(328097); - public static TagKeyInt RequiresTarget = new TagKeyInt(328432); - public static TagKeyInt Buff3IsHarmful = new TagKeyInt(270851); - public static TagKeyScript ResourceCost = new TagKeyScript(329616); - public static TagKeyInt IconMouseover = new TagKeyInt(329488); - public static TagKeyInt IconNormal = new TagKeyInt(329472); - public static TagKeyInt IconPushed = new TagKeyInt(329504); - public static TagKeyInt Buff3Icon = new TagKeyInt(270595); - public static TagKeyInt Buff2ShowDuration = new TagKeyInt(271106); - public static TagKeyInt IsMouseAssignable = new TagKeyInt(328048); - public static TagKeyInt IsHotbarAssignable = new TagKeyInt(328064); - public static TagKeyInt IsOffensive = new TagKeyInt(327840); - public static TagKeyInt IsDisplayed = new TagKeyInt(327824); - public static TagKeyInt Template = new TagKeyInt(327680); - public static TagKeyInt CannotLMBAssign = new TagKeyInt(327920); - public static TagKeyInt Buff2Icon = new TagKeyInt(270594); - public static TagKeyInt Buff1Icon = new TagKeyInt(270593); - public static TagKeyScript ScriptFormula10 = new TagKeyScript(266752); - public static TagKeyScript ScriptFormula11 = new TagKeyScript(266768); - public static TagKeyScript ScriptFormula12 = new TagKeyScript(266784); - public static TagKeyScript ScriptFormula13 = new TagKeyScript(266800); - public static TagKeyScript ScriptFormula14 = new TagKeyScript(266816); - public static TagKeyInt Buff0PlayerCanCancel = new TagKeyInt(271360); - public static TagKeyInt IconInactive = new TagKeyInt(329512); - public static TagKeyInt Buff0Icon = new TagKeyInt(270592); - public static TagKeyScript ScriptFormula0 = new TagKeyScript(266496); - public static TagKeyScript ScriptFormula2 = new TagKeyScript(266528); - public static TagKeyScript ScriptFormula3 = new TagKeyScript(266544); - public static TagKeyScript ScriptFormula4 = new TagKeyScript(266560); - public static TagKeyScript ScriptFormula5 = new TagKeyScript(266576); - public static TagKeyScript ScriptFormula7 = new TagKeyScript(266608); - public static TagKeyInt Buff3ShowDuration = new TagKeyInt(271107); - public static TagKeyInt Buff2PlayerCanCancel = new TagKeyInt(271362); - public static TagKeyScript FailsIfStunned = new TagKeyScript(328322); - public static TagKeyScript BreaksFear = new TagKeyScript(681987); - public static TagKeyScript BreaksStun = new TagKeyScript(681986); - public static TagKeyScript BreaksSnare = new TagKeyScript(681985); - public static TagKeyScript BreaksRoot = new TagKeyScript(681984); - public static TagKeyScript FailsIfFeared = new TagKeyScript(328325); - public static TagKeySNO ContactFrameEffectGroup_Male = new TagKeySNO(264192); - public static TagKeySNO ContactFrameEffectGroup_Female = new TagKeySNO(264275); - public static TagKeyInt SpellFunc0 = new TagKeyInt(327712); - public static TagKeyInt CastTargetMustBeInTeleportableArea = new TagKeyInt(328083); - public static TagKeySNO GenericEffectGroup0 = new TagKeySNO(262661); - public static TagKeyScript ConcentrationDuration = new TagKeyScript(333088); - public static TagKeyScript SlowTimeDuration = new TagKeyScript(332928); - public static TagKeyScript RingofFrostRingLifetime = new TagKeyScript(332896); - public static TagKeyScript DodgeDuration = new TagKeyScript(332848); - public static TagKeyScript DamageAuraDuration = new TagKeyScript(332832); - public static TagKeyScript RootDuration = new TagKeyScript(332816); - public static TagKeyScript CurseDuration = new TagKeyScript(332800); - public static TagKeyScript PaladinDeadTimeUntilResurrect = new TagKeyScript(332784); - public static TagKeyScript BuffDurationMin = new TagKeyScript(332736); - public static TagKeyScript ThunderingCryBuffDuration = new TagKeyScript(332720); - public static TagKeyScript ThunderstormDuration = new TagKeyScript(332704); - public static TagKeyScript TornadoLifeDurationMin = new TagKeyScript(332656); - public static TagKeySNO EndingEffectGroup = new TagKeySNO(262662); - public static TagKeyScript AttackSpeed = new TagKeyScript(329824); - public static TagKeyScript ScriptFormula23 = new TagKeyScript(267056); - public static TagKeyScript ScriptFormula22 = new TagKeyScript(267040); - public static TagKeyScript ScriptFormula20 = new TagKeyScript(267008); - public static TagKeyScript ScriptFormula21 = new TagKeyScript(267024); - public static TagKeyScript EscapeAttackRadius = new TagKeyScript(329744); - public static TagKeyScript AttackRadius = new TagKeyScript(329808); - public static TagKeyInt IgnoresRangeOnShiftClick = new TagKeyInt(328600); - public static TagKeyInt AutoAssignLocation = new TagKeyInt(328049); - public static TagKeyInt CanSteer = new TagKeyInt(327937); - public static TagKeyInt TurnsIntoBasicAttack = new TagKeyInt(328384); - public static TagKeyInt ItemTypeRequirement = new TagKeyInt(328960); - public static TagKeyInt SpecialDeathType = new TagKeyInt(328534); - public static TagKeyScript ResourceCostMinToCast = new TagKeyScript(329617); - public static TagKeyInt ControllerAutoTargets = new TagKeyInt(622592); - public static TagKeyScript ControllerMinRange = new TagKeyScript(622593); - public static TagKeyInt TargetGroundOnly = new TagKeyInt(328160); - public static TagKeyInt TurnsIntoWalk = new TagKeyInt(327936); - public static TagKeyInt IsAimedAtGround = new TagKeyInt(327888); - public static TagKeyScript ScriptFormula19 = new TagKeyScript(266896); - public static TagKeyScript ScriptFormula18 = new TagKeyScript(266880); - public static TagKeyScript ScriptFormula17 = new TagKeyScript(266864); - public static TagKeyScript ScriptFormula16 = new TagKeyScript(266848); - public static TagKeyScript ScriptFormula15 = new TagKeyScript(266832); - public static TagKeyInt UsesAttackWarmupTime = new TagKeyInt(328606); - public static TagKeyInt AlternatesAnims = new TagKeyInt(328501); - public static TagKeyFloat SpecialDeathChance = new TagKeyFloat(328532); - public static TagKeyScript ScriptFormula9 = new TagKeyScript(266640); - public static TagKeyScript ScriptFormula8 = new TagKeyScript(266624); - public static TagKeyScript ScriptFormula1 = new TagKeyScript(266512); - public static TagKeyScript ScriptFormula6 = new TagKeyScript(266592); - public static TagKeyInt ContactFrameType = new TagKeyInt(328224); - public static TagKeyScript PayloadParam0 = new TagKeyScript(329776); - public static TagKeyInt PayloadType = new TagKeyInt(329760); - public static TagKeyInt TargetEnemies = new TagKeyInt(328112); - public static TagKeyInt SpellFunc1 = new TagKeyInt(327728); - public static TagKeyScript ProjectileSpeed = new TagKeyScript(331184); - public static TagKeyScript ChargedBoltNumBolts = new TagKeyScript(331056); - public static TagKeySNO ProjectileActor = new TagKeySNO(262400); - public static TagKeyScript ProcCooldownTime = new TagKeyScript(680768); - public static TagKeyScript LightningDamageDelta = new TagKeyScript(330128); - public static TagKeyScript LightningDamageMin = new TagKeyScript(330112); - public static TagKeyInt CastTargetIgnoreWreckables = new TagKeyInt(328169); - public static TagKeyInt TargetIgnoreWreckables = new TagKeyInt(328168); - public static TagKeyScript ColdDamageMin = new TagKeyScript(330176); - public static TagKeyScript ColdDamageDelta = new TagKeyScript(330192); - public static TagKeyInt Buff1ShowDuration = new TagKeyInt(271105); - public static TagKeyInt AutoPurchaseLevel = new TagKeyInt(329520); - public static TagKeyInt Buff1PlayerCanCancel = new TagKeyInt(271361); - public static TagKeyScript ImmuneToKnockback = new TagKeyScript(328352); - public static TagKeyScript ImmuneToRecoil = new TagKeyScript(328336); - public static TagKeyInt NeverUpdatesFacing = new TagKeyInt(328000); - public static TagKeyInt ContactFreezesFacing = new TagKeyInt(327984); - public static TagKeyInt IsBasicAttack = new TagKeyInt(327808); - public static TagKeyInt SpellFuncBegin = new TagKeyInt(327696); - public static TagKeyInt SpellFuncInterrupted = new TagKeyInt(327745); - public static TagKeyScript NumCryptKidsToSpawnOnCorpulentExplosion = new TagKeyScript(332480); - public static TagKeyInt TargetAllies = new TagKeyInt(328096); - public static TagKeyInt NeverCausesRecoil = new TagKeyInt(327968); - public static TagKeyScript MonsterCritDamageScalar = new TagKeyScript(684918); - public static TagKeyScript PlayerCritDamageScalar = new TagKeyScript(684917); - public static TagKeyInt Buff0IsHarmful = new TagKeyInt(270848); - public static TagKeyInt DoesntCenter = new TagKeyInt(328032); - public static TagKeyInt IsTranslate = new TagKeyInt(327856); - public static TagKeyInt SpellFuncEnd = new TagKeyInt(327744); - public static TagKeyScript SpecialWalkTrajectoryHeight = new TagKeyScript(332320); - public static TagKeyScript SpecialWalkTrajectoryGravity = new TagKeyScript(332336); - public static TagKeyInt SpecialWalkPerturbDestination = new TagKeyInt(332360); - public static TagKeyInt IsChannelled = new TagKeyInt(328400); - public static TagKeyInt InfiniteAnimTiming = new TagKeyInt(328208); - public static TagKeyInt CustomTargetFunc = new TagKeyInt(328736); - public static TagKeyInt CustomTargetPlayersOnly = new TagKeyInt(328752); - public static TagKeyScript CustomTargetMinRange = new TagKeyScript(328768); - public static TagKeyInt SnapsToFacing = new TagKeyInt(328021); - public static TagKeyScript ManaPercentToReserve = new TagKeyScript(331600); - public static TagKeyInt ComboAnimation1 = new TagKeyInt(262912); - public static TagKeyScript ScriptFormula26 = new TagKeyScript(267104); - public static TagKeyScript ScriptFormula28 = new TagKeyScript(267136); - public static TagKeyScript ScriptFormula29 = new TagKeyScript(267152); - public static TagKeyScript EscapeAttackAngle = new TagKeyScript(329745); - public static TagKeyScript ComboAttackRadius1 = new TagKeyScript(329809); - public static TagKeyInt ComboAnimation2 = new TagKeyInt(262913); - public static TagKeyScript ComboAttackSpeed1 = new TagKeyScript(329825); - public static TagKeySNO Buff3EffectGroup = new TagKeySNO(270339); - public static TagKeyScript ComboAttackRadius2 = new TagKeyScript(329810); - public static TagKeyScript ComboAttackSpeed2 = new TagKeyScript(329826); - public static TagKeySNO Buff2EffectGroup = new TagKeySNO(270338); - public static TagKeyScript ComboAttackRadius3 = new TagKeyScript(329811); - public static TagKeyScript ComboAttackSpeed3 = new TagKeyScript(329827); - public static TagKeyInt IsComboPower = new TagKeyInt(264448); - public static TagKeyInt Buff3PlayerCanCancel = new TagKeyInt(271363); - public static TagKeyInt ComboAnimation3 = new TagKeyInt(262914); - public static TagKeySNO Combo1CastingEffectGroup_Male = new TagKeySNO(264289); - public static TagKeySNO Combo1CastingEffectGroup_Female = new TagKeySNO(264321); - public static TagKeyInt AffectedByDualWield = new TagKeyInt(328448); - public static TagKeySNO Combo0CastingEffectGroup_Male = new TagKeySNO(264288); - public static TagKeySNO Combo0CastingEffectGroup_Female = new TagKeySNO(264320); - public static TagKeySNO Combo2CastingEffectGroup_Male = new TagKeySNO(264290); - public static TagKeySNO Combo2CastingEffectGroup_Female = new TagKeySNO(264322); - public static TagKeyScript ScriptFormula30 = new TagKeyScript(267264); - public static TagKeyScript ScriptFormula31 = new TagKeyScript(267280); - public static TagKeyScript ScriptFormula32 = new TagKeyScript(267296); - public static TagKeyScript ScriptFormula33 = new TagKeyScript(267312); - public static TagKeyScript ScriptFormula34 = new TagKeyScript(267328); - public static TagKeyScript ScriptFormula35 = new TagKeyScript(267344); - public static TagKeyScript ScriptFormula36 = new TagKeyScript(267360); - public static TagKeyScript ScriptFormula37 = new TagKeyScript(267376); - public static TagKeyScript ScriptFormula58 = new TagKeyScript(267904); - public static TagKeyScript ScriptFormula59 = new TagKeyScript(267920); - public static TagKeyScript SpiritGained = new TagKeyScript(684928); - public static TagKeyScript CurseDamageAmplifyPercent = new TagKeyScript(331536); - public static TagKeyInt Buff4Icon = new TagKeyInt(270596); - public static TagKeyInt Buff4ShowDuration = new TagKeyInt(271108); - public static TagKeySNO Buff4EffectGroup = new TagKeySNO(270340); - public static TagKeyScript FailsIfSilenced = new TagKeyScript(328321); - public static TagKeyInt Buff4PlayerCanCancel = new TagKeyInt(271364); - public static TagKeyInt IsPhysical = new TagKeyInt(328624); - public static TagKeyInt HitsoundOverride = new TagKeyInt(262433); - public static TagKeyScript ScriptFormula25 = new TagKeyScript(267088); - public static TagKeyInt Requires2HItem = new TagKeyInt(328992); - public static TagKeyInt Buff2IsHarmful = new TagKeyInt(270850); - public static TagKeyInt RequiresActorTarget = new TagKeyInt(328240); - public static TagKeyInt ClipsTargetToAttackRadius = new TagKeyInt(684848); - public static TagKeyInt CastTargetNeutral = new TagKeyInt(328145); - public static TagKeyInt LOSCheck = new TagKeyInt(328720); - public static TagKeyScript AttackRating = new TagKeyScript(329888); - public static TagKeyScript DestructableObjectDamageDelay = new TagKeyScript(618496); - public static TagKeyInt TargetNeutral = new TagKeyInt(328144); - public static TagKeySNO ExplosionActor = new TagKeySNO(262401); - public static TagKeyScript StunChance = new TagKeyScript(330816); - public static TagKeyScript StunDurationMin = new TagKeyScript(330784); - public static TagKeyScript PhysicalDamageDelta = new TagKeyScript(330000); - public static TagKeyScript PhysicalDamageMin = new TagKeyScript(329984); - public static TagKeyInt IsItemPower = new TagKeyInt(328601); - public static TagKeyInt CastTargetCorpse = new TagKeyInt(328129); - public static TagKeyScript SummonedActorLevel = new TagKeyScript(331136); - public static TagKeyInt TargetContactPlaneOnly = new TagKeyInt(328162); - public static TagKeyInt DontWalkCloserIfOutOfRange = new TagKeyInt(328256); - public static TagKeyScript ResourceGainedOnFirstHit = new TagKeyScript(329627); - public static TagKeyInt LocksActorsWhileSweeping = new TagKeyInt(328420); - public static TagKeyInt Buff1IsHarmful = new TagKeyInt(270849); - public static TagKeyScript FailsIfImmobilized = new TagKeyScript(328320); - public static TagKeyInt StartWalkAfterIntro = new TagKeyInt(328288); - public static TagKeyInt RollToDestination = new TagKeyInt(328368); - public static TagKeyInt PickupItemsWhileMoving = new TagKeyInt(655984); - public static TagKeyScript WalkingSpeedMultiplier = new TagKeyScript(331952); - public static TagKeyScript SpecialWalkPlayerEndAnimScalar = new TagKeyScript(328536); - public static TagKeyInt NeverUpdatesFacingStarting = new TagKeyInt(328016); - public static TagKeyInt RequiresSkillPoint = new TagKeyInt(328248); - public static TagKeyInt IsKnockbackMovement = new TagKeyInt(327860); - public static TagKeyInt SpecialWalkIsKnockback = new TagKeyInt(332362); - public static TagKeyScript BreaksImmobilize = new TagKeyScript(328304); - public static TagKeyScript ImmunetoFearduring = new TagKeyScript(682243); - public static TagKeyScript ImmunetoRootduring = new TagKeyScript(682240); - public static TagKeyScript ImmunetoSnareduring = new TagKeyScript(682241); - public static TagKeyScript ImmunetoStunduring = new TagKeyScript(682242); - public static TagKeyInt CastTargetNormalMonstersOnly = new TagKeyInt(328617); - public static TagKeyInt CausesClosingCooldown = new TagKeyInt(328632); - public static TagKeyInt CastTargetIgnoreLargeMonsters = new TagKeyInt(328616); - public static TagKeyScript CustomTargetMaxRange = new TagKeyScript(328784); - public static TagKeySNO CustomTargetBuffPowerSNO = new TagKeySNO(328802); - public static TagKeyScript FireDamageDelta = new TagKeyScript(330064); - public static TagKeyScript FireDamageMin = new TagKeyScript(330048); - public static TagKeyInt DisplaysNoDamage = new TagKeyInt(327829); - public static TagKeyScript SkillPointCost = new TagKeyScript(329312); - public static TagKeyInt CannotLockOntoActors = new TagKeyInt(328416); - public static TagKeyInt ChannelledLocksActors = new TagKeyInt(328401); - public static TagKeyInt NoAffectedACD = new TagKeyInt(328176); - public static TagKeyScript ResourceCostReductionCoefficient = new TagKeyScript(329625); - public static TagKeyInt TargetNavMeshOnly = new TagKeyInt(328163); - public static TagKeySNO HitEffect = new TagKeySNO(684034); - public static TagKeyInt OverrideHitEffects = new TagKeyInt(684032); - public static TagKeyInt AnimationTagRuneE = new TagKeyInt(262677); - public static TagKeyScript LifestealPercent = new TagKeyScript(331224); - public static TagKeyScript CritChance = new TagKeyScript(331008); - public static TagKeyScript GhostSoulsiphonMaxChannellingDistance = new TagKeyScript(365056); - public static TagKeySNO Source_DestEffectGroup = new TagKeySNO(262659); - public static TagKeyScript GhostSoulsiphonMaxChannellingTime = new TagKeyScript(364800); - public static TagKeyScript GhostSoulsiphonSlowMultiplier = new TagKeyScript(364544); - public static TagKeyScript GhostSoulsiphonDamagePerSecond = new TagKeyScript(365312); - public static TagKeyInt CastTargetAllowDeadTargets = new TagKeyInt(328620); - public static TagKeyScript BuffDurationDelta = new TagKeyScript(332752); - public static TagKeyScript SlowMovementSpeedMultiplier = new TagKeyScript(692224); - public static TagKeyScript FireDuration = new TagKeyScript(329976); - public static TagKeyInt IsCancellable = new TagKeyInt(328544); - public static TagKeyScript StunDurationDelta = new TagKeyScript(330800); - public static TagKeySNO Rope = new TagKeySNO(262432); - public static TagKeyScript LoopingAnimationTime = new TagKeyScript(263296); - public static TagKeyInt ClassRestriction = new TagKeyInt(329648); - public static TagKeyInt AlwaysKnown = new TagKeyInt(329536); - public static TagKeyScript ScriptFormula38 = new TagKeyScript(267392); - public static TagKeyScript ScriptFormula39 = new TagKeyScript(267408); - public static TagKeyInt GenericBuffAttribute2 = new TagKeyInt(655648); - public static TagKeyInt GenericBuffAttribute3 = new TagKeyInt(655664); - public static TagKeyInt GenericBuffAttribute1 = new TagKeyInt(655632); - public static TagKeyInt GenericBuffAttribute0 = new TagKeyInt(655616); - public static TagKeyScript GenericBuffAttribute2Formula = new TagKeyScript(655649); - public static TagKeyScript GenericBuffAttribute3Formula = new TagKeyScript(655665); - public static TagKeyScript GenericBuffAttribute1Formula = new TagKeyScript(655633); - public static TagKeyScript GenericBuffAttribute0Formula = new TagKeyScript(655617); - public static TagKeyInt CallAIUpdateImmediatelyUponTermination = new TagKeyInt(328604); - public static TagKeyInt ChecksVerticalMovement = new TagKeyInt(327864); - public static TagKeyInt DoesntPreplayAnimation = new TagKeyInt(328611); - public static TagKeyInt IsCompletedWhenWalkingStops = new TagKeyInt(328608); - public static TagKeyScript DelayBeforeSettingTarget = new TagKeyScript(328539); - public static TagKeyScript KnockbackMagnitude = new TagKeyScript(331696); - public static TagKeyScript WhirlwindKnockbackMagnitude = new TagKeyScript(331664); - public static TagKeyScript RetaliationKnockbackMagnitude = new TagKeyScript(331648); - public static TagKeyInt ScaledAnimTiming = new TagKeyInt(328192); - public static TagKeyInt IsADodgePower = new TagKeyInt(328480); - public static TagKeyScript DodgeTravelDistanceMin = new TagKeyScript(332384); - public static TagKeyScript DodgeTravelSpeed = new TagKeyScript(331936); - public static TagKeyScript DodgeTravelAngleOffset = new TagKeyScript(332544); - public static TagKeyInt TargetDoesntRequireActor = new TagKeyInt(328615); - public static TagKeyInt CancelsOtherPowers = new TagKeyInt(328560); - public static TagKeyInt NoInterruptTimer = new TagKeyInt(684880); - public static TagKeyScript FuryCoefficient = new TagKeyScript(332180); - public static TagKeyInt BrainActionType = new TagKeyInt(328704); - public static TagKeyScript AIActionDurationMin = new TagKeyScript(332864); - public static TagKeyScript WhirlwindDurationMin = new TagKeyScript(361504); - public static TagKeyScript WhirlwindMovementSpeed = new TagKeyScript(361521); - public static TagKeyScript KnockbackGravityMin = new TagKeyScript(331708); - public static TagKeyScript KnockbackHeightMin = new TagKeyScript(331704); - public static TagKeyScript HitpointsGrantedByHeal = new TagKeyScript(331264); - public static TagKeySNO ChildPower = new TagKeySNO(327760); - public static TagKeyScript HearthTime = new TagKeyScript(643072); - public static TagKeyScript MovementSpeedPercentIncreaseMin = new TagKeyScript(332000); - public static TagKeyScript AttackSpeedPercentIncreaseMin = new TagKeyScript(331968); - public static TagKeyScript DamagePercentAll = new TagKeyScript(330752); - public static TagKeySNO ProjectileWallFloorExplosion = new TagKeySNO(262410); - public static TagKeyInt OnlyFreeCast = new TagKeyInt(329633); - public static TagKeyInt ProcTargetsSelf = new TagKeyInt(328440); - public static TagKeyScript ScriptFormula24 = new TagKeyScript(267072); - public static TagKeyScript HealthCost = new TagKeyScript(329632); - public static TagKeyScript WalkingDistanceMin = new TagKeyScript(331960); - public static TagKeyInt AnimationTagRuneC = new TagKeyInt(262675); - public static TagKeyScript IsInvisibleDuring = new TagKeyScript(340141); - public static TagKeyInt SetTargetAfterIntro = new TagKeyInt(328292); - public static TagKeyScript MinWalkDuration = new TagKeyScript(328535); - public static TagKeyScript ScriptFormula27 = new TagKeyScript(267120); - public static TagKeyInt AnimationTagRuneB = new TagKeyInt(262674); - public static TagKeyInt AnimationTagRuneA = new TagKeyInt(262673); - public static TagKeyScript AIActionDurationDelta = new TagKeyScript(332880); - public static TagKeyInt UsesWeaponRange = new TagKeyInt(328607); - public static TagKeySNO Combo1ContactFrameEffectGroup_Male = new TagKeySNO(264305); - public static TagKeySNO Combo1ContactFrameEffectGroup_Female = new TagKeySNO(264337); - public static TagKeySNO Combo0ContactFrameEffectGroup_Male = new TagKeySNO(264304); - public static TagKeySNO Combo0ContactFrameEffectGroup_Female = new TagKeySNO(264336); - public static TagKeySNO Combo2ContactFrameEffectGroup_Male = new TagKeySNO(264306); - public static TagKeySNO Combo2ContactFrameEffectGroup_Female = new TagKeySNO(264338); - public static TagKeyInt Requires1HItem = new TagKeyInt(328976); - public static TagKeyScript SkeletonSummonMaxTotalCount = new TagKeyScript(332450); - public static TagKeyScript SkeletonSummonCountPerSummon = new TagKeyScript(332448); - public static TagKeyInt PlaySummonedByMonsterAnimation = new TagKeyInt(331137); - public static TagKeyScript SkeletonSummonMaxCount = new TagKeyScript(332449); - public static TagKeyScript SummonedActorLifeDuration = new TagKeyScript(331120); - public static TagKeySNO ContactFrameEffectGroup_Male2 = new TagKeySNO(264194); - public static TagKeySNO ContactFrameEffectGroup_Female2 = new TagKeySNO(264277); - public static TagKeyInt ArcMoveUntilDestHeight = new TagKeyInt(328296); - public static TagKeyScript RunInFrontDistance = new TagKeyScript(565248); - public static TagKeyScript SpecialWalkHeightIsRelativeToMax = new TagKeyScript(332338); - public static TagKeyScript SpecialWalkTrajectoryGravityDelta = new TagKeyScript(332337); - public static TagKeyScript SpecialWalkTrajectoryHeightDelta = new TagKeyScript(332321); - public static TagKeyScript PierceChance = new TagKeyScript(331040); - public static TagKeyInt CanPathDuringWalk = new TagKeyInt(328272); - public static TagKeyScript UseSpecialWalkSteering = new TagKeyScript(328538); - public static TagKeyInt UsesAnimTag2IfBuffExists = new TagKeyInt(266240); - public static TagKeyInt IsEmote = new TagKeyInt(264704); - public static TagKeySNO EmoteConversationSNO = new TagKeySNO(264720); - public static TagKeyInt SpellFuncCreate = new TagKeyInt(327697); - public static TagKeyScript NovaDelay = new TagKeyScript(655985); - public static TagKeyScript AuraAffectedRadius = new TagKeyScript(331840); - public static TagKeyScript BuffDurationBetweenPulses = new TagKeyScript(332768); - public static TagKeyScript PowerGainedPerSecond = new TagKeyScript(700435); - public static TagKeyScript ManaGainedPerSecond = new TagKeyScript(331520); - public static TagKeyScript FuryGenerationBonusPercent = new TagKeyScript(700434); - public static TagKeyScript SpiritGenerationBonusPercent = new TagKeyScript(700433); - public static TagKeyScript ArcanumGainedPerSecond = new TagKeyScript(700432); - public static TagKeyScript PoisonDamageDelta = new TagKeyScript(330256); - public static TagKeyScript PoisonDamageMin = new TagKeyScript(330240); - public static TagKeyScript PoisonCloudNumIntervals = new TagKeyScript(330992); - public static TagKeyScript PoisonCloudIntervalDuration = new TagKeyScript(330976); - public static TagKeySNO TargetImpactParticle = new TagKeySNO(262405); - public static TagKeyInt IsPunch = new TagKeyInt(327792); - public static TagKeyInt Buff5ShowDuration = new TagKeyInt(271109); - public static TagKeyInt Buff5PlayerCanCancel = new TagKeyInt(271365); - public static TagKeyInt Buff6ShowDuration = new TagKeyInt(271110); - public static TagKeyInt Buff6PlayerCanCancel = new TagKeyInt(271366); - public static TagKeyInt Buff6Icon = new TagKeyInt(270598); - public static TagKeyInt Buff5Icon = new TagKeyInt(270597); - public static TagKeyInt SnapsToGround = new TagKeyInt(328496); - public static TagKeyInt CanUseWhenDead = new TagKeyInt(328528); - public static TagKeyScript BlindDurationMin = new TagKeyScript(684577); - public static TagKeyScript PayloadParam1 = new TagKeyScript(329792); - public static TagKeyScript BlindDurationDelta = new TagKeyScript(684578); - public static TagKeyScript CanUseWhenFeared = new TagKeyScript(328512); - public static TagKeyScript ResurrectionBuffTime = new TagKeyScript(647168); - public static TagKeyScript ResurrectionHealthMultiplierToStart = new TagKeyScript(651264); - public static TagKeyScript ProjectileCount = new TagKeyScript(331193); - public static TagKeyScript ProjectileJitter = new TagKeyScript(331196); - public static TagKeySNO RootGrabPower = new TagKeySNO(606208); - public static TagKeyScript RootTimerModificationPerStruggle = new TagKeyScript(360960); - public static TagKeyScript PercentofDamageThatShieldCanAbsorb = new TagKeyScript(332641); - public static TagKeyScript AnatomyCritBonusPercent = new TagKeyScript(413696); - public static TagKeyScript VanishDuration = new TagKeyScript(458752); - public static TagKeyScript HitpointsThatShieldCanAbsorb = new TagKeyScript(332640); - public static TagKeyScript ShrineBuffRadius = new TagKeyScript(633603); - public static TagKeyInt ShrineBuffAllies = new TagKeyInt(633602); - public static TagKeyScript ScaleBonus = new TagKeyScript(332024); - public static TagKeyScript DefensePercentAll = new TagKeyScript(330768); - public static TagKeyScript BonusHitpointPercent = new TagKeyScript(331568); - public static TagKeyScript ShrineBuffBonus = new TagKeyScript(633601); - public static TagKeyInt SummonedAnimationTag = new TagKeyInt(332451); - public static TagKeyScript ArcaneDamageMin = new TagKeyScript(330304); - public static TagKeyScript ArcaneDamageDelta = new TagKeyScript(330320); - public static TagKeyScript BlizzardInitialImpactDelay = new TagKeyScript(332080); - public static TagKeySNO ChainRope = new TagKeySNO(262403); - public static TagKeyScript ImmobilizeDurationDelta = new TagKeyScript(330880); - public static TagKeyScript WebDurationDelta = new TagKeyScript(330848); - public static TagKeyScript ImmobilizeDurationMin = new TagKeyScript(330864); - public static TagKeyScript WebDurationMin = new TagKeyScript(330832); - public static TagKeyInt IsToggleable = new TagKeyInt(327952); - public static TagKeyScript SlowDurationMin = new TagKeyScript(330896); - public static TagKeyInt IsUsableInCombat = new TagKeyInt(328081); - public static TagKeyInt CastTargetGroundOnly = new TagKeyInt(328161); - public static TagKeyInt CausesKnockback = new TagKeyInt(331697); - public static TagKeyInt ClientControlsFacing = new TagKeyInt(328022); - public static TagKeyScript DisintegrateBeamWidth = new TagKeyScript(332304); - public static TagKeyScript DisintegrateTimeBetweenUpdates = new TagKeyScript(332688); - public static TagKeyInt CustomTargetBuffPowerSNOBuffIndex = new TagKeyInt(328801); - public static TagKeyInt ProjectileThrowOverGuys = new TagKeyInt(262408); - public static TagKeyInt IsLobbed = new TagKeyInt(327872); - public static TagKeyScript DurationDelta = new TagKeyScript(684930); - public static TagKeyScript DurationMin = new TagKeyScript(684929); - public static TagKeyInt UsesWeaponProjectile = new TagKeyInt(262480); - public static TagKeyScript ModalCursorRadius = new TagKeyScript(328069); - public static TagKeyFloat ProjectileGravity = new TagKeyFloat(329872); - public static TagKeyInt ProjectileScaleVelocity = new TagKeyInt(262435); - public static TagKeyScript HeightAboveSource = new TagKeyScript(329880); - public static TagKeyScript ProjectileSpreadAngle = new TagKeyScript(331194); - public static TagKeyFloat CustomTargetNeedsHealHPPercent = new TagKeyFloat(328804); - public static TagKeyScript EnergyShieldManaCostPerDamage = new TagKeyScript(332576); - public static TagKeySNO SynergyPower = new TagKeySNO(327764); - public static TagKeyInt IsUpgrade = new TagKeyInt(329216); - public static TagKeyFloat AnimationTurnThreshold = new TagKeyFloat(263426); - public static TagKeyInt AnimationTagTurnRight = new TagKeyInt(263425); - public static TagKeyInt AnimationTagTurnLeft = new TagKeyInt(263424); - public static TagKeyInt IsOnlyUsableInTownPortalAreas = new TagKeyInt(328082); - public static TagKeyInt IsCancellableByWalking = new TagKeyInt(328546); - public static TagKeyInt FollowWalkAnimTag = new TagKeyInt(561424); - public static TagKeyInt FollowMatchTargetSpeed = new TagKeyInt(561408); - public static TagKeyScript RunNearbyDistanceMin = new TagKeyScript(332416); - public static TagKeyScript RunNearbyDistanceDelta = new TagKeyScript(332432); - public static TagKeyScript FollowStartDistance = new TagKeyScript(561152); - public static TagKeyScript FollowStopDistance = new TagKeyScript(557056); - public static TagKeyInt Buff5IsHarmful = new TagKeyInt(270853); - public static TagKeySNO Buff5EffectGroup = new TagKeySNO(270341); - public static TagKeyInt Buff4IsHarmful = new TagKeyInt(270852); - public static TagKeyScript HolyDamageMin = new TagKeyScript(330496); - public static TagKeyScript HolyDamageDelta = new TagKeyScript(330512); - public static TagKeyScript DestinationJitterAttempts = new TagKeyScript(360704); - public static TagKeyScript DestinationJitterRadius = new TagKeyScript(360448); - public static TagKeyInt RootEndFunc = new TagKeyInt(606464); - public static TagKeySNO ConsumesItem = new TagKeySNO(329088); - public static TagKeyScript DebuffDurationMin = new TagKeyScript(655680); - public static TagKeyScript ProcChance = new TagKeyScript(680704); - public static TagKeySNO Upgrade2 = new TagKeySNO(329264); - public static TagKeySNO Upgrade1 = new TagKeySNO(329248); - public static TagKeySNO Upgrade0 = new TagKeySNO(329232); - public static TagKeyScript FreezeDamageDoneMin = new TagKeyScript(331232); - public static TagKeyScript AttackRatingPercent = new TagKeyScript(329904); - public static TagKeyScript SummoningMachineNodeIsInvulnerable = new TagKeyScript(704512); - public static TagKeySNO DamageDisplayPower = new TagKeySNO(627456); - public static TagKeySNO Buff6EffectGroup = new TagKeySNO(270342); - public static TagKeyInt Buff6IsHarmful = new TagKeyInt(270854); - public static TagKeyScript DodgeTravelDistanceDelta = new TagKeyScript(332400); - public static TagKeySNO Buff7EffectGroup = new TagKeySNO(270343); - public static TagKeyInt ComboAnimation1RuneA = new TagKeyInt(263185); - public static TagKeyScript KnockbackGravityDelta = new TagKeyScript(331709); - public static TagKeyScript KnockbackHeightDelta = new TagKeyScript(331705); - public static TagKeyScript FuryAddPerInterval = new TagKeyScript(332178); - public static TagKeyScript FuryDegenerationOutofCombat_persecond = new TagKeyScript(332177); - public static TagKeyScript FuryGainedPerSecondOfAttack = new TagKeyScript(332097); - public static TagKeyScript FuryTimeBetweenUpdates = new TagKeyScript(333056); - public static TagKeyScript FuryDegenerationStart_inseconds = new TagKeyScript(332181); - public static TagKeyScript FuryGainedPerPercentHealthLost = new TagKeyScript(332096); - public static TagKeyScript FuryMaxDamageBonus = new TagKeyScript(332185); - public static TagKeyScript SlowTimeAmount = new TagKeyScript(330944); - public static TagKeyScript SlowAmount = new TagKeyScript(330928); - public static TagKeyInt ComboAnimation1RuneC = new TagKeyInt(263187); - public static TagKeyInt ComboAnimation1RuneE = new TagKeyInt(263189); - public static TagKeyInt ComboAnimation1RuneD = new TagKeyInt(263188); - public static TagKeyInt ComboAnimation1RuneB = new TagKeyInt(263186); - public static TagKeyInt ComboAnimation3RuneC = new TagKeyInt(263219); - public static TagKeyInt AnimationTagRuneD = new TagKeyInt(262676); - public static TagKeyScript GenericBuffAttribute0AndParameter = new TagKeyScript(655618); - public static TagKeyScript GenericBuffAttribute1AndParameter = new TagKeyScript(655634); - public static TagKeyInt SpecialWalkGoThroughOccluded = new TagKeyInt(332341); - public static TagKeyScript ProcCoefficient = new TagKeyScript(329983); + public static TagKeyInt TurnsIntoBasicMeleeAttack = new(328386); + public static TagKeyInt ReuseScriptState = new(274432); + public static TagKeyInt CastTargetEnemies = new(328113); + public static TagKeyInt CustomTargetUnaffectedOnly = new(328800); + public static TagKeyInt IsUsableInTown = new(328080); + public static TagKeyInt TurnsIntoBasicRangedAttack = new(328385); + public static TagKeyInt IsPrimary = new(327776); + public static TagKeyScript IsInvulnerableDuring = new(328609); + public static TagKeyInt OffhandAnimationTag_fordualwield = new(262663); + public static TagKeyInt IsPassive = new(328592); + public static TagKeyInt AnimationTag2 = new(262658); + public static TagKeyInt AnimationTag = new(262656); + public static TagKeyScript IsUntargetableDuring = new(633616); + public static TagKeyScript IsUninterruptableDuring = new(328610); + public static TagKeyScript BaseDamageScalar = new(329840); + public static TagKeyInt AlwaysHits = new(327904); + public static TagKeySNO CastingEffectGroup_Female = new(264273); + public static TagKeySNO CastingEffectGroup_Male = new(262660); + public static TagKeyInt Buff0ShowDuration = new(271104); + public static TagKeyScript CooldownTime = new(327768); + public static TagKeySNO Buff1EffectGroup = new(270337); + public static TagKeySNO Buff0EffectGroup = new(270336); + public static TagKeyInt CastTargetAllies = new(328097); + public static TagKeyInt RequiresTarget = new(328432); + public static TagKeyInt Buff3IsHarmful = new(270851); + public static TagKeyScript ResourceCost = new(329616); + public static TagKeyInt IconMouseover = new(329488); + public static TagKeyInt IconNormal = new(329472); + public static TagKeyInt IconPushed = new(329504); + public static TagKeyInt Buff3Icon = new(270595); + public static TagKeyInt Buff2ShowDuration = new(271106); + public static TagKeyInt IsMouseAssignable = new(328048); + public static TagKeyInt IsHotbarAssignable = new(328064); + public static TagKeyInt IsOffensive = new(327840); + public static TagKeyInt IsDisplayed = new(327824); + public static TagKeyInt Template = new(327680); + public static TagKeyInt CannotLMBAssign = new(327920); + public static TagKeyInt Buff2Icon = new(270594); + public static TagKeyInt Buff1Icon = new(270593); + public static TagKeyScript ScriptFormula10 = new(266752); + public static TagKeyScript ScriptFormula11 = new(266768); + public static TagKeyScript ScriptFormula12 = new(266784); + public static TagKeyScript ScriptFormula13 = new(266800); + public static TagKeyScript ScriptFormula14 = new(266816); + public static TagKeyInt Buff0PlayerCanCancel = new(271360); + public static TagKeyInt IconInactive = new(329512); + public static TagKeyInt Buff0Icon = new(270592); + public static TagKeyScript ScriptFormula0 = new(266496); + public static TagKeyScript ScriptFormula2 = new(266528); + public static TagKeyScript ScriptFormula3 = new(266544); + public static TagKeyScript ScriptFormula4 = new(266560); + public static TagKeyScript ScriptFormula5 = new(266576); + public static TagKeyScript ScriptFormula7 = new(266608); + public static TagKeyInt Buff3ShowDuration = new(271107); + public static TagKeyInt Buff2PlayerCanCancel = new(271362); + public static TagKeyScript FailsIfStunned = new(328322); + public static TagKeyScript BreaksFear = new(681987); + public static TagKeyScript BreaksStun = new(681986); + public static TagKeyScript BreaksSnare = new(681985); + public static TagKeyScript BreaksRoot = new(681984); + public static TagKeyScript FailsIfFeared = new(328325); + public static TagKeySNO ContactFrameEffectGroup_Male = new(264192); + public static TagKeySNO ContactFrameEffectGroup_Female = new(264275); + public static TagKeyInt SpellFunc0 = new(327712); + public static TagKeyInt CastTargetMustBeInTeleportableArea = new(328083); + public static TagKeySNO GenericEffectGroup0 = new(262661); + public static TagKeyScript ConcentrationDuration = new(333088); + public static TagKeyScript SlowTimeDuration = new(332928); + public static TagKeyScript RingofFrostRingLifetime = new(332896); + public static TagKeyScript DodgeDuration = new(332848); + public static TagKeyScript DamageAuraDuration = new(332832); + public static TagKeyScript RootDuration = new(332816); + public static TagKeyScript CurseDuration = new(332800); + public static TagKeyScript PaladinDeadTimeUntilResurrect = new(332784); + public static TagKeyScript BuffDurationMin = new(332736); + public static TagKeyScript ThunderingCryBuffDuration = new(332720); + public static TagKeyScript ThunderstormDuration = new(332704); + public static TagKeyScript TornadoLifeDurationMin = new(332656); + public static TagKeySNO EndingEffectGroup = new(262662); + public static TagKeyScript AttackSpeed = new(329824); + public static TagKeyScript ScriptFormula23 = new(267056); + public static TagKeyScript ScriptFormula22 = new(267040); + public static TagKeyScript ScriptFormula20 = new(267008); + public static TagKeyScript ScriptFormula21 = new(267024); + public static TagKeyScript EscapeAttackRadius = new(329744); + public static TagKeyScript AttackRadius = new(329808); + public static TagKeyInt IgnoresRangeOnShiftClick = new(328600); + public static TagKeyInt AutoAssignLocation = new(328049); + public static TagKeyInt CanSteer = new(327937); + public static TagKeyInt TurnsIntoBasicAttack = new(328384); + public static TagKeyInt ItemTypeRequirement = new(328960); + public static TagKeyInt SpecialDeathType = new(328534); + public static TagKeyScript ResourceCostMinToCast = new(329617); + public static TagKeyInt ControllerAutoTargets = new(622592); + public static TagKeyScript ControllerMinRange = new(622593); + public static TagKeyInt TargetGroundOnly = new(328160); + public static TagKeyInt TurnsIntoWalk = new(327936); + public static TagKeyInt IsAimedAtGround = new(327888); + public static TagKeyScript ScriptFormula19 = new(266896); + public static TagKeyScript ScriptFormula18 = new(266880); + public static TagKeyScript ScriptFormula17 = new(266864); + public static TagKeyScript ScriptFormula16 = new(266848); + public static TagKeyScript ScriptFormula15 = new(266832); + public static TagKeyInt UsesAttackWarmupTime = new(328606); + public static TagKeyInt AlternatesAnims = new(328501); + public static TagKeyFloat SpecialDeathChance = new(328532); + public static TagKeyScript ScriptFormula9 = new(266640); + public static TagKeyScript ScriptFormula8 = new(266624); + public static TagKeyScript ScriptFormula1 = new(266512); + public static TagKeyScript ScriptFormula6 = new(266592); + public static TagKeyInt ContactFrameType = new(328224); + public static TagKeyScript PayloadParam0 = new(329776); + public static TagKeyInt PayloadType = new(329760); + public static TagKeyInt TargetEnemies = new(328112); + public static TagKeyInt SpellFunc1 = new(327728); + public static TagKeyScript ProjectileSpeed = new(331184); + public static TagKeyScript ChargedBoltNumBolts = new(331056); + public static TagKeySNO ProjectileActor = new(262400); + public static TagKeyScript ProcCooldownTime = new(680768); + public static TagKeyScript LightningDamageDelta = new(330128); + public static TagKeyScript LightningDamageMin = new(330112); + public static TagKeyInt CastTargetIgnoreWreckables = new(328169); + public static TagKeyInt TargetIgnoreWreckables = new(328168); + public static TagKeyScript ColdDamageMin = new(330176); + public static TagKeyScript ColdDamageDelta = new(330192); + public static TagKeyInt Buff1ShowDuration = new(271105); + public static TagKeyInt AutoPurchaseLevel = new(329520); + public static TagKeyInt Buff1PlayerCanCancel = new(271361); + public static TagKeyScript ImmuneToKnockback = new(328352); + public static TagKeyScript ImmuneToRecoil = new(328336); + public static TagKeyInt NeverUpdatesFacing = new(328000); + public static TagKeyInt ContactFreezesFacing = new(327984); + public static TagKeyInt IsBasicAttack = new(327808); + public static TagKeyInt SpellFuncBegin = new(327696); + public static TagKeyInt SpellFuncInterrupted = new(327745); + public static TagKeyScript NumCryptKidsToSpawnOnCorpulentExplosion = new(332480); + public static TagKeyInt TargetAllies = new(328096); + public static TagKeyInt NeverCausesRecoil = new(327968); + public static TagKeyScript MonsterCritDamageScalar = new(684918); + public static TagKeyScript PlayerCritDamageScalar = new(684917); + public static TagKeyInt Buff0IsHarmful = new(270848); + public static TagKeyInt DoesntCenter = new(328032); + public static TagKeyInt IsTranslate = new(327856); + public static TagKeyInt SpellFuncEnd = new(327744); + public static TagKeyScript SpecialWalkTrajectoryHeight = new(332320); + public static TagKeyScript SpecialWalkTrajectoryGravity = new(332336); + public static TagKeyInt SpecialWalkPerturbDestination = new(332360); + public static TagKeyInt IsChannelled = new(328400); + public static TagKeyInt InfiniteAnimTiming = new(328208); + public static TagKeyInt CustomTargetFunc = new(328736); + public static TagKeyInt CustomTargetPlayersOnly = new(328752); + public static TagKeyScript CustomTargetMinRange = new(328768); + public static TagKeyInt SnapsToFacing = new(328021); + public static TagKeyScript ManaPercentToReserve = new(331600); + public static TagKeyInt ComboAnimation1 = new(262912); + public static TagKeyScript ScriptFormula26 = new(267104); + public static TagKeyScript ScriptFormula28 = new(267136); + public static TagKeyScript ScriptFormula29 = new(267152); + public static TagKeyScript EscapeAttackAngle = new(329745); + public static TagKeyScript ComboAttackRadius1 = new(329809); + public static TagKeyInt ComboAnimation2 = new(262913); + public static TagKeyScript ComboAttackSpeed1 = new(329825); + public static TagKeySNO Buff3EffectGroup = new(270339); + public static TagKeyScript ComboAttackRadius2 = new(329810); + public static TagKeyScript ComboAttackSpeed2 = new(329826); + public static TagKeySNO Buff2EffectGroup = new(270338); + public static TagKeyScript ComboAttackRadius3 = new(329811); + public static TagKeyScript ComboAttackSpeed3 = new(329827); + public static TagKeyInt IsComboPower = new(264448); + public static TagKeyInt Buff3PlayerCanCancel = new(271363); + public static TagKeyInt ComboAnimation3 = new(262914); + public static TagKeySNO Combo1CastingEffectGroup_Male = new(264289); + public static TagKeySNO Combo1CastingEffectGroup_Female = new(264321); + public static TagKeyInt AffectedByDualWield = new(328448); + public static TagKeySNO Combo0CastingEffectGroup_Male = new(264288); + public static TagKeySNO Combo0CastingEffectGroup_Female = new(264320); + public static TagKeySNO Combo2CastingEffectGroup_Male = new(264290); + public static TagKeySNO Combo2CastingEffectGroup_Female = new(264322); + public static TagKeyScript ScriptFormula30 = new(267264); + public static TagKeyScript ScriptFormula31 = new(267280); + public static TagKeyScript ScriptFormula32 = new(267296); + public static TagKeyScript ScriptFormula33 = new(267312); + public static TagKeyScript ScriptFormula34 = new(267328); + public static TagKeyScript ScriptFormula35 = new(267344); + public static TagKeyScript ScriptFormula36 = new(267360); + public static TagKeyScript ScriptFormula37 = new(267376); + public static TagKeyScript ScriptFormula58 = new(267904); + public static TagKeyScript ScriptFormula59 = new(267920); + public static TagKeyScript SpiritGained = new(684928); + public static TagKeyScript CurseDamageAmplifyPercent = new(331536); + public static TagKeyInt Buff4Icon = new(270596); + public static TagKeyInt Buff4ShowDuration = new(271108); + public static TagKeySNO Buff4EffectGroup = new(270340); + public static TagKeyScript FailsIfSilenced = new(328321); + public static TagKeyInt Buff4PlayerCanCancel = new(271364); + public static TagKeyInt IsPhysical = new(328624); + public static TagKeyInt HitsoundOverride = new(262433); + public static TagKeyScript ScriptFormula25 = new(267088); + public static TagKeyInt Requires2HItem = new(328992); + public static TagKeyInt Buff2IsHarmful = new(270850); + public static TagKeyInt RequiresActorTarget = new(328240); + public static TagKeyInt ClipsTargetToAttackRadius = new(684848); + public static TagKeyInt CastTargetNeutral = new(328145); + public static TagKeyInt LOSCheck = new(328720); + public static TagKeyScript AttackRating = new(329888); + public static TagKeyScript DestructableObjectDamageDelay = new(618496); + public static TagKeyInt TargetNeutral = new(328144); + public static TagKeySNO ExplosionActor = new(262401); + public static TagKeyScript StunChance = new(330816); + public static TagKeyScript StunDurationMin = new(330784); + public static TagKeyScript PhysicalDamageDelta = new(330000); + public static TagKeyScript PhysicalDamageMin = new(329984); + public static TagKeyInt IsItemPower = new(328601); + public static TagKeyInt CastTargetCorpse = new(328129); + public static TagKeyScript SummonedActorLevel = new(331136); + public static TagKeyInt TargetContactPlaneOnly = new(328162); + public static TagKeyInt DontWalkCloserIfOutOfRange = new(328256); + public static TagKeyScript ResourceGainedOnFirstHit = new(329627); + public static TagKeyInt LocksActorsWhileSweeping = new(328420); + public static TagKeyInt Buff1IsHarmful = new(270849); + public static TagKeyScript FailsIfImmobilized = new(328320); + public static TagKeyInt StartWalkAfterIntro = new(328288); + public static TagKeyInt RollToDestination = new(328368); + public static TagKeyInt PickupItemsWhileMoving = new(655984); + public static TagKeyScript WalkingSpeedMultiplier = new(331952); + public static TagKeyScript SpecialWalkPlayerEndAnimScalar = new(328536); + public static TagKeyInt NeverUpdatesFacingStarting = new(328016); + public static TagKeyInt RequiresSkillPoint = new(328248); + public static TagKeyInt IsKnockbackMovement = new(327860); + public static TagKeyInt SpecialWalkIsKnockback = new(332362); + public static TagKeyScript BreaksImmobilize = new(328304); + public static TagKeyScript ImmunetoFearduring = new(682243); + public static TagKeyScript ImmunetoRootduring = new(682240); + public static TagKeyScript ImmunetoSnareduring = new(682241); + public static TagKeyScript ImmunetoStunduring = new(682242); + public static TagKeyInt CastTargetNormalMonstersOnly = new(328617); + public static TagKeyInt CausesClosingCooldown = new(328632); + public static TagKeyInt CastTargetIgnoreLargeMonsters = new(328616); + public static TagKeyScript CustomTargetMaxRange = new(328784); + public static TagKeySNO CustomTargetBuffPowerSNO = new(328802); + public static TagKeyScript FireDamageDelta = new(330064); + public static TagKeyScript FireDamageMin = new(330048); + public static TagKeyInt DisplaysNoDamage = new(327829); + public static TagKeyScript SkillPointCost = new(329312); + public static TagKeyInt CannotLockOntoActors = new(328416); + public static TagKeyInt ChannelledLocksActors = new(328401); + public static TagKeyInt NoAffectedACD = new(328176); + public static TagKeyScript ResourceCostReductionCoefficient = new(329625); + public static TagKeyInt TargetNavMeshOnly = new(328163); + public static TagKeySNO HitEffect = new(684034); + public static TagKeyInt OverrideHitEffects = new(684032); + public static TagKeyInt AnimationTagRuneE = new(262677); + public static TagKeyScript LifestealPercent = new(331224); + public static TagKeyScript CritChance = new(331008); + public static TagKeyScript GhostSoulsiphonMaxChannellingDistance = new(365056); + public static TagKeySNO Source_DestEffectGroup = new(262659); + public static TagKeyScript GhostSoulsiphonMaxChannellingTime = new(364800); + public static TagKeyScript GhostSoulsiphonSlowMultiplier = new(364544); + public static TagKeyScript GhostSoulsiphonDamagePerSecond = new(365312); + public static TagKeyInt CastTargetAllowDeadTargets = new(328620); + public static TagKeyScript BuffDurationDelta = new(332752); + public static TagKeyScript SlowMovementSpeedMultiplier = new(692224); + public static TagKeyScript FireDuration = new(329976); + public static TagKeyInt IsCancellable = new(328544); + public static TagKeyScript StunDurationDelta = new(330800); + public static TagKeySNO Rope = new(262432); + public static TagKeyScript LoopingAnimationTime = new(263296); + public static TagKeyInt ClassRestriction = new(329648); + public static TagKeyInt AlwaysKnown = new(329536); + public static TagKeyScript ScriptFormula38 = new(267392); + public static TagKeyScript ScriptFormula39 = new(267408); + public static TagKeyInt GenericBuffAttribute2 = new(655648); + public static TagKeyInt GenericBuffAttribute3 = new(655664); + public static TagKeyInt GenericBuffAttribute1 = new(655632); + public static TagKeyInt GenericBuffAttribute0 = new(655616); + public static TagKeyScript GenericBuffAttribute2Formula = new(655649); + public static TagKeyScript GenericBuffAttribute3Formula = new(655665); + public static TagKeyScript GenericBuffAttribute1Formula = new(655633); + public static TagKeyScript GenericBuffAttribute0Formula = new(655617); + public static TagKeyInt CallAIUpdateImmediatelyUponTermination = new(328604); + public static TagKeyInt ChecksVerticalMovement = new(327864); + public static TagKeyInt DoesntPreplayAnimation = new(328611); + public static TagKeyInt IsCompletedWhenWalkingStops = new(328608); + public static TagKeyScript DelayBeforeSettingTarget = new(328539); + public static TagKeyScript KnockbackMagnitude = new(331696); + public static TagKeyScript WhirlwindKnockbackMagnitude = new(331664); + public static TagKeyScript RetaliationKnockbackMagnitude = new(331648); + public static TagKeyInt ScaledAnimTiming = new(328192); + public static TagKeyInt IsADodgePower = new(328480); + public static TagKeyScript DodgeTravelDistanceMin = new(332384); + public static TagKeyScript DodgeTravelSpeed = new(331936); + public static TagKeyScript DodgeTravelAngleOffset = new(332544); + public static TagKeyInt TargetDoesntRequireActor = new(328615); + public static TagKeyInt CancelsOtherPowers = new(328560); + public static TagKeyInt NoInterruptTimer = new(684880); + public static TagKeyScript FuryCoefficient = new(332180); + public static TagKeyInt BrainActionType = new(328704); + public static TagKeyScript AIActionDurationMin = new(332864); + public static TagKeyScript WhirlwindDurationMin = new(361504); + public static TagKeyScript WhirlwindMovementSpeed = new(361521); + public static TagKeyScript KnockbackGravityMin = new(331708); + public static TagKeyScript KnockbackHeightMin = new(331704); + public static TagKeyScript HitpointsGrantedByHeal = new(331264); + public static TagKeySNO ChildPower = new(327760); + public static TagKeyScript HearthTime = new(643072); + public static TagKeyScript MovementSpeedPercentIncreaseMin = new(332000); + public static TagKeyScript AttackSpeedPercentIncreaseMin = new(331968); + public static TagKeyScript DamagePercentAll = new(330752); + public static TagKeySNO ProjectileWallFloorExplosion = new(262410); + public static TagKeyInt OnlyFreeCast = new(329633); + public static TagKeyInt ProcTargetsSelf = new(328440); + public static TagKeyScript ScriptFormula24 = new(267072); + public static TagKeyScript HealthCost = new(329632); + public static TagKeyScript WalkingDistanceMin = new(331960); + public static TagKeyInt AnimationTagRuneC = new(262675); + public static TagKeyScript IsInvisibleDuring = new(340141); + public static TagKeyInt SetTargetAfterIntro = new(328292); + public static TagKeyScript MinWalkDuration = new(328535); + public static TagKeyScript ScriptFormula27 = new(267120); + public static TagKeyInt AnimationTagRuneB = new(262674); + public static TagKeyInt AnimationTagRuneA = new(262673); + public static TagKeyScript AIActionDurationDelta = new(332880); + public static TagKeyInt UsesWeaponRange = new(328607); + public static TagKeySNO Combo1ContactFrameEffectGroup_Male = new(264305); + public static TagKeySNO Combo1ContactFrameEffectGroup_Female = new(264337); + public static TagKeySNO Combo0ContactFrameEffectGroup_Male = new(264304); + public static TagKeySNO Combo0ContactFrameEffectGroup_Female = new(264336); + public static TagKeySNO Combo2ContactFrameEffectGroup_Male = new(264306); + public static TagKeySNO Combo2ContactFrameEffectGroup_Female = new(264338); + public static TagKeyInt Requires1HItem = new(328976); + public static TagKeyScript SkeletonSummonMaxTotalCount = new(332450); + public static TagKeyScript SkeletonSummonCountPerSummon = new(332448); + public static TagKeyInt PlaySummonedByMonsterAnimation = new(331137); + public static TagKeyScript SkeletonSummonMaxCount = new(332449); + public static TagKeyScript SummonedActorLifeDuration = new(331120); + public static TagKeySNO ContactFrameEffectGroup_Male2 = new(264194); + public static TagKeySNO ContactFrameEffectGroup_Female2 = new(264277); + public static TagKeyInt ArcMoveUntilDestHeight = new(328296); + public static TagKeyScript RunInFrontDistance = new(565248); + public static TagKeyScript SpecialWalkHeightIsRelativeToMax = new(332338); + public static TagKeyScript SpecialWalkTrajectoryGravityDelta = new(332337); + public static TagKeyScript SpecialWalkTrajectoryHeightDelta = new(332321); + public static TagKeyScript PierceChance = new(331040); + public static TagKeyInt CanPathDuringWalk = new(328272); + public static TagKeyScript UseSpecialWalkSteering = new(328538); + public static TagKeyInt UsesAnimTag2IfBuffExists = new(266240); + public static TagKeyInt IsEmote = new(264704); + public static TagKeySNO EmoteConversationSNO = new(264720); + public static TagKeyInt SpellFuncCreate = new(327697); + public static TagKeyScript NovaDelay = new(655985); + public static TagKeyScript AuraAffectedRadius = new(331840); + public static TagKeyScript BuffDurationBetweenPulses = new(332768); + public static TagKeyScript PowerGainedPerSecond = new(700435); + public static TagKeyScript ManaGainedPerSecond = new(331520); + public static TagKeyScript FuryGenerationBonusPercent = new(700434); + public static TagKeyScript SpiritGenerationBonusPercent = new(700433); + public static TagKeyScript ArcanumGainedPerSecond = new(700432); + public static TagKeyScript PoisonDamageDelta = new(330256); + public static TagKeyScript PoisonDamageMin = new(330240); + public static TagKeyScript PoisonCloudNumIntervals = new(330992); + public static TagKeyScript PoisonCloudIntervalDuration = new(330976); + public static TagKeySNO TargetImpactParticle = new(262405); + public static TagKeyInt IsPunch = new(327792); + public static TagKeyInt Buff5ShowDuration = new(271109); + public static TagKeyInt Buff5PlayerCanCancel = new(271365); + public static TagKeyInt Buff6ShowDuration = new(271110); + public static TagKeyInt Buff6PlayerCanCancel = new(271366); + public static TagKeyInt Buff6Icon = new(270598); + public static TagKeyInt Buff5Icon = new(270597); + public static TagKeyInt SnapsToGround = new(328496); + public static TagKeyInt CanUseWhenDead = new(328528); + public static TagKeyScript BlindDurationMin = new(684577); + public static TagKeyScript PayloadParam1 = new(329792); + public static TagKeyScript BlindDurationDelta = new(684578); + public static TagKeyScript CanUseWhenFeared = new(328512); + public static TagKeyScript ResurrectionBuffTime = new(647168); + public static TagKeyScript ResurrectionHealthMultiplierToStart = new(651264); + public static TagKeyScript ProjectileCount = new(331193); + public static TagKeyScript ProjectileJitter = new(331196); + public static TagKeySNO RootGrabPower = new(606208); + public static TagKeyScript RootTimerModificationPerStruggle = new(360960); + public static TagKeyScript PercentofDamageThatShieldCanAbsorb = new(332641); + public static TagKeyScript AnatomyCritBonusPercent = new(413696); + public static TagKeyScript VanishDuration = new(458752); + public static TagKeyScript HitpointsThatShieldCanAbsorb = new(332640); + public static TagKeyScript ShrineBuffRadius = new(633603); + public static TagKeyInt ShrineBuffAllies = new(633602); + public static TagKeyScript ScaleBonus = new(332024); + public static TagKeyScript DefensePercentAll = new(330768); + public static TagKeyScript BonusHitpointPercent = new(331568); + public static TagKeyScript ShrineBuffBonus = new(633601); + public static TagKeyInt SummonedAnimationTag = new(332451); + public static TagKeyScript ArcaneDamageMin = new(330304); + public static TagKeyScript ArcaneDamageDelta = new(330320); + public static TagKeyScript BlizzardInitialImpactDelay = new(332080); + public static TagKeySNO ChainRope = new(262403); + public static TagKeyScript ImmobilizeDurationDelta = new(330880); + public static TagKeyScript WebDurationDelta = new(330848); + public static TagKeyScript ImmobilizeDurationMin = new(330864); + public static TagKeyScript WebDurationMin = new(330832); + public static TagKeyInt IsToggleable = new(327952); + public static TagKeyScript SlowDurationMin = new(330896); + public static TagKeyInt IsUsableInCombat = new(328081); + public static TagKeyInt CastTargetGroundOnly = new(328161); + public static TagKeyInt CausesKnockback = new(331697); + public static TagKeyInt ClientControlsFacing = new(328022); + public static TagKeyScript DisintegrateBeamWidth = new(332304); + public static TagKeyScript DisintegrateTimeBetweenUpdates = new(332688); + public static TagKeyInt CustomTargetBuffPowerSNOBuffIndex = new(328801); + public static TagKeyInt ProjectileThrowOverGuys = new(262408); + public static TagKeyInt IsLobbed = new(327872); + public static TagKeyScript DurationDelta = new(684930); + public static TagKeyScript DurationMin = new(684929); + public static TagKeyInt UsesWeaponProjectile = new(262480); + public static TagKeyScript ModalCursorRadius = new(328069); + public static TagKeyFloat ProjectileGravity = new(329872); + public static TagKeyInt ProjectileScaleVelocity = new(262435); + public static TagKeyScript HeightAboveSource = new(329880); + public static TagKeyScript ProjectileSpreadAngle = new(331194); + public static TagKeyFloat CustomTargetNeedsHealHPPercent = new(328804); + public static TagKeyScript EnergyShieldManaCostPerDamage = new(332576); + public static TagKeySNO SynergyPower = new(327764); + public static TagKeyInt IsUpgrade = new(329216); + public static TagKeyFloat AnimationTurnThreshold = new(263426); + public static TagKeyInt AnimationTagTurnRight = new(263425); + public static TagKeyInt AnimationTagTurnLeft = new(263424); + public static TagKeyInt IsOnlyUsableInTownPortalAreas = new(328082); + public static TagKeyInt IsCancellableByWalking = new(328546); + public static TagKeyInt FollowWalkAnimTag = new(561424); + public static TagKeyInt FollowMatchTargetSpeed = new(561408); + public static TagKeyScript RunNearbyDistanceMin = new(332416); + public static TagKeyScript RunNearbyDistanceDelta = new(332432); + public static TagKeyScript FollowStartDistance = new(561152); + public static TagKeyScript FollowStopDistance = new(557056); + public static TagKeyInt Buff5IsHarmful = new(270853); + public static TagKeySNO Buff5EffectGroup = new(270341); + public static TagKeyInt Buff4IsHarmful = new(270852); + public static TagKeyScript HolyDamageMin = new(330496); + public static TagKeyScript HolyDamageDelta = new(330512); + public static TagKeyScript DestinationJitterAttempts = new(360704); + public static TagKeyScript DestinationJitterRadius = new(360448); + public static TagKeyInt RootEndFunc = new(606464); + public static TagKeySNO ConsumesItem = new(329088); + public static TagKeyScript DebuffDurationMin = new(655680); + public static TagKeyScript ProcChance = new(680704); + public static TagKeySNO Upgrade2 = new(329264); + public static TagKeySNO Upgrade1 = new(329248); + public static TagKeySNO Upgrade0 = new(329232); + public static TagKeyScript FreezeDamageDoneMin = new(331232); + public static TagKeyScript AttackRatingPercent = new(329904); + public static TagKeyScript SummoningMachineNodeIsInvulnerable = new(704512); + public static TagKeySNO DamageDisplayPower = new(627456); + public static TagKeySNO Buff6EffectGroup = new(270342); + public static TagKeyInt Buff6IsHarmful = new(270854); + public static TagKeyScript DodgeTravelDistanceDelta = new(332400); + public static TagKeySNO Buff7EffectGroup = new(270343); + public static TagKeyInt ComboAnimation1RuneA = new(263185); + public static TagKeyScript KnockbackGravityDelta = new(331709); + public static TagKeyScript KnockbackHeightDelta = new(331705); + public static TagKeyScript FuryAddPerInterval = new(332178); + public static TagKeyScript FuryDegenerationOutofCombat_persecond = new(332177); + public static TagKeyScript FuryGainedPerSecondOfAttack = new(332097); + public static TagKeyScript FuryTimeBetweenUpdates = new(333056); + public static TagKeyScript FuryDegenerationStart_inseconds = new(332181); + public static TagKeyScript FuryGainedPerPercentHealthLost = new(332096); + public static TagKeyScript FuryMaxDamageBonus = new(332185); + public static TagKeyScript SlowTimeAmount = new(330944); + public static TagKeyScript SlowAmount = new(330928); + public static TagKeyInt ComboAnimation1RuneC = new(263187); + public static TagKeyInt ComboAnimation1RuneE = new(263189); + public static TagKeyInt ComboAnimation1RuneD = new(263188); + public static TagKeyInt ComboAnimation1RuneB = new(263186); + public static TagKeyInt ComboAnimation3RuneC = new(263219); + public static TagKeyInt AnimationTagRuneD = new(262676); + public static TagKeyScript GenericBuffAttribute0AndParameter = new(655618); + public static TagKeyScript GenericBuffAttribute1AndParameter = new(655634); + public static TagKeyInt SpecialWalkGoThroughOccluded = new(332341); + public static TagKeyScript ProcCoefficient = new(329983); } } diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/QuestManager.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/QuestManager.cs index 7e59b0c..b06ce7b 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/QuestManager.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/QuestManager.cs @@ -953,7 +953,7 @@ namespace DiIiS_NA.D3_GameServer.GSSystem.GameSystem if (QuestManager.Game.GetWorld(world).CheckLocationForFlag(point, Scene.NavCellFlags.AllowWalk)) break; } - QuestManager.Game.GetWorld(world).SpawnMonster((ActorSno)GameServer.GSSystem.GeneratorsSystem.SpawnGenerator.Spawns[LevelArea].melee.PickRandom(), point); + QuestManager.Game.GetWorld(world).SpawnMonster((ActorSno)GameServer.GSSystem.GeneratorsSystem.SpawnGenerator.Spawns[LevelArea].Melee.PickRandom(), point); monsterCount++; } } // Need additional monster spawn, there are few of them diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/GeneratorsSystem/SpawnGenerator.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/GeneratorsSystem/SpawnGenerator.cs index 43c0caa..158a931 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/GeneratorsSystem/SpawnGenerator.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/GeneratorsSystem/SpawnGenerator.cs @@ -13,35 +13,36 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem public class MonsterLayout { - public bool lazy_load; - public int additional_density; - public bool can_spawn_goblin; - public List melee; - public List range; - public List dangerous; + public bool LazyLoad { get; set; } + public int AdditionalDensity { get; set; } + public bool CanSpawnGoblin { get; set; } + public List Melee { get; set; } + + public List Range { get; set; } + public List Dangerous { get; set; } }; public static List TotalMonsters(int la) { List total = new List { }; - total.AddRange(Spawns[la].melee); - total.AddRange(Spawns[la].range); - total.AddRange(Spawns[la].dangerous); + total.AddRange(Spawns[la].Melee); + total.AddRange(Spawns[la].Range); + total.AddRange(Spawns[la].Dangerous); return total; } - public static bool IsMelee(int la, int monsterId) => Spawns[la].melee.Contains(monsterId); + public static bool IsMelee(int la, int monsterId) => Spawns[la].Melee.Contains(monsterId); - public static bool IsRange(int la, int monsterId) => Spawns[la].range.Contains(monsterId); + public static bool IsRange(int la, int monsterId) => Spawns[la].Range.Contains(monsterId); - public static bool IsDangerous(int la, int monsterId) => Spawns[la].dangerous.Contains(monsterId); + public static bool IsDangerous(int la, int monsterId) => Spawns[la].Dangerous.Contains(monsterId); public static void RegenerateDensity() { Logger.Info("Regenerating spawn density map..."); foreach (var spawn in Spawns) { - Spawns[spawn.Key].additional_density = FastRandom.Instance.Next(0, 6); + Spawns[spawn.Key].AdditionalDensity = FastRandom.Instance.Next(0, 6); } } @@ -49,197 +50,197 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem public static readonly Dictionary Spawns = new() { #region Act I - {91324, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 6652, 203121, 6644 }, range = new List{ 219725 }, dangerous = new List{ 218339 }}}, //REMOVED 4982 QUILL FIEND (OP damage) //road to Old Tristram ruins - {101351, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 6652, 203121, 6644 }, range = new List{ 219725 }, dangerous = new List{ 218345, 218431 }}}, //REMOVED 4982 QUILL FIEND (OP damage) //Old Tristram ruins - {19933, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 6652, 5393 }, range = new List{ 5346 }, dangerous = new List{ 218666, 218321 }}}, //Cath, outside - {19954, new MonsterLayout{ lazy_load = true, additional_density = 0, can_spawn_goblin = true, melee = new List{ 6652, 203121, 6632, 5393, 6653 }, range = new List{ 219725, 3847, 6639 }, dangerous = new List{ 218332, 85900 }}}, //REMOVED 4982 QUILL FIEND (OP damage) + 5235 SCAVENGER (jump mechanic nukes) //The Weeping Hollow - {72712, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 5393, 6653 }, range = new List{ 5387 }, dangerous = new List{ 220683 }}}, //Tristram Graveyard - {83264, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 5393, 3848, 5395, 5411, 6653, 4156 }, range = new List{ 5346, 3847, 6639 }, dangerous = new List{ 225502 }}}, // REMOVED ID 5235 SCAVENGER (OP jump mechanic) //Cursed crypt 1 - {83265, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 5393, 3848, 5395, 5411, 6653, 4156 }, range = new List{ 5346, 3847, 6639 }, dangerous = new List{ 225502 }}}, // REMOVED ID 5235 SCAVENGER (OP jump mechanic) //Cursed crypt 2 - {154588, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 5393, 3848, 5395, 5411, 6653 }, range = new List{ 5346, 3847, 6639 }, dangerous = new List{ 218348, 218351 }}}, // REMOVED ID 5235 SCAVENGER (OP jump mechanic) //Cursed crypt 3 (true) - {102362, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 5393 }, range = new List{ 5387 }, dangerous = new List{}}}, //Chancellor's Tomb - {19952, new MonsterLayout{ lazy_load = true, additional_density = 0, can_spawn_goblin = true, melee = new List{ 4282, 4285, 3337, 5236, 5235 }, range = new List{ 4290, 4286 }, dangerous = new List{ 218422, 218424, 218428 }}}, //Fields of Misery - {19953, new MonsterLayout{ lazy_load = true, additional_density = 0, can_spawn_goblin = true, melee = new List{ 5395, 4153, 4201, 5275 }, range = new List{ 5347 }, dangerous = new List{ 209553, 218444, 218441 }}}, //The Festering Woods - {60397, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 5395 }, range = new List{ 5388 }, dangerous = new List{}}}, //Crypt of the Ancients - {60396, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 5395 }, range = new List{ 179343, 5347 }, dangerous = new List{}}}, //Warrior's Rest - {60398, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 5276, 6025 }, range = new List{ 5347, 5388 }, dangerous = new List{}}}, //Drowned Temple - {19780, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 5275, 6652,4156, 6646, 6644 }, range = new List{ 5346 }, dangerous = new List{ 218307, 218308 }}}, //Cathedral, lvl. 1 - {19783, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 5393, 5275, 6356, 4156 }, range = new List{ 5346, 5387 }, dangerous = new List{ 218656, 218356, 218362, 218364 }}}, //Cathedral, lvl. 2 - {87907, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 5393, 6024, 5275 }, range = new List{ 5387 }, dangerous = new List{}}}, //Cathedral, lvl. 3 (Kormac) - {19785, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 5393, 3848, 5395, 5275, 4156, 3893 }, range = new List{ 5346, 5387, 3847 }, dangerous = new List{ 218396, 218405, }}}, //Cathedral, lvl. 4 - {19787, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 5393, 5275 }, range = new List{ 5346 }, dangerous = new List{}}}, //The Royal Crypts + {91324, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 6652, 203121, 6644 }, Range = new List{ 219725 }, Dangerous = new List{ 218339 }}}, //REMOVED 4982 QUILL FIEND (OP damage) //road to Old Tristram ruins + {101351, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 6652, 203121, 6644 }, Range = new List{ 219725 }, Dangerous = new List{ 218345, 218431 }}}, //REMOVED 4982 QUILL FIEND (OP damage) //Old Tristram ruins + {19933, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 6652, 5393 }, Range = new List{ 5346 }, Dangerous = new List{ 218666, 218321 }}}, //Cath, outside + {19954, new MonsterLayout{ LazyLoad = true, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 6652, 203121, 6632, 5393, 6653 }, Range = new List{ 219725, 3847, 6639 }, Dangerous = new List{ 218332, 85900 }}}, //REMOVED 4982 QUILL FIEND (OP damage) + 5235 SCAVENGER (jump mechanic nukes) //The Weeping Hollow + {72712, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 5393, 6653 }, Range = new List{ 5387 }, Dangerous = new List{ 220683 }}}, //Tristram Graveyard + {83264, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 5393, 3848, 5395, 5411, 6653, 4156 }, Range = new List{ 5346, 3847, 6639 }, Dangerous = new List{ 225502 }}}, // REMOVED ID 5235 SCAVENGER (OP jump mechanic) //Cursed crypt 1 + {83265, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 5393, 3848, 5395, 5411, 6653, 4156 }, Range = new List{ 5346, 3847, 6639 }, Dangerous = new List{ 225502 }}}, // REMOVED ID 5235 SCAVENGER (OP jump mechanic) //Cursed crypt 2 + {154588, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 5393, 3848, 5395, 5411, 6653 }, Range = new List{ 5346, 3847, 6639 }, Dangerous = new List{ 218348, 218351 }}}, // REMOVED ID 5235 SCAVENGER (OP jump mechanic) //Cursed crypt 3 (true) + {102362, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 5393 }, Range = new List{ 5387 }, Dangerous = new List{}}}, //Chancellor's Tomb + {19952, new MonsterLayout{ LazyLoad = true, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 4282, 4285, 3337, 5236, 5235 }, Range = new List{ 4290, 4286 }, Dangerous = new List{ 218422, 218424, 218428 }}}, //Fields of Misery + {19953, new MonsterLayout{ LazyLoad = true, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 5395, 4153, 4201, 5275 }, Range = new List{ 5347 }, Dangerous = new List{ 209553, 218444, 218441 }}}, //The Festering Woods + {60397, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 5395 }, Range = new List{ 5388 }, Dangerous = new List{}}}, //Crypt of the Ancients + {60396, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 5395 }, Range = new List{ 179343, 5347 }, Dangerous = new List{}}}, //Warrior's Rest + {60398, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 5276, 6025 }, Range = new List{ 5347, 5388 }, Dangerous = new List{}}}, //Drowned Temple + {19780, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 5275, 6652,4156, 6646, 6644 }, Range = new List{ 5346 }, Dangerous = new List{ 218307, 218308 }}}, //Cathedral, lvl. 1 + {19783, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 5393, 5275, 6356, 4156 }, Range = new List{ 5346, 5387 }, Dangerous = new List{ 218656, 218356, 218362, 218364 }}}, //Cathedral, lvl. 2 + {87907, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 5393, 6024, 5275 }, Range = new List{ 5387 }, Dangerous = new List{}}}, //Cathedral, lvl. 3 (Kormac) + {19785, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 5393, 3848, 5395, 5275, 4156, 3893 }, Range = new List{ 5346, 5387, 3847 }, Dangerous = new List{ 218396, 218405, }}}, //Cathedral, lvl. 4 + {19787, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 5393, 5275 }, Range = new List{ 5346 }, Dangerous = new List{}}}, //The Royal Crypts //{129795, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 5393 }, range = new List{ 5346 }, dangerous = new List{}}}, //Wortham Rocks - {78572, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 5467, 5474, 4157, 4153 }, range = new List{ 166726, 122367 }, dangerous = new List{ 129439, 218462, 218458, 218456, 218448 }}}, //Caves of Aranea - {93632, new MonsterLayout{ lazy_load = true, additional_density = 0, can_spawn_goblin = false, melee = new List{ 4283, 5236 }, range = new List{ 6500, 4287, 4290 }, dangerous = new List{ 218469 }}}, //Highlands Crossing - {19940, new MonsterLayout{ lazy_load = true, additional_density = 0, can_spawn_goblin = true, melee = new List{ 4282, 4283, 4285, 3337, 3338, 5236 }, range = new List{ 4287, 6500, 375, 4290, 4286, 6024 }, dangerous = new List{ 218508, 218536, 218473, 111580, 76676 }}}, //Southern highlands - {19941, new MonsterLayout{ lazy_load = true, additional_density = 0, can_spawn_goblin = true, melee = new List{ 4282, 4283, 3338, 4154, 195747 }, range = new List{ 4287, 375, 4290, 6500 }, dangerous = new List{}}}, //Northern highlands - {19774, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 6042, 6052, 6024, 6359, 6654, 90453, 6647, 104424, 178300 }, range = new List{ 6046 }, dangerous = new List{ 218674, 218672, 218676, 105959 }}}, //Halls of Agony, lv. 1 - {19775, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 6042, 6052, 6024, 6359, 6654, 90453, 6647, 104424, 178300 }, range = new List{ 6046 }, dangerous = new List{}}}, //Halls of Agony, lv. 2 - {94672, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 4203, 3849, 434 }, range = new List{ 5389 }, dangerous = new List{}}}, //The Cursed Hold - {19776, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 6042, 6052, 6024, 6654, 90453, 6647, 104424, 178300 }, range = new List{ 6046 }, dangerous = new List{ 105620, 220034, 218678 }}}, //Halls of Agony, lv. 3 - {80116, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 6052, 6024, 5395, 5275, 178300 }, range = new List{ 5346, 5387 }, dangerous = new List{}}}, //The Lyceum - {82326, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 6024, 4201, 5395, 434, 5276, 5393 }, range = new List{ 5346 }, dangerous = new List{}}}, //Watch Tower, lv. 1 - {82327, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 6024, 4201, 5395, 434, 5276, 5393 }, range = new List{ 5346 }, dangerous = new List{}}}, //Watch Tower, lv. 2 + {78572, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 5467, 5474, 4157, 4153 }, Range = new List{ 166726, 122367 }, Dangerous = new List{ 129439, 218462, 218458, 218456, 218448 }}}, //Caves of Aranea + {93632, new MonsterLayout{ LazyLoad = true, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 4283, 5236 }, Range = new List{ 6500, 4287, 4290 }, Dangerous = new List{ 218469 }}}, //Highlands Crossing + {19940, new MonsterLayout{ LazyLoad = true, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 4282, 4283, 4285, 3337, 3338, 5236 }, Range = new List{ 4287, 6500, 375, 4290, 4286, 6024 }, Dangerous = new List{ 218508, 218536, 218473, 111580, 76676 }}}, //Southern highlands + {19941, new MonsterLayout{ LazyLoad = true, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 4282, 4283, 3338, 4154, 195747 }, Range = new List{ 4287, 375, 4290, 6500 }, Dangerous = new List{}}}, //Northern highlands + {19774, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 6042, 6052, 6024, 6359, 6654, 90453, 6647, 104424, 178300 }, Range = new List{ 6046 }, Dangerous = new List{ 218674, 218672, 218676, 105959 }}}, //Halls of Agony, lv. 1 + {19775, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 6042, 6052, 6024, 6359, 6654, 90453, 6647, 104424, 178300 }, Range = new List{ 6046 }, Dangerous = new List{}}}, //Halls of Agony, lv. 2 + {94672, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 4203, 3849, 434 }, Range = new List{ 5389 }, Dangerous = new List{}}}, //The Cursed Hold + {19776, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 6042, 6052, 6024, 6654, 90453, 6647, 104424, 178300 }, Range = new List{ 6046 }, Dangerous = new List{ 105620, 220034, 218678 }}}, //Halls of Agony, lv. 3 + {80116, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 6052, 6024, 5395, 5275, 178300 }, Range = new List{ 5346, 5387 }, Dangerous = new List{}}}, //The Lyceum + {82326, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 6024, 4201, 5395, 434, 5276, 5393 }, Range = new List{ 5346 }, Dangerous = new List{}}}, //Watch Tower, lv. 1 + {82327, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 6024, 4201, 5395, 434, 5276, 5393 }, Range = new List{ 5346 }, Dangerous = new List{}}}, //Watch Tower, lv. 2 - {135952, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 6042,6052, 6024, 6359, 178300 }, range = new List{ 6046 }, dangerous = new List{}}}, //Highlands Cave - {100854, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 6042, 6024 }, range = new List{ 6046 }, dangerous = new List{ 218656, 218662, 218664 }}}, //Leoric's Manor - {19935, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 6052, 6025, 178300 }, range = new List{ }, dangerous = new List{}}}, //Wortham - {87832, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 6052, 6024, 6027, 4283, 178300 }, range = new List{ 4287, 4290 }, dangerous = new List{}}}, //Highlands Passage - {1199, new MonsterLayout{ lazy_load = true, additional_density = 0, can_spawn_goblin = false, melee = new List{ 6024, 4283, 3338 }, range = new List{ 4287, 4290, 4286 }, dangerous = new List{}}}, //Leoric's Hunting Grounds - {119893, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 6024, 178213, 4285 }, range = new List{ 4286 }, dangerous = new List{}}}, //Khazra Den - {148551, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 51281 }, range = new List{ }, dangerous = new List{}}}, //Cells of the Condemned - {19553, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 4157, 5393, 136943, 370, 5395 }, range = new List{ 4153, 5347 }, dangerous = new List{ 209553, 218444, 218441 }}}, //The Festering Woods - {82566, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 4282, 4283, 5467 }, range = new List{ 4287, 4290 }, dangerous = new List{}}}, //Cave of the Moon Clan, Lv.1 - {82567, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 4282, 4283, 5467 }, range = new List{ 4287, 4290 }, dangerous = new List{}}}, //Cave of the Moon Clan, Lv.2 - {179212, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 4285, 5235 }, range = new List{ }, dangerous = new List{}}}, //Sheltered Cottage - {82372, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 5236, 6360, 4157, 4983 }, range = new List{ 4153 }, dangerous = new List{}}}, //Lost Mine, Lv.1 - {82373, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 5236, 6360, 4157, 4983 }, range = new List{ 4153 }, dangerous = new List{}}}, //Lost Mine, Lv.2 - {81165, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 5236, 4157, 4983 }, range = new List{ 4153 }, dangerous = new List{}}}, //Scavenger's Den, Lv.1 - {81175, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 5236, 4157, 4983 }, range = new List{ 4153 }, dangerous = new List{}}}, //Scavenger's Den, Lv.2 - {135237, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 5235, 4156, 6646, 4156, 4152, 4157 }, range = new List{ }, dangerous = new List{}}}, //Den of the Fallen, Lv.1 - {194232, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 5235, 4156, 6646, 4156, 4152, 4157 }, range = new List{ }, dangerous = new List{}}}, //Den of the Fallen, Lv.2 - {102300, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 6359, 6652, 4157, 5393 }, range = new List{ 6638, 6359, 6356 }, dangerous = new List{}}}, //Decaying Crypt, Lv.1 - {165798, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 6652 }, range = new List{ 6638 }, dangerous = new List{}}}, //Decaying Crypt, Lv.2 - {161964, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 6644, 6652 }, range = new List{ }, dangerous = new List{}}}, //The Cave Under the Well - {106756, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 6644, 6652 }, range = new List{ }, dangerous = new List{}}}, //Dank Cellar - {106757, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 6644, 6652 }, range = new List{ }, dangerous = new List{}}}, //Damp Cellar - {103202, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 6644, 6652 }, range = new List{ }, dangerous = new List{}}}, //Dark Cellar - {62968, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 6644, 6652 }, range = new List{ }, dangerous = new List{}}}, //The Hidden Cellar - {107051, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 6644, 6652, 128781 }, range = new List{ }, dangerous = new List{}}}, //Musty Cellar - {211479, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 209087, 210502, 207378,207559, 207560, 192965 }, range = new List{ }, dangerous = new List{ 218804, 218807, 212667, 218802, 209506, 218806, 201679, 214948, 218808, 212664 }}}, //Whimsyshire + {135952, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 6042,6052, 6024, 6359, 178300 }, Range = new List{ 6046 }, Dangerous = new List{}}}, //Highlands Cave + {100854, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 6042, 6024 }, Range = new List{ 6046 }, Dangerous = new List{ 218656, 218662, 218664 }}}, //Leoric's Manor + {19935, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 6052, 6025, 178300 }, Range = new List{ }, Dangerous = new List{}}}, //Wortham + {87832, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 6052, 6024, 6027, 4283, 178300 }, Range = new List{ 4287, 4290 }, Dangerous = new List{}}}, //Highlands Passage + {1199, new MonsterLayout{ LazyLoad = true, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 6024, 4283, 3338 }, Range = new List{ 4287, 4290, 4286 }, Dangerous = new List{}}}, //Leoric's Hunting Grounds + {119893, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 6024, 178213, 4285 }, Range = new List{ 4286 }, Dangerous = new List{}}}, //Khazra Den + {148551, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 51281 }, Range = new List{ }, Dangerous = new List{}}}, //Cells of the Condemned + {19553, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 4157, 5393, 136943, 370, 5395 }, Range = new List{ 4153, 5347 }, Dangerous = new List{ 209553, 218444, 218441 }}}, //The Festering Woods + {82566, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 4282, 4283, 5467 }, Range = new List{ 4287, 4290 }, Dangerous = new List{}}}, //Cave of the Moon Clan, Lv.1 + {82567, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 4282, 4283, 5467 }, Range = new List{ 4287, 4290 }, Dangerous = new List{}}}, //Cave of the Moon Clan, Lv.2 + {179212, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 4285, 5235 }, Range = new List{ }, Dangerous = new List{}}}, //Sheltered Cottage + {82372, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 5236, 6360, 4157, 4983 }, Range = new List{ 4153 }, Dangerous = new List{}}}, //Lost Mine, Lv.1 + {82373, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 5236, 6360, 4157, 4983 }, Range = new List{ 4153 }, Dangerous = new List{}}}, //Lost Mine, Lv.2 + {81165, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 5236, 4157, 4983 }, Range = new List{ 4153 }, Dangerous = new List{}}}, //Scavenger's Den, Lv.1 + {81175, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 5236, 4157, 4983 }, Range = new List{ 4153 }, Dangerous = new List{}}}, //Scavenger's Den, Lv.2 + {135237, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 5235, 4156, 6646, 4156, 4152, 4157 }, Range = new List{ }, Dangerous = new List{}}}, //Den of the Fallen, Lv.1 + {194232, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 5235, 4156, 6646, 4156, 4152, 4157 }, Range = new List{ }, Dangerous = new List{}}}, //Den of the Fallen, Lv.2 + {102300, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 6359, 6652, 4157, 5393 }, Range = new List{ 6638, 6359, 6356 }, Dangerous = new List{}}}, //Decaying Crypt, Lv.1 + {165798, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 6652 }, Range = new List{ 6638 }, Dangerous = new List{}}}, //Decaying Crypt, Lv.2 + {161964, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 6644, 6652 }, Range = new List{ }, Dangerous = new List{}}}, //The Cave Under the Well + {106756, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 6644, 6652 }, Range = new List{ }, Dangerous = new List{}}}, //Dank Cellar + {106757, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 6644, 6652 }, Range = new List{ }, Dangerous = new List{}}}, //Damp Cellar + {103202, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 6644, 6652 }, Range = new List{ }, Dangerous = new List{}}}, //Dark Cellar + {62968, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 6644, 6652 }, Range = new List{ }, Dangerous = new List{}}}, //The Hidden Cellar + {107051, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 6644, 6652, 128781 }, Range = new List{ }, Dangerous = new List{}}}, //Musty Cellar + {211479, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 209087, 210502, 207378,207559, 207560, 192965 }, Range = new List{ }, Dangerous = new List{ 218804, 218807, 212667, 218802, 209506, 218806, 201679, 214948, 218808, 212664 }}}, //Whimsyshire #endregion #region Act II - {19839, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 4080, 6053, 6028, 5199, 5209, 5396, 4541, 4550, 5208, 4551, 4542 }, range = new List{ 4070 }, dangerous = new List{ 59970, 5203 }}}, //Stinging Winds Desert - {19835, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 6060, 6027, 6061, 6044, 6053, 5209, 5208 }, range = new List{ 6038 }, dangerous = new List{ 218810, 221442, 221810 }}}, //Road to Alcarnus - {19825, new MonsterLayout{ lazy_load = true, additional_density = 0, can_spawn_goblin = true, melee = new List{ 6060, 6027, 6061, 6044, 6054 }, range = new List{ 6038 }, dangerous = new List{ 222003, 222001, 221981, 221999 }}}, //Alcarnus - {144117, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 6043, 6028, 5208, 5512 }, range = new List{ 6047 }, dangerous = new List{ 147155, 144400 }}}, //Deserted Cellar - {141067, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 6053, 6025 }, range = new List{ }, dangerous = new List{ 140947 }}}, //Hadi's Claim Mine - {148905, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 6053, 6054 }, range = new List{ }, dangerous = new List{}}}, //Town Cellar - {102936, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 6053, 6054 }, range = new List{ }, dangerous = new List{}}}, //Secret Altar - {148904, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 6054, 6028, 6027 }, range = new List{ }, dangerous = new List{}}}, //Sandy Cellar - {102932, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 6054, 6028, 6027 }, range = new List{ }, dangerous = new List{}}}, //Hidden Conclave - {195998, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 6028 }, range = new List{ }, dangerous = new List{ 195639 }}}, //Abandoned Cellar - {148903, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 6027, 4089 }, range = new List{ }, dangerous = new List{}}}, //Alcarnus Cellar - {19836, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 6060, 5396, 4541, 4550, 5208, 4551, 4542, 4089 }, range = new List{ 6027 }, dangerous = new List{}}}, //Sundered Canyon - {170118, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 5199, 5208, 4541, 4551, 4542, 4550 }, range = new List{ }, dangerous = new List{}}}, //Black Canyon Bridge - {19838, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 5199, 4080, 5208, 5396 }, range = new List{ 4070 }, dangerous = new List{ 221406, 221402 }}}, //Black Canyon Mines - {19837, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 5199,4080, 5208, 4089, 5396, 4541, 4550, 4551 }, range = new List{ 6028, 4070 }, dangerous = new List{ 221377, 221379, 221367, 221372 }}}, //Howling Plateau - {19794, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 4080, 5208, 5512, 4550, 4541, 4551, 4542, 5432 }, range = new List{ 4098, 5428 }, dangerous = new List{}}}, //The Crumbling Vault - {57425, new MonsterLayout{ lazy_load = true, additional_density = 0, can_spawn_goblin = true, melee = new List{ 4080, 4083, 4093, 5434, 4094, 4083, 4542, 5432, 3384 }, range = new List{ 4099, 4098, 3981, 4071, 5429, 5428 }, dangerous = new List{ 222180, 215445, 208543, 140424, 113994, 115132, 140424 }}}, //Dahlgur Oasis - {166127, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 4080 }, range = new List{ 4098 }, dangerous = new List{ 166133 }}}, //The lost Caravan - {175367, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 4080, 5432 }, range = new List{ 4098, 5428 }, dangerous = new List{}}}, //Path to the Oasis - {159897, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 4080 }, range = new List{ }, dangerous = new List{}}}, //Storage Cellar - {159899, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 4080 }, range = new List{ }, dangerous = new List{}}}, //Storm Cellar - {19798, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 231349, 4083, 231356, 5278, 5397, 4090, 137995, 137996, 208962, 204944, 208963, 5188, 5187, 5192, 368, 4196, 5468, 231355 }, range = new List{ 231351, 5349, 5376, 5368, 5372, 5382 }, dangerous = new List{ 222502, 222510, 222511, 222512 }}}, //The Storm Halls - {19797, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 231349, 4083, 231356, 5278, 5397, 4090, 137994, 137992, 208832, 204944, 208963, 5188, 5187, 5192, 4196, 368, 5191, 231355 }, range = new List{ 231351, 5349, 5368, 5372, 5382, 5376 }, dangerous = new List{ 222427, 222413, 165602 }}}, //The Unknown Depths - {175330, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 4093, 4090, 5512, 4071 }, range = new List{ }, dangerous = new List{}}}, //Ancient Path - {53834, new MonsterLayout{ lazy_load = true, additional_density = 0, can_spawn_goblin = true, melee = new List{ 6655, 218795, 5210, 4105, 4104, 5396, 5188, 3385, 4542, 5191, 5513, 5512, 4093, 204256 }, range = new List{ 5376 }, dangerous = new List{ 222352, 222385, 219832, 217744, 111868, 222400, 222339, 218947 }}}, //Desolate Sands - {62780, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 4202, 5210, 4105, 56784, 4080, 5513, 4071, 4090, 4204 }, range = new List{ 4155, 5381, 5429, 5428, 5430, 5277 }, dangerous = new List{ 222236, 222238 }}}, //Eastern Channel - {159588, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 4204, 217308, 437, 5090 }, range = new List{ }, dangerous = new List{}}}, //Sirocco Caverns, Lv.1 - {220805, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 4204, 217308, 437 }, range = new List{ }, dangerous = new List{}}}, //Sirocco Caverns, Lv.2 - {111667, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 6238, 4202, 4158, 5088, 5238 }, range = new List{ }, dangerous = new List{}}}, //Cave of Burrowing Horror, Lv.1 - {218969, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 6238, 4202, 4158, 5238 }, range = new List{ }, dangerous = new List{}}}, //Cave of Burrowing Horror, Lv.2 - {19791, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 5396, 5277, 4104, 56784, 5513, 5432, 5512, 5381 }, range = new List{ 5428 }, dangerous = new List{ 219583, 222008, 222005, 156738, 156763, }}}, //Sewers of Caldeum - {19795, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 5396, 5412 }, range = new List{ 5348, 5381, 5367 }, dangerous = new List{}}}, //Chamber of the Lost Idol - {62778, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 4104, 4105, 56784, 4080, 5381, 5513, 5432 }, range = new List{ 5430, 5428, 5277 }, dangerous = new List{ 222186, 222189 }}}, //Western Channel - {169494, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 5396, 4197 }, range = new List{ 5375 }, dangerous = new List{}}}, //Mysterious Cave, Lv.1 - {194239, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 5396, 4197 }, range = new List{ 5375 }, dangerous = new List{}}}, //Mysterious Cave, Lv.2 - {146838, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 5396, 5277, 4104, 56784, 5512, 5432 }, range = new List{ 5381, 5428 }, dangerous = new List{}}}, //Ruined Cistern - {196225, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 5209, 4080 }, range = new List{ 4070 }, dangerous = new List{}}}, //Tunnels of the Rockworm - {204629, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 5396, 4158, 55135 }, range = new List{ }, dangerous = new List{}}}, //Cave of the Betrayer, Lv.1 - {204675, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 5396, 4158 }, range = new List{ }, dangerous = new List{}}}, //Cave of the Betrayer, Lv.2 - {19801, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 5396, 5432, 208962, 208963, 204944, 5512 }, range = new List{ 5428 }, dangerous = new List{}}}, //The Ruins, Lv.1 - {222577, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 5396, 5432, 208962, 208963, 204944, 5512 }, range = new List{}, dangerous = new List{}}}, //The Ruins, Lv.2 - {111671, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 5468, 4158, 4202, 5513, 5475, 5088 }, range = new List{ }, dangerous = new List{}}}, //Vile Cavern, Lv.1 - {218968, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 5468, 4158, 4202 }, range = new List{ }, dangerous = new List{}}}, //Vile Cavern, Lv.2 - {123182, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 208962, 208832, 5375, 204944, 208963 }, range = new List{ 3982 }, dangerous = new List{}}}, //Vault of the Assassin, part 1 - {153714, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 208962, 208832, 5375, 204944, 208963 }, range = new List{ 982 }, dangerous = new List{}}}, //Vault of the Assassin, part 2 - {61632, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 5396, 5188, 208962, 208832, 204944, 208963, 5193 }, range = new List{ 5371, 5375 }, dangerous = new List{}}}, //The Forgotten Ruins - {19799, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 5278, 5397, 4198 }, range = new List{}, dangerous = new List{}}}, //Halls of Dusk - {80592, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 208962, 208832, 204944, 208963, 199478, 4198 }, range = new List{ 5372, 5382 }, dangerous = new List{ 222523 }}}, //Halls of Dusk - {192689, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 4105, 5433, 56784, 4080, 5513, 5432 }, range = new List{ 5429, 5428 }, dangerous = new List{}}}, //Hidden Aqueducts - {158594, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 4104, 56784, 5513, 5432 }, range = new List{ 5428 }, dangerous = new List{}}}, //Tomb of Khan Dakab - {158384, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 5513, 5432 }, range = new List{ 5428 }, dangerous = new List{}}}, //Tomb of Sardar - {62575, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 56784, 5513, 368 }, range = new List{ 5368 }, dangerous = new List{}}}, //Ancient Cave, Lv.1 - {194242, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 56784, 5513, 368 }, range = new List{ 5368 }, dangerous = new List{}}}, //Ancient Cave, Lv.2 - {62574, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 5468, 5475, 5088 }, range = new List{ }, dangerous = new List{}}}, //Flooded Cave, Lv.1 - {161105, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 5468, 5475, 5088 }, range = new List{ }, dangerous = new List{}}}, //Flooded Cave, Lv.2 + {19839, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 4080, 6053, 6028, 5199, 5209, 5396, 4541, 4550, 5208, 4551, 4542 }, Range = new List{ 4070 }, Dangerous = new List{ 59970, 5203 }}}, //Stinging Winds Desert + {19835, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 6060, 6027, 6061, 6044, 6053, 5209, 5208 }, Range = new List{ 6038 }, Dangerous = new List{ 218810, 221442, 221810 }}}, //Road to Alcarnus + {19825, new MonsterLayout{ LazyLoad = true, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 6060, 6027, 6061, 6044, 6054 }, Range = new List{ 6038 }, Dangerous = new List{ 222003, 222001, 221981, 221999 }}}, //Alcarnus + {144117, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 6043, 6028, 5208, 5512 }, Range = new List{ 6047 }, Dangerous = new List{ 147155, 144400 }}}, //Deserted Cellar + {141067, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 6053, 6025 }, Range = new List{ }, Dangerous = new List{ 140947 }}}, //Hadi's Claim Mine + {148905, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 6053, 6054 }, Range = new List{ }, Dangerous = new List{}}}, //Town Cellar + {102936, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 6053, 6054 }, Range = new List{ }, Dangerous = new List{}}}, //Secret Altar + {148904, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 6054, 6028, 6027 }, Range = new List{ }, Dangerous = new List{}}}, //Sandy Cellar + {102932, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 6054, 6028, 6027 }, Range = new List{ }, Dangerous = new List{}}}, //Hidden Conclave + {195998, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 6028 }, Range = new List{ }, Dangerous = new List{ 195639 }}}, //Abandoned Cellar + {148903, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 6027, 4089 }, Range = new List{ }, Dangerous = new List{}}}, //Alcarnus Cellar + {19836, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 6060, 5396, 4541, 4550, 5208, 4551, 4542, 4089 }, Range = new List{ 6027 }, Dangerous = new List{}}}, //Sundered Canyon + {170118, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 5199, 5208, 4541, 4551, 4542, 4550 }, Range = new List{ }, Dangerous = new List{}}}, //Black Canyon Bridge + {19838, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 5199, 4080, 5208, 5396 }, Range = new List{ 4070 }, Dangerous = new List{ 221406, 221402 }}}, //Black Canyon Mines + {19837, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 5199,4080, 5208, 4089, 5396, 4541, 4550, 4551 }, Range = new List{ 6028, 4070 }, Dangerous = new List{ 221377, 221379, 221367, 221372 }}}, //Howling Plateau + {19794, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 4080, 5208, 5512, 4550, 4541, 4551, 4542, 5432 }, Range = new List{ 4098, 5428 }, Dangerous = new List{}}}, //The Crumbling Vault + {57425, new MonsterLayout{ LazyLoad = true, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 4080, 4083, 4093, 5434, 4094, 4083, 4542, 5432, 3384 }, Range = new List{ 4099, 4098, 3981, 4071, 5429, 5428 }, Dangerous = new List{ 222180, 215445, 208543, 140424, 113994, 115132, 140424 }}}, //Dahlgur Oasis + {166127, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 4080 }, Range = new List{ 4098 }, Dangerous = new List{ 166133 }}}, //The lost Caravan + {175367, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 4080, 5432 }, Range = new List{ 4098, 5428 }, Dangerous = new List{}}}, //Path to the Oasis + {159897, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 4080 }, Range = new List{ }, Dangerous = new List{}}}, //Storage Cellar + {159899, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 4080 }, Range = new List{ }, Dangerous = new List{}}}, //Storm Cellar + {19798, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 231349, 4083, 231356, 5278, 5397, 4090, 137995, 137996, 208962, 204944, 208963, 5188, 5187, 5192, 368, 4196, 5468, 231355 }, Range = new List{ 231351, 5349, 5376, 5368, 5372, 5382 }, Dangerous = new List{ 222502, 222510, 222511, 222512 }}}, //The Storm Halls + {19797, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 231349, 4083, 231356, 5278, 5397, 4090, 137994, 137992, 208832, 204944, 208963, 5188, 5187, 5192, 4196, 368, 5191, 231355 }, Range = new List{ 231351, 5349, 5368, 5372, 5382, 5376 }, Dangerous = new List{ 222427, 222413, 165602 }}}, //The Unknown Depths + {175330, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 4093, 4090, 5512, 4071 }, Range = new List{ }, Dangerous = new List{}}}, //Ancient Path + {53834, new MonsterLayout{ LazyLoad = true, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 6655, 218795, 5210, 4105, 4104, 5396, 5188, 3385, 4542, 5191, 5513, 5512, 4093, 204256 }, Range = new List{ 5376 }, Dangerous = new List{ 222352, 222385, 219832, 217744, 111868, 222400, 222339, 218947 }}}, //Desolate Sands + {62780, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 4202, 5210, 4105, 56784, 4080, 5513, 4071, 4090, 4204 }, Range = new List{ 4155, 5381, 5429, 5428, 5430, 5277 }, Dangerous = new List{ 222236, 222238 }}}, //Eastern Channel + {159588, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 4204, 217308, 437, 5090 }, Range = new List{ }, Dangerous = new List{}}}, //Sirocco Caverns, Lv.1 + {220805, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 4204, 217308, 437 }, Range = new List{ }, Dangerous = new List{}}}, //Sirocco Caverns, Lv.2 + {111667, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 6238, 4202, 4158, 5088, 5238 }, Range = new List{ }, Dangerous = new List{}}}, //Cave of Burrowing Horror, Lv.1 + {218969, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 6238, 4202, 4158, 5238 }, Range = new List{ }, Dangerous = new List{}}}, //Cave of Burrowing Horror, Lv.2 + {19791, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 5396, 5277, 4104, 56784, 5513, 5432, 5512, 5381 }, Range = new List{ 5428 }, Dangerous = new List{ 219583, 222008, 222005, 156738, 156763, }}}, //Sewers of Caldeum + {19795, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 5396, 5412 }, Range = new List{ 5348, 5381, 5367 }, Dangerous = new List{}}}, //Chamber of the Lost Idol + {62778, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 4104, 4105, 56784, 4080, 5381, 5513, 5432 }, Range = new List{ 5430, 5428, 5277 }, Dangerous = new List{ 222186, 222189 }}}, //Western Channel + {169494, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 5396, 4197 }, Range = new List{ 5375 }, Dangerous = new List{}}}, //Mysterious Cave, Lv.1 + {194239, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 5396, 4197 }, Range = new List{ 5375 }, Dangerous = new List{}}}, //Mysterious Cave, Lv.2 + {146838, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 5396, 5277, 4104, 56784, 5512, 5432 }, Range = new List{ 5381, 5428 }, Dangerous = new List{}}}, //Ruined Cistern + {196225, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 5209, 4080 }, Range = new List{ 4070 }, Dangerous = new List{}}}, //Tunnels of the Rockworm + {204629, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 5396, 4158, 55135 }, Range = new List{ }, Dangerous = new List{}}}, //Cave of the Betrayer, Lv.1 + {204675, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 5396, 4158 }, Range = new List{ }, Dangerous = new List{}}}, //Cave of the Betrayer, Lv.2 + {19801, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 5396, 5432, 208962, 208963, 204944, 5512 }, Range = new List{ 5428 }, Dangerous = new List{}}}, //The Ruins, Lv.1 + {222577, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 5396, 5432, 208962, 208963, 204944, 5512 }, Range = new List{}, Dangerous = new List{}}}, //The Ruins, Lv.2 + {111671, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 5468, 4158, 4202, 5513, 5475, 5088 }, Range = new List{ }, Dangerous = new List{}}}, //Vile Cavern, Lv.1 + {218968, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 5468, 4158, 4202 }, Range = new List{ }, Dangerous = new List{}}}, //Vile Cavern, Lv.2 + {123182, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 208962, 208832, 5375, 204944, 208963 }, Range = new List{ 3982 }, Dangerous = new List{}}}, //Vault of the Assassin, part 1 + {153714, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 208962, 208832, 5375, 204944, 208963 }, Range = new List{ 982 }, Dangerous = new List{}}}, //Vault of the Assassin, part 2 + {61632, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 5396, 5188, 208962, 208832, 204944, 208963, 5193 }, Range = new List{ 5371, 5375 }, Dangerous = new List{}}}, //The Forgotten Ruins + {19799, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 5278, 5397, 4198 }, Range = new List{}, Dangerous = new List{}}}, //Halls of Dusk + {80592, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 208962, 208832, 204944, 208963, 199478, 4198 }, Range = new List{ 5372, 5382 }, Dangerous = new List{ 222523 }}}, //Halls of Dusk + {192689, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 4105, 5433, 56784, 4080, 5513, 5432 }, Range = new List{ 5429, 5428 }, Dangerous = new List{}}}, //Hidden Aqueducts + {158594, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 4104, 56784, 5513, 5432 }, Range = new List{ 5428 }, Dangerous = new List{}}}, //Tomb of Khan Dakab + {158384, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 5513, 5432 }, Range = new List{ 5428 }, Dangerous = new List{}}}, //Tomb of Sardar + {62575, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 56784, 5513, 368 }, Range = new List{ 5368 }, Dangerous = new List{}}}, //Ancient Cave, Lv.1 + {194242, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 56784, 5513, 368 }, Range = new List{ 5368 }, Dangerous = new List{}}}, //Ancient Cave, Lv.2 + {62574, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 5468, 5475, 5088 }, Range = new List{ }, Dangerous = new List{}}}, //Flooded Cave, Lv.1 + {161105, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 5468, 5475, 5088 }, Range = new List{ }, Dangerous = new List{}}}, //Flooded Cave, Lv.2 #endregion #region Act III - {75436, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 6055, 169456, 170763, 5397, 182285, 204232, 77796, 4985, 62736 }, range = new List{ 170781 }, dangerous = new List{ 220468, 220710, 220444, 220455 }}}, //The Keep Depths, Lv.1 - {93103, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 6055,4095, 169456, 170763, 5397, 182285, 204232, 77796, 4985, 62736, 130794 }, range = new List{ 170781 }, dangerous = new List{ 220481, 220479, 220476 }}}, //The Keep Depths, Lv.2 - {136448, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 6055,4095, 169456, 170763, 5397, 182285, 204232, 77796, 62736 }, range = new List{ 170781 }, dangerous = new List{ 220499, 220491, 220485 }}}, //The Keep Depths, Lv.3 - {182258, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 4084,4095, 4091, 4746, 130794 }, range = new List{ 4100, 4072 }, dangerous = new List{}}}, //The Barracks, lv. 1 - {221753, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 4084,4095, 4091, 4746, 130794 }, range = new List{ 4100, 4072 }, dangerous = new List{}}}, //The Barracks, lv. 2 - {92960, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 4084,4085, 4091, 4092, 77796, 62736, 221770, 130794 }, range = new List{ 5581, 365, 4073 }, dangerous = new List{ 220232 }}}, //Skycrown Battlements - {69504, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 4085, 4295, 141194, 4085, 221770, 130794 }, range = new List{ 365, 4303, 4300, 5581, 4073 }, dangerous = new List{ 220377, 220775, 220773, 220727 }}}, //Rakkis Crossing - {119653, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 4296, 4746 }, range = new List{ 4300, 4304, 5508 }, dangerous = new List{ 220857, 220853 }}}, //Tower of the Cursed, Lv.1 - {139274, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 4296, 4746 }, range = new List{ 4300, 4304, 5508 }, dangerous = new List{ 220868 }}}, //Tower of the Cursed, Lv.2 + {75436, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 6055, 169456, 170763, 5397, 182285, 204232, 77796, 4985, 62736 }, Range = new List{ 170781 }, Dangerous = new List{ 220468, 220710, 220444, 220455 }}}, //The Keep Depths, Lv.1 + {93103, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 6055,4095, 169456, 170763, 5397, 182285, 204232, 77796, 4985, 62736, 130794 }, Range = new List{ 170781 }, Dangerous = new List{ 220481, 220479, 220476 }}}, //The Keep Depths, Lv.2 + {136448, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 6055,4095, 169456, 170763, 5397, 182285, 204232, 77796, 62736 }, Range = new List{ 170781 }, Dangerous = new List{ 220499, 220491, 220485 }}}, //The Keep Depths, Lv.3 + {182258, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 4084,4095, 4091, 4746, 130794 }, Range = new List{ 4100, 4072 }, Dangerous = new List{}}}, //The Barracks, lv. 1 + {221753, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 4084,4095, 4091, 4746, 130794 }, Range = new List{ 4100, 4072 }, Dangerous = new List{}}}, //The Barracks, lv. 2 + {92960, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 4084,4085, 4091, 4092, 77796, 62736, 221770, 130794 }, Range = new List{ 5581, 365, 4073 }, Dangerous = new List{ 220232 }}}, //Skycrown Battlements + {69504, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 4085, 4295, 141194, 4085, 221770, 130794 }, Range = new List{ 365, 4303, 4300, 5581, 4073 }, Dangerous = new List{ 220377, 220775, 220773, 220727 }}}, //Rakkis Crossing + {119653, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 4296, 4746 }, Range = new List{ 4300, 4304, 5508 }, Dangerous = new List{ 220857, 220853 }}}, //Tower of the Cursed, Lv.1 + {139274, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 4296, 4746 }, Range = new List{ 4300, 4304, 5508 }, Dangerous = new List{ 220868 }}}, //Tower of the Cursed, Lv.2 //{119656, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 144315, 169615, 5467 }, range = new List{ 5508 }, dangerous = new List{}}}, //Heart of the Damned - {191078, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 191592, 3342, 5239, 3850 }, range = new List{ }, dangerous = new List{}}}, //Icefall Caves, Lv.1 - {221703, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 3342, 5239, 3850 }, range = new List{ }, dangerous = new List{}}}, //Icefall Caves, Lv.2 - {189345, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 5239, 4548, 4552, 4985 }, range = new List{ }, dangerous = new List{}}}, //Caverns of Frost, Lv.1 - {221702, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 5239, 4548, 4552, 4985 }, range = new List{ }, dangerous = new List{ 212750 }}}, //Caverns of Frost, Lv.2 - {182274, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 170763, 182281, 182285, 62736, 221770, 130794 }, range = new List{ 170781, 182279 }, dangerous = new List{}}}, //Battlefield Stores, Lv.1 - {221754, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 170763, 182281, 182285, 62736, 221770, 130794 }, range = new List{ 170781, 182279 }, dangerous = new List{}}}, //Battlefield Stores, Lv.2 - {93173, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 4085, 4091, 77796, 62736 }, range = new List{ 5581 }, dangerous = new List{ 220395, 220397 }}}, //Stonefort - {112565, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 4295, 4085, 221770, 4738, 130794 }, range = new List{ 4303, 4300, 5581, 60722 }, dangerous = new List{ 218566, 220705, 220708 }}}, //Fields of Slaughter - {155048, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 4295, 4738 }, range = new List{ 60722 }, dangerous = new List{ 220699 }}}, //The Bridge of Korsikk - {112548, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 4295, 60722, 141194, 4738, 4106, 221770 }, range = new List{ 4300, 5581 }, dangerous = new List{ 220509, 220688, 220691 }}}, //The Battlefields - {86080, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 4296, 4085, 4738, 4747, 4746, 144315 }, range = new List{ 189852, 4300, 5581, 365 }, dangerous = new List{ 220777, 220381, 220795 }}}, // REMOVED 203048 (Horrible burrow animations) //Arreat Crater, Lv.1 - {119305, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 4296, 4085, 4738, 169615, 4747, 4746, 144315 }, range = new List{ 4300, 5581, 365, 205767, 5508 }, dangerous = new List{ 220853, 220850, 220851 }}}, // REMOVED 203048 (Horrible burrow animations) //Arreat Crater, Lv.2 - {80791, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 144315, 4085, 169615, 4747, 4746 }, range = new List{ 365, 4073, 5508 }, dangerous = new List{ 220810, 220783, 220435, 220806 }}}, //Tower of the Damned, Lv.1 - {80792, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 144315, 4085, 169615, 4747, 4746 }, range = new List{ 365, 4073, 5508 }, dangerous = new List{ 220817, 220814 }}}, //Tower of the Damned, Lv.2 - {119306, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 121353, 4747, 4746 }, range = new List{ 5581, 5508 }, dangerous = new List{ 220884, 220881, 220889 }}}, //The Core of Arreat - {174666, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 141194, 62736, 5514, 221770, 4985, 4984, 4746, 130794 }, range = new List{ 60722 }, dangerous = new List{}}}, //Fortified Bunker, Lv.1 - {221752, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 141194, 62736, 221770, 4985, 4984, 4746, 130794 }, range = new List{ 60722 }, dangerous = new List{}}}, //Fortified Bunker, Lv.2 - {182502, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 141194, 60049, 5436, 62736, 130794, 106707 }, range = new List{ 60722, 5508 }, dangerous = new List{}}}, //The Foundry, Lv.1 - {221761, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 141194, 60049, 5436, 62736, 130794 }, range = new List{ 60722, 5508 }, dangerous = new List{}}}, //The Foundry, Lv.2 + {191078, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 191592, 3342, 5239, 3850 }, Range = new List{ }, Dangerous = new List{}}}, //Icefall Caves, Lv.1 + {221703, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 3342, 5239, 3850 }, Range = new List{ }, Dangerous = new List{}}}, //Icefall Caves, Lv.2 + {189345, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 5239, 4548, 4552, 4985 }, Range = new List{ }, Dangerous = new List{}}}, //Caverns of Frost, Lv.1 + {221702, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 5239, 4548, 4552, 4985 }, Range = new List{ }, Dangerous = new List{ 212750 }}}, //Caverns of Frost, Lv.2 + {182274, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 170763, 182281, 182285, 62736, 221770, 130794 }, Range = new List{ 170781, 182279 }, Dangerous = new List{}}}, //Battlefield Stores, Lv.1 + {221754, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 170763, 182281, 182285, 62736, 221770, 130794 }, Range = new List{ 170781, 182279 }, Dangerous = new List{}}}, //Battlefield Stores, Lv.2 + {93173, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 4085, 4091, 77796, 62736 }, Range = new List{ 5581 }, Dangerous = new List{ 220395, 220397 }}}, //Stonefort + {112565, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 4295, 4085, 221770, 4738, 130794 }, Range = new List{ 4303, 4300, 5581, 60722 }, Dangerous = new List{ 218566, 220705, 220708 }}}, //Fields of Slaughter + {155048, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 4295, 4738 }, Range = new List{ 60722 }, Dangerous = new List{ 220699 }}}, //The Bridge of Korsikk + {112548, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 4295, 60722, 141194, 4738, 4106, 221770 }, Range = new List{ 4300, 5581 }, Dangerous = new List{ 220509, 220688, 220691 }}}, //The Battlefields + {86080, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 4296, 4085, 4738, 4747, 4746, 144315 }, Range = new List{ 189852, 4300, 5581, 365 }, Dangerous = new List{ 220777, 220381, 220795 }}}, // REMOVED 203048 (Horrible burrow animations) //Arreat Crater, Lv.1 + {119305, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 4296, 4085, 4738, 169615, 4747, 4746, 144315 }, Range = new List{ 4300, 5581, 365, 205767, 5508 }, Dangerous = new List{ 220853, 220850, 220851 }}}, // REMOVED 203048 (Horrible burrow animations) //Arreat Crater, Lv.2 + {80791, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 144315, 4085, 169615, 4747, 4746 }, Range = new List{ 365, 4073, 5508 }, Dangerous = new List{ 220810, 220783, 220435, 220806 }}}, //Tower of the Damned, Lv.1 + {80792, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 144315, 4085, 169615, 4747, 4746 }, Range = new List{ 365, 4073, 5508 }, Dangerous = new List{ 220817, 220814 }}}, //Tower of the Damned, Lv.2 + {119306, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 121353, 4747, 4746 }, Range = new List{ 5581, 5508 }, Dangerous = new List{ 220884, 220881, 220889 }}}, //The Core of Arreat + {174666, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 141194, 62736, 5514, 221770, 4985, 4984, 4746, 130794 }, Range = new List{ 60722 }, Dangerous = new List{}}}, //Fortified Bunker, Lv.1 + {221752, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 141194, 62736, 221770, 4985, 4984, 4746, 130794 }, Range = new List{ 60722 }, Dangerous = new List{}}}, //Fortified Bunker, Lv.2 + {182502, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 141194, 60049, 5436, 62736, 130794, 106707 }, Range = new List{ 60722, 5508 }, Dangerous = new List{}}}, //The Foundry, Lv.1 + {221761, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 141194, 60049, 5436, 62736, 130794 }, Range = new List{ 60722, 5508 }, Dangerous = new List{}}}, //The Foundry, Lv.2 #endregion #region Act IV - {109526, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 3361, 82764, 106712, 121353 }, range = new List{ 106713 }, dangerous = new List{}}}, //Hell Rift, lv.1 - {109531, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 82764, 106708, 3362, 106712, 121353 }, range = new List{ 205767, 152679 }, dangerous = new List{}}}, //Hell Rift, lv.2 - {109514, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 3361, 82764, 106708, 106712, 106711 }, range = new List{ 106713, 136864, 152679 }, dangerous = new List{ 219651, 219727, 219668 }}}, //Garden of Hope, lv.1 - {109516, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 106711, 134416, 82764, 4755, 106708, 60049, 3362, 106712, 106714 }, range = new List{ 106713, 152679 }, dangerous = new List{ 219925 }}}, //Garden of Hope, lv.2 - {201668, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 141196, 60049 }, range = new List{ }, dangerous = new List{}}}, //Blessed Chancel - {201671, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 141196 }, range = new List{ }, dangerous = new List{}}}, //Sacellum of Virtue - {201670, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 106711, 106708 }, range = new List{ }, dangerous = new List{ 223691 }}}, //Radiant Chapel - {175738, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 136864 }, range = new List{ }, dangerous = new List{}}}, //Holy Sanctum - {109538, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 106713, 136864, 106711, 82764, 4760, 4757, 137856, 106708, 199478, 106712, 106714 }, range = new List{ 219673, 106709 }, dangerous = new List{ 219847, 219893, 219916 }}}, //The Silver Spire, Lv.1 - {109540, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 136864, 3361, 106711, 106710, 82764, 4760, 4757, 106708, 199478, 106714 }, range = new List{ 106709 }, dangerous = new List{ 219949, 219960, 219985, 218873 }}}, //The Silver Spire, Lv.2 - {109542, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 106711, 82764, 199478, 106710, 82764, 199478, 134416 }, range = new List{ 152679, 219673, 5508 }, dangerous = new List{}}}, //The Silver Spire, Lv.4 - {210728, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 106713, 136864, 106711, 82764, 4760, 4757, 137856, 106708, 199478, 106712, 106714, 3361, 106710, 175614 }, range = new List{ 219673, 106709 }, dangerous = new List{}}}, //The Silver Spire, Lv.5 + {109526, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 3361, 82764, 106712, 121353 }, Range = new List{ 106713 }, Dangerous = new List{}}}, //Hell Rift, lv.1 + {109531, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 82764, 106708, 3362, 106712, 121353 }, Range = new List{ 205767, 152679 }, Dangerous = new List{}}}, //Hell Rift, lv.2 + {109514, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 3361, 82764, 106708, 106712, 106711 }, Range = new List{ 106713, 136864, 152679 }, Dangerous = new List{ 219651, 219727, 219668 }}}, //Garden of Hope, lv.1 + {109516, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 106711, 134416, 82764, 4755, 106708, 60049, 3362, 106712, 106714 }, Range = new List{ 106713, 152679 }, Dangerous = new List{ 219925 }}}, //Garden of Hope, lv.2 + {201668, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 141196, 60049 }, Range = new List{ }, Dangerous = new List{}}}, //Blessed Chancel + {201671, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 141196 }, Range = new List{ }, Dangerous = new List{}}}, //Sacellum of Virtue + {201670, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 106711, 106708 }, Range = new List{ }, Dangerous = new List{ 223691 }}}, //Radiant Chapel + {175738, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 136864 }, Range = new List{ }, Dangerous = new List{}}}, //Holy Sanctum + {109538, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 106713, 136864, 106711, 82764, 4760, 4757, 137856, 106708, 199478, 106712, 106714 }, Range = new List{ 219673, 106709 }, Dangerous = new List{ 219847, 219893, 219916 }}}, //The Silver Spire, Lv.1 + {109540, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 136864, 3361, 106711, 106710, 82764, 4760, 4757, 106708, 199478, 106714 }, Range = new List{ 106709 }, Dangerous = new List{ 219949, 219960, 219985, 218873 }}}, //The Silver Spire, Lv.2 + {109542, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 106711, 82764, 199478, 106710, 82764, 199478, 134416 }, Range = new List{ 152679, 219673, 5508 }, Dangerous = new List{}}}, //The Silver Spire, Lv.4 + {210728, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 106713, 136864, 106711, 82764, 4760, 4757, 137856, 106708, 199478, 106712, 106714, 3361, 106710, 175614 }, Range = new List{ 219673, 106709 }, Dangerous = new List{}}}, //The Silver Spire, Lv.5 #endregion #region Act V - {261758, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 273417, 272330, 282027, 276309, 309114, 277203, 276495, 310894, 310893 }, range = new List{ 282789, 310888 }, dangerous = new List{ 360853, 360861, 369424, 309462 }}}, //Westmarch Commons - {338946, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 341711, 297708, 262442, 342218, 342237, 309114, 051356, 342244, 334796, 334792, 334798 }, range = new List{ }, dangerous = new List{ 351183, 373821, 373819, 361417 }}}, //Briarthorn Cemetery - {263493, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 273417, 272330, 262442, 330603, 282027, 276309, 277203, 288691, 310893, 298827, 299231 }, range = new List{ 282789, 310888 }, dangerous = new List{ 373830, 363986, 355667, 355672, 355680, 353443 }}}, //Westmarch Heights - {282487, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 237333, 361665 }, range = new List{ }, dangerous = new List{}}}, //Overgrown Ruins - {245964, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 239014, 237333, 239516, 361665 }, range = new List{ }, dangerous = new List{ 361755, 361771 }}}, //Blood Marsh - {258142, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 239014, 237333, 363639, 289387, 254175, 246343, 005276, 239516, 237876 }, range = new List{ 289388 }, dangerous = new List{ 290453, 361991, 351179 }}}, //Paths of the Drowned - {283553, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 276492, 343183, 347255, 345949, 283269, 351023 }, range = new List{ }, dangerous = new List{ 373881, 362303, 362299 }}}, //Passage to Corvus - {283567, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 276492, 343183, 347255, 345949, 283269, 351023 }, range = new List{ }, dangerous = new List{ 342355, 362309, 362305, 373842 }}}, //Ruins of Corvus - {338602, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 296283, 271579, 271806 }, range = new List{ }, dangerous = new List{ 363108, 363060, 373883, 362895, 362891, 341760, 363051, 363073 }}}, //REMOVED 275108 (horrible tunnel animation) //Battlefields of Eternity - {271234, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 241288, 305579 }, range = new List{ }, dangerous = new List{ 363374, 363378, 363228, 363232, 363367 }}}, //Pandemonium Fortress lv. 1 - {360494, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 241288, 305579, 340920, 299231 }, range = new List{ }, dangerous = new List{ 360243, 360244, 360241, 363230 }}}, //Pandemonium Fortress lv. 2 + {261758, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 273417, 272330, 282027, 276309, 309114, 277203, 276495, 310894, 310893 }, Range = new List{ 282789, 310888 }, Dangerous = new List{ 360853, 360861, 369424, 309462 }}}, //Westmarch Commons + {338946, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 341711, 297708, 262442, 342218, 342237, 309114, 051356, 342244, 334796, 334792, 334798 }, Range = new List{ }, Dangerous = new List{ 351183, 373821, 373819, 361417 }}}, //Briarthorn Cemetery + {263493, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 273417, 272330, 262442, 330603, 282027, 276309, 277203, 288691, 310893, 298827, 299231 }, Range = new List{ 282789, 310888 }, Dangerous = new List{ 373830, 363986, 355667, 355672, 355680, 353443 }}}, //Westmarch Heights + {282487, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 237333, 361665 }, Range = new List{ }, Dangerous = new List{}}}, //Overgrown Ruins + {245964, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 239014, 237333, 239516, 361665 }, Range = new List{ }, Dangerous = new List{ 361755, 361771 }}}, //Blood Marsh + {258142, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 239014, 237333, 363639, 289387, 254175, 246343, 005276, 239516, 237876 }, Range = new List{ 289388 }, Dangerous = new List{ 290453, 361991, 351179 }}}, //Paths of the Drowned + {283553, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 276492, 343183, 347255, 345949, 283269, 351023 }, Range = new List{ }, Dangerous = new List{ 373881, 362303, 362299 }}}, //Passage to Corvus + {283567, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 276492, 343183, 347255, 345949, 283269, 351023 }, Range = new List{ }, Dangerous = new List{ 342355, 362309, 362305, 373842 }}}, //Ruins of Corvus + {338602, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 296283, 271579, 271806 }, Range = new List{ }, Dangerous = new List{ 363108, 363060, 373883, 362895, 362891, 341760, 363051, 363073 }}}, //REMOVED 275108 (horrible tunnel animation) //Battlefields of Eternity + {271234, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 241288, 305579 }, Range = new List{ }, Dangerous = new List{ 363374, 363378, 363228, 363232, 363367 }}}, //Pandemonium Fortress lv. 1 + {360494, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 241288, 305579, 340920, 299231 }, Range = new List{ }, Dangerous = new List{ 360243, 360244, 360241, 363230 }}}, //Pandemonium Fortress lv. 2 #endregion //x1_lr_tileset_Westmarch - {331263, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 341711, 297708, 262442, 342218, 342237, 309114, 051356, 342244, 334796, 334792, 334798 }, range = new List{ }, dangerous = new List{ 351183, 373821, 373819, 361417 }}}, + {331263, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 341711, 297708, 262442, 342218, 342237, 309114, 051356, 342244, 334796, 334792, 334798 }, Range = new List{ }, Dangerous = new List{ 351183, 373821, 373819, 361417 }}}, //_x1_lr_tileset_fortress_large - {360797, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 241288, 305579, 340920, 299231 }, range = new List{ }, dangerous = new List{ 363374, 363378, 363228, 363232, 363367, 360243, 360244, 360241, 363230 }}}, + {360797, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 241288, 305579, 340920, 299231 }, Range = new List{ }, Dangerous = new List{ 363374, 363378, 363228, 363232, 363367, 360243, 360244, 360241, 363230 }}}, //x1_lr_tileset_zoltruins - {288823, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 5396, 5432, 208962, 208963, 204944, 5512 }, range = new List{ 5428 }, dangerous = new List{}}}, + {288823, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 5396, 5432, 208962, 208963, 204944, 5512 }, Range = new List{ 5428 }, Dangerous = new List{}}}, //x1_lr_tileset_hexmaze - {331389, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 241288, 305579, 340920, 299231 }, range = new List{ }, dangerous = new List{ 363374, 363378, 363228, 363232, 363367, 360243, 360244, 360241, 363230 }}}, + {331389, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 241288, 305579, 340920, 299231 }, Range = new List{ }, Dangerous = new List{ 363374, 363378, 363228, 363232, 363367, 360243, 360244, 360241, 363230 }}}, //x1_lr_tileset_icecave - {275960, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 191592, 3342, 5239, 3850 }, range = new List{ }, dangerous = new List{}}}, + {275960, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 191592, 3342, 5239, 3850 }, Range = new List{ }, Dangerous = new List{}}}, //x1_lr_tileset_crypt - {275946, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List{ 5393, 3848, 5395, 5411, 6653 }, range = new List{ 5346, 3847, 6639 }, dangerous = new List{ 218348, 218351 }}}, + {275946, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List{ 5393, 3848, 5395, 5411, 6653 }, Range = new List{ 5346, 3847, 6639 }, Dangerous = new List{ 218348, 218351 }}}, //x1_lr_tileset_corruptspire - {275926, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List{ 106711, 82764, 199478, 106710, 82764, 199478, 134416 }, range = new List{ 152679, 219673, 5508 }, dangerous = new List{}}}, + {275926, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List{ 106711, 82764, 199478, 106710, 82764, 199478, 134416 }, Range = new List{ 152679, 219673, 5508 }, Dangerous = new List{}}}, // }; diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/GeneratorsSystem/WorldGenerator.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/GeneratorsSystem/WorldGenerator.cs index dd51e74..89019fa 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/GeneratorsSystem/WorldGenerator.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/GeneratorsSystem/WorldGenerator.cs @@ -70,7 +70,7 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem public void CheckLevelArea(World world, int levelAreaSNO) { - if (SpawnGenerator.Spawns.ContainsKey(levelAreaSNO) && SpawnGenerator.Spawns[levelAreaSNO].lazy_load) + if (SpawnGenerator.Spawns.ContainsKey(levelAreaSNO) && SpawnGenerator.Spawns[levelAreaSNO].LazyLoad) if (!LoadedLevelAreas.Contains(levelAreaSNO)) { LoadedLevelAreas.Add(levelAreaSNO); @@ -2311,7 +2311,7 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem foreach (var scene in levelAreas.First().Value) { if (!SpawnGenerator.Spawns.ContainsKey(wid)) break; - if (SpawnGenerator.Spawns[wid].lazy_load) + if (SpawnGenerator.Spawns[wid].LazyLoad) { _lazyLevelAreas.Add(wid, levelAreas.First().Value); break; @@ -2321,9 +2321,9 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem } #region unique spawn //unique spawn - if (SpawnGenerator.Spawns.ContainsKey(wid) && SpawnGenerator.Spawns[wid].dangerous.Count > 0 && FastRandom.Instance.NextDouble() < 0.5) + if (SpawnGenerator.Spawns.ContainsKey(wid) && SpawnGenerator.Spawns[wid].Dangerous.Count > 0 && FastRandom.Instance.NextDouble() < 0.5) { - var randomUnique = new SNOHandle(SpawnGenerator.Spawns[wid].dangerous.PickRandom()); + var randomUnique = new SNOHandle(SpawnGenerator.Spawns[wid].Dangerous.PickRandom()); var scene = levelAreas.First().Value.PickRandom(); int x = FastRandom.Instance.Next(scene.NavMesh.SquaresCountX); int y = FastRandom.Instance.Next(scene.NavMesh.SquaresCountY); @@ -2363,7 +2363,7 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem #endregion #region goblin spawn //goblin spawn - if (SpawnGenerator.Spawns.ContainsKey(wid) && SpawnGenerator.Spawns[wid].can_spawn_goblin && FastRandom.Instance.NextDouble() < 0.5) + if (SpawnGenerator.Spawns.ContainsKey(wid) && SpawnGenerator.Spawns[wid].CanSpawnGoblin && FastRandom.Instance.NextDouble() < 0.5) { var randomGoblin = new SNOHandle(Goblins.PickRandom()); if (world.Game.IsHardcore) randomGoblin = new SNOHandle(3852); @@ -2408,7 +2408,7 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem foreach (var scene in levelAreas[la]) { if (!SpawnGenerator.Spawns.ContainsKey(la)) break; - if (SpawnGenerator.Spawns[la].lazy_load) + if (SpawnGenerator.Spawns[la].LazyLoad) { _lazyLevelAreas.Add(la, levelAreas[la]); break; @@ -2418,9 +2418,9 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem } #region unique spawn //unique spawn - if (SpawnGenerator.Spawns.ContainsKey(la) && SpawnGenerator.Spawns[la].dangerous.Count > 0 && FastRandom.Instance.NextDouble() < 0.5) + if (SpawnGenerator.Spawns.ContainsKey(la) && SpawnGenerator.Spawns[la].Dangerous.Count > 0 && FastRandom.Instance.NextDouble() < 0.5) { - var randomUnique = new SNOHandle(SpawnGenerator.Spawns[la].dangerous.PickRandom()); + var randomUnique = new SNOHandle(SpawnGenerator.Spawns[la].Dangerous.PickRandom()); var scene = levelAreas[la].PickRandom(); int x = FastRandom.Instance.Next(scene.NavMesh.SquaresCountX); int y = FastRandom.Instance.Next(scene.NavMesh.SquaresCountY); @@ -2460,7 +2460,7 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem #endregion #region goblin spawn //goblin spawn - if (SpawnGenerator.Spawns.ContainsKey(la) && SpawnGenerator.Spawns[la].can_spawn_goblin && FastRandom.Instance.NextDouble() < 0.5) + if (SpawnGenerator.Spawns.ContainsKey(la) && SpawnGenerator.Spawns[la].CanSpawnGoblin && FastRandom.Instance.NextDouble() < 0.5) { var randomGoblin = new SNOHandle(Goblins.PickRandom()); if (world.Game.IsHardcore) randomGoblin = new SNOHandle(3852); @@ -2521,7 +2521,7 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem } if (Game.Difficulty > 4) - packs_count += SpawnGenerator.Spawns[la].additional_density; + packs_count += SpawnGenerator.Spawns[la].AdditionalDensity; var groupId = 0; @@ -2540,8 +2540,8 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem #region elite spawn int randomMeleeMonsterId = -1; int randomRangedMonsterId = -1; - if (SpawnGenerator.Spawns[la].melee.Count > 0) randomMeleeMonsterId = SpawnGenerator.Spawns[la].melee.PickRandom(); - if (SpawnGenerator.Spawns[la].range.Count > 0) randomRangedMonsterId = SpawnGenerator.Spawns[la].range.PickRandom(); + if (SpawnGenerator.Spawns[la].Melee.Count > 0) randomMeleeMonsterId = SpawnGenerator.Spawns[la].Melee.PickRandom(); + if (SpawnGenerator.Spawns[la].Range.Count > 0) randomRangedMonsterId = SpawnGenerator.Spawns[la].Range.PickRandom(); SNOHandle meleeMonsterHandle = (randomMeleeMonsterId == -1 ? null : new SNOHandle(randomMeleeMonsterId)); SNOHandle rangedMonsterHandle = (randomRangedMonsterId == -1 ? null : new SNOHandle(randomRangedMonsterId)); if (rangedMonsterHandle == null) rangedMonsterHandle = meleeMonsterHandle; @@ -2585,8 +2585,8 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem { int randomMeleeMonsterId = -1; int randomRangedMonsterId = -1; - if (SpawnGenerator.Spawns[la].melee.Count > 0) randomMeleeMonsterId = SpawnGenerator.Spawns[la].melee.PickRandom(); - if (SpawnGenerator.Spawns[la].range.Count > 0) randomRangedMonsterId = SpawnGenerator.Spawns[la].range.PickRandom(); + if (SpawnGenerator.Spawns[la].Melee.Count > 0) randomMeleeMonsterId = SpawnGenerator.Spawns[la].Melee.PickRandom(); + if (SpawnGenerator.Spawns[la].Range.Count > 0) randomRangedMonsterId = SpawnGenerator.Spawns[la].Range.PickRandom(); SNOHandle meleeMonsterHandle = (randomMeleeMonsterId == -1 ? null : new SNOHandle(randomMeleeMonsterId)); SNOHandle rangedMonsterHandle = (randomRangedMonsterId == -1 ? null : new SNOHandle(randomRangedMonsterId)); //int maxMobsInStack = (SpawnGenerator.IsMelee(la, randomMonsterId) ? 6 : (SpawnGenerator.IsDangerous(la, randomMonsterId) ? 1 : 3)); @@ -2617,7 +2617,7 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem else //spawn champions #region champion spawn { - SNOHandle championHandle = new SNOHandle(SpawnGenerator.Spawns[la].melee.PickRandom()); + SNOHandle championHandle = new SNOHandle(SpawnGenerator.Spawns[la].Melee.PickRandom()); groupId = FastRandom.Instance.Next(); for (int n = 0; n < 4; n++) { diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/MapSystem/Scene.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/MapSystem/Scene.cs index 435bc5a..5c5352f 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/MapSystem/Scene.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/MapSystem/Scene.cs @@ -297,8 +297,7 @@ namespace DiIiS_NA.GameServer.GSSystem.MapSystem { int index = (int)marker.Type - 50; // LocationA has id 50... - if (GizmoSpawningLocations[index] == null) - GizmoSpawningLocations[index] = new List(); + GizmoSpawningLocations[index] ??= new List(); marker.PRTransform.Vector3D += Position; GizmoSpawningLocations[index].Add(marker.PRTransform); @@ -380,10 +379,7 @@ namespace DiIiS_NA.GameServer.GSSystem.MapSystem /// /// The player. /// - public bool IsRevealedToPlayer(Player player) - { - return player.RevealedObjects.ContainsKey(GlobalID); - } + public bool IsRevealedToPlayer(Player player) => player.RevealedObjects.ContainsKey(GlobalID); /// /// Reveal the scene to given player. diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Payloads/DeathPayload.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Payloads/DeathPayload.cs index f02eda2..f957c7c 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Payloads/DeathPayload.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Payloads/DeathPayload.cs @@ -145,10 +145,9 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads return; } - if (Context != null) - if (Context.User is Player player) //Hitpoints_On_Kill - if (player.Attributes[GameAttributes.Hitpoints_On_Kill] > 0) - player.AddHP(player.Attributes[GameAttributes.Hitpoints_On_Kill]); + if (Context?.User is Player plr) //Hitpoints_On_Kill + if (plr.Attributes[GameAttributes.Hitpoints_On_Kill] > 0) + plr.AddHP(plr.Attributes[GameAttributes.Hitpoints_On_Kill]); // HACK: add to hackish list thats used to defer deleting actor and filter it from powers targetting if (!(Target is Boss)) @@ -175,7 +174,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads if (Target is Minion minionTarget) { - if (minionTarget.Master != null && minionTarget.Master is Player player) + if (minionTarget.Master is Player player) { player.Followers.Remove(minionTarget.GlobalID); player.FreeFollowerIndex(minionTarget.SNO); @@ -198,9 +197,8 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads // send this death payload to buffs Target.World.BuffManager.SendTargetPayload(Target, this); - if (Context != null) - if (Context.User != null) - Target.World.BuffManager.SendTargetPayload(Context.User, this); + if (Context?.User != null) + Target.World.BuffManager.SendTargetPayload(Context.User, this); Target.World.BroadcastIfRevealed(plr => new PlayEffectMessage() { @@ -405,95 +403,95 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads // Spawn Random item and give exp for each player in range List players = Target.GetPlayersInRange(100f); - foreach (Player plr in players) + foreach (Player rangedPlayer in players) { int grantedExp = 0; - if (plr.Attributes[GameAttributes.Level] <= Target.Attributes[GameAttributes.Level]) - grantedExp = (int)(Player.LevelBorders[plr.Attributes[GameAttributes.Level]] / + if (rangedPlayer.Attributes[GameAttributes.Level] <= Target.Attributes[GameAttributes.Level]) + grantedExp = (int)(Player.LevelBorders[rangedPlayer.Attributes[GameAttributes.Level]] / (40 * Target.Attributes[GameAttributes.Level] * 0.85f) * (Target is Monster monster1 ? Math.Min(monster1.HpMultiplier, 3f) : 1f)); else - grantedExp = (int)(Player.LevelBorders[plr.Attributes[GameAttributes.Level]] / + grantedExp = (int)(Player.LevelBorders[rangedPlayer.Attributes[GameAttributes.Level]] / (40 * Target.Attributes[GameAttributes.Level] * 0.85f) * (1 - - Math.Abs(plr.Attributes[GameAttributes.Level] - Target.Attributes[GameAttributes.Level]) / + Math.Abs(rangedPlayer.Attributes[GameAttributes.Level] - Target.Attributes[GameAttributes.Level]) / 20)); - grantedExp = (int)(grantedExp * (plr.Attributes[GameAttributes.Experience_Bonus_Percent] + 1)); - grantedExp += (int)plr.Attributes[GameAttributes.Experience_Bonus]; + grantedExp = (int)(grantedExp * (rangedPlayer.Attributes[GameAttributes.Experience_Bonus_Percent] + 1)); + grantedExp += (int)rangedPlayer.Attributes[GameAttributes.Experience_Bonus]; if (LootAndExp) { - grantedExp = (int)(grantedExp * plr.World.Game.XpModifier); + grantedExp = (int)(grantedExp * rangedPlayer.World.Game.XpModifier); float tempExp = grantedExp * GameServerConfig.Instance.RateExp; - plr.UpdateExp(Math.Max((int)tempExp, 1)); - var a = (int)plr.Attributes[GameAttributes.Experience_Bonus]; - var a1 = (int)plr.Attributes[GameAttributes.Experience_Bonus_Percent]; + rangedPlayer.UpdateExp(Math.Max((int)tempExp, 1)); + var a = (int)rangedPlayer.Attributes[GameAttributes.Experience_Bonus]; + var a1 = (int)rangedPlayer.Attributes[GameAttributes.Experience_Bonus_Percent]; - plr.KilledMonstersTempCount++; + rangedPlayer.KilledMonstersTempCount++; } if (Target is Champion or Rare or Boss or Unique) { - plr.KilledElitesTempCount++; + rangedPlayer.KilledElitesTempCount++; } //achievements here if (Target is Monster monster) { - if (plr.Toon.Class == ToonClass.DemonHunter) + if (rangedPlayer.Toon.Class == ToonClass.DemonHunter) { if (monster.MonsterType == (int)DiIiS_NA.Core.MPQ.FileFormats.Monster.MonsterType.Demon) - plr.AddAchievementCounter(74987243307065, 1); + rangedPlayer.AddAchievementCounter(74987243307065, 1); - if (PowerMath.Distance2D(plr.Position, monster.Position) >= 45f) - plr.AddAchievementCounter(74987243307061, 1); + if (PowerMath.Distance2D(rangedPlayer.Position, monster.Position) >= 45f) + rangedPlayer.AddAchievementCounter(74987243307061, 1); if (monster.Attributes[GameAttributes.Feared]) - plr.AddAchievementCounter(74987243307064, 1); + rangedPlayer.AddAchievementCounter(74987243307064, 1); if (Context.PowerSNO == 75301) { - plr.SpikeTrapsKilled++; - if (plr.SpikeTrapsKilled >= 15) - plr.GrantAchievement(74987243307060); + rangedPlayer.SpikeTrapsKilled++; + if (rangedPlayer.SpikeTrapsKilled >= 15) + rangedPlayer.GrantAchievement(74987243307060); - plr.AddTimedAction(5f, new Action((q) => plr.SpikeTrapsKilled--)); + rangedPlayer.AddTimedAction(5f, (_) => rangedPlayer.SpikeTrapsKilled--); } } - if (plr.Toon.Class == ToonClass.Monk) + if (rangedPlayer.Toon.Class == ToonClass.Monk) { - if (plr.Attributes[GameAttributes.Resource_Cur, 3] < - plr.Attributes[GameAttributes.Resource_Max_Total, 3]) - plr.AddAchievementCounter(74987243307550, 1); + if (rangedPlayer.Attributes[GameAttributes.Resource_Cur, 3] < + rangedPlayer.Attributes[GameAttributes.Resource_Max_Total, 3]) + rangedPlayer.AddAchievementCounter(74987243307550, 1); } - if (plr.Toon.Class == ToonClass.Wizard) + if (rangedPlayer.Toon.Class == ToonClass.Wizard) { if (monster.Attributes[GameAttributes.Frozen]) - plr.AddAchievementCounter(74987243307585, 1); + rangedPlayer.AddAchievementCounter(74987243307585, 1); } - if (plr.Toon.Class == ToonClass.WitchDoctor) + if (rangedPlayer.Toon.Class == ToonClass.WitchDoctor) { if (Context.User.Attributes[GameAttributes.Team_Override] == 1) - plr.AddAchievementCounter(74987243307564, 1); + rangedPlayer.AddAchievementCounter(74987243307564, 1); } switch (monster) { case Champion: - plr.CheckKillMonsterCriteria(monster.SNO, 1); + rangedPlayer.CheckKillMonsterCriteria(monster.SNO, 1); break; case Rare: - plr.CheckKillMonsterCriteria(monster.SNO, 2); + rangedPlayer.CheckKillMonsterCriteria(monster.SNO, 2); break; case Unique: - plr.CheckKillMonsterCriteria(monster.SNO, 4); + rangedPlayer.CheckKillMonsterCriteria(monster.SNO, 4); break; } } @@ -503,26 +501,26 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads if (LoreRegistry.Lore.ContainsKey(Target.World.SNO) && LoreRegistry.Lore[Target.World.SNO].chests_lore.ContainsKey(Target.SNO)) foreach (int loreId in LoreRegistry.Lore[Target.World.SNO].chests_lore[Target.SNO]) - if (!plr.HasLore(loreId)) + if (!rangedPlayer.HasLore(loreId)) { - Target.World.DropItem(Target, null, ItemGenerator.CreateLore(plr, loreId)); + Target.World.DropItem(Target, null, ItemGenerator.CreateLore(rangedPlayer, loreId)); break; } } - if (plr.SkillSet.HasPassive(218191) && PowerMath.Distance2D(plr.Position, Target.Position) <= - 20f + plr.Attributes[GameAttributes.Gold_PickUp_Radius]) //GraveInjustice (WD) + if (rangedPlayer.SkillSet.HasPassive(218191) && PowerMath.Distance2D(rangedPlayer.Position, Target.Position) <= + 20f + rangedPlayer.Attributes[GameAttributes.Gold_PickUp_Radius]) //GraveInjustice (WD) { - plr.AddHP(plr.Attributes[GameAttributes.Hitpoints_Max_Total] / 100f); - plr.GeneratePrimaryResource(plr.Attributes[GameAttributes.Resource_Max_Total, 0] / 100f); - foreach (var cdBuff in plr.World.BuffManager.GetBuffs(plr)) + rangedPlayer.AddHP(rangedPlayer.Attributes[GameAttributes.Hitpoints_Max_Total] / 100f); + rangedPlayer.GeneratePrimaryResource(rangedPlayer.Attributes[GameAttributes.Resource_Max_Total, 0] / 100f); + foreach (var cdBuff in rangedPlayer.World.BuffManager.GetBuffs(rangedPlayer)) cdBuff.Reduce(60); } - if (plr.SkillSet.HasPassive(357218) && - PowerMath.Distance2D(plr.Position, Target.Position) <= 15f) //Fervor (Crusader) + if (rangedPlayer.SkillSet.HasPassive(357218) && + PowerMath.Distance2D(rangedPlayer.Position, Target.Position) <= 15f) //Fervor (Crusader) { - plr.World.BuffManager.AddBuff(plr, plr, new FervorBuff()); + rangedPlayer.World.BuffManager.AddBuff(rangedPlayer, rangedPlayer, new FervorBuff()); } if (Target.World.BuffManager.HasBuff(Target)) @@ -541,14 +539,14 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads if (Target.World.BuffManager.GetFirstBuff(Target).conversion) if (FastRandom.Instance.Next() < 0.2f) { - var avatar = new AvatarMelee(plr.World, Context, 0, 1f, Context.WaitSeconds(7f)); + var avatar = new AvatarMelee(rangedPlayer.World, Context, 0, 1f, Context.WaitSeconds(7f)); avatar.Brain.DeActivate(); - avatar.Position = PowerContext.RandomDirection(plr.Position, 3f, 8f); + avatar.Position = PowerContext.RandomDirection(rangedPlayer.Position, 3f, 8f); avatar.Attributes[GameAttributes.Untargetable] = true; avatar.EnterWorld(avatar.Position); - Task.Delay(1000).ContinueWith(d => + Task.Delay(1000).ContinueWith(_ => { (avatar as Minion).Brain.Activate(); avatar.Attributes[GameAttributes.Untargetable] = false; @@ -556,20 +554,20 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads }); } - if (plr.SkillSet.HasPassive(208571) && - PowerMath.Distance2D(plr.Position, Target.Position) <= - 12f + plr.Attributes[GameAttributes.Gold_PickUp_Radius] && + if (rangedPlayer.SkillSet.HasPassive(208571) && + PowerMath.Distance2D(rangedPlayer.Position, Target.Position) <= + 12f + rangedPlayer.Attributes[GameAttributes.Gold_PickUp_Radius] && FastRandom.Instance.Next(100) < 5) //CircleOfLife (WD) { - var dog = new ZombieDog(plr.World, plr, 0); + var dog = new ZombieDog(rangedPlayer.World, rangedPlayer, 0); dog.Brain.DeActivate(); - dog.Position = PowerContext.RandomDirection(plr.Position, 3f, 8f); + dog.Position = PowerContext.RandomDirection(rangedPlayer.Position, 3f, 8f); dog.Attributes[GameAttributes.Untargetable] = true; dog.EnterWorld(dog.Position); dog.PlayActionAnimation(AnimationSno.zombiedog_summon_01); Context.DogsSummoned++; - Task.Delay(1000).ContinueWith(d => + Task.Delay(1000).ContinueWith(_ => { dog.Brain.Activate(); dog.Attributes[GameAttributes.Untargetable] = false; @@ -578,19 +576,19 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads }); } - if (plr.SkillSet.HasPassive(341344)) //Dominance (Wiz) + if (rangedPlayer.SkillSet.HasPassive(341344)) //Dominance (Wiz) { - plr.World.BuffManager.AddBuff(plr, plr, new DominanceBuff()); + rangedPlayer.World.BuffManager.AddBuff(rangedPlayer, rangedPlayer, new DominanceBuff()); } - if (plr.SkillSet.HasPassive(296572)) //Rampage (Burb) + if (rangedPlayer.SkillSet.HasPassive(296572)) //Rampage (Burb) { - plr.World.BuffManager.AddBuff(plr, plr, new RampageBuff()); + rangedPlayer.World.BuffManager.AddBuff(rangedPlayer, rangedPlayer, new RampageBuff()); } if (Context != null) if (Context.DogsSummoned >= 3) - plr.GrantAchievement(74987243307567); + rangedPlayer.GrantAchievement(74987243307567); } Logger.Trace( @@ -640,13 +638,13 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads Target.World.Game.ActiveNephalemProgress += GameServerConfig.Instance.NephalemRiftProgressMultiplier * (Target.Quality + 1); Player master = null; - foreach (var plr in Target.World.Game.Players.Values) + foreach (var plr3 in Target.World.Game.Players.Values) { - if (plr.PlayerIndex == 0) - master = plr; + if (plr3.PlayerIndex == 0) + master = plr3; if (GameServerConfig.Instance.NephalemRiftAutoFinish && Target.World.Monsters.Count(s => !s.Dead) <= GameServerConfig.Instance.NephalemRiftAutoFinishThreshold) Target.World.Game.ActiveNephalemProgress = 651; - plr.InGameClient.SendMessage(new SimpleMessage(Opcodes.KillCounterRefresh)); - plr.InGameClient.SendMessage(new FloatDataMessage(Opcodes.DungeonFinderProgressMessage) + plr3.InGameClient.SendMessage(new SimpleMessage(Opcodes.KillCounterRefresh)); + plr3.InGameClient.SendMessage(new FloatDataMessage(Opcodes.DungeonFinderProgressMessage) { Field0 = Target.World.Game.ActiveNephalemProgress }); @@ -655,7 +653,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads Target.World.Game.ActiveNephalemKilledMobs = true; if (Target.World.Game.NephalemGreater) { - plr.InGameClient.SendMessage(new QuestCounterMessage() + plr3.InGameClient.SendMessage(new QuestCounterMessage() { snoQuest = 0x00052654, snoLevelArea = 0x000466E2, @@ -664,7 +662,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads Checked = 1, Counter = 1 }); - plr.InGameClient.SendMessage(new QuestUpdateMessage() + plr3.InGameClient.SendMessage(new QuestUpdateMessage() { snoQuest = 0x00052654, snoLevelArea = 0x000466E2, @@ -675,7 +673,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads } else { - plr.InGameClient.SendMessage(new QuestCounterMessage() + plr3.InGameClient.SendMessage(new QuestCounterMessage() { snoQuest = 0x00052654, snoLevelArea = 0x000466E2, @@ -684,7 +682,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads Checked = 1, Counter = 1 }); - plr.InGameClient.SendMessage(new QuestUpdateMessage() + plr3.InGameClient.SendMessage(new QuestUpdateMessage() { snoQuest = 0x00052654, snoLevelArea = 0x000466E2, @@ -694,21 +692,21 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads }); } - plr.InGameClient.SendMessage(new PlayMusicMessage(Opcodes.PlayMusicMessage) + plr3.InGameClient.SendMessage(new PlayMusicMessage(Opcodes.PlayMusicMessage) { SNO = 0x0005BBD8 }); - plr.InGameClient.SendMessage(new DisplayGameTextMessage(Opcodes.DisplayGameChatTextMessage) + plr3.InGameClient.SendMessage(new DisplayGameTextMessage(Opcodes.DisplayGameChatTextMessage) { Message = "Messages:LR_BossSpawned" }); - plr.InGameClient.SendMessage(new DisplayGameTextMessage(Opcodes.DisplayGameTextMessage) + plr3.InGameClient.SendMessage(new DisplayGameTextMessage(Opcodes.DisplayGameTextMessage) { Message = "Messages:LR_BossSpawned" }); StartConversation(Target.World, 366542); - if (plr.PlayerIndex == 0) + if (plr3.PlayerIndex == 0) { - plr.SpawnNephalemBoss(Target.World); + plr3.SpawnNephalemBoss(Target.World); } } @@ -733,13 +731,13 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads if (Target.Attributes[GameAttributes.Is_Loot_Run_Boss]) { Target.World.Game.ActiveNephalemKilledBoss = true; - foreach (var plr in Target.World.Game.Players.Values) + foreach (var plr3 in Target.World.Game.Players.Values) { //Enable banner /advocaite - plr.Attributes[GameAttributes.Banner_Usable] = true; + plr3.Attributes[GameAttributes.Banner_Usable] = true; if (Target.World.Game.NephalemGreater) { - plr.InGameClient.SendMessage(new QuestCounterMessage() + plr3.InGameClient.SendMessage(new QuestCounterMessage() { snoQuest = 0x00052654, snoLevelArea = 0x000466E2, @@ -748,7 +746,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads Checked = 1, Counter = 1 }); - plr.InGameClient.SendMessage(new QuestUpdateMessage() + plr3.InGameClient.SendMessage(new QuestUpdateMessage() { snoQuest = 0x00052654, snoLevelArea = 0x000466E2, @@ -757,35 +755,35 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads Failed = false }); - plr.Attributes[GameAttributes.Jewel_Upgrades_Max] = 3; - plr.Attributes[GameAttributes.Jewel_Upgrades_Used] = 0; - plr.Attributes[GameAttributes.Jewel_Upgrades_Bonus] = 0; - if (plr.Attributes[GameAttributes.Tiered_Loot_Run_Death_Count] == 0) - plr.Attributes[GameAttributes.Jewel_Upgrades_Bonus]++; - if (plr.InGameClient.Game.NephalemBuff) - plr.Attributes[GameAttributes.Jewel_Upgrades_Bonus]++; + plr3.Attributes[GameAttributes.Jewel_Upgrades_Max] = 3; + plr3.Attributes[GameAttributes.Jewel_Upgrades_Used] = 0; + plr3.Attributes[GameAttributes.Jewel_Upgrades_Bonus] = 0; + if (plr3.Attributes[GameAttributes.Tiered_Loot_Run_Death_Count] == 0) + plr3.Attributes[GameAttributes.Jewel_Upgrades_Bonus]++; + if (plr3.InGameClient.Game.NephalemBuff) + plr3.Attributes[GameAttributes.Jewel_Upgrades_Bonus]++; - plr.InGameClient.Game.LastTieredRiftTimeout = - (int)((plr.InGameClient.Game.TiredRiftTimer.TimeoutTick - - plr.InGameClient.Game.TickCounter) / plr.InGameClient.Game.TickRate / - plr.InGameClient.Game.UpdateFrequency * 10f); - plr.InGameClient.Game.TiredRiftTimer.Stop(); - plr.InGameClient.Game.TiredRiftTimer = null; + plr3.InGameClient.Game.LastTieredRiftTimeout = + (int)((plr3.InGameClient.Game.TiredRiftTimer.TimeoutTick - + plr3.InGameClient.Game.TickCounter) / plr3.InGameClient.Game.TickRate / + plr3.InGameClient.Game.UpdateFrequency * 10f); + plr3.InGameClient.Game.TiredRiftTimer.Stop(); + plr3.InGameClient.Game.TiredRiftTimer = null; - plr.InGameClient.SendMessage(new DisplayGameTextMessage(Opcodes.DisplayGameTextMessage) + plr3.InGameClient.SendMessage(new DisplayGameTextMessage(Opcodes.DisplayGameTextMessage) { Message = "Messages:TieredRift_Success", - Param1 = plr.InGameClient.Game.LastTieredRiftTimeout / 60, //Minutes - Param2 = plr.InGameClient.Game.LastTieredRiftTimeout % 60 //Seconds + Param1 = plr3.InGameClient.Game.LastTieredRiftTimeout / 60, //Minutes + Param2 = plr3.InGameClient.Game.LastTieredRiftTimeout % 60 //Seconds }); - plr.InGameClient.SendMessage(new SNODataMessage(Opcodes.TimedEventResetMessage) + plr3.InGameClient.SendMessage(new SNODataMessage(Opcodes.TimedEventResetMessage) { Field0 = 0x0005D6EA }); Target.World.SpawnMonster(ActorSno._p1_lr_tieredrift_nephalem, Target.Position); - Target.World.SpawnRandomUniqueGem(Target, plr); + Target.World.SpawnRandomUniqueGem(Target, plr3); TagMap newTagMap = new TagMap(); newTagMap.Add(new TagKeySNO(526850), new TagMapEntry(526850, 332336, 0)); //World @@ -799,7 +797,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads } else { - plr.InGameClient.SendMessage(new QuestCounterMessage() + plr3.InGameClient.SendMessage(new QuestCounterMessage() { snoQuest = 0x00052654, snoLevelArea = 0x000466E2, @@ -808,7 +806,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads Checked = 1, Counter = 1 }); - plr.InGameClient.SendMessage(new QuestUpdateMessage() + plr3.InGameClient.SendMessage(new QuestUpdateMessage() { snoQuest = 0x00052654, snoLevelArea = 0x000466E2, @@ -818,7 +816,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads }); } - plr.InGameClient.SendMessage(new WorldSyncedDataMessage() + plr3.InGameClient.SendMessage(new WorldSyncedDataMessage() { WorldID = Target.World.GlobalID, SyncedData = new WorldSyncedData() @@ -839,13 +837,13 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads orek.Attributes[GameAttributes.Conversation_Icon, 3] = 2; orek.Attributes.BroadcastChangedIfRevealed(); // Unique spawn - Target.World.SpawnBloodShards(Target, plr, RandomHelper.Next(10, 30)); - Target.World.SpawnGold(Target, plr); - Target.World.SpawnGold(Target, plr); - Target.World.SpawnGold(Target, plr); - plr.Toon.GameAccount.BigPortalKey++; + Target.World.SpawnBloodShards(Target, plr3, RandomHelper.Next(10, 30)); + Target.World.SpawnGold(Target, plr3); + Target.World.SpawnGold(Target, plr3); + Target.World.SpawnGold(Target, plr3); + plr3.Toon.GameAccount.BigPortalKey++; Target.World.Game.ActiveNephalemProgress = 0f; - plr.InGameClient.BnetClient.SendServerWhisper( + plr3.InGameClient.BnetClient.SendServerWhisper( "You have completed the Nephalem Rift! You have been rewarded with a Big Portal Key and 10-30 Blood Shards!"); } } @@ -913,21 +911,21 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads } //loot spawning - foreach (var plr in Target.GetPlayersInRange(100)) + foreach (var lootSpawnPlayer in Target.GetPlayersInRange(100)) { if (FastRandom.Instance.NextDouble() < 0.45) - Target.World.SpawnGold(Target, plr); + Target.World.SpawnGold(Target, lootSpawnPlayer); if (FastRandom.Instance.NextDouble() < 0.06) - Target.World.SpawnRandomCraftItem(Target, plr); + Target.World.SpawnRandomCraftItem(Target, lootSpawnPlayer); if (FastRandom.Instance.NextDouble() < 0.04) - Target.World.SpawnRandomGem(Target, plr); + Target.World.SpawnRandomGem(Target, lootSpawnPlayer); if (FastRandom.Instance.NextDouble() < 0.15) - Target.World.SpawnRandomPotion(Target, plr); + Target.World.SpawnRandomPotion(Target, lootSpawnPlayer); if (Target.World.Game.Difficulty > 1) if (FastRandom.Instance.NextDouble() < 0.15) - Target.World.SpawnItem(Target, plr, 2087837753); + Target.World.SpawnItem(Target, lootSpawnPlayer, 2087837753); if (FastRandom.Instance.NextDouble() < 0.04) - Target.World.SpawnRandomGem(Target, plr); + Target.World.SpawnRandomGem(Target, lootSpawnPlayer); //Logger.Debug("seed: {0}", seed); var dropRates = Target.World.Game.IsSeasoned ? LootManager.GetSeasonalDropRates((int)Target.Quality, @@ -939,7 +937,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads { // if seed is less than the drop rate, drop the item if (seed < rate * (1f - + plr.Attributes[GameAttributes.Magic_Find]) + + lootSpawnPlayer.Attributes[GameAttributes.Magic_Find]) * GameServerConfig.Instance.RateDrop) { //Logger.Debug("rate: {0}", rate); @@ -947,22 +945,22 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads ? LootManager.GetSeasonalLootQuality((int)Target.Quality, Target.World.Game.Difficulty) : LootManager.GetLootQuality((int)Target.Quality, Target.World.Game.Difficulty); - Target.World.SpawnRandomEquip(Target, plr, lootQuality); + Target.World.SpawnRandomEquip(Target, lootSpawnPlayer, lootQuality); if (Target is Goblin) - Target.World.SpawnRandomGem(Target, plr); + Target.World.SpawnRandomGem(Target, lootSpawnPlayer); } else break; } - if ((int)Target.Quality >= 4 && plr.AdditionalLootItems > 0) - for (int d = 0; d < plr.AdditionalLootItems; d++) + if ((int)Target.Quality >= 4 && lootSpawnPlayer.AdditionalLootItems > 0) + for (int d = 0; d < lootSpawnPlayer.AdditionalLootItems; d++) { var lootQuality = Target.World.Game.IsHardcore ? LootManager.GetSeasonalLootQuality((int)Target.Quality, Target.World.Game.Difficulty) : LootManager.GetLootQuality((int)Target.Quality, Target.World.Game.Difficulty); - Target.World.SpawnRandomEquip(Target, plr, lootQuality); + Target.World.SpawnRandomEquip(Target, lootSpawnPlayer, lootQuality); } if (Target is Champion or Rare or Unique or Boss) @@ -970,7 +968,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads //if (FastRandom.Instance.NextDouble() < LootManager.GetEssenceDropChance(this.Target.World.Game.Difficulty)) // this.Target.World.SpawnEssence(this.Target, plr); if (Target.World.Game.IsSeasoned) - Target.World.SpawnBloodShards(Target, plr); + Target.World.SpawnBloodShards(Target, lootSpawnPlayer); } if (Target.World.Game.IsSeasoned) @@ -978,16 +976,16 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads switch (Target.SNO) { case ActorSno._despair: //Rakanot - plr.GrantCriteria(74987254022737); + lootSpawnPlayer.GrantCriteria(74987254022737); break; case ActorSno._skeletonking: //Skillet King - plr.GrantCriteria(74987252582955); + lootSpawnPlayer.GrantCriteria(74987252582955); break; case ActorSno._siegebreakerdemon: //Siegebreaker - Make your choice - plr.GrantCriteria(74987246511881); + lootSpawnPlayer.GrantCriteria(74987246511881); break; case ActorSno._x1_adria_boss: //Adria - I become a star - plr.GrantCriteria(74987252384014); + lootSpawnPlayer.GrantCriteria(74987252384014); break; } } @@ -996,26 +994,26 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads { if (Target.SNO == ActorSno._lacunifemale_c_unique) //Chiltara if ((float)FastRandom.Instance.NextDouble() < 0.5f) - Target.World.SpawnItem(Target, plr, -799974399); + Target.World.SpawnItem(Target, lootSpawnPlayer, -799974399); if (Target.SNO == ActorSno._bigred_izual) //Izual if ((float)FastRandom.Instance.NextDouble() < 0.2f) { switch (Target.World.Game.Difficulty) { case 0: - Target.World.SpawnItem(Target, plr, -1463195022); + Target.World.SpawnItem(Target, lootSpawnPlayer, -1463195022); break; case 1: - Target.World.SpawnItem(Target, plr, 645585264); + Target.World.SpawnItem(Target, lootSpawnPlayer, 645585264); break; case 2: - Target.World.SpawnItem(Target, plr, -501637898); + Target.World.SpawnItem(Target, lootSpawnPlayer, -501637898); break; case 3: - Target.World.SpawnItem(Target, plr, 253048194); + Target.World.SpawnItem(Target, lootSpawnPlayer, 253048194); break; default: - Target.World.SpawnItem(Target, plr, -1463195022); + Target.World.SpawnItem(Target, lootSpawnPlayer, -1463195022); break; } } @@ -1023,25 +1021,25 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads switch (Target.SNO) { case ActorSno._graverobber_a_ghost_unique_03: - plr.GrantCriteria(74987243307212); + lootSpawnPlayer.GrantCriteria(74987243307212); break; case ActorSno._gravedigger_b_ghost_unique_01: - plr.GrantCriteria(74987243309859); + lootSpawnPlayer.GrantCriteria(74987243309859); break; case ActorSno._graverobber_a_ghost_unique_01: - plr.GrantCriteria(74987243309860); + lootSpawnPlayer.GrantCriteria(74987243309860); break; case ActorSno._graverobber_a_ghost_unique_02: - plr.GrantCriteria(74987243309861); + lootSpawnPlayer.GrantCriteria(74987243309861); break; case ActorSno._ghost_a_unique_01: - plr.GrantCriteria(74987243309862); + lootSpawnPlayer.GrantCriteria(74987243309862); break; case ActorSno._ghost_d_unique01: - plr.GrantCriteria(74987243309863); + lootSpawnPlayer.GrantCriteria(74987243309863); break; case ActorSno._ghost_d_unique_01: - plr.GrantCriteria(74987243309864); + lootSpawnPlayer.GrantCriteria(74987243309864); break; } } @@ -1073,103 +1071,90 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads if (Target is not Boss) return; - foreach (Player plr in players) + foreach (Player rangedPlayer in players) switch (Target.SNO) { case ActorSno._skeletonking: //Leoric if (Context.PowerSNO == 93885) //weapon throw - plr.GrantAchievement(74987243307050); - if (isCoop) plr.GrantAchievement(74987252301189); - if (isHardcore) plr.GrantAchievement(74987243307489); - else plr.GrantAchievement(74987249381288); + rangedPlayer.GrantAchievement(74987243307050); + if (isCoop) rangedPlayer.GrantAchievement(74987252301189); + rangedPlayer.GrantAchievement(isHardcore ? (ulong)74987243307489 : (ulong)74987249381288); break; case ActorSno._butcher: //Butcher if (Context.PowerSNO == 93885) //weapon throw - plr.GrantAchievement(74987243307050); + rangedPlayer.GrantAchievement(74987243307050); if (Context.PowerSNO == 71548) //spectral blade - plr.GrantCriteria(74987243307946); - if (isCoop) plr.GrantAchievement(74987252696819); - if (isHardcore) plr.GrantAchievement(74987254551339); - else plr.GrantAchievement(74987258164419); - plr.SetProgress(1, Target.World.Game.Difficulty); + rangedPlayer.GrantCriteria(74987243307946); + if (isCoop) rangedPlayer.GrantAchievement(74987252696819); + rangedPlayer.GrantAchievement(isHardcore ? (ulong)74987254551339 : (ulong)74987258164419); + rangedPlayer.SetProgress(1, Target.World.Game.Difficulty); break; case ActorSno._maghda: //Maghda if (Context.PowerSNO == 93885) //weapon throw - plr.GrantAchievement(74987243307050); - if (isCoop) plr.GrantAchievement(74987255855515); - if (isHardcore) plr.GrantAchievement(74987243307507); - else plr.GrantAchievement(74987246434969); + rangedPlayer.GrantAchievement(74987243307050); + if (isCoop) rangedPlayer.GrantAchievement(74987255855515); + rangedPlayer.GrantAchievement(isHardcore ? (ulong)74987243307507 : (ulong)74987246434969); break; case ActorSno._zoltunkulle: //Zoltun Kulle - if (isCoop) plr.GrantAchievement(74987246137208); - if (isHardcore) plr.GrantAchievement(74987243307509); - else plr.GrantAchievement(74987252195665); + if (isCoop) rangedPlayer.GrantAchievement(74987246137208); + rangedPlayer.GrantAchievement(isHardcore ? (ulong)74987243307509 : (ulong)74987252195665); break; case ActorSno._belial: //Belial (big) if (Context.PowerSNO == 93885) //weapon throw - plr.GrantAchievement(74987243307050); + rangedPlayer.GrantAchievement(74987243307050); if (Context.PowerSNO == 71548) //spectral blade - plr.GrantCriteria(74987243310916); - if (isCoop) plr.GrantAchievement(74987256826382); - if (isHardcore) plr.GrantAchievement(74987244906887); - else plr.GrantAchievement(74987244645044); - plr.SetProgress(2, Target.World.Game.Difficulty); + rangedPlayer.GrantCriteria(74987243310916); + if (isCoop) rangedPlayer.GrantAchievement(74987256826382); + rangedPlayer.GrantAchievement(isHardcore ? (ulong)74987244906887 : (ulong)74987244645044); + rangedPlayer.SetProgress(2, Target.World.Game.Difficulty); break; case ActorSno._gluttony: //Gluttony - if (isCoop) plr.GrantAchievement(74987249112946); - if (isHardcore) plr.GrantAchievement(74987243307519); - else plr.GrantAchievement(74987259418615); + if (isCoop) rangedPlayer.GrantAchievement(74987249112946); + rangedPlayer.GrantAchievement(isHardcore ? (ulong)74987243307519 : (ulong)74987259418615); break; case ActorSno._siegebreakerdemon: //Siegebreaker if (Context.PowerSNO == 93885) //weapon throw - plr.GrantAchievement(74987243307050); - if (isCoop) plr.GrantAchievement(74987253664242); - if (isHardcore) plr.GrantAchievement(74987243307521); - else plr.GrantAchievement(74987248255991); + rangedPlayer.GrantAchievement(74987243307050); + if (isCoop) rangedPlayer.GrantAchievement(74987253664242); + rangedPlayer.GrantAchievement(isHardcore ? (ulong)74987243307521 : (ulong)74987248255991); break; case ActorSno._mistressofpain: //Cydaea if (Context.PowerSNO == 93885) //weapon throw - plr.GrantAchievement(74987243307050); - if (isCoop) plr.GrantAchievement(74987257890442); - if (isHardcore) plr.GrantAchievement(74987243307523); - else plr.GrantAchievement(74987254675042); + rangedPlayer.GrantAchievement(74987243307050); + if (isCoop) rangedPlayer.GrantAchievement(74987257890442); + rangedPlayer.GrantAchievement(isHardcore ? (ulong)74987243307523 : (ulong)74987254675042); break; case ActorSno._azmodan: //Azmodan if (Context.PowerSNO == 93885) //weapon throw - plr.GrantAchievement(74987243307050); + rangedPlayer.GrantAchievement(74987243307050); if (Context.PowerSNO == 71548) //spectral blade - plr.GrantCriteria(74987243310915); - if (isCoop) plr.GrantAchievement(74987247100576); - if (isHardcore) plr.GrantAchievement(74987251893684); - else plr.GrantAchievement(74987247855713); - plr.SetProgress(3, Target.World.Game.Difficulty); + rangedPlayer.GrantCriteria(74987243310915); + if (isCoop) rangedPlayer.GrantAchievement(74987247100576); + rangedPlayer.GrantAchievement(isHardcore ? (ulong)74987251893684 : (ulong)74987247855713); + rangedPlayer.SetProgress(3, Target.World.Game.Difficulty); break; case ActorSno._terrordemon_a_unique_1000monster: //Iskatu - if (isCoop) plr.GrantAchievement(74987255392558); - if (isHardcore) plr.GrantAchievement(74987248632930); - else plr.GrantAchievement(74987246017001); + if (isCoop) rangedPlayer.GrantAchievement(74987255392558); + rangedPlayer.GrantAchievement(isHardcore ? (ulong)74987248632930 : (ulong)74987246017001); break; case ActorSno._despair: //Rakanoth if (Context.PowerSNO == 93885) //weapon throw - plr.GrantAchievement(74987243307050); - if (isCoop) plr.GrantAchievement(74987248781143); - if (isHardcore) plr.GrantAchievement(74987243307533); - else plr.GrantAchievement(74987256508058); + rangedPlayer.GrantAchievement(74987243307050); + if (isCoop) rangedPlayer.GrantAchievement(74987248781143); + rangedPlayer.GrantAchievement(isHardcore ? (ulong)74987243307533 : (ulong)74987256508058); break; case ActorSno._bigred_izual: //Izual - if (isCoop) plr.GrantAchievement(74987254969009); - if (isHardcore) plr.GrantAchievement(74987247989681); - else plr.GrantAchievement(74987244988685); - if (isSeasoned) plr.GrantCriteria(74987249642121); + if (isCoop) rangedPlayer.GrantAchievement(74987254969009); + rangedPlayer.GrantAchievement(isHardcore ? (ulong)74987247989681 : (ulong)74987244988685); + if (isSeasoned) rangedPlayer.GrantCriteria(74987249642121); break; case ActorSno._diablo: //Diablo if (Context.PowerSNO == 93885) //weapon throw - plr.GrantAchievement(74987243307050); - if (isCoop) plr.GrantAchievement(74987250386944); - if (isHardcore) plr.GrantAchievement(74987250070969); - else plr.GrantAchievement(74987248188984); - plr.SetProgress(4, Target.World.Game.Difficulty); - if (isSeasoned) plr.GrantCriteria(74987250915380); + rangedPlayer.GrantAchievement(74987243307050); + if (isCoop) rangedPlayer.GrantAchievement(74987250386944); + rangedPlayer.GrantAchievement(isHardcore ? (ulong)74987250070969 : (ulong)74987248188984); + rangedPlayer.SetProgress(4, Target.World.Game.Difficulty); + if (isSeasoned) rangedPlayer.GrantCriteria(74987250915380); break; default: break; @@ -1237,7 +1222,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads player.Inventory.DecreaseDurability(0.1f); if (player.World.Game.IsHardcore) { - player.AddTimedAction(3f, new Action((q) => player.Revive(player.CheckPointPosition))); + player.AddTimedAction(3f, (_) => player.Revive(player.CheckPointPosition)); var toon = player.Toon.DBToon; toon.Deaths++; player.World.Game.GameDbSession.SessionUpdate(toon); @@ -1289,20 +1274,18 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads return AnimationSno._NONE; } - private static TagKeyInt GetTagForSpecialDeath(int specialDeathType) - { - switch (specialDeathType) + private static TagKeyInt GetTagForSpecialDeath(int specialDeathType) => + specialDeathType switch { - default: return null; - case 1: return AnimationSetKeys.DeathDisintegration; - case 2: return AnimationSetKeys.DeathPulverise; - case 3: return AnimationSetKeys.DeathPlague; - case 4: return AnimationSetKeys.DeathDismember; - case 5: return AnimationSetKeys.DeathDecap; - case 6: return AnimationSetKeys.DeathAcid; - case 7: return AnimationSetKeys.DeathLava; // haven't seen lava used, but there's no other place for it - case 8: return AnimationSetKeys.DeathSpirit; - } - } + 1 => AnimationSetKeys.DeathDisintegration, + 2 => AnimationSetKeys.DeathPulverise, + 3 => AnimationSetKeys.DeathPlague, + 4 => AnimationSetKeys.DeathDismember, + 5 => AnimationSetKeys.DeathDecap, + 6 => AnimationSetKeys.DeathAcid, + 7 => AnimationSetKeys.DeathLava, // haven't seen lava used, but there's no other place for it + 8 => AnimationSetKeys.DeathSpirit, + _ => null + }; } }