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