Unidentified items

This commit is contained in:
Lucca Faria Ferri 2023-01-26 18:11:41 -08:00
parent 9ef1ec0a6a
commit 0e62c1083d
7 changed files with 72 additions and 91 deletions

View File

@ -5,6 +5,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
//Blizzless Project 2022 //Blizzless Project 2022
using System.Text; using System.Text;
using DiIiS_NA.Core.Logging;
namespace DiIiS_NA.Core.Helpers.Math namespace DiIiS_NA.Core.Helpers.Math
{ {
@ -12,7 +13,9 @@ namespace DiIiS_NA.Core.Helpers.Math
{ {
#region Static Fields #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(); public static readonly FastRandom Instance = new FastRandom();
@ -32,7 +35,7 @@ namespace DiIiS_NA.Core.Helpers.Math
public FastRandom() public FastRandom()
{ {
Reinitialise(__seedRng.NextInt()); Reinitialise(_seedRng.NextInt());
} }
public FastRandom(int seed) public FastRandom(int seed)
@ -212,5 +215,12 @@ namespace DiIiS_NA.Core.Helpers.Math
} }
#endregion #endregion
/// <summary>
/// Chance returns true if a random number between 0 and 100 is lesser than the specified value.
/// </summary>
/// <param name="successPercentage"></param>
/// <returns></returns>
public bool Chance(float successPercentage) => Next(100) < successPercentage;
} }
} }

View File

@ -384,7 +384,7 @@ namespace DiIiS_NA.GameServer.AchievementSystem
lock (client._serviceLock) lock (client._serviceLock)
{ {
if (additionalQuantity == 0) return; 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; if (client.Account.GameAccount.Achievements.Where(a => a.AchievementId == achievementId && a.Completion != -1).Count() > 0) return;
ulong mainCriteriaId = GetMainCriteria(achievementId); ulong mainCriteriaId = GetMainCriteria(achievementId);
@ -417,7 +417,7 @@ namespace DiIiS_NA.GameServer.AchievementSystem
var achievement = new DBAchievements(); var achievement = new DBAchievements();
if (achs.Count == 0) 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.DBGameAccount = client.Account.GameAccount.DBGameAccount;
achievement.AchievementId = achievementId; achievement.AchievementId = achievementId;
achievement.IsHardcore = IsHardcore(achievementId); achievement.IsHardcore = IsHardcore(achievementId);

View File

@ -289,9 +289,6 @@ namespace DiIiS_NA.GameServer.CommandManager
} }
} }
player.Toon.GameAccount.NotifyUpdate(); player.Toon.GameAccount.NotifyUpdate();
if (player.Level >= 70) if (player.Level >= 70)
return $"New paragon level: {player.ParagonLevel}"; return $"New paragon level: {player.ParagonLevel}";

View File

