Improved some commands, cleanup,...

This commit is contained in:
Lucca Faria Ferri 2023-02-12 19:07:26 -08:00
parent e76fcb31ec
commit 8b442f9db8
11 changed files with 1258 additions and 1120 deletions

View File

@ -14,32 +14,81 @@ namespace DiIiS_NA.LoginServer.Toons
{ {
public class Toon : PersistentRPCObject public class Toon : PersistentRPCObject
{ {
#region Cosmetics #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
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; get;
/* /*
{
if (LoginServer.Config.Instance.Enabled)
{ {
if (LoginServer.Config.Instance.Enabled) if (this.GameAccount.IsOnline)
{ this.CachedDBToon = DBSessions.SessionGet<DBToon>(this.PersistentID);
if (this.GameAccount.IsOnline) return this.CachedDBToon;
this.CachedDBToon = DBSessions.SessionGet<DBToon>(this.PersistentID);
return this.CachedDBToon;
}
else
return DBSessions.SessionGet<DBToon>(this.PersistentID);
} }
//*/ else
return DBSessions.SessionGet<DBToon>(this.PersistentID);
}
//*/
set; set;
} }
@ -49,10 +98,7 @@ namespace DiIiS_NA.LoginServer.Toons
public DBActiveSkills DBActiveSkills public DBActiveSkills DBActiveSkills
{ {
get get { return DBSessions.SessionQuerySingle<DBActiveSkills>(s => s.DBToon.Id == PersistentID); }
{
return DBSessions.SessionQuerySingle<DBActiveSkills>(s => s.DBToon.Id == PersistentID);
}
set { } set { }
} }
@ -60,7 +106,8 @@ namespace DiIiS_NA.LoginServer.Toons
{ {
get 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; return val;
} }
} }
@ -69,7 +116,8 @@ namespace DiIiS_NA.LoginServer.Toons
{ {
get 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; return val;
} }
} }
@ -80,23 +128,27 @@ namespace DiIiS_NA.LoginServer.Toons
{ {
var tFlags = Flags; var tFlags = Flags;
if (IsHardcore) tFlags |= ToonFlags.Hardcore; 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; 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 public IntPresenceField HeroParagonLevelField
{ {
get 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; 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; private D3.Hero.VisualEquipment _visualEquipment = null;
public bool _visualEquipmentChanged = true; public bool _visualEquipmentChanged = true;
@ -108,32 +160,34 @@ namespace DiIiS_NA.LoginServer.Toons
if (_visualEquipmentChanged) if (_visualEquipmentChanged)
{ {
var visualItems = new[] var visualItems = new[]
{ {
D3.Hero.VisualItem.CreateBuilder().SetEffectLevel(0).Build(), // Head D3.Hero.VisualItem.CreateBuilder().SetEffectLevel(0).Build(), // Head
D3.Hero.VisualItem.CreateBuilder().SetEffectLevel(0).Build(), // Chest D3.Hero.VisualItem.CreateBuilder().SetEffectLevel(0).Build(), // Chest
D3.Hero.VisualItem.CreateBuilder().SetEffectLevel(0).Build(), // Feet D3.Hero.VisualItem.CreateBuilder().SetEffectLevel(0).Build(), // Feet
D3.Hero.VisualItem.CreateBuilder().SetEffectLevel(0).Build(), // Hands 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 (1)
D3.Hero.VisualItem.CreateBuilder().SetEffectLevel(0).Build(), // Weapon (2) D3.Hero.VisualItem.CreateBuilder().SetEffectLevel(0).Build(), // Weapon (2)
D3.Hero.VisualItem.CreateBuilder().SetEffectLevel(0).Build(), // Shoulders D3.Hero.VisualItem.CreateBuilder().SetEffectLevel(0).Build(), // Shoulders
D3.Hero.VisualItem.CreateBuilder().SetEffectLevel(0).Build(), // Legs D3.Hero.VisualItem.CreateBuilder().SetEffectLevel(0).Build(), // Legs
}; };
var CosmeticItems = new[] var CosmeticItems = new[]
{ {
D3.Hero.VisualCosmeticItem.CreateBuilder().SetGbid(Cosmetic1).Build(), // Wings D3.Hero.VisualCosmeticItem.CreateBuilder().SetGbid(Cosmetic1).Build(), // Wings
D3.Hero.VisualCosmeticItem.CreateBuilder().SetGbid(Cosmetic2).Build(), // Flag D3.Hero.VisualCosmeticItem.CreateBuilder().SetGbid(Cosmetic2).Build(), // Flag
D3.Hero.VisualCosmeticItem.CreateBuilder().SetGbid(Cosmetic3).Build(), // Pet D3.Hero.VisualCosmeticItem.CreateBuilder().SetGbid(Cosmetic3).Build(), // Pet
D3.Hero.VisualCosmeticItem.CreateBuilder().SetGbid(Cosmetic4).Build(), // Frame D3.Hero.VisualCosmeticItem.CreateBuilder().SetGbid(Cosmetic4).Build(), // Frame
}; };
var visibleEquipment = DBSessions.SessionQueryWhere<DBInventory>(inv => inv.DBToon.Id == PersistentID && inv.EquipmentSlot > 0 && inv.EquipmentSlot < 15 && inv.ForSale == false); var visibleEquipment = DBSessions.SessionQueryWhere<DBInventory>(inv =>
inv.DBToon.Id == PersistentID && inv.EquipmentSlot > 0 && inv.EquipmentSlot < 15 &&
inv.ForSale == false);
foreach (var inv in visibleEquipment) foreach (var inv in visibleEquipment)
{ {
var slot = inv.EquipmentSlot; var slot = inv.EquipmentSlot;
if (!visualToSlotMapping.ContainsKey(slot)) if (!_visualToSlotMapping.ContainsKey(slot))
continue; continue;
// decode vislual slot from equipment slot // decode vislual slot from equipment slot
slot = visualToSlotMapping[slot]; slot = _visualToSlotMapping[slot];
visualItems[slot] = D3.Hero.VisualItem.CreateBuilder() visualItems[slot] = D3.Hero.VisualItem.CreateBuilder()
.SetGbid(inv.TransmogGBID == -1 ? inv.GbId : inv.TransmogGBID) .SetGbid(inv.TransmogGBID == -1 ? inv.GbId : inv.TransmogGBID)
.SetDyeType(inv.DyeType) .SetDyeType(inv.DyeType)
@ -141,14 +195,18 @@ namespace DiIiS_NA.LoginServer.Toons
.Build(); .Build();
} }
_visualEquipment = D3.Hero.VisualEquipment.CreateBuilder().AddRangeVisualItem(visualItems).AddRangeCosmeticItem(CosmeticItems).Build(); _visualEquipment = D3.Hero.VisualEquipment.CreateBuilder().AddRangeVisualItem(visualItems)
.AddRangeCosmeticItem(CosmeticItems).Build();
_visualEquipmentChanged = false; _visualEquipmentChanged = false;
} }
return new ByteStringPresenceField<D3.Hero.VisualEquipment>(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Hero, 3, 0, _visualEquipment);
return new ByteStringPresenceField<D3.Hero.VisualEquipment>(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);
/// <summary> /// <summary>
/// D3 EntityID encoded id. /// D3 EntityID encoded id.
@ -172,11 +230,7 @@ namespace DiIiS_NA.LoginServer.Toons
} }
} }
public bool IsSeasoned public bool IsSeasoned { get; set; }
{
get;
set;
}
public int SeasonCreated public int SeasonCreated
{ {
@ -241,7 +295,8 @@ namespace DiIiS_NA.LoginServer.Toons
{ {
get get
{ {
return DBSessions.SessionQueryWhere<DBBonusSets>(dbi => dbi.SetId == 6 && dbi.ClaimedToon.Id == PersistentID).Any(); return DBSessions
.SessionQueryWhere<DBBonusSets>(dbi => dbi.SetId == 6 && dbi.ClaimedToon.Id == PersistentID).Any();
} }
set { } set { }
@ -340,7 +395,7 @@ namespace DiIiS_NA.LoginServer.Toons
HeroClassField.Value = 0x1D4681B1; HeroClassField.Value = 0x1D4681B1;
break; break;
case ToonClass.Necromancer: case ToonClass.Necromancer:
HeroClassField.Value = 0x8D4D94ED;//unchecked((int)0x8D4D94ED); HeroClassField.Value = 0x8D4D94ED; //unchecked((int)0x8D4D94ED);
break; break;
default: default:
HeroClassField.Value = 0x0; HeroClassField.Value = 0x0;
@ -374,6 +429,7 @@ namespace DiIiS_NA.LoginServer.Toons
private byte _cachedLevel = 0; private byte _cachedLevel = 0;
private bool _levelChanged = true; private bool _levelChanged = true;
/// <summary> /// <summary>
/// Toon's level. /// Toon's level.
/// </summary> /// </summary>
@ -386,6 +442,7 @@ namespace DiIiS_NA.LoginServer.Toons
_cachedLevel = DBToon.Level; _cachedLevel = DBToon.Level;
_levelChanged = false; _levelChanged = false;
} }
return _cachedLevel; return _cachedLevel;
} }
private set private set
@ -415,6 +472,7 @@ namespace DiIiS_NA.LoginServer.Toons
_cachedParagonLevel = GameAccount.DBGameAccount.ParagonLevel; _cachedParagonLevel = GameAccount.DBGameAccount.ParagonLevel;
_paragonLevelChanged = false; _paragonLevelChanged = false;
} }
return _cachedParagonLevel; return _cachedParagonLevel;
} }
private set private set
@ -544,24 +602,31 @@ namespace DiIiS_NA.LoginServer.Toons
/// <summary> /// <summary>
/// Killed monsters(total for account) /// Killed monsters(total for account)
/// </summary> /// </summary>
public ulong TotalKilled { public ulong TotalKilled
{
get => GameAccount.DBGameAccount.TotalKilled; get => GameAccount.DBGameAccount.TotalKilled;
set { set
{
var dbGA = GameAccount.DBGameAccount; var dbGA = GameAccount.DBGameAccount;
lock (dbGA) { lock (dbGA)
{
dbGA.TotalKilled = value; dbGA.TotalKilled = value;
DBSessions.SessionUpdate(dbGA); DBSessions.SessionUpdate(dbGA);
} }
} }
} }
/// <summary> /// <summary>
/// Killed elites(total for account) /// Killed elites(total for account)
/// </summary> /// </summary>
public ulong ElitesKilled { public ulong ElitesKilled
{
get => GameAccount.DBGameAccount.ElitesKilled; get => GameAccount.DBGameAccount.ElitesKilled;
set { set
{
var dbGA = GameAccount.DBGameAccount; var dbGA = GameAccount.DBGameAccount;
lock (dbGA) { lock (dbGA)
{
dbGA.ElitesKilled = value; dbGA.ElitesKilled = value;
DBSessions.SessionUpdate(dbGA); DBSessions.SessionUpdate(dbGA);
} }
@ -571,24 +636,33 @@ namespace DiIiS_NA.LoginServer.Toons
/// <summary> /// <summary>
/// Bounties completed(total for account) /// Bounties completed(total for account)
/// </summary> /// </summary>
public int TotalBounties { public int TotalBounties
get { {
if (IsHardcore) { get
{
if (IsHardcore)
{
return GameAccount.DBGameAccount.TotalBountiesHardcore; return GameAccount.DBGameAccount.TotalBountiesHardcore;
} }
else { else
{
return GameAccount.DBGameAccount.TotalBounties; return GameAccount.DBGameAccount.TotalBounties;
} }
} }
set { set
{
var dbGA = GameAccount.DBGameAccount; var dbGA = GameAccount.DBGameAccount;
lock (dbGA) { lock (dbGA)
if (IsHardcore) { {
if (IsHardcore)
{
dbGA.TotalBountiesHardcore = value; dbGA.TotalBountiesHardcore = value;
} }
else { else
{
dbGA.TotalBounties = value; dbGA.TotalBounties = value;
} }
DBSessions.SessionUpdate(dbGA); DBSessions.SessionUpdate(dbGA);
} }
} }
@ -614,24 +688,33 @@ namespace DiIiS_NA.LoginServer.Toons
/// <summary> /// <summary>
/// Total collected Gold(total for account) /// Total collected Gold(total for account)
/// </summary> /// </summary>
public ulong CollectedGold { public ulong CollectedGold
get { {
if (IsHardcore) { get
{
if (IsHardcore)
{
return GameAccount.DBGameAccount.HardTotalGold; return GameAccount.DBGameAccount.HardTotalGold;
} }
else { else
{
return GameAccount.DBGameAccount.TotalGold; return GameAccount.DBGameAccount.TotalGold;
} }
} }
set { set
{
var dbGAcc = GameAccount.DBGameAccount; var dbGAcc = GameAccount.DBGameAccount;
lock (dbGAcc) { lock (dbGAcc)
if (IsHardcore) { {
if (IsHardcore)
{
dbGAcc.HardTotalGold = value; dbGAcc.HardTotalGold = value;
} }
else { else
{
dbGAcc.TotalGold = value; dbGAcc.TotalGold = value;
} }
DBSessions.SessionUpdate(dbGAcc); DBSessions.SessionUpdate(dbGAcc);
} }
} }
@ -685,6 +768,7 @@ namespace DiIiS_NA.LoginServer.Toons
/// Settings for toon. /// Settings for toon.
/// </summary> /// </summary>
private D3.Client.ToonSettings _settings = D3.Client.ToonSettings.CreateBuilder().Build(); private D3.Client.ToonSettings _settings = D3.Client.ToonSettings.CreateBuilder().Build();
public D3.Client.ToonSettings Settings public D3.Client.ToonSettings Settings
{ {
get => D3.Client.ToonSettings.CreateBuilder().SetUiFlags(0xFFFFFFFF).Build(); //this._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 isSeason = Convert.ToUInt16(isSeassoned);
var digest = D3.Hero.Digest.CreateBuilder().SetVersion(905) var digest = D3.Hero.Digest.CreateBuilder().SetVersion(905)
.SetHeroId(D3EntityID) .SetHeroId(D3EntityID)
.SetHeroName(Name) .SetHeroName(Name)
.SetGbidClass((int)ClassID) .SetGbidClass((int)ClassID)
.SetLevel(Level) .SetLevel(Level)
//deprecated //.SetAltLevel(dbToon.ParagonLevel) //deprecated //.SetAltLevel(dbToon.ParagonLevel)
.SetPlayerFlags((uint)dbToon.Flags)// + isSeason) .SetPlayerFlags((uint)dbToon.Flags) // + isSeason)
.SetSeasonCreated((uint)SeasonCreated) .SetSeasonCreated((uint)SeasonCreated)
.SetVisualEquipment(HeroVisualEquipmentField.Value) .SetVisualEquipment(HeroVisualEquipmentField.Value)
.SetLastPlayedAct(dbToon.CurrentAct) .SetLastPlayedAct(dbToon.CurrentAct)
.SetHighestUnlockedAct(3000) .SetHighestUnlockedAct(3000)
//deprecated //.SetLastPlayedDifficulty(dbToon.CurrentDifficulty) //deprecated //.SetLastPlayedDifficulty(dbToon.CurrentDifficulty)
//deprecated //.SetHighestCompletedDifficulty(0) //deprecated //.SetHighestCompletedDifficulty(0)
.SetHighestSoloRiftCompleted(3) .SetHighestSoloRiftCompleted(3)
.SetLastPlayedQuest(dbToon.CurrentQuestId) .SetLastPlayedQuest(dbToon.CurrentQuestId)
.SetLastPlayedQuestStep(dbToon.CurrentQuestStepId) .SetLastPlayedQuestStep(dbToon.CurrentQuestStepId)
.SetTimePlayed((uint)dbToon.TimePlayed); .SetTimePlayed((uint)dbToon.TimePlayed);
if (!IsHardcore) if (!IsHardcore)
{ {
@ -736,50 +820,90 @@ namespace DiIiS_NA.LoginServer.Toons
_dbQuests = DBSessions.SessionQueryWhere<DBQuestHistory>(dbi => dbi.DBToon.Id == PersistentID); _dbQuests = DBSessions.SessionQueryWhere<DBQuestHistory>(dbi => dbi.DBToon.Id == PersistentID);
#if DEBUG #if DEBUG
digest digest
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(87700)) .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0)
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(72095)) .SetSnoQuest(87700))
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(72221)) .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0)
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(72061)) .SetSnoQuest(72095))
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(117779)) .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0)
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(72738)) .SetSnoQuest(72221))
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(72738)) .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0)
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(73236)) .SetSnoQuest(72061))
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(72546)) .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0)
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(72801)) .SetSnoQuest(117779))
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(136656)) .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 Акт //2 Акт
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(80322)) .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0)
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(93396)) .SetSnoQuest(80322))
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(74128)) .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0)
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(57331)) .SetSnoQuest(93396))
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(78264)) .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0)
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(78266)) .SetSnoQuest(74128))
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(57335)) .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0)
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(57337)) .SetSnoQuest(57331))
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(121792)) .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0)
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(57339)) .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 Акт //3 Акт
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(93595)) .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0)
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(93684)) .SetSnoQuest(93595))
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(93697)) .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0)
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(203595)) .SetSnoQuest(93684))
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(101756)) .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0)
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(101750)) .SetSnoQuest(93697))
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(101758)) .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 Акт //4 Акт
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(112498)) .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0)
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(113910)) .SetSnoQuest(112498))
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(114795)) .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0)
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(114901)) .SetSnoQuest(113910))
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0)
.SetSnoQuest(114795))
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0)
.SetSnoQuest(114901))
//5 Акт //5 Акт
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(251355)) .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0)
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(284683)) .SetSnoQuest(251355))
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(285098)) .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0)
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(257120)) .SetSnoQuest(284683))
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(263851)) .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0)
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(273790)) .SetSnoQuest(285098))
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(269552)) .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0)
.AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(273408)) .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 #else
foreach (var inv in _dbQuests) foreach (var inv in _dbQuests)
@ -801,9 +925,11 @@ namespace DiIiS_NA.LoginServer.Toons
#endif #endif
} }
return digest.Build(); return digest.Build();
} }
} }
//*/ //*/
/// <summary> /// <summary>
/// Hero Profile. /// Hero Profile.
@ -813,13 +939,15 @@ namespace DiIiS_NA.LoginServer.Toons
get get
{ {
var itemList = D3.Items.ItemList.CreateBuilder(); var itemList = D3.Items.ItemList.CreateBuilder();
List<DBInventory> heroInventoryItems = DBSessions.SessionQueryWhere<DBInventory>(dbi => dbi.DBToon.Id == PersistentID); List<DBInventory> heroInventoryItems =
DBSessions.SessionQueryWhere<DBInventory>(dbi => dbi.DBToon.Id == PersistentID);
//* //*
foreach (var invItem in heroInventoryItems) foreach (var invItem in heroInventoryItems)
{ {
if ((invItem.EquipmentSlot) == 0 || (invItem.EquipmentSlot == 15)) continue; if ((invItem.EquipmentSlot) == 0 || (invItem.EquipmentSlot == 15)) continue;
var item = D3.Items.SavedItem.CreateBuilder() 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) .SetHirelingClass(0)
.SetItemSlot(272 + (invItem.EquipmentSlot * 16)) .SetItemSlot(272 + (invItem.EquipmentSlot * 16))
.SetOwnerEntityId(D3EntityID) .SetOwnerEntityId(D3EntityID)
@ -827,15 +955,20 @@ namespace DiIiS_NA.LoginServer.Toons
.SetUsedSocketCount(0); .SetUsedSocketCount(0);
var generator = D3.Items.Generator.CreateBuilder() var generator = D3.Items.Generator.CreateBuilder()
.SetGbHandle(D3.GameBalance.Handle.CreateBuilder().SetGbid(invItem.GbId).SetGameBalanceType(2)) .SetGbHandle(D3.GameBalance.Handle.CreateBuilder().SetGbid(invItem.GbId).SetGameBalanceType(2))
.SetStackSize(0) .SetStackSize(0)
.SetDyeType((uint)invItem.DyeType) .SetDyeType((uint)invItem.DyeType)
.SetFlags((uint)((invItem.Version == 1 || GameServer.GSSystem.ItemsSystem.ItemGenerator.IsCrafted(invItem.Attributes)) ? 2147483647 : 10633)) .SetFlags((uint)((invItem.Version == 1 ||
.SetSeed((uint)GameServer.GSSystem.ItemsSystem.ItemGenerator.GetSeed(invItem.Attributes)) GameServer.GSSystem.ItemsSystem.ItemGenerator.IsCrafted(invItem.Attributes))
.SetTransmogGbid(invItem.TransmogGBID) ? 2147483647
.SetDurability(509); : 10633))
if (invItem.RareItemName != null) generator.SetRareItemName(D3.Items.RareItemName.ParseFrom(invItem.RareItemName)); .SetSeed((uint)GameServer.GSSystem.ItemsSystem.ItemGenerator.GetSeed(invItem.Attributes))
List<string> affixes = invItem.Affixes.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList(); .SetTransmogGbid(invItem.TransmogGBID)
.SetDurability(509);
if (invItem.RareItemName != null)
generator.SetRareItemName(D3.Items.RareItemName.ParseFrom(invItem.RareItemName));
List<string> affixes = invItem.Affixes.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.ToList();
//if (affixes.Count() > 3 ) generator.SetFlags(10633); //if (affixes.Count() > 3 ) generator.SetFlags(10633);
generator.SetItemQualityLevel(invItem.Quality); generator.SetItemQualityLevel(invItem.Quality);
foreach (string affix in affixes) foreach (string affix in affixes)
@ -844,47 +977,57 @@ namespace DiIiS_NA.LoginServer.Toons
Int32.TryParse(affix, out result); Int32.TryParse(affix, out result);
generator.AddBaseAffixes(result); generator.AddBaseAffixes(result);
} }
#region gems #region gems
if (invItem.FirstGem != -1) if (invItem.FirstGem != -1)
generator.AddContents(D3.Items.EmbeddedGenerator.CreateBuilder() 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() .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) .SetFlags(2147483647)
.SetSeed(0) .SetSeed(0)
.SetDurability(509) .SetDurability(509)
.SetStackSize(0) .SetStackSize(0)
) )
); );
if (invItem.SecondGem != -1) if (invItem.SecondGem != -1)
generator.AddContents(D3.Items.EmbeddedGenerator.CreateBuilder() 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() .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) .SetFlags(2147483647)
.SetSeed(0) .SetSeed(0)
.SetDurability(509) .SetDurability(509)
.SetStackSize(0) .SetStackSize(0)
) )
); );
if (invItem.ThirdGem != -1) if (invItem.ThirdGem != -1)
generator.AddContents(D3.Items.EmbeddedGenerator.CreateBuilder() 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() .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) .SetFlags(2147483647)
.SetSeed(0) .SetSeed(0)
.SetDurability(509) .SetDurability(509)
.SetStackSize(0) .SetStackSize(0)
) )
); );
#endregion #endregion
item.SetGenerator(generator); item.SetGenerator(generator);
itemList.AddItems(item.Build()); itemList.AddItems(item.Build());
} }
//*/ //*/
var dbToon = DBToon; var dbToon = DBToon;
string[] stats = dbToon.Stats.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); string[] stats = dbToon.Stats.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
@ -920,27 +1063,37 @@ namespace DiIiS_NA.LoginServer.Toons
if (DBActiveSkills != null) if (DBActiveSkills != null)
{ {
var dbActiveSkills = DBActiveSkills; var dbActiveSkills = DBActiveSkills;
var skills = new[]{ 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.Skill0)
D3.Profile.SkillWithRune.CreateBuilder().SetSkill(dbActiveSkills.Skill2).SetRuneType(dbActiveSkills.Rune2).Build(), .SetRuneType(dbActiveSkills.Rune0).Build(),
D3.Profile.SkillWithRune.CreateBuilder().SetSkill(dbActiveSkills.Skill3).SetRuneType(dbActiveSkills.Rune3).Build(), D3.Profile.SkillWithRune.CreateBuilder().SetSkill(dbActiveSkills.Skill1)
D3.Profile.SkillWithRune.CreateBuilder().SetSkill(dbActiveSkills.Skill4).SetRuneType(dbActiveSkills.Rune4).Build(), .SetRuneType(dbActiveSkills.Rune1).Build(),
D3.Profile.SkillWithRune.CreateBuilder().SetSkill(dbActiveSkills.Skill5).SetRuneType(dbActiveSkills.Rune5).Build() D3.Profile.SkillWithRune.CreateBuilder().SetSkill(dbActiveSkills.Skill2)
}; .SetRuneType(dbActiveSkills.Rune2).Build(),
var passives = new[]{ D3.Profile.SkillWithRune.CreateBuilder().SetSkill(dbActiveSkills.Skill3)
dbActiveSkills.Passive0, dbActiveSkills.Passive1, dbActiveSkills.Passive2, dbActiveSkills.Passive3 .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.SetSnoActiveSkills(D3.Profile.SkillsWithRunes.CreateBuilder().AddRangeRunes(skills));
profile.SetSnoTraits(D3.Profile.PassiveSkills.CreateBuilder().AddRangeSnoTraits(passives)); profile.SetSnoTraits(D3.Profile.PassiveSkills.CreateBuilder().AddRangeSnoTraits(passives));
} }
profile.SetLegendaryPowers(D3.Profile.LegendaryPowers.CreateBuilder() profile.SetLegendaryPowers(D3.Profile.LegendaryPowers.CreateBuilder()
.AddGbidLegendaryPowers(-1) .AddGbidLegendaryPowers(-1)
.AddGbidLegendaryPowers(-1) .AddGbidLegendaryPowers(-1)
.AddGbidLegendaryPowers(-1) .AddGbidLegendaryPowers(-1)
) )
.SetPvpDamage(0) .SetPvpDamage(0)
.SetPvpWins(0) .SetPvpWins(0)
.SetPvpGlory(0) .SetPvpGlory(0)
.SetPvpTakedowns(0) .SetPvpTakedowns(0)
@ -985,48 +1138,42 @@ namespace DiIiS_NA.LoginServer.Toons
case ToonClass.Necromancer: case ToonClass.Necromancer:
return unchecked((int)0x8D4D94ED); return unchecked((int)0x8D4D94ED);
} }
return 0x0; return 0x0;
} }
} }
// Used for Conversations // Used for Conversations
public int VoiceClassID public int VoiceClassID =>
{ Class switch
get
{ {
switch (Class) ToonClass.DemonHunter => 0,
{ ToonClass.Barbarian => 1,
case ToonClass.DemonHunter: ToonClass.Wizard => 2,
return 0; ToonClass.WitchDoctor => 3,
case ToonClass.Barbarian: ToonClass.Monk => 4,
return 1; ToonClass.Crusader => 5,
case ToonClass.Wizard: ToonClass.Necromancer => 6,
return 2; _ => 0
case ToonClass.WitchDoctor: };
return 3;
case ToonClass.Monk:
return 4;
case ToonClass.Crusader:
return 5;
case ToonClass.Necromancer:
return 6;
}
return 0;
}
}
public int Gender => (int)(Flags & ToonFlags.Female); public int Gender => (int)(Flags & ToonFlags.Female);
#region c-tor and setfields #region c-tor and setfields
public readonly Core.MPQ.FileFormats.GameBalance.HeroTable HeroTable; public readonly Core.MPQ.FileFormats.GameBalance.HeroTable HeroTable;
private readonly Dictionary<int, int> visualToSlotMapping = new Dictionary<int, int> { { 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<int, int> _visualToSlotMapping = new Dictionary<int, int>
{ { 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) public Toon(DBToon dbToon, GameDBSession DBSession = null)
: base(dbToon.Id) : 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; _heroName = dbToon.Name;
_flags = dbToon.Flags; _flags = dbToon.Flags;
GameAccountId = dbToon.DBGameAccount.Id; GameAccountId = dbToon.DBGameAccount.Id;
@ -1053,7 +1200,12 @@ namespace DiIiS_NA.LoginServer.Toons
GameAccount.ChangedFields.SetIntPresenceFieldValue(HeroParagonLevelField); GameAccount.ChangedFields.SetIntPresenceFieldValue(HeroParagonLevelField);
} }
private List<int> _allQuests = new List<int>() { 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<int> _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() public void UnlockAllQuests()
{ {
@ -1061,18 +1213,20 @@ namespace DiIiS_NA.LoginServer.Toons
foreach (var quest in _allQuests) foreach (var quest in _allQuests)
{ {
if (!questList.Any(qh => qh.QuestId == quest)) if (questList.All(qh => qh.QuestId != quest))
{ {
var questHistory = new DBQuestHistory(); var questHistory = new DBQuestHistory
questHistory.DBToon = DBToon; {
questHistory.QuestId = quest; DBToon = DBToon,
questHistory.QuestStep = -1; QuestId = quest,
questHistory.isCompleted = true; QuestStep = -1,
isCompleted = true
};
DBSessions.SessionSave(questHistory); DBSessions.SessionSave(questHistory);
} }
else else
{ {
var questHistory = questList.Where(qh => qh.QuestId == quest).First(); var questHistory = questList.First(qh => qh.QuestId == quest);
questHistory.isCompleted = true; questHistory.isCompleted = true;
DBSessions.SessionUpdate(questHistory); DBSessions.SessionUpdate(questHistory);
} }
@ -1085,6 +1239,7 @@ namespace DiIiS_NA.LoginServer.Toons
_paragonLevelChanged = true; _paragonLevelChanged = true;
_visualEquipmentChanged = true; _visualEquipmentChanged = true;
} }
#region Notifications #region Notifications
//hero class generated //hero class generated
@ -1133,26 +1288,28 @@ namespace DiIiS_NA.LoginServer.Toons
case unchecked((int)0x8D4D94ED): case unchecked((int)0x8D4D94ED):
return ToonClass.Necromancer; return ToonClass.Necromancer;
} }
return ToonClass.Barbarian; return ToonClass.Barbarian;
} }
public override string ToString() public override string ToString()
{ {
return String.Format("{{ Toon: {0} [lowId: {1}] }}", Name, D3EntityID.IdLow); return $"{{ Toon: {Name} [lowId: {D3EntityID.IdLow}] }}";
} }
} }
#region Definitions and Enums #region Definitions and Enums
//Order is important as actor voices and saved data is based on enum index //Order is important as actor voices and saved data is based on enum index
public enum ToonClass// : uint public enum ToonClass // : uint
{ {
Barbarian,// = 0x4FB91EE2, Barbarian, // = 0x4FB91EE2,
Monk,//= 0x3DAC15, Monk, //= 0x3DAC15,
DemonHunter,// = 0xC88B9649, DemonHunter, // = 0xC88B9649,
WitchDoctor,// = 0x343C22A, WitchDoctor, // = 0x343C22A,
Wizard,// = 0x1D4681B1 Wizard, // = 0x1D4681B1
Crusader,// = 0xBE27DC19 Crusader, // = 0xBE27DC19
Necromancer, Necromancer,
Unknown Unknown
} }
@ -1165,6 +1322,7 @@ namespace DiIiS_NA.LoginServer.Toons
Female = 0x02, Female = 0x02,
Fallen = 0x08, Fallen = 0x08,
NeedRename = 0x20000000, NeedRename = 0x20000000,
// TODO: These two need to be figured out still.. /plash // TODO: These two need to be figured out still.. /plash
//Unknown1 = 0x20, //Unknown1 = 0x20,
Unknown2 = 0x40, Unknown2 = 0x40,
@ -1172,5 +1330,6 @@ namespace DiIiS_NA.LoginServer.Toons
Unknown4 = 0x2000000, Unknown4 = 0x2000000,
AllUnknowns = Unknown2 | Unknown3 | Unknown4 AllUnknowns = Unknown2 | Unknown3 | Unknown4
} }
#endregion #endregion
} }

