Ejemplo n.º 1
0
        private void WritePreviewCharSet(Span <byte> target, IAppearanceData appearanceData)
        {
            ItemAppearance[] itemArray = new ItemAppearance[InventoryConstants.BootsSlot + 1];
            for (byte i = 0; i < itemArray.Length; i++)
            {
                itemArray[i] = appearanceData.EquippedItems.FirstOrDefault(item => item.ItemSlot == i && item.Definition.Number < 16);
            }

            target[0]  = (byte)(appearanceData.CharacterClass.Number << 3);
            target[0] |= (byte)appearanceData.Pose;
            this.SetHand(target, itemArray[InventoryConstants.LeftHandSlot], 1);

            this.SetHand(target, itemArray[InventoryConstants.RightHandSlot], 2);

            this.SetArmorPiece(target, itemArray[InventoryConstants.HelmSlot], 3, true);

            this.SetArmorPiece(target, itemArray[InventoryConstants.ArmorSlot], 3, false);

            this.SetArmorPiece(target, itemArray[InventoryConstants.PantsSlot], 4, true);

            this.SetArmorPiece(target, itemArray[InventoryConstants.GlovesSlot], 4, false);

            this.SetArmorPiece(target, itemArray[InventoryConstants.BootsSlot], 5, true);
            var wing = appearanceData.EquippedItems.FirstOrDefault(item => item.ItemSlot == InventoryConstants.WingsSlot && item.Definition.Number < 3);
            var pet  = appearanceData.EquippedItems.FirstOrDefault(item => item.ItemSlot == InventoryConstants.PetSlot && item.Definition.Number < 3);

            target[5] |= (byte)((wing?.Definition.Number & 0x03) << 2 ?? 0b1100);
            target[5] |= (byte)(pet?.Definition.Number & 0x03 ?? 0b0011);

            this.SetItemLevels(target, itemArray);
        }
Ejemplo n.º 2
0
        private void WritePreviewCharSet(Span <byte> target, IAppearanceData appearanceData)
        {
            ItemAppearance[] itemArray = new ItemAppearance[InventoryConstants.EquippableSlotsCount];
            for (byte i = 0; i < itemArray.Length; i++)
            {
                itemArray[i] = appearanceData.EquippedItems.FirstOrDefault(item => item.ItemSlot == i);
            }

            target[0]  = (byte)(appearanceData.CharacterClass.Number << 3 & 0xF8);
            target[0] |= (byte)appearanceData.Pose;
            this.SetHand(target, itemArray[InventoryConstants.LeftHandSlot], 1, 12);

            this.SetHand(target, itemArray[InventoryConstants.RightHandSlot], 2, 13);

            this.SetArmorPiece(target, itemArray[InventoryConstants.HelmSlot], 3, true, 0x80, 13, false);

            this.SetArmorPiece(target, itemArray[InventoryConstants.ArmorSlot], 3, false, 0x40, 14, true);

            this.SetArmorPiece(target, itemArray[InventoryConstants.PantsSlot], 4, true, 0x20, 14, false);

            this.SetArmorPiece(target, itemArray[InventoryConstants.GlovesSlot], 4, false, 0x10, 15, true);

            this.SetArmorPiece(target, itemArray[InventoryConstants.BootsSlot], 5, true, 0x08, 15, false);

            this.SetItemLevels(target, itemArray);

            if (appearanceData.FullAncientSetEquipped)
            {
                target[11] |= 0x01;
            }

            this.AddWing(target, itemArray[InventoryConstants.WingsSlot]);

            this.AddPet(target, itemArray[InventoryConstants.PetSlot]);
        }
Ejemplo n.º 3
0
        /// <inheritdoc/>
        public void WriteAppearanceData(Span <byte> target, IAppearanceData appearance, bool useCache)
        {
            if (target.Length < this.NeededSpace)
            {
                throw new ArgumentException($"Target span too small. Actual size: {target.Length}; Required: {this.NeededSpace}.", nameof(target));
            }

            if (useCache && Cache.TryGetValue(appearance, out var cached))
            {
                cached.CopyTo(target);
            }
            else
            {
                this.WritePreviewCharSet(target, appearance);
                if (useCache)
                {
                    var cacheEntry = target.Slice(0, this.NeededSpace).ToArray();
                    if (Cache.TryAdd(appearance, cacheEntry))
                    {
                        appearance.AppearanceChanged += this.OnAppearanceOfAppearanceChanged;
                    }
                }
            }
        }
Ejemplo n.º 4
0
 /// <inheritdoc/>
 public void InvalidateCache(IAppearanceData appearance)
 {
     Cache.TryRemove(appearance, out _);
     appearance.AppearanceChanged -= this.OnAppearanceOfAppearanceChanged;
 }
Ejemplo n.º 5
0
 /// <inheritdoc/>
 public byte[] GetAppearanceData(IAppearanceData appearance)
 {
     return(this.GetPreviewCharSet(appearance.CharacterClass, appearance.EquippedItems));
 }