diff --git a/src/DiIiS-NA/Core/Logging/LogManager.cs b/src/DiIiS-NA/Core/Logging/LogManager.cs
index 20697b2..2353711 100644
--- a/src/DiIiS-NA/Core/Logging/LogManager.cs
+++ b/src/DiIiS-NA/Core/Logging/LogManager.cs
@@ -18,12 +18,12 @@ namespace DiIiS_NA.Core.Logging
///
/// Available & configured log targets.
///
- internal readonly static List Targets = new List();
+ internal static readonly List Targets = new();
///
/// Available loggers.
///
- internal static readonly Dictionary Loggers = new Dictionary();
+ internal readonly static Dictionary Loggers = new();
///
/// Creates and returns a logger named with declaring type.
@@ -37,10 +37,7 @@ namespace DiIiS_NA.Core.Logging
if (name == null) // see if we got a name.
throw new Exception("Error getting full name for declaring type.");
- if (!Loggers.ContainsKey(name)) // see if we already have instance for the given name.
- Loggers.Add(name, new Logger(name)); // add it to dictionary of loggers.
-
- return Loggers[name]; // return the newly created logger.
+ return CreateLogger(name); // return the newly created logger.
}
///
diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/Item.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/Item.cs
index 453cae0..a70fc14 100644
--- a/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/Item.cs
+++ b/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/Item.cs
@@ -46,29 +46,22 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
{
public DBInventory DBInventory = null;
- private static readonly Logger Logger = LogManager.CreateLogger();
- public bool ItemHasChanges { get; private set; }//needed in Future, set this to true if Item affixes or item attributes have changed.
+ private static readonly Logger Logger = LogManager.CreateLogger(nameof(Item));
+
+ public bool ItemHasChanges
+ {
+ get;
+ private set; //needed in Future, set this to true if Item affixes or item attributes have changed.
+ }
- public override ActorType ActorType { get { return ActorType.Item; } }
+ public override ActorType ActorType => ActorType.Item;
public Actor Owner { get; set; } // Only set when the _actor_ has the item in its inventory. /fasbat
- public ItemTable ItemDefinition
- {
- get
- {
- return ItemGenerator.GetItemDefinition(GBHandle.GBID);
- }
- }
+ public ItemTable ItemDefinition => ItemGenerator.GetItemDefinition(GBHandle.GBID);
- public ItemTypeTable ItemType
- {
- get
- {
- return ItemGroup.FromHash(ItemDefinition.ItemTypesGBID);
- }
- }
+ public ItemTypeTable ItemType => ItemGroup.FromHash(ItemDefinition.ItemTypesGBID);
public bool Unidentified = false;
@@ -101,40 +94,28 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
public ItemState CurrentState { get; set; }
public int EquipmentSlot { get; private set; }
- public Vector2D InventoryLocation { get; private set; } // Column, row; NOTE: Call SetInventoryLocation() instead of setting fields on this
+
+ public Vector2D
+ InventoryLocation
+ {
+ get;
+ private set;
+ } // Column, row; NOTE: Call SetInventoryLocation() instead of setting fields on this
public override int Quality
{
- get
- {
- return Attributes[GameAttribute.Item_Quality_Level];
- }
- set
- {
- Attributes[GameAttribute.Item_Quality_Level] = value;
- }
+ get => Attributes[GameAttribute.Item_Quality_Level];
+ set => Attributes[GameAttribute.Item_Quality_Level] = value;
}
- public SNOHandle SnoFlippyActory
- {
- get
- {
- return ActorData.TagMap.ContainsKey(ActorKeys.Flippy) ? ActorData.TagMap[ActorKeys.Flippy] : null;
- }
- }
+ public SNOHandle SnoFlippyActory => ActorData.TagMap.ContainsKey(ActorKeys.Flippy) ? ActorData.TagMap[ActorKeys.Flippy] : null;
- public SNOHandle SnoFlippyParticle
- {
- get
- {
- return ActorData.TagMap.ContainsKey(ActorKeys.FlippyParticle) ? ActorData.TagMap[ActorKeys.FlippyParticle] : null;
- }
- }
+ public SNOHandle SnoFlippyParticle =>
+ ActorData.TagMap.ContainsKey(ActorKeys.FlippyParticle)
+ ? ActorData.TagMap[ActorKeys.FlippyParticle]
+ : null;
- public override bool HasWorldLocation
- {
- get { return Owner == null; }
- }
+ public override bool HasWorldLocation => Owner == null;
public override InventoryLocationMessageData InventoryLocationMessage(Player plr)
{
@@ -164,10 +145,11 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
public List AffixFamilies = new List();
- public Item(World world, ItemTable definition, IEnumerable affixList, string serializedGameAttributeMap, int count = 1)
+ public Item(World world, ItemTable definition, IEnumerable affixList, string serializedGameAttributeMap,
+ int count = 1)
: base(world, (ActorSno)definition.SNOActor)
{
- GBHandle.GBID = definition.Hash;
+ GBHandle.GBID = definition.Hash;
SetInitialValues(definition);
Attributes.FillBySerialized(serializedGameAttributeMap);
if (Attributes[GameAttribute.Seed] == 0)
@@ -180,7 +162,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
//for (int i = 50; i < 60; i++)
//Attributes[GameAttribute.Requirement, 57] = 10;
-
+
Attributes[GameAttribute.ItemStackQuantityLo] = count;
Attributes[GameAttribute.Loot_2_0_Drop] = true;
@@ -191,17 +173,22 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
//this.Attributes[GameAttribute.EnchantAffix, 1] = -758203990;
//this.Attributes[GameAttribute.EnchantRangeVal] = 1;
//*
- if (IsArmor(ItemType) || IsWeapon(ItemType) || IsOffhand(ItemType) || (IsPotion(ItemType) && ItemDefinition.Name.Contains("Legendary")) || IsAccessory(ItemType))
+ if (IsArmor(ItemType) || IsWeapon(ItemType) || IsOffhand(ItemType) ||
+ (IsPotion(ItemType) && ItemDefinition.Name.Contains("Legendary")) || IsAccessory(ItemType))
{
//Attributes[GameAttribute.Requirement, 64] = 0;
- var reqLevel = (definition.RequiredLevel % 10 != 0) ? definition.RequiredLevel - 1 : definition.RequiredLevel;
+ var reqLevel = (definition.RequiredLevel % 10 != 0)
+ ? definition.RequiredLevel - 1
+ : definition.RequiredLevel;
var level = Math.Max(AffixList.Any() ? AffixList.Select(a => a.ItemLevel).Max() : 0, reqLevel);
- Attributes[GameAttribute.Requirement, 57] = Math.Max(level - Attributes[GameAttribute.Item_Level_Requirement_Reduction], 0);
+ Attributes[GameAttribute.Requirement, 57] =
+ Math.Max(level - Attributes[GameAttribute.Item_Level_Requirement_Reduction], 0);
}
if (AffixList.Count > 0)
{
- if (Attributes[GameAttribute.Requirement, 57] != AffixList[0].Definition.OverrideLevelReq && AffixList[0].Definition.OverrideLevelReq != 0)
+ if (Attributes[GameAttribute.Requirement, 57] != AffixList[0].Definition.OverrideLevelReq &&
+ AffixList[0].Definition.OverrideLevelReq != 0)
Attributes[GameAttribute.Requirement, 57] = AffixList[0].Definition.OverrideLevelReq;
foreach (var affix in AffixList)
{
@@ -219,7 +206,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
*/
//Attributes[GameAttribute.ItemStackQuantityLo] = 1;
//Attributes[GameAttribute.Seed] = RandomHelper.Next(); //unchecked((int)2286800181);
-
+
}
@@ -254,7 +241,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
Attributes[GameAttribute.Loot_2_0_Drop] = true;
- if (IsArmor(ItemType) || IsWeapon(ItemType) || IsOffhand(ItemType) || IsAccessory(ItemType) || IsShard(ItemType))
+ if (IsArmor(ItemType) || IsWeapon(ItemType) || IsOffhand(ItemType) || IsAccessory(ItemType) ||
+ IsShard(ItemType))
Attributes[GameAttribute.Item_Quality_Level] = RandomHelper.Next(8);
if (ItemType.Usable.HasFlag(ItemFlags.AtLeastMagical) && Attributes[GameAttribute.Item_Quality_Level] < 3)
Attributes[GameAttribute.Item_Quality_Level] = 3;
@@ -266,6 +254,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
{
Attributes[GameAttribute.Item_Quality_Level] = 9;
}
+
if (ItemDefinition.Name.ToLower().Contains("unique_gem"))
{
Attributes[GameAttribute.Item_Quality_Level] = 9;
@@ -273,10 +262,12 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
Attributes[GameAttribute.Jewel_Rank] = 1;
//Attributes[GameAttribute.Jewel_Rank] = 1;
}
+
if (ItemDefinition.Name.ToLower().Contains("norm_season"))
{
Attributes[GameAttribute.Item_Quality_Level] = 9;
}
+
if (ItemDefinition.Name.ToLower().StartsWith("p71_ethereal"))
{
@@ -310,9 +301,11 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
{
if (!crafted)
RandomGenerator.Next();
- if (Attributes[GameAttribute.Item_Quality_Level] >= 5 && Attributes[GameAttribute.Item_Quality_Level] <= 7)
+ if (Attributes[GameAttribute.Item_Quality_Level] >= 5 &&
+ Attributes[GameAttribute.Item_Quality_Level] <= 7)
RandomGenerator.Next();
}
+
RandomGenerator.ReinitSeed();
if (IsWeapon(ItemType) && !crafted)
@@ -367,13 +360,17 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
Attributes[GameAttribute.MinimapActive] = true;
}
- if (IsArmor(ItemType) || IsWeapon(ItemType) || IsOffhand(ItemType) || (IsPotion(ItemType) && ItemDefinition.Name.Contains("Legendary")) || IsAccessory(ItemType))
+ if (IsArmor(ItemType) || IsWeapon(ItemType) || IsOffhand(ItemType) ||
+ (IsPotion(ItemType) && ItemDefinition.Name.Contains("Legendary")) || IsAccessory(ItemType))
{
var a = Attributes[GameAttribute.Requirement, 57];
- var reqLevel = (definition.RequiredLevel % 10 != 0) ? definition.RequiredLevel - 1 : definition.RequiredLevel;
+ var reqLevel = (definition.RequiredLevel % 10 != 0)
+ ? definition.RequiredLevel - 1
+ : definition.RequiredLevel;
var level = Math.Max(AffixList.Any() ? AffixList.Select(a => a.ItemLevel).Max() : 0, reqLevel);
- Attributes[GameAttribute.Requirement, 57] = Math.Max(level - Attributes[GameAttribute.Item_Level_Requirement_Reduction], 0);
+ Attributes[GameAttribute.Requirement, 57] =
+ Math.Max(level - Attributes[GameAttribute.Item_Level_Requirement_Reduction], 0);
a = Attributes[GameAttribute.Requirement, 57];
}
@@ -382,7 +379,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
if (Attributes[GameAttribute.Requirement, 57] == 0)
Attributes[GameAttribute.Item_Level_Requirement_Override] = 1;
else
- Attributes[GameAttribute.Item_Level_Requirement_Override] = (int)Attributes[GameAttribute.Requirement, 57];
+ Attributes[GameAttribute.Item_Level_Requirement_Override] =
+ (int)Attributes[GameAttribute.Requirement, 57];
if (ItemDefinition.Name.ToLower().StartsWith("p71_ethereal"))
{
@@ -441,91 +439,92 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
if (Attributes[GameAttribute.Damage_Weapon_Delta, 0] == 0)
Attributes[GameAttribute.Damage_Weapon_Delta, 0] = 34;
}
+
float scaleCapMin = 0f;
float scaleCapDelta = 0f;
switch (definition.ItemTypesGBID)
{
- case 109694: //Axe
+ case 109694: //Axe
scaleCapMin = 249f;
scaleCapDelta = 461f - scaleCapMin;
break;
- case -262576534: //Dagger
+ case -262576534: //Dagger
scaleCapMin = 107f;
scaleCapDelta = 321f - scaleCapMin;
break;
- case 4026134: //Mace
+ case 4026134: //Mace
scaleCapMin = 316f;
scaleCapDelta = 585f - scaleCapMin;
break;
- case 140519163: //Spear
+ case 140519163: //Spear
scaleCapMin = 357f;
scaleCapDelta = 526f - scaleCapMin;
break;
- case 140782159: //Sword
+ case 140782159: //Sword
scaleCapMin = 168f;
scaleCapDelta = 392f - scaleCapMin;
break;
- case -199811863: //Ceremonial Knife
+ case -199811863: //Ceremonial Knife
scaleCapMin = 117f;
scaleCapDelta = 469f - scaleCapMin;
break;
- case -2094596416: //Fist Weapon
+ case -2094596416: //Fist Weapon
scaleCapMin = 168f;
scaleCapDelta = 392f - scaleCapMin;
break;
- case -1363671135: //Flail
+ case -1363671135: //Flail
scaleCapMin = 192f;
scaleCapDelta = 355f - scaleCapMin;
break;
- case -1488678091: //Mighty Weapon
+ case -1488678091: //Mighty Weapon
scaleCapMin = 249f;
scaleCapDelta = 461f - scaleCapMin;
break;
- case 763102523: //Hand Crossbow
+ case 763102523: //Hand Crossbow
scaleCapMin = 126f;
scaleCapDelta = 714f - scaleCapMin;
break;
- case 4385866: //Wand
+ case 4385866: //Wand
scaleCapMin = 197f;
scaleCapDelta = 357f - scaleCapMin;
break;
- case 110504: //Bow
+ case 110504: //Bow
scaleCapMin = 143f;
scaleCapDelta = 815f - scaleCapMin;
break;
- case -1338851342: //Crossbow
+ case -1338851342: //Crossbow
scaleCapMin = 779f;
scaleCapDelta = 945f - scaleCapMin;
break;
- case 119458520: //2H Axe
+ case 119458520: //2H Axe
scaleCapMin = 1384f;
scaleCapDelta = 1685f - scaleCapMin;
break;
- case 89494384: //2H Mace
+ case 89494384: //2H Mace
scaleCapMin = 1737f;
scaleCapDelta = 1912f - scaleCapMin;
break;
- case -1203595600: //2H Polearm
+ case -1203595600: //2H Polearm
scaleCapMin = 1497f;
scaleCapDelta = 1823f - scaleCapMin;
break;
- case 140658708: //2H Staff
+ case 140658708: //2H Staff
scaleCapMin = 1229f;
scaleCapDelta = 1839f - scaleCapMin;
break;
- case -1307049751: //2H Sword
+ case -1307049751: //2H Sword
scaleCapMin = 1137f;
scaleCapDelta = 1702f - scaleCapMin;
break;
- case -1620551894: //2H Daibo
+ case -1620551894: //2H Daibo
scaleCapMin = 994f;
scaleCapDelta = 1845f - scaleCapMin;
break;
- case -1363671102: //2H Flail
+ case -1363671102: //2H Flail
scaleCapMin = 1351f;
scaleCapDelta = 1486f - scaleCapMin;
break;
- case -1488678058: //2H Mighty Weapon
+ case -1488678058: //2H Mighty Weapon
scaleCapMin = 1462f;
scaleCapDelta = 1609f - scaleCapMin;
break;
@@ -536,8 +535,10 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
float ratio = (float)Math.Pow(definition.ItemLevel, 2f) / 4900f;
if (ratio < 0.01f) ratio = 0.01f;
if (ratio > 1f) ratio = 1f;
- Attributes[GameAttribute.Damage_Weapon_Min, 0] += Math.Abs(scaleCapMin * ratio - Attributes[GameAttribute.Damage_Weapon_Min, 0]);
- Attributes[GameAttribute.Damage_Weapon_Delta, 0] += Math.Abs(scaleCapDelta * ratio - Attributes[GameAttribute.Damage_Weapon_Delta, 0]);
+ Attributes[GameAttribute.Damage_Weapon_Min, 0] +=
+ Math.Abs(scaleCapMin * ratio - Attributes[GameAttribute.Damage_Weapon_Min, 0]);
+ Attributes[GameAttribute.Damage_Weapon_Delta, 0] +=
+ Math.Abs(scaleCapDelta * ratio - Attributes[GameAttribute.Damage_Weapon_Delta, 0]);
}
}
}
@@ -559,29 +560,38 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
if (UniqueItems.UniqueItemStats.ContainsKey(hash))
{
-
+
Attributes[GameAttribute.Armor_Item] += UniqueItems.GetArmor(hash);
//Unique items level scaling
if (IsArmor(ItemType))
if (Attributes[GameAttribute.Armor_Item] == 0)
Attributes[GameAttribute.Armor_Item] = 30;
- if (Attributes[GameAttribute.Armor_Item] < 100) Attributes[GameAttribute.Armor_Item] += definition.ItemLevel * 6;
- else if (Attributes[GameAttribute.Armor_Item] < 200) Attributes[GameAttribute.Armor_Item] += definition.ItemLevel * 5;
- else if (Attributes[GameAttribute.Armor_Item] < 300) Attributes[GameAttribute.Armor_Item] += definition.ItemLevel * 4;
- else if (Attributes[GameAttribute.Armor_Item] < 400) Attributes[GameAttribute.Armor_Item] += definition.ItemLevel * 3;
- else if (Attributes[GameAttribute.Armor_Item] < 500) Attributes[GameAttribute.Armor_Item] += definition.ItemLevel * 2;
- else if (Attributes[GameAttribute.Armor_Item] < 600) Attributes[GameAttribute.Armor_Item] += definition.ItemLevel;
+ if (Attributes[GameAttribute.Armor_Item] < 100)
+ Attributes[GameAttribute.Armor_Item] += definition.ItemLevel * 6;
+ else if (Attributes[GameAttribute.Armor_Item] < 200)
+ Attributes[GameAttribute.Armor_Item] += definition.ItemLevel * 5;
+ else if (Attributes[GameAttribute.Armor_Item] < 300)
+ Attributes[GameAttribute.Armor_Item] += definition.ItemLevel * 4;
+ else if (Attributes[GameAttribute.Armor_Item] < 400)
+ Attributes[GameAttribute.Armor_Item] += definition.ItemLevel * 3;
+ else if (Attributes[GameAttribute.Armor_Item] < 500)
+ Attributes[GameAttribute.Armor_Item] += definition.ItemLevel * 2;
+ else if (Attributes[GameAttribute.Armor_Item] < 600)
+ Attributes[GameAttribute.Armor_Item] += definition.ItemLevel;
- if (definition.ItemTypesGBID == 332825721 || definition.ItemTypesGBID == 602099538) //Shield and CruShield
+ if (definition.ItemTypesGBID == 332825721 ||
+ definition.ItemTypesGBID == 602099538) //Shield and CruShield
{
float scaleCapMin = 14000f;
float scaleCapDelta = 21000f - scaleCapMin;
float ratio = (float)Math.Pow(definition.ItemLevel, 2f) / 4900f;
if (ratio < 0.01f) ratio = 0.01f;
if (ratio > 1f) ratio = 1f;
- Attributes[GameAttribute.Block_Amount_Item_Min] += Math.Abs(scaleCapMin * ratio - Attributes[GameAttribute.Block_Amount_Item_Min, 0]);
- Attributes[GameAttribute.Block_Amount_Item_Delta] += Math.Abs(scaleCapDelta * ratio - Attributes[GameAttribute.Block_Amount_Item_Delta, 0]);
+ Attributes[GameAttribute.Block_Amount_Item_Min] +=
+ Math.Abs(scaleCapMin * ratio - Attributes[GameAttribute.Block_Amount_Item_Min, 0]);
+ Attributes[GameAttribute.Block_Amount_Item_Delta] += Math.Abs(scaleCapDelta * ratio -
+ Attributes[GameAttribute.Block_Amount_Item_Delta, 0]);
}
}
}
@@ -635,14 +645,17 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
{
Attributes[GameAttribute.Skill, definition.SNOSkill0] = 1;
}
+
if (definition.SNOSkill1 != -1)
{
Attributes[GameAttribute.Skill, definition.SNOSkill1] = 1;
}
+
if (definition.SNOSkill2 != -1)
{
Attributes[GameAttribute.Skill, definition.SNOSkill2] = 1;
}
+
if (definition.SNOSkill3 != -1)
{
Attributes[GameAttribute.Skill, definition.SNOSkill3] = 1;
@@ -683,10 +696,12 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
{
return new VisualItem()
{
- GbId = (Attributes[GameAttribute.TransmogGBID] == -1 ? GBHandle.GBID : Attributes[GameAttribute.TransmogGBID]),
+ GbId = (Attributes[GameAttribute.TransmogGBID] == -1
+ ? GBHandle.GBID
+ : Attributes[GameAttribute.TransmogGBID]),
DyeType = Attributes[GameAttribute.DyeType],
- ItemEffectType = 0,//Mooege.Common.Helpers.Math.FastRandom.Instance.Next(1, 14),
- EffectLevel = -1//Mooege.Common.Helpers.Math.FastRandom.Instance.Next(1, 30)
+ ItemEffectType = 0, //Mooege.Common.Helpers.Math.FastRandom.Instance.Next(1, 14),
+ EffectLevel = -1 //Mooege.Common.Helpers.Math.FastRandom.Instance.Next(1, 30)
};
}
@@ -694,7 +709,9 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
public D3.Hero.VisualItem GetVisualItem()
{
var visualItem = D3.Hero.VisualItem.CreateBuilder()
- .SetGbid((Attributes[GameAttribute.TransmogGBID] == -1 ? GBHandle.GBID : Attributes[GameAttribute.TransmogGBID]))
+ .SetGbid((Attributes[GameAttribute.TransmogGBID] == -1
+ ? GBHandle.GBID
+ : Attributes[GameAttribute.TransmogGBID]))
.SetDyeType(Attributes[GameAttribute.DyeType])
.SetEffectLevel(0)
.SetItemEffectType(-1)
@@ -711,10 +728,12 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
{
price += affix.Price;
}
+
return price;
}
#region Is*
+
public static bool IsHealthGlobe(ItemTypeTable itemType)
{
return ItemGroup.IsSubType(itemType, "HealthGlyph");
@@ -809,6 +828,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
{
return itemType.Name.Contains("Amulet");
}
+
public static bool IsHandXbow(ItemTypeTable itemType)
{
return itemType.Name.Contains("HandXbow");
@@ -838,6 +858,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
{
return ItemGroup.Is2H(itemType);
}
+
#endregion
public void SetInventoryLocation(int equipmentSlot, int column, int row)
@@ -885,37 +906,66 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
}
var Moneys = D3.Items.CurrencySavedData.CreateBuilder();
- D3.Items.CurrencyData GoldData = D3.Items.CurrencyData.CreateBuilder().SetId(0).SetCount((long)player.Inventory.GetGoldAmount()).Build();
- D3.Items.CurrencyData BloodShardData = D3.Items.CurrencyData.CreateBuilder().SetId(1).SetCount(playerAcc.BloodShards).Build();
- D3.Items.CurrencyData PlatinumData = D3.Items.CurrencyData.CreateBuilder().SetId(2).SetCount(playerAcc.Platinum).Build();
+ D3.Items.CurrencyData GoldData = D3.Items.CurrencyData.CreateBuilder().SetId(0)
+ .SetCount((long)player.Inventory.GetGoldAmount()).Build();
+ D3.Items.CurrencyData BloodShardData =
+ D3.Items.CurrencyData.CreateBuilder().SetId(1).SetCount(playerAcc.BloodShards).Build();
+ D3.Items.CurrencyData PlatinumData =
+ D3.Items.CurrencyData.CreateBuilder().SetId(2).SetCount(playerAcc.Platinum).Build();
- D3.Items.CurrencyData Craft1Data = D3.Items.CurrencyData.CreateBuilder().SetId(3).SetCount(playerAcc.CraftItem1).Build(); // Reusable Parts.
- D3.Items.CurrencyData Craft2Data = D3.Items.CurrencyData.CreateBuilder().SetId(4).SetCount(playerAcc.CraftItem2).Build(); // Arcanes Dust.
- D3.Items.CurrencyData Craft3Data = D3.Items.CurrencyData.CreateBuilder().SetId(5).SetCount(playerAcc.CraftItem3).Build(); // Veiled Crystal.
- D3.Items.CurrencyData Craft4Data = D3.Items.CurrencyData.CreateBuilder().SetId(6).SetCount(playerAcc.CraftItem4).Build(); // Death's Breath.
- D3.Items.CurrencyData Craft5Data = D3.Items.CurrencyData.CreateBuilder().SetId(7).SetCount(playerAcc.CraftItem5).Build(); // Forgotten Soul.
+ D3.Items.CurrencyData Craft1Data =
+ D3.Items.CurrencyData.CreateBuilder().SetId(3).SetCount(playerAcc.CraftItem1)
+ .Build(); // Reusable Parts.
+ D3.Items.CurrencyData Craft2Data =
+ D3.Items.CurrencyData.CreateBuilder().SetId(4).SetCount(playerAcc.CraftItem2).Build(); // Arcanes Dust.
+ D3.Items.CurrencyData Craft3Data =
+ D3.Items.CurrencyData.CreateBuilder().SetId(5).SetCount(playerAcc.CraftItem3)
+ .Build(); // Veiled Crystal.
+ D3.Items.CurrencyData Craft4Data =
+ D3.Items.CurrencyData.CreateBuilder().SetId(6).SetCount(playerAcc.CraftItem4)
+ .Build(); // Death's Breath.
+ D3.Items.CurrencyData Craft5Data =
+ D3.Items.CurrencyData.CreateBuilder().SetId(7).SetCount(playerAcc.CraftItem5)
+ .Build(); // Forgotten Soul.
- D3.Items.CurrencyData Horadric1Data = D3.Items.CurrencyData.CreateBuilder().SetId(8).SetCount(playerAcc.HoradricA1Res).Build(); // Khanduran Rune Bounty itens Act I.
- D3.Items.CurrencyData Horadric2Data = D3.Items.CurrencyData.CreateBuilder().SetId(9).SetCount(playerAcc.HoradricA2Res).Build(); // Caldeum Nightshade Bounty itens Act II.
- D3.Items.CurrencyData Horadric3Data = D3.Items.CurrencyData.CreateBuilder().SetId(10).SetCount(playerAcc.HoradricA3Res).Build(); // Arreat War Tapestry Bounty itens Act III.
- D3.Items.CurrencyData Horadric4Data = D3.Items.CurrencyData.CreateBuilder().SetId(11).SetCount(playerAcc.HoradricA4Res).Build(); // Copputed Angel Flesh Bounty itens Act IV.
- D3.Items.CurrencyData Horadric5Data = D3.Items.CurrencyData.CreateBuilder().SetId(12).SetCount(playerAcc.HoradricA5Res).Build(); // Westmarch Holy Water Bounty itens Act V.
+ D3.Items.CurrencyData Horadric1Data = D3.Items.CurrencyData.CreateBuilder().SetId(8)
+ .SetCount(playerAcc.HoradricA1Res).Build(); // Khanduran Rune Bounty itens Act I.
+ D3.Items.CurrencyData Horadric2Data = D3.Items.CurrencyData.CreateBuilder().SetId(9)
+ .SetCount(playerAcc.HoradricA2Res).Build(); // Caldeum Nightshade Bounty itens Act II.
+ D3.Items.CurrencyData Horadric3Data = D3.Items.CurrencyData.CreateBuilder().SetId(10)
+ .SetCount(playerAcc.HoradricA3Res).Build(); // Arreat War Tapestry Bounty itens Act III.
+ D3.Items.CurrencyData Horadric4Data = D3.Items.CurrencyData.CreateBuilder().SetId(11)
+ .SetCount(playerAcc.HoradricA4Res).Build(); // Copputed Angel Flesh Bounty itens Act IV.
+ D3.Items.CurrencyData Horadric5Data = D3.Items.CurrencyData.CreateBuilder().SetId(12)
+ .SetCount(playerAcc.HoradricA5Res).Build(); // Westmarch Holy Water Bounty itens Act V.
- D3.Items.CurrencyData Craft8Data = D3.Items.CurrencyData.CreateBuilder().SetId(13).SetCount(playerAcc.HeartofFright).Build(); // Heart of Fright.
- D3.Items.CurrencyData Craft9Data = D3.Items.CurrencyData.CreateBuilder().SetId(14).SetCount(playerAcc.VialofPutridness).Build(); // Idol of Terror.
- D3.Items.CurrencyData Craft10Data = D3.Items.CurrencyData.CreateBuilder().SetId(15).SetCount(playerAcc.IdolofTerror).Build(); // Vail of Putridiness.
- D3.Items.CurrencyData Craft11Data = D3.Items.CurrencyData.CreateBuilder().SetId(16).SetCount(playerAcc.LeorikKey).Build(); // Leorik Regret.
+ D3.Items.CurrencyData Craft8Data = D3.Items.CurrencyData.CreateBuilder().SetId(13)
+ .SetCount(playerAcc.HeartofFright).Build(); // Heart of Fright.
+ D3.Items.CurrencyData Craft9Data = D3.Items.CurrencyData.CreateBuilder().SetId(14)
+ .SetCount(playerAcc.VialofPutridness).Build(); // Idol of Terror.
+ D3.Items.CurrencyData Craft10Data = D3.Items.CurrencyData.CreateBuilder().SetId(15)
+ .SetCount(playerAcc.IdolofTerror).Build(); // Vail of Putridiness.
+ D3.Items.CurrencyData Craft11Data =
+ D3.Items.CurrencyData.CreateBuilder().SetId(16).SetCount(playerAcc.LeorikKey).Build(); // Leorik Regret.
- D3.Items.CurrencyData Craft7Data = D3.Items.CurrencyData.CreateBuilder().SetId(20).SetCount(playerAcc.BigPortalKey).Build(); // KeyStone Greater Rift.
+ D3.Items.CurrencyData Craft7Data = D3.Items.CurrencyData.CreateBuilder().SetId(20)
+ .SetCount(playerAcc.BigPortalKey).Build(); // KeyStone Greater Rift.
- object[] consumables = {GoldData, BloodShardData, PlatinumData, Craft1Data, Craft2Data, Craft3Data, Craft4Data, Craft5Data, Craft7Data, Horadric1Data, Horadric2Data, Horadric3Data, Horadric4Data, Horadric5Data, Craft8Data, Craft9Data, Craft10Data, Craft11Data};
+ object[] consumables =
+ {
+ GoldData, BloodShardData, PlatinumData, Craft1Data, Craft2Data, Craft3Data, Craft4Data, Craft5Data,
+ Craft7Data, Horadric1Data, Horadric2Data, Horadric3Data, Horadric4Data, Horadric5Data, Craft8Data,
+ Craft9Data, Craft10Data, Craft11Data
+ };
foreach (object consumable in consumables)
{
Moneys.AddCurrency(consumable);
}
- player.InGameClient.SendMessage(new MessageSystem.Message.Definitions.Base.GenericBlobMessage(Opcodes.CurrencyDataFull) { Data = Moneys.Build().ToByteArray() });
+ player.InGameClient.SendMessage(
+ new MessageSystem.Message.Definitions.Base.GenericBlobMessage(Opcodes.CurrencyDataFull)
+ { Data = Moneys.Build().ToByteArray() });
}
@@ -951,13 +1001,15 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
else
break;
}
+
for (int i = 0; i < 8; i++)
{
if (ItemDefinition.TransmogsToGrant[i] != -1)
- player.UnlockTransmog(ItemDefinition.TransmogsToGrant[i]);
+ player.UnlockTransmog(ItemDefinition.TransmogsToGrant[i]);
else
break;
}
+
if (GBHandle.GBID == 1549850924) //Arma Haereticorum additional transmog
{
player.UnlockTransmog(974107120);
@@ -971,6 +1023,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
UpdateStackCount(--Attributes[GameAttribute.ItemStackQuantityLo]); // Just remove one
Attributes.SendChangedMessage(player.InGameClient);
}
+
return;
}
@@ -981,42 +1034,80 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
int @base = 0;
switch (player.Toon.Class)
{
- case LoginServer.Toons.ToonClass.Crusader: @base = 2; break;
- case LoginServer.Toons.ToonClass.DemonHunter: @base = 4; break;
- case LoginServer.Toons.ToonClass.Monk: @base = 6; break;
- case LoginServer.Toons.ToonClass.Necromancer: @base = 8; break;
- case LoginServer.Toons.ToonClass.WitchDoctor: @base = 10; break;
- case LoginServer.Toons.ToonClass.Wizard: @base = 12; break;
+ case LoginServer.Toons.ToonClass.Crusader:
+ @base = 2;
+ break;
+ case LoginServer.Toons.ToonClass.DemonHunter:
+ @base = 4;
+ break;
+ case LoginServer.Toons.ToonClass.Monk:
+ @base = 6;
+ break;
+ case LoginServer.Toons.ToonClass.Necromancer:
+ @base = 8;
+ break;
+ case LoginServer.Toons.ToonClass.WitchDoctor:
+ @base = 10;
+ break;
+ case LoginServer.Toons.ToonClass.Wizard:
+ @base = 12;
+ break;
} //0 - Barbarian, 2 - Crusader, 4 - Hunter, 6 - Monk, 8 - Necromancer, 10 - Sorcerer, 12 - Wizard
+
string it = "";
+
#region Balance calculation
+
var moneys = D3.Items.CurrencySavedData.CreateBuilder();
var playerAcc = player.InGameClient.BnetClient.Account.GameAccount;
- D3.Items.CurrencyData goldData = D3.Items.CurrencyData.CreateBuilder().SetId(0).SetCount((long)player.Inventory.GetGoldAmount()).Build();
- D3.Items.CurrencyData bloodShardData = D3.Items.CurrencyData.CreateBuilder().SetId(1).SetCount(playerAcc.BloodShards).Build();
- D3.Items.CurrencyData platinumData = D3.Items.CurrencyData.CreateBuilder().SetId(2).SetCount(playerAcc.Platinum).Build();
+ D3.Items.CurrencyData goldData = D3.Items.CurrencyData.CreateBuilder().SetId(0)
+ .SetCount((long)player.Inventory.GetGoldAmount()).Build();
+ D3.Items.CurrencyData bloodShardData = D3.Items.CurrencyData.CreateBuilder().SetId(1)
+ .SetCount(playerAcc.BloodShards).Build();
+ D3.Items.CurrencyData platinumData =
+ D3.Items.CurrencyData.CreateBuilder().SetId(2).SetCount(playerAcc.Platinum).Build();
- D3.Items.CurrencyData craft1Data = D3.Items.CurrencyData.CreateBuilder().SetId(3).SetCount(playerAcc.CraftItem1).Build(); // Reusable Parts.
- D3.Items.CurrencyData craft2Data = D3.Items.CurrencyData.CreateBuilder().SetId(4).SetCount(playerAcc.CraftItem2).Build(); // Arcanes Dust.
- D3.Items.CurrencyData craft3Data = D3.Items.CurrencyData.CreateBuilder().SetId(5).SetCount(playerAcc.CraftItem3).Build(); // Veiled Crystal.
- D3.Items.CurrencyData craft4Data = D3.Items.CurrencyData.CreateBuilder().SetId(6).SetCount(playerAcc.CraftItem4).Build(); // Death's Breath.
- D3.Items.CurrencyData craft5Data = D3.Items.CurrencyData.CreateBuilder().SetId(7).SetCount(playerAcc.CraftItem5).Build(); // Forgotten Soul.
+ D3.Items.CurrencyData craft1Data = D3.Items.CurrencyData.CreateBuilder().SetId(3)
+ .SetCount(playerAcc.CraftItem1).Build(); // Reusable Parts.
+ D3.Items.CurrencyData craft2Data = D3.Items.CurrencyData.CreateBuilder().SetId(4)
+ .SetCount(playerAcc.CraftItem2).Build(); // Arcanes Dust.
+ D3.Items.CurrencyData craft3Data = D3.Items.CurrencyData.CreateBuilder().SetId(5)
+ .SetCount(playerAcc.CraftItem3).Build(); // Veiled Crystal.
+ D3.Items.CurrencyData craft4Data = D3.Items.CurrencyData.CreateBuilder().SetId(6)
+ .SetCount(playerAcc.CraftItem4).Build(); // Death's Breath.
+ D3.Items.CurrencyData craft5Data = D3.Items.CurrencyData.CreateBuilder().SetId(7)
+ .SetCount(playerAcc.CraftItem5).Build(); // Forgotten Soul.
- D3.Items.CurrencyData horadric1Data = D3.Items.CurrencyData.CreateBuilder().SetId(8).SetCount(playerAcc.HoradricA1Res).Build(); // Khanduran Rune Bounty itens Act I.
- D3.Items.CurrencyData horadric2Data = D3.Items.CurrencyData.CreateBuilder().SetId(9).SetCount(playerAcc.HoradricA2Res).Build(); // Caldeum Nightshade Bounty itens Act II.
- D3.Items.CurrencyData horadric3Data = D3.Items.CurrencyData.CreateBuilder().SetId(10).SetCount(playerAcc.HoradricA3Res).Build(); // Arreat War Tapestry Bounty itens Act III.
- D3.Items.CurrencyData horadric4Data = D3.Items.CurrencyData.CreateBuilder().SetId(11).SetCount(playerAcc.HoradricA4Res).Build(); // Copputed Angel Flesh Bounty itens Act IV.
- D3.Items.CurrencyData horadric5Data = D3.Items.CurrencyData.CreateBuilder().SetId(12).SetCount(playerAcc.HoradricA5Res).Build(); // Westmarch Holy Water Bounty itens Act V.
+ D3.Items.CurrencyData horadric1Data = D3.Items.CurrencyData.CreateBuilder().SetId(8)
+ .SetCount(playerAcc.HoradricA1Res).Build(); // Khanduran Rune Bounty itens Act I.
+ D3.Items.CurrencyData horadric2Data = D3.Items.CurrencyData.CreateBuilder().SetId(9)
+ .SetCount(playerAcc.HoradricA2Res).Build(); // Caldeum Nightshade Bounty itens Act II.
+ D3.Items.CurrencyData horadric3Data = D3.Items.CurrencyData.CreateBuilder().SetId(10)
+ .SetCount(playerAcc.HoradricA3Res).Build(); // Arreat War Tapestry Bounty itens Act III.
+ D3.Items.CurrencyData horadric4Data = D3.Items.CurrencyData.CreateBuilder().SetId(11)
+ .SetCount(playerAcc.HoradricA4Res).Build(); // Copputed Angel Flesh Bounty itens Act IV.
+ D3.Items.CurrencyData horadric5Data = D3.Items.CurrencyData.CreateBuilder().SetId(12)
+ .SetCount(playerAcc.HoradricA5Res).Build(); // Westmarch Holy Water Bounty itens Act V.
- D3.Items.CurrencyData craft8Data = D3.Items.CurrencyData.CreateBuilder().SetId(13).SetCount(playerAcc.HeartofFright).Build(); // Heart of Fright.
- D3.Items.CurrencyData craft9Data = D3.Items.CurrencyData.CreateBuilder().SetId(14).SetCount(playerAcc.VialofPutridness).Build(); // Idol of Terror.
- D3.Items.CurrencyData craft10Data = D3.Items.CurrencyData.CreateBuilder().SetId(15).SetCount(playerAcc.IdolofTerror).Build(); // Vail of Putridiness.
- D3.Items.CurrencyData craft11Data = D3.Items.CurrencyData.CreateBuilder().SetId(16).SetCount(playerAcc.LeorikKey).Build(); // Leorik Regret.
+ D3.Items.CurrencyData craft8Data = D3.Items.CurrencyData.CreateBuilder().SetId(13)
+ .SetCount(playerAcc.HeartofFright).Build(); // Heart of Fright.
+ D3.Items.CurrencyData craft9Data = D3.Items.CurrencyData.CreateBuilder().SetId(14)
+ .SetCount(playerAcc.VialofPutridness).Build(); // Idol of Terror.
+ D3.Items.CurrencyData craft10Data = D3.Items.CurrencyData.CreateBuilder().SetId(15)
+ .SetCount(playerAcc.IdolofTerror).Build(); // Vail of Putridiness.
+ D3.Items.CurrencyData craft11Data = D3.Items.CurrencyData.CreateBuilder().SetId(16)
+ .SetCount(playerAcc.LeorikKey).Build(); // Leorik Regret.
- D3.Items.CurrencyData craft7Data = D3.Items.CurrencyData.CreateBuilder().SetId(20).SetCount(playerAcc.BigPortalKey).Build(); // KeyStone Greater Rift.
+ D3.Items.CurrencyData craft7Data = D3.Items.CurrencyData.CreateBuilder().SetId(20)
+ .SetCount(playerAcc.BigPortalKey).Build(); // KeyStone Greater Rift.
- object[] consumables = {goldData, bloodShardData, platinumData, craft1Data, craft2Data, craft3Data, craft4Data, craft5Data, craft7Data, horadric1Data, horadric2Data, horadric3Data, horadric4Data, horadric5Data, craft8Data, craft9Data, craft10Data, craft11Data};
+ object[] consumables =
+ {
+ goldData, bloodShardData, platinumData, craft1Data, craft2Data, craft3Data, craft4Data, craft5Data,
+ craft7Data, horadric1Data, horadric2Data, horadric3Data, horadric4Data, horadric5Data, craft8Data,
+ craft9Data, craft10Data, craft11Data
+ };
foreach (object consumable in consumables)
{
@@ -1024,54 +1115,85 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
}
#endregion
+
switch (GBHandle.GBID)
{
- #region The Gift of Horadric
- case -1249067449:
- items = new string[] { "Unique_Helm_Set_15_x1", "Unique_Gloves_Set_15_x1",
- "Unique_Helm_Set_12_x1", "Unique_Gloves_Set_12_x1",
- "Unique_Helm_Set_14_x1", "Unique_Gloves_Set_14_x1",
- "Unique_Helm_Set_11_x1", "Unique_Gloves_Set_11_x1",
- "P6_Necro_Set_3_Helm", "P6_Necro_Set_3_Gloves",
- "Unique_Helm_Set_09_x1", "Unique_Gloves_Set_09_x1",
- "Unique_Helm_Set_06_x1", "Unique_Gloves_Set_06_x1"};
+ #region The Gift of Horadric
+
+ case -1249067449:
+ items = new string[]
+ {
+ "Unique_Helm_Set_15_x1", "Unique_Gloves_Set_15_x1",
+ "Unique_Helm_Set_12_x1", "Unique_Gloves_Set_12_x1",
+ "Unique_Helm_Set_14_x1", "Unique_Gloves_Set_14_x1",
+ "Unique_Helm_Set_11_x1", "Unique_Gloves_Set_11_x1",
+ "P6_Necro_Set_3_Helm", "P6_Necro_Set_3_Gloves",
+ "Unique_Helm_Set_09_x1", "Unique_Gloves_Set_09_x1",
+ "Unique_Helm_Set_06_x1", "Unique_Gloves_Set_06_x1"
+ };
switch (player.Toon.Class)
{
- case LoginServer.Toons.ToonClass.Crusader: @base = 2; break;
- case LoginServer.Toons.ToonClass.DemonHunter: @base = 4; break;
- case LoginServer.Toons.ToonClass.Monk: @base = 6; break;
- case LoginServer.Toons.ToonClass.Necromancer: @base = 8; break;
- case LoginServer.Toons.ToonClass.WitchDoctor: @base = 10; break;
- case LoginServer.Toons.ToonClass.Wizard: @base = 12; break;
+ case LoginServer.Toons.ToonClass.Crusader:
+ @base = 2;
+ break;
+ case LoginServer.Toons.ToonClass.DemonHunter:
+ @base = 4;
+ break;
+ case LoginServer.Toons.ToonClass.Monk:
+ @base = 6;
+ break;
+ case LoginServer.Toons.ToonClass.Necromancer:
+ @base = 8;
+ break;
+ case LoginServer.Toons.ToonClass.WitchDoctor:
+ @base = 10;
+ break;
+ case LoginServer.Toons.ToonClass.Wizard:
+ @base = 12;
+ break;
}
- it = items[RandomHelper.Next(@base, @base+1)]; player.Inventory.PickUp(ItemGenerator.Cook(player, it));
+
+ it = items[RandomHelper.Next(@base, @base + 1)];
+ player.Inventory.PickUp(ItemGenerator.Cook(player, it));
break;
case -1249067448:
- items = new string[] { "Unique_Shoulder_Set_15_x1", "Unique_Boots_Set_15_x1",
- "Unique_Shoulder_Set_12_x1", "Unique_Boots_Set_12_x1",
- "Unique_Shoulder_Set_14_x1", "Unique_Boots_Set_14_x1",
- "Unique_Shoulder_Set_11_x1", "Unique_Boots_Set_11_x1",
- "P6_Necro_Set_3_Shoulders", "P6_Necro_Set_3_Boots",
- "Unique_Shoulder_Set_09_x1", "Unique_Boots_Set_09_x1",
- "Unique_Shoulder_Set_06_x1", "Unique_Boots_Set_06_x1"};
- it = items[RandomHelper.Next(@base, @base + 1)]; player.Inventory.PickUp(ItemGenerator.Cook(player, it));
+ items = new string[]
+ {
+ "Unique_Shoulder_Set_15_x1", "Unique_Boots_Set_15_x1",
+ "Unique_Shoulder_Set_12_x1", "Unique_Boots_Set_12_x1",
+ "Unique_Shoulder_Set_14_x1", "Unique_Boots_Set_14_x1",
+ "Unique_Shoulder_Set_11_x1", "Unique_Boots_Set_11_x1",
+ "P6_Necro_Set_3_Shoulders", "P6_Necro_Set_3_Boots",
+ "Unique_Shoulder_Set_09_x1", "Unique_Boots_Set_09_x1",
+ "Unique_Shoulder_Set_06_x1", "Unique_Boots_Set_06_x1"
+ };
+ it = items[RandomHelper.Next(@base, @base + 1)];
+ player.Inventory.PickUp(ItemGenerator.Cook(player, it));
break;
case -1249067447:
- items = new string[] { "Unique_Chest_Set_15_x1", "Unique_Pants_Set_15_x1",
- "Unique_Chest_Set_12_x1", "Unique_Pants_Set_12_x1",
- "Unique_Chest_Set_14_x1", "Unique_Pants_Set_14_x1",
- "Unique_Chest_Set_11_x1", "Unique_Pants_Set_11_x1",
- "P6_Necro_Set_3_Chest", "P6_Necro_Set_3_Pants",
- "Unique_Chest_Set_09_x1", "Unique_Pants_Set_09_x1",
- "Unique_Chest_Set_06_x1", "Unique_Pants_Set_06_x1"};
- it = items[RandomHelper.Next(@base, @base + 1)]; player.Inventory.PickUp(ItemGenerator.Cook(player, it));
+ items = new string[]
+ {
+ "Unique_Chest_Set_15_x1", "Unique_Pants_Set_15_x1",
+ "Unique_Chest_Set_12_x1", "Unique_Pants_Set_12_x1",
+ "Unique_Chest_Set_14_x1", "Unique_Pants_Set_14_x1",
+ "Unique_Chest_Set_11_x1", "Unique_Pants_Set_11_x1",
+ "P6_Necro_Set_3_Chest", "P6_Necro_Set_3_Pants",
+ "Unique_Chest_Set_09_x1", "Unique_Pants_Set_09_x1",
+ "Unique_Chest_Set_06_x1", "Unique_Pants_Set_06_x1"
+ };
+ it = items[RandomHelper.Next(@base, @base + 1)];
+ player.Inventory.PickUp(ItemGenerator.Cook(player, it));
break;
+
#endregion
+
#region The Treasure of the Khoradrim
+
case -1575654862: // The Treasure 1 Акта
playerAcc.HoradricA1Res += RandomHelper.Next(1, 5);
playerAcc.CraftItem4 += RandomHelper.Next(2, 4);
- horadric1Data = D3.Items.CurrencyData.CreateBuilder().SetId(8).SetCount(playerAcc.HoradricA1Res).Build();
+ horadric1Data = D3.Items.CurrencyData.CreateBuilder().SetId(8).SetCount(playerAcc.HoradricA1Res)
+ .Build();
player.World.SpawnRandomEquip(player, player, RandomHelper.Next(3, 8));
player.World.SpawnRandomEquip(player, player, RandomHelper.Next(3, 8));
player.World.SpawnRandomEquip(player, player, RandomHelper.Next(5, 9));
@@ -1082,7 +1204,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
case -1575654861: // The Treasure 2 Акта
playerAcc.HoradricA2Res += RandomHelper.Next(1, 5);
playerAcc.CraftItem4 += RandomHelper.Next(2, 4);
- horadric2Data = D3.Items.CurrencyData.CreateBuilder().SetId(9).SetCount(playerAcc.HoradricA2Res).Build();
+ horadric2Data = D3.Items.CurrencyData.CreateBuilder().SetId(9).SetCount(playerAcc.HoradricA2Res)
+ .Build();
player.World.SpawnRandomEquip(player, player, RandomHelper.Next(3, 8));
player.World.SpawnRandomEquip(player, player, RandomHelper.Next(3, 8));
player.World.SpawnRandomEquip(player, player, RandomHelper.Next(5, 9));
@@ -1093,7 +1216,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
case -1575654860: // The Treasure 3 Акта
playerAcc.HoradricA3Res += RandomHelper.Next(1, 5);
playerAcc.CraftItem4 += RandomHelper.Next(2, 4);
- horadric3Data = D3.Items.CurrencyData.CreateBuilder().SetId(10).SetCount(playerAcc.HoradricA3Res).Build();
+ horadric3Data = D3.Items.CurrencyData.CreateBuilder().SetId(10)
+ .SetCount(playerAcc.HoradricA3Res).Build();
player.World.SpawnRandomEquip(player, player, RandomHelper.Next(3, 8));
player.World.SpawnRandomEquip(player, player, RandomHelper.Next(3, 8));
player.World.SpawnRandomEquip(player, player, RandomHelper.Next(5, 9));
@@ -1104,7 +1228,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
case -1575654859: // The Treasure 4 Акта
playerAcc.HoradricA4Res += RandomHelper.Next(1, 5);
playerAcc.CraftItem4 += RandomHelper.Next(2, 4);
- horadric4Data = D3.Items.CurrencyData.CreateBuilder().SetId(11).SetCount(playerAcc.HoradricA4Res).Build();
+ horadric4Data = D3.Items.CurrencyData.CreateBuilder().SetId(11)
+ .SetCount(playerAcc.HoradricA4Res).Build();
player.World.SpawnRandomEquip(player, player, RandomHelper.Next(3, 8));
player.World.SpawnRandomEquip(player, player, RandomHelper.Next(3, 8));
player.World.SpawnRandomEquip(player, player, RandomHelper.Next(5, 9));
@@ -1115,7 +1240,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
case -1575654858: // The Treasure 5 Акта
playerAcc.HoradricA5Res += RandomHelper.Next(1, 5);
playerAcc.CraftItem4 += RandomHelper.Next(2, 4);
- horadric5Data = D3.Items.CurrencyData.CreateBuilder().SetId(12).SetCount(playerAcc.HoradricA5Res).Build();
+ horadric5Data = D3.Items.CurrencyData.CreateBuilder().SetId(12)
+ .SetCount(playerAcc.HoradricA5Res).Build();
player.World.SpawnRandomEquip(player, player, RandomHelper.Next(3, 8));
player.World.SpawnRandomEquip(player, player, RandomHelper.Next(3, 8));
player.World.SpawnRandomEquip(player, player, RandomHelper.Next(5, 9));
@@ -1123,19 +1249,25 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
player.World.SpawnGold(player, player, 5000);
player.World.SpawnBloodShards(player, player, RandomHelper.Next(10, 25));
break;
+
#endregion
+
default:
- Logger.Warn("This treasure bag - not implemented"); break;
+ Logger.Warn("This treasure bag - not implemented");
+ break;
}
+
craft4Data = D3.Items.CurrencyData.CreateBuilder().SetId(6).SetCount(playerAcc.CraftItem4).Build();
- object[] horadricBoxes = {horadric1Data, horadric2Data, horadric3Data, horadric4Data, horadric5Data};
+ object[] horadricBoxes = { horadric1Data, horadric2Data, horadric3Data, horadric4Data, horadric5Data };
foreach (object horadricBoxe in horadricBoxes)
{
moneys.AddCurrency(horadricBoxe);
}
- player.InGameClient.SendMessage(new MessageSystem.Message.Definitions.Base.GenericBlobMessage(Opcodes.CurrencyDataFull) { Data = moneys.Build().ToByteArray() });
+ player.InGameClient.SendMessage(
+ new MessageSystem.Message.Definitions.Base.GenericBlobMessage(Opcodes.CurrencyDataFull)
+ { Data = moneys.Build().ToByteArray() });
player.Inventory.DestroyInventoryItem(this);
return;
@@ -1184,7 +1316,9 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
player.GrantAchievement(74987243307154);
- var colors = new List(player.Inventory.GetEquippedItems().Where(i => i.Attributes[GameAttribute.DyeType] > 0).Select(i => i.Attributes[GameAttribute.DyeType]));
+ var colors = new List(player.Inventory.GetEquippedItems()
+ .Where(i => i.Attributes[GameAttribute.DyeType] > 0)
+ .Select(i => i.Attributes[GameAttribute.DyeType]));
if (colors.Count >= 6)
{
if (new HashSet(colors).Count == 1)
@@ -1259,6 +1393,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
UpdateStackCount(--Attributes[GameAttribute.ItemStackQuantityLo]); // Just remove one
Attributes.SendChangedMessage(player.InGameClient);
}
+
return;
}
@@ -1344,7 +1479,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
public override bool Unreveal(Player player)
{
- if (CurrentState == ItemState.PickingUp)// && player == Owner)
+ if (CurrentState == ItemState.PickingUp) // && player == Owner)
{
return false;
}
diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/ItemGenerator.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/ItemGenerator.cs
index 52358cc..f828bbf 100644
--- a/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/ItemGenerator.cs
+++ b/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/ItemGenerator.cs
@@ -46,28 +46,32 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
{
public static class ItemGenerator
{
- public static readonly Logger Logger = LogManager.CreateLogger("D3Core");
+ public static readonly Logger Logger = LogManager.CreateLogger(nameof(ItemGenerator));
- public static readonly ConcurrentDictionary Items = new ConcurrentDictionary();
- public static readonly ConcurrentDictionary AllowedItems = new ConcurrentDictionary();
- public static readonly ConcurrentDictionary AllowedUniqueItems = new ConcurrentDictionary();
- private static readonly ConcurrentDictionary Recipes = new ConcurrentDictionary();
- private static readonly ConcurrentDictionary Lore = new ConcurrentDictionary();
- private static readonly List GemEffects = new List();
- private static readonly List ParagonBonuses = new List();
- private static readonly List ItemSetsEffects = new List();
- private static readonly ConcurrentDictionary GBIDHandlers = new ConcurrentDictionary();
- private static readonly ConcurrentDictionary TypeHandlers = new ConcurrentDictionary();
- private static readonly HashSet AllowedItemTypes = new HashSet();
- private static readonly List CraftOnlyItems = new List();
+ public static readonly ConcurrentDictionary Items = new();
+
+ public static readonly ConcurrentDictionary AllowedItems = new();
+
+ public static readonly ConcurrentDictionary AllowedUniqueItems = new();
+
+ private static readonly ConcurrentDictionary Recipes = new();
+
+ private static readonly ConcurrentDictionary Lore = new();
+ private static readonly List GemEffects = new();
+ private static readonly List ParagonBonuses = new();
+ private static readonly List ItemSetsEffects = new();
+ private static readonly ConcurrentDictionary GBIDHandlers = new();
+ private static readonly ConcurrentDictionary TypeHandlers = new();
+ private static readonly HashSet AllowedItemTypes = new();
+ private static readonly List CraftOnlyItems = new();
public static int TotalItems
{
get { return Items.Count; }
}
- public static List Tutorials = new List();
- public static Dictionary Bounties = new Dictionary();
+ public static List Tutorials = new();
+ public static Dictionary Bounties = new();
static ItemGenerator()
{
@@ -89,7 +93,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
Logger.Info("Loading Handlers...");
LoadHandlers();
Logger.Info("Loading Lore...");
- LoadLore();
+ LoadLore();
Logger.Info("Loading Bounties...");
LoadBounties();
//LoadConversations();
@@ -103,6 +107,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
}
#region loading generator
+
private static void LoadBounties()
{
foreach (var asset in MPQStorage.Data.Assets[SNOGroup.Quest].Values)
@@ -123,14 +128,23 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
if (asset.Name.Contains("_A5_"))
data.BountyData0.ActData = BountyData.ActT.A5;
}
+
//fixes for bugged bounties
- if (data.BountyData0.Type != BountyData.BountyType.CompleteEvent && data.QuestSteps.SelectMany(s => s.StepObjectiveSets).SelectMany(s => s.StepObjectives).Any(o => o.ObjectiveType == QuestStepObjectiveType.CompleteQuest))
+ if (data.BountyData0.Type != BountyData.BountyType.CompleteEvent && data.QuestSteps
+ .SelectMany(s => s.StepObjectiveSets).SelectMany(s => s.StepObjectives).Any(o =>
+ o.ObjectiveType == QuestStepObjectiveType.CompleteQuest))
data.BountyData0.Type = BountyData.BountyType.CompleteEvent;
- if (data.BountyData0.Type == BountyData.BountyType.KillUnique && data.QuestSteps.SelectMany(s => s.StepObjectiveSets).SelectMany(s => s.StepObjectives).Any(o => o.ObjectiveType == QuestStepObjectiveType.KillAll))
+ if (data.BountyData0.Type == BountyData.BountyType.KillUnique && data.QuestSteps
+ .SelectMany(s => s.StepObjectiveSets).SelectMany(s => s.StepObjectives)
+ .Any(o => o.ObjectiveType == QuestStepObjectiveType.KillAll))
data.BountyData0.Type = BountyData.BountyType.ClearDungeon;
- if (data.BountyData0.Type == BountyData.BountyType.KillUnique && !data.QuestSteps.SelectMany(s => s.StepObjectiveSets).SelectMany(s => s.StepObjectives).Any(o => o.ObjectiveType == QuestStepObjectiveType.KillAny))
+ if (data.BountyData0.Type == BountyData.BountyType.KillUnique && !data.QuestSteps
+ .SelectMany(s => s.StepObjectiveSets).SelectMany(s => s.StepObjectives)
+ .Any(o => o.ObjectiveType == QuestStepObjectiveType.KillAny))
continue;
- if (data.BountyData0.Type == BountyData.BountyType.KillUnique && data.QuestSteps.SelectMany(s => s.StepObjectiveSets).SelectMany(s => s.StepObjectives).Where(o => o.ObjectiveType == QuestStepObjectiveType.KillMonster).Count() > 1)
+ if (data.BountyData0.Type == BountyData.BountyType.KillUnique && data.QuestSteps
+ .SelectMany(s => s.StepObjectiveSets).SelectMany(s => s.StepObjectives)
+ .Where(o => o.ObjectiveType == QuestStepObjectiveType.KillMonster).Count() > 1)
continue;
Bounties.Add(data.Header.SNOId, data);
@@ -153,7 +167,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
}
}
- var typeAttributes = (HandledTypeAttribute[])type.GetCustomAttributes(typeof(HandledTypeAttribute), true);
+ var typeAttributes =
+ (HandledTypeAttribute[])type.GetCustomAttributes(typeof(HandledTypeAttribute), true);
if (typeAttributes.Length != 0)
{
foreach (var typeName in typeAttributes.First().Types)
@@ -181,13 +196,15 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
ObsoleteItems.Add(itemDefinition.Hash);
//Logger.Debug("flagged as obsolete _104: {0}, {1}", itemDefinition.Name, itemDefinition.Hash);
}
+
if (itemDefinition.Name.EndsWith("_1xx"))
{
ObsoleteItems.Add(itemDefinition.Hash);
//Logger.Debug("flagged as obsolete _1xx: {0}, {1}", itemDefinition.Name, itemDefinition.Hash);
}
+
if (itemDefinition.Name.ToLower().Contains("unique") && !itemDefinition.Name.EndsWith("_x1") &&
- !itemDefinition.Name.EndsWith("_104") && !itemDefinition.Name.EndsWith("_1xx"))
+ !itemDefinition.Name.EndsWith("_104") && !itemDefinition.Name.EndsWith("_1xx"))
{
ObsoleteItems.Add(itemDefinition.Hash);
//Logger.Debug("flagged as obsolete 1.0.3: {0}, {1}", itemDefinition.Name, itemDefinition.Hash);
@@ -195,7 +212,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
if (
itemDefinition.SNOActor != 4812 //orb_norm_base_03
- && !(itemDefinition.Name.ToLower().Contains("stone") && !itemDefinition.Name.ToLower().Contains("spiritstone")) //StoneOfRecall
+ && !(itemDefinition.Name.ToLower().Contains("stone") &&
+ !itemDefinition.Name.ToLower().Contains("spiritstone")) //StoneOfRecall
&& !itemDefinition.Name.ToLower().StartsWith("ph_") //Kadala items
&& !itemDefinition.Name.ToLower().Contains("talisman") //TalismanUnlock
&& !itemDefinition.Name.ToLower().Contains("console") //bugged console items
@@ -214,8 +232,10 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
&& !itemDefinition.Name.ToLower().Contains("shadowclone") //shadowClone OP weapon
//&& !(itemDefinition.Name.Contains("_Set_") && itemDefinition.Name.EndsWith("_x1")) //RoS sets
//&& !(itemDefinition.Name.ToLower().Contains("unique") && (itemDefinition.BonusAffixes + itemDefinition.BonusMajorAffixes + itemDefinition.BonusMinorAffixes == 0) && itemDefinition.LegendaryAffixFamily[0] == -1) //2.1+ items
- && !(CraftOnlyItems.Contains(itemDefinition.Hash) && itemDefinition.Name.ToLower().Contains("unique")) //crafted
- && !(CraftOnlyItems.Contains(itemDefinition.Hash) && itemDefinition.Name.ToLower().Contains("unique")) //crafted
+ && !(CraftOnlyItems.Contains(itemDefinition.Hash) &&
+ itemDefinition.Name.ToLower().Contains("unique")) //crafted
+ && !(CraftOnlyItems.Contains(itemDefinition.Hash) &&
+ itemDefinition.Name.ToLower().Contains("unique")) //crafted
//&& !(itemDefinition.Name.ToLower().Contains("_10") && itemDefinition.Name.ToLower().Contains("_x1")) //"future" items
&& itemDefinition.ItemTypesGBID != StringHashHelper.HashItemName("Book")
&& itemDefinition.ItemTypesGBID != StringHashHelper.HashItemName("TreasureBag")
@@ -227,14 +247,14 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
&& itemDefinition.ItemTypesGBID != StringHashHelper.HashItemName("Shard")
&& itemDefinition.ItemTypesGBID != StringHashHelper.HashItemName("GreaterShard")
&& itemDefinition.ItemTypesGBID != StringHashHelper.HashItemName("HealthPotion")
- )
+ )
{
if (!IsBuggedItem(itemDefinition))
{
if (itemDefinition.Name.ToLower().Contains("_set_") ||
- itemDefinition.Name.ToLower().Contains("unique") ||
- itemDefinition.Name.ToLower().StartsWith("p71_ethereal")
- )
+ itemDefinition.Name.ToLower().Contains("unique") ||
+ itemDefinition.Name.ToLower().StartsWith("p71_ethereal")
+ )
{
AllowedUniqueItems.TryAdd(itemDefinition.Hash, itemDefinition);
AllowedItems.TryAdd(itemDefinition.Hash, itemDefinition);
@@ -251,7 +271,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
}
}
- private static bool IsBuggedItem(ItemTable definition)
+ private static bool IsBuggedItem(ItemTable definition)
{
switch (definition.Name)
{
@@ -317,8 +337,10 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
case "Unique_Quiver_104_x1":
return true;
}
+
return false;
}
+
private static void LoadQuests()
{
//Logger.Info("LoadItems()");
@@ -330,14 +352,18 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
Logger.Info("-------------");
Logger.Info("Quest: [{0}] {1}", data.Header.SNOId, asset.Name);
Logger.Info("Type: {0}", data.QuestType);
- Logger.Info("NumberOfSteps: {0}, NumberOfCompletionSteps: {1}", data.NumberOfSteps, data.NumberOfCompletionSteps);
+ Logger.Info("NumberOfSteps: {0}, NumberOfCompletionSteps: {1}", data.NumberOfSteps,
+ data.NumberOfCompletionSteps);
foreach (var step in data.QuestSteps)
{
- int nextID = step.StepObjectiveSets.Count() > 0 ? step.StepObjectiveSets.First().FollowUpStepID : -1;
+ int nextID = step.StepObjectiveSets.Count() > 0
+ ? step.StepObjectiveSets.First().FollowUpStepID
+ : -1;
Logger.Info("Step [{0}] {1} -> {2}", step.ID, step.Name, nextID);
foreach (var objSet in step.StepObjectiveSets)
- foreach (var obj in objSet.StepObjectives)
- Logger.Info("objective type {0}, I0 {1}, I2 {2}, Target {3}, Sno1 {4}, Sno2 {5}", obj.ObjectiveType, obj.I0, obj.I2, obj.CounterTarget, obj.SNOName1, obj.SNOName2);
+ foreach (var obj in objSet.StepObjectives)
+ Logger.Info("objective type {0}, I0 {1}, I2 {2}, Target {3}, Sno1 {4}, Sno2 {5}",
+ obj.ObjectiveType, obj.I0, obj.I2, obj.CounterTarget, obj.SNOName1, obj.SNOName2);
}
}
}
@@ -354,9 +380,12 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
foreach (var recipeDefinition in data.Recipes)
{
Recipes.TryAdd(recipeDefinition.Hash, recipeDefinition);
- if (recipeDefinition.SNORecipe > 0 && MPQStorage.Data.Assets[SNOGroup.Recipe].ContainsKey(recipeDefinition.SNORecipe))
+ if (recipeDefinition.SNORecipe > 0 && MPQStorage.Data.Assets[SNOGroup.Recipe]
+ .ContainsKey(recipeDefinition.SNORecipe))
{
- var reward = (MPQStorage.Data.Assets[SNOGroup.Recipe][recipeDefinition.SNORecipe].Data as Recipe).ItemSpecifierData.ItemGBId;
+ var reward =
+ (MPQStorage.Data.Assets[SNOGroup.Recipe][recipeDefinition.SNORecipe].Data as Recipe)
+ .ItemSpecifierData.ItemGBId;
if (!CraftOnlyItems.Contains(reward))
CraftOnlyItems.Add(reward);
}
@@ -563,7 +592,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
foreach (var asset in MPQStorage.Data.Assets[SNOGroup.Power].Values)
{
Power data = asset.Data as Power;
- Logger.Info("{0} => array(\"name\" => \"{1}\", \"desc\" => \"{2}\"),", data.Header.SNOId, asset.Name, data.LuaName);
+ Logger.Info("{0} => array(\"name\" => \"{1}\", \"desc\" => \"{2}\"),", data.Header.SNOId, asset.Name,
+ data.LuaName);
/*Logger.Info("---------------------------------------------------------");
Logger.Info("asset name: {0}", asset.Name);
Logger.Info("SNOID: {0}", data.Header.SNOId);
@@ -927,7 +957,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
{
foreach (var asset in MPQStorage.Data.Assets[SNOGroup.Conversation].Values)
{
- DiIiS_NA.Core.MPQ.FileFormats.Conversation data = asset.Data as DiIiS_NA.Core.MPQ.FileFormats.Conversation;
+ DiIiS_NA.Core.MPQ.FileFormats.Conversation data =
+ asset.Data as DiIiS_NA.Core.MPQ.FileFormats.Conversation;
/*Logger.Info("Conversation: [{8}]{0} I4: {1}, Type {9}, NPC {10} Act {2}, SNOConvUnlocks {3}, {4}, {5}, I5: {6}, I6: {7}",
asset.Name,
data.I4,
@@ -966,6 +997,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
// already added structure
continue;
}
+
foreach (int subhash in ItemGroup.SubTypesToHashList(ItemGroup.FromHash(hash).Name))
{
if (AllowedItemTypes.Contains(subhash))
@@ -973,6 +1005,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
// already added structure
continue;
}
+
AllowedItemTypes.Add(subhash);
}
}
@@ -980,7 +1013,9 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
}
#endregion
+
#region generating items
+
// generates a random item.
public static Item GenerateRandom(ActorSystem.Actor owner)
{
@@ -996,10 +1031,12 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
return CreateItem(owner, itemDefinition);
}
- public static List ObsoleteItems = new List();
+ public static List ObsoleteItems = new();
// generates a random equip item (for vendors)
- public static Item GenerateRandomEquip(ActorSystem.Actor owner, int level, int minQuality = 1, int maxQuality = -1, ItemTypeTable type = null, ToonClass owner_class = ToonClass.Unknown, bool crafted = false)
+ public static Item GenerateRandomEquip(ActorSystem.Actor owner, int level, int minQuality = 1,
+ int maxQuality = -1, ItemTypeTable type = null, ToonClass owner_class = ToonClass.Unknown,
+ bool crafted = false)
{
if (level < 0) level = owner.Attributes[GameAttribute.Level];
int quality = minQuality;
@@ -1008,24 +1045,43 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
if (maxQuality > -1)
quality = RandomHelper.Next(minQuality, maxQuality);
- if (quality > 8) //Unique items level scaling
+ if (quality > 8) //Unique items level scaling
{
var legaDefinition = GetRandom(AllowedItems.Values
- .Where(def =>
- def.ItemLevel <= Math.Min(level + 2, 73)
- && !ObsoleteItems.Contains(def.Hash)
- && UniqueItems.UniqueItemStats.ContainsKey(def.Hash)
- && def.Quality != ItemTable.ItemQuality.Special
- && (type == null ? true : ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID)).Contains(type.Hash))
- && (quality > 2 ? true : !ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID)).Contains(-740765630)) //not jewelry
- && (owner_class == ToonClass.Unknown ? true :
- (owner_class == ToonClass.Barbarian ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Barbarian) :
- (owner_class == ToonClass.Crusader ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Crusader) :
- (owner_class == ToonClass.Monk ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Monk) :
- (owner_class == ToonClass.Necromancer ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Necromancer) :
- (owner_class == ToonClass.Wizard ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Wizard) :
- (owner_class == ToonClass.DemonHunter ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.DemonHunter) :
- (owner_class == ToonClass.WitchDoctor ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.WitchDoctor) : true)))))))
+ .Where(def =>
+ def.ItemLevel <= Math.Min(level + 2, 73)
+ && !ObsoleteItems.Contains(def.Hash)
+ && UniqueItems.UniqueItemStats.ContainsKey(def.Hash)
+ && def.Quality != ItemTable.ItemQuality.Special
+ && (type == null
+ ? true
+ : ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID))
+ .Contains(type.Hash))
+ && (quality > 2
+ ? true
+ : !ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID))
+ .Contains(-740765630)) //not jewelry
+ && (owner_class == ToonClass.Unknown
+ ? true
+ : (owner_class == ToonClass.Barbarian
+ ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Barbarian)
+ : (owner_class == ToonClass.Crusader
+ ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Crusader)
+ : (owner_class == ToonClass.Monk
+ ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Monk)
+ : (owner_class == ToonClass.Necromancer
+ ? ItemGroup.FromHash(def.ItemTypesGBID).Usable
+ .HasFlag(ItemFlags.Necromancer)
+ : (owner_class == ToonClass.Wizard
+ ? ItemGroup.FromHash(def.ItemTypesGBID).Usable
+ .HasFlag(ItemFlags.Wizard)
+ : (owner_class == ToonClass.DemonHunter
+ ? ItemGroup.FromHash(def.ItemTypesGBID).Usable
+ .HasFlag(ItemFlags.DemonHunter)
+ : (owner_class == ToonClass.WitchDoctor
+ ? ItemGroup.FromHash(def.ItemTypesGBID).Usable
+ .HasFlag(ItemFlags.WitchDoctor)
+ : true)))))))
)
).ToList()
, (quality > 8));
@@ -1039,27 +1095,46 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
}
var itemDefinition = GetRandom(AllowedItems.Values
- .Where(def =>
+ .Where(def =>
//def.ItemLevel == owner.World.Game.InitialLevel //owner.Attributes[GameAttribute.Level]
def.ItemLevel >= Math.Max(Math.Min(level - 3, 60), 1)
&& def.ItemLevel <= Math.Min(level + 3, 73)
&& !ObsoleteItems.Contains(def.Hash) //obsolete 1.0.3 items
- && (type == null ? true : ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID)).Contains(type.Hash))
- && (quality > 2 ? true : !ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID)).Contains(-740765630)) //not jewelry
- && (owner_class == ToonClass.Unknown ? true :
- (owner_class == ToonClass.Barbarian ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Barbarian) :
- owner_class == ToonClass.Crusader ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Crusader) :
- (owner_class == ToonClass.Monk ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Monk) :
- (owner_class == ToonClass.Wizard ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Wizard) :
- (owner_class == ToonClass.DemonHunter ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.DemonHunter) :
- (owner_class == ToonClass.Necromancer ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Necromancer) :
- (owner_class == ToonClass.WitchDoctor ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.WitchDoctor) :
- true
- )))))))
- ).ToList()
- , false//(quality > 8)
- );
+ && (type == null
+ ? true
+ : ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID)).Contains(type.Hash))
+ && (quality > 2
+ ? true
+ : !ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID))
+ .Contains(-740765630)) //not jewelry
+ && (owner_class == ToonClass.Unknown
+ ? true
+ : (owner_class == ToonClass.Barbarian
+ ?
+ ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Barbarian)
+ :
+ owner_class == ToonClass.Crusader
+ ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Crusader)
+ :
+ (owner_class == ToonClass.Monk
+ ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Monk)
+ : (owner_class == ToonClass.Wizard
+ ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Wizard)
+ : (owner_class == ToonClass.DemonHunter
+ ? ItemGroup.FromHash(def.ItemTypesGBID).Usable
+ .HasFlag(ItemFlags.DemonHunter)
+ : (owner_class == ToonClass.Necromancer
+ ? ItemGroup.FromHash(def.ItemTypesGBID).Usable
+ .HasFlag(ItemFlags.Necromancer)
+ : (owner_class == ToonClass.WitchDoctor
+ ? ItemGroup.FromHash(def.ItemTypesGBID).Usable
+ .HasFlag(ItemFlags.WitchDoctor)
+ : true
+ )))))))
+ ).ToList()
+ , false //(quality > 8)
+ );
return CreateItem(owner, itemDefinition, quality, crafted);
}
@@ -1069,10 +1144,10 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
{
var itemDefinition = GetRandom(Items.Values
.Where(def =>
- def.ItemTypesGBID == StringHashHelper.HashItemName("Dye") &&
- !def.Name.Contains("CE")
- ).ToList()
- );
+ def.ItemTypesGBID == StringHashHelper.HashItemName("Dye") &&
+ !def.Name.Contains("CE")
+ ).ToList()
+ );
return CreateItem(owner, itemDefinition);
}
@@ -1089,18 +1164,18 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
if (dropRecipe && FastRandom.Instance.Next(100) < 2)
itemDefinition = GetRandom(Items.Values
.Where(def =>
- def.ItemLevel <= (level + 3) &&
- !def.Name.Contains("StaffofCow") &&
- def.Name.Contains("CraftingPlan") &&
- !def.Name.Contains("CraftingPlan_Jeweler")
- ).ToList()
- );
+ def.ItemLevel <= (level + 3) &&
+ !def.Name.Contains("StaffofCow") &&
+ def.Name.Contains("CraftingPlan") &&
+ !def.Name.Contains("CraftingPlan_Jeweler")
+ ).ToList()
+ );
if (itemDefinition == null) return null;
return CreateItem(player, itemDefinition);
}
- public static List GemNames = new List()
+ public static List GemNames = new()
{
"x1_Topaz",
"x1_Ruby",
@@ -1114,7 +1189,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
string baseN = "Unique_";
string gemName = "Gem";
- int gem_grade = RandomHelper.Next(1,23);
+ int gem_grade = RandomHelper.Next(1, 23);
gemName += string.Format("_0{0:00}", gem_grade) + "_x1";
return Cook((player as Player), baseN + gemName);
}
@@ -1136,7 +1211,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
public static Item GenerateRandom(ActorSystem.Actor player, ItemTypeTable type)
{
var itemDefinition = GetRandom(Items.Values
- .Where(def => ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID)).Contains(type.Hash)).ToList());
+ .Where(def => ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID)).Contains(type.Hash))
+ .ToList());
return CreateItem(player, itemDefinition);
}
@@ -1149,7 +1225,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
List pool_filtered = pool.Where(it =>
it.SNOActor != -1 &&
it.WeaponDamageMin != 100.0f &&
- !it.Name.ToLower().Contains("lootrun") && //TieredLootrunKey
+ !it.Name.ToLower().Contains("lootrun") && //TieredLootrunKey
!it.Name.ToLower().Contains("gold") &&
!it.Name.ToLower().Contains("Retro") &&
!it.Name.ToLower().Contains("healthglobe") &&
@@ -1169,7 +1245,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
!it.Name.ToLower().Contains("debug") &&
!it.Name.ToLower().Contains("promo") &&
!it.Name.ToLower().Contains("powerpotion") &&
- !((it.ItemTypesGBID == StringHashHelper.HashItemName("Book")) && (it.Cost == 0)) && // i hope it catches all lore with npc spawned /xsochor
+ !((it.ItemTypesGBID == StringHashHelper.HashItemName("Book")) &&
+ (it.Cost == 0)) && // i hope it catches all lore with npc spawned /xsochor
!(!GBIDHandlers.ContainsKey(it.Hash) && !AllowedItemTypes.Contains(it.ItemTypesGBID))
).ToList();
/*
@@ -1204,6 +1281,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
ItemTable selected = pool_filtered[FastRandom.Instance.Next(0, pool_filtered.Count() - 1)];
return selected;
}
+
private static ItemTable GetLegOrSetRandom(List pool, bool isUnique = false)
{
//var found = false;
@@ -1213,7 +1291,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
List pool_filtered = pool.Where(it =>
it.SNOActor != -1 &&
it.WeaponDamageMin != 100.0f &&
- !it.Name.ToLower().Contains("lootrun") && //TieredLootrunKey
+ !it.Name.ToLower().Contains("lootrun") && //TieredLootrunKey
!it.Name.ToLower().Contains("gold") &&
!it.Name.ToLower().Contains("Retro") &&
!it.Name.ToLower().Contains("healthglobe") &&
@@ -1233,7 +1311,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
!it.Name.ToLower().Contains("debug") &&
!it.Name.ToLower().Contains("promo") &&
!it.Name.ToLower().Contains("powerpotion") &&
- !((it.ItemTypesGBID == StringHashHelper.HashItemName("Book")) && (it.Cost == 0)) && // i hope it catches all lore with npc spawned /xsochor
+ !((it.ItemTypesGBID == StringHashHelper.HashItemName("Book")) &&
+ (it.Cost == 0)) && // i hope it catches all lore with npc spawned /xsochor
!(!GBIDHandlers.ContainsKey(it.Hash) && !AllowedItemTypes.Contains(it.ItemTypesGBID))
).ToList();
if (pool_filtered.Count() == 0) return null;
@@ -1241,8 +1320,11 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
ItemTable selected = pool_filtered[FastRandom.Instance.Next(0, pool_filtered.Count() - 1)];
return selected;
}
+
#endregion
+
#region misc
+
public static Type GetItemClass(ItemTable definition)
{
Type type = typeof(Item);
@@ -1274,12 +1356,15 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
public static Item CloneItem(Item originalItem)
{
- Item clonedItem = CreateItem(originalItem.Owner, originalItem.ItemDefinition, originalItem.Attributes[GameAttribute.Item_Quality_Level], originalItem.Attributes[GameAttribute.IsCrafted], originalItem.Attributes[GameAttribute.Seed]);
+ Item clonedItem = CreateItem(originalItem.Owner, originalItem.ItemDefinition,
+ originalItem.Attributes[GameAttribute.Item_Quality_Level],
+ originalItem.Attributes[GameAttribute.IsCrafted], originalItem.Attributes[GameAttribute.Seed]);
//clonedItem.AffixList = originalItem.AffixList;
//clonedItem.Attributes = originalItem.Attributes;
AffixGenerator.CloneIntoItem(originalItem, clonedItem);
- clonedItem.Attributes[GameAttribute.ItemStackQuantityLo] = originalItem.Attributes[GameAttribute.ItemStackQuantityLo];
+ clonedItem.Attributes[GameAttribute.ItemStackQuantityLo] =
+ originalItem.Attributes[GameAttribute.ItemStackQuantityLo];
clonedItem.RareItemName = originalItem.RareItemName;
clonedItem.Unidentified = originalItem.Unidentified;
return clonedItem;
@@ -1298,7 +1383,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
}
// Creates an item based on supplied definition.
- public static Item CreateItem(ActorSystem.Actor owner, ItemTable definition, int forceQuality = -1, bool crafted = false, int seed = -1)
+ public static Item CreateItem(ActorSystem.Actor owner, ItemTable definition, int forceQuality = -1,
+ bool crafted = false, int seed = -1)
{
// Logger.Trace("Creating item: {0} [sno:{1}, gbid {2}]", definition.Name, definition.SNOActor, StringHashHelper.HashItemName(definition.Name));
@@ -1306,7 +1392,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
Type type = GetItemClass(definition);
- var item = (Item)Activator.CreateInstance(type, new object[] { owner.World, definition, forceQuality, crafted, seed });
+ var item = (Item)Activator.CreateInstance(type,
+ new object[] { owner.World, definition, forceQuality, crafted, seed });
if (forceQuality == 9)
item.Attributes[GameAttribute.Item_Quality_Level] = 9;
return item;
@@ -1320,9 +1407,9 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
//Unique items level scaling
if (definition.Name.ToLower().Contains("unique") ||
- definition.Quality == ItemTable.ItemQuality.Legendary ||
- definition.Quality == ItemTable.ItemQuality.Special ||
- definition.Quality == ItemTable.ItemQuality.Set)
+ definition.Quality == ItemTable.ItemQuality.Legendary ||
+ definition.Quality == ItemTable.ItemQuality.Special ||
+ definition.Quality == ItemTable.ItemQuality.Set)
{
definition.ItemLevel = player.Attributes[GameAttribute.Level];
definition.RequiredLevel = player.Attributes[GameAttribute.Level];
@@ -1330,17 +1417,21 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
for (int i = 0; i < 6; i++)
definition.MaxAffixLevel[i] = player.Attributes[GameAttribute.Level];
}
+
return CookFromDefinition(player.World, definition);
}
// Allows cooking a custom item.
- public static Item CookFromDefinition(World world, ItemTable definition, int forceQuality = -1, bool binded = false, bool crafted = false, int seed = -1)
+ public static Item CookFromDefinition(World world, ItemTable definition, int forceQuality = -1,
+ bool binded = false, bool crafted = false, int seed = -1)
{
Type type = GetItemClass(definition);
- var item = (Item)Activator.CreateInstance(type, new object[] { world, definition, forceQuality, crafted, seed });
+ var item = (Item)Activator.CreateInstance(type,
+ new object[] { world, definition, forceQuality, crafted, seed });
- item.Attributes[GameAttribute.Item_Quality_Level] = Math.Min(item.Attributes[GameAttribute.Item_Quality_Level], 9);
+ item.Attributes[GameAttribute.Item_Quality_Level] =
+ Math.Min(item.Attributes[GameAttribute.Item_Quality_Level], 9);
if (binded)
item.Attributes[GameAttribute.Item_Binding_Level_Override] = 1;
@@ -1449,7 +1540,9 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
}
#endregion
+
#region Database handling
+
public static void SaveToDB(Item item)
{
//var timestart = DateTime.Now;
@@ -1477,10 +1570,13 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
}
- public static Item LoadFromDB(Player owner, DBInventory instance)// int dbID, int gbid, string attributesSer, string affixesSer)
+ public static Item
+ LoadFromDB(Player owner,
+ DBInventory instance) // int dbID, int gbid, string attributesSer, string affixesSer)
{
var table = Items[instance.GbId];
- var itm = new Item(owner.World, table, DeSerializeAffixList(instance.Affixes), instance.Attributes, instance.Count);
+ var itm = new Item(owner.World, table, DeSerializeAffixList(instance.Affixes), instance.Attributes,
+ instance.Count);
if (itm.Attributes[GameAttribute.Durability_Max] > 0)
itm.Attributes[GameAttribute.Durability_Cur] = instance.Durability;
itm.Attributes[GameAttribute.DyeType] = instance.DyeType;
@@ -1497,9 +1593,12 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
owner.World.CachedItems[instance.Id] = itm;
- if (instance.FirstGem != -1) itm.Gems.Add(CookFromDefinition(owner.World, GetItemDefinition(instance.FirstGem), 1));
- if (instance.SecondGem != -1) itm.Gems.Add(CookFromDefinition(owner.World, GetItemDefinition(instance.SecondGem), 1));
- if (instance.ThirdGem != -1) itm.Gems.Add(CookFromDefinition(owner.World, GetItemDefinition(instance.ThirdGem), 1));
+ if (instance.FirstGem != -1)
+ itm.Gems.Add(CookFromDefinition(owner.World, GetItemDefinition(instance.FirstGem), 1));
+ if (instance.SecondGem != -1)
+ itm.Gems.Add(CookFromDefinition(owner.World, GetItemDefinition(instance.SecondGem), 1));
+ if (instance.ThirdGem != -1)
+ itm.Gems.Add(CookFromDefinition(owner.World, GetItemDefinition(instance.ThirdGem), 1));
for (int i = 0; i < itm.Gems.Count; i++)
{
@@ -1509,7 +1608,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
itm.Attributes[GameAttribute.Sockets_Filled] = itm.Gems.Count;
- if (instance.RareItemName != null) itm.RareItemName = D3.Items.RareItemName.ParseFrom(instance.RareItemName);
+ if (instance.RareItemName != null)
+ itm.RareItemName = D3.Items.RareItemName.ParseFrom(instance.RareItemName);
return itm;
}
@@ -1517,7 +1617,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
public static string SerializeAffixList(List affixList)
{
var affixgbIdList = affixList.Select(af => af.AffixGbid);
- var affixSer = affixgbIdList.Aggregate(",", (current, affixId) => current + (affixId + ",")).Trim(new[] { ',' });
+ var affixSer = affixgbIdList.Aggregate(",", (current, affixId) => current + (affixId + ","))
+ .Trim(new[] { ',' });
return affixSer;
}
@@ -1534,6 +1635,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
{
return 0;
}
+
var pairs = attributesList.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var pair in pairs)
{
@@ -1576,6 +1678,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
{
return false;
}
+
var pairs = attributesList.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var pair in pairs)
{
@@ -1613,5 +1716,4 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
#endregion
}
-}
-
\ No newline at end of file
+}
\ No newline at end of file