View File

@ -85,7 +85,7 @@ namespace DiIiS_NA.Core.MPQ
{ {
foreach (var mpq in pair.Value) 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)); this.FileSystem.Archives.Add(new MpqArchive(new FileStream(mpq, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), true));
} }
} }

View File

@ -16,7 +16,7 @@ public class DropCommand : CommandGroup
var amount = 1; var amount = 1;
if (@params != null && @params.Any()) if (@params != null && @params.Any())
if (!int.TryParse(@params[0], out amount)) if (!int.TryParse(@params[0], out amount))
amount = 1; return "Invalid amount.";
amount = amount switch amount = amount switch
{ {

View File

@ -35,6 +35,7 @@ public class InfoCommand : CommandGroup
foreach (var world in game.Worlds) foreach (var world in game.Worlds)
{ {
info.Add($"World: {world.SNO.ToString()} - {(int)world.SNO}"); info.Add($"World: {world.SNO.ToString()} - {(int)world.SNO}");
info.Add($"World Id: {world.GlobalID}");
info.Add($"Players: {world.Players.Count}"); info.Add($"Players: {world.Players.Count}");
info.Add($"Monsters: {world.Monsters.Count}"); info.Add($"Monsters: {world.Monsters.Count}");
info.Add($"{world.Monsters.Count} players in world: "); info.Add($"{world.Monsters.Count} players in world: ");

View File

@ -275,9 +275,8 @@ namespace DiIiS_NA.GameServer.Core
} }
item.Owner = _owner; item.Owner = _owner;
if (_owner is Player) if (_owner is Player ownerPlayer)
{ {
var ownerPlayer = _owner as Player;
item.SetInventoryLocation(EquipmentSlot, column, row); item.SetInventoryLocation(EquipmentSlot, column, row);
if (EquipmentSlot == 15) if (EquipmentSlot == 15)
ownerPlayer.Inventory.SaveItemToDB(ownerPlayer.Toon.GameAccount.DBGameAccount, null, EquipmentSlotId.Stash, item); 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) public Item GetItem(uint itemId)
{ {
Item item; if (!Items.TryGetValue(itemId, out var item))
if (!Items.TryGetValue(itemId, out item))
return null; return null;
return item; return item;
} }

View File

@ -6,7 +6,7 @@ namespace DiIiS_NA.GameServer.Core.Types.TagMap
public class PowerKeys 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 #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<int, TagKey> tags = new Dictionary<int, TagKey>(); private static Dictionary<int, TagKey> tags = new();
public static TagKey GetKey(int index) public static TagKey GetKey(int index)
{ {
@ -24,483 +24,483 @@ namespace DiIiS_NA.GameServer.Core.Types.TagMap
} }
#endregion #endregion
public static TagKeyInt TurnsIntoBasicMeleeAttack = new TagKeyInt(328386); public static TagKeyInt TurnsIntoBasicMeleeAttack = new(328386);
public static TagKeyInt ReuseScriptState = new TagKeyInt(274432); public static TagKeyInt ReuseScriptState = new(274432);
public static TagKeyInt CastTargetEnemies = new TagKeyInt(328113); public static TagKeyInt CastTargetEnemies = new(328113);
public static TagKeyInt CustomTargetUnaffectedOnly = new TagKeyInt(328800); public static TagKeyInt CustomTargetUnaffectedOnly = new(328800);
public static TagKeyInt IsUsableInTown = new TagKeyInt(328080); public static TagKeyInt IsUsableInTown = new(328080);
public static TagKeyInt TurnsIntoBasicRangedAttack = new TagKeyInt(328385); public static TagKeyInt TurnsIntoBasicRangedAttack = new(328385);
public static TagKeyInt IsPrimary = new TagKeyInt(327776); public static TagKeyInt IsPrimary = new(327776);
public static TagKeyScript IsInvulnerableDuring = new TagKeyScript(328609); public static TagKeyScript IsInvulnerableDuring = new(328609);
public static TagKeyInt OffhandAnimationTag_fordualwield = new TagKeyInt(262663); public static TagKeyInt OffhandAnimationTag_fordualwield = new(262663);
public static TagKeyInt IsPassive = new TagKeyInt(328592); public static TagKeyInt IsPassive = new(328592);
public static TagKeyInt AnimationTag2 = new TagKeyInt(262658); public static TagKeyInt AnimationTag2 = new(262658);
public static TagKeyInt AnimationTag = new TagKeyInt(262656); public static TagKeyInt AnimationTag = new(262656);
public static TagKeyScript IsUntargetableDuring = new TagKeyScript(633616); public static TagKeyScript IsUntargetableDuring = new(633616);
public static TagKeyScript IsUninterruptableDuring = new TagKeyScript(328610); public static TagKeyScript IsUninterruptableDuring = new(328610);
public static TagKeyScript BaseDamageScalar = new TagKeyScript(329840); public static TagKeyScript BaseDamageScalar = new(329840);
public static TagKeyInt AlwaysHits = new TagKeyInt(327904); public static TagKeyInt AlwaysHits = new(327904);
public static TagKeySNO CastingEffectGroup_Female = new TagKeySNO(264273); public static TagKeySNO CastingEffectGroup_Female = new(264273);
public static TagKeySNO CastingEffectGroup_Male = new TagKeySNO(262660); public static TagKeySNO CastingEffectGroup_Male = new(262660);
public static TagKeyInt Buff0ShowDuration = new TagKeyInt(271104); public static TagKeyInt Buff0ShowDuration = new(271104);
public static TagKeyScript CooldownTime = new TagKeyScript(327768); public static TagKeyScript CooldownTime = new(327768);
public static TagKeySNO Buff1EffectGroup = new TagKeySNO(270337); public static TagKeySNO Buff1EffectGroup = new(270337);
public static TagKeySNO Buff0EffectGroup = new TagKeySNO(270336); public static TagKeySNO Buff0EffectGroup = new(270336);
public static TagKeyInt CastTargetAllies = new TagKeyInt(328097); public static TagKeyInt CastTargetAllies = new(328097);
public static TagKeyInt RequiresTarget = new TagKeyInt(328432); public static TagKeyInt RequiresTarget = new(328432);
public static TagKeyInt Buff3IsHarmful = new TagKeyInt(270851); public static TagKeyInt Buff3IsHarmful = new(270851);
public static TagKeyScript ResourceCost = new TagKeyScript(329616); public static TagKeyScript ResourceCost = new(329616);
public static TagKeyInt IconMouseover = new TagKeyInt(329488); public static TagKeyInt IconMouseover = new(329488);
public static TagKeyInt IconNormal = new TagKeyInt(329472); public static TagKeyInt IconNormal = new(329472);
public static TagKeyInt IconPushed = new TagKeyInt(329504); public static TagKeyInt IconPushed = new(329504);
public static TagKeyInt Buff3Icon = new TagKeyInt(270595); public static TagKeyInt Buff3Icon = new(270595);
public static TagKeyInt Buff2ShowDuration = new TagKeyInt(271106); public static TagKeyInt Buff2ShowDuration = new(271106);
public static TagKeyInt IsMouseAssignable = new TagKeyInt(328048); public static TagKeyInt IsMouseAssignable = new(328048);
public static TagKeyInt IsHotbarAssignable = new TagKeyInt(328064); public static TagKeyInt IsHotbarAssignable = new(328064);
public static TagKeyInt IsOffensive = new TagKeyInt(327840); public static TagKeyInt IsOffensive = new(327840);
public static TagKeyInt IsDisplayed = new TagKeyInt(327824); public static TagKeyInt IsDisplayed = new(327824);
public static TagKeyInt Template = new TagKeyInt(327680); public static TagKeyInt Template = new(327680);
public static TagKeyInt CannotLMBAssign = new TagKeyInt(327920); public static TagKeyInt CannotLMBAssign = new(327920);
public static TagKeyInt Buff2Icon = new TagKeyInt(270594); public static TagKeyInt Buff2Icon = new(270594);
public static TagKeyInt Buff1Icon = new TagKeyInt(270593); public static TagKeyInt Buff1Icon = new(270593);
public static TagKeyScript ScriptFormula10 = new TagKeyScript(266752); public static TagKeyScript ScriptFormula10 = new(266752);
public static TagKeyScript ScriptFormula11 = new TagKeyScript(266768); public static TagKeyScript ScriptFormula11 = new(266768);
public static TagKeyScript ScriptFormula12 = new TagKeyScript(266784); public static TagKeyScript ScriptFormula12 = new(266784);
public static TagKeyScript ScriptFormula13 = new TagKeyScript(266800); public static TagKeyScript ScriptFormula13 = new(266800);
public static TagKeyScript ScriptFormula14 = new TagKeyScript(266816); public static TagKeyScript ScriptFormula14 = new(266816);
public static TagKeyInt Buff0PlayerCanCancel = new TagKeyInt(271360); public static TagKeyInt Buff0PlayerCanCancel = new(271360);
public static TagKeyInt IconInactive = new TagKeyInt(329512); public static TagKeyInt IconInactive = new(329512);
public static TagKeyInt Buff0Icon = new TagKeyInt(270592); public static TagKeyInt Buff0Icon = new(270592);
public static TagKeyScript ScriptFormula0 = new TagKeyScript(266496); public static TagKeyScript ScriptFormula0 = new(266496);
public static TagKeyScript ScriptFormula2 = new TagKeyScript(266528); public static TagKeyScript ScriptFormula2 = new(266528);
public static TagKeyScript ScriptFormula3 = new TagKeyScript(266544); public static TagKeyScript ScriptFormula3 = new(266544);
public static TagKeyScript ScriptFormula4 = new TagKeyScript(266560); public static TagKeyScript ScriptFormula4 = new(266560);
public static TagKeyScript ScriptFormula5 = new TagKeyScript(266576); public static TagKeyScript ScriptFormula5 = new(266576);
public static TagKeyScript ScriptFormula7 = new TagKeyScript(266608); public static TagKeyScript ScriptFormula7 = new(266608);
public static TagKeyInt Buff3ShowDuration = new TagKeyInt(271107); public static TagKeyInt Buff3ShowDuration = new(271107);
public static TagKeyInt Buff2PlayerCanCancel = new TagKeyInt(271362); public static TagKeyInt Buff2PlayerCanCancel = new(271362);
public static TagKeyScript FailsIfStunned = new TagKeyScript(328322); public static TagKeyScript FailsIfStunned = new(328322);
public static TagKeyScript BreaksFear = new TagKeyScript(681987); public static TagKeyScript BreaksFear = new(681987);
public static TagKeyScript BreaksStun = new TagKeyScript(681986); public static TagKeyScript BreaksStun = new(681986);
public static TagKeyScript BreaksSnare = new TagKeyScript(681985); public static TagKeyScript BreaksSnare = new(681985);
public static TagKeyScript BreaksRoot = new TagKeyScript(681984); public static TagKeyScript BreaksRoot = new(681984);
public static TagKeyScript FailsIfFeared = new TagKeyScript(328325); public static TagKeyScript FailsIfFeared = new(328325);
public static TagKeySNO ContactFrameEffectGroup_Male = new TagKeySNO(264192); public static TagKeySNO ContactFrameEffectGroup_Male = new(264192);
public static TagKeySNO ContactFrameEffectGroup_Female = new TagKeySNO(264275); public static TagKeySNO ContactFrameEffectGroup_Female = new(264275);
public static TagKeyInt SpellFunc0 = new TagKeyInt(327712); public static TagKeyInt SpellFunc0 = new(327712);
public static TagKeyInt CastTargetMustBeInTeleportableArea = new TagKeyInt(328083); public static TagKeyInt CastTargetMustBeInTeleportableArea = new(328083);
public static TagKeySNO GenericEffectGroup0 = new TagKeySNO(262661); public static TagKeySNO GenericEffectGroup0 = new(262661);
public static TagKeyScript ConcentrationDuration = new TagKeyScript(333088); public static TagKeyScript ConcentrationDuration = new(333088);
public static TagKeyScript SlowTimeDuration = new TagKeyScript(332928); public static TagKeyScript SlowTimeDuration = new(332928);
public static TagKeyScript RingofFrostRingLifetime = new TagKeyScript(332896); public static TagKeyScript RingofFrostRingLifetime = new(332896);
public static TagKeyScript DodgeDuration = new TagKeyScript(332848); public static TagKeyScript DodgeDuration = new(332848);
public static TagKeyScript DamageAuraDuration = new TagKeyScript(332832); public static TagKeyScript DamageAuraDuration = new(332832);
public static TagKeyScript RootDuration = new TagKeyScript(332816); public static TagKeyScript RootDuration = new(332816);
public static TagKeyScript CurseDuration = new TagKeyScript(332800); public static TagKeyScript CurseDuration = new(332800);
public static TagKeyScript PaladinDeadTimeUntilResurrect = new TagKeyScript(332784); public static TagKeyScript PaladinDeadTimeUntilResurrect = new(332784);
public static TagKeyScript BuffDurationMin = new TagKeyScript(332736); public static TagKeyScript BuffDurationMin = new(332736);
public static TagKeyScript ThunderingCryBuffDuration = new TagKeyScript(332720); public static TagKeyScript ThunderingCryBuffDuration = new(332720);
public static TagKeyScript ThunderstormDuration = new TagKeyScript(332704); public static TagKeyScript ThunderstormDuration = new(332704);
public static TagKeyScript TornadoLifeDurationMin = new TagKeyScript(332656); public static TagKeyScript TornadoLifeDurationMin = new(332656);
public static TagKeySNO EndingEffectGroup = new TagKeySNO(262662); public static TagKeySNO EndingEffectGroup = new(262662);
public static TagKeyScript AttackSpeed = new TagKeyScript(329824); public static TagKeyScript AttackSpeed = new(329824);
public static TagKeyScript ScriptFormula23 = new TagKeyScript(267056); public static TagKeyScript ScriptFormula23 = new(267056);
public static TagKeyScript ScriptFormula22 = new TagKeyScript(267040); public static TagKeyScript ScriptFormula22 = new(267040);
public static TagKeyScript ScriptFormula20 = new TagKeyScript(267008); public static TagKeyScript ScriptFormula20 = new(267008);
public static TagKeyScript ScriptFormula21 = new TagKeyScript(267024); public static TagKeyScript ScriptFormula21 = new(267024);
public static TagKeyScript EscapeAttackRadius = new TagKeyScript(329744); public static TagKeyScript EscapeAttackRadius = new(329744);
public static TagKeyScript AttackRadius = new TagKeyScript(329808); public static TagKeyScript AttackRadius = new(329808);
public static TagKeyInt IgnoresRangeOnShiftClick = new TagKeyInt(328600); public static TagKeyInt IgnoresRangeOnShiftClick = new(328600);
public static TagKeyInt AutoAssignLocation = new TagKeyInt(328049); public static TagKeyInt AutoAssignLocation = new(328049);
public static TagKeyInt CanSteer = new TagKeyInt(327937); public static TagKeyInt CanSteer = new(327937);
public static TagKeyInt TurnsIntoBasicAttack = new TagKeyInt(328384); public static TagKeyInt TurnsIntoBasicAttack = new(328384);
public static TagKeyInt ItemTypeRequirement = new TagKeyInt(328960); public static TagKeyInt ItemTypeRequirement = new(328960);
public static TagKeyInt SpecialDeathType = new TagKeyInt(328534); public static TagKeyInt SpecialDeathType = new(328534);
public static TagKeyScript ResourceCostMinToCast = new TagKeyScript(329617); public static TagKeyScript ResourceCostMinToCast = new(329617);
public static TagKeyInt ControllerAutoTargets = new TagKeyInt(622592); public static TagKeyInt ControllerAutoTargets = new(622592);
public static TagKeyScript ControllerMinRange = new TagKeyScript(622593); public static TagKeyScript ControllerMinRange = new(622593);
public static TagKeyInt TargetGroundOnly = new TagKeyInt(328160); public static TagKeyInt TargetGroundOnly = new(328160);
public static TagKeyInt TurnsIntoWalk = new TagKeyInt(327936); public static TagKeyInt TurnsIntoWalk = new(327936);
public static TagKeyInt IsAimedAtGround = new TagKeyInt(327888); public static TagKeyInt IsAimedAtGround = new(327888);
public static TagKeyScript ScriptFormula19 = new TagKeyScript(266896); public static TagKeyScript ScriptFormula19 = new(266896);
public static TagKeyScript ScriptFormula18 = new TagKeyScript(266880); public static TagKeyScript ScriptFormula18 = new(266880);
public static TagKeyScript ScriptFormula17 = new TagKeyScript(266864); public static TagKeyScript ScriptFormula17 = new(266864);
public static TagKeyScript ScriptFormula16 = new TagKeyScript(266848); public static TagKeyScript ScriptFormula16 = new(266848);
public static TagKeyScript ScriptFormula15 = new TagKeyScript(266832); public static TagKeyScript ScriptFormula15 = new(266832);
public static TagKeyInt UsesAttackWarmupTime = new TagKeyInt(328606); public static TagKeyInt UsesAttackWarmupTime = new(328606);
public static TagKeyInt AlternatesAnims = new TagKeyInt(328501); public static TagKeyInt AlternatesAnims = new(328501);
public static TagKeyFloat SpecialDeathChance = new TagKeyFloat(328532); public static TagKeyFloat SpecialDeathChance = new(328532);
public static TagKeyScript ScriptFormula9 = new TagKeyScript(266640); public static TagKeyScript ScriptFormula9 = new(266640);
public static TagKeyScript ScriptFormula8 = new TagKeyScript(266624); public static TagKeyScript ScriptFormula8 = new(266624);
public static TagKeyScript ScriptFormula1 = new TagKeyScript(266512); public static TagKeyScript ScriptFormula1 = new(266512);
public static TagKeyScript ScriptFormula6 = new TagKeyScript(266592); public static TagKeyScript ScriptFormula6 = new(266592);
public static TagKeyInt ContactFrameType = new TagKeyInt(328224); public static TagKeyInt ContactFrameType = new(328224);
public static TagKeyScript PayloadParam0 = new TagKeyScript(329776); public static TagKeyScript PayloadParam0 = new(329776);
public static TagKeyInt PayloadType = new TagKeyInt(329760); public static TagKeyInt PayloadType = new(329760);
public static TagKeyInt TargetEnemies = new TagKeyInt(328112); public static TagKeyInt TargetEnemies = new(328112);
public static TagKeyInt SpellFunc1 = new TagKeyInt(327728); public static TagKeyInt SpellFunc1 = new(327728);
public static TagKeyScript ProjectileSpeed = new TagKeyScript(331184); public static TagKeyScript ProjectileSpeed = new(331184);
public static TagKeyScript ChargedBoltNumBolts = new TagKeyScript(331056); public static TagKeyScript ChargedBoltNumBolts = new(331056);
public static TagKeySNO ProjectileActor = new TagKeySNO(262400); public static TagKeySNO ProjectileActor = new(262400);
public static TagKeyScript ProcCooldownTime = new TagKeyScript(680768); public static TagKeyScript ProcCooldownTime = new(680768);
public static TagKeyScript LightningDamageDelta = new TagKeyScript(330128); public static TagKeyScript LightningDamageDelta = new(330128);
public static TagKeyScript LightningDamageMin = new TagKeyScript(330112); public static TagKeyScript LightningDamageMin = new(330112);
public static TagKeyInt CastTargetIgnoreWreckables = new TagKeyInt(328169); public static TagKeyInt CastTargetIgnoreWreckables = new(328169);
public static TagKeyInt TargetIgnoreWreckables = new TagKeyInt(328168); public static TagKeyInt TargetIgnoreWreckables = new(328168);
public static TagKeyScript ColdDamageMin = new TagKeyScript(330176); public static TagKeyScript ColdDamageMin = new(330176);
public static TagKeyScript ColdDamageDelta = new TagKeyScript(330192); public static TagKeyScript ColdDamageDelta = new(330192);
public static TagKeyInt Buff1ShowDuration = new TagKeyInt(271105); public static TagKeyInt Buff1ShowDuration = new(271105);
public static TagKeyInt AutoPurchaseLevel = new TagKeyInt(329520); public static TagKeyInt AutoPurchaseLevel = new(329520);
public static TagKeyInt Buff1PlayerCanCancel = new TagKeyInt(271361); public static TagKeyInt Buff1PlayerCanCancel = new(271361);
public static TagKeyScript ImmuneToKnockback = new TagKeyScript(328352); public static TagKeyScript ImmuneToKnockback = new(328352);
public static TagKeyScript ImmuneToRecoil = new TagKeyScript(328336); public static TagKeyScript ImmuneToRecoil = new(328336);
public static TagKeyInt NeverUpdatesFacing = new TagKeyInt(328000); public static TagKeyInt NeverUpdatesFacing = new(328000);
public static TagKeyInt ContactFreezesFacing = new TagKeyInt(327984); public static TagKeyInt ContactFreezesFacing = new(327984);
public static TagKeyInt IsBasicAttack = new TagKeyInt(327808); public static TagKeyInt IsBasicAttack = new(327808);
public static TagKeyInt SpellFuncBegin = new TagKeyInt(327696); public static TagKeyInt SpellFuncBegin = new(327696);
public static TagKeyInt SpellFuncInterrupted = new TagKeyInt(327745); public static TagKeyInt SpellFuncInterrupted = new(327745);
public static TagKeyScript NumCryptKidsToSpawnOnCorpulentExplosion = new TagKeyScript(332480); public static TagKeyScript NumCryptKidsToSpawnOnCorpulentExplosion = new(332480);
public static TagKeyInt TargetAllies = new TagKeyInt(328096); public static TagKeyInt TargetAllies = new(328096);
public static TagKeyInt NeverCausesRecoil = new TagKeyInt(327968); public static TagKeyInt NeverCausesRecoil = new(327968);
public static TagKeyScript MonsterCritDamageScalar = new TagKeyScript(684918); public static TagKeyScript MonsterCritDamageScalar = new(684918);
public static TagKeyScript PlayerCritDamageScalar = new TagKeyScript(684917); public static TagKeyScript PlayerCritDamageScalar = new(684917);
public static TagKeyInt Buff0IsHarmful = new TagKeyInt(270848); public static TagKeyInt Buff0IsHarmful = new(270848);
public static TagKeyInt DoesntCenter = new TagKeyInt(328032); public static TagKeyInt DoesntCenter = new(328032);
public static TagKeyInt IsTranslate = new TagKeyInt(327856); public static TagKeyInt IsTranslate = new(327856);
public static TagKeyInt SpellFuncEnd = new TagKeyInt(327744); public static TagKeyInt SpellFuncEnd = new(327744);
public static TagKeyScript SpecialWalkTrajectoryHeight = new TagKeyScript(332320); public static TagKeyScript SpecialWalkTrajectoryHeight = new(332320);
public static TagKeyScript SpecialWalkTrajectoryGravity = new TagKeyScript(332336); public static TagKeyScript SpecialWalkTrajectoryGravity = new(332336);
public static TagKeyInt SpecialWalkPerturbDestination = new TagKeyInt(332360); public static TagKeyInt SpecialWalkPerturbDestination = new(332360);
public static TagKeyInt IsChannelled = new TagKeyInt(328400); public static TagKeyInt IsChannelled = new(328400);
public static TagKeyInt InfiniteAnimTiming = new TagKeyInt(328208); public static TagKeyInt InfiniteAnimTiming = new(328208);
public static TagKeyInt CustomTargetFunc = new TagKeyInt(328736); public static TagKeyInt CustomTargetFunc = new(328736);
public static TagKeyInt CustomTargetPlayersOnly = new TagKeyInt(328752); public static TagKeyInt CustomTargetPlayersOnly = new(328752);
public static TagKeyScript CustomTargetMinRange = new TagKeyScript(328768); public static TagKeyScript CustomTargetMinRange = new(328768);
public static TagKeyInt SnapsToFacing = new TagKeyInt(328021); public static TagKeyInt SnapsToFacing = new(328021);
public static TagKeyScript ManaPercentToReserve = new TagKeyScript(331600); public static TagKeyScript ManaPercentToReserve = new(331600);
public static TagKeyInt ComboAnimation1 = new TagKeyInt(262912); public static TagKeyInt ComboAnimation1 = new(262912);
public static TagKeyScript ScriptFormula26 = new TagKeyScript(267104); public static TagKeyScript ScriptFormula26 = new(267104);
public static TagKeyScript ScriptFormula28 = new TagKeyScript(267136); public static TagKeyScript ScriptFormula28 = new(267136);
public static TagKeyScript ScriptFormula29 = new TagKeyScript(267152); public static TagKeyScript ScriptFormula29 = new(267152);
public static TagKeyScript EscapeAttackAngle = new TagKeyScript(329745); public static TagKeyScript EscapeAttackAngle = new(329745);
public static TagKeyScript ComboAttackRadius1 = new TagKeyScript(329809); public static TagKeyScript ComboAttackRadius1 = new(329809);
public static TagKeyInt ComboAnimation2 = new TagKeyInt(262913); public static TagKeyInt ComboAnimation2 = new(262913);
public static TagKeyScript ComboAttackSpeed1 = new TagKeyScript(329825); public static TagKeyScript ComboAttackSpeed1 = new(329825);
public static TagKeySNO Buff3EffectGroup = new TagKeySNO(270339); public static TagKeySNO Buff3EffectGroup = new(270339);
public static TagKeyScript ComboAttackRadius2 = new TagKeyScript(329810); public static TagKeyScript ComboAttackRadius2 = new(329810);
public static TagKeyScript ComboAttackSpeed2 = new TagKeyScript(329826); public static TagKeyScript ComboAttackSpeed2 = new(329826);
public static TagKeySNO Buff2EffectGroup = new TagKeySNO(270338); public static TagKeySNO Buff2EffectGroup = new(270338);
public static TagKeyScript ComboAttackRadius3 = new TagKeyScript(329811); public static TagKeyScript ComboAttackRadius3 = new(329811);
public static TagKeyScript ComboAttackSpeed3 = new TagKeyScript(329827); public static TagKeyScript ComboAttackSpeed3 = new(329827);
public static TagKeyInt IsComboPower = new TagKeyInt(264448); public static TagKeyInt IsComboPower = new(264448);
public static TagKeyInt Buff3PlayerCanCancel = new TagKeyInt(271363); public static TagKeyInt Buff3PlayerCanCancel = new(271363);
public static TagKeyInt ComboAnimation3 = new TagKeyInt(262914); public static TagKeyInt ComboAnimation3 = new(262914);
public static TagKeySNO Combo1CastingEffectGroup_Male = new TagKeySNO(264289); public static TagKeySNO Combo1CastingEffectGroup_Male = new(264289);
public static TagKeySNO Combo1CastingEffectGroup_Female = new TagKeySNO(264321); public static TagKeySNO Combo1CastingEffectGroup_Female = new(264321);
public static TagKeyInt AffectedByDualWield = new TagKeyInt(328448); public static TagKeyInt AffectedByDualWield = new(328448);
public static TagKeySNO Combo0CastingEffectGroup_Male = new TagKeySNO(264288); public static TagKeySNO Combo0CastingEffectGroup_Male = new(264288);
public static TagKeySNO Combo0CastingEffectGroup_Female = new TagKeySNO(264320); public static TagKeySNO Combo0CastingEffectGroup_Female = new(264320);
public static TagKeySNO Combo2CastingEffectGroup_Male = new TagKeySNO(264290); public static TagKeySNO Combo2CastingEffectGroup_Male = new(264290);
public static TagKeySNO Combo2CastingEffectGroup_Female = new TagKeySNO(264322); public static TagKeySNO Combo2CastingEffectGroup_Female = new(264322);
public static TagKeyScript ScriptFormula30 = new TagKeyScript(267264); public static TagKeyScript ScriptFormula30 = new(267264);
public static TagKeyScript ScriptFormula31 = new TagKeyScript(267280); public static TagKeyScript ScriptFormula31 = new(267280);
public static TagKeyScript ScriptFormula32 = new TagKeyScript(267296); public static TagKeyScript ScriptFormula32 = new(267296);
public static TagKeyScript ScriptFormula33 = new TagKeyScript(267312); public static TagKeyScript ScriptFormula33 = new(267312);
public static TagKeyScript ScriptFormula34 = new TagKeyScript(267328); public static TagKeyScript ScriptFormula34 = new(267328);
public static TagKeyScript ScriptFormula35 = new TagKeyScript(267344); public static TagKeyScript ScriptFormula35 = new(267344);
public static TagKeyScript ScriptFormula36 = new TagKeyScript(267360); public static TagKeyScript ScriptFormula36 = new(267360);
public static TagKeyScript ScriptFormula37 = new TagKeyScript(267376); public static TagKeyScript ScriptFormula37 = new(267376);
public static TagKeyScript ScriptFormula58 = new TagKeyScript(267904); public static TagKeyScript ScriptFormula58 = new(267904);
public static TagKeyScript ScriptFormula59 = new TagKeyScript(267920); public static TagKeyScript ScriptFormula59 = new(267920);
public static TagKeyScript SpiritGained = new TagKeyScript(684928); public static TagKeyScript SpiritGained = new(684928);
public static TagKeyScript CurseDamageAmplifyPercent = new TagKeyScript(331536); public static TagKeyScript CurseDamageAmplifyPercent = new(331536);
public static TagKeyInt Buff4Icon = new TagKeyInt(270596); public static TagKeyInt Buff4Icon = new(270596);
public static TagKeyInt Buff4ShowDuration = new TagKeyInt(271108); public static TagKeyInt Buff4ShowDuration = new(271108);
public static TagKeySNO Buff4EffectGroup = new TagKeySNO(270340); public static TagKeySNO Buff4EffectGroup = new(270340);
public static TagKeyScript FailsIfSilenced = new TagKeyScript(328321); public static TagKeyScript FailsIfSilenced = new(328321);
public static TagKeyInt Buff4PlayerCanCancel = new TagKeyInt(271364); public static TagKeyInt Buff4PlayerCanCancel = new(271364);
public static TagKeyInt IsPhysical = new TagKeyInt(328624); public static TagKeyInt IsPhysical = new(328624);
public static TagKeyInt HitsoundOverride = new TagKeyInt(262433); public static TagKeyInt HitsoundOverride = new(262433);
public static TagKeyScript ScriptFormula25 = new TagKeyScript(267088); public static TagKeyScript ScriptFormula25 = new(267088);
public static TagKeyInt Requires2HItem = new TagKeyInt(328992); public static TagKeyInt Requires2HItem = new(328992);
public static TagKeyInt Buff2IsHarmful = new TagKeyInt(270850); public static TagKeyInt Buff2IsHarmful = new(270850);
public static TagKeyInt RequiresActorTarget = new TagKeyInt(328240); public static TagKeyInt RequiresActorTarget = new(328240);
public static TagKeyInt ClipsTargetToAttackRadius = new TagKeyInt(684848); public static TagKeyInt ClipsTargetToAttackRadius = new(684848);
public static TagKeyInt CastTargetNeutral = new TagKeyInt(328145); public static TagKeyInt CastTargetNeutral = new(328145);
public static TagKeyInt LOSCheck = new TagKeyInt(328720); public static TagKeyInt LOSCheck = new(328720);
public static TagKeyScript AttackRating = new TagKeyScript(329888); public static TagKeyScript AttackRating = new(329888);
public static TagKeyScript DestructableObjectDamageDelay = new TagKeyScript(618496); public static TagKeyScript DestructableObjectDamageDelay = new(618496);
public static TagKeyInt TargetNeutral = new TagKeyInt(328144); public static TagKeyInt TargetNeutral = new(328144);
public static TagKeySNO ExplosionActor = new TagKeySNO(262401); public static TagKeySNO ExplosionActor = new(262401);
public static TagKeyScript StunChance = new TagKeyScript(330816); public static TagKeyScript StunChance = new(330816);
public static TagKeyScript StunDurationMin = new TagKeyScript(330784); public static TagKeyScript StunDurationMin = new(330784);
public static TagKeyScript PhysicalDamageDelta = new TagKeyScript(330000); public static TagKeyScript PhysicalDamageDelta = new(330000);
public static TagKeyScript PhysicalDamageMin = new TagKeyScript(329984); public static TagKeyScript PhysicalDamageMin = new(329984);
public static TagKeyInt IsItemPower = new TagKeyInt(328601); public static TagKeyInt IsItemPower = new(328601);
public static TagKeyInt CastTargetCorpse = new TagKeyInt(328129); public static TagKeyInt CastTargetCorpse = new(328129);
public static TagKeyScript SummonedActorLevel = new TagKeyScript(331136); public static TagKeyScript SummonedActorLevel = new(331136);
public static TagKeyInt TargetContactPlaneOnly = new TagKeyInt(328162); public static TagKeyInt TargetContactPlaneOnly = new(328162);
public static TagKeyInt DontWalkCloserIfOutOfRange = new TagKeyInt(328256); public static TagKeyInt DontWalkCloserIfOutOfRange = new(328256);
public static TagKeyScript ResourceGainedOnFirstHit = new TagKeyScript(329627); public static TagKeyScript ResourceGainedOnFirstHit = new(329627);
public static TagKeyInt LocksActorsWhileSweeping = new TagKeyInt(328420); public static TagKeyInt LocksActorsWhileSweeping = new(328420);
public static TagKeyInt Buff1IsHarmful = new TagKeyInt(270849); public static TagKeyInt Buff1IsHarmful = new(270849);
public static TagKeyScript FailsIfImmobilized = new TagKeyScript(328320); public static TagKeyScript FailsIfImmobilized = new(328320);
public static TagKeyInt StartWalkAfterIntro = new TagKeyInt(328288); public static TagKeyInt StartWalkAfterIntro = new(328288);
public static TagKeyInt RollToDestination = new TagKeyInt(328368); public static TagKeyInt RollToDestination = new(328368);
public static TagKeyInt PickupItemsWhileMoving = new TagKeyInt(655984); public static TagKeyInt PickupItemsWhileMoving = new(655984);
public static TagKeyScript WalkingSpeedMultiplier = new TagKeyScript(331952); public static TagKeyScript WalkingSpeedMultiplier = new(331952);
public static TagKeyScript SpecialWalkPlayerEndAnimScalar = new TagKeyScript(328536); public static TagKeyScript SpecialWalkPlayerEndAnimScalar = new(328536);
public static TagKeyInt NeverUpdatesFacingStarting = new TagKeyInt(328016); public static TagKeyInt NeverUpdatesFacingStarting = new(328016);
public static TagKeyInt RequiresSkillPoint = new TagKeyInt(328248); public static TagKeyInt RequiresSkillPoint = new(328248);
public static TagKeyInt IsKnockbackMovement = new TagKeyInt(327860); public static TagKeyInt IsKnockbackMovement = new(327860);
public static TagKeyInt SpecialWalkIsKnockback = new TagKeyInt(332362); public static TagKeyInt SpecialWalkIsKnockback = new(332362);
public static TagKeyScript BreaksImmobilize = new TagKeyScript(328304); public static TagKeyScript BreaksImmobilize = new(328304);
public static TagKeyScript ImmunetoFearduring = new TagKeyScript(682243); public static TagKeyScript ImmunetoFearduring = new(682243);
public static TagKeyScript ImmunetoRootduring = new TagKeyScript(682240); public static TagKeyScript ImmunetoRootduring = new(682240);
public static TagKeyScript ImmunetoSnareduring = new TagKeyScript(682241); public static TagKeyScript ImmunetoSnareduring = new(682241);
public static TagKeyScript ImmunetoStunduring = new TagKeyScript(682242); public static TagKeyScript ImmunetoStunduring = new(682242);
public static TagKeyInt CastTargetNormalMonstersOnly = new TagKeyInt(328617); public static TagKeyInt CastTargetNormalMonstersOnly = new(328617);
public static TagKeyInt CausesClosingCooldown = new TagKeyInt(328632); public static TagKeyInt CausesClosingCooldown = new(328632);
public static TagKeyInt CastTargetIgnoreLargeMonsters = new TagKeyInt(328616); public static TagKeyInt CastTargetIgnoreLargeMonsters = new(328616);
public static TagKeyScript CustomTargetMaxRange = new TagKeyScript(328784); public static TagKeyScript CustomTargetMaxRange = new(328784);
public static TagKeySNO CustomTargetBuffPowerSNO = new TagKeySNO(328802); public static TagKeySNO CustomTargetBuffPowerSNO = new(328802);
public static TagKeyScript FireDamageDelta = new TagKeyScript(330064); public static TagKeyScript FireDamageDelta = new(330064);
public static TagKeyScript FireDamageMin = new TagKeyScript(330048); public static TagKeyScript FireDamageMin = new(330048);
public static TagKeyInt DisplaysNoDamage = new TagKeyInt(327829); public static TagKeyInt DisplaysNoDamage = new(327829);
public static TagKeyScript SkillPointCost = new TagKeyScript(329312); public static TagKeyScript SkillPointCost = new(329312);
public static TagKeyInt CannotLockOntoActors = new TagKeyInt(328416); public static TagKeyInt CannotLockOntoActors = new(328416);
public static TagKeyInt ChannelledLocksActors = new TagKeyInt(328401); public static TagKeyInt ChannelledLocksActors = new(328401);
public static TagKeyInt NoAffectedACD = new TagKeyInt(328176); public static TagKeyInt NoAffectedACD = new(328176);
public static TagKeyScript ResourceCostReductionCoefficient = new TagKeyScript(329625); public static TagKeyScript ResourceCostReductionCoefficient = new(329625);
public static TagKeyInt TargetNavMeshOnly = new TagKeyInt(328163); public static TagKeyInt TargetNavMeshOnly = new(328163);
public static TagKeySNO HitEffect = new TagKeySNO(684034); public static TagKeySNO HitEffect = new(684034);
public static TagKeyInt OverrideHitEffects = new TagKeyInt(684032); public static TagKeyInt OverrideHitEffects = new(684032);
public static TagKeyInt AnimationTagRuneE = new TagKeyInt(262677); public static TagKeyInt AnimationTagRuneE = new(262677);
public static TagKeyScript LifestealPercent = new TagKeyScript(331224); public static TagKeyScript LifestealPercent = new(331224);
public static TagKeyScript CritChance = new TagKeyScript(331008); public static TagKeyScript CritChance = new(331008);
public static TagKeyScript GhostSoulsiphonMaxChannellingDistance = new TagKeyScript(365056); public static TagKeyScript GhostSoulsiphonMaxChannellingDistance = new(365056);
public static TagKeySNO Source_DestEffectGroup = new TagKeySNO(262659); public static TagKeySNO Source_DestEffectGroup = new(262659);
public static TagKeyScript GhostSoulsiphonMaxChannellingTime = new TagKeyScript(364800); public static TagKeyScript GhostSoulsiphonMaxChannellingTime = new(364800);
public static TagKeyScript GhostSoulsiphonSlowMultiplier = new TagKeyScript(364544); public static TagKeyScript GhostSoulsiphonSlowMultiplier = new(364544);
public static TagKeyScript GhostSoulsiphonDamagePerSecond = new TagKeyScript(365312); public static TagKeyScript GhostSoulsiphonDamagePerSecond = new(365312);
public static TagKeyInt CastTargetAllowDeadTargets = new TagKeyInt(328620); public static TagKeyInt CastTargetAllowDeadTargets = new(328620);
public static TagKeyScript BuffDurationDelta = new TagKeyScript(332752); public static TagKeyScript BuffDurationDelta = new(332752);
public static TagKeyScript SlowMovementSpeedMultiplier = new TagKeyScript(692224); public static TagKeyScript SlowMovementSpeedMultiplier = new(692224);
public static TagKeyScript FireDuration = new TagKeyScript(329976); public static TagKeyScript FireDuration = new(329976);
public static TagKeyInt IsCancellable = new TagKeyInt(328544); public static TagKeyInt IsCancellable = new(328544);
public static TagKeyScript StunDurationDelta = new TagKeyScript(330800); public static TagKeyScript StunDurationDelta = new(330800);
public static TagKeySNO Rope = new TagKeySNO(262432); public static TagKeySNO Rope = new(262432);
public static TagKeyScript LoopingAnimationTime = new TagKeyScript(263296); public static TagKeyScript LoopingAnimationTime = new(263296);
public static TagKeyInt ClassRestriction = new TagKeyInt(329648); public static TagKeyInt ClassRestriction = new(329648);
public static TagKeyInt AlwaysKnown = new TagKeyInt(329536); public static TagKeyInt AlwaysKnown = new(329536);
public static TagKeyScript ScriptFormula38 = new TagKeyScript(267392); public static TagKeyScript ScriptFormula38 = new(267392);
public static TagKeyScript ScriptFormula39 = new TagKeyScript(267408); public static TagKeyScript ScriptFormula39 = new(267408);
public static TagKeyInt GenericBuffAttribute2 = new TagKeyInt(655648); public static TagKeyInt GenericBuffAttribute2 = new(655648);
public static TagKeyInt GenericBuffAttribute3 = new TagKeyInt(655664); public static TagKeyInt GenericBuffAttribute3 = new(655664);
public static TagKeyInt GenericBuffAttribute1 = new TagKeyInt(655632); public static TagKeyInt GenericBuffAttribute1 = new(655632);
public static TagKeyInt GenericBuffAttribute0 = new TagKeyInt(655616); public static TagKeyInt GenericBuffAttribute0 = new(655616);
public static TagKeyScript GenericBuffAttribute2Formula = new TagKeyScript(655649); public static TagKeyScript GenericBuffAttribute2Formula = new(655649);
public static TagKeyScript GenericBuffAttribute3Formula = new TagKeyScript(655665); public static TagKeyScript GenericBuffAttribute3Formula = new(655665);
public static TagKeyScript GenericBuffAttribute1Formula = new TagKeyScript(655633); public static TagKeyScript GenericBuffAttribute1Formula = new(655633);
public static TagKeyScript GenericBuffAttribute0Formula = new TagKeyScript(655617); public static TagKeyScript GenericBuffAttribute0Formula = new(655617);
public static TagKeyInt CallAIUpdateImmediatelyUponTermination = new TagKeyInt(328604); public static TagKeyInt CallAIUpdateImmediatelyUponTermination = new(328604);
public static TagKeyInt ChecksVerticalMovement = new TagKeyInt(327864); public static TagKeyInt ChecksVerticalMovement = new(327864);
public static TagKeyInt DoesntPreplayAnimation = new TagKeyInt(328611); public static TagKeyInt DoesntPreplayAnimation = new(328611);
public static TagKeyInt IsCompletedWhenWalkingStops = new TagKeyInt(328608); public static TagKeyInt IsCompletedWhenWalkingStops = new(328608);
public static TagKeyScript DelayBeforeSettingTarget = new TagKeyScript(328539); public static TagKeyScript DelayBeforeSettingTarget = new(328539);
public static TagKeyScript KnockbackMagnitude = new TagKeyScript(331696); public static TagKeyScript KnockbackMagnitude = new(331696);
public static TagKeyScript WhirlwindKnockbackMagnitude = new TagKeyScript(331664); public static TagKeyScript WhirlwindKnockbackMagnitude = new(331664);
public static TagKeyScript RetaliationKnockbackMagnitude = new TagKeyScript(331648); public static TagKeyScript RetaliationKnockbackMagnitude = new(331648);
public static TagKeyInt ScaledAnimTiming = new TagKeyInt(328192); public static TagKeyInt ScaledAnimTiming = new(328192);
public static TagKeyInt IsADodgePower = new TagKeyInt(328480); public static TagKeyInt IsADodgePower = new(328480);
public static TagKeyScript DodgeTravelDistanceMin = new TagKeyScript(332384); public static TagKeyScript DodgeTravelDistanceMin = new(332384);
public static TagKeyScript DodgeTravelSpeed = new TagKeyScript(331936); public static TagKeyScript DodgeTravelSpeed = new(331936);
public static TagKeyScript DodgeTravelAngleOffset = new TagKeyScript(332544); public static TagKeyScript DodgeTravelAngleOffset = new(332544);
public static TagKeyInt TargetDoesntRequireActor = new TagKeyInt(328615); public static TagKeyInt TargetDoesntRequireActor = new(328615);
public static TagKeyInt CancelsOtherPowers = new TagKeyInt(328560); public static TagKeyInt CancelsOtherPowers = new(328560);
public static TagKeyInt NoInterruptTimer = new TagKeyInt(684880); public static TagKeyInt NoInterruptTimer = new(684880);
public static TagKeyScript FuryCoefficient = new TagKeyScript(332180); public static TagKeyScript FuryCoefficient = new(332180);
public static TagKeyInt BrainActionType = new TagKeyInt(328704); public static TagKeyInt BrainActionType = new(328704);
public static TagKeyScript AIActionDurationMin = new TagKeyScript(332864); public static TagKeyScript AIActionDurationMin = new(332864);
public static TagKeyScript WhirlwindDurationMin = new TagKeyScript(361504); public static TagKeyScript WhirlwindDurationMin = new(361504);
public static TagKeyScript WhirlwindMovementSpeed = new TagKeyScript(361521); public static TagKeyScript WhirlwindMovementSpeed = new(361521);
public static TagKeyScript KnockbackGravityMin = new TagKeyScript(331708); public static TagKeyScript KnockbackGravityMin = new(331708);
public static TagKeyScript KnockbackHeightMin = new TagKeyScript(331704); public static TagKeyScript KnockbackHeightMin = new(331704);
public static TagKeyScript HitpointsGrantedByHeal = new TagKeyScript(331264); public static TagKeyScript HitpointsGrantedByHeal = new(331264);
public static TagKeySNO ChildPower = new TagKeySNO(327760); public static TagKeySNO ChildPower = new(327760);
public static TagKeyScript HearthTime = new TagKeyScript(643072); public static TagKeyScript HearthTime = new(643072);
public static TagKeyScript MovementSpeedPercentIncreaseMin = new TagKeyScript(332000); public static TagKeyScript MovementSpeedPercentIncreaseMin = new(332000);
public static TagKeyScript AttackSpeedPercentIncreaseMin = new TagKeyScript(331968); public static TagKeyScript AttackSpeedPercentIncreaseMin = new(331968);
public static TagKeyScript DamagePercentAll = new TagKeyScript(330752); public static TagKeyScript DamagePercentAll = new(330752);
public static TagKeySNO ProjectileWallFloorExplosion = new TagKeySNO(262410); public static TagKeySNO ProjectileWallFloorExplosion = new(262410);
public static TagKeyInt OnlyFreeCast = new TagKeyInt(329633); public static TagKeyInt OnlyFreeCast = new(329633);
public static TagKeyInt ProcTargetsSelf = new TagKeyInt(328440); public static TagKeyInt ProcTargetsSelf = new(328440);
public static TagKeyScript ScriptFormula24 = new TagKeyScript(267072); public static TagKeyScript ScriptFormula24 = new(267072);
public static TagKeyScript HealthCost = new TagKeyScript(329632); public static TagKeyScript HealthCost = new(329632);
public static TagKeyScript WalkingDistanceMin = new TagKeyScript(331960); public static TagKeyScript WalkingDistanceMin = new(331960);
public static TagKeyInt AnimationTagRuneC = new TagKeyInt(262675); public static TagKeyInt AnimationTagRuneC = new(262675);
public static TagKeyScript IsInvisibleDuring = new TagKeyScript(340141); public static TagKeyScript IsInvisibleDuring = new(340141);
public static TagKeyInt SetTargetAfterIntro = new TagKeyInt(328292); public static TagKeyInt SetTargetAfterIntro = new(328292);
public static TagKeyScript MinWalkDuration = new TagKeyScript(328535); public static TagKeyScript MinWalkDuration = new(328535);
public static TagKeyScript ScriptFormula27 = new TagKeyScript(267120); public static TagKeyScript ScriptFormula27 = new(267120);
public static TagKeyInt AnimationTagRuneB = new TagKeyInt(262674); public static TagKeyInt AnimationTagRuneB = new(262674);
public static TagKeyInt AnimationTagRuneA = new TagKeyInt(262673); public static TagKeyInt AnimationTagRuneA = new(262673);
public static TagKeyScript AIActionDurationDelta = new TagKeyScript(332880); public static TagKeyScript AIActionDurationDelta = new(332880);
public static TagKeyInt UsesWeaponRange = new TagKeyInt(328607); public static TagKeyInt UsesWeaponRange = new(328607);
public static TagKeySNO Combo1ContactFrameEffectGroup_Male = new TagKeySNO(264305); public static TagKeySNO Combo1ContactFrameEffectGroup_Male = new(264305);
public static TagKeySNO Combo1ContactFrameEffectGroup_Female = new TagKeySNO(264337); public static TagKeySNO Combo1ContactFrameEffectGroup_Female = new(264337);
public static TagKeySNO Combo0ContactFrameEffectGroup_Male = new TagKeySNO(264304); public static TagKeySNO Combo0ContactFrameEffectGroup_Male = new(264304);
public static TagKeySNO Combo0ContactFrameEffectGroup_Female = new TagKeySNO(264336); public static TagKeySNO Combo0ContactFrameEffectGroup_Female = new(264336);
public static TagKeySNO Combo2ContactFrameEffectGroup_Male = new TagKeySNO(264306); public static TagKeySNO Combo2ContactFrameEffectGroup_Male = new(264306);
public static TagKeySNO Combo2ContactFrameEffectGroup_Female = new TagKeySNO(264338); public static TagKeySNO Combo2ContactFrameEffectGroup_Female = new(264338);
public static TagKeyInt Requires1HItem = new TagKeyInt(328976); public static TagKeyInt Requires1HItem = new(328976);
public static TagKeyScript SkeletonSummonMaxTotalCount = new TagKeyScript(332450); public static TagKeyScript SkeletonSummonMaxTotalCount = new(332450);
public static TagKeyScript SkeletonSummonCountPerSummon = new TagKeyScript(332448); public static TagKeyScript SkeletonSummonCountPerSummon = new(332448);
public static TagKeyInt PlaySummonedByMonsterAnimation = new TagKeyInt(331137); public static TagKeyInt PlaySummonedByMonsterAnimation = new(331137);
public static TagKeyScript SkeletonSummonMaxCount = new TagKeyScript(332449); public static TagKeyScript SkeletonSummonMaxCount = new(332449);
public static TagKeyScript SummonedActorLifeDuration = new TagKeyScript(331120); public static TagKeyScript SummonedActorLifeDuration = new(331120);
public static TagKeySNO ContactFrameEffectGroup_Male2 = new TagKeySNO(264194); public static TagKeySNO ContactFrameEffectGroup_Male2 = new(264194);
public static TagKeySNO ContactFrameEffectGroup_Female2 = new TagKeySNO(264277); public static TagKeySNO ContactFrameEffectGroup_Female2 = new(264277);
public static TagKeyInt ArcMoveUntilDestHeight = new TagKeyInt(328296); public static TagKeyInt ArcMoveUntilDestHeight = new(328296);
public static TagKeyScript RunInFrontDistance = new TagKeyScript(565248); public static TagKeyScript RunInFrontDistance = new(565248);
public static TagKeyScript SpecialWalkHeightIsRelativeToMax = new TagKeyScript(332338); public static TagKeyScript SpecialWalkHeightIsRelativeToMax = new(332338);
public static TagKeyScript SpecialWalkTrajectoryGravityDelta = new TagKeyScript(332337); public static TagKeyScript SpecialWalkTrajectoryGravityDelta = new(332337);
public static TagKeyScript SpecialWalkTrajectoryHeightDelta = new TagKeyScript(332321); public static TagKeyScript SpecialWalkTrajectoryHeightDelta = new(332321);
public static TagKeyScript PierceChance = new TagKeyScript(331040); public static TagKeyScript PierceChance = new(331040);
public static TagKeyInt CanPathDuringWalk = new TagKeyInt(328272); public static TagKeyInt CanPathDuringWalk = new(328272);
public static TagKeyScript UseSpecialWalkSteering = new TagKeyScript(328538); public static TagKeyScript UseSpecialWalkSteering = new(328538);
public static TagKeyInt UsesAnimTag2IfBuffExists = new TagKeyInt(266240); public static TagKeyInt UsesAnimTag2IfBuffExists = new(266240);
public static TagKeyInt IsEmote = new TagKeyInt(264704); public static TagKeyInt IsEmote = new(264704);
public static TagKeySNO EmoteConversationSNO = new TagKeySNO(264720); public static TagKeySNO EmoteConversationSNO = new(264720);
public static TagKeyInt SpellFuncCreate = new TagKeyInt(327697); public static TagKeyInt SpellFuncCreate = new(327697);
public static TagKeyScript NovaDelay = new TagKeyScript(655985); public static TagKeyScript NovaDelay = new(655985);
public static TagKeyScript AuraAffectedRadius = new TagKeyScript(331840); public static TagKeyScript AuraAffectedRadius = new(331840);
public static TagKeyScript BuffDurationBetweenPulses = new TagKeyScript(332768); public static TagKeyScript BuffDurationBetweenPulses = new(332768);
public static TagKeyScript PowerGainedPerSecond = new TagKeyScript(700435); public static TagKeyScript PowerGainedPerSecond = new(700435);
public static TagKeyScript ManaGainedPerSecond = new TagKeyScript(331520); public static TagKeyScript ManaGainedPerSecond = new(331520);
public static TagKeyScript FuryGenerationBonusPercent = new TagKeyScript(700434); public static TagKeyScript FuryGenerationBonusPercent = new(700434);
public static TagKeyScript SpiritGenerationBonusPercent = new TagKeyScript(700433); public static TagKeyScript SpiritGenerationBonusPercent = new(700433);
public static TagKeyScript ArcanumGainedPerSecond = new TagKeyScript(700432); public static TagKeyScript ArcanumGainedPerSecond = new(700432);
public static TagKeyScript PoisonDamageDelta = new TagKeyScript(330256); public static TagKeyScript PoisonDamageDelta = new(330256);
public static TagKeyScript PoisonDamageMin = new TagKeyScript(330240); public static TagKeyScript PoisonDamageMin = new(330240);
public static TagKeyScript PoisonCloudNumIntervals = new TagKeyScript(330992); public static TagKeyScript PoisonCloudNumIntervals = new(330992);
public static TagKeyScript PoisonCloudIntervalDuration = new TagKeyScript(330976); public static TagKeyScript PoisonCloudIntervalDuration = new(330976);
public static TagKeySNO TargetImpactParticle = new TagKeySNO(262405); public static TagKeySNO TargetImpactParticle = new(262405);
public static TagKeyInt IsPunch = new TagKeyInt(327792); public static TagKeyInt IsPunch = new(327792);
public static TagKeyInt Buff5ShowDuration = new TagKeyInt(271109); public static TagKeyInt Buff5ShowDuration = new(271109);
public static TagKeyInt Buff5PlayerCanCancel = new TagKeyInt(271365); public static TagKeyInt Buff5PlayerCanCancel = new(271365);
public static TagKeyInt Buff6ShowDuration = new TagKeyInt(271110); public static TagKeyInt Buff6ShowDuration = new(271110);
public static TagKeyInt Buff6PlayerCanCancel = new TagKeyInt(271366); public static TagKeyInt Buff6PlayerCanCancel = new(271366);
public static TagKeyInt Buff6Icon = new TagKeyInt(270598); public static TagKeyInt Buff6Icon = new(270598);
public static TagKeyInt Buff5Icon = new TagKeyInt(270597); public static TagKeyInt Buff5Icon = new(270597);
public static TagKeyInt SnapsToGround = new TagKeyInt(328496); public static TagKeyInt SnapsToGround = new(328496);
public static TagKeyInt CanUseWhenDead = new TagKeyInt(328528); public static TagKeyInt CanUseWhenDead = new(328528);
public static TagKeyScript BlindDurationMin = new TagKeyScript(684577); public static TagKeyScript BlindDurationMin = new(684577);
public static TagKeyScript PayloadParam1 = new TagKeyScript(329792); public static TagKeyScript PayloadParam1 = new(329792);
public static TagKeyScript BlindDurationDelta = new TagKeyScript(684578); public static TagKeyScript BlindDurationDelta = new(684578);
public static TagKeyScript CanUseWhenFeared = new TagKeyScript(328512); public static TagKeyScript CanUseWhenFeared = new(328512);
public static TagKeyScript ResurrectionBuffTime = new TagKeyScript(647168); public static TagKeyScript ResurrectionBuffTime = new(647168);
public static TagKeyScript ResurrectionHealthMultiplierToStart = new TagKeyScript(651264); public static TagKeyScript ResurrectionHealthMultiplierToStart = new(651264);
public static TagKeyScript ProjectileCount = new TagKeyScript(331193); public static TagKeyScript ProjectileCount = new(331193);
public static TagKeyScript ProjectileJitter = new TagKeyScript(331196); public static TagKeyScript ProjectileJitter = new(331196);
public static TagKeySNO RootGrabPower = new TagKeySNO(606208); public static TagKeySNO RootGrabPower = new(606208);
public static TagKeyScript RootTimerModificationPerStruggle = new TagKeyScript(360960); public static TagKeyScript RootTimerModificationPerStruggle = new(360960);
public static TagKeyScript PercentofDamageThatShieldCanAbsorb = new TagKeyScript(332641); public static TagKeyScript PercentofDamageThatShieldCanAbsorb = new(332641);
public static TagKeyScript AnatomyCritBonusPercent = new TagKeyScript(413696); public static TagKeyScript AnatomyCritBonusPercent = new(413696);
public static TagKeyScript VanishDuration = new TagKeyScript(458752); public static TagKeyScript VanishDuration = new(458752);
public static TagKeyScript HitpointsThatShieldCanAbsorb = new TagKeyScript(332640); public static TagKeyScript HitpointsThatShieldCanAbsorb = new(332640);
public static TagKeyScript ShrineBuffRadius = new TagKeyScript(633603); public static TagKeyScript ShrineBuffRadius = new(633603);
public static TagKeyInt ShrineBuffAllies = new TagKeyInt(633602); public static TagKeyInt ShrineBuffAllies = new(633602);
public static TagKeyScript ScaleBonus = new TagKeyScript(332024); public static TagKeyScript ScaleBonus = new(332024);
public static TagKeyScript DefensePercentAll = new TagKeyScript(330768); public static TagKeyScript DefensePercentAll = new(330768);
public static TagKeyScript BonusHitpointPercent = new TagKeyScript(331568); public static TagKeyScript BonusHitpointPercent = new(331568);
public static TagKeyScript ShrineBuffBonus = new TagKeyScript(633601); public static TagKeyScript ShrineBuffBonus = new(633601);
public static TagKeyInt SummonedAnimationTag = new TagKeyInt(332451); public static TagKeyInt SummonedAnimationTag = new(332451);
public static TagKeyScript ArcaneDamageMin = new TagKeyScript(330304); public static TagKeyScript ArcaneDamageMin = new(330304);
public static TagKeyScript ArcaneDamageDelta = new TagKeyScript(330320); public static TagKeyScript ArcaneDamageDelta = new(330320);
public static TagKeyScript BlizzardInitialImpactDelay = new TagKeyScript(332080); public static TagKeyScript BlizzardInitialImpactDelay = new(332080);
public static TagKeySNO ChainRope = new TagKeySNO(262403); public static TagKeySNO ChainRope = new(262403);
public static TagKeyScript ImmobilizeDurationDelta = new TagKeyScript(330880); public static TagKeyScript ImmobilizeDurationDelta = new(330880);
public static TagKeyScript WebDurationDelta = new TagKeyScript(330848); public static TagKeyScript WebDurationDelta = new(330848);
public static TagKeyScript ImmobilizeDurationMin = new TagKeyScript(330864); public static TagKeyScript ImmobilizeDurationMin = new(330864);
public static TagKeyScript WebDurationMin = new TagKeyScript(330832); public static TagKeyScript WebDurationMin = new(330832);
public static TagKeyInt IsToggleable = new TagKeyInt(327952); public static TagKeyInt IsToggleable = new(327952);
public static TagKeyScript SlowDurationMin = new TagKeyScript(330896); public static TagKeyScript SlowDurationMin = new(330896);
public static TagKeyInt IsUsableInCombat = new TagKeyInt(328081); public static TagKeyInt IsUsableInCombat = new(328081);
public static TagKeyInt CastTargetGroundOnly = new TagKeyInt(328161); public static TagKeyInt CastTargetGroundOnly = new(328161);
public static TagKeyInt CausesKnockback = new TagKeyInt(331697); public static TagKeyInt CausesKnockback = new(331697);
public static TagKeyInt ClientControlsFacing = new TagKeyInt(328022); public static TagKeyInt ClientControlsFacing = new(328022);
public static TagKeyScript DisintegrateBeamWidth = new TagKeyScript(332304); public static TagKeyScript DisintegrateBeamWidth = new(332304);
public static TagKeyScript DisintegrateTimeBetweenUpdates = new TagKeyScript(332688); public static TagKeyScript DisintegrateTimeBetweenUpdates = new(332688);
public static TagKeyInt CustomTargetBuffPowerSNOBuffIndex = new TagKeyInt(328801); public static TagKeyInt CustomTargetBuffPowerSNOBuffIndex = new(328801);
public static TagKeyInt ProjectileThrowOverGuys = new TagKeyInt(262408); public static TagKeyInt ProjectileThrowOverGuys = new(262408);
public static TagKeyInt IsLobbed = new TagKeyInt(327872); public static TagKeyInt IsLobbed = new(327872);
public static TagKeyScript DurationDelta = new TagKeyScript(684930); public static TagKeyScript DurationDelta = new(684930);
public static TagKeyScript DurationMin = new TagKeyScript(684929); public static TagKeyScript DurationMin = new(684929);
public static TagKeyInt UsesWeaponProjectile = new TagKeyInt(262480); public static TagKeyInt UsesWeaponProjectile = new(262480);
public static TagKeyScript ModalCursorRadius = new TagKeyScript(328069); public static TagKeyScript ModalCursorRadius = new(328069);
public static TagKeyFloat ProjectileGravity = new TagKeyFloat(329872); public static TagKeyFloat ProjectileGravity = new(329872);
public static TagKeyInt ProjectileScaleVelocity = new TagKeyInt(262435); public static TagKeyInt ProjectileScaleVelocity = new(262435);
public static TagKeyScript HeightAboveSource = new TagKeyScript(329880); public static TagKeyScript HeightAboveSource = new(329880);
public static TagKeyScript ProjectileSpreadAngle = new TagKeyScript(331194); public static TagKeyScript ProjectileSpreadAngle = new(331194);
public static TagKeyFloat CustomTargetNeedsHealHPPercent = new TagKeyFloat(328804); public static TagKeyFloat CustomTargetNeedsHealHPPercent = new(328804);
public static TagKeyScript EnergyShieldManaCostPerDamage = new TagKeyScript(332576); public static TagKeyScript EnergyShieldManaCostPerDamage = new(332576);
public static TagKeySNO SynergyPower = new TagKeySNO(327764); public static TagKeySNO SynergyPower = new(327764);
public static TagKeyInt IsUpgrade = new TagKeyInt(329216); public static TagKeyInt IsUpgrade = new(329216);
public static TagKeyFloat AnimationTurnThreshold = new TagKeyFloat(263426); public static TagKeyFloat AnimationTurnThreshold = new(263426);
public static TagKeyInt AnimationTagTurnRight = new TagKeyInt(263425); public static TagKeyInt AnimationTagTurnRight = new(263425);
public static TagKeyInt AnimationTagTurnLeft = new TagKeyInt(263424); public static TagKeyInt AnimationTagTurnLeft = new(263424);
public static TagKeyInt IsOnlyUsableInTownPortalAreas = new TagKeyInt(328082); public static TagKeyInt IsOnlyUsableInTownPortalAreas = new(328082);
public static TagKeyInt IsCancellableByWalking = new TagKeyInt(328546); public static TagKeyInt IsCancellableByWalking = new(328546);
public static TagKeyInt FollowWalkAnimTag = new TagKeyInt(561424); public static TagKeyInt FollowWalkAnimTag = new(561424);
public static TagKeyInt FollowMatchTargetSpeed = new TagKeyInt(561408); public static TagKeyInt FollowMatchTargetSpeed = new(561408);
public static TagKeyScript RunNearbyDistanceMin = new TagKeyScript(332416); public static TagKeyScript RunNearbyDistanceMin = new(332416);
public static TagKeyScript RunNearbyDistanceDelta = new TagKeyScript(332432); public static TagKeyScript RunNearbyDistanceDelta = new(332432);
public static TagKeyScript FollowStartDistance = new TagKeyScript(561152); public static TagKeyScript FollowStartDistance = new(561152);
public static TagKeyScript FollowStopDistance = new TagKeyScript(557056); public static TagKeyScript FollowStopDistance = new(557056);
public static TagKeyInt Buff5IsHarmful = new TagKeyInt(270853); public static TagKeyInt Buff5IsHarmful = new(270853);
public static TagKeySNO Buff5EffectGroup = new TagKeySNO(270341); public static TagKeySNO Buff5EffectGroup = new(270341);
public static TagKeyInt Buff4IsHarmful = new TagKeyInt(270852); public static TagKeyInt Buff4IsHarmful = new(270852);
public static TagKeyScript HolyDamageMin = new TagKeyScript(330496); public static TagKeyScript HolyDamageMin = new(330496);
public static TagKeyScript HolyDamageDelta = new TagKeyScript(330512); public static TagKeyScript HolyDamageDelta = new(330512);
public static TagKeyScript DestinationJitterAttempts = new TagKeyScript(360704); public static TagKeyScript DestinationJitterAttempts = new(360704);
public static TagKeyScript DestinationJitterRadius = new TagKeyScript(360448); public static TagKeyScript DestinationJitterRadius = new(360448);
public static TagKeyInt RootEndFunc = new TagKeyInt(606464); public static TagKeyInt RootEndFunc = new(606464);
public static TagKeySNO ConsumesItem = new TagKeySNO(329088); public static TagKeySNO ConsumesItem = new(329088);
public static TagKeyScript DebuffDurationMin = new TagKeyScript(655680); public static TagKeyScript DebuffDurationMin = new(655680);
public static TagKeyScript ProcChance = new TagKeyScript(680704); public static TagKeyScript ProcChance = new(680704);
public static TagKeySNO Upgrade2 = new TagKeySNO(329264); public static TagKeySNO Upgrade2 = new(329264);
public static TagKeySNO Upgrade1 = new TagKeySNO(329248); public static TagKeySNO Upgrade1 = new(329248);
public static TagKeySNO Upgrade0 = new TagKeySNO(329232); public static TagKeySNO Upgrade0 = new(329232);
public static TagKeyScript FreezeDamageDoneMin = new TagKeyScript(331232); public static TagKeyScript FreezeDamageDoneMin = new(331232);
public static TagKeyScript AttackRatingPercent = new TagKeyScript(329904); public static TagKeyScript AttackRatingPercent = new(329904);
public static TagKeyScript SummoningMachineNodeIsInvulnerable = new TagKeyScript(704512); public static TagKeyScript SummoningMachineNodeIsInvulnerable = new(704512);
public static TagKeySNO DamageDisplayPower = new TagKeySNO(627456); public static TagKeySNO DamageDisplayPower = new(627456);
public static TagKeySNO Buff6EffectGroup = new TagKeySNO(270342); public static TagKeySNO Buff6EffectGroup = new(270342);
public static TagKeyInt Buff6IsHarmful = new TagKeyInt(270854); public static TagKeyInt Buff6IsHarmful = new(270854);
public static TagKeyScript DodgeTravelDistanceDelta = new TagKeyScript(332400); public static TagKeyScript DodgeTravelDistanceDelta = new(332400);
public static TagKeySNO Buff7EffectGroup = new TagKeySNO(270343); public static TagKeySNO Buff7EffectGroup = new(270343);
public static TagKeyInt ComboAnimation1RuneA = new TagKeyInt(263185); public static TagKeyInt ComboAnimation1RuneA = new(263185);
public static TagKeyScript KnockbackGravityDelta = new TagKeyScript(331709); public static TagKeyScript KnockbackGravityDelta = new(331709);
public static TagKeyScript KnockbackHeightDelta = new TagKeyScript(331705); public static TagKeyScript KnockbackHeightDelta = new(331705);
public static TagKeyScript FuryAddPerInterval = new TagKeyScript(332178); public static TagKeyScript FuryAddPerInterval = new(332178);
public static TagKeyScript FuryDegenerationOutofCombat_persecond = new TagKeyScript(332177); public static TagKeyScript FuryDegenerationOutofCombat_persecond = new(332177);
public static TagKeyScript FuryGainedPerSecondOfAttack = new TagKeyScript(332097); public static TagKeyScript FuryGainedPerSecondOfAttack = new(332097);
public static TagKeyScript FuryTimeBetweenUpdates = new TagKeyScript(333056); public static TagKeyScript FuryTimeBetweenUpdates = new(333056);
public static TagKeyScript FuryDegenerationStart_inseconds = new TagKeyScript(332181); public static TagKeyScript FuryDegenerationStart_inseconds = new(332181);
public static TagKeyScript FuryGainedPerPercentHealthLost = new TagKeyScript(332096); public static TagKeyScript FuryGainedPerPercentHealthLost = new(332096);
public static TagKeyScript FuryMaxDamageBonus = new TagKeyScript(332185); public static TagKeyScript FuryMaxDamageBonus = new(332185);
public static TagKeyScript SlowTimeAmount = new TagKeyScript(330944); public static TagKeyScript SlowTimeAmount = new(330944);
public static TagKeyScript SlowAmount = new TagKeyScript(330928); public static TagKeyScript SlowAmount = new(330928);
public static TagKeyInt ComboAnimation1RuneC = new TagKeyInt(263187); public static TagKeyInt ComboAnimation1RuneC = new(263187);
public static TagKeyInt ComboAnimation1RuneE = new TagKeyInt(263189); public static TagKeyInt ComboAnimation1RuneE = new(263189);
public static TagKeyInt ComboAnimation1RuneD = new TagKeyInt(263188); public static TagKeyInt ComboAnimation1RuneD = new(263188);
public static TagKeyInt ComboAnimation1RuneB = new TagKeyInt(263186); public static TagKeyInt ComboAnimation1RuneB = new(263186);
public static TagKeyInt ComboAnimation3RuneC = new TagKeyInt(263219); public static TagKeyInt ComboAnimation3RuneC = new(263219);
public static TagKeyInt AnimationTagRuneD = new TagKeyInt(262676); public static TagKeyInt AnimationTagRuneD = new(262676);
public static TagKeyScript GenericBuffAttribute0AndParameter = new TagKeyScript(655618); public static TagKeyScript GenericBuffAttribute0AndParameter = new(655618);
public static TagKeyScript GenericBuffAttribute1AndParameter = new TagKeyScript(655634); public static TagKeyScript GenericBuffAttribute1AndParameter = new(655634);
public static TagKeyInt SpecialWalkGoThroughOccluded = new TagKeyInt(332341); public static TagKeyInt SpecialWalkGoThroughOccluded = new(332341);
public static TagKeyScript ProcCoefficient = new TagKeyScript(329983); public static TagKeyScript ProcCoefficient = new(329983);
} }
} }

