Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Achievements/Duo.lua
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ function duo_rules:Check()
return
end

local in_follow_range = CheckInteractDistance(member_str, 4)
local in_follow_range = UnitInRange(member_str)
if in_follow_range then
duo_rules:ResetWarn()
return
Expand Down
3 changes: 2 additions & 1 deletion Achievements/ImpMaster.lua
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ local imp_master_achievement = CreateFrame("Frame")
_G.achievements.ImpMaster = imp_master_achievement

local blacklist_spells = {
"Summon Succcubus",
"Summon Succubus",
"Summon Incubus",
"Summon Voidwalker",
"Summon Felhunter",
}
Expand Down
3 changes: 2 additions & 1 deletion CharacterStatusScreen.lua
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ end
local f
if _G["HardcoreBuildLabel"] ~= "Cata" then
f = CreateFrame("Frame", "HardcoreOuterFrame", Panel)
f:SetFrameStrata("HIGH")
f:SetSize(400, 400)
f:SetPoint("CENTER")
f:Hide()
Expand Down Expand Up @@ -478,7 +479,7 @@ function ShowCharacterHC(_hardcore_character)
UpdateCharacterHC(
_hardcore_character,
UnitName("player"),
GetAddOnMetadata("Hardcore", "Version"),
C_AddOns.GetAddOnMetadata("Hardcore", "Version"),
f2,
class,
class_en,
Expand Down
165 changes: 106 additions & 59 deletions Dungeons.lua
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,11 @@ local function DungeonTrackerGetDungeonMaxLevel(name)
if Hardcore_Character.game_version ~= nil then
if Hardcore_Character.game_version == "Era" or Hardcore_Character.game_version == "SoM" then
max_level = dt_db_max_levels[name][1]
elseif Hardcore_Character.game_version == "WotLK" or Hardcore_Character.game_version == "Cata" then
elseif Hardcore_Character.game_version == "TBC" then
max_level = dt_db_max_levels[name][2]
elseif Hardcore_Character.game_version == "WotLK" or Hardcore_Character.game_version == "Cata" then
-- WotLK/Cata is now the 3rd column
max_level = dt_db_max_levels[name][3]
end
end
end
Expand All @@ -107,16 +110,31 @@ end
-- This is used to see if previous runs may have been under another version of the
-- game where the max levels were different

-- [[ Dungeons.lua ]]

local function DungeonTrackerGetDungeonMaxLevelAtRunTime(run)

-- If we are in cata now, but the run started before pre-patch day, we use the WotLK max level (if it was differen than Cata)
if _G["HardcoreBuildLabel"] == "Cata" and run.start ~= nil and _dt_db_wotlk_max_levels[ run.name ] ~= nil then
-- 1. EXISTING CATA CHECK (Keep this)
-- If we are in cata now, but the run started before pre-patch day, we use the WotLK max level
if _G["HardcoreBuildLabel"] == "Cata" and run.start ~= nil and _dt_db_wotlk_max_levels ~= nil and _dt_db_wotlk_max_levels[ run.name ] ~= nil then
if run.start < 1714482000 then -- Wed 30 April 2024, 15:00 PDT
return _dt_db_wotlk_max_levels[ run.name ]
end
end

-- Default to the current version's max level if not Cata
-- 2. NEW GRANDFATHER CLAUSE
-- If we are on TBC (or MoP), and the run happened before the patch fix (Jan 17, 2026),
-- we return 1000 (Unlimited) to ensure they pass validation.
-- Timestamp: 1768694400 is roughly Jan 18, 2026 00:00 UTC
local grandfather_cutoff = 1768694400

if (Hardcore_Character.game_version == "TBC" or Hardcore_Character.game_version == "MoP") and run.start ~= nil then
if run.start < grandfather_cutoff then
return 1000 -- Treats the dungeon as having "No Max Level" for runs done before today
end
end

-- Default to the current version's max level for all new runs
return DungeonTrackerGetDungeonMaxLevel(run.name)
end

Expand All @@ -131,12 +149,17 @@ function DungeonTrackerGetAllDungeonMaxLevels()

for i, v in pairs(dt_db) do
if v[4] == "D" then
local max_era_level = v[7][1]
if max_era_level == 1000 then
table.insert(the_table, { v[3], "--", v[7][2] })
else
table.insert(the_table, { v[3], max_era_level, v[7][2] })
end
local max_era = v[7][1]
local max_tbc = v[7][2]
local max_wotlk = v[7][3]

-- Handle "1000" (Unlimited) for display purposes
if max_era == 1000 then max_era = "--" end
if max_tbc == 1000 then max_tbc = "--" end
if max_wotlk == 1000 then max_wotlk = "--" end

-- Return all three
table.insert(the_table, { v[3], max_era, max_tbc, max_wotlk })
end
end

Expand Down Expand Up @@ -197,7 +220,7 @@ local function DungeonTrackerFindMissingRunsFromQuests()
if Hardcore_Character.game_version == "Era" or Hardcore_Character.game_version == "SoM" then
game_version_index = 1
game_version_max_level = 60
elseif Hardcore_Character.game_version == "WotLK" or Hardcore_Character.game_version == "Cata" then
elseif Hardcore_Character.game_version == "WotLK" or Hardcore_Character.game_version == "Cata" or Hardcore_Character.game_version == "MoP" then
game_version_index = 2
game_version_max_level = 80
else
Expand Down Expand Up @@ -287,6 +310,28 @@ local function DungeonTrackerAnyRunNamesRepeated()
return false
end

-- GetExpansionMaxLevel()
--
-- Returns the maximum level for the current character's game version.

local function GetExpansionMaxLevel()
local max_level = 60 -- Default fallback
if Hardcore_Character.game_version ~= nil then
if Hardcore_Character.game_version == "Era" or Hardcore_Character.game_version == "SoM" then
max_level = 60
elseif Hardcore_Character.game_version == "TBC" then
max_level = 70
elseif Hardcore_Character.game_version == "WotLK" then
max_level = 80
elseif Hardcore_Character.game_version == "Cata" then
max_level = 85
elseif Hardcore_Character.game_version == "MoP" then
max_level = 90
end
end
return max_level
end

-- DungeonTrackerUpdateInfractions()
--
-- Updates the dt.overleveled_runs and dt.repeated_runs variables
Expand All @@ -296,17 +341,28 @@ end
local function DungeonTrackerUpdateInfractions()
local repeated = 0
local over_leveled = 0
local expansion_max_level = GetExpansionMaxLevel()

for i = 1, #Hardcore_Character.dt.runs do
-- Check overleveled run
if Hardcore_Character.dt.runs[i].level > DungeonTrackerGetDungeonMaxLevelAtRunTime(Hardcore_Character.dt.runs[i]) then
over_leveled = over_leveled + 1
end
-- Check if the run is repeated further down in the array (this prevents counting runs twice when i ends up at j)
for j = i + 1, #Hardcore_Character.dt.runs do
if DungeonTrackerIsRepeatedRun(Hardcore_Character.dt.runs[i], Hardcore_Character.dt.runs[j]) then
repeated = repeated + 1
-- Only count infractions if the run was completed BEFORE reaching max level
if Hardcore_Character.dt.runs[i].level < expansion_max_level then

-- Check overleveled run
if Hardcore_Character.dt.runs[i].level > DungeonTrackerGetDungeonMaxLevelAtRunTime(Hardcore_Character.dt.runs[i]) then
over_leveled = over_leveled + 1
end

-- Check if the run is repeated further down in the array
-- (prevents counting runs twice when i ends up at j)
for j = i + 1, #Hardcore_Character.dt.runs do
-- The repeat only counts if the subsequent run was ALSO done before max level
if Hardcore_Character.dt.runs[j].level < expansion_max_level then
if DungeonTrackerIsRepeatedRun(Hardcore_Character.dt.runs[i], Hardcore_Character.dt.runs[j]) then
repeated = repeated + 1
end
end
end

end
end

Expand Down Expand Up @@ -343,24 +399,15 @@ local function DungeonTrackerWarnInfraction()
end

-- Get max level to know if we should even warn
if Hardcore_Character.game_version ~= nil then
local max_level
if Hardcore_Character.game_version == "Era" or Hardcore_Character.game_version == "SoM" then
max_level = 60
elseif Hardcore_Character.game_version == "WotLK" then
max_level = 80
else -- Cataclysm or anything else
max_level = 85
end
if UnitLevel("player") >= max_level then
Hardcore_Character.dt.warn_infractions = false
return
end
local max_expansion_level = GetExpansionMaxLevel()
if UnitLevel("player") >= max_expansion_level then
Hardcore_Character.dt.warn_infractions = false
return
end

-- See if the player's level is allowed in this dungeon
local max_level = DungeonTrackerGetDungeonMaxLevel(Hardcore_Character.dt.current.name)
if Hardcore_Character.dt.current.level > max_level then
local max_dungeon_level = DungeonTrackerGetDungeonMaxLevel(Hardcore_Character.dt.current.name)
if Hardcore_Character.dt.current.level > max_dungeon_level then
Hardcore_Character.dt.current.last_warn = Hardcore_Character.dt.current.time_inside
message = "You are overleveled for " .. Hardcore_Character.dt.current.name .. ". Leave dungeon now!"
Hardcore:Print(chat_color .. message)
Expand All @@ -370,36 +417,36 @@ local function DungeonTrackerWarnInfraction()
-- See if this dungeon was already in the list of completed runs, and warn every so many seconds if that is so
for i, v in ipairs(Hardcore_Character.dt.runs) do
if DungeonTrackerIsRepeatedRun(v, Hardcore_Character.dt.current) then
Hardcore_Character.dt.current.last_warn = Hardcore_Character.dt.current.time_inside
local instance_info1 = ""
local instance_info2 = ""
if v.iid ~= nil and Hardcore_Character.dt.current.iid ~= nil and v.iid ~= Hardcore_Character.dt.current.iid then
instance_info1 = " (ID:" .. Hardcore_Character.dt.current.iid .. ")"
instance_info2 = " (ID:" .. v.iid .. ")"
-- We only care if the previous run was ALSO done under max level
if v.level < max_expansion_level then
Hardcore_Character.dt.current.last_warn = Hardcore_Character.dt.current.time_inside
local instance_info1 = ""
local instance_info2 = ""
if v.iid ~= nil and Hardcore_Character.dt.current.iid ~= nil and v.iid ~= Hardcore_Character.dt.current.iid then
instance_info1 = " (ID:" .. Hardcore_Character.dt.current.iid .. ")"
instance_info2 = " (ID:" .. v.iid .. ")"
end
message = "You entered " .. v.name .. instance_info1 .. " already on " .. v.date .. instance_info2
.. ". Leave dungeon now!"
Hardcore:Print( chat_color .. message)
Hardcore:ShowRedAlertFrame( message )
break -- No need to warn about 3rd and higher entries
end
message = "You entered " .. v.name .. instance_info1 .. " already on " .. v.date .. instance_info2
.. ". Leave dungeon now!"
Hardcore:Print( chat_color .. message)
Hardcore:ShowRedAlertFrame( message )
break -- No need to warn about 3rd and higher entries
end
end

-- The following code probably can't ever be called, since pending runs with different instance IDs are automatically
-- logged upon entry. But let's keep it here for now. Better warned twice, than never.
-- See if this dungeon was already in the list of pending runs (but with a different instanceID), and warn every so many seconds if that is so
-- See if this dungeon was already in the list of pending runs
for i, v in ipairs(Hardcore_Character.dt.pending) do
-- We never warn about pending runs without an instanceID, they may or may not be the same as the current
-- (However, such pending runs should not exist, as they are deleted immediately when you exit the dungeon)
-- It is not possible for the IIDs to be the same at this point, as they would have been merged already
if v.iid ~= nil and Hardcore_Character.dt.current.iid ~= nil then
if DungeonTrackerIsRepeatedRun(v, Hardcore_Character.dt.current) then
Hardcore_Character.dt.current.last_warn = Hardcore_Character.dt.current.time_inside
message = "Your idle run of " .. v.name .. " of date ".. v.date .. " has another instance ID"
.. ". Leave dungeon now!"
Hardcore:Print( chat_color .. message )
Hardcore:ShowRedAlertFrame( message )
break -- No need to warn about 3rd and higher entries
if v.level < max_expansion_level then
Hardcore_Character.dt.current.last_warn = Hardcore_Character.dt.current.time_inside
message = "Your idle run of " .. v.name .. " of date ".. v.date .. " has another instance ID"
.. ". Leave dungeon now!"
Hardcore:Print( chat_color .. message )
Hardcore:ShowRedAlertFrame( message )
break -- No need to warn about 3rd and higher entries
end
end
end
end
Expand Down Expand Up @@ -709,7 +756,7 @@ local function DungeonTrackerSendPulse(now)
end
local data = name
.. COMM_FIELD_DELIM
.. GetAddOnMetadata("Hardcore", "Version")
.. C_AddOns.GetAddOnMetadata("Hardcore", "Version")
.. COMM_FIELD_DELIM
.. now
.. COMM_FIELD_DELIM
Expand Down Expand Up @@ -1088,7 +1135,7 @@ local function DungeonTrackerCheckVersions()
for i,v in ipairs( party ) do
if v == UnitName("player") then
local my_status = Hardcore:GetCleanVerificationStatus()
message = message .. v .. ":" .. GetAddOnMetadata("Hardcore", "Version") .. " [" .. my_status .. "]"
message = message .. v .. ":" .. C_AddOns.GetAddOnMetadata("Hardcore", "Version") .. " [" .. my_status .. "]"
else
message = message .. v .. ":"
if dt_party_member_addon_version[ v ] ~= nil then
Expand Down
Loading