From 0e62c1083dc8548a6f9e3542de6e735d8c546a5f Mon Sep 17 00:00:00 2001 From: Lucca Faria Ferri Date: Thu, 26 Jan 2023 18:11:41 -0800 Subject: [PATCH] Unidentified items --- src/DiIiS-NA/Core/Helpers/Math/FastRandom.cs | 14 +- .../AchievementSystem/AchievementManager.cs | 4 +- .../CommandManager/GameCommands.cs | 3 - .../GSSystem/ItemsSystem/Item.cs | 10 +- .../GSSystem/ItemsSystem/ItemGenerator.cs | 122 +++++++----------- .../D3-GameServer/GSSystem/MapSystem/World.cs | 4 +- .../PlayerSystem/ConversationManager.cs | 6 +- 7 files changed, 72 insertions(+), 91 deletions(-) diff --git a/src/DiIiS-NA/Core/Helpers/Math/FastRandom.cs b/src/DiIiS-NA/Core/Helpers/Math/FastRandom.cs index 32970e2..eeb780b 100644 --- a/src/DiIiS-NA/Core/Helpers/Math/FastRandom.cs +++ b/src/DiIiS-NA/Core/Helpers/Math/FastRandom.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; //Blizzless Project 2022 using System.Text; +using DiIiS_NA.Core.Logging; namespace DiIiS_NA.Core.Helpers.Math { @@ -12,7 +13,9 @@ namespace DiIiS_NA.Core.Helpers.Math { #region Static Fields - private static readonly FastRandom __seedRng = new FastRandom((int)Environment.TickCount); + private static readonly Logger Logger = LogManager.CreateLogger(nameof(FastRandom)); + + private static readonly FastRandom _seedRng = new(Environment.TickCount); public static readonly FastRandom Instance = new FastRandom(); @@ -32,7 +35,7 @@ namespace DiIiS_NA.Core.Helpers.Math public FastRandom() { - Reinitialise(__seedRng.NextInt()); + Reinitialise(_seedRng.NextInt()); } public FastRandom(int seed) @@ -212,5 +215,12 @@ namespace DiIiS_NA.Core.Helpers.Math } #endregion + + /// + /// Chance returns true if a random number between 0 and 100 is lesser than the specified value. + /// + /// + /// + public bool Chance(float successPercentage) => Next(100) < successPercentage; } } diff --git a/src/DiIiS-NA/D3-GameServer/AchievementSystem/AchievementManager.cs b/src/DiIiS-NA/D3-GameServer/AchievementSystem/AchievementManager.cs index 6b6c6e7..ade1031 100644 --- a/src/DiIiS-NA/D3-GameServer/AchievementSystem/AchievementManager.cs +++ b/src/DiIiS-NA/D3-GameServer/AchievementSystem/AchievementManager.cs @@ -384,7 +384,7 @@ namespace DiIiS_NA.GameServer.AchievementSystem lock (client._serviceLock) { if (additionalQuantity == 0) return; - Logger.Trace("UpdateQuantity(): id {0}", achievementId); + Logger.Debug("UpdateQuantity(): id {0}", achievementId); if (client.Account.GameAccount.Achievements.Where(a => a.AchievementId == achievementId && a.Completion != -1).Count() > 0) return; ulong mainCriteriaId = GetMainCriteria(achievementId); @@ -417,7 +417,7 @@ namespace DiIiS_NA.GameServer.AchievementSystem var achievement = new DBAchievements(); if (achs.Count == 0) { - Logger.Trace("UpdateQuantity(): creating new ach data"); + Logger.Debug("UpdateQuantity(): creating new ach data"); achievement.DBGameAccount = client.Account.GameAccount.DBGameAccount; achievement.AchievementId = achievementId; achievement.IsHardcore = IsHardcore(achievementId); diff --git a/src/DiIiS-NA/D3-GameServer/CommandManager/GameCommands.cs b/src/DiIiS-NA/D3-GameServer/CommandManager/GameCommands.cs index 9284f2c..cff844d 100644 --- a/src/DiIiS-NA/D3-GameServer/CommandManager/GameCommands.cs +++ b/src/DiIiS-NA/D3-GameServer/CommandManager/GameCommands.cs @@ -289,9 +289,6 @@ namespace DiIiS_NA.GameServer.CommandManager } } - - - player.Toon.GameAccount.NotifyUpdate(); if (player.Level >= 70) return $"New paragon level: {player.ParagonLevel}"; diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/Item.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/Item.cs index eb543c9..3ca118c 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/Item.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/Item.cs @@ -64,8 +64,12 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem public bool Unidentified { - get; - set; + get => Attributes[GameAttribute.Unidentified]; + set + { + Attributes[GameAttribute.Unidentified] = value; + if (DBInventory is {} dbInventory) dbInventory.Unidentified = value; + } } public int EquipGemType @@ -371,7 +375,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem public void Identify() { Unidentified = false; - DBInventory.Unidentified = false; + // DBInventory.Unidentified = false; Attributes[GameAttribute.Unidentified] = false; Owner.World.Game.GameDBSession.SessionUpdate(DBInventory); diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/ItemGenerator.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/ItemGenerator.cs index e41e832..f199b8f 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/ItemGenerator.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/ItemGenerator.cs @@ -1035,7 +1035,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem // 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, + int maxQuality = -1, ItemTypeTable type = null, ToonClass ownerClass = ToonClass.Unknown, bool crafted = false) { if (level < 0) level = owner.Attributes[GameAttribute.Level]; @@ -1053,35 +1053,18 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem && !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))))))) + && (type == null || ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID)).Contains(type.Hash)) + && (quality > 2 || !ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID)).Contains(-740765630)) //not jewelry + && (ownerClass == ToonClass.Unknown || (ownerClass switch + { + ToonClass.Barbarian => ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Barbarian), + ToonClass.Crusader => ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Crusader), + ToonClass.Monk => ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Monk), + ToonClass.Necromancer => ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Necromancer), + ToonClass.Wizard => ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Wizard), + ToonClass.DemonHunter => ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.DemonHunter), + _ => ownerClass != ToonClass.WitchDoctor || ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.WitchDoctor) + }) ) ).ToList() , (quality > 8)); @@ -1101,37 +1084,22 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem && 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 - ))))))) + && (type == null || ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID)).Contains(type.Hash)) + && (quality > 2 || !ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID)).Contains(-740765630)) //not jewelry + && (ownerClass == ToonClass.Unknown || (ownerClass switch + { + ToonClass.Barbarian => ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Barbarian), + ToonClass.Crusader => ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Crusader), + ToonClass.Monk => ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Monk), + ToonClass.Wizard => ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Wizard), + ToonClass.DemonHunter => ItemGroup.FromHash(def.ItemTypesGBID).Usable + .HasFlag(ItemFlags.DemonHunter), + ToonClass.Necromancer => ItemGroup.FromHash(def.ItemTypesGBID).Usable + .HasFlag(ItemFlags.Necromancer), + ToonClass.WitchDoctor => ItemGroup.FromHash(def.ItemTypesGBID).Usable + .HasFlag(ItemFlags.WitchDoctor), + _ => true + })) ).ToList() , false //(quality > 8) ); @@ -1350,7 +1318,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem public static int GetItemHash(string name) { - var item = Items.Where(i => i.Value.Name == name).FirstOrDefault(); + var item = Items.FirstOrDefault(i => i.Value.Name == name); return (item.Value == null ? -1 : item.Key); } @@ -1378,7 +1346,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem Item item = GenerateRandomEquip(player, player.Level, minQuality, 10, itemType); - item.Unidentified = false; + item.Unidentified = FastRandom.Instance.Chance(10f); return item; } @@ -1396,6 +1364,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem new object[] { owner.World, definition, forceQuality, crafted, seed }); if (forceQuality == 9) item.Attributes[GameAttribute.Item_Quality_Level] = 9; + item.Unidentified = FastRandom.Instance.Chance(10f); return item; } @@ -1444,17 +1413,17 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem return (Items.ContainsKey(gbid)) ? Items[gbid] : null; } - public static List GetParagonBonusTable(ToonClass toon_class) + public static List GetParagonBonusTable(ToonClass toonClass) { - Class gb_class = Class.None; - if (toon_class == ToonClass.Barbarian) gb_class = Class.Barbarian; - if (toon_class == ToonClass.Crusader) gb_class = Class.Crusader; - if (toon_class == ToonClass.DemonHunter) gb_class = Class.DemonHunter; - if (toon_class == ToonClass.Monk) gb_class = Class.Monk; - if (toon_class == ToonClass.WitchDoctor) gb_class = Class.Witchdoctor; - if (toon_class == ToonClass.Wizard) gb_class = Class.Wizard; - if (toon_class == ToonClass.Necromancer) gb_class = Class.Necromancer; - return ParagonBonuses.Where(b => b.HeroClass == gb_class || b.HeroClass == Class.None).ToList(); + Class @class = Class.None; + if (toonClass == ToonClass.Barbarian) @class = Class.Barbarian; + if (toonClass == ToonClass.Crusader) @class = Class.Crusader; + if (toonClass == ToonClass.DemonHunter) @class = Class.DemonHunter; + if (toonClass == ToonClass.Monk) @class = Class.Monk; + if (toonClass == ToonClass.WitchDoctor) @class = Class.Witchdoctor; + if (toonClass == ToonClass.Wizard) @class = Class.Wizard; + if (toonClass == ToonClass.Necromancer) @class = Class.Necromancer; + return ParagonBonuses.Where(b => b.HeroClass == @class || b.HeroClass == Class.None).ToList(); } public static RecipeTable GetRecipeDefinition(int gbid) @@ -1464,8 +1433,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem public static RecipeTable GetRecipeDefinition(string name) { - var recipe = Recipes.Where(r => r.Value.Name == name).FirstOrDefault(); - return (recipe.Value == null) ? null : recipe.Value; + var recipe = Recipes.FirstOrDefault(r => r.Value.Name == name); + return recipe.Value; } public static SocketedEffectTable GetGemEffectDefinition(int gem_gbid, int item_type) @@ -1581,8 +1550,9 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem itm.Attributes[GameAttribute.Durability_Cur] = instance.Durability; itm.Attributes[GameAttribute.DyeType] = instance.DyeType; itm.Attributes[GameAttribute.TransmogGBID] = instance.TransmogGBID; - itm.Unidentified = instance.Unidentified; itm.DBInventory = instance; + itm.Unidentified = instance.Unidentified; + if (instance.Version == 1) itm.Attributes[GameAttribute.IsCrafted] = true; diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/MapSystem/World.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/MapSystem/World.cs index 6b62c67..161f3e0 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/MapSystem/World.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/MapSystem/World.cs @@ -797,7 +797,7 @@ namespace DiIiS_NA.GameServer.GSSystem.MapSystem } public Item SpawnRandomEquip(Actor source, Player player, int forceQuality = -1, int forceLevel = -1, GameBalance.ItemTypeTable type = null, ToonClass toonClass = ToonClass.Unknown) { - //Logger.Debug("SpawnRandomEquip(): quality {0}", forceQuality); + Logger.Debug("SpawnRandomEquip(): quality {0}", forceQuality); if (player != null) { int level = (forceLevel > 0 ? forceLevel : source.Attributes[GameAttribute.Level]); @@ -812,7 +812,7 @@ namespace DiIiS_NA.GameServer.GSSystem.MapSystem } else { - var item = ItemGenerator.GenerateRandomEquip(player, level, forceQuality, forceQuality, type: type,owner_class: toonClass); + var item = ItemGenerator.GenerateRandomEquip(player, level, forceQuality, forceQuality, type: type,ownerClass: toonClass); if (item == null) return null; player.GroundItems[item.GlobalID] = item; diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/ConversationManager.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/ConversationManager.cs index 7701de2..127e62d 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/ConversationManager.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/ConversationManager.cs @@ -314,7 +314,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem asset.ConversationType != ConversationTypes.GlobalFloat) player.CheckConversationCriteria(asset.Header.SNOId); - Logger.Trace("Handling conversation for Conversation: {0}", SNOId); + Logger.Debug("Handling conversation for Conversation: {0}", SNOId); if (player.World.Game.QuestProgress.QuestTriggers.ContainsKey(SNOId)) { var trigger = player.World.Game.QuestProgress.QuestTriggers[SNOId]; @@ -730,12 +730,12 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem void ConversationEnded(object sender, EventArgs e) { Conversation conversation = sender as Conversation; - Logger.Trace(" (ConversationEnded) Sending a notify with type {0} and value {1}", + Logger.Debug(" (ConversationEnded) Sending a notify with type {0} and value {1}", conversation.ConversationType, conversation.SNOId); //quests.Notify(QuestStepObjectiveType.HadConversation, conversation.SNOId); //deprecated - //���������� + //Conversation ended if (player.PlayerIndex == 0) switch (conversation.SNOId) {