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); }
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]); }
/// <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; } } } }
/// <inheritdoc/> public void InvalidateCache(IAppearanceData appearance) { Cache.TryRemove(appearance, out _); appearance.AppearanceChanged -= this.OnAppearanceOfAppearanceChanged; }
/// <inheritdoc/> public byte[] GetAppearanceData(IAppearanceData appearance) { return(this.GetPreviewCharSet(appearance.CharacterClass, appearance.EquippedItems)); }