diff --git a/apps/backend/Jobs/Data/DataAuctionsJob.cs b/apps/backend/Jobs/Data/DataAuctionsJob.cs index 80d320244..ad244e68c 100644 --- a/apps/backend/Jobs/Data/DataAuctionsJob.cs +++ b/apps/backend/Jobs/Data/DataAuctionsJob.cs @@ -24,6 +24,7 @@ public class DataAuctionsJob : JobBase private int _connectedRealmId; private Dictionary _itemAppearanceBonuses; + private Dictionary _itemScalingBonuses; private ItemModifiedAppearanceCache _itemModifiedAppearances; private WowRegion _region; @@ -146,6 +147,17 @@ public override async Task Run(string[] data) var itemBonuses = await MemoryCacheService.GetItemBonuses(); _itemAppearanceBonuses = itemBonuses.ByType[WowItemBonusType.SetItemAppearanceModifier]; + + _itemScalingBonuses = []; + foreach (var bonus in itemBonuses.ByType.GetValueOrDefault(WowItemBonusType.ScaleConfig)) + { + _itemScalingBonuses[bonus.Key] = bonus.Value; + } + foreach (var bonus in itemBonuses.ByType.GetValueOrDefault(WowItemBonusType.ScaleCrafted)) + { + _itemScalingBonuses[bonus.Key] = bonus.Value; + } + _itemModifiedAppearances = await MemoryCacheService.GetItemModifiedAppearances(); await using var connection = Context.GetConnection(); @@ -316,6 +328,7 @@ Dictionary> commodities { int? appearanceId = null; string appearanceSource = null; + short itemLevel = 0; if (connectedRealmId < 100000) { @@ -323,20 +336,32 @@ Dictionary> commodities int priority = 999; foreach (int bonusId in auction.Item.BonusLists.EmptyIfNull()) { - if (!_itemAppearanceBonuses.TryGetValue(bonusId, out var itemBonus)) + if (_itemAppearanceBonuses.TryGetValue(bonusId, out var itemBonus)) { - continue; + foreach (var bonus in itemBonus.Bonuses) + { + if (bonus[0] == (int)WowItemBonusType.SetItemAppearanceModifier) + { + int bonusPriority = bonus.Count >= 3 ? bonus[2] : 0; + if (bonusPriority < priority) + { + modifier = (short)bonus[1]; + priority = bonusPriority; + } + } + } } - foreach (var bonus in itemBonus.Bonuses) + if (_itemScalingBonuses.TryGetValue(bonusId, out itemBonus)) { - if (bonus[0] == (int)WowItemBonusType.SetItemAppearanceModifier) + foreach (var bonus in itemBonus.Bonuses) { - int bonusPriority = bonus.Count >= 3 ? bonus[2] : 0; - if (bonusPriority < priority) + if (bonus[0] == (int)WowItemBonusType.ScaleConfig && bonus[1] == 266) + { + itemLevel = 206; + } else if (bonus[0] == (int)WowItemBonusType.ScaleCrafted) { - modifier = (short)bonus[1]; - priority = bonusPriority; + itemLevel += (short)bonus[1]; } } } @@ -392,11 +417,11 @@ record = _itemModifiedAppearances.ByItemIdAndModifier[(auction.Item.Id, modifier } else if (!string.IsNullOrWhiteSpace(appearanceSource)) { - groupKey = $"source:{appearanceSource}"; + groupKey = $"source:{appearanceSource}:{itemLevel}"; } else { - groupKey = $"item:{auction.Item.Id}"; + groupKey = $"item:{auction.Item.Id}:{itemLevel}"; } await writer.StartRowAsync(); diff --git a/apps/frontend/auctions/components/results/ResultsRow.svelte b/apps/frontend/auctions/components/results/ResultsRow.svelte index 395c3ee5a..7ddf23575 100644 --- a/apps/frontend/auctions/components/results/ResultsRow.svelte +++ b/apps/frontend/auctions/components/results/ResultsRow.svelte @@ -40,7 +40,8 @@ const ret = new AuctionInfo(); if (groupKey.startsWith('item:')) { - const itemId = parseInt(groupKey.split(':')[1]); + const parts = groupKey.split(':'); + const itemId = parseInt(parts[1]); const item = wowthingData.items.items[itemId]; if (item.allianceOnly) { @@ -50,7 +51,7 @@ } ret.icon = `item/${itemId}`; - ret.itemLevel = item?.itemLevel || 1; + ret.itemLevel = parseInt(parts[2]) || item?.itemLevel || 1; ret.name = `{${groupKey}}`; } else if (groupKey.startsWith('pet:')) { const pet = wowthingData.static.petById.get(parseInt(groupKey.split(':')[1])); @@ -58,7 +59,8 @@ ret.itemLevel = 1; ret.name = pet.name; } else if (groupKey.startsWith('source:')) { - const sourceParts = groupKey.split(':')[1].split('_'); + const parts = groupKey.split(':'); + const sourceParts = parts[1].split('_'); const itemId = parseInt(sourceParts[0]); const item = wowthingData.items.items[itemId]; @@ -69,7 +71,7 @@ } ret.icon = `item/${sourceParts.slice(0, sourceParts[1] === '0' ? 1 : 2).join('_')}`; - ret.itemLevel = item?.itemLevel || 1; + ret.itemLevel = parseInt(parts[2]) || item?.itemLevel || 1; ret.name = `{item:${itemId}}`; if (sourceParts[1] !== '0') { const modifier = itemModifierMap[parseInt(sourceParts[1])]; diff --git a/apps/frontend/auctions/components/results/Selected.svelte b/apps/frontend/auctions/components/results/Selected.svelte index ae15ea720..92bf1d467 100644 --- a/apps/frontend/auctions/components/results/Selected.svelte +++ b/apps/frontend/auctions/components/results/Selected.svelte @@ -9,7 +9,18 @@ import IconifyWrapper from '@/shared/components/images/IconifyWrapper.svelte'; - export let selected: string; + let { selected }: { selected: string } = $props(); + + const statModifier: Record = { + 75: 'Inspiration', + 76: 'Resourcefulness', + 77: 'Finesse', + 78: 'Deftness', + 79: 'Perception', + 80: 'Crafting Speed', + 81: 'Multicraft', + 82: 'Ingenuity', + }; function formatPrice(price: number): string { price = price / 100; @@ -52,6 +63,9 @@ text-align: right; width: 9.5rem; } + .stat { + color: var(--color-shrug); + }
@@ -80,6 +94,7 @@ {@const realm = wowthingData.static.connectedRealmById.get( auction.connectedRealmId )} + {@const statIndex = auction.modifierTypes.indexOf(29)} @@ -126,6 +141,11 @@ {@html formatPrice(auction.buyoutPrice)} + {#if statIndex >= 0} + + {statModifier[auction.modifierValues[statIndex]]} + + {/if} {:else} diff --git a/apps/frontend/auctions/stores/specific.ts b/apps/frontend/auctions/stores/specific.ts index dd7cce950..cd19e60d9 100644 --- a/apps/frontend/auctions/stores/specific.ts +++ b/apps/frontend/auctions/stores/specific.ts @@ -14,6 +14,7 @@ class SpecificStore { ): Promise { let things: UserAuctionDataAuction[] = []; + console.log(groupKey); const cacheKey = [auctionAppState.region, groupKey].join('--'); if (this.cache[cacheKey]) { @@ -25,15 +26,18 @@ class SpecificStore { region: auctionAppState.region, appearanceSource: '', itemId: 0, + itemLevel: 0, petSpeciesId: 0, }; if (groupKeyParts[0] === 'item') { data.itemId = parseInt(groupKeyParts[1]); + data.itemLevel = parseInt(groupKeyParts[2]) || 0; } else if (groupKeyParts[0] === 'pet') { data.petSpeciesId = parseInt(groupKeyParts[1]); } else if (groupKeyParts[0] === 'source') { data.appearanceSource = groupKeyParts[1]; + data.itemLevel = parseInt(groupKeyParts[2]) || 0; } const xsrf = document.getElementById('app').getAttribute('data-xsrf'); diff --git a/apps/frontend/components/tooltips/vault-world/Progress.svelte b/apps/frontend/components/tooltips/vault-world/Progress.svelte index 4e4698aaa..529654c94 100644 --- a/apps/frontend/components/tooltips/vault-world/Progress.svelte +++ b/apps/frontend/components/tooltips/vault-world/Progress.svelte @@ -28,6 +28,10 @@ - + {#if progress.level > 0} {progress.level} {/if} diff --git a/apps/frontend/data/dungeon.ts b/apps/frontend/data/dungeon.ts index 0825302a8..fda78c3e7 100644 --- a/apps/frontend/data/dungeon.ts +++ b/apps/frontend/data/dungeon.ts @@ -144,7 +144,7 @@ export const raidVaultItemLevel: Record> = { }; export const worldVaultItemLevel: Array> = [ - [13, 272, 4], // Hero 5 (ritual 5?) + [13, 269, 4], // Hero 4 (ritual 5?) [12, 263, 4], // Hero 2 (ritual 4?) [8, 259, 4], // Hero 1 [7, 256, 3], // Champion 4 diff --git a/apps/frontend/shared/components/parsed-text/ParsedText.svelte b/apps/frontend/shared/components/parsed-text/ParsedText.svelte index 91993d6c6..ce888185e 100644 --- a/apps/frontend/shared/components/parsed-text/ParsedText.svelte +++ b/apps/frontend/shared/components/parsed-text/ParsedText.svelte @@ -27,12 +27,12 @@ html = text || ''; html = html.replace( - /(- )?\|A:Professions-ChatIcon-Quality-Tier(\d):20:20\|a/, + /(- )?\|A:Professions-ChatIcon-Quality-Tier(\d+):20:20\|a/, '{craftedQuality:$2}' ); // TODO: fix with Midnight tier icons later html = html.replace( - /(- )?\|A:Professions-Icon-Quality-12-Tier(\d)-Small[:\d]+\|a/, + /(- )?\|A:Professions-(?:ChatIcon|Icon)-Quality-12-Tier(\d+)(?:-Small)?[:\d]+\|a/, '{craftedQuality:$2}' ); diff --git a/apps/web/Controllers/API/AuctionsController.cs b/apps/web/Controllers/API/AuctionsController.cs index 3e5ab8a8e..84ff4e8c7 100644 --- a/apps/web/Controllers/API/AuctionsController.cs +++ b/apps/web/Controllers/API/AuctionsController.cs @@ -103,7 +103,13 @@ public async Task Specific([FromBody] ApiAuctionsSpecificForm for var timer = new JankTimer(); - var data = await _auctionService.Specific(form.Region, form.AppearanceSource, form.ItemId, form.PetSpeciesId); + var data = await _auctionService.Specific( + form.Region, + form.AppearanceSource, + form.ItemId, + form.ItemLevel, + form.PetSpeciesId + ); timer.AddPoint("Data"); diff --git a/apps/web/Forms/ApiAuctionsSpecificForm.cs b/apps/web/Forms/ApiAuctionsSpecificForm.cs index a324dcbfe..4e0e2ffef 100644 --- a/apps/web/Forms/ApiAuctionsSpecificForm.cs +++ b/apps/web/Forms/ApiAuctionsSpecificForm.cs @@ -6,6 +6,7 @@ public class ApiAuctionsSpecificForm { public string AppearanceSource { get; set; } public int ItemId { get; set; } + public int ItemLevel { get; set; } public int PetSpeciesId { get; set; } public WowRegion Region { get; set; } } diff --git a/apps/web/Services/AuctionService.cs b/apps/web/Services/AuctionService.cs index 4a26e184f..4171e29a3 100644 --- a/apps/web/Services/AuctionService.cs +++ b/apps/web/Services/AuctionService.cs @@ -110,7 +110,13 @@ public async Task Search(WowRegion region, string query) return auctions; } - public async Task Specific(WowRegion region, string appearanceSource, int itemId, int petSpeciesId) + public async Task Specific( + WowRegion region, + string appearanceSource, + int itemId, + int itemLevel, + int petSpeciesId + ) { var connectedRealmIds = await _context.WowRealm .Where(realm => realm.Region == region) @@ -137,6 +143,11 @@ public async Task Specific(WowRegion region, string appearanceSour auctionQuery = auctionQuery.Where(auction => auction.PetSpeciesId == petSpeciesId); } + if (itemLevel > 0) + { + auctionQuery = auctionQuery.Where(auction => auction.GroupKey.EndsWith($":{itemLevel}")); + } + var auctions = await auctionQuery .OrderBy(auction => auction.BuyoutPrice) .ToArrayAsync(); diff --git a/packages/csharp-lib/Enums/WowItemBonusType.cs b/packages/csharp-lib/Enums/WowItemBonusType.cs index aefb64371..1c03799cc 100644 --- a/packages/csharp-lib/Enums/WowItemBonusType.cs +++ b/packages/csharp-lib/Enums/WowItemBonusType.cs @@ -51,10 +51,10 @@ public enum WowItemBonusType : long Unknown46 = 46, Unknown47 = 47, Unknown48 = 48, - Unknown49 = 49, + ScaleConfig = 49, Unknown50 = 50, Unknown51 = 51, - Unknown52 = 52, + ScaleCrafted = 52, Unknown53 = 53, Unknown54 = 54, Unknown55 = 55,