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)
{