- Track honorable kills outside battlegrounds (open world PvP)
- Track deaths from enemy players in world PvP
- Track honor earned from world kills
- Dedicated "World" card in stats panel (matches BG card style)
- K/D ratio display with color-coded win/loss
- Session stats (today) vs lifetime tracking
- World PvP stats in Today panel, minimap tooltip, and
/honorlog stats - Test commands:
/hl test kill,/hl test death
- Drag-to-resize via bottom-right grip
- Custom size persistence across sessions
- Min/max size constraints (220-450 width, 60-400 height)
- Toggle resizing via context menu or slash command
- Reset to default size option
Allow players to set gear goals and track progress toward purchasing PvP items. Shows honor/marks/arena points needed and estimates games remaining based on personal performance data.
- As a PvP player, I want to set a gear piece as my goal so I can see how close I am
- As a PvP player, I want to see estimated games remaining based on MY average honor gains
- As a PvP player, I want to track multiple goals simultaneously (unlimited)
- As a PvP player, I want the addon to know PvP gear costs without manual entry
- As a PvP player, I want to track arena gear goals alongside honor gear
Chosen approach: Tab-based view switching in expanded mode
- Header gets two small tab buttons: "Stats" | "Goals"
- Stats view = current BG cards + session panel
- Goals view = goal cards + "Add Goal" button
- Same frame size, clean integration
- Create PvP gear database structure
- Populate TBC Honor gear (Rare PvP sets)
- Populate TBC Arena gear (Gladiator sets S1-S4)
- Populate Mark vendor items (each BG type)
- Add goals data structure to SavedVariables
- Add API:
GetCurrentHonor(),GetCurrentArenaPoints() - Add API:
GetCurrentMarks(bgType) - Add API:
GetAverageHonorPerGame(),GetAverageMarksPerGame(bgType) - Add API:
GetArenaPointsPerWeek()(estimate based on rating if available)
- Goal data structure:
{ itemID, addedAt, priority } -
AddGoal(itemID)- add item to goals list -
RemoveGoal(itemID)- remove from goals -
ReorderGoal(itemID, newPosition)- change priority -
GetGoals()- return all goals with progress calculated -
GetGoalProgress(itemID)- returns { current, needed, percent, gamesRemaining } - Auto-remove completed goals option
- Add tab buttons to header ("Stats" | "Goals")
- Create goals container (same size as expanded stats)
- Goal card component:
┌─────────────────────────────────────────┐ │ [Icon] Gladiator's Plate Helm [X] │ │ ████████████░░░░░░ 12,500 / 14,500 │ │ 86% • ~6 games • 1,875 Arena Pts │ └─────────────────────────────────────────┘ - "Add Goal" button at bottom
- Empty state: "No goals set. Click + to add one!"
- Goal completion indicator (checkmark, glow)
- Modal/popup frame for item selection
- Category tabs: Armor | Weapons | Accessories | Off-pieces
- Slot filter dropdown (Head, Chest, etc.)
- Class filter (show only usable items)
- Search box for item name
- Item rows with: Icon, Name, Cost breakdown, "Add" button
- Hover shows full item tooltip
- Shift-click item anywhere to quick-add (if valid PvP item)
- Goal completion celebration (message notification)
- "You can afford this!" notification (Ready to purchase!)
- Tooltip on goal card shows full breakdown
- Goals in LDB tooltip
-
/honorlog goal add <itemlink>command -
/honorlog goal listcommand -
/honorlog goal clearcommand - Export goals with stats
-- Data/GearDatabase.lua
HonorLog.GearDB = {
-- Format: [itemID] = { slot, class, honor, arena, marks }
-- marks = { AV = n, AB = n, WSG = n, EotS = n }
-- Example: Gladiator's Plate Helm (Warrior)
[30486] = {
slot = "HEAD",
class = "WARRIOR",
honor = 14500,
arena = 1875,
marks = {},
},
-- Example: Mark-only item
[28915] = {
slot = "NECK",
class = nil, -- any class
honor = 0,
arena = 0,
marks = { AV = 30, AB = 30, WSG = 30, EotS = 0 },
},
}
-- Slot constants for filtering
HonorLog.SLOTS = {
"HEAD", "NECK", "SHOULDER", "BACK", "CHEST",
"WRIST", "HANDS", "WAIST", "LEGS", "FEET",
"FINGER", "TRINKET", "MAIN_HAND", "OFF_HAND",
"TWO_HAND", "RANGED", "RELIC"
}
-- Class constants
HonorLog.CLASSES = {
"WARRIOR", "PALADIN", "HUNTER", "ROGUE", "PRIEST",
"SHAMAN", "MAGE", "WARLOCK", "DRUID"
}-- Per-character goals
HonorLogCharDB.goals = {
items = {
-- { itemID = 30486, addedAt = timestamp, priority = 1 },
-- { itemID = 28915, addedAt = timestamp, priority = 2 },
},
settings = {
autoRemoveCompleted = false,
showInLDB = true,
celebrateCompletion = true,
},
-- No goal limit (unlimited)
}-- Honor (TBC uses currency system)
local function GetCurrentHonor()
-- TBC Classic Anniversary
if GetHonorCurrency then
return GetHonorCurrency()
end
-- Fallback
return 0
end
-- Arena Points
local function GetCurrentArenaPoints()
if GetArenaCurrency then
return GetArenaCurrency()
end
return 0
end
-- Marks (items in bags)
local MARK_ITEMS = {
AV = 20560, -- Alterac Valley Mark of Honor
AB = 20559, -- Arathi Basin Mark of Honor
WSG = 20558, -- Warsong Gulch Mark of Honor
EotS = 29024, -- Eye of the Storm Mark of Honor
}
local function GetCurrentMarks(bgType)
local itemID = MARK_ITEMS[bgType]
if itemID then
return GetItemCount(itemID, true) -- true = include bank
end
return 0
endfunction HonorLog:EstimateGamesRemaining(itemID)
local item = self.GearDB[itemID]
if not item then return nil end
local result = {
honor = { needed = 0, current = 0, remaining = 0, games = 0 },
arena = { needed = 0, current = 0, remaining = 0, weeks = 0 },
marks = {},
}
-- Honor calculation
if item.honor > 0 then
result.honor.needed = item.honor
result.honor.current = self:GetCurrentHonor()
result.honor.remaining = math.max(0, item.honor - result.honor.current)
local avgHonor = self:GetAverageHonorPerGame()
if avgHonor > 0 then
result.honor.games = math.ceil(result.honor.remaining / avgHonor)
end
end
-- Arena calculation
if item.arena > 0 then
result.arena.needed = item.arena
result.arena.current = self:GetCurrentArenaPoints()
result.arena.remaining = math.max(0, item.arena - result.arena.current)
-- Weeks estimate would need rating-based calculation
end
-- Marks calculation
for bgType, count in pairs(item.marks or {}) do
if count > 0 then
local current = self:GetCurrentMarks(bgType)
local remaining = math.max(0, count - current)
local avgMarks = self:GetAverageMarksPerGame(bgType)
result.marks[bgType] = {
needed = count,
current = current,
remaining = remaining,
games = avgMarks > 0 and math.ceil(remaining / avgMarks) or 0,
}
end
end
return result
end- Warrior, Paladin, Hunter, Rogue, Priest, Shaman, Mage, Warlock, Druid sets
- Weapons (various)
- All class sets + weapons
- All class sets + weapons
- All class sets + weapons
- High Warlord's/Grand Marshal's weapons
- Veteran's/Vindicator's armor sets
- PvP accessories (trinkets, rings, necks)
- AV: Frostwolf/Stormpike reputation items
- AB: Honor+mark items
- WSG: Honor+mark items
- EotS: Honor+mark items
- Hourly honor rate calculation based on session duration
- Display in session panel, minimap tooltip, and goals panel
- Session stats bar showing rate and total gains
- Combat log parsing for damage/healing/KB
- Track improvement over time
- Correlate stats with win/loss
- Note system for enemy players
- Track encounter frequency
- Identify premade groups
- Track arena matches
- Rating history
- Team composition stats