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

View File

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

View File

@ -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);

View File

@ -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<ParagonBonusesTable> GetParagonBonusTable(ToonClass toon_class)
public static List<ParagonBonusesTable> 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;

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

View File

@ -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
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//Conversation ended
if (player.PlayerIndex == 0)
switch (conversation.SNOId)
{