@ -64,8 +64,12 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
public bool Unidentified public bool Unidentified
{ {
get; get => Attributes[GameAttribute.Unidentified];
set; set
{
Attributes[GameAttribute.Unidentified] = value;
if (DBInventory is {} dbInventory) dbInventory.Unidentified = value;
}
} }
public int EquipGemType public int EquipGemType
@ -371,7 +375,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
public void Identify() public void Identify()
{ {
Unidentified = false; Unidentified = false;
DBInventory.Unidentified = false; // DBInventory.Unidentified = false;
Attributes[GameAttribute.Unidentified] = false; Attributes[GameAttribute.Unidentified] = false;
Owner.World.Game.GameDBSession.SessionUpdate(DBInventory); Owner.World.Game.GameDBSession.SessionUpdate(DBInventory);

View File

@ -1035,7 +1035,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
// generates a random equip item (for vendors) // generates a random equip item (for vendors)
public static Item GenerateRandomEquip(ActorSystem.Actor owner, int level, int minQuality = 1, 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) bool crafted = false)
{ {
if (level < 0) level = owner.Attributes[GameAttribute.Level]; if (level < 0) level = owner.Attributes[GameAttribute.Level];
@ -1053,35 +1053,18 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
&& !ObsoleteItems.Contains(def.Hash) && !ObsoleteItems.Contains(def.Hash)
&& UniqueItems.UniqueItemStats.ContainsKey(def.Hash) && UniqueItems.UniqueItemStats.ContainsKey(def.Hash)
&& def.Quality != ItemTable.ItemQuality.Special && def.Quality != ItemTable.ItemQuality.Special
&& (type == null && (type == null || ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID)).Contains(type.Hash))
? true && (quality > 2 || !ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID)).Contains(-740765630)) //not jewelry
: ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID)) && (ownerClass == ToonClass.Unknown || (ownerClass switch
.Contains(type.Hash)) {
&& (quality > 2 ToonClass.Barbarian => ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Barbarian),
? true ToonClass.Crusader => ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Crusader),
: !ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID)) ToonClass.Monk => ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Monk),
.Contains(-740765630)) //not jewelry ToonClass.Necromancer => ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Necromancer),
&& (owner_class == ToonClass.Unknown ToonClass.Wizard => ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Wizard),
? true ToonClass.DemonHunter => ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.DemonHunter),
: (owner_class == ToonClass.Barbarian _ => ownerClass != ToonClass.WitchDoctor || ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.WitchDoctor)
? 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() ).ToList()
, (quality > 8)); , (quality > 8));
@ -1101,37 +1084,22 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
&& def.ItemLevel <= Math.Min(level + 3, 73) && def.ItemLevel <= Math.Min(level + 3, 73)
&& !ObsoleteItems.Contains(def.Hash) //obsolete 1.0.3 items && !ObsoleteItems.Contains(def.Hash) //obsolete 1.0.3 items
&& (type == null && (type == null || ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID)).Contains(type.Hash))
? true && (quality > 2 || !ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID)).Contains(-740765630)) //not jewelry
: ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID)).Contains(type.Hash)) && (ownerClass == ToonClass.Unknown || (ownerClass switch
&& (quality > 2 {
? true ToonClass.Barbarian => ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Barbarian),
: !ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID)) ToonClass.Crusader => ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Crusader),
.Contains(-740765630)) //not jewelry ToonClass.Monk => ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Monk),
&& (owner_class == ToonClass.Unknown ToonClass.Wizard => ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Wizard),
? true ToonClass.DemonHunter => ItemGroup.FromHash(def.ItemTypesGBID).Usable
: (owner_class == ToonClass.Barbarian .HasFlag(ItemFlags.DemonHunter),
? ToonClass.Necromancer => ItemGroup.FromHash(def.ItemTypesGBID).Usable
ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Barbarian) .HasFlag(ItemFlags.Necromancer),
: ToonClass.WitchDoctor => ItemGroup.FromHash(def.ItemTypesGBID).Usable
owner_class == ToonClass.Crusader .HasFlag(ItemFlags.WitchDoctor),
? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Crusader) _ => true
: }))
(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() ).ToList()
, false //(quality > 8) , false //(quality > 8)
); );
@ -1350,7 +1318,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
public static int GetItemHash(string name) 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); 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 item = GenerateRandomEquip(player, player.Level, minQuality, 10, itemType);
item.Unidentified = false; item.Unidentified = FastRandom.Instance.Chance(10f);
return item; return item;
} }
@ -1396,6 +1364,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
new object[] { owner.World, definition, forceQuality, crafted, seed }); new object[] { owner.World, definition, forceQuality, crafted, seed });
if (forceQuality == 9) if (forceQuality == 9)
item.Attributes[GameAttribute.Item_Quality_Level] = 9; item.Attributes[GameAttribute.Item_Quality_Level] = 9;
item.Unidentified = FastRandom.Instance.Chance(10f);
return item; return item;
} }
@ -1444,17 +1413,17 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
return (Items.ContainsKey(gbid)) ? Items[gbid] : null; return (Items.ContainsKey(gbid)) ? Items[gbid] : null;
} }
public static List<ParagonBonusesTable> GetParagonBonusTable(ToonClass toon_class) public static List<ParagonBonusesTable> GetParagonBonusTable(ToonClass toonClass)
{ {
Class gb_class = Class.None; Class @class = Class.None;
if (toon_class == ToonClass.Barbarian) gb_class = Class.Barbarian; if (toonClass == ToonClass.Barbarian) @class = Class.Barbarian;
if (toon_class == ToonClass.Crusader) gb_class = Class.Crusader; if (toonClass == ToonClass.Crusader) @class = Class.Crusader;
if (toon_class == ToonClass.DemonHunter) gb_class = Class.DemonHunter; if (toonClass == ToonClass.DemonHunter) @class = Class.DemonHunter;
if (toon_class == ToonClass.Monk) gb_class = Class.Monk; if (toonClass == ToonClass.Monk) @class = Class.Monk;
if (toon_class == ToonClass.WitchDoctor) gb_class = Class.Witchdoctor; if (toonClass == ToonClass.WitchDoctor) @class = Class.Witchdoctor;
if (toon_class == ToonClass.Wizard) gb_class = Class.Wizard; if (toonClass == ToonClass.Wizard) @class = Class.Wizard;
if (toon_class == ToonClass.Necromancer) gb_class = Class.Necromancer; if (toonClass == ToonClass.Necromancer) @class = Class.Necromancer;
return ParagonBonuses.Where(b => b.HeroClass == gb_class || b.HeroClass == Class.None).ToList(); return ParagonBonuses.Where(b => b.HeroClass == @class || b.HeroClass == Class.None).ToList();
} }
public static RecipeTable GetRecipeDefinition(int gbid) public static RecipeTable GetRecipeDefinition(int gbid)
@ -1464,8 +1433,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
public static RecipeTable GetRecipeDefinition(string name) public static RecipeTable GetRecipeDefinition(string name)
{ {
var recipe = Recipes.Where(r => r.Value.Name == name).FirstOrDefault(); var recipe = Recipes.FirstOrDefault(r => r.Value.Name == name);
return (recipe.Value == null) ? null : recipe.Value; return recipe.Value;
} }
public static SocketedEffectTable GetGemEffectDefinition(int gem_gbid, int item_type) 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.Durability_Cur] = instance.Durability;
itm.Attributes[GameAttribute.DyeType] = instance.DyeType; itm.Attributes[GameAttribute.DyeType] = instance.DyeType;
itm.Attributes[GameAttribute.TransmogGBID] = instance.TransmogGBID; itm.Attributes[GameAttribute.TransmogGBID] = instance.TransmogGBID;
itm.Unidentified = instance.Unidentified;
itm.DBInventory = instance; itm.DBInventory = instance;
itm.Unidentified = instance.Unidentified;
if (instance.Version == 1) if (instance.Version == 1)
itm.Attributes[GameAttribute.IsCrafted] = true; itm.Attributes[GameAttribute.IsCrafted] = true;

