diff --git a/OpenDiablo2.Common/Models/Item/Armor.cs b/OpenDiablo2.Common/Models/Item/Armor.cs index a958989d..6a8bc0d1 100644 --- a/OpenDiablo2.Common/Models/Item/Armor.cs +++ b/OpenDiablo2.Common/Models/Item/Armor.cs @@ -9,25 +9,56 @@ using System.Threading.Tasks; namespace OpenDiablo2.Common.Models { - public sealed class Armor : Item + public sealed class Armor : Item { - public string Type { get; internal set; } = "FIXME"; // TODO: Fix this please + public string Type { get; internal set; } + + public Dictionary ArmorTypes = new Dictionary() { + {eCompositType.RightArm, eArmorType.Lite}, + {eCompositType.LeftArm, eArmorType.Lite}, + {eCompositType.Torso, eArmorType.Lite}, + {eCompositType.Legs, eArmorType.Lite}, + {eCompositType.Special1, eArmorType.Lite}, + {eCompositType.Special2, eArmorType.Lite}, + }; } public static class ArmorHelper { - public static Armor ToArmor(this string[] row) - => new Armor + public static Armor ToArmor(this string[] row) + { + + var Armor = new Armor { Name = row[0], Code = row[17], - InvFile = row[34] + InvFile = row[34], + Type = row[48] }; + if(Armor.Type == "tors") + { + Armor.ArmorTypes[eCompositType.RightArm] = (eArmorType)Enum.Parse(typeof(eArmorType), row[37]); + Armor.ArmorTypes[eCompositType.LeftArm] = (eArmorType)Enum.Parse(typeof(eArmorType), row[38]); + Armor.ArmorTypes[eCompositType.Torso] = (eArmorType)Enum.Parse(typeof(eArmorType), row[39]); + Armor.ArmorTypes[eCompositType.Legs] = (eArmorType)Enum.Parse(typeof(eArmorType), row[40]); + Armor.ArmorTypes[eCompositType.Special1] = (eArmorType)Enum.Parse(typeof(eArmorType), row[41]); + Armor.ArmorTypes[eCompositType.Special2] = (eArmorType)Enum.Parse(typeof(eArmorType), row[42]); + } + + return Armor; + } + public static void Write(this BinaryWriter binaryWriter, Armor armor) { (armor as Item).Write(binaryWriter); binaryWriter.Write(armor.Type); + + // Assuming order will be fine + foreach(var armorType in armor.ArmorTypes) + { + binaryWriter.Write((byte)armorType.Value); + } } public static Armor ReadItemArmor(this BinaryReader binaryReader) @@ -35,6 +66,14 @@ namespace OpenDiablo2.Common.Models var result = new Armor(); Item.Read(binaryReader, result); result.Type = binaryReader.ReadString(); + + result.ArmorTypes[eCompositType.RightArm] = (eArmorType)binaryReader.ReadByte(); + result.ArmorTypes[eCompositType.LeftArm] = (eArmorType)binaryReader.ReadByte(); + result.ArmorTypes[eCompositType.Torso] = (eArmorType)binaryReader.ReadByte(); + result.ArmorTypes[eCompositType.Legs] = (eArmorType)binaryReader.ReadByte(); + result.ArmorTypes[eCompositType.Special1] = (eArmorType)binaryReader.ReadByte(); + result.ArmorTypes[eCompositType.Special2] = (eArmorType)binaryReader.ReadByte(); + return result; } } diff --git a/OpenDiablo2.Common/Models/Mobs/PlayerEquipment.cs b/OpenDiablo2.Common/Models/Mobs/PlayerEquipment.cs index 40dea69b..b9f0d67b 100644 --- a/OpenDiablo2.Common/Models/Mobs/PlayerEquipment.cs +++ b/OpenDiablo2.Common/Models/Mobs/PlayerEquipment.cs @@ -35,15 +35,6 @@ namespace OpenDiablo2.Common.Models.Mobs } } - public eArmorType ArmorType - { - get - { - // TODO: Make things happen here - return eArmorType.Lite; - } - } - public string HashKey => $"{Head?.Item.Name}{Neck?.Item.Name}{Torso?.Item.Name}{RightArm?.Item.Name}{LeftArm?.Item.Name}" + $"{RightRing?.Item.Name}{LeftRing?.Item.Name}{Feet?.Item.Name}{Belt?.Item.Name}{Gloves?.Item.Name}"; diff --git a/OpenDiablo2.Core/MPQProvider.cs b/OpenDiablo2.Core/MPQProvider.cs index 103ce416..d1450050 100644 --- a/OpenDiablo2.Core/MPQProvider.cs +++ b/OpenDiablo2.Core/MPQProvider.cs @@ -124,6 +124,11 @@ namespace OpenDiablo2.Core public string GetCharacterDccPath(eHero hero, eMobMode mobMode, eCompositType compositType, PlayerEquipment equipment) { var fileName = $@"{ResourcePaths.PlayerAnimationBase}\{hero.ToToken()}\{compositType.ToToken()}\{hero.ToToken()}{compositType.ToToken()}".ToLower(); + var armorType = eArmorType.Lite; + + // Override default armor type based on equipped torso + if(equipment.Torso != null && (equipment.Torso.Item as Armor).ArmorTypes.ContainsKey(compositType)) + armorType = (equipment.Torso.Item as Armor).ArmorTypes[compositType]; switch (compositType) { @@ -136,7 +141,7 @@ namespace OpenDiablo2.Core case eCompositType.Legs: case eCompositType.RightArm: case eCompositType.LeftArm: - fileName += $"{equipment.ArmorType.ToToken()}{mobMode.ToToken()}"; + fileName += $"{armorType.ToToken()}{mobMode.ToToken()}"; return _mpqLookup.ContainsKey($"{fileName}{equipment.WeaponClass.ToToken()}.dcc".ToLower()) ? $"{fileName}{equipment.WeaponClass.ToToken()}.dcc".ToLower() : $"{fileName}{eWeaponClass.HandToHand.ToToken()}.dcc".ToLower(); @@ -160,7 +165,7 @@ namespace OpenDiablo2.Core // TODO: Figure these out... case eCompositType.Special1: case eCompositType.Special2: - fileName += $"{equipment.ArmorType.ToToken()}{mobMode.ToToken()}{equipment.WeaponClass}.dcc".ToLower(); + fileName += $"{armorType.ToToken()}{mobMode.ToToken()}{equipment.WeaponClass}.dcc".ToLower(); return _mpqLookup.ContainsKey(fileName) ? fileName : null; // TODO: Should we silence this? diff --git a/OpenDiablo2.GameServer/GameServer.cs b/OpenDiablo2.GameServer/GameServer.cs index 7f333cba..03513a2e 100644 --- a/OpenDiablo2.GameServer/GameServer.cs +++ b/OpenDiablo2.GameServer/GameServer.cs @@ -76,6 +76,8 @@ namespace OpenDiablo2.GameServer_ } } + // TODO: Default torso for testing. Remove when... we're done testing. + newPlayer.UpdateEquipment("tors", itemManager.getItemInstance("aar")); mobManager.AddPlayer(newPlayer); return newPlayer.Id;