diff --git a/apps/frontend/components/character-table/CharacterTableHead.svelte b/apps/frontend/components/character-table/CharacterTableHead.svelte index 31063d4ed..1f6ca0c8f 100644 --- a/apps/frontend/components/character-table/CharacterTableHead.svelte +++ b/apps/frontend/components/character-table/CharacterTableHead.svelte @@ -1,5 +1,14 @@ - - + + {@render children?.()} diff --git a/apps/frontend/components/items/convertible/ClassTable.svelte b/apps/frontend/components/items/convertible/ClassTable.svelte index 718506e5e..40c91b5bf 100644 --- a/apps/frontend/components/items/convertible/ClassTable.svelte +++ b/apps/frontend/components/items/convertible/ClassTable.svelte @@ -72,7 +72,7 @@ {#if data} - + {#snippet headText()}
{#if modifier === AppearanceModifier.LookingForRaid} @@ -85,7 +85,7 @@ {stats.percent.toFixed(0)} %
-
+ {/snippet} {#each convertibleTypes as inventoryType (inventoryType)} diff --git a/apps/frontend/components/journal/JournalItem.svelte b/apps/frontend/components/journal/JournalItem.svelte index 2747cb95c..8e7dff1b5 100644 --- a/apps/frontend/components/journal/JournalItem.svelte +++ b/apps/frontend/components/journal/JournalItem.svelte @@ -202,7 +202,7 @@ {/if} - {#if [BindType.NotBound, BindType.OnEquip].includes(dataItem.bindType)} + {#if [BindType.NotBound, BindType.OnEquip].includes(dataItem.bindType) && !dataItem.boundToAccount}
- + {#snippet headText()} GroupedONLY characters with lockout - + {/snippet} - + {#snippet headTop(colspan)} {#if browserState.current.lockouts.grouped} {/if} - + {/snippet} {#each allLockouts as instanceDifficulty, index (instanceDifficulty)} - + {#snippet headText()} {profession.name.split('|')[0]} - + {/snippet} {#if profession.slug === 'archaeology'} Ugh diff --git a/apps/frontend/components/professions/patron-orders/Table.svelte b/apps/frontend/components/professions/patron-orders/Table.svelte index 5a4125a57..72d5a144d 100644 --- a/apps/frontend/components/professions/patron-orders/Table.svelte +++ b/apps/frontend/components/professions/patron-orders/Table.svelte @@ -56,10 +56,10 @@ {#if profession} - + {#snippet headText()} {profession.name.split('|')[0]} - + {/snippet}
diff --git a/apps/frontend/data/holidays.ts b/apps/frontend/data/holidays.ts index 168c0486e..557606acc 100644 --- a/apps/frontend/data/holidays.ts +++ b/apps/frontend/data/holidays.ts @@ -44,6 +44,7 @@ export const holidayIds: Record = { [Holiday.Brewfest]: [[19]], [Holiday.ChildrensWeek]: [[13]], [Holiday.DarkmoonFaire]: [[1]], + [Holiday.DarkspearDash]: [[458]], [Holiday.DayOfTheDead]: [[81]], [Holiday.HallowsEnd]: [[16]], [Holiday.LoveIsInTheAir]: [[9]], @@ -117,6 +118,11 @@ export const fancyHolidays: FancyHoliday[] = [ shortName: '🎡', everything: 'darkmoon-faire', }, + { + holiday: Holiday.DarkspearDash, + shortName: '🧌', + everything: 'darkspear-dash', + }, { holiday: Holiday.DayOfTheDead, shortName: '💀', @@ -139,7 +145,7 @@ export const fancyHolidays: FancyHoliday[] = [ }, { holiday: Holiday.MidsummerFireFestival, - shortName: 'Midsummer', + shortName: '🌞', everything: 'midsummer-fire-festival', }, { diff --git a/apps/frontend/enums/holiday.ts b/apps/frontend/enums/holiday.ts index fe8870cbc..de8bb1c17 100644 --- a/apps/frontend/enums/holiday.ts +++ b/apps/frontend/enums/holiday.ts @@ -3,6 +3,7 @@ export enum Holiday { Brewfest, ChildrensWeek, DarkmoonFaire, + DarkspearDash, DayOfTheDead, HallowsEnd, LoveIsInTheAir, diff --git a/apps/frontend/enums/item-flags.ts b/apps/frontend/enums/item-flags.ts index 4cda717f8..239f40a87 100644 --- a/apps/frontend/enums/item-flags.ts +++ b/apps/frontend/enums/item-flags.ts @@ -1,10 +1,12 @@ +/* prettier-ignore */ export enum ItemFlags { - Cosmetic = 0b00_00_00_01, - CannotTransmogToThisItem = 0b00_00_00_10, - AllianceOnly = 0b00_00_01_00, - HordeOnly = 0b00_00_10_00, - LookingForRaidDifficulty = 0b00_01_00_00, - HeroicDifficulty = 0b00_10_00_00, - MythicDifficulty = 0b01_00_00_00, - Openable = 0b10_00_00_00, + Cosmetic = 0b0000_0000_0000_0001, + CannotTransmogToThisItem = 0b0000_0000_0000_0010, + AllianceOnly = 0b0000_0000_0000_0100, + HordeOnly = 0b0000_0000_0000_1000, + LookingForRaidDifficulty = 0b0000_0000_0001_0000, + HeroicDifficulty = 0b0000_0000_0010_0000, + MythicDifficulty = 0b0000_0000_0100_0000, + Openable = 0b0000_0000_1000_0000, + BoundToAccount = 0b0000_0001_0000_0000, } diff --git a/apps/frontend/shared/components/GenericTooltip.svelte b/apps/frontend/shared/components/GenericTooltip.svelte index 6ae58f35d..a5280f854 100644 --- a/apps/frontend/shared/components/GenericTooltip.svelte +++ b/apps/frontend/shared/components/GenericTooltip.svelte @@ -1,10 +1,9 @@ - {@render children()} + {@render children?.()} diff --git a/apps/frontend/shared/components/links/WowheadTransmogSetLink.svelte b/apps/frontend/shared/components/links/WowheadTransmogSetLink.svelte index d6232fca1..034e12137 100644 --- a/apps/frontend/shared/components/links/WowheadTransmogSetLink.svelte +++ b/apps/frontend/shared/components/links/WowheadTransmogSetLink.svelte @@ -1,10 +1,9 @@ +
- + {#if children} + {@render children()} + {:else} This area is under construction and probably doesn't work very well, please be patient! - + {/if}
diff --git a/apps/frontend/shared/stores/db/enums/db-thing-content-type.ts b/apps/frontend/shared/stores/db/enums/db-thing-content-type.ts index ecf0301a8..c8ee71453 100644 --- a/apps/frontend/shared/stores/db/enums/db-thing-content-type.ts +++ b/apps/frontend/shared/stores/db/enums/db-thing-content-type.ts @@ -1,4 +1,5 @@ export enum DbThingContentType { Item = 1, Pet = 2, + Title = 3, } diff --git a/apps/frontend/types/data/item/item.ts b/apps/frontend/types/data/item/item.ts index 97ba9030c..b20b7a006 100644 --- a/apps/frontend/types/data/item/item.ts +++ b/apps/frontend/types/data/item/item.ts @@ -56,6 +56,9 @@ export class ItemDataItem { return this._appearances; } + get boundToAccount(): boolean { + return (this.flags & ItemFlags.BoundToAccount) > 0; + } get cosmetic(): boolean { return (this.flags & ItemFlags.Cosmetic) > 0; } diff --git a/apps/frontend/types/props.ts b/apps/frontend/types/props.ts index 27cda8565..c3f93def8 100644 --- a/apps/frontend/types/props.ts +++ b/apps/frontend/types/props.ts @@ -1,9 +1,15 @@ +import type { Snippet } from 'svelte'; + import type { Character } from './character'; export type CharacterProps = { character: Character; }; +export type ChildrenProp = { + children?: Snippet; +}; + export type SlugsProps = { slug1: string; slug2?: string; diff --git a/apps/frontend/user-home/components/everything/data.ts b/apps/frontend/user-home/components/everything/data.ts index 749567d15..01a1a2878 100644 --- a/apps/frontend/user-home/components/everything/data.ts +++ b/apps/frontend/user-home/components/everything/data.ts @@ -24,6 +24,11 @@ export const everythingData: Record = { achievementsKey: ['world-events', 'darkmoon-faire'], vendorsKey: ['world-events', 'darkmoon-faire'], }, + 'darkspear-dash': { + name: 'Darkspear Dash', + tag: 'event:darkspear-dash', + vendorsKey: ['world-events', 'darkspear-dash'], + }, 'day-of-the-dead': { name: 'Day of the Dead', tag: 'event:day-of-the-dead', diff --git a/apps/tool/Data/ExtraEncounters.cs b/apps/tool/Data/ExtraEncounters.cs index 133468804..301e6b339 100644 --- a/apps/tool/Data/ExtraEncounters.cs +++ b/apps/tool/Data/ExtraEncounters.cs @@ -368,5 +368,23 @@ public static partial class Hardcoded } }, #endregion Legion + + #region Midnight + // Midnight > Midnight (world bosses) + { + 1312, + new[] + { + new ExtraEncounter("Nexus Captain Leth'ir") + { + AfterEncounter = 2782, // Cragpine + }, + new ExtraEncounter("Imperator Pertinax") + { + AfterEncounter = 2782, // Cragpine + }, + } + }, + #endregion Midnight }; } diff --git a/apps/tool/Data/ExtraItemDrops.cs b/apps/tool/Data/ExtraItemDrops.cs index 4e5f698db..506614cbe 100644 --- a/apps/tool/Data/ExtraItemDrops.cs +++ b/apps/tool/Data/ExtraItemDrops.cs @@ -102,6 +102,23 @@ public static partial class Hardcoded new(87413, RaidDifficultiesNormalHeroic), // Plans: Gauntlets of Unbound Devotion ]; + private static readonly List NaigtalValWorldBosses = + [ + new(275221, RaidDifficultiesNormal), // Beast Collector's Cudgel [1h mace] + new(275220, RaidDifficultiesNormal), // Imperator's Voidedged Cutlass [1h sword] + new(275217, RaidDifficultiesNormal), // Nexus-Captain's Phaseblade [1h sword] + new(275216, RaidDifficultiesNormal), // Phaseblade's Edges [warglaive] + new(275222, RaidDifficultiesNormal), // Base Commander's Decapitator [2h sword] + new(275219, RaidDifficultiesNormal), // Pertinax's Beast Prod [stave] + new(275223, RaidDifficultiesNormal), // Phasebolt Thrower [gun] + new(275218, RaidDifficultiesNormal), // Mertei's Command Baton [wand] + + new(275224, RaidDifficultiesNormalHeroic), // Mertei's Adjutant Leggings [cloth] + new(275225, RaidDifficultiesNormalHeroic), // Toxic Voidscythe Spaulders [leather] + new(275226, RaidDifficultiesNormalHeroic), // Shredclaw Handler's Grips [mail] + new(275227, RaidDifficultiesNormalHeroic), // Leth'ir's Dress Sabatons [plate] + ]; + /* * The first number in each block is the JournalEncounter ID. If the encounter has been added * via ExtraEncounters, the number should be 1_(4 digit instance ID)_(0-based encounter index). @@ -2895,8 +2912,21 @@ public static partial class Hardcoded new(232655, RaidDifficultiesAll), // Vatwork Janitor's Wasteband ] }, - #endregion + + #region Midnight + // Midnight > Midnight > Nexus Captain Leth'ir + { + 1_1312_0, + NaigtalValWorldBosses + }, + + // Midnight > Midnight > Imperator Pertinax + { + 1_1312_1, + NaigtalValWorldBosses + }, + #endregion Midnight }; } diff --git a/apps/tool/Data/InstanceBonusIds.cs b/apps/tool/Data/InstanceBonusIds.cs index 6ed031a00..71257cefc 100644 --- a/apps/tool/Data/InstanceBonusIds.cs +++ b/apps/tool/Data/InstanceBonusIds.cs @@ -149,6 +149,12 @@ public static partial class Hardcoded { 17, 13470 }, // LFR }; + private static readonly Dictionary MidnightWorldBoss = new() + { + { 14, 13471 }, // Normal + { 15, 13472 }, // Heroic + }; + public static readonly Dictionary> InstanceBonusIds = new() { { 369, MopSiege }, // Siege of Orgrimmar @@ -233,6 +239,7 @@ public static partial class Hardcoded { 1302, WarWithinRaid }, // Manaforge Omega // Midnight + { 1312, MidnightWorldBoss }, { 1314, MidnightRaid }, // The Dreamrift { 1307, MidnightRaid }, // The Voidspire { 1308, MidnightRaid }, // March on Quel'Danas diff --git a/apps/tool/Enums/DbThingContentType.cs b/apps/tool/Enums/DbThingContentType.cs index d91681a4e..e12f49d5d 100644 --- a/apps/tool/Enums/DbThingContentType.cs +++ b/apps/tool/Enums/DbThingContentType.cs @@ -4,4 +4,5 @@ public enum DbThingContentType { Item = 1, Pet = 2, + Title = 3, } diff --git a/apps/tool/Enums/WowItemFlags1.cs b/apps/tool/Enums/WowItemFlags1.cs index f14a22bd0..a1e7fd7a5 100644 --- a/apps/tool/Enums/WowItemFlags1.cs +++ b/apps/tool/Enums/WowItemFlags1.cs @@ -5,4 +5,5 @@ public enum WowItemFlags1 { HasLootTable = 0x4, HeroicTooltip = 0x8, + BoundToAccount = 0x8_000_000, } diff --git a/apps/tool/Tools/DumpsTool.cs b/apps/tool/Tools/DumpsTool.cs index ed515a0b9..ac052840b 100644 --- a/apps/tool/Tools/DumpsTool.cs +++ b/apps/tool/Tools/DumpsTool.cs @@ -1055,6 +1055,10 @@ private async Task ImportItems(WowDbContext context) { dbItem.Flags |= WowItemFlags.Openable; } + if (itemSparse.Flags1.HasFlag(WowItemFlags1.BoundToAccount)) + { + dbItem.Flags |= WowItemFlags.BoundToAccount; + } if (itemSparse.ItemNameDescriptionID is 1641 or 13932 or 14101) { dbItem.Flags |= WowItemFlags.LookingForRaidDifficulty; diff --git a/apps/tool/Tools/JournalTool.cs b/apps/tool/Tools/JournalTool.cs index 18677add9..460d69aab 100644 --- a/apps/tool/Tools/JournalTool.cs +++ b/apps/tool/Tools/JournalTool.cs @@ -357,6 +357,9 @@ await context.WowPet OrderIndex = -i, }; + ToolContext.Logger.Information("[{instance}] Added extra encounter {id}/{name}", + instanceId, encounterId, extraEncounter.Name); + if (extraEncounter.AfterEncounter.HasValue) { for (int j = 0; j < encountersByInstanceId[instanceId].Count; j++) diff --git a/apps/web/Program.cs b/apps/web/Program.cs index 238932dde..0b388f8e9 100644 --- a/apps/web/Program.cs +++ b/apps/web/Program.cs @@ -14,7 +14,11 @@ private static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { - webBuilder.UseSentry(); + if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("SENTRY_DSN"))) + { + webBuilder.UseSentry(); + } + webBuilder.UseStartup(); }); } diff --git a/apps/web/Startup.cs b/apps/web/Startup.cs index dc568f4d8..9fe17c6d6 100644 --- a/apps/web/Startup.cs +++ b/apps/web/Startup.cs @@ -194,7 +194,7 @@ public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider, } else { - app.UseExceptionHandler("/Error"); + app.UseExceptionHandler("/error"); app.UseForwardedHeaders(); app.UseStaticFilesWithCaching(); } diff --git a/packages/csharp-lib/Enums/WowItemFlags.cs b/packages/csharp-lib/Enums/WowItemFlags.cs index 33f111763..3f52ab56f 100644 --- a/packages/csharp-lib/Enums/WowItemFlags.cs +++ b/packages/csharp-lib/Enums/WowItemFlags.cs @@ -3,12 +3,13 @@ [Flags] public enum WowItemFlags : short { - Cosmetic = 0b00_00_00_01, - CannotTransmogToThisItem = 0b00_00_00_10, - AllianceOnly = 0b00_00_01_00, - HordeOnly = 0b00_00_10_00, - LookingForRaidDifficulty = 0b00_01_00_00, - HeroicDifficulty = 0b00_10_00_00, - MythicDifficulty = 0b01_00_00_00, - Openable = 0b10_00_00_00, + Cosmetic = 0b0000_0000_0000_0001, + CannotTransmogToThisItem = 0b0000_0000_0000_0010, + AllianceOnly = 0b0000_0000_0000_0100, + HordeOnly = 0b0000_0000_0000_1000, + LookingForRaidDifficulty = 0b0000_0000_0001_0000, + HeroicDifficulty = 0b0000_0000_0010_0000, + MythicDifficulty = 0b0000_0000_0100_0000, + Openable = 0b0000_0000_1000_0000, + BoundToAccount = 0b0000_0001_0000_0000, }