Skip to content
29 changes: 17 additions & 12 deletions apps/backend/Jobs/Data/DataAuctionsJob.cs
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,8 @@ public override async Task Run(string[] data)
Dictionary<int, List<ApiDataAuctionsAuction>> 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");
Expand All @@ -182,6 +183,7 @@ public override async Task Run(string[] data)
await Task.Delay(100);
}
}

timer.AddPoint("Lock");

// Get current partitions
Expand Down Expand Up @@ -300,9 +302,9 @@ await db.HashSetAsync(

private async Task<
(
Dictionary<int, List<ApiDataAuctionsAuction>> appearanceIds,
Dictionary<string, List<ApiDataAuctionsAuction>> appearanceSources,
Dictionary<int, List<ApiDataAuctionsAuction>> commodities
Dictionary<int, List<ApiDataAuctionsAuction>> appearanceIds,
Dictionary<string, List<ApiDataAuctionsAuction>> appearanceSources,
Dictionary<int, List<ApiDataAuctionsAuction>> commodities
)
> WriteAuctionData(NpgsqlBinaryImporter writer, int connectedRealmId, List<ApiDataAuctionsAuction> dataAuctions)
{
Expand Down Expand Up @@ -342,16 +344,19 @@ Dictionary<int, List<ApiDataAuctionsAuction>> 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)
Expand Down
8 changes: 4 additions & 4 deletions apps/backend/Jobs/User/UserUploadJob.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down
20 changes: 15 additions & 5 deletions apps/backend/Models/Cache/ItemModifiedAppearanceCache.cs
Original file line number Diff line number Diff line change
@@ -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<int, (int, short)> IdToItemIdAndModifier = new();
public readonly Dictionary<(int, short), int> ItemIdAndModifierToAppearanceId = new();
public readonly Dictionary<int, ItemModifiedAppearance> ById = new();
public readonly Dictionary<(int, short), ItemModifiedAppearance> ByItemIdAndModifier = new();
public readonly Dictionary<int, short[]> ModifiersByItemId;

public ItemModifiedAppearanceCache(WowItemModifiedAppearance[] itemModifiedAppearances)
Expand All @@ -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))
{
Expand All @@ -31,4 +39,6 @@ public ItemModifiedAppearanceCache(WowItemModifiedAppearance[] itemModifiedAppea
kvp => kvp.Value.Order().ToArray()
);
}

public record ItemModifiedAppearance(int AppearanceId, int ItemId, short Modifier, bool Collectable);
}
4 changes: 2 additions & 2 deletions apps/backend/Services/MemoryCacheService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -122,8 +122,8 @@ public async Task<ItemModifiedAppearanceCache> 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);
Expand Down
5 changes: 5 additions & 0 deletions apps/frontend/components/achievements/ScoreSummary.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@
nulls++;
continue;
}

if (category.slug.endsWith('-hidden')) {
continue;
}

if (nulls === 0) {
retNormal.push(category);
} else if (nulls === 1) {
Expand Down
4 changes: 2 additions & 2 deletions apps/frontend/components/auctions/AuctionsSpecificItem.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -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));
</script>

<style lang="scss">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
class:status-shrug={userHas && currentRank < totalRanks}
class:status-fail={!userHas}
>
{#each { length: 3 }, index}
{#each { length: Math.max(totalRanks, 3) }, index}
<WowheadLink
id={index === 0 ? ability.spellId : ability.extraRanks[index - 1][1]}
type="spell"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,12 @@
.settings-icon {
cursor: pointer;
position: relative;
width: 24px;
}
.options-connector {
border-top: 1px solid #ddd;
border-top: 1px solid var(--border-color);
height: 1px;
left: 15px;
left: 9px;
position: absolute;
top: 50%;
transform: translateX(100%);
Expand All @@ -58,7 +59,7 @@
padding: 0.2rem 0.4rem;
position: absolute;
top: 0;
right: 0;
right: -8px;
transform: translateX(100%);
}
</style>
Expand Down
128 changes: 128 additions & 0 deletions apps/frontend/data/enchants.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
import { InventorySlot } from '@/enums/inventory-slot';
import type { Character } from '@/types/character';

// SpellItemEnchantment.db2
export const validEnchants: Record<number, number[]> = {
[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<number, SpecialValidEnchant> = {
// 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;
}
Loading
Loading