Item/ItemGenerator reformat; Change in Loggers
This commit is contained in:
parent
7c8f95fdfd
commit
55e30cd4c0
@ -18,12 +18,12 @@ namespace DiIiS_NA.Core.Logging
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Available & configured log targets.
|
/// Available & configured log targets.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal readonly static List<LogTarget> Targets = new List<LogTarget>();
|
internal static readonly List<LogTarget> Targets = new();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Available loggers.
|
/// Available loggers.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal static readonly Dictionary<string, Logger> Loggers = new Dictionary<string, Logger>();
|
internal readonly static Dictionary<string, Logger> Loggers = new();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates and returns a logger named with declaring type.
|
/// 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.
|
if (name == null) // see if we got a name.
|
||||||
throw new Exception("Error getting full name for declaring type.");
|
throw new Exception("Error getting full name for declaring type.");
|
||||||
|
|
||||||
if (!Loggers.ContainsKey(name)) // see if we already have instance for the given name.
|
return CreateLogger(name); // return the newly created logger.
|
||||||
Loggers.Add(name, new Logger(name)); // add it to dictionary of loggers.
|
|
||||||
|
|
||||||
return Loggers[name]; // return the newly created logger.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@ -46,29 +46,22 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
{
|
{
|
||||||
public DBInventory DBInventory = null;
|
public DBInventory DBInventory = null;
|
||||||
|
|
||||||
private static readonly Logger Logger = LogManager.CreateLogger();
|
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 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 Actor Owner { get; set; } // Only set when the _actor_ has the item in its inventory. /fasbat
|
||||||
|
|
||||||
public ItemTable ItemDefinition
|
public ItemTable ItemDefinition => ItemGenerator.GetItemDefinition(GBHandle.GBID);
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return ItemGenerator.GetItemDefinition(GBHandle.GBID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public ItemTypeTable ItemType
|
public ItemTypeTable ItemType => ItemGroup.FromHash(ItemDefinition.ItemTypesGBID);
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return ItemGroup.FromHash(ItemDefinition.ItemTypesGBID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Unidentified = false;
|
public bool Unidentified = false;
|
||||||
|
|
||||||
@ -101,40 +94,28 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
public ItemState CurrentState { get; set; }
|
public ItemState CurrentState { get; set; }
|
||||||
|
|
||||||
public int EquipmentSlot { get; private 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
|
public override int Quality
|
||||||
{
|
{
|
||||||
get
|
get => Attributes[GameAttribute.Item_Quality_Level];
|
||||||
{
|
set => Attributes[GameAttribute.Item_Quality_Level] = value;
|
||||||
return Attributes[GameAttribute.Item_Quality_Level];
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
Attributes[GameAttribute.Item_Quality_Level] = value;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public SNOHandle SnoFlippyActory
|
public SNOHandle SnoFlippyActory => ActorData.TagMap.ContainsKey(ActorKeys.Flippy) ? ActorData.TagMap[ActorKeys.Flippy] : null;
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return ActorData.TagMap.ContainsKey(ActorKeys.Flippy) ? ActorData.TagMap[ActorKeys.Flippy] : null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public SNOHandle SnoFlippyParticle
|
public SNOHandle SnoFlippyParticle =>
|
||||||
{
|
ActorData.TagMap.ContainsKey(ActorKeys.FlippyParticle)
|
||||||
get
|
? ActorData.TagMap[ActorKeys.FlippyParticle]
|
||||||
{
|
: null;
|
||||||
return ActorData.TagMap.ContainsKey(ActorKeys.FlippyParticle) ? ActorData.TagMap[ActorKeys.FlippyParticle] : null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool HasWorldLocation
|
public override bool HasWorldLocation => Owner == null;
|
||||||
{
|
|
||||||
get { return Owner == null; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override InventoryLocationMessageData InventoryLocationMessage(Player plr)
|
public override InventoryLocationMessageData InventoryLocationMessage(Player plr)
|
||||||
{
|
{
|
||||||
@ -164,7 +145,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
|
|
||||||
public List<int> AffixFamilies = new List<int>();
|
public List<int> AffixFamilies = new List<int>();
|
||||||
|
|
||||||
public Item(World world, ItemTable definition, IEnumerable<Affix> affixList, string serializedGameAttributeMap, int count = 1)
|
public Item(World world, ItemTable definition, IEnumerable<Affix> affixList, string serializedGameAttributeMap,
|
||||||
|
int count = 1)
|
||||||
: base(world, (ActorSno)definition.SNOActor)
|
: base(world, (ActorSno)definition.SNOActor)
|
||||||
{
|
{
|
||||||
GBHandle.GBID = definition.Hash;
|
GBHandle.GBID = definition.Hash;
|
||||||
@ -191,17 +173,22 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
//this.Attributes[GameAttribute.EnchantAffix, 1] = -758203990;
|
//this.Attributes[GameAttribute.EnchantAffix, 1] = -758203990;
|
||||||
//this.Attributes[GameAttribute.EnchantRangeVal] = 1;
|
//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;
|
//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);
|
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 (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;
|
Attributes[GameAttribute.Requirement, 57] = AffixList[0].Definition.OverrideLevelReq;
|
||||||
foreach (var affix in AffixList)
|
foreach (var affix in AffixList)
|
||||||
{
|
{
|
||||||
@ -254,7 +241,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
|
|
||||||
Attributes[GameAttribute.Loot_2_0_Drop] = true;
|
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);
|
Attributes[GameAttribute.Item_Quality_Level] = RandomHelper.Next(8);
|
||||||
if (ItemType.Usable.HasFlag(ItemFlags.AtLeastMagical) && Attributes[GameAttribute.Item_Quality_Level] < 3)
|
if (ItemType.Usable.HasFlag(ItemFlags.AtLeastMagical) && Attributes[GameAttribute.Item_Quality_Level] < 3)
|
||||||
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;
|
Attributes[GameAttribute.Item_Quality_Level] = 9;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ItemDefinition.Name.ToLower().Contains("unique_gem"))
|
if (ItemDefinition.Name.ToLower().Contains("unique_gem"))
|
||||||
{
|
{
|
||||||
Attributes[GameAttribute.Item_Quality_Level] = 9;
|
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;
|
||||||
//Attributes[GameAttribute.Jewel_Rank] = 1;
|
//Attributes[GameAttribute.Jewel_Rank] = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ItemDefinition.Name.ToLower().Contains("norm_season"))
|
if (ItemDefinition.Name.ToLower().Contains("norm_season"))
|
||||||
{
|
{
|
||||||
Attributes[GameAttribute.Item_Quality_Level] = 9;
|
Attributes[GameAttribute.Item_Quality_Level] = 9;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ItemDefinition.Name.ToLower().StartsWith("p71_ethereal"))
|
if (ItemDefinition.Name.ToLower().StartsWith("p71_ethereal"))
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -310,9 +301,11 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
{
|
{
|
||||||
if (!crafted)
|
if (!crafted)
|
||||||
RandomGenerator.Next();
|
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.Next();
|
||||||
}
|
}
|
||||||
|
|
||||||
RandomGenerator.ReinitSeed();
|
RandomGenerator.ReinitSeed();
|
||||||
|
|
||||||
if (IsWeapon(ItemType) && !crafted)
|
if (IsWeapon(ItemType) && !crafted)
|
||||||
@ -367,13 +360,17 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
Attributes[GameAttribute.MinimapActive] = true;
|
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 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);
|
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];
|
a = Attributes[GameAttribute.Requirement, 57];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -382,7 +379,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
if (Attributes[GameAttribute.Requirement, 57] == 0)
|
if (Attributes[GameAttribute.Requirement, 57] == 0)
|
||||||
Attributes[GameAttribute.Item_Level_Requirement_Override] = 1;
|
Attributes[GameAttribute.Item_Level_Requirement_Override] = 1;
|
||||||
else
|
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"))
|
if (ItemDefinition.Name.ToLower().StartsWith("p71_ethereal"))
|
||||||
{
|
{
|
||||||
@ -441,6 +439,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
if (Attributes[GameAttribute.Damage_Weapon_Delta, 0] == 0)
|
if (Attributes[GameAttribute.Damage_Weapon_Delta, 0] == 0)
|
||||||
Attributes[GameAttribute.Damage_Weapon_Delta, 0] = 34;
|
Attributes[GameAttribute.Damage_Weapon_Delta, 0] = 34;
|
||||||
}
|
}
|
||||||
|
|
||||||
float scaleCapMin = 0f;
|
float scaleCapMin = 0f;
|
||||||
float scaleCapDelta = 0f;
|
float scaleCapDelta = 0f;
|
||||||
switch (definition.ItemTypesGBID)
|
switch (definition.ItemTypesGBID)
|
||||||
@ -536,8 +535,10 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
float ratio = (float)Math.Pow(definition.ItemLevel, 2f) / 4900f;
|
float ratio = (float)Math.Pow(definition.ItemLevel, 2f) / 4900f;
|
||||||
if (ratio < 0.01f) ratio = 0.01f;
|
if (ratio < 0.01f) ratio = 0.01f;
|
||||||
if (ratio > 1f) ratio = 1f;
|
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_Min, 0] +=
|
||||||
Attributes[GameAttribute.Damage_Weapon_Delta, 0] += Math.Abs(scaleCapDelta * ratio - Attributes[GameAttribute.Damage_Weapon_Delta, 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]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -566,22 +567,31 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
if (Attributes[GameAttribute.Armor_Item] == 0)
|
if (Attributes[GameAttribute.Armor_Item] == 0)
|
||||||
Attributes[GameAttribute.Armor_Item] = 30;
|
Attributes[GameAttribute.Armor_Item] = 30;
|
||||||
|
|
||||||
if (Attributes[GameAttribute.Armor_Item] < 100) Attributes[GameAttribute.Armor_Item] += definition.ItemLevel * 6;
|
if (Attributes[GameAttribute.Armor_Item] < 100)
|
||||||
else if (Attributes[GameAttribute.Armor_Item] < 200) Attributes[GameAttribute.Armor_Item] += definition.ItemLevel * 5;
|
Attributes[GameAttribute.Armor_Item] += definition.ItemLevel * 6;
|
||||||
else if (Attributes[GameAttribute.Armor_Item] < 300) Attributes[GameAttribute.Armor_Item] += definition.ItemLevel * 4;
|
else if (Attributes[GameAttribute.Armor_Item] < 200)
|
||||||
else if (Attributes[GameAttribute.Armor_Item] < 400) Attributes[GameAttribute.Armor_Item] += definition.ItemLevel * 3;
|
Attributes[GameAttribute.Armor_Item] += definition.ItemLevel * 5;
|
||||||
else if (Attributes[GameAttribute.Armor_Item] < 500) Attributes[GameAttribute.Armor_Item] += definition.ItemLevel * 2;
|
else if (Attributes[GameAttribute.Armor_Item] < 300)
|
||||||
else if (Attributes[GameAttribute.Armor_Item] < 600) Attributes[GameAttribute.Armor_Item] += definition.ItemLevel;
|
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 scaleCapMin = 14000f;
|
||||||
float scaleCapDelta = 21000f - scaleCapMin;
|
float scaleCapDelta = 21000f - scaleCapMin;
|
||||||
float ratio = (float)Math.Pow(definition.ItemLevel, 2f) / 4900f;
|
float ratio = (float)Math.Pow(definition.ItemLevel, 2f) / 4900f;
|
||||||
if (ratio < 0.01f) ratio = 0.01f;
|
if (ratio < 0.01f) ratio = 0.01f;
|
||||||
if (ratio > 1f) ratio = 1f;
|
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_Min] +=
|
||||||
Attributes[GameAttribute.Block_Amount_Item_Delta] += Math.Abs(scaleCapDelta * ratio - Attributes[GameAttribute.Block_Amount_Item_Delta, 0]);
|
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;
|
Attributes[GameAttribute.Skill, definition.SNOSkill0] = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (definition.SNOSkill1 != -1)
|
if (definition.SNOSkill1 != -1)
|
||||||
{
|
{
|
||||||
Attributes[GameAttribute.Skill, definition.SNOSkill1] = 1;
|
Attributes[GameAttribute.Skill, definition.SNOSkill1] = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (definition.SNOSkill2 != -1)
|
if (definition.SNOSkill2 != -1)
|
||||||
{
|
{
|
||||||
Attributes[GameAttribute.Skill, definition.SNOSkill2] = 1;
|
Attributes[GameAttribute.Skill, definition.SNOSkill2] = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (definition.SNOSkill3 != -1)
|
if (definition.SNOSkill3 != -1)
|
||||||
{
|
{
|
||||||
Attributes[GameAttribute.Skill, definition.SNOSkill3] = 1;
|
Attributes[GameAttribute.Skill, definition.SNOSkill3] = 1;
|
||||||
@ -683,10 +696,12 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
{
|
{
|
||||||
return new VisualItem()
|
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],
|
DyeType = Attributes[GameAttribute.DyeType],
|
||||||
ItemEffectType = 0,//Mooege.Common.Helpers.Math.FastRandom.Instance.Next(1, 14),
|
ItemEffectType = 0, //Mooege.Common.Helpers.Math.FastRandom.Instance.Next(1, 14),
|
||||||
EffectLevel = -1//Mooege.Common.Helpers.Math.FastRandom.Instance.Next(1, 30)
|
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()
|
public D3.Hero.VisualItem GetVisualItem()
|
||||||
{
|
{
|
||||||
var visualItem = D3.Hero.VisualItem.CreateBuilder()
|
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])
|
.SetDyeType(Attributes[GameAttribute.DyeType])
|
||||||
.SetEffectLevel(0)
|
.SetEffectLevel(0)
|
||||||
.SetItemEffectType(-1)
|
.SetItemEffectType(-1)
|
||||||
@ -711,10 +728,12 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
{
|
{
|
||||||
price += affix.Price;
|
price += affix.Price;
|
||||||
}
|
}
|
||||||
|
|
||||||
return price;
|
return price;
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Is*
|
#region Is*
|
||||||
|
|
||||||
public static bool IsHealthGlobe(ItemTypeTable itemType)
|
public static bool IsHealthGlobe(ItemTypeTable itemType)
|
||||||
{
|
{
|
||||||
return ItemGroup.IsSubType(itemType, "HealthGlyph");
|
return ItemGroup.IsSubType(itemType, "HealthGlyph");
|
||||||
@ -809,6 +828,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
{
|
{
|
||||||
return itemType.Name.Contains("Amulet");
|
return itemType.Name.Contains("Amulet");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool IsHandXbow(ItemTypeTable itemType)
|
public static bool IsHandXbow(ItemTypeTable itemType)
|
||||||
{
|
{
|
||||||
return itemType.Name.Contains("HandXbow");
|
return itemType.Name.Contains("HandXbow");
|
||||||
@ -838,6 +858,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
{
|
{
|
||||||
return ItemGroup.Is2H(itemType);
|
return ItemGroup.Is2H(itemType);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public void SetInventoryLocation(int equipmentSlot, int column, int row)
|
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();
|
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 GoldData = D3.Items.CurrencyData.CreateBuilder().SetId(0)
|
||||||
D3.Items.CurrencyData BloodShardData = D3.Items.CurrencyData.CreateBuilder().SetId(1).SetCount(playerAcc.BloodShards).Build();
|
.SetCount((long)player.Inventory.GetGoldAmount()).Build();
|
||||||
D3.Items.CurrencyData PlatinumData = D3.Items.CurrencyData.CreateBuilder().SetId(2).SetCount(playerAcc.Platinum).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 Craft1Data =
|
||||||
D3.Items.CurrencyData Craft2Data = D3.Items.CurrencyData.CreateBuilder().SetId(4).SetCount(playerAcc.CraftItem2).Build(); // Arcanes Dust.
|
D3.Items.CurrencyData.CreateBuilder().SetId(3).SetCount(playerAcc.CraftItem1)
|
||||||
D3.Items.CurrencyData Craft3Data = D3.Items.CurrencyData.CreateBuilder().SetId(5).SetCount(playerAcc.CraftItem3).Build(); // Veiled Crystal.
|
.Build(); // Reusable Parts.
|
||||||
D3.Items.CurrencyData Craft4Data = D3.Items.CurrencyData.CreateBuilder().SetId(6).SetCount(playerAcc.CraftItem4).Build(); // Death's Breath.
|
D3.Items.CurrencyData Craft2Data =
|
||||||
D3.Items.CurrencyData Craft5Data = D3.Items.CurrencyData.CreateBuilder().SetId(7).SetCount(playerAcc.CraftItem5).Build(); // Forgotten Soul.
|
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 Horadric1Data = D3.Items.CurrencyData.CreateBuilder().SetId(8)
|
||||||
D3.Items.CurrencyData Horadric2Data = D3.Items.CurrencyData.CreateBuilder().SetId(9).SetCount(playerAcc.HoradricA2Res).Build(); // Caldeum Nightshade Bounty itens Act II.
|
.SetCount(playerAcc.HoradricA1Res).Build(); // Khanduran Rune Bounty itens Act I.
|
||||||
D3.Items.CurrencyData Horadric3Data = D3.Items.CurrencyData.CreateBuilder().SetId(10).SetCount(playerAcc.HoradricA3Res).Build(); // Arreat War Tapestry Bounty itens Act III.
|
D3.Items.CurrencyData Horadric2Data = D3.Items.CurrencyData.CreateBuilder().SetId(9)
|
||||||
D3.Items.CurrencyData Horadric4Data = D3.Items.CurrencyData.CreateBuilder().SetId(11).SetCount(playerAcc.HoradricA4Res).Build(); // Copputed Angel Flesh Bounty itens Act IV.
|
.SetCount(playerAcc.HoradricA2Res).Build(); // Caldeum Nightshade Bounty itens Act II.
|
||||||
D3.Items.CurrencyData Horadric5Data = D3.Items.CurrencyData.CreateBuilder().SetId(12).SetCount(playerAcc.HoradricA5Res).Build(); // Westmarch Holy Water Bounty itens Act V.
|
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 Craft8Data = D3.Items.CurrencyData.CreateBuilder().SetId(13)
|
||||||
D3.Items.CurrencyData Craft9Data = D3.Items.CurrencyData.CreateBuilder().SetId(14).SetCount(playerAcc.VialofPutridness).Build(); // Idol of Terror.
|
.SetCount(playerAcc.HeartofFright).Build(); // Heart of Fright.
|
||||||
D3.Items.CurrencyData Craft10Data = D3.Items.CurrencyData.CreateBuilder().SetId(15).SetCount(playerAcc.IdolofTerror).Build(); // Vail of Putridiness.
|
D3.Items.CurrencyData Craft9Data = D3.Items.CurrencyData.CreateBuilder().SetId(14)
|
||||||
D3.Items.CurrencyData Craft11Data = D3.Items.CurrencyData.CreateBuilder().SetId(16).SetCount(playerAcc.LeorikKey).Build(); // Leorik Regret.
|
.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)
|
foreach (object consumable in consumables)
|
||||||
{
|
{
|
||||||
Moneys.AddCurrency(consumable);
|
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,6 +1001,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < 8; i++)
|
for (int i = 0; i < 8; i++)
|
||||||
{
|
{
|
||||||
if (ItemDefinition.TransmogsToGrant[i] != -1)
|
if (ItemDefinition.TransmogsToGrant[i] != -1)
|
||||||
@ -958,6 +1009,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GBHandle.GBID == 1549850924) //Arma Haereticorum additional transmog
|
if (GBHandle.GBID == 1549850924) //Arma Haereticorum additional transmog
|
||||||
{
|
{
|
||||||
player.UnlockTransmog(974107120);
|
player.UnlockTransmog(974107120);
|
||||||
@ -971,6 +1023,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
UpdateStackCount(--Attributes[GameAttribute.ItemStackQuantityLo]); // Just remove one
|
UpdateStackCount(--Attributes[GameAttribute.ItemStackQuantityLo]); // Just remove one
|
||||||
Attributes.SendChangedMessage(player.InGameClient);
|
Attributes.SendChangedMessage(player.InGameClient);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -981,42 +1034,80 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
int @base = 0;
|
int @base = 0;
|
||||||
switch (player.Toon.Class)
|
switch (player.Toon.Class)
|
||||||
{
|
{
|
||||||
case LoginServer.Toons.ToonClass.Crusader: @base = 2; break;
|
case LoginServer.Toons.ToonClass.Crusader:
|
||||||
case LoginServer.Toons.ToonClass.DemonHunter: @base = 4; break;
|
@base = 2;
|
||||||
case LoginServer.Toons.ToonClass.Monk: @base = 6; break;
|
break;
|
||||||
case LoginServer.Toons.ToonClass.Necromancer: @base = 8; break;
|
case LoginServer.Toons.ToonClass.DemonHunter:
|
||||||
case LoginServer.Toons.ToonClass.WitchDoctor: @base = 10; break;
|
@base = 4;
|
||||||
case LoginServer.Toons.ToonClass.Wizard: @base = 12; break;
|
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
|
} //0 - Barbarian, 2 - Crusader, 4 - Hunter, 6 - Monk, 8 - Necromancer, 10 - Sorcerer, 12 - Wizard
|
||||||
|
|
||||||
string it = "";
|
string it = "";
|
||||||
|
|
||||||
#region Balance calculation
|
#region Balance calculation
|
||||||
|
|
||||||
var moneys = D3.Items.CurrencySavedData.CreateBuilder();
|
var moneys = D3.Items.CurrencySavedData.CreateBuilder();
|
||||||
var playerAcc = player.InGameClient.BnetClient.Account.GameAccount;
|
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 goldData = D3.Items.CurrencyData.CreateBuilder().SetId(0)
|
||||||
D3.Items.CurrencyData bloodShardData = D3.Items.CurrencyData.CreateBuilder().SetId(1).SetCount(playerAcc.BloodShards).Build();
|
.SetCount((long)player.Inventory.GetGoldAmount()).Build();
|
||||||
D3.Items.CurrencyData platinumData = D3.Items.CurrencyData.CreateBuilder().SetId(2).SetCount(playerAcc.Platinum).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 craft1Data = D3.Items.CurrencyData.CreateBuilder().SetId(3)
|
||||||
D3.Items.CurrencyData craft2Data = D3.Items.CurrencyData.CreateBuilder().SetId(4).SetCount(playerAcc.CraftItem2).Build(); // Arcanes Dust.
|
.SetCount(playerAcc.CraftItem1).Build(); // Reusable Parts.
|
||||||
D3.Items.CurrencyData craft3Data = D3.Items.CurrencyData.CreateBuilder().SetId(5).SetCount(playerAcc.CraftItem3).Build(); // Veiled Crystal.
|
D3.Items.CurrencyData craft2Data = D3.Items.CurrencyData.CreateBuilder().SetId(4)
|
||||||
D3.Items.CurrencyData craft4Data = D3.Items.CurrencyData.CreateBuilder().SetId(6).SetCount(playerAcc.CraftItem4).Build(); // Death's Breath.
|
.SetCount(playerAcc.CraftItem2).Build(); // Arcanes Dust.
|
||||||
D3.Items.CurrencyData craft5Data = D3.Items.CurrencyData.CreateBuilder().SetId(7).SetCount(playerAcc.CraftItem5).Build(); // Forgotten Soul.
|
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 horadric1Data = D3.Items.CurrencyData.CreateBuilder().SetId(8)
|
||||||
D3.Items.CurrencyData horadric2Data = D3.Items.CurrencyData.CreateBuilder().SetId(9).SetCount(playerAcc.HoradricA2Res).Build(); // Caldeum Nightshade Bounty itens Act II.
|
.SetCount(playerAcc.HoradricA1Res).Build(); // Khanduran Rune Bounty itens Act I.
|
||||||
D3.Items.CurrencyData horadric3Data = D3.Items.CurrencyData.CreateBuilder().SetId(10).SetCount(playerAcc.HoradricA3Res).Build(); // Arreat War Tapestry Bounty itens Act III.
|
D3.Items.CurrencyData horadric2Data = D3.Items.CurrencyData.CreateBuilder().SetId(9)
|
||||||
D3.Items.CurrencyData horadric4Data = D3.Items.CurrencyData.CreateBuilder().SetId(11).SetCount(playerAcc.HoradricA4Res).Build(); // Copputed Angel Flesh Bounty itens Act IV.
|
.SetCount(playerAcc.HoradricA2Res).Build(); // Caldeum Nightshade Bounty itens Act II.
|
||||||
D3.Items.CurrencyData horadric5Data = D3.Items.CurrencyData.CreateBuilder().SetId(12).SetCount(playerAcc.HoradricA5Res).Build(); // Westmarch Holy Water Bounty itens Act V.
|
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 craft8Data = D3.Items.CurrencyData.CreateBuilder().SetId(13)
|
||||||
D3.Items.CurrencyData craft9Data = D3.Items.CurrencyData.CreateBuilder().SetId(14).SetCount(playerAcc.VialofPutridness).Build(); // Idol of Terror.
|
.SetCount(playerAcc.HeartofFright).Build(); // Heart of Fright.
|
||||||
D3.Items.CurrencyData craft10Data = D3.Items.CurrencyData.CreateBuilder().SetId(15).SetCount(playerAcc.IdolofTerror).Build(); // Vail of Putridiness.
|
D3.Items.CurrencyData craft9Data = D3.Items.CurrencyData.CreateBuilder().SetId(14)
|
||||||
D3.Items.CurrencyData craft11Data = D3.Items.CurrencyData.CreateBuilder().SetId(16).SetCount(playerAcc.LeorikKey).Build(); // Leorik Regret.
|
.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)
|
foreach (object consumable in consumables)
|
||||||
{
|
{
|
||||||
@ -1024,54 +1115,85 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
switch (GBHandle.GBID)
|
switch (GBHandle.GBID)
|
||||||
{
|
{
|
||||||
#region The Gift of Horadric
|
#region The Gift of Horadric
|
||||||
|
|
||||||
case -1249067449:
|
case -1249067449:
|
||||||
items = new string[] { "Unique_Helm_Set_15_x1", "Unique_Gloves_Set_15_x1",
|
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_12_x1", "Unique_Gloves_Set_12_x1",
|
||||||
"Unique_Helm_Set_14_x1", "Unique_Gloves_Set_14_x1",
|
"Unique_Helm_Set_14_x1", "Unique_Gloves_Set_14_x1",
|
||||||
"Unique_Helm_Set_11_x1", "Unique_Gloves_Set_11_x1",
|
"Unique_Helm_Set_11_x1", "Unique_Gloves_Set_11_x1",
|
||||||
"P6_Necro_Set_3_Helm", "P6_Necro_Set_3_Gloves",
|
"P6_Necro_Set_3_Helm", "P6_Necro_Set_3_Gloves",
|
||||||
"Unique_Helm_Set_09_x1", "Unique_Gloves_Set_09_x1",
|
"Unique_Helm_Set_09_x1", "Unique_Gloves_Set_09_x1",
|
||||||
"Unique_Helm_Set_06_x1", "Unique_Gloves_Set_06_x1"};
|
"Unique_Helm_Set_06_x1", "Unique_Gloves_Set_06_x1"
|
||||||
|
};
|
||||||
switch (player.Toon.Class)
|
switch (player.Toon.Class)
|
||||||
{
|
{
|
||||||
case LoginServer.Toons.ToonClass.Crusader: @base = 2; break;
|
case LoginServer.Toons.ToonClass.Crusader:
|
||||||
case LoginServer.Toons.ToonClass.DemonHunter: @base = 4; break;
|
@base = 2;
|
||||||
case LoginServer.Toons.ToonClass.Monk: @base = 6; break;
|
break;
|
||||||
case LoginServer.Toons.ToonClass.Necromancer: @base = 8; break;
|
case LoginServer.Toons.ToonClass.DemonHunter:
|
||||||
case LoginServer.Toons.ToonClass.WitchDoctor: @base = 10; break;
|
@base = 4;
|
||||||
case LoginServer.Toons.ToonClass.Wizard: @base = 12; break;
|
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;
|
break;
|
||||||
case -1249067448:
|
case -1249067448:
|
||||||
items = new string[] { "Unique_Shoulder_Set_15_x1", "Unique_Boots_Set_15_x1",
|
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_12_x1", "Unique_Boots_Set_12_x1",
|
||||||
"Unique_Shoulder_Set_14_x1", "Unique_Boots_Set_14_x1",
|
"Unique_Shoulder_Set_14_x1", "Unique_Boots_Set_14_x1",
|
||||||
"Unique_Shoulder_Set_11_x1", "Unique_Boots_Set_11_x1",
|
"Unique_Shoulder_Set_11_x1", "Unique_Boots_Set_11_x1",
|
||||||
"P6_Necro_Set_3_Shoulders", "P6_Necro_Set_3_Boots",
|
"P6_Necro_Set_3_Shoulders", "P6_Necro_Set_3_Boots",
|
||||||
"Unique_Shoulder_Set_09_x1", "Unique_Boots_Set_09_x1",
|
"Unique_Shoulder_Set_09_x1", "Unique_Boots_Set_09_x1",
|
||||||
"Unique_Shoulder_Set_06_x1", "Unique_Boots_Set_06_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));
|
};
|
||||||
|
it = items[RandomHelper.Next(@base, @base + 1)];
|
||||||
|
player.Inventory.PickUp(ItemGenerator.Cook(player, it));
|
||||||
break;
|
break;
|
||||||
case -1249067447:
|
case -1249067447:
|
||||||
items = new string[] { "Unique_Chest_Set_15_x1", "Unique_Pants_Set_15_x1",
|
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_12_x1", "Unique_Pants_Set_12_x1",
|
||||||
"Unique_Chest_Set_14_x1", "Unique_Pants_Set_14_x1",
|
"Unique_Chest_Set_14_x1", "Unique_Pants_Set_14_x1",
|
||||||
"Unique_Chest_Set_11_x1", "Unique_Pants_Set_11_x1",
|
"Unique_Chest_Set_11_x1", "Unique_Pants_Set_11_x1",
|
||||||
"P6_Necro_Set_3_Chest", "P6_Necro_Set_3_Pants",
|
"P6_Necro_Set_3_Chest", "P6_Necro_Set_3_Pants",
|
||||||
"Unique_Chest_Set_09_x1", "Unique_Pants_Set_09_x1",
|
"Unique_Chest_Set_09_x1", "Unique_Pants_Set_09_x1",
|
||||||
"Unique_Chest_Set_06_x1", "Unique_Pants_Set_06_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));
|
};
|
||||||
|
it = items[RandomHelper.Next(@base, @base + 1)];
|
||||||
|
player.Inventory.PickUp(ItemGenerator.Cook(player, it));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region The Treasure of the Khoradrim
|
#region The Treasure of the Khoradrim
|
||||||
|
|
||||||
case -1575654862: // The Treasure 1 Акта
|
case -1575654862: // The Treasure 1 Акта
|
||||||
playerAcc.HoradricA1Res += RandomHelper.Next(1, 5);
|
playerAcc.HoradricA1Res += RandomHelper.Next(1, 5);
|
||||||
playerAcc.CraftItem4 += RandomHelper.Next(2, 4);
|
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(3, 8));
|
player.World.SpawnRandomEquip(player, player, RandomHelper.Next(3, 8));
|
||||||
player.World.SpawnRandomEquip(player, player, RandomHelper.Next(5, 9));
|
player.World.SpawnRandomEquip(player, player, RandomHelper.Next(5, 9));
|
||||||
@ -1082,7 +1204,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
case -1575654861: // The Treasure 2 Акта
|
case -1575654861: // The Treasure 2 Акта
|
||||||
playerAcc.HoradricA2Res += RandomHelper.Next(1, 5);
|
playerAcc.HoradricA2Res += RandomHelper.Next(1, 5);
|
||||||
playerAcc.CraftItem4 += RandomHelper.Next(2, 4);
|
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(3, 8));
|
player.World.SpawnRandomEquip(player, player, RandomHelper.Next(3, 8));
|
||||||
player.World.SpawnRandomEquip(player, player, RandomHelper.Next(5, 9));
|
player.World.SpawnRandomEquip(player, player, RandomHelper.Next(5, 9));
|
||||||
@ -1093,7 +1216,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
case -1575654860: // The Treasure 3 Акта
|
case -1575654860: // The Treasure 3 Акта
|
||||||
playerAcc.HoradricA3Res += RandomHelper.Next(1, 5);
|
playerAcc.HoradricA3Res += RandomHelper.Next(1, 5);
|
||||||
playerAcc.CraftItem4 += RandomHelper.Next(2, 4);
|
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(3, 8));
|
player.World.SpawnRandomEquip(player, player, RandomHelper.Next(3, 8));
|
||||||
player.World.SpawnRandomEquip(player, player, RandomHelper.Next(5, 9));
|
player.World.SpawnRandomEquip(player, player, RandomHelper.Next(5, 9));
|
||||||
@ -1104,7 +1228,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
case -1575654859: // The Treasure 4 Акта
|
case -1575654859: // The Treasure 4 Акта
|
||||||
playerAcc.HoradricA4Res += RandomHelper.Next(1, 5);
|
playerAcc.HoradricA4Res += RandomHelper.Next(1, 5);
|
||||||
playerAcc.CraftItem4 += RandomHelper.Next(2, 4);
|
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(3, 8));
|
player.World.SpawnRandomEquip(player, player, RandomHelper.Next(3, 8));
|
||||||
player.World.SpawnRandomEquip(player, player, RandomHelper.Next(5, 9));
|
player.World.SpawnRandomEquip(player, player, RandomHelper.Next(5, 9));
|
||||||
@ -1115,7 +1240,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
case -1575654858: // The Treasure 5 Акта
|
case -1575654858: // The Treasure 5 Акта
|
||||||
playerAcc.HoradricA5Res += RandomHelper.Next(1, 5);
|
playerAcc.HoradricA5Res += RandomHelper.Next(1, 5);
|
||||||
playerAcc.CraftItem4 += RandomHelper.Next(2, 4);
|
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(3, 8));
|
player.World.SpawnRandomEquip(player, player, RandomHelper.Next(3, 8));
|
||||||
player.World.SpawnRandomEquip(player, player, RandomHelper.Next(5, 9));
|
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.SpawnGold(player, player, 5000);
|
||||||
player.World.SpawnBloodShards(player, player, RandomHelper.Next(10, 25));
|
player.World.SpawnBloodShards(player, player, RandomHelper.Next(10, 25));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
default:
|
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();
|
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)
|
foreach (object horadricBoxe in horadricBoxes)
|
||||||
{
|
{
|
||||||
moneys.AddCurrency(horadricBoxe);
|
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);
|
player.Inventory.DestroyInventoryItem(this);
|
||||||
return;
|
return;
|
||||||
@ -1184,7 +1316,9 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
|
|
||||||
player.GrantAchievement(74987243307154);
|
player.GrantAchievement(74987243307154);
|
||||||
|
|
||||||
var colors = new List<int>(player.Inventory.GetEquippedItems().Where(i => i.Attributes[GameAttribute.DyeType] > 0).Select(i => i.Attributes[GameAttribute.DyeType]));
|
var colors = new List<int>(player.Inventory.GetEquippedItems()
|
||||||
|
.Where(i => i.Attributes[GameAttribute.DyeType] > 0)
|
||||||
|
.Select(i => i.Attributes[GameAttribute.DyeType]));
|
||||||
if (colors.Count >= 6)
|
if (colors.Count >= 6)
|
||||||
{
|
{
|
||||||
if (new HashSet<int>(colors).Count == 1)
|
if (new HashSet<int>(colors).Count == 1)
|
||||||
@ -1259,6 +1393,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
UpdateStackCount(--Attributes[GameAttribute.ItemStackQuantityLo]); // Just remove one
|
UpdateStackCount(--Attributes[GameAttribute.ItemStackQuantityLo]); // Just remove one
|
||||||
Attributes.SendChangedMessage(player.InGameClient);
|
Attributes.SendChangedMessage(player.InGameClient);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1344,7 +1479,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
|
|
||||||
public override bool Unreveal(Player player)
|
public override bool Unreveal(Player player)
|
||||||
{
|
{
|
||||||
if (CurrentState == ItemState.PickingUp)// && player == Owner)
|
if (CurrentState == ItemState.PickingUp) // && player == Owner)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -46,28 +46,32 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
{
|
{
|
||||||
public static class ItemGenerator
|
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<int, ItemTable> Items = new ConcurrentDictionary<int, ItemTable>();
|
public static readonly ConcurrentDictionary<int, ItemTable> Items = new();
|
||||||
public static readonly ConcurrentDictionary<int, ItemTable> AllowedItems = new ConcurrentDictionary<int, ItemTable>();
|
|
||||||
public static readonly ConcurrentDictionary<int, ItemTable> AllowedUniqueItems = new ConcurrentDictionary<int, ItemTable>();
|
public static readonly ConcurrentDictionary<int, ItemTable> AllowedItems = new();
|
||||||
private static readonly ConcurrentDictionary<int, RecipeTable> Recipes = new ConcurrentDictionary<int, RecipeTable>();
|
|
||||||
private static readonly ConcurrentDictionary<int, ItemTable> Lore = new ConcurrentDictionary<int, ItemTable>();
|
public static readonly ConcurrentDictionary<int, ItemTable> AllowedUniqueItems = new();
|
||||||
private static readonly List<SocketedEffectTable> GemEffects = new List<SocketedEffectTable>();
|
|
||||||
private static readonly List<ParagonBonusesTable> ParagonBonuses = new List<ParagonBonusesTable>();
|
private static readonly ConcurrentDictionary<int, RecipeTable> Recipes = new();
|
||||||
private static readonly List<SetItemBonusTable> ItemSetsEffects = new List<SetItemBonusTable>();
|
|
||||||
private static readonly ConcurrentDictionary<int, Type> GBIDHandlers = new ConcurrentDictionary<int, Type>();
|
private static readonly ConcurrentDictionary<int, ItemTable> Lore = new();
|
||||||
private static readonly ConcurrentDictionary<int, Type> TypeHandlers = new ConcurrentDictionary<int, Type>();
|
private static readonly List<SocketedEffectTable> GemEffects = new();
|
||||||
private static readonly HashSet<int> AllowedItemTypes = new HashSet<int>();
|
private static readonly List<ParagonBonusesTable> ParagonBonuses = new();
|
||||||
private static readonly List<int> CraftOnlyItems = new List<int>();
|
private static readonly List<SetItemBonusTable> ItemSetsEffects = new();
|
||||||
|
private static readonly ConcurrentDictionary<int, Type> GBIDHandlers = new();
|
||||||
|
private static readonly ConcurrentDictionary<int, Type> TypeHandlers = new();
|
||||||
|
private static readonly HashSet<int> AllowedItemTypes = new();
|
||||||
|
private static readonly List<int> CraftOnlyItems = new();
|
||||||
|
|
||||||
public static int TotalItems
|
public static int TotalItems
|
||||||
{
|
{
|
||||||
get { return Items.Count; }
|
get { return Items.Count; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<int> Tutorials = new List<int>();
|
public static List<int> Tutorials = new();
|
||||||
public static Dictionary<int, Quest> Bounties = new Dictionary<int, Quest>();
|
public static Dictionary<int, Quest> Bounties = new();
|
||||||
|
|
||||||
static ItemGenerator()
|
static ItemGenerator()
|
||||||
{
|
{
|
||||||
@ -103,6 +107,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
}
|
}
|
||||||
|
|
||||||
#region loading generator
|
#region loading generator
|
||||||
|
|
||||||
private static void LoadBounties()
|
private static void LoadBounties()
|
||||||
{
|
{
|
||||||
foreach (var asset in MPQStorage.Data.Assets[SNOGroup.Quest].Values)
|
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_"))
|
if (asset.Name.Contains("_A5_"))
|
||||||
data.BountyData0.ActData = BountyData.ActT.A5;
|
data.BountyData0.ActData = BountyData.ActT.A5;
|
||||||
}
|
}
|
||||||
|
|
||||||
//fixes for bugged bounties
|
//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;
|
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;
|
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;
|
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;
|
continue;
|
||||||
|
|
||||||
Bounties.Add(data.Header.SNOId, data);
|
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)
|
if (typeAttributes.Length != 0)
|
||||||
{
|
{
|
||||||
foreach (var typeName in typeAttributes.First().Types)
|
foreach (var typeName in typeAttributes.First().Types)
|
||||||
@ -181,11 +196,13 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
ObsoleteItems.Add(itemDefinition.Hash);
|
ObsoleteItems.Add(itemDefinition.Hash);
|
||||||
//Logger.Debug("flagged as obsolete _104: {0}, {1}", itemDefinition.Name, itemDefinition.Hash);
|
//Logger.Debug("flagged as obsolete _104: {0}, {1}", itemDefinition.Name, itemDefinition.Hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (itemDefinition.Name.EndsWith("_1xx"))
|
if (itemDefinition.Name.EndsWith("_1xx"))
|
||||||
{
|
{
|
||||||
ObsoleteItems.Add(itemDefinition.Hash);
|
ObsoleteItems.Add(itemDefinition.Hash);
|
||||||
//Logger.Debug("flagged as obsolete _1xx: {0}, {1}", itemDefinition.Name, itemDefinition.Hash);
|
//Logger.Debug("flagged as obsolete _1xx: {0}, {1}", itemDefinition.Name, itemDefinition.Hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (itemDefinition.Name.ToLower().Contains("unique") && !itemDefinition.Name.EndsWith("_x1") &&
|
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"))
|
||||||
{
|
{
|
||||||
@ -195,7 +212,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
|
|
||||||
if (
|
if (
|
||||||
itemDefinition.SNOActor != 4812 //orb_norm_base_03
|
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().StartsWith("ph_") //Kadala items
|
||||||
&& !itemDefinition.Name.ToLower().Contains("talisman") //TalismanUnlock
|
&& !itemDefinition.Name.ToLower().Contains("talisman") //TalismanUnlock
|
||||||
&& !itemDefinition.Name.ToLower().Contains("console") //bugged console items
|
&& !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.ToLower().Contains("shadowclone") //shadowClone OP weapon
|
||||||
//&& !(itemDefinition.Name.Contains("_Set_") && itemDefinition.Name.EndsWith("_x1")) //RoS sets
|
//&& !(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
|
//&& !(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) &&
|
||||||
&& !(CraftOnlyItems.Contains(itemDefinition.Hash) && itemDefinition.Name.ToLower().Contains("unique")) //crafted
|
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.Name.ToLower().Contains("_10") && itemDefinition.Name.ToLower().Contains("_x1")) //"future" items
|
||||||
&& itemDefinition.ItemTypesGBID != StringHashHelper.HashItemName("Book")
|
&& itemDefinition.ItemTypesGBID != StringHashHelper.HashItemName("Book")
|
||||||
&& itemDefinition.ItemTypesGBID != StringHashHelper.HashItemName("TreasureBag")
|
&& itemDefinition.ItemTypesGBID != StringHashHelper.HashItemName("TreasureBag")
|
||||||
@ -317,8 +337,10 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
case "Unique_Quiver_104_x1":
|
case "Unique_Quiver_104_x1":
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void LoadQuests()
|
private static void LoadQuests()
|
||||||
{
|
{
|
||||||
//Logger.Info("LoadItems()");
|
//Logger.Info("LoadItems()");
|
||||||
@ -330,14 +352,18 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
Logger.Info("-------------");
|
Logger.Info("-------------");
|
||||||
Logger.Info("Quest: [{0}] {1}", data.Header.SNOId, asset.Name);
|
Logger.Info("Quest: [{0}] {1}", data.Header.SNOId, asset.Name);
|
||||||
Logger.Info("Type: {0}", data.QuestType);
|
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)
|
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);
|
Logger.Info("Step [{0}] {1} -> {2}", step.ID, step.Name, nextID);
|
||||||
foreach (var objSet in step.StepObjectiveSets)
|
foreach (var objSet in step.StepObjectiveSets)
|
||||||
foreach (var obj in objSet.StepObjectives)
|
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);
|
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)
|
foreach (var recipeDefinition in data.Recipes)
|
||||||
{
|
{
|
||||||
Recipes.TryAdd(recipeDefinition.Hash, recipeDefinition);
|
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))
|
if (!CraftOnlyItems.Contains(reward))
|
||||||
CraftOnlyItems.Add(reward);
|
CraftOnlyItems.Add(reward);
|
||||||
}
|
}
|
||||||
@ -563,7 +592,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
foreach (var asset in MPQStorage.Data.Assets[SNOGroup.Power].Values)
|
foreach (var asset in MPQStorage.Data.Assets[SNOGroup.Power].Values)
|
||||||
{
|
{
|
||||||
Power data = asset.Data as Power;
|
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("---------------------------------------------------------");
|
||||||
Logger.Info("asset name: {0}", asset.Name);
|
Logger.Info("asset name: {0}", asset.Name);
|
||||||
Logger.Info("SNOID: {0}", data.Header.SNOId);
|
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)
|
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}",
|
/*Logger.Info("Conversation: [{8}]{0} I4: {1}, Type {9}, NPC {10} Act {2}, SNOConvUnlocks {3}, {4}, {5}, I5: {6}, I6: {7}",
|
||||||
asset.Name,
|
asset.Name,
|
||||||
data.I4,
|
data.I4,
|
||||||
@ -966,6 +997,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
// already added structure
|
// already added structure
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (int subhash in ItemGroup.SubTypesToHashList(ItemGroup.FromHash(hash).Name))
|
foreach (int subhash in ItemGroup.SubTypesToHashList(ItemGroup.FromHash(hash).Name))
|
||||||
{
|
{
|
||||||
if (AllowedItemTypes.Contains(subhash))
|
if (AllowedItemTypes.Contains(subhash))
|
||||||
@ -973,6 +1005,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
// already added structure
|
// already added structure
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
AllowedItemTypes.Add(subhash);
|
AllowedItemTypes.Add(subhash);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -980,7 +1013,9 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region generating items
|
#region generating items
|
||||||
|
|
||||||
// generates a random item.
|
// generates a random item.
|
||||||
public static Item GenerateRandom(ActorSystem.Actor owner)
|
public static Item GenerateRandom(ActorSystem.Actor owner)
|
||||||
{
|
{
|
||||||
@ -996,10 +1031,12 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
return CreateItem(owner, itemDefinition);
|
return CreateItem(owner, itemDefinition);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<int> ObsoleteItems = new List<int>();
|
public static List<int> ObsoleteItems = new();
|
||||||
|
|
||||||
// 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, 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];
|
if (level < 0) level = owner.Attributes[GameAttribute.Level];
|
||||||
int quality = minQuality;
|
int quality = minQuality;
|
||||||
@ -1016,16 +1053,35 @@ 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 ? true : ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID)).Contains(type.Hash))
|
&& (type == null
|
||||||
&& (quality > 2 ? true : !ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID)).Contains(-740765630)) //not jewelry
|
? true
|
||||||
&& (owner_class == ToonClass.Unknown ? true :
|
: ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID))
|
||||||
(owner_class == ToonClass.Barbarian ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Barbarian) :
|
.Contains(type.Hash))
|
||||||
(owner_class == ToonClass.Crusader ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Crusader) :
|
&& (quality > 2
|
||||||
(owner_class == ToonClass.Monk ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Monk) :
|
? true
|
||||||
(owner_class == ToonClass.Necromancer ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Necromancer) :
|
: !ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID))
|
||||||
(owner_class == ToonClass.Wizard ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Wizard) :
|
.Contains(-740765630)) //not jewelry
|
||||||
(owner_class == ToonClass.DemonHunter ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.DemonHunter) :
|
&& (owner_class == ToonClass.Unknown
|
||||||
(owner_class == ToonClass.WitchDoctor ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.WitchDoctor) : true)))))))
|
? 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()
|
).ToList()
|
||||||
, (quality > 8));
|
, (quality > 8));
|
||||||
@ -1045,20 +1101,39 @@ 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 ? true : ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID)).Contains(type.Hash))
|
&& (type == null
|
||||||
&& (quality > 2 ? true : !ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID)).Contains(-740765630)) //not jewelry
|
? true
|
||||||
&& (owner_class == ToonClass.Unknown ? true :
|
: ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID)).Contains(type.Hash))
|
||||||
(owner_class == ToonClass.Barbarian ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Barbarian) :
|
&& (quality > 2
|
||||||
owner_class == ToonClass.Crusader ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Crusader) :
|
? true
|
||||||
(owner_class == ToonClass.Monk ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Monk) :
|
: !ItemGroup.HierarchyToHashList(ItemGroup.FromHash(def.ItemTypesGBID))
|
||||||
(owner_class == ToonClass.Wizard ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Wizard) :
|
.Contains(-740765630)) //not jewelry
|
||||||
(owner_class == ToonClass.DemonHunter ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.DemonHunter) :
|
&& (owner_class == ToonClass.Unknown
|
||||||
(owner_class == ToonClass.Necromancer ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.Necromancer) :
|
? true
|
||||||
(owner_class == ToonClass.WitchDoctor ? ItemGroup.FromHash(def.ItemTypesGBID).Usable.HasFlag(ItemFlags.WitchDoctor) :
|
: (owner_class == ToonClass.Barbarian
|
||||||
true
|
?
|
||||||
|
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()
|
).ToList()
|
||||||
, false//(quality > 8)
|
, false //(quality > 8)
|
||||||
);
|
);
|
||||||
|
|
||||||
return CreateItem(owner, itemDefinition, quality, crafted);
|
return CreateItem(owner, itemDefinition, quality, crafted);
|
||||||
@ -1100,7 +1175,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
return CreateItem(player, itemDefinition);
|
return CreateItem(player, itemDefinition);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<string> GemNames = new List<string>()
|
public static List<string> GemNames = new()
|
||||||
{
|
{
|
||||||
"x1_Topaz",
|
"x1_Topaz",
|
||||||
"x1_Ruby",
|
"x1_Ruby",
|
||||||
@ -1114,7 +1189,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
string baseN = "Unique_";
|
string baseN = "Unique_";
|
||||||
string gemName = "Gem";
|
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";
|
gemName += string.Format("_0{0:00}", gem_grade) + "_x1";
|
||||||
return Cook((player as Player), baseN + gemName);
|
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)
|
public static Item GenerateRandom(ActorSystem.Actor player, ItemTypeTable type)
|
||||||
{
|
{
|
||||||
var itemDefinition = GetRandom(Items.Values
|
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);
|
return CreateItem(player, itemDefinition);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1169,7 +1245,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
!it.Name.ToLower().Contains("debug") &&
|
!it.Name.ToLower().Contains("debug") &&
|
||||||
!it.Name.ToLower().Contains("promo") &&
|
!it.Name.ToLower().Contains("promo") &&
|
||||||
!it.Name.ToLower().Contains("powerpotion") &&
|
!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))
|
!(!GBIDHandlers.ContainsKey(it.Hash) && !AllowedItemTypes.Contains(it.ItemTypesGBID))
|
||||||
).ToList();
|
).ToList();
|
||||||
/*
|
/*
|
||||||
@ -1204,6 +1281,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
ItemTable selected = pool_filtered[FastRandom.Instance.Next(0, pool_filtered.Count() - 1)];
|
ItemTable selected = pool_filtered[FastRandom.Instance.Next(0, pool_filtered.Count() - 1)];
|
||||||
return selected;
|
return selected;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ItemTable GetLegOrSetRandom(List<ItemTable> pool, bool isUnique = false)
|
private static ItemTable GetLegOrSetRandom(List<ItemTable> pool, bool isUnique = false)
|
||||||
{
|
{
|
||||||
//var found = false;
|
//var found = false;
|
||||||
@ -1233,7 +1311,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
!it.Name.ToLower().Contains("debug") &&
|
!it.Name.ToLower().Contains("debug") &&
|
||||||
!it.Name.ToLower().Contains("promo") &&
|
!it.Name.ToLower().Contains("promo") &&
|
||||||
!it.Name.ToLower().Contains("powerpotion") &&
|
!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))
|
!(!GBIDHandlers.ContainsKey(it.Hash) && !AllowedItemTypes.Contains(it.ItemTypesGBID))
|
||||||
).ToList();
|
).ToList();
|
||||||
if (pool_filtered.Count() == 0) return null;
|
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)];
|
ItemTable selected = pool_filtered[FastRandom.Instance.Next(0, pool_filtered.Count() - 1)];
|
||||||
return selected;
|
return selected;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region misc
|
#region misc
|
||||||
|
|
||||||
public static Type GetItemClass(ItemTable definition)
|
public static Type GetItemClass(ItemTable definition)
|
||||||
{
|
{
|
||||||
Type type = typeof(Item);
|
Type type = typeof(Item);
|
||||||
@ -1274,12 +1356,15 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
|
|
||||||
public static Item CloneItem(Item originalItem)
|
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.AffixList = originalItem.AffixList;
|
||||||
//clonedItem.Attributes = originalItem.Attributes;
|
//clonedItem.Attributes = originalItem.Attributes;
|
||||||
|
|
||||||
AffixGenerator.CloneIntoItem(originalItem, clonedItem);
|
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.RareItemName = originalItem.RareItemName;
|
||||||
clonedItem.Unidentified = originalItem.Unidentified;
|
clonedItem.Unidentified = originalItem.Unidentified;
|
||||||
return clonedItem;
|
return clonedItem;
|
||||||
@ -1298,7 +1383,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Creates an item based on supplied definition.
|
// 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));
|
// 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);
|
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)
|
if (forceQuality == 9)
|
||||||
item.Attributes[GameAttribute.Item_Quality_Level] = 9;
|
item.Attributes[GameAttribute.Item_Quality_Level] = 9;
|
||||||
return item;
|
return item;
|
||||||
@ -1330,17 +1417,21 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
for (int i = 0; i < 6; i++)
|
for (int i = 0; i < 6; i++)
|
||||||
definition.MaxAffixLevel[i] = player.Attributes[GameAttribute.Level];
|
definition.MaxAffixLevel[i] = player.Attributes[GameAttribute.Level];
|
||||||
}
|
}
|
||||||
|
|
||||||
return CookFromDefinition(player.World, definition);
|
return CookFromDefinition(player.World, definition);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Allows cooking a custom item.
|
// 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);
|
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)
|
if (binded)
|
||||||
item.Attributes[GameAttribute.Item_Binding_Level_Override] = 1;
|
item.Attributes[GameAttribute.Item_Binding_Level_Override] = 1;
|
||||||
@ -1449,7 +1540,9 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Database handling
|
#region Database handling
|
||||||
|
|
||||||
public static void SaveToDB(Item item)
|
public static void SaveToDB(Item item)
|
||||||
{
|
{
|
||||||
//var timestart = DateTime.Now;
|
//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 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)
|
if (itm.Attributes[GameAttribute.Durability_Max] > 0)
|
||||||
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;
|
||||||
@ -1497,9 +1593,12 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
|
|
||||||
owner.World.CachedItems[instance.Id] = itm;
|
owner.World.CachedItems[instance.Id] = itm;
|
||||||
|
|
||||||
if (instance.FirstGem != -1) itm.Gems.Add(CookFromDefinition(owner.World, GetItemDefinition(instance.FirstGem), 1));
|
if (instance.FirstGem != -1)
|
||||||
if (instance.SecondGem != -1) itm.Gems.Add(CookFromDefinition(owner.World, GetItemDefinition(instance.SecondGem), 1));
|
itm.Gems.Add(CookFromDefinition(owner.World, GetItemDefinition(instance.FirstGem), 1));
|
||||||
if (instance.ThirdGem != -1) itm.Gems.Add(CookFromDefinition(owner.World, GetItemDefinition(instance.ThirdGem), 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++)
|
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;
|
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;
|
return itm;
|
||||||
}
|
}
|
||||||
@ -1517,7 +1617,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
public static string SerializeAffixList(List<Affix> affixList)
|
public static string SerializeAffixList(List<Affix> affixList)
|
||||||
{
|
{
|
||||||
var affixgbIdList = affixList.Select(af => af.AffixGbid);
|
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;
|
return affixSer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1534,6 +1635,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
var pairs = attributesList.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
|
var pairs = attributesList.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
|
||||||
foreach (var pair in pairs)
|
foreach (var pair in pairs)
|
||||||
{
|
{
|
||||||
@ -1576,6 +1678,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var pairs = attributesList.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
|
var pairs = attributesList.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
|
||||||
foreach (var pair in pairs)
|
foreach (var pair in pairs)
|
||||||
{
|
{
|
||||||
@ -1614,4 +1717,3 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem
|
|||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Loading…
Reference in New Issue
user.block.title