View File

@ -953,7 +953,7 @@ namespace DiIiS_NA.D3_GameServer.GSSystem.GameSystem
if (QuestManager.Game.GetWorld(world).CheckLocationForFlag(point, Scene.NavCellFlags.AllowWalk)) if (QuestManager.Game.GetWorld(world).CheckLocationForFlag(point, Scene.NavCellFlags.AllowWalk))
break; 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++; monsterCount++;
} }
} // Need additional monster spawn, there are few of them } // Need additional monster spawn, there are few of them

View File

@ -13,35 +13,36 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem
public class MonsterLayout public class MonsterLayout
{ {
public bool lazy_load; public bool LazyLoad { get; set; }
public int additional_density; public int AdditionalDensity { get; set; }
public bool can_spawn_goblin; public bool CanSpawnGoblin { get; set; }
public List<int> melee; public List<int> Melee { get; set; }
public List<int> range;
public List<int> dangerous; public List<int> Range { get; set; }
public List<int> Dangerous { get; set; }
}; };
public static List<int> TotalMonsters(int la) public static List<int> TotalMonsters(int la)
{ {
List<int> total = new List<int> { }; List<int> total = new List<int> { };
total.AddRange(Spawns[la].melee); total.AddRange(Spawns[la].Melee);
total.AddRange(Spawns[la].range); total.AddRange(Spawns[la].Range);
total.AddRange(Spawns[la].dangerous); total.AddRange(Spawns[la].Dangerous);
return total; 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() public static void RegenerateDensity()
{ {
Logger.Info("Regenerating spawn density map..."); Logger.Info("Regenerating spawn density map...");
foreach (var spawn in Spawns) 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<int, MonsterLayout> Spawns = new() public static readonly Dictionary<int, MonsterLayout> Spawns = new()
{ {
#region Act I #region Act I
{91324, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 6652, 203121, 6644 }, range = new List<int>{ 219725 }, dangerous = new List<int>{ 218339 }}}, //REMOVED 4982 QUILL FIEND (OP damage) //road to Old Tristram ruins {91324, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 6652, 203121, 6644 }, Range = new List<int>{ 219725 }, Dangerous = new List<int>{ 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<int>{ 6652, 203121, 6644 }, range = new List<int>{ 219725 }, dangerous = new List<int>{ 218345, 218431 }}}, //REMOVED 4982 QUILL FIEND (OP damage) //Old Tristram ruins {101351, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 6652, 203121, 6644 }, Range = new List<int>{ 219725 }, Dangerous = new List<int>{ 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<int>{ 6652, 5393 }, range = new List<int>{ 5346 }, dangerous = new List<int>{ 218666, 218321 }}}, //Cath, outside {19933, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 6652, 5393 }, Range = new List<int>{ 5346 }, Dangerous = new List<int>{ 218666, 218321 }}}, //Cath, outside
{19954, new MonsterLayout{ lazy_load = true, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 6652, 203121, 6632, 5393, 6653 }, range = new List<int>{ 219725, 3847, 6639 }, dangerous = new List<int>{ 218332, 85900 }}}, //REMOVED 4982 QUILL FIEND (OP damage) + 5235 SCAVENGER (jump mechanic nukes) //The Weeping Hollow {19954, new MonsterLayout{ LazyLoad = true, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 6652, 203121, 6632, 5393, 6653 }, Range = new List<int>{ 219725, 3847, 6639 }, Dangerous = new List<int>{ 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<int>{ 5393, 6653 }, range = new List<int>{ 5387 }, dangerous = new List<int>{ 220683 }}}, //Tristram Graveyard {72712, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 5393, 6653 }, Range = new List<int>{ 5387 }, Dangerous = new List<int>{ 220683 }}}, //Tristram Graveyard
{83264, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 5393, 3848, 5395, 5411, 6653, 4156 }, range = new List<int>{ 5346, 3847, 6639 }, dangerous = new List<int>{ 225502 }}}, // REMOVED ID 5235 SCAVENGER (OP jump mechanic) //Cursed crypt 1 {83264, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 5393, 3848, 5395, 5411, 6653, 4156 }, Range = new List<int>{ 5346, 3847, 6639 }, Dangerous = new List<int>{ 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<int>{ 5393, 3848, 5395, 5411, 6653, 4156 }, range = new List<int>{ 5346, 3847, 6639 }, dangerous = new List<int>{ 225502 }}}, // REMOVED ID 5235 SCAVENGER (OP jump mechanic) //Cursed crypt 2 {83265, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 5393, 3848, 5395, 5411, 6653, 4156 }, Range = new List<int>{ 5346, 3847, 6639 }, Dangerous = new List<int>{ 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<int>{ 5393, 3848, 5395, 5411, 6653 }, range = new List<int>{ 5346, 3847, 6639 }, dangerous = new List<int>{ 218348, 218351 }}}, // REMOVED ID 5235 SCAVENGER (OP jump mechanic) //Cursed crypt 3 (true) {154588, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 5393, 3848, 5395, 5411, 6653 }, Range = new List<int>{ 5346, 3847, 6639 }, Dangerous = new List<int>{ 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<int>{ 5393 }, range = new List<int>{ 5387 }, dangerous = new List<int>{}}}, //Chancellor's Tomb {102362, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 5393 }, Range = new List<int>{ 5387 }, Dangerous = new List<int>{}}}, //Chancellor's Tomb
{19952, new MonsterLayout{ lazy_load = true, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 4282, 4285, 3337, 5236, 5235 }, range = new List<int>{ 4290, 4286 }, dangerous = new List<int>{ 218422, 218424, 218428 }}}, //Fields of Misery {19952, new MonsterLayout{ LazyLoad = true, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 4282, 4285, 3337, 5236, 5235 }, Range = new List<int>{ 4290, 4286 }, Dangerous = new List<int>{ 218422, 218424, 218428 }}}, //Fields of Misery
{19953, new MonsterLayout{ lazy_load = true, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 5395, 4153, 4201, 5275 }, range = new List<int>{ 5347 }, dangerous = new List<int>{ 209553, 218444, 218441 }}}, //The Festering Woods {19953, new MonsterLayout{ LazyLoad = true, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 5395, 4153, 4201, 5275 }, Range = new List<int>{ 5347 }, Dangerous = new List<int>{ 209553, 218444, 218441 }}}, //The Festering Woods
{60397, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 5395 }, range = new List<int>{ 5388 }, dangerous = new List<int>{}}}, //Crypt of the Ancients {60397, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 5395 }, Range = new List<int>{ 5388 }, Dangerous = new List<int>{}}}, //Crypt of the Ancients
{60396, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 5395 }, range = new List<int>{ 179343, 5347 }, dangerous = new List<int>{}}}, //Warrior's Rest {60396, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 5395 }, Range = new List<int>{ 179343, 5347 }, Dangerous = new List<int>{}}}, //Warrior's Rest
{60398, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 5276, 6025 }, range = new List<int>{ 5347, 5388 }, dangerous = new List<int>{}}}, //Drowned Temple {60398, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 5276, 6025 }, Range = new List<int>{ 5347, 5388 }, Dangerous = new List<int>{}}}, //Drowned Temple
{19780, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 5275, 6652,4156, 6646, 6644 }, range = new List<int>{ 5346 }, dangerous = new List<int>{ 218307, 218308 }}}, //Cathedral, lvl. 1 {19780, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 5275, 6652,4156, 6646, 6644 }, Range = new List<int>{ 5346 }, Dangerous = new List<int>{ 218307, 218308 }}}, //Cathedral, lvl. 1
{19783, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 5393, 5275, 6356, 4156 }, range = new List<int>{ 5346, 5387 }, dangerous = new List<int>{ 218656, 218356, 218362, 218364 }}}, //Cathedral, lvl. 2 {19783, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 5393, 5275, 6356, 4156 }, Range = new List<int>{ 5346, 5387 }, Dangerous = new List<int>{ 218656, 218356, 218362, 218364 }}}, //Cathedral, lvl. 2
{87907, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 5393, 6024, 5275 }, range = new List<int>{ 5387 }, dangerous = new List<int>{}}}, //Cathedral, lvl. 3 (Kormac) {87907, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 5393, 6024, 5275 }, Range = new List<int>{ 5387 }, Dangerous = new List<int>{}}}, //Cathedral, lvl. 3 (Kormac)
{19785, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 5393, 3848, 5395, 5275, 4156, 3893 }, range = new List<int>{ 5346, 5387, 3847 }, dangerous = new List<int>{ 218396, 218405, }}}, //Cathedral, lvl. 4 {19785, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 5393, 3848, 5395, 5275, 4156, 3893 }, Range = new List<int>{ 5346, 5387, 3847 }, Dangerous = new List<int>{ 218396, 218405, }}}, //Cathedral, lvl. 4
{19787, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 5393, 5275 }, range = new List<int>{ 5346 }, dangerous = new List<int>{}}}, //The Royal Crypts {19787, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 5393, 5275 }, Range = new List<int>{ 5346 }, Dangerous = new List<int>{}}}, //The Royal Crypts
//{129795, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 5393 }, range = new List<int>{ 5346 }, dangerous = new List<int>{}}}, //Wortham Rocks //{129795, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 5393 }, range = new List<int>{ 5346 }, dangerous = new List<int>{}}}, //Wortham Rocks
{78572, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 5467, 5474, 4157, 4153 }, range = new List<int>{ 166726, 122367 }, dangerous = new List<int>{ 129439, 218462, 218458, 218456, 218448 }}}, //Caves of Aranea {78572, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 5467, 5474, 4157, 4153 }, Range = new List<int>{ 166726, 122367 }, Dangerous = new List<int>{ 129439, 218462, 218458, 218456, 218448 }}}, //Caves of Aranea
{93632, new MonsterLayout{ lazy_load = true, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 4283, 5236 }, range = new List<int>{ 6500, 4287, 4290 }, dangerous = new List<int>{ 218469 }}}, //Highlands Crossing {93632, new MonsterLayout{ LazyLoad = true, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 4283, 5236 }, Range = new List<int>{ 6500, 4287, 4290 }, Dangerous = new List<int>{ 218469 }}}, //Highlands Crossing
{19940, new MonsterLayout{ lazy_load = true, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 4282, 4283, 4285, 3337, 3338, 5236 }, range = new List<int>{ 4287, 6500, 375, 4290, 4286, 6024 }, dangerous = new List<int>{ 218508, 218536, 218473, 111580, 76676 }}}, //Southern highlands {19940, new MonsterLayout{ LazyLoad = true, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 4282, 4283, 4285, 3337, 3338, 5236 }, Range = new List<int>{ 4287, 6500, 375, 4290, 4286, 6024 }, Dangerous = new List<int>{ 218508, 218536, 218473, 111580, 76676 }}}, //Southern highlands
{19941, new MonsterLayout{ lazy_load = true, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 4282, 4283, 3338, 4154, 195747 }, range = new List<int>{ 4287, 375, 4290, 6500 }, dangerous = new List<int>{}}}, //Northern highlands {19941, new MonsterLayout{ LazyLoad = true, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 4282, 4283, 3338, 4154, 195747 }, Range = new List<int>{ 4287, 375, 4290, 6500 }, Dangerous = new List<int>{}}}, //Northern highlands
{19774, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 6042, 6052, 6024, 6359, 6654, 90453, 6647, 104424, 178300 }, range = new List<int>{ 6046 }, dangerous = new List<int>{ 218674, 218672, 218676, 105959 }}}, //Halls of Agony, lv. 1 {19774, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 6042, 6052, 6024, 6359, 6654, 90453, 6647, 104424, 178300 }, Range = new List<int>{ 6046 }, Dangerous = new List<int>{ 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<int>{ 6042, 6052, 6024, 6359, 6654, 90453, 6647, 104424, 178300 }, range = new List<int>{ 6046 }, dangerous = new List<int>{}}}, //Halls of Agony, lv. 2 {19775, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 6042, 6052, 6024, 6359, 6654, 90453, 6647, 104424, 178300 }, Range = new List<int>{ 6046 }, Dangerous = new List<int>{}}}, //Halls of Agony, lv. 2
{94672, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 4203, 3849, 434 }, range = new List<int>{ 5389 }, dangerous = new List<int>{}}}, //The Cursed Hold {94672, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 4203, 3849, 434 }, Range = new List<int>{ 5389 }, Dangerous = new List<int>{}}}, //The Cursed Hold
{19776, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 6042, 6052, 6024, 6654, 90453, 6647, 104424, 178300 }, range = new List<int>{ 6046 }, dangerous = new List<int>{ 105620, 220034, 218678 }}}, //Halls of Agony, lv. 3 {19776, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 6042, 6052, 6024, 6654, 90453, 6647, 104424, 178300 }, Range = new List<int>{ 6046 }, Dangerous = new List<int>{ 105620, 220034, 218678 }}}, //Halls of Agony, lv. 3
{80116, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 6052, 6024, 5395, 5275, 178300 }, range = new List<int>{ 5346, 5387 }, dangerous = new List<int>{}}}, //The Lyceum {80116, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 6052, 6024, 5395, 5275, 178300 }, Range = new List<int>{ 5346, 5387 }, Dangerous = new List<int>{}}}, //The Lyceum
{82326, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 6024, 4201, 5395, 434, 5276, 5393 }, range = new List<int>{ 5346 }, dangerous = new List<int>{}}}, //Watch Tower, lv. 1 {82326, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 6024, 4201, 5395, 434, 5276, 5393 }, Range = new List<int>{ 5346 }, Dangerous = new List<int>{}}}, //Watch Tower, lv. 1
{82327, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 6024, 4201, 5395, 434, 5276, 5393 }, range = new List<int>{ 5346 }, dangerous = new List<int>{}}}, //Watch Tower, lv. 2 {82327, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 6024, 4201, 5395, 434, 5276, 5393 }, Range = new List<int>{ 5346 }, Dangerous = new List<int>{}}}, //Watch Tower, lv. 2
{135952, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 6042,6052, 6024, 6359, 178300 }, range = new List<int>{ 6046 }, dangerous = new List<int>{}}}, //Highlands Cave {135952, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 6042,6052, 6024, 6359, 178300 }, Range = new List<int>{ 6046 }, Dangerous = new List<int>{}}}, //Highlands Cave
{100854, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 6042, 6024 }, range = new List<int>{ 6046 }, dangerous = new List<int>{ 218656, 218662, 218664 }}}, //Leoric's Manor {100854, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 6042, 6024 }, Range = new List<int>{ 6046 }, Dangerous = new List<int>{ 218656, 218662, 218664 }}}, //Leoric's Manor
{19935, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 6052, 6025, 178300 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Wortham {19935, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 6052, 6025, 178300 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Wortham
{87832, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 6052, 6024, 6027, 4283, 178300 }, range = new List<int>{ 4287, 4290 }, dangerous = new List<int>{}}}, //Highlands Passage {87832, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 6052, 6024, 6027, 4283, 178300 }, Range = new List<int>{ 4287, 4290 }, Dangerous = new List<int>{}}}, //Highlands Passage
{1199, new MonsterLayout{ lazy_load = true, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 6024, 4283, 3338 }, range = new List<int>{ 4287, 4290, 4286 }, dangerous = new List<int>{}}}, //Leoric's Hunting Grounds {1199, new MonsterLayout{ LazyLoad = true, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 6024, 4283, 3338 }, Range = new List<int>{ 4287, 4290, 4286 }, Dangerous = new List<int>{}}}, //Leoric's Hunting Grounds
{119893, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 6024, 178213, 4285 }, range = new List<int>{ 4286 }, dangerous = new List<int>{}}}, //Khazra Den {119893, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 6024, 178213, 4285 }, Range = new List<int>{ 4286 }, Dangerous = new List<int>{}}}, //Khazra Den
{148551, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 51281 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Cells of the Condemned {148551, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 51281 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Cells of the Condemned
{19553, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 4157, 5393, 136943, 370, 5395 }, range = new List<int>{ 4153, 5347 }, dangerous = new List<int>{ 209553, 218444, 218441 }}}, //The Festering Woods {19553, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 4157, 5393, 136943, 370, 5395 }, Range = new List<int>{ 4153, 5347 }, Dangerous = new List<int>{ 209553, 218444, 218441 }}}, //The Festering Woods
{82566, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 4282, 4283, 5467 }, range = new List<int>{ 4287, 4290 }, dangerous = new List<int>{}}}, //Cave of the Moon Clan, Lv.1 {82566, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 4282, 4283, 5467 }, Range = new List<int>{ 4287, 4290 }, Dangerous = new List<int>{}}}, //Cave of the Moon Clan, Lv.1
{82567, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 4282, 4283, 5467 }, range = new List<int>{ 4287, 4290 }, dangerous = new List<int>{}}}, //Cave of the Moon Clan, Lv.2 {82567, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 4282, 4283, 5467 }, Range = new List<int>{ 4287, 4290 }, Dangerous = new List<int>{}}}, //Cave of the Moon Clan, Lv.2
{179212, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 4285, 5235 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Sheltered Cottage {179212, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 4285, 5235 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Sheltered Cottage
{82372, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 5236, 6360, 4157, 4983 }, range = new List<int>{ 4153 }, dangerous = new List<int>{}}}, //Lost Mine, Lv.1 {82372, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 5236, 6360, 4157, 4983 }, Range = new List<int>{ 4153 }, Dangerous = new List<int>{}}}, //Lost Mine, Lv.1
{82373, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 5236, 6360, 4157, 4983 }, range = new List<int>{ 4153 }, dangerous = new List<int>{}}}, //Lost Mine, Lv.2 {82373, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 5236, 6360, 4157, 4983 }, Range = new List<int>{ 4153 }, Dangerous = new List<int>{}}}, //Lost Mine, Lv.2
{81165, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 5236, 4157, 4983 }, range = new List<int>{ 4153 }, dangerous = new List<int>{}}}, //Scavenger's Den, Lv.1 {81165, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 5236, 4157, 4983 }, Range = new List<int>{ 4153 }, Dangerous = new List<int>{}}}, //Scavenger's Den, Lv.1
{81175, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 5236, 4157, 4983 }, range = new List<int>{ 4153 }, dangerous = new List<int>{}}}, //Scavenger's Den, Lv.2 {81175, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 5236, 4157, 4983 }, Range = new List<int>{ 4153 }, Dangerous = new List<int>{}}}, //Scavenger's Den, Lv.2
{135237, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 5235, 4156, 6646, 4156, 4152, 4157 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Den of the Fallen, Lv.1 {135237, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 5235, 4156, 6646, 4156, 4152, 4157 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Den of the Fallen, Lv.1
{194232, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 5235, 4156, 6646, 4156, 4152, 4157 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Den of the Fallen, Lv.2 {194232, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 5235, 4156, 6646, 4156, 4152, 4157 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Den of the Fallen, Lv.2
{102300, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 6359, 6652, 4157, 5393 }, range = new List<int>{ 6638, 6359, 6356 }, dangerous = new List<int>{}}}, //Decaying Crypt, Lv.1 {102300, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 6359, 6652, 4157, 5393 }, Range = new List<int>{ 6638, 6359, 6356 }, Dangerous = new List<int>{}}}, //Decaying Crypt, Lv.1
{165798, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 6652 }, range = new List<int>{ 6638 }, dangerous = new List<int>{}}}, //Decaying Crypt, Lv.2 {165798, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 6652 }, Range = new List<int>{ 6638 }, Dangerous = new List<int>{}}}, //Decaying Crypt, Lv.2
{161964, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 6644, 6652 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //The Cave Under the Well {161964, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 6644, 6652 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //The Cave Under the Well
{106756, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 6644, 6652 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Dank Cellar {106756, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 6644, 6652 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Dank Cellar
{106757, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 6644, 6652 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Damp Cellar {106757, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 6644, 6652 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Damp Cellar
{103202, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 6644, 6652 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Dark Cellar {103202, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 6644, 6652 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Dark Cellar
{62968, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 6644, 6652 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //The Hidden Cellar {62968, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 6644, 6652 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //The Hidden Cellar
{107051, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 6644, 6652, 128781 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Musty Cellar {107051, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 6644, 6652, 128781 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Musty Cellar
{211479, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 209087, 210502, 207378,207559, 207560, 192965 }, range = new List<int>{ }, dangerous = new List<int>{ 218804, 218807, 212667, 218802, 209506, 218806, 201679, 214948, 218808, 212664 }}}, //Whimsyshire {211479, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 209087, 210502, 207378,207559, 207560, 192965 }, Range = new List<int>{ }, Dangerous = new List<int>{ 218804, 218807, 212667, 218802, 209506, 218806, 201679, 214948, 218808, 212664 }}}, //Whimsyshire
#endregion #endregion
#region Act II #region Act II
{19839, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 4080, 6053, 6028, 5199, 5209, 5396, 4541, 4550, 5208, 4551, 4542 }, range = new List<int>{ 4070 }, dangerous = new List<int>{ 59970, 5203 }}}, //Stinging Winds Desert {19839, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 4080, 6053, 6028, 5199, 5209, 5396, 4541, 4550, 5208, 4551, 4542 }, Range = new List<int>{ 4070 }, Dangerous = new List<int>{ 59970, 5203 }}}, //Stinging Winds Desert
{19835, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 6060, 6027, 6061, 6044, 6053, 5209, 5208 }, range = new List<int>{ 6038 }, dangerous = new List<int>{ 218810, 221442, 221810 }}}, //Road to Alcarnus {19835, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 6060, 6027, 6061, 6044, 6053, 5209, 5208 }, Range = new List<int>{ 6038 }, Dangerous = new List<int>{ 218810, 221442, 221810 }}}, //Road to Alcarnus
{19825, new MonsterLayout{ lazy_load = true, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 6060, 6027, 6061, 6044, 6054 }, range = new List<int>{ 6038 }, dangerous = new List<int>{ 222003, 222001, 221981, 221999 }}}, //Alcarnus {19825, new MonsterLayout{ LazyLoad = true, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 6060, 6027, 6061, 6044, 6054 }, Range = new List<int>{ 6038 }, Dangerous = new List<int>{ 222003, 222001, 221981, 221999 }}}, //Alcarnus
{144117, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 6043, 6028, 5208, 5512 }, range = new List<int>{ 6047 }, dangerous = new List<int>{ 147155, 144400 }}}, //Deserted Cellar {144117, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 6043, 6028, 5208, 5512 }, Range = new List<int>{ 6047 }, Dangerous = new List<int>{ 147155, 144400 }}}, //Deserted Cellar
{141067, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 6053, 6025 }, range = new List<int>{ }, dangerous = new List<int>{ 140947 }}}, //Hadi's Claim Mine {141067, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 6053, 6025 }, Range = new List<int>{ }, Dangerous = new List<int>{ 140947 }}}, //Hadi's Claim Mine
{148905, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 6053, 6054 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Town Cellar {148905, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 6053, 6054 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Town Cellar
{102936, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 6053, 6054 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Secret Altar {102936, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 6053, 6054 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Secret Altar
{148904, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 6054, 6028, 6027 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Sandy Cellar {148904, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 6054, 6028, 6027 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Sandy Cellar
{102932, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 6054, 6028, 6027 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Hidden Conclave {102932, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 6054, 6028, 6027 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Hidden Conclave
{195998, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 6028 }, range = new List<int>{ }, dangerous = new List<int>{ 195639 }}}, //Abandoned Cellar {195998, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 6028 }, Range = new List<int>{ }, Dangerous = new List<int>{ 195639 }}}, //Abandoned Cellar
{148903, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 6027, 4089 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Alcarnus Cellar {148903, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 6027, 4089 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Alcarnus Cellar
{19836, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 6060, 5396, 4541, 4550, 5208, 4551, 4542, 4089 }, range = new List<int>{ 6027 }, dangerous = new List<int>{}}}, //Sundered Canyon {19836, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 6060, 5396, 4541, 4550, 5208, 4551, 4542, 4089 }, Range = new List<int>{ 6027 }, Dangerous = new List<int>{}}}, //Sundered Canyon
{170118, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 5199, 5208, 4541, 4551, 4542, 4550 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Black Canyon Bridge {170118, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 5199, 5208, 4541, 4551, 4542, 4550 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Black Canyon Bridge
{19838, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 5199, 4080, 5208, 5396 }, range = new List<int>{ 4070 }, dangerous = new List<int>{ 221406, 221402 }}}, //Black Canyon Mines {19838, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 5199, 4080, 5208, 5396 }, Range = new List<int>{ 4070 }, Dangerous = new List<int>{ 221406, 221402 }}}, //Black Canyon Mines
{19837, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 5199,4080, 5208, 4089, 5396, 4541, 4550, 4551 }, range = new List<int>{ 6028, 4070 }, dangerous = new List<int>{ 221377, 221379, 221367, 221372 }}}, //Howling Plateau {19837, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 5199,4080, 5208, 4089, 5396, 4541, 4550, 4551 }, Range = new List<int>{ 6028, 4070 }, Dangerous = new List<int>{ 221377, 221379, 221367, 221372 }}}, //Howling Plateau
{19794, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 4080, 5208, 5512, 4550, 4541, 4551, 4542, 5432 }, range = new List<int>{ 4098, 5428 }, dangerous = new List<int>{}}}, //The Crumbling Vault {19794, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 4080, 5208, 5512, 4550, 4541, 4551, 4542, 5432 }, Range = new List<int>{ 4098, 5428 }, Dangerous = new List<int>{}}}, //The Crumbling Vault
{57425, new MonsterLayout{ lazy_load = true, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 4080, 4083, 4093, 5434, 4094, 4083, 4542, 5432, 3384 }, range = new List<int>{ 4099, 4098, 3981, 4071, 5429, 5428 }, dangerous = new List<int>{ 222180, 215445, 208543, 140424, 113994, 115132, 140424 }}}, //Dahlgur Oasis {57425, new MonsterLayout{ LazyLoad = true, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 4080, 4083, 4093, 5434, 4094, 4083, 4542, 5432, 3384 }, Range = new List<int>{ 4099, 4098, 3981, 4071, 5429, 5428 }, Dangerous = new List<int>{ 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<int>{ 4080 }, range = new List<int>{ 4098 }, dangerous = new List<int>{ 166133 }}}, //The lost Caravan {166127, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 4080 }, Range = new List<int>{ 4098 }, Dangerous = new List<int>{ 166133 }}}, //The lost Caravan
{175367, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 4080, 5432 }, range = new List<int>{ 4098, 5428 }, dangerous = new List<int>{}}}, //Path to the Oasis {175367, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 4080, 5432 }, Range = new List<int>{ 4098, 5428 }, Dangerous = new List<int>{}}}, //Path to the Oasis
{159897, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 4080 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Storage Cellar {159897, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 4080 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Storage Cellar
{159899, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 4080 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Storm Cellar {159899, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 4080 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Storm Cellar
{19798, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 231349, 4083, 231356, 5278, 5397, 4090, 137995, 137996, 208962, 204944, 208963, 5188, 5187, 5192, 368, 4196, 5468, 231355 }, range = new List<int>{ 231351, 5349, 5376, 5368, 5372, 5382 }, dangerous = new List<int>{ 222502, 222510, 222511, 222512 }}}, //The Storm Halls {19798, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 231349, 4083, 231356, 5278, 5397, 4090, 137995, 137996, 208962, 204944, 208963, 5188, 5187, 5192, 368, 4196, 5468, 231355 }, Range = new List<int>{ 231351, 5349, 5376, 5368, 5372, 5382 }, Dangerous = new List<int>{ 222502, 222510, 222511, 222512 }}}, //The Storm Halls
{19797, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 231349, 4083, 231356, 5278, 5397, 4090, 137994, 137992, 208832, 204944, 208963, 5188, 5187, 5192, 4196, 368, 5191, 231355 }, range = new List<int>{ 231351, 5349, 5368, 5372, 5382, 5376 }, dangerous = new List<int>{ 222427, 222413, 165602 }}}, //The Unknown Depths {19797, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 231349, 4083, 231356, 5278, 5397, 4090, 137994, 137992, 208832, 204944, 208963, 5188, 5187, 5192, 4196, 368, 5191, 231355 }, Range = new List<int>{ 231351, 5349, 5368, 5372, 5382, 5376 }, Dangerous = new List<int>{ 222427, 222413, 165602 }}}, //The Unknown Depths
{175330, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 4093, 4090, 5512, 4071 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Ancient Path {175330, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 4093, 4090, 5512, 4071 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Ancient Path
{53834, new MonsterLayout{ lazy_load = true, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 6655, 218795, 5210, 4105, 4104, 5396, 5188, 3385, 4542, 5191, 5513, 5512, 4093, 204256 }, range = new List<int>{ 5376 }, dangerous = new List<int>{ 222352, 222385, 219832, 217744, 111868, 222400, 222339, 218947 }}}, //Desolate Sands {53834, new MonsterLayout{ LazyLoad = true, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 6655, 218795, 5210, 4105, 4104, 5396, 5188, 3385, 4542, 5191, 5513, 5512, 4093, 204256 }, Range = new List<int>{ 5376 }, Dangerous = new List<int>{ 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<int>{ 4202, 5210, 4105, 56784, 4080, 5513, 4071, 4090, 4204 }, range = new List<int>{ 4155, 5381, 5429, 5428, 5430, 5277 }, dangerous = new List<int>{ 222236, 222238 }}}, //Eastern Channel {62780, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 4202, 5210, 4105, 56784, 4080, 5513, 4071, 4090, 4204 }, Range = new List<int>{ 4155, 5381, 5429, 5428, 5430, 5277 }, Dangerous = new List<int>{ 222236, 222238 }}}, //Eastern Channel
{159588, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 4204, 217308, 437, 5090 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Sirocco Caverns, Lv.1 {159588, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 4204, 217308, 437, 5090 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Sirocco Caverns, Lv.1
{220805, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 4204, 217308, 437 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Sirocco Caverns, Lv.2 {220805, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 4204, 217308, 437 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Sirocco Caverns, Lv.2
{111667, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 6238, 4202, 4158, 5088, 5238 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Cave of Burrowing Horror, Lv.1 {111667, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 6238, 4202, 4158, 5088, 5238 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Cave of Burrowing Horror, Lv.1
{218969, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 6238, 4202, 4158, 5238 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Cave of Burrowing Horror, Lv.2 {218969, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 6238, 4202, 4158, 5238 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Cave of Burrowing Horror, Lv.2
{19791, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 5396, 5277, 4104, 56784, 5513, 5432, 5512, 5381 }, range = new List<int>{ 5428 }, dangerous = new List<int>{ 219583, 222008, 222005, 156738, 156763, }}}, //Sewers of Caldeum {19791, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 5396, 5277, 4104, 56784, 5513, 5432, 5512, 5381 }, Range = new List<int>{ 5428 }, Dangerous = new List<int>{ 219583, 222008, 222005, 156738, 156763, }}}, //Sewers of Caldeum
{19795, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 5396, 5412 }, range = new List<int>{ 5348, 5381, 5367 }, dangerous = new List<int>{}}}, //Chamber of the Lost Idol {19795, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 5396, 5412 }, Range = new List<int>{ 5348, 5381, 5367 }, Dangerous = new List<int>{}}}, //Chamber of the Lost Idol
{62778, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 4104, 4105, 56784, 4080, 5381, 5513, 5432 }, range = new List<int>{ 5430, 5428, 5277 }, dangerous = new List<int>{ 222186, 222189 }}}, //Western Channel {62778, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 4104, 4105, 56784, 4080, 5381, 5513, 5432 }, Range = new List<int>{ 5430, 5428, 5277 }, Dangerous = new List<int>{ 222186, 222189 }}}, //Western Channel
{169494, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 5396, 4197 }, range = new List<int>{ 5375 }, dangerous = new List<int>{}}}, //Mysterious Cave, Lv.1 {169494, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 5396, 4197 }, Range = new List<int>{ 5375 }, Dangerous = new List<int>{}}}, //Mysterious Cave, Lv.1
{194239, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 5396, 4197 }, range = new List<int>{ 5375 }, dangerous = new List<int>{}}}, //Mysterious Cave, Lv.2 {194239, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 5396, 4197 }, Range = new List<int>{ 5375 }, Dangerous = new List<int>{}}}, //Mysterious Cave, Lv.2
{146838, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 5396, 5277, 4104, 56784, 5512, 5432 }, range = new List<int>{ 5381, 5428 }, dangerous = new List<int>{}}}, //Ruined Cistern {146838, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 5396, 5277, 4104, 56784, 5512, 5432 }, Range = new List<int>{ 5381, 5428 }, Dangerous = new List<int>{}}}, //Ruined Cistern
{196225, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 5209, 4080 }, range = new List<int>{ 4070 }, dangerous = new List<int>{}}}, //Tunnels of the Rockworm {196225, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 5209, 4080 }, Range = new List<int>{ 4070 }, Dangerous = new List<int>{}}}, //Tunnels of the Rockworm
{204629, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 5396, 4158, 55135 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Cave of the Betrayer, Lv.1 {204629, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 5396, 4158, 55135 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Cave of the Betrayer, Lv.1
{204675, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 5396, 4158 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Cave of the Betrayer, Lv.2 {204675, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 5396, 4158 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Cave of the Betrayer, Lv.2
{19801, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 5396, 5432, 208962, 208963, 204944, 5512 }, range = new List<int>{ 5428 }, dangerous = new List<int>{}}}, //The Ruins, Lv.1 {19801, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 5396, 5432, 208962, 208963, 204944, 5512 }, Range = new List<int>{ 5428 }, Dangerous = new List<int>{}}}, //The Ruins, Lv.1
{222577, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 5396, 5432, 208962, 208963, 204944, 5512 }, range = new List<int>{}, dangerous = new List<int>{}}}, //The Ruins, Lv.2 {222577, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 5396, 5432, 208962, 208963, 204944, 5512 }, Range = new List<int>{}, Dangerous = new List<int>{}}}, //The Ruins, Lv.2
{111671, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 5468, 4158, 4202, 5513, 5475, 5088 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Vile Cavern, Lv.1 {111671, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 5468, 4158, 4202, 5513, 5475, 5088 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Vile Cavern, Lv.1
{218968, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 5468, 4158, 4202 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Vile Cavern, Lv.2 {218968, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 5468, 4158, 4202 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Vile Cavern, Lv.2
{123182, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 208962, 208832, 5375, 204944, 208963 }, range = new List<int>{ 3982 }, dangerous = new List<int>{}}}, //Vault of the Assassin, part 1 {123182, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 208962, 208832, 5375, 204944, 208963 }, Range = new List<int>{ 3982 }, Dangerous = new List<int>{}}}, //Vault of the Assassin, part 1
{153714, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 208962, 208832, 5375, 204944, 208963 }, range = new List<int>{ 982 }, dangerous = new List<int>{}}}, //Vault of the Assassin, part 2 {153714, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 208962, 208832, 5375, 204944, 208963 }, Range = new List<int>{ 982 }, Dangerous = new List<int>{}}}, //Vault of the Assassin, part 2
{61632, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 5396, 5188, 208962, 208832, 204944, 208963, 5193 }, range = new List<int>{ 5371, 5375 }, dangerous = new List<int>{}}}, //The Forgotten Ruins {61632, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 5396, 5188, 208962, 208832, 204944, 208963, 5193 }, Range = new List<int>{ 5371, 5375 }, Dangerous = new List<int>{}}}, //The Forgotten Ruins
{19799, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 5278, 5397, 4198 }, range = new List<int>{}, dangerous = new List<int>{}}}, //Halls of Dusk {19799, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 5278, 5397, 4198 }, Range = new List<int>{}, Dangerous = new List<int>{}}}, //Halls of Dusk
{80592, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 208962, 208832, 204944, 208963, 199478, 4198 }, range = new List<int>{ 5372, 5382 }, dangerous = new List<int>{ 222523 }}}, //Halls of Dusk {80592, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 208962, 208832, 204944, 208963, 199478, 4198 }, Range = new List<int>{ 5372, 5382 }, Dangerous = new List<int>{ 222523 }}}, //Halls of Dusk
{192689, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 4105, 5433, 56784, 4080, 5513, 5432 }, range = new List<int>{ 5429, 5428 }, dangerous = new List<int>{}}}, //Hidden Aqueducts {192689, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 4105, 5433, 56784, 4080, 5513, 5432 }, Range = new List<int>{ 5429, 5428 }, Dangerous = new List<int>{}}}, //Hidden Aqueducts
{158594, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 4104, 56784, 5513, 5432 }, range = new List<int>{ 5428 }, dangerous = new List<int>{}}}, //Tomb of Khan Dakab {158594, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 4104, 56784, 5513, 5432 }, Range = new List<int>{ 5428 }, Dangerous = new List<int>{}}}, //Tomb of Khan Dakab
{158384, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 5513, 5432 }, range = new List<int>{ 5428 }, dangerous = new List<int>{}}}, //Tomb of Sardar {158384, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 5513, 5432 }, Range = new List<int>{ 5428 }, Dangerous = new List<int>{}}}, //Tomb of Sardar
{62575, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 56784, 5513, 368 }, range = new List<int>{ 5368 }, dangerous = new List<int>{}}}, //Ancient Cave, Lv.1 {62575, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 56784, 5513, 368 }, Range = new List<int>{ 5368 }, Dangerous = new List<int>{}}}, //Ancient Cave, Lv.1
{194242, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 56784, 5513, 368 }, range = new List<int>{ 5368 }, dangerous = new List<int>{}}}, //Ancient Cave, Lv.2 {194242, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 56784, 5513, 368 }, Range = new List<int>{ 5368 }, Dangerous = new List<int>{}}}, //Ancient Cave, Lv.2
{62574, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 5468, 5475, 5088 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Flooded Cave, Lv.1 {62574, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 5468, 5475, 5088 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Flooded Cave, Lv.1
{161105, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 5468, 5475, 5088 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Flooded Cave, Lv.2 {161105, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 5468, 5475, 5088 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Flooded Cave, Lv.2
#endregion #endregion
#region Act III #region Act III
{75436, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 6055, 169456, 170763, 5397, 182285, 204232, 77796, 4985, 62736 }, range = new List<int>{ 170781 }, dangerous = new List<int>{ 220468, 220710, 220444, 220455 }}}, //The Keep Depths, Lv.1 {75436, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 6055, 169456, 170763, 5397, 182285, 204232, 77796, 4985, 62736 }, Range = new List<int>{ 170781 }, Dangerous = new List<int>{ 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<int>{ 6055,4095, 169456, 170763, 5397, 182285, 204232, 77796, 4985, 62736, 130794 }, range = new List<int>{ 170781 }, dangerous = new List<int>{ 220481, 220479, 220476 }}}, //The Keep Depths, Lv.2 {93103, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 6055,4095, 169456, 170763, 5397, 182285, 204232, 77796, 4985, 62736, 130794 }, Range = new List<int>{ 170781 }, Dangerous = new List<int>{ 220481, 220479, 220476 }}}, //The Keep Depths, Lv.2
{136448, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 6055,4095, 169456, 170763, 5397, 182285, 204232, 77796, 62736 }, range = new List<int>{ 170781 }, dangerous = new List<int>{ 220499, 220491, 220485 }}}, //The Keep Depths, Lv.3 {136448, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 6055,4095, 169456, 170763, 5397, 182285, 204232, 77796, 62736 }, Range = new List<int>{ 170781 }, Dangerous = new List<int>{ 220499, 220491, 220485 }}}, //The Keep Depths, Lv.3
{182258, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 4084,4095, 4091, 4746, 130794 }, range = new List<int>{ 4100, 4072 }, dangerous = new List<int>{}}}, //The Barracks, lv. 1 {182258, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 4084,4095, 4091, 4746, 130794 }, Range = new List<int>{ 4100, 4072 }, Dangerous = new List<int>{}}}, //The Barracks, lv. 1
{221753, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 4084,4095, 4091, 4746, 130794 }, range = new List<int>{ 4100, 4072 }, dangerous = new List<int>{}}}, //The Barracks, lv. 2 {221753, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 4084,4095, 4091, 4746, 130794 }, Range = new List<int>{ 4100, 4072 }, Dangerous = new List<int>{}}}, //The Barracks, lv. 2
{92960, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 4084,4085, 4091, 4092, 77796, 62736, 221770, 130794 }, range = new List<int>{ 5581, 365, 4073 }, dangerous = new List<int>{ 220232 }}}, //Skycrown Battlements {92960, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 4084,4085, 4091, 4092, 77796, 62736, 221770, 130794 }, Range = new List<int>{ 5581, 365, 4073 }, Dangerous = new List<int>{ 220232 }}}, //Skycrown Battlements
{69504, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 4085, 4295, 141194, 4085, 221770, 130794 }, range = new List<int>{ 365, 4303, 4300, 5581, 4073 }, dangerous = new List<int>{ 220377, 220775, 220773, 220727 }}}, //Rakkis Crossing {69504, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 4085, 4295, 141194, 4085, 221770, 130794 }, Range = new List<int>{ 365, 4303, 4300, 5581, 4073 }, Dangerous = new List<int>{ 220377, 220775, 220773, 220727 }}}, //Rakkis Crossing
{119653, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 4296, 4746 }, range = new List<int>{ 4300, 4304, 5508 }, dangerous = new List<int>{ 220857, 220853 }}}, //Tower of the Cursed, Lv.1 {119653, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 4296, 4746 }, Range = new List<int>{ 4300, 4304, 5508 }, Dangerous = new List<int>{ 220857, 220853 }}}, //Tower of the Cursed, Lv.1
{139274, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 4296, 4746 }, range = new List<int>{ 4300, 4304, 5508 }, dangerous = new List<int>{ 220868 }}}, //Tower of the Cursed, Lv.2 {139274, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 4296, 4746 }, Range = new List<int>{ 4300, 4304, 5508 }, Dangerous = new List<int>{ 220868 }}}, //Tower of the Cursed, Lv.2
//{119656, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 144315, 169615, 5467 }, range = new List<int>{ 5508 }, dangerous = new List<int>{}}}, //Heart of the Damned //{119656, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 144315, 169615, 5467 }, range = new List<int>{ 5508 }, dangerous = new List<int>{}}}, //Heart of the Damned
{191078, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 191592, 3342, 5239, 3850 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Icefall Caves, Lv.1 {191078, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 191592, 3342, 5239, 3850 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Icefall Caves, Lv.1
{221703, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 3342, 5239, 3850 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Icefall Caves, Lv.2 {221703, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 3342, 5239, 3850 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Icefall Caves, Lv.2
{189345, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 5239, 4548, 4552, 4985 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Caverns of Frost, Lv.1 {189345, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 5239, 4548, 4552, 4985 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Caverns of Frost, Lv.1
{221702, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 5239, 4548, 4552, 4985 }, range = new List<int>{ }, dangerous = new List<int>{ 212750 }}}, //Caverns of Frost, Lv.2 {221702, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 5239, 4548, 4552, 4985 }, Range = new List<int>{ }, Dangerous = new List<int>{ 212750 }}}, //Caverns of Frost, Lv.2
{182274, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 170763, 182281, 182285, 62736, 221770, 130794 }, range = new List<int>{ 170781, 182279 }, dangerous = new List<int>{}}}, //Battlefield Stores, Lv.1 {182274, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 170763, 182281, 182285, 62736, 221770, 130794 }, Range = new List<int>{ 170781, 182279 }, Dangerous = new List<int>{}}}, //Battlefield Stores, Lv.1
{221754, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 170763, 182281, 182285, 62736, 221770, 130794 }, range = new List<int>{ 170781, 182279 }, dangerous = new List<int>{}}}, //Battlefield Stores, Lv.2 {221754, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 170763, 182281, 182285, 62736, 221770, 130794 }, Range = new List<int>{ 170781, 182279 }, Dangerous = new List<int>{}}}, //Battlefield Stores, Lv.2
{93173, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 4085, 4091, 77796, 62736 }, range = new List<int>{ 5581 }, dangerous = new List<int>{ 220395, 220397 }}}, //Stonefort {93173, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 4085, 4091, 77796, 62736 }, Range = new List<int>{ 5581 }, Dangerous = new List<int>{ 220395, 220397 }}}, //Stonefort
{112565, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 4295, 4085, 221770, 4738, 130794 }, range = new List<int>{ 4303, 4300, 5581, 60722 }, dangerous = new List<int>{ 218566, 220705, 220708 }}}, //Fields of Slaughter {112565, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 4295, 4085, 221770, 4738, 130794 }, Range = new List<int>{ 4303, 4300, 5581, 60722 }, Dangerous = new List<int>{ 218566, 220705, 220708 }}}, //Fields of Slaughter
{155048, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 4295, 4738 }, range = new List<int>{ 60722 }, dangerous = new List<int>{ 220699 }}}, //The Bridge of Korsikk {155048, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 4295, 4738 }, Range = new List<int>{ 60722 }, Dangerous = new List<int>{ 220699 }}}, //The Bridge of Korsikk
{112548, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 4295, 60722, 141194, 4738, 4106, 221770 }, range = new List<int>{ 4300, 5581 }, dangerous = new List<int>{ 220509, 220688, 220691 }}}, //The Battlefields {112548, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 4295, 60722, 141194, 4738, 4106, 221770 }, Range = new List<int>{ 4300, 5581 }, Dangerous = new List<int>{ 220509, 220688, 220691 }}}, //The Battlefields
{86080, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 4296, 4085, 4738, 4747, 4746, 144315 }, range = new List<int>{ 189852, 4300, 5581, 365 }, dangerous = new List<int>{ 220777, 220381, 220795 }}}, // REMOVED 203048 (Horrible burrow animations) //Arreat Crater, Lv.1 {86080, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 4296, 4085, 4738, 4747, 4746, 144315 }, Range = new List<int>{ 189852, 4300, 5581, 365 }, Dangerous = new List<int>{ 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<int>{ 4296, 4085, 4738, 169615, 4747, 4746, 144315 }, range = new List<int>{ 4300, 5581, 365, 205767, 5508 }, dangerous = new List<int>{ 220853, 220850, 220851 }}}, // REMOVED 203048 (Horrible burrow animations) //Arreat Crater, Lv.2 {119305, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 4296, 4085, 4738, 169615, 4747, 4746, 144315 }, Range = new List<int>{ 4300, 5581, 365, 205767, 5508 }, Dangerous = new List<int>{ 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<int>{ 144315, 4085, 169615, 4747, 4746 }, range = new List<int>{ 365, 4073, 5508 }, dangerous = new List<int>{ 220810, 220783, 220435, 220806 }}}, //Tower of the Damned, Lv.1 {80791, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 144315, 4085, 169615, 4747, 4746 }, Range = new List<int>{ 365, 4073, 5508 }, Dangerous = new List<int>{ 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<int>{ 144315, 4085, 169615, 4747, 4746 }, range = new List<int>{ 365, 4073, 5508 }, dangerous = new List<int>{ 220817, 220814 }}}, //Tower of the Damned, Lv.2 {80792, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 144315, 4085, 169615, 4747, 4746 }, Range = new List<int>{ 365, 4073, 5508 }, Dangerous = new List<int>{ 220817, 220814 }}}, //Tower of the Damned, Lv.2
{119306, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 121353, 4747, 4746 }, range = new List<int>{ 5581, 5508 }, dangerous = new List<int>{ 220884, 220881, 220889 }}}, //The Core of Arreat {119306, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 121353, 4747, 4746 }, Range = new List<int>{ 5581, 5508 }, Dangerous = new List<int>{ 220884, 220881, 220889 }}}, //The Core of Arreat
{174666, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 141194, 62736, 5514, 221770, 4985, 4984, 4746, 130794 }, range = new List<int>{ 60722 }, dangerous = new List<int>{}}}, //Fortified Bunker, Lv.1 {174666, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 141194, 62736, 5514, 221770, 4985, 4984, 4746, 130794 }, Range = new List<int>{ 60722 }, Dangerous = new List<int>{}}}, //Fortified Bunker, Lv.1
{221752, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 141194, 62736, 221770, 4985, 4984, 4746, 130794 }, range = new List<int>{ 60722 }, dangerous = new List<int>{}}}, //Fortified Bunker, Lv.2 {221752, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 141194, 62736, 221770, 4985, 4984, 4746, 130794 }, Range = new List<int>{ 60722 }, Dangerous = new List<int>{}}}, //Fortified Bunker, Lv.2
{182502, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 141194, 60049, 5436, 62736, 130794, 106707 }, range = new List<int>{ 60722, 5508 }, dangerous = new List<int>{}}}, //The Foundry, Lv.1 {182502, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 141194, 60049, 5436, 62736, 130794, 106707 }, Range = new List<int>{ 60722, 5508 }, Dangerous = new List<int>{}}}, //The Foundry, Lv.1
{221761, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 141194, 60049, 5436, 62736, 130794 }, range = new List<int>{ 60722, 5508 }, dangerous = new List<int>{}}}, //The Foundry, Lv.2 {221761, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 141194, 60049, 5436, 62736, 130794 }, Range = new List<int>{ 60722, 5508 }, Dangerous = new List<int>{}}}, //The Foundry, Lv.2
#endregion #endregion
#region Act IV #region Act IV
{109526, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 3361, 82764, 106712, 121353 }, range = new List<int>{ 106713 }, dangerous = new List<int>{}}}, //Hell Rift, lv.1 {109526, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 3361, 82764, 106712, 121353 }, Range = new List<int>{ 106713 }, Dangerous = new List<int>{}}}, //Hell Rift, lv.1
{109531, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 82764, 106708, 3362, 106712, 121353 }, range = new List<int>{ 205767, 152679 }, dangerous = new List<int>{}}}, //Hell Rift, lv.2 {109531, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 82764, 106708, 3362, 106712, 121353 }, Range = new List<int>{ 205767, 152679 }, Dangerous = new List<int>{}}}, //Hell Rift, lv.2
{109514, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 3361, 82764, 106708, 106712, 106711 }, range = new List<int>{ 106713, 136864, 152679 }, dangerous = new List<int>{ 219651, 219727, 219668 }}}, //Garden of Hope, lv.1 {109514, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 3361, 82764, 106708, 106712, 106711 }, Range = new List<int>{ 106713, 136864, 152679 }, Dangerous = new List<int>{ 219651, 219727, 219668 }}}, //Garden of Hope, lv.1
{109516, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 106711, 134416, 82764, 4755, 106708, 60049, 3362, 106712, 106714 }, range = new List<int>{ 106713, 152679 }, dangerous = new List<int>{ 219925 }}}, //Garden of Hope, lv.2 {109516, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 106711, 134416, 82764, 4755, 106708, 60049, 3362, 106712, 106714 }, Range = new List<int>{ 106713, 152679 }, Dangerous = new List<int>{ 219925 }}}, //Garden of Hope, lv.2
{201668, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 141196, 60049 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Blessed Chancel {201668, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 141196, 60049 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Blessed Chancel
{201671, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 141196 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Sacellum of Virtue {201671, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 141196 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Sacellum of Virtue
{201670, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 106711, 106708 }, range = new List<int>{ }, dangerous = new List<int>{ 223691 }}}, //Radiant Chapel {201670, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 106711, 106708 }, Range = new List<int>{ }, Dangerous = new List<int>{ 223691 }}}, //Radiant Chapel
{175738, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 136864 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Holy Sanctum {175738, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 136864 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Holy Sanctum
{109538, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 106713, 136864, 106711, 82764, 4760, 4757, 137856, 106708, 199478, 106712, 106714 }, range = new List<int>{ 219673, 106709 }, dangerous = new List<int>{ 219847, 219893, 219916 }}}, //The Silver Spire, Lv.1 {109538, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 106713, 136864, 106711, 82764, 4760, 4757, 137856, 106708, 199478, 106712, 106714 }, Range = new List<int>{ 219673, 106709 }, Dangerous = new List<int>{ 219847, 219893, 219916 }}}, //The Silver Spire, Lv.1
{109540, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 136864, 3361, 106711, 106710, 82764, 4760, 4757, 106708, 199478, 106714 }, range = new List<int>{ 106709 }, dangerous = new List<int>{ 219949, 219960, 219985, 218873 }}}, //The Silver Spire, Lv.2 {109540, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 136864, 3361, 106711, 106710, 82764, 4760, 4757, 106708, 199478, 106714 }, Range = new List<int>{ 106709 }, Dangerous = new List<int>{ 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<int>{ 106711, 82764, 199478, 106710, 82764, 199478, 134416 }, range = new List<int>{ 152679, 219673, 5508 }, dangerous = new List<int>{}}}, //The Silver Spire, Lv.4 {109542, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 106711, 82764, 199478, 106710, 82764, 199478, 134416 }, Range = new List<int>{ 152679, 219673, 5508 }, Dangerous = new List<int>{}}}, //The Silver Spire, Lv.4
{210728, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 106713, 136864, 106711, 82764, 4760, 4757, 137856, 106708, 199478, 106712, 106714, 3361, 106710, 175614 }, range = new List<int>{ 219673, 106709 }, dangerous = new List<int>{}}}, //The Silver Spire, Lv.5 {210728, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 106713, 136864, 106711, 82764, 4760, 4757, 137856, 106708, 199478, 106712, 106714, 3361, 106710, 175614 }, Range = new List<int>{ 219673, 106709 }, Dangerous = new List<int>{}}}, //The Silver Spire, Lv.5
#endregion #endregion
#region Act V #region Act V
{261758, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 273417, 272330, 282027, 276309, 309114, 277203, 276495, 310894, 310893 }, range = new List<int>{ 282789, 310888 }, dangerous = new List<int>{ 360853, 360861, 369424, 309462 }}}, //Westmarch Commons {261758, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 273417, 272330, 282027, 276309, 309114, 277203, 276495, 310894, 310893 }, Range = new List<int>{ 282789, 310888 }, Dangerous = new List<int>{ 360853, 360861, 369424, 309462 }}}, //Westmarch Commons
{338946, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 341711, 297708, 262442, 342218, 342237, 309114, 051356, 342244, 334796, 334792, 334798 }, range = new List<int>{ }, dangerous = new List<int>{ 351183, 373821, 373819, 361417 }}}, //Briarthorn Cemetery {338946, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 341711, 297708, 262442, 342218, 342237, 309114, 051356, 342244, 334796, 334792, 334798 }, Range = new List<int>{ }, Dangerous = new List<int>{ 351183, 373821, 373819, 361417 }}}, //Briarthorn Cemetery
{263493, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 273417, 272330, 262442, 330603, 282027, 276309, 277203, 288691, 310893, 298827, 299231 }, range = new List<int>{ 282789, 310888 }, dangerous = new List<int>{ 373830, 363986, 355667, 355672, 355680, 353443 }}}, //Westmarch Heights {263493, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 273417, 272330, 262442, 330603, 282027, 276309, 277203, 288691, 310893, 298827, 299231 }, Range = new List<int>{ 282789, 310888 }, Dangerous = new List<int>{ 373830, 363986, 355667, 355672, 355680, 353443 }}}, //Westmarch Heights
{282487, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 237333, 361665 }, range = new List<int>{ }, dangerous = new List<int>{}}}, //Overgrown Ruins {282487, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 237333, 361665 }, Range = new List<int>{ }, Dangerous = new List<int>{}}}, //Overgrown Ruins
{245964, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 239014, 237333, 239516, 361665 }, range = new List<int>{ }, dangerous = new List<int>{ 361755, 361771 }}}, //Blood Marsh {245964, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 239014, 237333, 239516, 361665 }, Range = new List<int>{ }, Dangerous = new List<int>{ 361755, 361771 }}}, //Blood Marsh
{258142, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 239014, 237333, 363639, 289387, 254175, 246343, 005276, 239516, 237876 }, range = new List<int>{ 289388 }, dangerous = new List<int>{ 290453, 361991, 351179 }}}, //Paths of the Drowned {258142, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 239014, 237333, 363639, 289387, 254175, 246343, 005276, 239516, 237876 }, Range = new List<int>{ 289388 }, Dangerous = new List<int>{ 290453, 361991, 351179 }}}, //Paths of the Drowned
{283553, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 276492, 343183, 347255, 345949, 283269, 351023 }, range = new List<int>{ }, dangerous = new List<int>{ 373881, 362303, 362299 }}}, //Passage to Corvus {283553, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 276492, 343183, 347255, 345949, 283269, 351023 }, Range = new List<int>{ }, Dangerous = new List<int>{ 373881, 362303, 362299 }}}, //Passage to Corvus
{283567, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 276492, 343183, 347255, 345949, 283269, 351023 }, range = new List<int>{ }, dangerous = new List<int>{ 342355, 362309, 362305, 373842 }}}, //Ruins of Corvus {283567, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 276492, 343183, 347255, 345949, 283269, 351023 }, Range = new List<int>{ }, Dangerous = new List<int>{ 342355, 362309, 362305, 373842 }}}, //Ruins of Corvus
{338602, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 296283, 271579, 271806 }, range = new List<int>{ }, dangerous = new List<int>{ 363108, 363060, 373883, 362895, 362891, 341760, 363051, 363073 }}}, //REMOVED 275108 (horrible tunnel animation) //Battlefields of Eternity {338602, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 296283, 271579, 271806 }, Range = new List<int>{ }, Dangerous = new List<int>{ 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<int>{ 241288, 305579 }, range = new List<int>{ }, dangerous = new List<int>{ 363374, 363378, 363228, 363232, 363367 }}}, //Pandemonium Fortress lv. 1 {271234, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 241288, 305579 }, Range = new List<int>{ }, Dangerous = new List<int>{ 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<int>{ 241288, 305579, 340920, 299231 }, range = new List<int>{ }, dangerous = new List<int>{ 360243, 360244, 360241, 363230 }}}, //Pandemonium Fortress lv. 2 {360494, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 241288, 305579, 340920, 299231 }, Range = new List<int>{ }, Dangerous = new List<int>{ 360243, 360244, 360241, 363230 }}}, //Pandemonium Fortress lv. 2
#endregion #endregion
//x1_lr_tileset_Westmarch //x1_lr_tileset_Westmarch
{331263, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 341711, 297708, 262442, 342218, 342237, 309114, 051356, 342244, 334796, 334792, 334798 }, range = new List<int>{ }, dangerous = new List<int>{ 351183, 373821, 373819, 361417 }}}, {331263, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 341711, 297708, 262442, 342218, 342237, 309114, 051356, 342244, 334796, 334792, 334798 }, Range = new List<int>{ }, Dangerous = new List<int>{ 351183, 373821, 373819, 361417 }}},
//_x1_lr_tileset_fortress_large //_x1_lr_tileset_fortress_large
{360797, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 241288, 305579, 340920, 299231 }, range = new List<int>{ }, dangerous = new List<int>{ 363374, 363378, 363228, 363232, 363367, 360243, 360244, 360241, 363230 }}}, {360797, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 241288, 305579, 340920, 299231 }, Range = new List<int>{ }, Dangerous = new List<int>{ 363374, 363378, 363228, 363232, 363367, 360243, 360244, 360241, 363230 }}},
//x1_lr_tileset_zoltruins //x1_lr_tileset_zoltruins
{288823, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 5396, 5432, 208962, 208963, 204944, 5512 }, range = new List<int>{ 5428 }, dangerous = new List<int>{}}}, {288823, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 5396, 5432, 208962, 208963, 204944, 5512 }, Range = new List<int>{ 5428 }, Dangerous = new List<int>{}}},
//x1_lr_tileset_hexmaze //x1_lr_tileset_hexmaze
{331389, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 241288, 305579, 340920, 299231 }, range = new List<int>{ }, dangerous = new List<int>{ 363374, 363378, 363228, 363232, 363367, 360243, 360244, 360241, 363230 }}}, {331389, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 241288, 305579, 340920, 299231 }, Range = new List<int>{ }, Dangerous = new List<int>{ 363374, 363378, 363228, 363232, 363367, 360243, 360244, 360241, 363230 }}},
//x1_lr_tileset_icecave //x1_lr_tileset_icecave
{275960, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 191592, 3342, 5239, 3850 }, range = new List<int>{ }, dangerous = new List<int>{}}}, {275960, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 191592, 3342, 5239, 3850 }, Range = new List<int>{ }, Dangerous = new List<int>{}}},
//x1_lr_tileset_crypt //x1_lr_tileset_crypt
{275946, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = false, melee = new List<int>{ 5393, 3848, 5395, 5411, 6653 }, range = new List<int>{ 5346, 3847, 6639 }, dangerous = new List<int>{ 218348, 218351 }}}, {275946, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = false, Melee = new List<int>{ 5393, 3848, 5395, 5411, 6653 }, Range = new List<int>{ 5346, 3847, 6639 }, Dangerous = new List<int>{ 218348, 218351 }}},
//x1_lr_tileset_corruptspire //x1_lr_tileset_corruptspire
{275926, new MonsterLayout{ lazy_load = false, additional_density = 0, can_spawn_goblin = true, melee = new List<int>{ 106711, 82764, 199478, 106710, 82764, 199478, 134416 }, range = new List<int>{ 152679, 219673, 5508 }, dangerous = new List<int>{}}}, {275926, new MonsterLayout{ LazyLoad = false, AdditionalDensity = 0, CanSpawnGoblin = true, Melee = new List<int>{ 106711, 82764, 199478, 106710, 82764, 199478, 134416 }, Range = new List<int>{ 152679, 219673, 5508 }, Dangerous = new List<int>{}}},
// //
}; };

