diff --git a/apps/backend/Jobs/Data/DataAuctionsJob.cs b/apps/backend/Jobs/Data/DataAuctionsJob.cs index 1524d409b..80d320244 100644 --- a/apps/backend/Jobs/Data/DataAuctionsJob.cs +++ b/apps/backend/Jobs/Data/DataAuctionsJob.cs @@ -166,7 +166,8 @@ public override async Task Run(string[] data) Dictionary> commodities; await using (var writer = await connection.BeginBinaryImportAsync(string.Format(CopyAuctions, tableName))) { - (auctionsByAppearanceId, auctionsByAppearanceSource, commodities) = await WriteAuctionData(writer, _connectedRealmId, result.Data.Auctions); + (auctionsByAppearanceId, auctionsByAppearanceSource, commodities) = + await WriteAuctionData(writer, _connectedRealmId, result.Data.Auctions); } timer.AddPoint("Copy"); @@ -182,6 +183,7 @@ public override async Task Run(string[] data) await Task.Delay(100); } } + timer.AddPoint("Lock"); // Get current partitions @@ -300,9 +302,9 @@ await db.HashSetAsync( private async Task< ( - Dictionary> appearanceIds, - Dictionary> appearanceSources, - Dictionary> commodities + Dictionary> appearanceIds, + Dictionary> appearanceSources, + Dictionary> commodities ) > WriteAuctionData(NpgsqlBinaryImporter writer, int connectedRealmId, List dataAuctions) { @@ -342,16 +344,19 @@ Dictionary> commodities if (!Hardcoded.IgnoredAuctionItemIds.Contains(auction.Item.Id)) { - if (!_itemModifiedAppearances.ItemIdAndModifierToAppearanceId.TryGetValue((auction.Item.Id, modifier), - out int actualAppearanceId)) + int actualAppearanceId = 0; + + if (_itemModifiedAppearances.ByItemIdAndModifier.TryGetValue((auction.Item.Id, modifier), + out var record)) { - if (_itemModifiedAppearances.ModifiersByItemId.TryGetValue(auction.Item.Id, + actualAppearanceId = record.AppearanceId; + } + else if (_itemModifiedAppearances.ModifiersByItemId.TryGetValue(auction.Item.Id, out short[] possibleModifiers)) - { - modifier = possibleModifiers[0]; - actualAppearanceId = - _itemModifiedAppearances.ItemIdAndModifierToAppearanceId[(auction.Item.Id, modifier)]; - } + { + modifier = possibleModifiers[0]; + record = _itemModifiedAppearances.ByItemIdAndModifier[(auction.Item.Id, modifier)]; + actualAppearanceId = record?.AppearanceId ?? 0; } if (actualAppearanceId > 0) diff --git a/apps/backend/Jobs/User/UserUploadJob.cs b/apps/backend/Jobs/User/UserUploadJob.cs index e3dd11b66..3243cac21 100644 --- a/apps/backend/Jobs/User/UserUploadJob.cs +++ b/apps/backend/Jobs/User/UserUploadJob.cs @@ -488,14 +488,14 @@ private async Task Process(string luaData) { var itemModifiedAppearanceIds = SquishUtilities.Unsquish(parsed.TransmogSourcesSquishV2); foreach (int itemModifiedAppearanceId in itemModifiedAppearanceIds) { - if (imaCache.IdToItemIdAndModifier.TryGetValue(itemModifiedAppearanceId, out var itemIdAndModifier)) + if (imaCache.ById.TryGetValue(itemModifiedAppearanceId, out var itemModifiedAppearance)) { - if (imaCache.ItemIdAndModifierToAppearanceId.TryGetValue(itemIdAndModifier, out int appearanceId)) + if (itemModifiedAppearance.AppearanceId > 0) { - ids.Add(appearanceId); + ids.Add(itemModifiedAppearance.AppearanceId); } - sources.Add($"{itemIdAndModifier.Item1}_{itemIdAndModifier.Item2}"); + sources.Add($"{itemModifiedAppearance.ItemId}_{itemModifiedAppearance.Modifier}"); } else { diff --git a/apps/backend/Models/Cache/ItemModifiedAppearanceCache.cs b/apps/backend/Models/Cache/ItemModifiedAppearanceCache.cs index 818e62b1d..ae0bb3817 100644 --- a/apps/backend/Models/Cache/ItemModifiedAppearanceCache.cs +++ b/apps/backend/Models/Cache/ItemModifiedAppearanceCache.cs @@ -1,11 +1,12 @@ -using Wowthing.Lib.Models.Wow; +using Wowthing.Lib.Enums; +using Wowthing.Lib.Models.Wow; namespace Wowthing.Backend.Models.Cache; public class ItemModifiedAppearanceCache { - public readonly Dictionary IdToItemIdAndModifier = new(); - public readonly Dictionary<(int, short), int> ItemIdAndModifierToAppearanceId = new(); + public readonly Dictionary ById = new(); + public readonly Dictionary<(int, short), ItemModifiedAppearance> ByItemIdAndModifier = new(); public readonly Dictionary ModifiersByItemId; public ItemModifiedAppearanceCache(WowItemModifiedAppearance[] itemModifiedAppearances) @@ -14,8 +15,15 @@ public ItemModifiedAppearanceCache(WowItemModifiedAppearance[] itemModifiedAppea foreach (var ima in itemModifiedAppearances) { - IdToItemIdAndModifier[ima.Id] = (ima.ItemId, ima.Modifier); - ItemIdAndModifierToAppearanceId[(ima.ItemId, ima.Modifier)] = ima.AppearanceId; + var record = new ItemModifiedAppearance( + ima.AppearanceId, + ima.ItemId, + ima.Modifier, + ima.SourceType != TransmogSourceType.CantCollect && + ima.SourceType != TransmogSourceType.NotValidForTransmog + ); + ById[ima.Id] = record; + ByItemIdAndModifier[(ima.ItemId, ima.Modifier)] = record; if (!tempModifiers.TryGetValue(ima.ItemId, out var modifiers)) { @@ -31,4 +39,6 @@ public ItemModifiedAppearanceCache(WowItemModifiedAppearance[] itemModifiedAppea kvp => kvp.Value.Order().ToArray() ); } + + public record ItemModifiedAppearance(int AppearanceId, int ItemId, short Modifier, bool Collectable); } diff --git a/apps/backend/Services/MemoryCacheService.cs b/apps/backend/Services/MemoryCacheService.cs index a743c2345..6c9847008 100644 --- a/apps/backend/Services/MemoryCacheService.cs +++ b/apps/backend/Services/MemoryCacheService.cs @@ -122,8 +122,8 @@ public async Task GetItemModifiedAppearances() var itemModifiedAppearances = await contextWrapper.Context.WowItemModifiedAppearance .AsNoTracking() - .Where(wima => wima.SourceType != TransmogSourceType.CantCollect && - wima.SourceType != TransmogSourceType.NotValidForTransmog) + // .Where(wima => wima.SourceType != TransmogSourceType.CantCollect && + // wima.SourceType != TransmogSourceType.NotValidForTransmog) .ToArrayAsync(); return new ItemModifiedAppearanceCache(itemModifiedAppearances); diff --git a/apps/frontend/components/achievements/ScoreSummary.svelte b/apps/frontend/components/achievements/ScoreSummary.svelte index 0bc8f5e78..4b870a5a3 100644 --- a/apps/frontend/components/achievements/ScoreSummary.svelte +++ b/apps/frontend/components/achievements/ScoreSummary.svelte @@ -17,6 +17,11 @@ nulls++; continue; } + + if (category.slug.endsWith('-hidden')) { + continue; + } + if (nulls === 0) { retNormal.push(category); } else if (nulls === 1) { diff --git a/apps/frontend/components/auctions/AuctionsSpecificItem.svelte b/apps/frontend/components/auctions/AuctionsSpecificItem.svelte index 8a193e5cb..b9d1d1220 100644 --- a/apps/frontend/components/auctions/AuctionsSpecificItem.svelte +++ b/apps/frontend/components/auctions/AuctionsSpecificItem.svelte @@ -10,9 +10,9 @@ import WowheadLink from '@/shared/components/links/WowheadLink.svelte'; import WowthingImage from '@/shared/components/images/sources/WowthingImage.svelte'; - export let slug2: string; + let { slug2 }: { slug2: string } = $props(); - $: itemId = parseInt(slug2); + let itemId = $derived(parseInt(slug2)); diff --git a/apps/frontend/data/enchants.ts b/apps/frontend/data/enchants.ts new file mode 100644 index 000000000..b86dec665 --- /dev/null +++ b/apps/frontend/data/enchants.ts @@ -0,0 +1,128 @@ +import { InventorySlot } from '@/enums/inventory-slot'; +import type { Character } from '@/types/character'; + +// SpellItemEnchantment.db2 +export const validEnchants: Record = { + [InventorySlot.MainHand]: [ + 3368, // Rune of the Fallen Crusader [DK] + 5870, // Rune of the Fallen Crusader [DK] + // 6243, // Rune of Hysteria [DK] + 3370, // Rune of Razorice [DK] + 5869, // Rune of Razorice [DK] + 6241, // Rune of Sanguination [DK] + 3847, // Rune of the Stoneskin Gargoyle [DK] + + 8038, // Acuity of the Ren'dorei 1 + 8039, // Acuity of the Ren'dorei 2 + 8040, // Arcane Mastery 1 + 8041, // Arcane Mastery 2 + 7982, // Berserker's Rage 1 + 7983, // Berserker's Rage 2 + 8036, // Flames of the Sin'dorei 1 + 8037, // Flames of the Sin'dorei 2 + 7980, // Jan'alai's Precision 1 + 7981, // Jan'alai's Precision 2 + 7978, // Strength of Halazzi 1 + 7979, // Strength of Halazzi 2 + 8010, // Worldsoul Aegis 1 + 8009, // Worldsoul Aegis 2 + 8008, // Worldsoul Cradle 1 + 8007, // Worldsoul Cradle 2 + 8010, // Worldsoul Tenacity 1 + 8011, // Worldsoul Tenacity 2 + ], + + [InventorySlot.Head]: [ + 7990, // Empowered Blessing of Speed 1 + 7991, // Empowered Blessing of Speed 1 + 7960, // Empowered Hex of Leeching 1 + 7961, // Empowered Hex of Leeching 1 + 8016, // Empowered Rune of Avoidance 1 + 8017, // Empowered Rune of Avoidance 1 + ], + + [InventorySlot.Shoulders]: [ + 7972, // Akil'zon's Swiftness 1 + 7973, // Akil'zon's Swiftness 2 + 8000, // Amirdrassil's Grace 1 + 8001, // Amirdrassil's Grace 2 + 8030, // Silvermoon's Mending 1 + 8031, // Silvermoon's Mending 2 + ], + + [InventorySlot.Chest]: [ + 7956, // Mark of Nalorakk 1 + 7957, // Mark of Nalorakk 2 + 8012, // Mark of the Magister 1 + 8013, // Mark of the Magister 2 + 7984, // Mark of the Rootwarden 1 + 7985, // Mark of the Rootwarden 2 + 7986, // Mark of the Worldsoul 1 + 7987, // Mark of the Worldsoul 2 + ], + + [InventorySlot.Legs]: [ + 7936, // Arcanoweave Spellthread 1 + 7937, // Arcanoweave Spellthread 2 + 8162, // Blood Knight's Armor Kit 1 + 8163, // Blood Knight's Armor Kit 2 + 8158, // Forest Hunter's Armor Kit 1 + 8159, // Forest Hunter's Armor Kit 2 + 7934, // Sunfire Silk Spellthread 1 + 7935, // Sunfire Silk Spellthread 2 + ], + + [InventorySlot.Feet]: [ + 8018, // Farstrider's Hunt 1 + 8019, // Farstrider's Hunt 2 + 7962, // Lynx's Dexterity 1 + 7963, // Lynx's Dexterity 2 + 7992, // Shaladrassil's Roots 1 + 7993, // Shaladrassil's Roots 2 + ], + + [InventorySlot.Ring1]: [ + 7966, // Eyes of the Eagle 1 + 7967, // Eyes of the Eagle 2 + 7996, // Nature's Fury 1 + 7997, // Nature's Fury 2 + 8024, // Silvermoon's Alacrity 1 + 8025, // Silvermoon's Alacrity 2 + 8026, // Silvermoon's Tenacity 1 + 8027, // Silvermoon's Tenacity 2 + 7968, // Zul'jin's Mastery 1 + 7969, // Zul'jin's Mastery 2 + ], +}; + +export const specialValidEnchants: Record = { + // FIXME + /*[InventorySlot.Hands]: { + enchants: [ + 6210, // Eternal Strength + ], + checkFunc: (character: Character) => + specializationMap[character.activeSpecId]?.mainStat === PrimaryStat.Strength + }, + + [InventorySlot.Wrist]: { + enchants: [ + 6220, // Eternal Intellect + ], + checkFunc: (character: Character) => + specializationMap[character.activeSpecId]?.mainStat === PrimaryStat.Intellect + }, + + [InventorySlot.Feet]: { + enchants: [ + 6211, // Eternal Agility + ], + checkFunc: (character: Character) => + specializationMap[character.activeSpecId]?.mainStat === PrimaryStat.Agility + },*/ +}; + +interface SpecialValidEnchant { + enchants: number[]; + checkFunc: (character: Character) => boolean; +} diff --git a/apps/frontend/data/inventory-slot.ts b/apps/frontend/data/inventory-slot.ts index c73381ba1..6b07404c7 100644 --- a/apps/frontend/data/inventory-slot.ts +++ b/apps/frontend/data/inventory-slot.ts @@ -39,184 +39,6 @@ export const heirloomSlots: Record = Object.fromEntries( ].map((n) => [n, true]) ); -// SpellItemEnchantment.db2 -export const validEnchants: Record = { - [InventorySlot.MainHand]: [ - 3368, // Rune of the Fallen Crusader [DK] - 5870, // Rune of the Fallen Crusader [DK] - // 6243, // Rune of Hysteria [DK] - 3370, // Rune of Razorice [DK] - 5869, // Rune of Razorice [DK] - 3847, // Rune of the Stoneskin Gargoyle [DK] - 7449, // Authority of Air - 7450, // Authority of Air - 7451, // Authority of Air - 7452, // Authority of Fiery Resolve - 7453, // Authority of Fiery Resolve - 7454, // Authority of Fiery Resolve - 7461, // Authority of Radiant Power - 7462, // Authority of Radiant Power - 7463, // Authority of Radiant Power - 7455, // Authority of Storms - 7456, // Authority of Storms - 7457, // Authority of Storms - 7458, // Authority of the Depths 1 - 7459, // Authority of the Depths 2 - 7460, // Authority of the Depths 3 - 7437, // Council's Guile - 7438, // Council's Guile - 7439, // Council's Guile - 7446, // Oathsworn's Tenacity - 7447, // Oathsworn's Tenacity - 7448, // Oathsworn's Tenacity - 7443, // Stonebound Artistry - 7444, // Stonebound Artistry - 7445, // Stonebound Artistry - 7440, // Stormrider's Fury - 7441, // Stormrider's Fury - 7442, // Stormrider's Fury - ], - - [InventorySlot.Back]: [ - 7413, // Chant of Burrowing Rapidity 1 [1651] - 7414, // Chant of Burrowing Rapidity 2 - 7415, // Chant of Burrowing Rapidity 3 - 7407, // Chant of Leeching Fangs 1 [1653] - 7408, // Chant of Leeching Fangs 2 - 7409, // Chant of Leeching Fangs 3 - 7401, // Chant of Winged Grace 1 [1655] - 7402, // Chant of Winged Grace 2 - 7403, // Chant of Winged Grace 3 - 7400, // Whisper of Silken Avoidance 3 [1656] - 7406, // Whisper of Silken Leech 3 [1654] - 7412, // Whisper of Silken Speed 3 [1652] - ], - - [InventorySlot.Chest]: [ - 6625, // Waking Stats 3 (TODO: remove if the TWW enchants ever become affordable) - 7356, // Council's Intellect 1 [1628] - 7357, // Council's Intellect 2 - 7358, // Council's Intellect 3 - 7362, // Crystalline Radiance 1 [1629] - 7363, // Crystalline Radiance 2 - 7364, // Crystalline Radiance 3 - 7359, // Oathsworn's Strength 1 [1630] - 7360, // Oathsworn's Strength 2 - 7361, // Oathsworn's Strength 3 - 7353, // Stormrider's Agility 1 [1627] - 7354, // Stormrider's Agility 2 - 7355, // Stormrider's Agility 3 - ], - - [InventorySlot.Wrist]: [ - 7383, // Chant of Armored Avoidance 1 [1646] - 7384, // Chant of Armored Avoidance 2 - 7385, // Chant of Armored Avoidance 3 - 7389, // Chant of Armored Leech 1 [1648] - 7390, // Chant of Armored Leech 2 - 7391, // Chant of Armored Leech 3 - 7395, // Chant of Armored Speed 1 [1650] - 7396, // Chant of Armored Speed 2 - 7397, // Chant of Armored Speed 3 - 7382, // Whisper of Armored Avoidance 3 [1645] - 7388, // Whisper of Armored Leech 3 [1647] - 7394, // Whisper of Armored Speed 3 [1649] - ], - - [InventorySlot.Legs]: [ - 7529, // Daybreak Spellthread 1 - 7530, // Daybreak Spellthread 2 - 7531, // Daybreak Spellthread 3 - 7532, // Sunset Spellthread 1 - 7533, // Sunset Spellthread 2 - 7534, // Sunset Spellthread 3 - 7535, // Weavercloth Spellthread 1 - 7536, // Weavercloth Spellthread 2 - 7537, // Weavercloth Spellthread 3 - 7593, // Defender's Armor Kit 1 - 7594, // Defender's Armor Kit 2 - 7595, // Defender's Armor Kit 3 - // 7596, // Dual Layered Armor Kit 1 - 7597, // Dual Layered Armor Kit 2 - 7598, // Dual Layered Armor Kit 3 - // 7599, // Stormbound Armor Kit 1 - 7602, // Stormbound Armor Kit 2 - 7601, // Stormbound Armor Kit 3 - ], - - [InventorySlot.Feet]: [ - 7416, // Scout's March 1 - 7417, // Scout's March 2 - 7418, // Scout's March 3 - 7422, // Defender's March 1 [1578] - 7423, // Defender's March 2 - 7424, // Defender's March 3 - ], - - [InventorySlot.Ring1]: [ - 7468, // Cursed Critical Strike 1 [1657] - 7469, // Cursed Critical Strike 2 - 7470, // Cursed Critical Strike 3 - 7471, // Cursed Haste 1 [1658] - 7472, // Cursed Haste 2 - 7473, // Cursed Haste 3 - 7477, // Cursed Mastery 1 [1659] - 7478, // Cursed Mastery 2 - 7479, // Cursed Mastery 3 - 7474, // Cursed Versatility 1 [1660] - 7475, // Cursed Versatility 2 - 7476, // Cursed Versatility 3 - 7331, // Glimmering Critical Strike 3 [1579] - 7337, // Glimmering Haste 3 [1581] - 7343, // Glimmering Mastery 3 [1583] - 7349, // Glimmering Versatility 3 [1585] - 7332, // Radiant Critical Strike 1 [1580] - 7333, // Radiant Critical Strike 2 - 7334, // Radiant Critical Strike 3 - 7338, // Radiant Haste 1 [1582] - 7339, // Radiant Haste 2 - 7340, // Radiant Haste 3 - 7344, // Radiant Mastery 1 [1584] - 7345, // Radiant Mastery 2 - 7346, // Radiant Mastery 3 - 7350, // Radiant Versatility 1 [1586] - 7351, // Radiant Versatility 2 - 7352, // Radiant Versatility 3 - ], -}; - -export const specialValidEnchants: Record = { - // FIXME - /*[InventorySlot.Hands]: { - enchants: [ - 6210, // Eternal Strength - ], - checkFunc: (character: Character) => - specializationMap[character.activeSpecId]?.mainStat === PrimaryStat.Strength - }, - - [InventorySlot.Wrist]: { - enchants: [ - 6220, // Eternal Intellect - ], - checkFunc: (character: Character) => - specializationMap[character.activeSpecId]?.mainStat === PrimaryStat.Intellect - }, - - [InventorySlot.Feet]: { - enchants: [ - 6211, // Eternal Agility - ], - checkFunc: (character: Character) => - specializationMap[character.activeSpecId]?.mainStat === PrimaryStat.Agility - },*/ -}; - -interface SpecialValidEnchant { - enchants: number[]; - checkFunc: (character: Character) => boolean; -} - export const characterBagSlots: number[] = [ 1, 2, diff --git a/apps/frontend/data/tasks/events/index.ts b/apps/frontend/data/tasks/events/index.ts index 2dd37ab23..3d8401dc1 100644 --- a/apps/frontend/data/tasks/events/index.ts +++ b/apps/frontend/data/tasks/events/index.ts @@ -2,7 +2,7 @@ import { eventAnniversary } from './anniversary'; import { eventBonus } from './bonus'; import { eventBrewfest } from './brewfest'; import { eventDarkmoonFaire } from './darkmoon-faire'; -import { eventPrepatch } from './prepatch'; +import { eventNoblegarden } from './noblegarden'; import { eventTimewalking } from './timewalking'; export const eventTasks = [ @@ -10,6 +10,6 @@ export const eventTasks = [ eventBonus, eventBrewfest, eventDarkmoonFaire, - eventPrepatch, + eventNoblegarden, eventTimewalking, ]; diff --git a/apps/frontend/data/tasks/events/noblegarden.ts b/apps/frontend/data/tasks/events/noblegarden.ts new file mode 100644 index 000000000..b779875d0 --- /dev/null +++ b/apps/frontend/data/tasks/events/noblegarden.ts @@ -0,0 +1,26 @@ +import { Holiday } from '@/enums/holiday'; +import { iconLibrary } from '@/shared/icons'; +import { DbResetType } from '@/shared/stores/db/enums'; +import type { Task } from '@/types/tasks'; + +export const eventNoblegarden: Task = { + key: 'eventNoblegarden', + name: '[Event] Noblegarden', + shortName: '🐰', + minimumLevel: 1, + requiredHolidays: [Holiday.Noblegarden], + chores: [ + { + key: 'featheredFiend', + name: 'Feathered Fiend', + icon: iconLibrary.mdiDuck, + alwaysStarted: true, + questResetForced: true, + questReset: DbResetType.Daily, + questIds: [ + 73192, // [A] + 79558, // [H] + ], + }, + ], +}; diff --git a/apps/frontend/data/tasks/events/prepatch.ts b/apps/frontend/data/tasks/events/prepatch.ts deleted file mode 100644 index a85a0a79f..000000000 --- a/apps/frontend/data/tasks/events/prepatch.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Holiday } from '@/enums/holiday'; -import { DbResetType } from '@/shared/stores/db/enums'; -import type { Task } from '@/types/tasks'; - -export const eventPrepatch: Task = { - key: 'eventMidnightPrepatch', - name: '[Event] Midnight Prepatch', - shortName: 'Pre', - minimumLevel: 10, - showSeparate: true, - chores: [ - { - key: 'disrupt', - name: 'Disrupt the Call', - minimumLevel: 10, - accountWide: true, - requiredHolidays: [Holiday.PrepatchMidnight], - questReset: DbResetType.Weekly, - questResetForced: true, - questIds: [91795], // Disrupt the Call - }, - { - key: 'twilight', - name: "Twilight's Dawn", - minimumLevel: 10, - accountWide: true, - requiredHolidays: [Holiday.PrepatchMidnight], - questReset: DbResetType.Weekly, - questResetForced: true, - questIds: [87308], // Twilight's Dawn - }, - ], -}; diff --git a/apps/frontend/scss/table.scss b/apps/frontend/scss/table.scss index 9349ca253..133f976b4 100644 --- a/apps/frontend/scss/table.scss +++ b/apps/frontend/scss/table.scss @@ -90,8 +90,9 @@ $table-striped-hl-bg: lighten($table-hl-bg, 3%); border-left: 1px solid var(--border-color); border-right-width: 0 !important; border-top-width: 0 !important; - min-width: 3rem; - width: 3rem; + padding-right: 0.1rem; + min-width: 2rem; + width: 2rem; } } diff --git a/apps/frontend/shared/components/parsed-text/ParsedText.svelte b/apps/frontend/shared/components/parsed-text/ParsedText.svelte index 717fbc3ed..01625591b 100644 --- a/apps/frontend/shared/components/parsed-text/ParsedText.svelte +++ b/apps/frontend/shared/components/parsed-text/ParsedText.svelte @@ -166,8 +166,9 @@ html = html.replaceAll(/\{item:(\d+)\}/g, (_, itemId) => { const item = wowthingData.items.items[parseInt(itemId)]; if (item) { + // Midnight qualities are 13 and 14 for some reason, pretend they're normal if (item.craftingQuality) { - return `${item.name} `; + return `${item.name} `; } else { return `${item.name}`; } diff --git a/apps/frontend/shared/stores/data/achievements/process.ts b/apps/frontend/shared/stores/data/achievements/process.ts index b0384b05d..d908e3cc3 100644 --- a/apps/frontend/shared/stores/data/achievements/process.ts +++ b/apps/frontend/shared/stores/data/achievements/process.ts @@ -48,17 +48,9 @@ export function processAchievementsData(rawData: RawAchievements): DataAchieveme for (const extraCategory of extraCategories) { const reputations = ret.categories.find((cat) => cat?.slug === 'reputation'); let slugCat: AchievementDataCategory; - if (extraCategory.slug === 'prepatch-midnight') { + if (extraCategory.slug === 'outland-cup') { slugCat = { id: 1_000_001, - name: 'Prepatch: Midnight ', - slug: 'prepatch-midnight', - achievementIds: [], - children: [], - }; - } else if (extraCategory.slug === 'outland-cup') { - slugCat = { - id: 1_000_002, name: 'Outland Cup', slug: 'outland-cup-hidden', achievementIds: [], diff --git a/apps/frontend/user-home/components/everything/data.ts b/apps/frontend/user-home/components/everything/data.ts index 821b44e17..b7378305f 100644 --- a/apps/frontend/user-home/components/everything/data.ts +++ b/apps/frontend/user-home/components/everything/data.ts @@ -91,12 +91,6 @@ export const everythingData: Record = { achievementsKey: ['world-events', 'anniversary-celebration'], vendorsKey: ['world-events', 'anniversary'], }, - 'prepatch-midnight': { - name: 'Prepatch: Midnight', - tag: 'event:prepatch-midnight', - achievementsKey: ['prepatch-midnight'], - vendorsKey: ['world-events', 'mid-twilight-ascension'], - }, 'remix-legion': { name: 'Remix: Legion', tag: 'event:remix-legion', diff --git a/apps/frontend/user-home/components/world-quests/ContinentBox.svelte b/apps/frontend/user-home/components/world-quests/ContinentBox.svelte index fbe0d1c6b..99e620755 100644 --- a/apps/frontend/user-home/components/world-quests/ContinentBox.svelte +++ b/apps/frontend/user-home/components/world-quests/ContinentBox.svelte @@ -38,8 +38,8 @@ .zone-quests { display: flex; flex-wrap: wrap; - gap: 0.2rem 0.4rem; - max-width: calc(0.2rem + (5 * 36px) + (4 * 0.4rem) + 2px); + gap: 0 0.3rem; + max-width: calc(0.2rem + (5 * 50px) + (4 * 0.4rem) + 2px); position: absolute; :global(> .world-quest) { diff --git a/apps/frontend/user-home/components/world-quests/data.ts b/apps/frontend/user-home/components/world-quests/data.ts index 19964ac52..777963cf8 100644 --- a/apps/frontend/user-home/components/world-quests/data.ts +++ b/apps/frontend/user-home/components/world-quests/data.ts @@ -3,17 +3,17 @@ import type { WorldQuestZone } from './types'; export const zoneData: WorldQuestZone[] = [ { - id: 9999, + id: 2537, name: '[Mid] Midnight', slug: 'midnight', - mapName: '', + mapName: '11-midnight/quelthalas', children: [ { id: 2395, name: 'Eversong Woods', slug: 'eversong-woods', mapName: '11-midnight/eversong_woods', - continentPoint: [0, 0], + continentPoint: [9, 62], anchor: 'top-left', }, { @@ -21,23 +21,23 @@ export const zoneData: WorldQuestZone[] = [ name: 'Harandar', slug: 'harandar', mapName: '11-midnight/harandar', - continentPoint: [0, 0], - anchor: 'top-left', + continentPoint: [75, 22], + anchor: 'bottom-left', }, { id: 2405, name: 'Voidstorm', slug: 'voidstorm', mapName: '11-midnight/voidstorm', - continentPoint: [0, 0], - anchor: 'top-left', + continentPoint: [46, 30], + anchor: 'bottom-left', }, { id: 2437, name: "Zul'Aman", slug: 'zulaman', mapName: '11-midnight/zulaman', - continentPoint: [0, 0], + continentPoint: [42, 72], anchor: 'top-left', }, null, @@ -46,8 +46,8 @@ export const zoneData: WorldQuestZone[] = [ name: 'Silvermoon City', slug: 'silvermoon-city', mapName: '11-midnight/silvermoon_city', - continentPoint: [0, 0], - anchor: 'top-left', + continentPoint: [23, 41], + anchor: 'bottom-left', }, ], }, diff --git a/apps/frontend/utils/get-character-gear.ts b/apps/frontend/utils/get-character-gear.ts index f7357b4f2..44604d740 100644 --- a/apps/frontend/utils/get-character-gear.ts +++ b/apps/frontend/utils/get-character-gear.ts @@ -1,10 +1,6 @@ import { Constants } from '@/data/constants'; -import { - heirloomSlots, - slotOrder, - specialValidEnchants, - validEnchants, -} from '@/data/inventory-slot'; +import { specialValidEnchants, validEnchants } from '@/data/enchants'; +import { heirloomSlots, slotOrder } from '@/data/inventory-slot'; import { InventorySlot } from '@/enums/inventory-slot'; import { ItemBonusType } from '@/enums/item-bonus-type'; import { ItemClass } from '@/enums/item-class'; diff --git a/apps/frontend/utils/get-progress.ts b/apps/frontend/utils/get-progress.ts index 2a06ab68f..710eccfac 100644 --- a/apps/frontend/utils/get-progress.ts +++ b/apps/frontend/utils/get-progress.ts @@ -150,6 +150,13 @@ export default function getProgress( datas = group.data[factionIdMap[character.faction]]; break; + case 'faction-class': + datas = + group.data[ + `${factionIdMap[character.faction]}-${wowthingData.static.characterClassById.get(character.classId).slug}` + ]; + break; + case 'race': datas = group.data[characterRace.slug]; break;