View File

@ -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) 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) if (player != null)
{ {
int level = (forceLevel > 0 ? forceLevel : source.Attributes[GameAttribute.Level]); int level = (forceLevel > 0 ? forceLevel : source.Attributes[GameAttribute.Level]);
@ -812,7 +812,7 @@ namespace DiIiS_NA.GameServer.GSSystem.MapSystem
} }
else 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; if (item == null) return null;
player.GroundItems[item.GlobalID] = item; player.GroundItems[item.GlobalID] = item;

View File

@ -314,7 +314,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
asset.ConversationType != ConversationTypes.GlobalFloat) asset.ConversationType != ConversationTypes.GlobalFloat)
player.CheckConversationCriteria(asset.Header.SNOId); 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)) if (player.World.Game.QuestProgress.QuestTriggers.ContainsKey(SNOId))
{ {
var trigger = player.World.Game.QuestProgress.QuestTriggers[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) void ConversationEnded(object sender, EventArgs e)
{ {
Conversation conversation = sender as Conversation; 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); conversation.ConversationType, conversation.SNOId);
//quests.Notify(QuestStepObjectiveType.HadConversation, conversation.SNOId); //deprecated //quests.Notify(QuestStepObjectiveType.HadConversation, conversation.SNOId); //deprecated
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //Conversation ended
if (player.PlayerIndex == 0) if (player.PlayerIndex == 0)
switch (conversation.SNOId) switch (conversation.SNOId)
{ {