View File

@ -70,7 +70,7 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem
public void CheckLevelArea(World world, int levelAreaSNO) 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)) if (!LoadedLevelAreas.Contains(levelAreaSNO))
{ {
LoadedLevelAreas.Add(levelAreaSNO); LoadedLevelAreas.Add(levelAreaSNO);
@ -2311,7 +2311,7 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem
foreach (var scene in levelAreas.First().Value) foreach (var scene in levelAreas.First().Value)
{ {
if (!SpawnGenerator.Spawns.ContainsKey(wid)) break; if (!SpawnGenerator.Spawns.ContainsKey(wid)) break;
if (SpawnGenerator.Spawns[wid].lazy_load) if (SpawnGenerator.Spawns[wid].LazyLoad)
{ {
_lazyLevelAreas.Add(wid, levelAreas.First().Value); _lazyLevelAreas.Add(wid, levelAreas.First().Value);
break; break;
@ -2321,9 +2321,9 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem
} }
#region unique spawn #region unique spawn
//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(); var scene = levelAreas.First().Value.PickRandom();
int x = FastRandom.Instance.Next(scene.NavMesh.SquaresCountX); int x = FastRandom.Instance.Next(scene.NavMesh.SquaresCountX);
int y = FastRandom.Instance.Next(scene.NavMesh.SquaresCountY); int y = FastRandom.Instance.Next(scene.NavMesh.SquaresCountY);
@ -2363,7 +2363,7 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem
#endregion #endregion
#region goblin spawn #region goblin spawn
//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()); var randomGoblin = new SNOHandle(Goblins.PickRandom());
if (world.Game.IsHardcore) randomGoblin = new SNOHandle(3852); if (world.Game.IsHardcore) randomGoblin = new SNOHandle(3852);
@ -2408,7 +2408,7 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem
foreach (var scene in levelAreas[la]) foreach (var scene in levelAreas[la])
{ {
if (!SpawnGenerator.Spawns.ContainsKey(la)) break; if (!SpawnGenerator.Spawns.ContainsKey(la)) break;
if (SpawnGenerator.Spawns[la].lazy_load) if (SpawnGenerator.Spawns[la].LazyLoad)
{ {
_lazyLevelAreas.Add(la, levelAreas[la]); _lazyLevelAreas.Add(la, levelAreas[la]);
break; break;
@ -2418,9 +2418,9 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem
} }
#region unique spawn #region unique spawn
//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(); var scene = levelAreas[la].PickRandom();
int x = FastRandom.Instance.Next(scene.NavMesh.SquaresCountX); int x = FastRandom.Instance.Next(scene.NavMesh.SquaresCountX);
int y = FastRandom.Instance.Next(scene.NavMesh.SquaresCountY); int y = FastRandom.Instance.Next(scene.NavMesh.SquaresCountY);
@ -2460,7 +2460,7 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem
#endregion #endregion
#region goblin spawn #region goblin spawn
//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()); var randomGoblin = new SNOHandle(Goblins.PickRandom());
if (world.Game.IsHardcore) randomGoblin = new SNOHandle(3852); if (world.Game.IsHardcore) randomGoblin = new SNOHandle(3852);
@ -2521,7 +2521,7 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem
} }
if (Game.Difficulty > 4) if (Game.Difficulty > 4)
packs_count += SpawnGenerator.Spawns[la].additional_density; packs_count += SpawnGenerator.Spawns[la].AdditionalDensity;
var groupId = 0; var groupId = 0;
@ -2540,8 +2540,8 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem
#region elite spawn #region elite spawn
int randomMeleeMonsterId = -1; int randomMeleeMonsterId = -1;
int randomRangedMonsterId = -1; int randomRangedMonsterId = -1;
if (SpawnGenerator.Spawns[la].melee.Count > 0) randomMeleeMonsterId = SpawnGenerator.Spawns[la].melee.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(); if (SpawnGenerator.Spawns[la].Range.Count > 0) randomRangedMonsterId = SpawnGenerator.Spawns[la].Range.PickRandom();
SNOHandle meleeMonsterHandle = (randomMeleeMonsterId == -1 ? null : new SNOHandle(randomMeleeMonsterId)); SNOHandle meleeMonsterHandle = (randomMeleeMonsterId == -1 ? null : new SNOHandle(randomMeleeMonsterId));
SNOHandle rangedMonsterHandle = (randomRangedMonsterId == -1 ? null : new SNOHandle(randomRangedMonsterId)); SNOHandle rangedMonsterHandle = (randomRangedMonsterId == -1 ? null : new SNOHandle(randomRangedMonsterId));
if (rangedMonsterHandle == null) rangedMonsterHandle = meleeMonsterHandle; if (rangedMonsterHandle == null) rangedMonsterHandle = meleeMonsterHandle;
@ -2585,8 +2585,8 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem
{ {
int randomMeleeMonsterId = -1; int randomMeleeMonsterId = -1;
int randomRangedMonsterId = -1; int randomRangedMonsterId = -1;
if (SpawnGenerator.Spawns[la].melee.Count > 0) randomMeleeMonsterId = SpawnGenerator.Spawns[la].melee.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(); if (SpawnGenerator.Spawns[la].Range.Count > 0) randomRangedMonsterId = SpawnGenerator.Spawns[la].Range.PickRandom();
SNOHandle meleeMonsterHandle = (randomMeleeMonsterId == -1 ? null : new SNOHandle(randomMeleeMonsterId)); SNOHandle meleeMonsterHandle = (randomMeleeMonsterId == -1 ? null : new SNOHandle(randomMeleeMonsterId));
SNOHandle rangedMonsterHandle = (randomRangedMonsterId == -1 ? null : new SNOHandle(randomRangedMonsterId)); SNOHandle rangedMonsterHandle = (randomRangedMonsterId == -1 ? null : new SNOHandle(randomRangedMonsterId));
//int maxMobsInStack = (SpawnGenerator.IsMelee(la, randomMonsterId) ? 6 : (SpawnGenerator.IsDangerous(la, randomMonsterId) ? 1 : 3)); //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 else //spawn champions
#region champion spawn #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(); groupId = FastRandom.Instance.Next();
for (int n = 0; n < 4; n++) for (int n = 0; n < 4; n++)
{ {

View File

@ -297,8 +297,7 @@ namespace DiIiS_NA.GameServer.GSSystem.MapSystem
{ {
int index = (int)marker.Type - 50; // LocationA has id 50... int index = (int)marker.Type - 50; // LocationA has id 50...
if (GizmoSpawningLocations[index] == null) GizmoSpawningLocations[index] ??= new List<PRTransform>();
GizmoSpawningLocations[index] = new List<PRTransform>();
marker.PRTransform.Vector3D += Position; marker.PRTransform.Vector3D += Position;
GizmoSpawningLocations[index].Add(marker.PRTransform); GizmoSpawningLocations[index].Add(marker.PRTransform);
@ -380,10 +379,7 @@ namespace DiIiS_NA.GameServer.GSSystem.MapSystem
/// </summary> /// </summary>
/// <param name="player">The player.</param> /// <param name="player">The player.</param>
/// <returns><see cref="bool"/></returns> /// <returns><see cref="bool"/></returns>
public bool IsRevealedToPlayer(Player player) public bool IsRevealedToPlayer(Player player) => player.RevealedObjects.ContainsKey(GlobalID);
{
return player.RevealedObjects.ContainsKey(GlobalID);
}
/// <summary> /// <summary>
/// Reveal the scene to given player. /// Reveal the scene to given player.

View File

@ -145,10 +145,9 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads
return; return;
} }
if (Context != null) if (Context?.User is Player plr) //Hitpoints_On_Kill
if (Context.User is Player player) //Hitpoints_On_Kill if (plr.Attributes[GameAttributes.Hitpoints_On_Kill] > 0)
if (player.Attributes[GameAttributes.Hitpoints_On_Kill] > 0) plr.AddHP(plr.Attributes[GameAttributes.Hitpoints_On_Kill]);
player.AddHP(player.Attributes[GameAttributes.Hitpoints_On_Kill]);
// HACK: add to hackish list thats used to defer deleting actor and filter it from powers targetting // HACK: add to hackish list thats used to defer deleting actor and filter it from powers targetting
if (!(Target is Boss)) if (!(Target is Boss))
@ -175,7 +174,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads
if (Target is Minion minionTarget) 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.Followers.Remove(minionTarget.GlobalID);
player.FreeFollowerIndex(minionTarget.SNO); player.FreeFollowerIndex(minionTarget.SNO);
@ -198,9 +197,8 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads
// send this death payload to buffs // send this death payload to buffs
Target.World.BuffManager.SendTargetPayload(Target, this); Target.World.BuffManager.SendTargetPayload(Target, this);
if (Context != null) if (Context?.User != null)
if (Context.User != null) Target.World.BuffManager.SendTargetPayload(Context.User, this);
Target.World.BuffManager.SendTargetPayload(Context.User, this);
Target.World.BroadcastIfRevealed(plr => new PlayEffectMessage() 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 // Spawn Random item and give exp for each player in range
List<Player> players = Target.GetPlayersInRange(100f); List<Player> players = Target.GetPlayersInRange(100f);
foreach (Player plr in players) foreach (Player rangedPlayer in players)
{ {
int grantedExp = 0; int grantedExp = 0;
if (plr.Attributes[GameAttributes.Level] <= Target.Attributes[GameAttributes.Level]) if (rangedPlayer.Attributes[GameAttributes.Level] <= Target.Attributes[GameAttributes.Level])
grantedExp = (int)(Player.LevelBorders[plr.Attributes[GameAttributes.Level]] / grantedExp = (int)(Player.LevelBorders[rangedPlayer.Attributes[GameAttributes.Level]] /
(40 * Target.Attributes[GameAttributes.Level] * 0.85f) * (40 * Target.Attributes[GameAttributes.Level] * 0.85f) *
(Target is Monster monster1 ? Math.Min(monster1.HpMultiplier, 3f) : 1f)); (Target is Monster monster1 ? Math.Min(monster1.HpMultiplier, 3f) : 1f));
else 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 - (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)); 20));
grantedExp = (int)(grantedExp * (plr.Attributes[GameAttributes.Experience_Bonus_Percent] + 1)); grantedExp = (int)(grantedExp * (rangedPlayer.Attributes[GameAttributes.Experience_Bonus_Percent] + 1));
grantedExp += (int)plr.Attributes[GameAttributes.Experience_Bonus]; grantedExp += (int)rangedPlayer.Attributes[GameAttributes.Experience_Bonus];
if (LootAndExp) if (LootAndExp)
{ {
grantedExp = (int)(grantedExp * plr.World.Game.XpModifier); grantedExp = (int)(grantedExp * rangedPlayer.World.Game.XpModifier);
float tempExp = grantedExp * GameServerConfig.Instance.RateExp; float tempExp = grantedExp * GameServerConfig.Instance.RateExp;
plr.UpdateExp(Math.Max((int)tempExp, 1)); rangedPlayer.UpdateExp(Math.Max((int)tempExp, 1));
var a = (int)plr.Attributes[GameAttributes.Experience_Bonus]; var a = (int)rangedPlayer.Attributes[GameAttributes.Experience_Bonus];
var a1 = (int)plr.Attributes[GameAttributes.Experience_Bonus_Percent]; var a1 = (int)rangedPlayer.Attributes[GameAttributes.Experience_Bonus_Percent];
plr.KilledMonstersTempCount++; rangedPlayer.KilledMonstersTempCount++;
} }
if (Target is Champion or Rare or Boss or Unique) if (Target is Champion or Rare or Boss or Unique)
{ {
plr.KilledElitesTempCount++; rangedPlayer.KilledElitesTempCount++;
} }
//achievements here //achievements here
if (Target is Monster monster) 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) 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) if (PowerMath.Distance2D(rangedPlayer.Position, monster.Position) >= 45f)
plr.AddAchievementCounter(74987243307061, 1); rangedPlayer.AddAchievementCounter(74987243307061, 1);
if (monster.Attributes[GameAttributes.Feared]) if (monster.Attributes[GameAttributes.Feared])
plr.AddAchievementCounter(74987243307064, 1); rangedPlayer.AddAchievementCounter(74987243307064, 1);
if (Context.PowerSNO == 75301) if (Context.PowerSNO == 75301)
{ {
plr.SpikeTrapsKilled++; rangedPlayer.SpikeTrapsKilled++;
if (plr.SpikeTrapsKilled >= 15) if (rangedPlayer.SpikeTrapsKilled >= 15)
plr.GrantAchievement(74987243307060); rangedPlayer.GrantAchievement(74987243307060);
plr.AddTimedAction(5f, new Action<int>((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] < if (rangedPlayer.Attributes[GameAttributes.Resource_Cur, 3] <
plr.Attributes[GameAttributes.Resource_Max_Total, 3]) rangedPlayer.Attributes[GameAttributes.Resource_Max_Total, 3])
plr.AddAchievementCounter(74987243307550, 1); rangedPlayer.AddAchievementCounter(74987243307550, 1);
} }
if (plr.Toon.Class == ToonClass.Wizard) if (rangedPlayer.Toon.Class == ToonClass.Wizard)
{ {
if (monster.Attributes[GameAttributes.Frozen]) 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) if (Context.User.Attributes[GameAttributes.Team_Override] == 1)
plr.AddAchievementCounter(74987243307564, 1); rangedPlayer.AddAchievementCounter(74987243307564, 1);
} }
switch (monster) switch (monster)
{ {
case Champion: case Champion:
plr.CheckKillMonsterCriteria(monster.SNO, 1); rangedPlayer.CheckKillMonsterCriteria(monster.SNO, 1);
break; break;
case Rare: case Rare:
plr.CheckKillMonsterCriteria(monster.SNO, 2); rangedPlayer.CheckKillMonsterCriteria(monster.SNO, 2);
break; break;
case Unique: case Unique:
plr.CheckKillMonsterCriteria(monster.SNO, 4); rangedPlayer.CheckKillMonsterCriteria(monster.SNO, 4);
break; break;
} }
} }
@ -503,26 +501,26 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads
if (LoreRegistry.Lore.ContainsKey(Target.World.SNO) && if (LoreRegistry.Lore.ContainsKey(Target.World.SNO) &&
LoreRegistry.Lore[Target.World.SNO].chests_lore.ContainsKey(Target.SNO)) LoreRegistry.Lore[Target.World.SNO].chests_lore.ContainsKey(Target.SNO))
foreach (int loreId in LoreRegistry.Lore[Target.World.SNO].chests_lore[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; break;
} }
} }
if (plr.SkillSet.HasPassive(218191) && PowerMath.Distance2D(plr.Position, Target.Position) <= if (rangedPlayer.SkillSet.HasPassive(218191) && PowerMath.Distance2D(rangedPlayer.Position, Target.Position) <=
20f + plr.Attributes[GameAttributes.Gold_PickUp_Radius]) //GraveInjustice (WD) 20f + rangedPlayer.Attributes[GameAttributes.Gold_PickUp_Radius]) //GraveInjustice (WD)
{ {
plr.AddHP(plr.Attributes[GameAttributes.Hitpoints_Max_Total] / 100f); rangedPlayer.AddHP(rangedPlayer.Attributes[GameAttributes.Hitpoints_Max_Total] / 100f);
plr.GeneratePrimaryResource(plr.Attributes[GameAttributes.Resource_Max_Total, 0] / 100f); rangedPlayer.GeneratePrimaryResource(rangedPlayer.Attributes[GameAttributes.Resource_Max_Total, 0] / 100f);
foreach (var cdBuff in plr.World.BuffManager.GetBuffs<CooldownBuff>(plr)) foreach (var cdBuff in rangedPlayer.World.BuffManager.GetBuffs<CooldownBuff>(rangedPlayer))
cdBuff.Reduce(60); cdBuff.Reduce(60);
} }
if (plr.SkillSet.HasPassive(357218) && if (rangedPlayer.SkillSet.HasPassive(357218) &&
PowerMath.Distance2D(plr.Position, Target.Position) <= 15f) //Fervor (Crusader) 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<Leech.Rune_E_Buff>(Target)) if (Target.World.BuffManager.HasBuff<Leech.Rune_E_Buff>(Target))
@ -541,14 +539,14 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads
if (Target.World.BuffManager.GetFirstBuff<CrusaderJudgment.JudgedDebuffRooted>(Target).conversion) if (Target.World.BuffManager.GetFirstBuff<CrusaderJudgment.JudgedDebuffRooted>(Target).conversion)
if (FastRandom.Instance.Next() < 0.2f) 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.Brain.DeActivate();
avatar.Position = PowerContext.RandomDirection(plr.Position, 3f, 8f); avatar.Position = PowerContext.RandomDirection(rangedPlayer.Position, 3f, 8f);
avatar.Attributes[GameAttributes.Untargetable] = true; avatar.Attributes[GameAttributes.Untargetable] = true;
avatar.EnterWorld(avatar.Position); avatar.EnterWorld(avatar.Position);
Task.Delay(1000).ContinueWith(d => Task.Delay(1000).ContinueWith(_ =>
{ {
(avatar as Minion).Brain.Activate(); (avatar as Minion).Brain.Activate();
avatar.Attributes[GameAttributes.Untargetable] = false; avatar.Attributes[GameAttributes.Untargetable] = false;
@ -556,20 +554,20 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads
}); });
} }
if (plr.SkillSet.HasPassive(208571) && if (rangedPlayer.SkillSet.HasPassive(208571) &&
PowerMath.Distance2D(plr.Position, Target.Position) <= PowerMath.Distance2D(rangedPlayer.Position, Target.Position) <=
12f + plr.Attributes[GameAttributes.Gold_PickUp_Radius] && 12f + rangedPlayer.Attributes[GameAttributes.Gold_PickUp_Radius] &&
FastRandom.Instance.Next(100) < 5) //CircleOfLife (WD) 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.Brain.DeActivate();
dog.Position = PowerContext.RandomDirection(plr.Position, 3f, 8f); dog.Position = PowerContext.RandomDirection(rangedPlayer.Position, 3f, 8f);
dog.Attributes[GameAttributes.Untargetable] = true; dog.Attributes[GameAttributes.Untargetable] = true;
dog.EnterWorld(dog.Position); dog.EnterWorld(dog.Position);
dog.PlayActionAnimation(AnimationSno.zombiedog_summon_01); dog.PlayActionAnimation(AnimationSno.zombiedog_summon_01);
Context.DogsSummoned++; Context.DogsSummoned++;
Task.Delay(1000).ContinueWith(d => Task.Delay(1000).ContinueWith(_ =>
{ {
dog.Brain.Activate(); dog.Brain.Activate();
dog.Attributes[GameAttributes.Untargetable] = false; 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 != null)
if (Context.DogsSummoned >= 3) if (Context.DogsSummoned >= 3)
plr.GrantAchievement(74987243307567); rangedPlayer.GrantAchievement(74987243307567);
} }
Logger.Trace( Logger.Trace(
@ -640,13 +638,13 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads
Target.World.Game.ActiveNephalemProgress += Target.World.Game.ActiveNephalemProgress +=
GameServerConfig.Instance.NephalemRiftProgressMultiplier * (Target.Quality + 1); GameServerConfig.Instance.NephalemRiftProgressMultiplier * (Target.Quality + 1);
Player master = null; 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) if (plr3.PlayerIndex == 0)
master = plr; master = plr3;
if (GameServerConfig.Instance.NephalemRiftAutoFinish && Target.World.Monsters.Count(s => !s.Dead) <= GameServerConfig.Instance.NephalemRiftAutoFinishThreshold) Target.World.Game.ActiveNephalemProgress = 651; 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)); plr3.InGameClient.SendMessage(new SimpleMessage(Opcodes.KillCounterRefresh));
plr.InGameClient.SendMessage(new FloatDataMessage(Opcodes.DungeonFinderProgressMessage) plr3.InGameClient.SendMessage(new FloatDataMessage(Opcodes.DungeonFinderProgressMessage)
{ {
Field0 = Target.World.Game.ActiveNephalemProgress Field0 = Target.World.Game.ActiveNephalemProgress
}); });
@ -655,7 +653,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads
Target.World.Game.ActiveNephalemKilledMobs = true; Target.World.Game.ActiveNephalemKilledMobs = true;
if (Target.World.Game.NephalemGreater) if (Target.World.Game.NephalemGreater)
{ {
plr.InGameClient.SendMessage(new QuestCounterMessage() plr3.InGameClient.SendMessage(new QuestCounterMessage()
{ {
snoQuest = 0x00052654, snoQuest = 0x00052654,
snoLevelArea = 0x000466E2, snoLevelArea = 0x000466E2,
@ -664,7 +662,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads
Checked = 1, Checked = 1,
Counter = 1 Counter = 1
}); });
plr.InGameClient.SendMessage(new QuestUpdateMessage() plr3.InGameClient.SendMessage(new QuestUpdateMessage()
{ {
snoQuest = 0x00052654, snoQuest = 0x00052654,
snoLevelArea = 0x000466E2, snoLevelArea = 0x000466E2,
@ -675,7 +673,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads
} }
else else
{ {
plr.InGameClient.SendMessage(new QuestCounterMessage() plr3.InGameClient.SendMessage(new QuestCounterMessage()
{ {
snoQuest = 0x00052654, snoQuest = 0x00052654,
snoLevelArea = 0x000466E2, snoLevelArea = 0x000466E2,
@ -684,7 +682,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads
Checked = 1, Checked = 1,
Counter = 1 Counter = 1
}); });
plr.InGameClient.SendMessage(new QuestUpdateMessage() plr3.InGameClient.SendMessage(new QuestUpdateMessage()
{ {
snoQuest = 0x00052654, snoQuest = 0x00052654,
snoLevelArea = 0x000466E2, 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 SNO = 0x0005BBD8
}); });
plr.InGameClient.SendMessage(new DisplayGameTextMessage(Opcodes.DisplayGameChatTextMessage) plr3.InGameClient.SendMessage(new DisplayGameTextMessage(Opcodes.DisplayGameChatTextMessage)
{ Message = "Messages:LR_BossSpawned" }); { Message = "Messages:LR_BossSpawned" });
plr.InGameClient.SendMessage(new DisplayGameTextMessage(Opcodes.DisplayGameTextMessage) plr3.InGameClient.SendMessage(new DisplayGameTextMessage(Opcodes.DisplayGameTextMessage)
{ Message = "Messages:LR_BossSpawned" }); { Message = "Messages:LR_BossSpawned" });
StartConversation(Target.World, 366542); 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]) if (Target.Attributes[GameAttributes.Is_Loot_Run_Boss])
{ {
Target.World.Game.ActiveNephalemKilledBoss = true; 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 //Enable banner /advocaite
plr.Attributes[GameAttributes.Banner_Usable] = true; plr3.Attributes[GameAttributes.Banner_Usable] = true;
if (Target.World.Game.NephalemGreater) if (Target.World.Game.NephalemGreater)
{ {
plr.InGameClient.SendMessage(new QuestCounterMessage() plr3.InGameClient.SendMessage(new QuestCounterMessage()
{ {
snoQuest = 0x00052654, snoQuest = 0x00052654,
snoLevelArea = 0x000466E2, snoLevelArea = 0x000466E2,
@ -748,7 +746,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads
Checked = 1, Checked = 1,
Counter = 1 Counter = 1
}); });
plr.InGameClient.SendMessage(new QuestUpdateMessage() plr3.InGameClient.SendMessage(new QuestUpdateMessage()
{ {
snoQuest = 0x00052654, snoQuest = 0x00052654,
snoLevelArea = 0x000466E2, snoLevelArea = 0x000466E2,
@ -757,35 +755,35 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads
Failed = false Failed = false
}); });
plr.Attributes[GameAttributes.Jewel_Upgrades_Max] = 3; plr3.Attributes[GameAttributes.Jewel_Upgrades_Max] = 3;
plr.Attributes[GameAttributes.Jewel_Upgrades_Used] = 0; plr3.Attributes[GameAttributes.Jewel_Upgrades_Used] = 0;
plr.Attributes[GameAttributes.Jewel_Upgrades_Bonus] = 0; plr3.Attributes[GameAttributes.Jewel_Upgrades_Bonus] = 0;
if (plr.Attributes[GameAttributes.Tiered_Loot_Run_Death_Count] == 0) if (plr3.Attributes[GameAttributes.Tiered_Loot_Run_Death_Count] == 0)
plr.Attributes[GameAttributes.Jewel_Upgrades_Bonus]++; plr3.Attributes[GameAttributes.Jewel_Upgrades_Bonus]++;
if (plr.InGameClient.Game.NephalemBuff) if (plr3.InGameClient.Game.NephalemBuff)
plr.Attributes[GameAttributes.Jewel_Upgrades_Bonus]++; plr3.Attributes[GameAttributes.Jewel_Upgrades_Bonus]++;
plr.InGameClient.Game.LastTieredRiftTimeout = plr3.InGameClient.Game.LastTieredRiftTimeout =
(int)((plr.InGameClient.Game.TiredRiftTimer.TimeoutTick - (int)((plr3.InGameClient.Game.TiredRiftTimer.TimeoutTick -
plr.InGameClient.Game.TickCounter) / plr.InGameClient.Game.TickRate / plr3.InGameClient.Game.TickCounter) / plr3.InGameClient.Game.TickRate /
plr.InGameClient.Game.UpdateFrequency * 10f); plr3.InGameClient.Game.UpdateFrequency * 10f);
plr.InGameClient.Game.TiredRiftTimer.Stop(); plr3.InGameClient.Game.TiredRiftTimer.Stop();
plr.InGameClient.Game.TiredRiftTimer = null; plr3.InGameClient.Game.TiredRiftTimer = null;
plr.InGameClient.SendMessage(new DisplayGameTextMessage(Opcodes.DisplayGameTextMessage) plr3.InGameClient.SendMessage(new DisplayGameTextMessage(Opcodes.DisplayGameTextMessage)
{ {
Message = "Messages:TieredRift_Success", Message = "Messages:TieredRift_Success",
Param1 = plr.InGameClient.Game.LastTieredRiftTimeout / 60, //Minutes Param1 = plr3.InGameClient.Game.LastTieredRiftTimeout / 60, //Minutes
Param2 = plr.InGameClient.Game.LastTieredRiftTimeout % 60 //Seconds Param2 = plr3.InGameClient.Game.LastTieredRiftTimeout % 60 //Seconds
}); });
plr.InGameClient.SendMessage(new SNODataMessage(Opcodes.TimedEventResetMessage) plr3.InGameClient.SendMessage(new SNODataMessage(Opcodes.TimedEventResetMessage)
{ {
Field0 = 0x0005D6EA Field0 = 0x0005D6EA
}); });
Target.World.SpawnMonster(ActorSno._p1_lr_tieredrift_nephalem, Target.Position); Target.World.SpawnMonster(ActorSno._p1_lr_tieredrift_nephalem, Target.Position);
Target.World.SpawnRandomUniqueGem(Target, plr); Target.World.SpawnRandomUniqueGem(Target, plr3);
TagMap newTagMap = new TagMap(); TagMap newTagMap = new TagMap();
newTagMap.Add(new TagKeySNO(526850), new TagMapEntry(526850, 332336, 0)); //World newTagMap.Add(new TagKeySNO(526850), new TagMapEntry(526850, 332336, 0)); //World
@ -799,7 +797,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads
} }
else else
{ {
plr.InGameClient.SendMessage(new QuestCounterMessage() plr3.InGameClient.SendMessage(new QuestCounterMessage()
{ {
snoQuest = 0x00052654, snoQuest = 0x00052654,
snoLevelArea = 0x000466E2, snoLevelArea = 0x000466E2,
@ -808,7 +806,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads
Checked = 1, Checked = 1,
Counter = 1 Counter = 1
}); });
plr.InGameClient.SendMessage(new QuestUpdateMessage() plr3.InGameClient.SendMessage(new QuestUpdateMessage()
{ {
snoQuest = 0x00052654, snoQuest = 0x00052654,
snoLevelArea = 0x000466E2, 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, WorldID = Target.World.GlobalID,
SyncedData = new WorldSyncedData() SyncedData = new WorldSyncedData()
@ -839,13 +837,13 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads
orek.Attributes[GameAttributes.Conversation_Icon, 3] = 2; orek.Attributes[GameAttributes.Conversation_Icon, 3] = 2;
orek.Attributes.BroadcastChangedIfRevealed(); orek.Attributes.BroadcastChangedIfRevealed();
// Unique spawn // Unique spawn
Target.World.SpawnBloodShards(Target, plr, RandomHelper.Next(10, 30)); Target.World.SpawnBloodShards(Target, plr3, RandomHelper.Next(10, 30));
Target.World.SpawnGold(Target, plr); Target.World.SpawnGold(Target, plr3);
Target.World.SpawnGold(Target, plr); Target.World.SpawnGold(Target, plr3);
Target.World.SpawnGold(Target, plr); Target.World.SpawnGold(Target, plr3);
plr.Toon.GameAccount.BigPortalKey++; plr3.Toon.GameAccount.BigPortalKey++;
Target.World.Game.ActiveNephalemProgress = 0f; 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!"); "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 //loot spawning
foreach (var plr in Target.GetPlayersInRange(100)) foreach (var lootSpawnPlayer in Target.GetPlayersInRange(100))
{ {
if (FastRandom.Instance.NextDouble() < 0.45) if (FastRandom.Instance.NextDouble() < 0.45)
Target.World.SpawnGold(Target, plr); Target.World.SpawnGold(Target, lootSpawnPlayer);
if (FastRandom.Instance.NextDouble() < 0.06) if (FastRandom.Instance.NextDouble() < 0.06)
Target.World.SpawnRandomCraftItem(Target, plr); Target.World.SpawnRandomCraftItem(Target, lootSpawnPlayer);
if (FastRandom.Instance.NextDouble() < 0.04) if (FastRandom.Instance.NextDouble() < 0.04)
Target.World.SpawnRandomGem(Target, plr); Target.World.SpawnRandomGem(Target, lootSpawnPlayer);
if (FastRandom.Instance.NextDouble() < 0.15) if (FastRandom.Instance.NextDouble() < 0.15)
Target.World.SpawnRandomPotion(Target, plr); Target.World.SpawnRandomPotion(Target, lootSpawnPlayer);
if (Target.World.Game.Difficulty > 1) if (Target.World.Game.Difficulty > 1)
if (FastRandom.Instance.NextDouble() < 0.15) if (FastRandom.Instance.NextDouble() < 0.15)
Target.World.SpawnItem(Target, plr, 2087837753); Target.World.SpawnItem(Target, lootSpawnPlayer, 2087837753);
if (FastRandom.Instance.NextDouble() < 0.04) if (FastRandom.Instance.NextDouble() < 0.04)
Target.World.SpawnRandomGem(Target, plr); Target.World.SpawnRandomGem(Target, lootSpawnPlayer);
//Logger.Debug("seed: {0}", seed); //Logger.Debug("seed: {0}", seed);
var dropRates = Target.World.Game.IsSeasoned var dropRates = Target.World.Game.IsSeasoned
? LootManager.GetSeasonalDropRates((int)Target.Quality, ? 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 is less than the drop rate, drop the item
if (seed < rate * (1f if (seed < rate * (1f
+ plr.Attributes[GameAttributes.Magic_Find]) + lootSpawnPlayer.Attributes[GameAttributes.Magic_Find])
* GameServerConfig.Instance.RateDrop) * GameServerConfig.Instance.RateDrop)
{ {
//Logger.Debug("rate: {0}", rate); //Logger.Debug("rate: {0}", rate);
@ -947,22 +945,22 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads
? LootManager.GetSeasonalLootQuality((int)Target.Quality, ? LootManager.GetSeasonalLootQuality((int)Target.Quality,
Target.World.Game.Difficulty) Target.World.Game.Difficulty)
: LootManager.GetLootQuality((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) if (Target is Goblin)
Target.World.SpawnRandomGem(Target, plr); Target.World.SpawnRandomGem(Target, lootSpawnPlayer);
} }
else else
break; break;
} }
if ((int)Target.Quality >= 4 && plr.AdditionalLootItems > 0) if ((int)Target.Quality >= 4 && lootSpawnPlayer.AdditionalLootItems > 0)
for (int d = 0; d < plr.AdditionalLootItems; d++) for (int d = 0; d < lootSpawnPlayer.AdditionalLootItems; d++)
{ {
var lootQuality = Target.World.Game.IsHardcore var lootQuality = Target.World.Game.IsHardcore
? LootManager.GetSeasonalLootQuality((int)Target.Quality, ? LootManager.GetSeasonalLootQuality((int)Target.Quality,
Target.World.Game.Difficulty) Target.World.Game.Difficulty)
: LootManager.GetLootQuality((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) 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)) //if (FastRandom.Instance.NextDouble() < LootManager.GetEssenceDropChance(this.Target.World.Game.Difficulty))
// this.Target.World.SpawnEssence(this.Target, plr); // this.Target.World.SpawnEssence(this.Target, plr);
if (Target.World.Game.IsSeasoned) if (Target.World.Game.IsSeasoned)
Target.World.SpawnBloodShards(Target, plr); Target.World.SpawnBloodShards(Target, lootSpawnPlayer);
} }
if (Target.World.Game.IsSeasoned) if (Target.World.Game.IsSeasoned)
@ -978,16 +976,16 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads
switch (Target.SNO) switch (Target.SNO)
{ {
case ActorSno._despair: //Rakanot case ActorSno._despair: //Rakanot
plr.GrantCriteria(74987254022737); lootSpawnPlayer.GrantCriteria(74987254022737);
break; break;
case ActorSno._skeletonking: //Skillet King case ActorSno._skeletonking: //Skillet King
plr.GrantCriteria(74987252582955); lootSpawnPlayer.GrantCriteria(74987252582955);
break; break;
case ActorSno._siegebreakerdemon: //Siegebreaker - Make your choice case ActorSno._siegebreakerdemon: //Siegebreaker - Make your choice
plr.GrantCriteria(74987246511881); lootSpawnPlayer.GrantCriteria(74987246511881);
break; break;
case ActorSno._x1_adria_boss: //Adria - I become a star case ActorSno._x1_adria_boss: //Adria - I become a star
plr.GrantCriteria(74987252384014); lootSpawnPlayer.GrantCriteria(74987252384014);
break; break;
} }
} }
@ -996,26 +994,26 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads
{ {
if (Target.SNO == ActorSno._lacunifemale_c_unique) //Chiltara if (Target.SNO == ActorSno._lacunifemale_c_unique) //Chiltara
if ((float)FastRandom.Instance.NextDouble() < 0.5f) 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 (Target.SNO == ActorSno._bigred_izual) //Izual
if ((float)FastRandom.Instance.NextDouble() < 0.2f) if ((float)FastRandom.Instance.NextDouble() < 0.2f)
{ {
switch (Target.World.Game.Difficulty) switch (Target.World.Game.Difficulty)
{ {
case 0: case 0:
Target.World.SpawnItem(Target, plr, -1463195022); Target.World.SpawnItem(Target, lootSpawnPlayer, -1463195022);
break; break;
case 1: case 1:
Target.World.SpawnItem(Target, plr, 645585264); Target.World.SpawnItem(Target, lootSpawnPlayer, 645585264);
break; break;
case 2: case 2:
Target.World.SpawnItem(Target, plr, -501637898); Target.World.SpawnItem(Target, lootSpawnPlayer, -501637898);
break; break;
case 3: case 3:
Target.World.SpawnItem(Target, plr, 253048194); Target.World.SpawnItem(Target, lootSpawnPlayer, 253048194);
break; break;
default: default:
Target.World.SpawnItem(Target, plr, -1463195022); Target.World.SpawnItem(Target, lootSpawnPlayer, -1463195022);
break; break;
} }
} }
@ -1023,25 +1021,25 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads
switch (Target.SNO) switch (Target.SNO)
{ {
case ActorSno._graverobber_a_ghost_unique_03: case ActorSno._graverobber_a_ghost_unique_03:
plr.GrantCriteria(74987243307212); lootSpawnPlayer.GrantCriteria(74987243307212);
break; break;
case ActorSno._gravedigger_b_ghost_unique_01: case ActorSno._gravedigger_b_ghost_unique_01:
plr.GrantCriteria(74987243309859); lootSpawnPlayer.GrantCriteria(74987243309859);
break; break;
case ActorSno._graverobber_a_ghost_unique_01: case ActorSno._graverobber_a_ghost_unique_01:
plr.GrantCriteria(74987243309860); lootSpawnPlayer.GrantCriteria(74987243309860);
break; break;
case ActorSno._graverobber_a_ghost_unique_02: case ActorSno._graverobber_a_ghost_unique_02:
plr.GrantCriteria(74987243309861); lootSpawnPlayer.GrantCriteria(74987243309861);
break; break;
case ActorSno._ghost_a_unique_01: case ActorSno._ghost_a_unique_01:
plr.GrantCriteria(74987243309862); lootSpawnPlayer.GrantCriteria(74987243309862);
break; break;
case ActorSno._ghost_d_unique01: case ActorSno._ghost_d_unique01:
plr.GrantCriteria(74987243309863); lootSpawnPlayer.GrantCriteria(74987243309863);
break; break;
case ActorSno._ghost_d_unique_01: case ActorSno._ghost_d_unique_01:
plr.GrantCriteria(74987243309864); lootSpawnPlayer.GrantCriteria(74987243309864);
break; break;
} }
} }
@ -1073,103 +1071,90 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads
if (Target is not Boss) return; if (Target is not Boss) return;
foreach (Player plr in players) foreach (Player rangedPlayer in players)
switch (Target.SNO) switch (Target.SNO)
{ {
case ActorSno._skeletonking: //Leoric case ActorSno._skeletonking: //Leoric
if (Context.PowerSNO == 93885) //weapon throw if (Context.PowerSNO == 93885) //weapon throw
plr.GrantAchievement(74987243307050); rangedPlayer.GrantAchievement(74987243307050);
if (isCoop) plr.GrantAchievement(74987252301189); if (isCoop) rangedPlayer.GrantAchievement(74987252301189);
if (isHardcore) plr.GrantAchievement(74987243307489); rangedPlayer.GrantAchievement(isHardcore ? (ulong)74987243307489 : (ulong)74987249381288);
else plr.GrantAchievement(74987249381288);
break; break;
case ActorSno._butcher: //Butcher case ActorSno._butcher: //Butcher
if (Context.PowerSNO == 93885) //weapon throw if (Context.PowerSNO == 93885) //weapon throw
plr.GrantAchievement(74987243307050); rangedPlayer.GrantAchievement(74987243307050);
if (Context.PowerSNO == 71548) //spectral blade if (Context.PowerSNO == 71548) //spectral blade
plr.GrantCriteria(74987243307946); rangedPlayer.GrantCriteria(74987243307946);
if (isCoop) plr.GrantAchievement(74987252696819); if (isCoop) rangedPlayer.GrantAchievement(74987252696819);
if (isHardcore) plr.GrantAchievement(74987254551339); rangedPlayer.GrantAchievement(isHardcore ? (ulong)74987254551339 : (ulong)74987258164419);
else plr.GrantAchievement(74987258164419); rangedPlayer.SetProgress(1, Target.World.Game.Difficulty);
plr.SetProgress(1, Target.World.Game.Difficulty);
break; break;
case ActorSno._maghda: //Maghda case ActorSno._maghda: //Maghda
if (Context.PowerSNO == 93885) //weapon throw if (Context.PowerSNO == 93885) //weapon throw
plr.GrantAchievement(74987243307050); rangedPlayer.GrantAchievement(74987243307050);
if (isCoop) plr.GrantAchievement(74987255855515); if (isCoop) rangedPlayer.GrantAchievement(74987255855515);
if (isHardcore) plr.GrantAchievement(74987243307507); rangedPlayer.GrantAchievement(isHardcore ? (ulong)74987243307507 : (ulong)74987246434969);
else plr.GrantAchievement(74987246434969);
break; break;
case ActorSno._zoltunkulle: //Zoltun Kulle case ActorSno._zoltunkulle: //Zoltun Kulle
if (isCoop) plr.GrantAchievement(74987246137208); if (isCoop) rangedPlayer.GrantAchievement(74987246137208);
if (isHardcore) plr.GrantAchievement(74987243307509); rangedPlayer.GrantAchievement(isHardcore ? (ulong)74987243307509 : (ulong)74987252195665);
else plr.GrantAchievement(74987252195665);
break; break;
case ActorSno._belial: //Belial (big) case ActorSno._belial: //Belial (big)
if (Context.PowerSNO == 93885) //weapon throw if (Context.PowerSNO == 93885) //weapon throw
plr.GrantAchievement(74987243307050); rangedPlayer.GrantAchievement(74987243307050);
if (Context.PowerSNO == 71548) //spectral blade if (Context.PowerSNO == 71548) //spectral blade
plr.GrantCriteria(74987243310916); rangedPlayer.GrantCriteria(74987243310916);
if (isCoop) plr.GrantAchievement(74987256826382); if (isCoop) rangedPlayer.GrantAchievement(74987256826382);
if (isHardcore) plr.GrantAchievement(74987244906887); rangedPlayer.GrantAchievement(isHardcore ? (ulong)74987244906887 : (ulong)74987244645044);
else plr.GrantAchievement(74987244645044); rangedPlayer.SetProgress(2, Target.World.Game.Difficulty);
plr.SetProgress(2, Target.World.Game.Difficulty);
break; break;
case ActorSno._gluttony: //Gluttony case ActorSno._gluttony: //Gluttony
if (isCoop) plr.GrantAchievement(74987249112946); if (isCoop) rangedPlayer.GrantAchievement(74987249112946);
if (isHardcore) plr.GrantAchievement(74987243307519); rangedPlayer.GrantAchievement(isHardcore ? (ulong)74987243307519 : (ulong)74987259418615);
else plr.GrantAchievement(74987259418615);
break; break;
case ActorSno._siegebreakerdemon: //Siegebreaker case ActorSno._siegebreakerdemon: //Siegebreaker
if (Context.PowerSNO == 93885) //weapon throw if (Context.PowerSNO == 93885) //weapon throw
plr.GrantAchievement(74987243307050); rangedPlayer.GrantAchievement(74987243307050);
if (isCoop) plr.GrantAchievement(74987253664242); if (isCoop) rangedPlayer.GrantAchievement(74987253664242);
if (isHardcore) plr.GrantAchievement(74987243307521); rangedPlayer.GrantAchievement(isHardcore ? (ulong)74987243307521 : (ulong)74987248255991);
else plr.GrantAchievement(74987248255991);
break; break;
case ActorSno._mistressofpain: //Cydaea case ActorSno._mistressofpain: //Cydaea
if (Context.PowerSNO == 93885) //weapon throw if (Context.PowerSNO == 93885) //weapon throw
plr.GrantAchievement(74987243307050); rangedPlayer.GrantAchievement(74987243307050);
if (isCoop) plr.GrantAchievement(74987257890442); if (isCoop) rangedPlayer.GrantAchievement(74987257890442);
if (isHardcore) plr.GrantAchievement(74987243307523); rangedPlayer.GrantAchievement(isHardcore ? (ulong)74987243307523 : (ulong)74987254675042);
else plr.GrantAchievement(74987254675042);
break; break;
case ActorSno._azmodan: //Azmodan case ActorSno._azmodan: //Azmodan
if (Context.PowerSNO == 93885) //weapon throw if (Context.PowerSNO == 93885) //weapon throw
plr.GrantAchievement(74987243307050); rangedPlayer.GrantAchievement(74987243307050);
if (Context.PowerSNO == 71548) //spectral blade if (Context.PowerSNO == 71548) //spectral blade
plr.GrantCriteria(74987243310915); rangedPlayer.GrantCriteria(74987243310915);
if (isCoop) plr.GrantAchievement(74987247100576); if (isCoop) rangedPlayer.GrantAchievement(74987247100576);
if (isHardcore) plr.GrantAchievement(74987251893684); rangedPlayer.GrantAchievement(isHardcore ? (ulong)74987251893684 : (ulong)74987247855713);
else plr.GrantAchievement(74987247855713); rangedPlayer.SetProgress(3, Target.World.Game.Difficulty);
plr.SetProgress(3, Target.World.Game.Difficulty);
break; break;
case ActorSno._terrordemon_a_unique_1000monster: //Iskatu case ActorSno._terrordemon_a_unique_1000monster: //Iskatu
if (isCoop) plr.GrantAchievement(74987255392558); if (isCoop) rangedPlayer.GrantAchievement(74987255392558);
if (isHardcore) plr.GrantAchievement(74987248632930); rangedPlayer.GrantAchievement(isHardcore ? (ulong)74987248632930 : (ulong)74987246017001);
else plr.GrantAchievement(74987246017001);
break; break;
case ActorSno._despair: //Rakanoth case ActorSno._despair: //Rakanoth
if (Context.PowerSNO == 93885) //weapon throw if (Context.PowerSNO == 93885) //weapon throw
plr.GrantAchievement(74987243307050); rangedPlayer.GrantAchievement(74987243307050);
if (isCoop) plr.GrantAchievement(74987248781143); if (isCoop) rangedPlayer.GrantAchievement(74987248781143);
if (isHardcore) plr.GrantAchievement(74987243307533); rangedPlayer.GrantAchievement(isHardcore ? (ulong)74987243307533 : (ulong)74987256508058);
else plr.GrantAchievement(74987256508058);
break; break;
case ActorSno._bigred_izual: //Izual case ActorSno._bigred_izual: //Izual
if (isCoop) plr.GrantAchievement(74987254969009); if (isCoop) rangedPlayer.GrantAchievement(74987254969009);
if (isHardcore) plr.GrantAchievement(74987247989681); rangedPlayer.GrantAchievement(isHardcore ? (ulong)74987247989681 : (ulong)74987244988685);
else plr.GrantAchievement(74987244988685); if (isSeasoned) rangedPlayer.GrantCriteria(74987249642121);
if (isSeasoned) plr.GrantCriteria(74987249642121);
break; break;
case ActorSno._diablo: //Diablo case ActorSno._diablo: //Diablo
if (Context.PowerSNO == 93885) //weapon throw if (Context.PowerSNO == 93885) //weapon throw
plr.GrantAchievement(74987243307050); rangedPlayer.GrantAchievement(74987243307050);
if (isCoop) plr.GrantAchievement(74987250386944); if (isCoop) rangedPlayer.GrantAchievement(74987250386944);
if (isHardcore) plr.GrantAchievement(74987250070969); rangedPlayer.GrantAchievement(isHardcore ? (ulong)74987250070969 : (ulong)74987248188984);
else plr.GrantAchievement(74987248188984); rangedPlayer.SetProgress(4, Target.World.Game.Difficulty);
plr.SetProgress(4, Target.World.Game.Difficulty); if (isSeasoned) rangedPlayer.GrantCriteria(74987250915380);
if (isSeasoned) plr.GrantCriteria(74987250915380);
break; break;
default: default:
break; break;
@ -1237,7 +1222,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads
player.Inventory.DecreaseDurability(0.1f); player.Inventory.DecreaseDurability(0.1f);
if (player.World.Game.IsHardcore) if (player.World.Game.IsHardcore)
{ {
player.AddTimedAction(3f, new Action<int>((q) => player.Revive(player.CheckPointPosition))); player.AddTimedAction(3f, (_) => player.Revive(player.CheckPointPosition));
var toon = player.Toon.DBToon; var toon = player.Toon.DBToon;
toon.Deaths++; toon.Deaths++;
player.World.Game.GameDbSession.SessionUpdate(toon); player.World.Game.GameDbSession.SessionUpdate(toon);
@ -1289,20 +1274,18 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads
return AnimationSno._NONE; return AnimationSno._NONE;
} }
private static TagKeyInt GetTagForSpecialDeath(int specialDeathType) private static TagKeyInt GetTagForSpecialDeath(int specialDeathType) =>
{ specialDeathType switch
switch (specialDeathType)
{ {
default: return null; 1 => AnimationSetKeys.DeathDisintegration,
case 1: return AnimationSetKeys.DeathDisintegration; 2 => AnimationSetKeys.DeathPulverise,
case 2: return AnimationSetKeys.DeathPulverise; 3 => AnimationSetKeys.DeathPlague,
case 3: return AnimationSetKeys.DeathPlague; 4 => AnimationSetKeys.DeathDismember,
case 4: return AnimationSetKeys.DeathDismember; 5 => AnimationSetKeys.DeathDecap,
case 5: return AnimationSetKeys.DeathDecap; 6 => AnimationSetKeys.DeathAcid,
case 6: return AnimationSetKeys.DeathAcid; 7 => AnimationSetKeys.DeathLava, // haven't seen lava used, but there's no other place for it
case 7: return AnimationSetKeys.DeathLava; // haven't seen lava used, but there's no other place for it 8 => AnimationSetKeys.DeathSpirit,
case 8: return AnimationSetKeys.DeathSpirit; _ => null
} };
}
} }
} }