New feature: Boss tactics
All checks were successful
forgejo/Czech Quests/addon/pipeline/head This commit looks good
All checks were successful
forgejo/Czech Quests/addon/pipeline/head This commit looks good
This commit is contained in:
parent
6c2381d65c
commit
9fe284c18e
11 changed files with 21493 additions and 271 deletions
|
@ -116,6 +116,22 @@ local function InitSpeeches()
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function InitTactics()
|
||||||
|
local function Update(name, value)
|
||||||
|
CzechQuestsAddon_Store.config[name] = value
|
||||||
|
addon.TacticFrame:UpdateSettings()
|
||||||
|
end
|
||||||
|
|
||||||
|
local layout = Options.layout
|
||||||
|
layout:AddInitializer(CreateSettingsListSectionHeaderInitializer("Taktiky"))
|
||||||
|
|
||||||
|
CreateCheckbox("TACTIC_ENABLED", "Zapnout", Update)
|
||||||
|
|
||||||
|
CreateDropdown("TACTIC_TEXT_FONT_NAME", "Pismo *", addon.API.GetFontContainer, Update)
|
||||||
|
|
||||||
|
CreateSlider("TACTIC_TEXT_FONT_SIZE", "Velikost pisma *", 10, 30, 1, Update)
|
||||||
|
end
|
||||||
|
|
||||||
local function InitOthers()
|
local function InitOthers()
|
||||||
local layout = Options.layout
|
local layout = Options.layout
|
||||||
layout:AddInitializer(CreateSettingsListSectionHeaderInitializer("Ostatni"))
|
layout:AddInitializer(CreateSettingsListSectionHeaderInitializer("Ostatni"))
|
||||||
|
@ -131,6 +147,7 @@ local function InitOptions()
|
||||||
|
|
||||||
InitQuests()
|
InitQuests()
|
||||||
InitSpeeches()
|
InitSpeeches()
|
||||||
|
InitTactics()
|
||||||
InitOthers()
|
InitOthers()
|
||||||
|
|
||||||
Settings.RegisterAddOnCategory(category)
|
Settings.RegisterAddOnCategory(category)
|
||||||
|
|
214
Addon/Code/Tactic.lua
Executable file
214
Addon/Code/Tactic.lua
Executable file
|
@ -0,0 +1,214 @@
|
||||||
|
local _, addon = ...
|
||||||
|
|
||||||
|
local TACTIC_TAB_ID = 9
|
||||||
|
|
||||||
|
local CURRENT_TAB_ID = 0
|
||||||
|
local PREVIOUS_TAB_ID = 0
|
||||||
|
|
||||||
|
local ENCOUNTER_ID = 0
|
||||||
|
local DIFFICULTY = 0
|
||||||
|
|
||||||
|
local function HideOtherContent()
|
||||||
|
local frames = { "overviewScroll", "LootContainer", 'detailsScroll', 'model', 'encounterTitle' }
|
||||||
|
for _, frame in ipairs(frames) do
|
||||||
|
EncounterJournal.encounter.info[frame]:Hide();
|
||||||
|
end
|
||||||
|
|
||||||
|
local tabs = { "overviewTab", "lootTab", "bossTab", "modelTab" }
|
||||||
|
for _, tab in ipairs(tabs) do
|
||||||
|
EncounterJournal.encounter.info[tab].selected:Hide();
|
||||||
|
EncounterJournal.encounter.info[tab].unselected:Show();
|
||||||
|
EncounterJournal.encounter.info[tab]:UnlockHighlight();
|
||||||
|
end
|
||||||
|
|
||||||
|
if EncounterJournal.encounter.info.creatureButtons then
|
||||||
|
for _, button in pairs(EncounterJournal.encounter.info.creatureButtons) do
|
||||||
|
button:Hide()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
addon.TacticFrame:ClearHeaders()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function RenderBossTactics(frame, bossName)
|
||||||
|
HideOtherContent()
|
||||||
|
local bossData = addon.data.tactic[bossName]
|
||||||
|
|
||||||
|
local difficulty = 'lfr' -- 17
|
||||||
|
if DIFFICULTY == 14 then
|
||||||
|
difficulty = 'normal'
|
||||||
|
elseif DIFFICULTY == 15 then
|
||||||
|
difficulty = 'heroic'
|
||||||
|
elseif DIFFICULTY == 16 then
|
||||||
|
difficulty = 'mythic'
|
||||||
|
elseif DIFFICULTY == 1 then
|
||||||
|
difficulty = 'normal'
|
||||||
|
elseif DIFFICULTY == 2 then
|
||||||
|
difficulty = 'heroic'
|
||||||
|
elseif DIFFICULTY == 23 then
|
||||||
|
difficulty = 'mythic'
|
||||||
|
end
|
||||||
|
|
||||||
|
local tactic = bossData and bossData[1][difficulty] or nil
|
||||||
|
|
||||||
|
if not tactic then
|
||||||
|
frame.summary:SetText("Boss " .. bossName .. " nemá pro tuto obtížnost přeloženou taktiku.")
|
||||||
|
frame:GetParent():Show()
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local function CreateHeaderDescription(data)
|
||||||
|
local description = ""
|
||||||
|
for _, item in ipairs(data) do
|
||||||
|
description = description
|
||||||
|
.. item.name .. "\n"
|
||||||
|
.. "|cff003366" .. item.description .. "|r "
|
||||||
|
.. "|cff004400" .. item.howTo .. "|r "
|
||||||
|
.. "|cff8b0000" .. item.dangerous .. "|r"
|
||||||
|
.. "\n\n"
|
||||||
|
end
|
||||||
|
return description
|
||||||
|
end
|
||||||
|
|
||||||
|
frame.summary:SetText(tactic.summary)
|
||||||
|
|
||||||
|
local tankHeader = frame:CreateHeader()
|
||||||
|
tankHeader.button.title:SetText("Tank")
|
||||||
|
tankHeader.description:SetText(CreateHeaderDescription(tactic.tank))
|
||||||
|
|
||||||
|
local healHeader = frame:CreateHeader()
|
||||||
|
healHeader.button.title:SetText("Healer")
|
||||||
|
healHeader.description:SetText(CreateHeaderDescription(tactic.heal))
|
||||||
|
|
||||||
|
local dpsHeader = frame:CreateHeader()
|
||||||
|
dpsHeader.button.title:SetText("DPS")
|
||||||
|
dpsHeader.description:SetText(CreateHeaderDescription(tactic.dps))
|
||||||
|
|
||||||
|
frame:GetParent():Show()
|
||||||
|
frame:UpdateHeaderPositions()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function CreateCreaturesDropdown()
|
||||||
|
local frame = addon.TacticFrame
|
||||||
|
local encounterName = EJ_GetEncounterInfo(ENCOUNTER_ID)
|
||||||
|
|
||||||
|
local options = {}
|
||||||
|
local selectedValue = nil
|
||||||
|
|
||||||
|
for i = 1, 10 do
|
||||||
|
local id, name = EJ_GetCreatureInfo(i);
|
||||||
|
if id then
|
||||||
|
if addon.data.tactic[name] then
|
||||||
|
table.insert(options, { name, name })
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if #options > 0 then
|
||||||
|
selectedValue = options[1][2]
|
||||||
|
end
|
||||||
|
|
||||||
|
local function IsSelected(value)
|
||||||
|
return value == selectedValue
|
||||||
|
end
|
||||||
|
|
||||||
|
local function SetSelected(value)
|
||||||
|
if value then
|
||||||
|
RenderBossTactics(addon.TacticFrame, value)
|
||||||
|
end
|
||||||
|
selectedValue = value
|
||||||
|
end
|
||||||
|
|
||||||
|
MenuUtil.CreateRadioMenu(frame.dropdown, IsSelected, SetSelected, unpack(options))
|
||||||
|
|
||||||
|
if #options > 0 then
|
||||||
|
SetSelected(selectedValue)
|
||||||
|
end
|
||||||
|
|
||||||
|
if #options == 0 then
|
||||||
|
frame.summary:SetText("V souboji " .. encounterName .. " není boss, který má přeloženou taktikou.")
|
||||||
|
frame:GetParent():Show()
|
||||||
|
frame.dropdown:Hide()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function HideTacticNpcs()
|
||||||
|
addon.TacticFrame:GetParent():Hide()
|
||||||
|
addon.TacticFrame.dropdown:Hide()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function ShowTacticNpcs()
|
||||||
|
CURRENT_TAB_ID = TACTIC_TAB_ID
|
||||||
|
HideOtherContent()
|
||||||
|
|
||||||
|
local frame = addon.TacticFrame
|
||||||
|
|
||||||
|
frame.tab:SetHighlight(true);
|
||||||
|
frame.dropdown:Show()
|
||||||
|
|
||||||
|
EncounterJournal.encounter.info.rightShadow:Show()
|
||||||
|
EncounterJournal.encounter.info.difficulty:Show()
|
||||||
|
|
||||||
|
CreateCreaturesDropdown()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function SetupCustomTab()
|
||||||
|
addon.TacticFrame.tab:SetScript("OnClick", function()
|
||||||
|
ShowTacticNpcs()
|
||||||
|
end)
|
||||||
|
|
||||||
|
hooksecurefunc("EncounterJournal_DisplayEncounter", function(encounterID)
|
||||||
|
ENCOUNTER_ID = encounterID
|
||||||
|
addon.TacticFrame.tab:SetActive(true);
|
||||||
|
|
||||||
|
if CURRENT_TAB_ID == TACTIC_TAB_ID then
|
||||||
|
ShowTacticNpcs()
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
hooksecurefunc("EncounterJournal_DisplayInstance", function()
|
||||||
|
addon.TacticFrame.tab:SetActive(false);
|
||||||
|
end)
|
||||||
|
|
||||||
|
hooksecurefunc("EncounterJournal_SetTab", function(tabId)
|
||||||
|
if CURRENT_TAB_ID ~= tabId then
|
||||||
|
addon.TacticFrame.tab:SetHighlight(false);
|
||||||
|
end
|
||||||
|
|
||||||
|
PREVIOUS_TAB_ID = CURRENT_TAB_ID
|
||||||
|
CURRENT_TAB_ID = tabId
|
||||||
|
HideTacticNpcs()
|
||||||
|
end)
|
||||||
|
|
||||||
|
hooksecurefunc("EncounterJournalBossButton_OnClick", function(encounterID)
|
||||||
|
if PREVIOUS_TAB_ID == TACTIC_TAB_ID then
|
||||||
|
ShowTacticNpcs()
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
hooksecurefunc("EncounterJournal_UpdateDifficulty", function(difficulty)
|
||||||
|
DIFFICULTY = difficulty
|
||||||
|
if PREVIOUS_TAB_ID == TACTIC_TAB_ID and ENCOUNTER_ID then
|
||||||
|
ShowTacticNpcs()
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function InitTactics()
|
||||||
|
local frame = addon.TacticFrame
|
||||||
|
|
||||||
|
-- Register EncounterJournal events
|
||||||
|
frame:RegisterEvent("ADDON_LOADED")
|
||||||
|
|
||||||
|
frame:SetScript("OnEvent", function(self, event, addonName)
|
||||||
|
if not CzechQuestsAddon_Store.config.TACTIC_ENABLED then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if addonName == 'Blizzard_EncounterJournal' then
|
||||||
|
addon.TacticFrame:Init()
|
||||||
|
SetupCustomTab()
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
addon.API.InitTactics = InitTactics
|
201
Addon/Code/TacticFrame.lua
Executable file
201
Addon/Code/TacticFrame.lua
Executable file
|
@ -0,0 +1,201 @@
|
||||||
|
local _, addon = ...
|
||||||
|
|
||||||
|
local TacticFrame = CreateFrame("Frame", nil)
|
||||||
|
TacticFrame:Hide()
|
||||||
|
|
||||||
|
addon.TacticFrame = TacticFrame
|
||||||
|
TacticFrame.headers = {}
|
||||||
|
|
||||||
|
local NEXT_HEADER_ID = 0
|
||||||
|
|
||||||
|
function TacticFrame:Init()
|
||||||
|
local frame = self
|
||||||
|
|
||||||
|
if not EncounterJournal or not EncounterJournal.encounter or not EncounterJournal.encounter.info then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local scrollFrame = CreateFrame("ScrollFrame", "$parentOverviewScrollFrame", EncounterJournal.encounter.info, "ScrollFrameTemplate")
|
||||||
|
|
||||||
|
scrollFrame:SetSize(330, 370)
|
||||||
|
scrollFrame:SetPoint("TOPLEFT", EncounterJournal.encounter.info.overviewScroll, "TOPLEFT", 0, -7)
|
||||||
|
|
||||||
|
scrollFrame.scrollBarX = -25
|
||||||
|
scrollFrame.scrollBarTopY = -6
|
||||||
|
scrollFrame.scrollBarBottomY = 6
|
||||||
|
|
||||||
|
frame:SetParent(scrollFrame)
|
||||||
|
frame:SetSize(scrollFrame:GetWidth() - 10, 1)
|
||||||
|
frame:Show()
|
||||||
|
|
||||||
|
scrollFrame:SetScrollChild(frame)
|
||||||
|
|
||||||
|
frame.summary = addon.API.CreateCzechFont(
|
||||||
|
frame,
|
||||||
|
CzechQuestsAddon_Store.config.TACTIC_TEXT_FONT_NAME,
|
||||||
|
CzechQuestsAddon_Store.config.TACTIC_TEXT_FONT_SIZE
|
||||||
|
)
|
||||||
|
frame.summary:SetTextColor(0.251, 0.145, 0.012)
|
||||||
|
frame.summary:SetPoint("TOPLEFT", frame, "TOPLEFT", 2, 0)
|
||||||
|
frame.summary:SetWidth(scrollFrame:GetWidth() - 10)
|
||||||
|
|
||||||
|
local dropdown = CreateFrame("DropdownButton", nil, EncounterJournal.encounter.info, "WowStyle1DropdownTemplate")
|
||||||
|
dropdown:SetPoint("BOTTOMRIGHT", EncounterJournal.encounter.info.encounterTitle, "BOTTOMRIGHT", 2, -2)
|
||||||
|
dropdown:SetWidth(200)
|
||||||
|
dropdown:Hide()
|
||||||
|
frame.dropdown = dropdown
|
||||||
|
|
||||||
|
frame:UpdateSettings()
|
||||||
|
|
||||||
|
frame:InitTab()
|
||||||
|
end
|
||||||
|
|
||||||
|
function TacticFrame:UpdateSettings()
|
||||||
|
local frame = self
|
||||||
|
|
||||||
|
addon.API.UpdateCzechFont(
|
||||||
|
frame.summary,
|
||||||
|
CzechQuestsAddon_Store.config.TACTIC_TEXT_FONT_NAME,
|
||||||
|
CzechQuestsAddon_Store.config.TACTIC_TEXT_FONT_SIZE
|
||||||
|
)
|
||||||
|
|
||||||
|
for _, header in ipairs(self.headers) do
|
||||||
|
addon.API.UpdateCzechFont(
|
||||||
|
header.description,
|
||||||
|
CzechQuestsAddon_Store.config.TACTIC_TEXT_FONT_NAME,
|
||||||
|
CzechQuestsAddon_Store.config.TACTIC_TEXT_FONT_SIZE
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function TacticFrame:InitTab()
|
||||||
|
local frame = self
|
||||||
|
|
||||||
|
local tab = CreateFrame("Button", "EncounterJournalCustomTab", EncounterJournal.encounter.info, "EncounterTabTemplate")
|
||||||
|
tab:SetPoint("TOP", EncounterJournal.encounter.info.modelTab, "BOTTOM", -3, -12)
|
||||||
|
tab:SetSize(50, 40)
|
||||||
|
tab.tooltip = "Taktika"
|
||||||
|
|
||||||
|
local selected = tab:CreateTexture(nil, "BACKGROUND")
|
||||||
|
selected:SetTexture("Interface\\EncounterJournal\\UI-EncounterJournalTextures")
|
||||||
|
selected:SetAllPoints(tab)
|
||||||
|
selected:SetBlendMode("ADD")
|
||||||
|
selected:SetDrawLayer("OVERLAY")
|
||||||
|
selected:SetTexCoord(0, 0.126953125, 0.90234375, 0.9599609375)
|
||||||
|
selected:Hide()
|
||||||
|
tab.selected = selected
|
||||||
|
|
||||||
|
function tab:SetActive(enable)
|
||||||
|
self:SetEnabled(enable);
|
||||||
|
self:GetDisabledTexture():SetDesaturated(not enable);
|
||||||
|
end
|
||||||
|
|
||||||
|
function tab:SetHighlight(enable)
|
||||||
|
if not enable then
|
||||||
|
self.selected:Hide();
|
||||||
|
else
|
||||||
|
self.selected:Show();
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
frame.tab = tab
|
||||||
|
end
|
||||||
|
|
||||||
|
function TacticFrame:CreateHeader()
|
||||||
|
local frame = self
|
||||||
|
local id = NEXT_HEADER_ID + 1
|
||||||
|
NEXT_HEADER_ID = id
|
||||||
|
|
||||||
|
local HeaderFrame = CreateFrame("FRAME", "CzechQuestsTacticHeader" .. id, frame, "EncounterInfoTemplate")
|
||||||
|
HeaderFrame:SetSize(self:GetParent():GetWidth() - 10, 30)
|
||||||
|
|
||||||
|
addon.API.UpdateCzechFont(
|
||||||
|
HeaderFrame.description,
|
||||||
|
CzechQuestsAddon_Store.config.TACTIC_TEXT_FONT_NAME,
|
||||||
|
CzechQuestsAddon_Store.config.TACTIC_TEXT_FONT_SIZE
|
||||||
|
)
|
||||||
|
|
||||||
|
HeaderFrame.button.abilityIcon:Hide()
|
||||||
|
HeaderFrame.button.portrait:Hide()
|
||||||
|
HeaderFrame.button.icon2:Hide()
|
||||||
|
HeaderFrame.button.icon3:Hide()
|
||||||
|
HeaderFrame.button.icon4:Hide()
|
||||||
|
|
||||||
|
HeaderFrame.button.expandedIcon:SetPoint("TOPLEFT", HeaderFrame.button, "TOPLEFT", 10, -6);
|
||||||
|
HeaderFrame.button.expandedIcon:SetText("+")
|
||||||
|
HeaderFrame.expanded = false
|
||||||
|
|
||||||
|
HeaderFrame.button.title:SetPoint("TOPLEFT", HeaderFrame, "TOPLEFT", 40, -7);
|
||||||
|
HeaderFrame.button.title:SetWidth(self:GetParent():GetWidth() - 110)
|
||||||
|
|
||||||
|
for i = 1, #HeaderFrame.Bullets do
|
||||||
|
HeaderFrame.Bullets[i]:Hide()
|
||||||
|
end
|
||||||
|
wipe(HeaderFrame.Bullets)
|
||||||
|
|
||||||
|
for _, icon in ipairs(HeaderFrame.button.icons) do
|
||||||
|
icon:Hide();
|
||||||
|
end
|
||||||
|
|
||||||
|
HeaderFrame.description:SetWidth(HeaderFrame:GetWidth() - 20)
|
||||||
|
HeaderFrame.description:Hide()
|
||||||
|
HeaderFrame.overviewDescription:Hide()
|
||||||
|
HeaderFrame.descriptionBG:Hide()
|
||||||
|
HeaderFrame.descriptionBGBottom:Hide()
|
||||||
|
|
||||||
|
function HeaderFrame:Open()
|
||||||
|
local parent = self
|
||||||
|
parent.button.expandedIcon:SetText("-")
|
||||||
|
parent.button.expandedIcon:SetPoint("TOPLEFT", HeaderFrame.button, "TOPLEFT", 10, -5);
|
||||||
|
parent.description:Show()
|
||||||
|
parent.descriptionBG:Show()
|
||||||
|
parent.descriptionBGBottom:Show()
|
||||||
|
end
|
||||||
|
|
||||||
|
function HeaderFrame:Close()
|
||||||
|
local parent = self
|
||||||
|
parent.button.expandedIcon:SetText("+")
|
||||||
|
parent.button.expandedIcon:SetPoint("TOPLEFT", HeaderFrame.button, "TOPLEFT", 10, -6);
|
||||||
|
parent.description:Hide()
|
||||||
|
parent.descriptionBG:Hide()
|
||||||
|
parent.descriptionBGBottom:Hide()
|
||||||
|
end
|
||||||
|
|
||||||
|
HeaderFrame.button:SetScript("OnClick", function(self)
|
||||||
|
local parent = self:GetParent()
|
||||||
|
parent.expanded = not parent.expanded
|
||||||
|
|
||||||
|
if parent.expanded then
|
||||||
|
parent:Open()
|
||||||
|
else
|
||||||
|
parent:Close()
|
||||||
|
end
|
||||||
|
|
||||||
|
frame:UpdateHeaderPositions()
|
||||||
|
end)
|
||||||
|
|
||||||
|
table.insert(self.headers, HeaderFrame)
|
||||||
|
|
||||||
|
return HeaderFrame
|
||||||
|
end
|
||||||
|
|
||||||
|
function TacticFrame:UpdateHeaderPositions()
|
||||||
|
local yOffset = -40
|
||||||
|
for _, header in ipairs(self.headers) do
|
||||||
|
header:SetPoint("BOTTOMLEFT", self.summary, "BOTTOMLEFT", 0, yOffset)
|
||||||
|
if header.expanded then
|
||||||
|
yOffset = yOffset - header.description:GetHeight() - 50
|
||||||
|
else
|
||||||
|
yOffset = yOffset - 30
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function TacticFrame:ClearHeaders()
|
||||||
|
for _, header in ipairs(self.headers) do
|
||||||
|
header:Hide()
|
||||||
|
header:SetParent(nil)
|
||||||
|
header = nil
|
||||||
|
end
|
||||||
|
wipe(self.headers)
|
||||||
|
end
|
6565
Addon/Data/retail/0.lua
Normal file
6565
Addon/Data/retail/0.lua
Normal file
File diff suppressed because it is too large
Load diff
6039
Addon/Data/retail/1.lua
Normal file
6039
Addon/Data/retail/1.lua
Normal file
File diff suppressed because it is too large
Load diff
3017
Addon/Data/retail/2.lua
Normal file
3017
Addon/Data/retail/2.lua
Normal file
File diff suppressed because it is too large
Load diff
3001
Addon/Data/retail/3.lua
Normal file
3001
Addon/Data/retail/3.lua
Normal file
File diff suppressed because it is too large
Load diff
2224
Addon/Data/retail/4.lua
Normal file
2224
Addon/Data/retail/4.lua
Normal file
File diff suppressed because it is too large
Load diff
190
Addon/Data/retail/5.lua
Normal file
190
Addon/Data/retail/5.lua
Normal file
|
@ -0,0 +1,190 @@
|
||||||
|
local _, addon = ...
|
||||||
|
local _, addon = ...
|
||||||
|
addon.data.tactic["Sprocketmonger Lockenstock"] = {
|
||||||
|
{
|
||||||
|
lfr = {
|
||||||
|
summary = "Boj proti Lockenstockovi probíhá ve dvou fázích. V první fázi aktivuje své vynálezy a hráči se musí vyhýbat jejich efektům, zatímco boss získává energii. Po dosažení 100 energie přejde do druhé fáze, kde upgraduje své vynálezy pomocí temné energie a způsobuje výrazně vyšší poškození. DPS musí eliminovat nebezpečné cíle, tankové udržet bosse pod kontrolou a healeři zvládnout silné raid-wide poškození.",
|
||||||
|
tank = {
|
||||||
|
{
|
||||||
|
name = "Gravi-Gunk",
|
||||||
|
phase = 1,
|
||||||
|
description = "Zásahy bosse aplikují stackující debuff, který zvyšuje utržené poškození a snižuje rychlost pohybu.",
|
||||||
|
howTo = "Provádět tank swapy při vyšším počtu stacků, používat defenzivní cooldowny na vysokých stackech.",
|
||||||
|
dangerous = "Vysoké stacky znamenají smrt, příliš pomalý tank swap může vést k wipe!"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name = "Pyro Party Pack",
|
||||||
|
phase = 1,
|
||||||
|
description = "Tank obdrží výbušný balíček, který exploduje po 6 sekundách a způsobí masivní poškození celému raidu. Poškození se snižuje se vzdáleností od výbuchu.",
|
||||||
|
howTo = "Utéct co nejdál od raidu těsně před explozí.",
|
||||||
|
dangerous = "Špatné umístění výbuchu může vyhladit celý raid!"
|
||||||
|
},
|
||||||
|
},
|
||||||
|
heal = {
|
||||||
|
{
|
||||||
|
name = "Sonic Ba-Boom",
|
||||||
|
phase = 1,
|
||||||
|
description = "Boss způsobí plošné poškození všem hráčům a aplikuje DoT efekt.",
|
||||||
|
howTo = "Použít raid-wide healing cooldowny a rychle dispellovat.",
|
||||||
|
dangerous = "Neřešená DoT může být smrtící při kombinaci s jinými mechanikami!"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name = "Voidsplosion",
|
||||||
|
phase = 2,
|
||||||
|
description = "Voidová exploze způsobí masivní poškození celému raidu a absorbuje léčbu.",
|
||||||
|
howTo = "Připravit raid-wide healing cooldowny a rychle překonat absorpci léčby.",
|
||||||
|
dangerous = "Nízké zdraví hráčů při explozi znamená wipe!"
|
||||||
|
},
|
||||||
|
},
|
||||||
|
dps = {
|
||||||
|
{
|
||||||
|
name = "Wire Transfer",
|
||||||
|
phase = 1,
|
||||||
|
description = "Část podlahy se nabije elektřinou, způsobuje velké poškození hráčům, kteří v ní stojí, a snižuje jejich rychlost pohybu.",
|
||||||
|
howTo = "Vyhýbat se elektrifikovaným zónám, sledovat své postavení.",
|
||||||
|
dangerous = "Pobyt v elektrifikované oblasti může rychle vést ke smrti!"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name = "Beta Launch",
|
||||||
|
phase = 2,
|
||||||
|
description = "Při dosažení 100 energie Lockenstock upgraduje své vynálezy a zvyšuje jejich poškození.",
|
||||||
|
howTo = "Zaměřit se na nové hrozby a eliminovat vylepšené vynálezy co nejrychleji.",
|
||||||
|
dangerous = "Ignorování posílených vynálezů znamená wipe!"
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
addon.data.tactic["The Geargrinder"] = {
|
||||||
|
{
|
||||||
|
lfr = {
|
||||||
|
summary = "Geargrinder encounter probíhá ve dvou fázích. V první fázi je boss chráněn Protective Plating a přivolává bikery, kteří mu pomáhají. Hráči musí porazit bikery a použít jejich motorky k odstranění Protective Plating. Po jeho odstranění boss vstupuje do Mechanical Breakdown, kde je zranitelný, ale snaží se opravit. DPS musí eliminovat opraváře, tankové udržet bosse a healeři zvládnout silné raid-wide poškození.",
|
||||||
|
tank = {
|
||||||
|
{
|
||||||
|
name = "Tank Buster",
|
||||||
|
phase = 1,
|
||||||
|
description = "Geargrinder udeří tanka, způsobí masivní fyzické poškození, knockback a stackující debuff, který zvyšuje poškození z dalších Tank Buster útoků.",
|
||||||
|
howTo = "Používat defenzivní cooldowny, včas vyměnit tanka. Stát mimo olejové skvrny.",
|
||||||
|
dangerous = "Vysoké stacky znamenají smrt. Knockback tě může hodit do nebezpečné zóny!"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name = "Protective Plating",
|
||||||
|
phase = 1,
|
||||||
|
description = "Boss je chráněn silným pancířem, dokud není odstraněn pomocí Blaze of Glory.",
|
||||||
|
howTo = "Pomáhat organizovat použití motorek na odstranění pancíře.",
|
||||||
|
dangerous = "Pokud se Protective Plating neodstraní rychle, boss přejde do Unrelenting CAR-nage!"
|
||||||
|
},
|
||||||
|
},
|
||||||
|
heal = {
|
||||||
|
{
|
||||||
|
name = "Exhaust Fumes",
|
||||||
|
phase = 1,
|
||||||
|
description = "Boss vypustí toxický kouř, který způsobuje rostoucí raid-wide poškození po dobu 6 sekund.",
|
||||||
|
howTo = "Použít healing cooldowny, sledovat nárůst poškození a připravit se na intenzivnější léčbu.",
|
||||||
|
dangerous = "Nárůst poškození může být smrtící, pokud není rychle zvládnut!"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name = "Backfire",
|
||||||
|
phase = 2,
|
||||||
|
description = "Motor bosse exploduje a způsobuje periodické plošné poškození všem hráčům.",
|
||||||
|
howTo = "Používat raid-wide healing cooldowny a rychle uzdravovat hráče s nízkým zdravím.",
|
||||||
|
dangerous = "Pokud se Backfire kombinuje s Burning Shrapnel, může dojít k rychlému wipu!"
|
||||||
|
},
|
||||||
|
},
|
||||||
|
dps = {
|
||||||
|
{
|
||||||
|
name = "Blaze of Glory",
|
||||||
|
phase = 1,
|
||||||
|
description = "Hráči mohou použít motorky poražených bikerů k odstranění Protective Plating bosse.",
|
||||||
|
howTo = "Využít dostupné motorky a správně zamířit na Geargrinder.",
|
||||||
|
dangerous = "Špatné načasování nebo nesprávné zaměření může zpomalit odstranění Protective Plating!"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name = "Pit Mechanics Repair",
|
||||||
|
phase = 2,
|
||||||
|
description = "Mechanici opravují Protective Plating bosse, čímž snižují jeho zranitelnost.",
|
||||||
|
howTo = "Rychle eliminovat Pit Mechaniky a přerušovat jejich Repair ability.",
|
||||||
|
dangerous = "Pokud mechanici opraví bosse příliš rychle, fáze Mechanical Breakdown skončí příliš brzy!"
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
addon.data.tactic["Ulgrax the Devourer"] = {
|
||||||
|
{
|
||||||
|
lfr = {
|
||||||
|
summary = "Boj proti Ulgraxovi probíhá ve dvou fázích. V první fázi Ulgrax používá Carnivorous Contest k přitahování hráčů a pokrývá arénu Stalker's Webbing. Jakmile Ulgrax dosáhne nulové energie, vstupuje do fáze Feeding Frenzy, kde způsobuje masivní poškození pomocí Juggernaut Charge a vyžaduje krmení. Hráči musí použít Chunky Viscera k nasycení bosse, než jeho Insatiable Rage dosáhne kritických hodnot.",
|
||||||
|
|
||||||
|
tank = {
|
||||||
|
-- Fáze 1
|
||||||
|
{
|
||||||
|
name = "Brutal Crush",
|
||||||
|
phase = 1,
|
||||||
|
description = "Ulgrax rozdrtí aktuálního tanka, způsobí masivní fyzické poškození a aplikuje 20 stacků Tenderized.",
|
||||||
|
howTo = "Používat defenzivní cooldowny, včas se střídat s druhým tankem. Vyhnout se dosažení vysokého počtu stacků Tenderized.",
|
||||||
|
dangerous = "Pokud hráč dosáhne příliš vysokého počtu stacků Tenderized, nebude možné ho efektivně léčit."
|
||||||
|
},
|
||||||
|
-- Fáze 2
|
||||||
|
{
|
||||||
|
name = "Ravenous Spawn",
|
||||||
|
phase = 2,
|
||||||
|
description = "Ulgrax přivolává hladové brouky, kteří způsobují Disembowel hráčům, dokud nejsou zničeni.",
|
||||||
|
howTo = "Tankovat brouky mimo hlavní skupinu a minimalizovat jejich zásahy na jednoho hráče.",
|
||||||
|
dangerous = "Pokud brouci zůstanou naživu příliš dlouho, jejich Disembowel stacky mohou rychle zabít hráče."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
heal = {
|
||||||
|
-- Fáze 1
|
||||||
|
{
|
||||||
|
name = "Digestive Acid",
|
||||||
|
phase = 1,
|
||||||
|
description = "Ulgrax vrhá na hráče Digestive Acid, které způsobuje periodické poškození a při odstranění exploduje.",
|
||||||
|
howTo = "Pečlivě načasovat dispely, aby exploze nezasáhla spojence. Dispelovat poblíž Stalker's Webbing, aby se rozpustilo.",
|
||||||
|
dangerous = "Špatně načasovaný dispel může poškodit spojence a způsobit smrt v přeplněné oblasti."
|
||||||
|
},
|
||||||
|
-- Fáze 2
|
||||||
|
{
|
||||||
|
name = "Hungering Bellows",
|
||||||
|
phase = 2,
|
||||||
|
description = "Ulgrax začne vřeštět v hladovém šílenství, čímž způsobuje neustálé poškození všem hráčům.",
|
||||||
|
howTo = "Používat raid-wide healing cooldowny a rychle obnovovat zdraví hráčům.",
|
||||||
|
dangerous = "Pokud se Ulgrax rychle nenasytí, jeho poškození narůstá do neudržitelné úrovně."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
dps = {
|
||||||
|
-- Fáze 1
|
||||||
|
{
|
||||||
|
name = "Carnivorous Contest",
|
||||||
|
phase = 1,
|
||||||
|
description = "Ulgrax připoutá hráče k sobě pomocí pavoučích sítí, které je postupně přitahují blíž.",
|
||||||
|
howTo = "Rozdělit poškození mezi všechny hráče v pasti a pomoci jim se uvolnit.",
|
||||||
|
dangerous = "Pokud v pasti uvízne příliš málo hráčů, přitahovací síla je příliš velká a hráči mohou být sežráni."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name = "Digestive Acid – Spolupráce s healery",
|
||||||
|
phase = 1,
|
||||||
|
description = "Digestive Acid exploduje při odstranění, což způsobuje velké poškození v okolí.",
|
||||||
|
howTo = "DPS musí dávat pozor na hráče s tímto debuffem a nesmí stát poblíž nich, když je odstraněn.",
|
||||||
|
dangerous = "Pokud se DPS nachází blízko hráče s Digestive Acid při jeho dispelu, utrpí velké poškození."
|
||||||
|
},
|
||||||
|
-- Fáze 2
|
||||||
|
{
|
||||||
|
name = "Chunky Viscera",
|
||||||
|
phase = 2,
|
||||||
|
description = "Při zabití brouků se z nich uvolní kusy masa, které mohou být použity k nakrmení Ulgraxe.",
|
||||||
|
howTo = "Hráči musí sbírat Chunky Viscera a házet je na bosse, aby přestal vřeštět.",
|
||||||
|
dangerous = "Pokud se Ulgrax rychle nenakrmí, Insatiable Rage dosáhne smrtící úrovně a celý raid může zemřít."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name = "Hungering Bellows – Spolupráce s healery",
|
||||||
|
phase = 2,
|
||||||
|
description = "Ulgrax začne vřeštět v hladovém šílenství, což způsobuje velké AoE poškození.",
|
||||||
|
howTo = "DPS by mělo být opatrné a umožnit healerům volný pohyb pro efektivní uzdravování.",
|
||||||
|
dangerous = "Pokud se DPS pohybuje chaoticky nebo ignoruje potřeby healerů, může dojít k úmrtí celé skupiny."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
292
CzechQuests.lua
292
CzechQuests.lua
|
@ -3,10 +3,12 @@ local _, addon = ...
|
||||||
-- Prepare API object
|
-- Prepare API object
|
||||||
addon.API = {}
|
addon.API = {}
|
||||||
|
|
||||||
|
-- Prepare Data objects
|
||||||
addon.data = {};
|
addon.data = {};
|
||||||
addon.data.quest = {};
|
addon.data.quest = {};
|
||||||
addon.data.item = {};
|
addon.data.item = {};
|
||||||
addon.data.speech = {}
|
addon.data.speech = {}
|
||||||
|
addon.data.tactic = {}
|
||||||
|
|
||||||
-- Expose object as global for other addon integration
|
-- Expose object as global for other addon integration
|
||||||
CzechQuestsAddon = {}
|
CzechQuestsAddon = {}
|
||||||
|
@ -39,278 +41,26 @@ local function InitStore()
|
||||||
CzechQuestsAddon_Store.config.SPEECH_MESSAGE_TEXTURE_ALPHA = CzechQuestsAddon_Store.config.SPEECH_MESSAGE_TEXTURE_ALPHA or 40
|
CzechQuestsAddon_Store.config.SPEECH_MESSAGE_TEXTURE_ALPHA = CzechQuestsAddon_Store.config.SPEECH_MESSAGE_TEXTURE_ALPHA or 40
|
||||||
CzechQuestsAddon_Store.config.SPEECH_FRAME_POSITION_X = CzechQuestsAddon_Store.config.SPEECH_FRAME_POSITION_X or 0
|
CzechQuestsAddon_Store.config.SPEECH_FRAME_POSITION_X = CzechQuestsAddon_Store.config.SPEECH_FRAME_POSITION_X or 0
|
||||||
CzechQuestsAddon_Store.config.SPEECH_FRAME_POSITION_Y = CzechQuestsAddon_Store.config.SPEECH_FRAME_POSITION_Y or 0
|
CzechQuestsAddon_Store.config.SPEECH_FRAME_POSITION_Y = CzechQuestsAddon_Store.config.SPEECH_FRAME_POSITION_Y or 0
|
||||||
|
|
||||||
|
-- Tactic Settings
|
||||||
|
CzechQuestsAddon_Store.config.TACTIC_ENABLED = CzechQuestsAddon_Store.config.TACTIC_ENABLED or true
|
||||||
|
CzechQuestsAddon_Store.config.TACTIC_TEXT_FONT_SIZE = CzechQuestsAddon_Store.config.TACTIC_TEXT_FONT_SIZE or 12
|
||||||
|
CzechQuestsAddon_Store.config.TACTIC_TEXT_FONT_NAME = CzechQuestsAddon_Store.config.TACTIC_TEXT_FONT_NAME or 'frizquadratatt_cz.ttf'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Event handler frame
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-- Proměnná, která sleduje stav CustomTab
|
|
||||||
local isCustomTabSelected = false
|
|
||||||
|
|
||||||
local currentTabId = 0
|
|
||||||
local prevTabId = 0
|
|
||||||
local encounterId = nil
|
|
||||||
|
|
||||||
local difficulty = nil
|
|
||||||
|
|
||||||
|
|
||||||
local function AddCustomEncounterTab()
|
|
||||||
if not EncounterJournal or not EncounterJournal.encounter or not EncounterJournal.encounter.info then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Kontrola a vytvoření vlastního obsahu
|
|
||||||
if not EncounterJournal.encounter.info.CustomContent then
|
|
||||||
local customContent = CreateFrame("Frame", "EncounterJournalCustomContent", EncounterJournal.encounter.info)
|
|
||||||
customContent:SetAllPoints(EncounterJournal.encounter.info.overviewScroll)
|
|
||||||
customContent:Hide()
|
|
||||||
|
|
||||||
local label = addon.API.CreateCzechFont(
|
|
||||||
customContent,
|
|
||||||
CzechQuestsAddon_Store.config.QUEST_TEXT_FONT_NAME,
|
|
||||||
12
|
|
||||||
)
|
|
||||||
|
|
||||||
label:SetTextColor(0.251, 0.145, 0.012) -- Hnědavě šedá barva
|
|
||||||
|
|
||||||
|
|
||||||
label:SetPoint("TOPLEFT", customContent, "TOPLEFT", 2, -10)
|
|
||||||
label:SetWidth(330)
|
|
||||||
label:SetText("Geargrinder encounter se skládá ze dvou fází. V první fázi je boss chráněn Protective Plating, zatímco získává energii a přivolává bikery. Hráči musí eliminovat bikery a využít jejich motorky k odstranění Protective Plating. Jakmile je pancíř odstraněn, boss přechází do Mechanical Breakdown, kde je zranitelný, ale snaží se opravit. DPS musí eliminovat opraváře, tankové musí udržet bosse a healeři se musí vypořádat s vysokým raid-wide poškozením.")
|
|
||||||
|
|
||||||
local i = 0
|
|
||||||
local infoHeader = CreateFrame("FRAME", "EncounterJournalInfoHeader"..i, customContent, "EncounterInfoTemplate")
|
|
||||||
infoHeader:SetSize(330, 30)
|
|
||||||
|
|
||||||
infoHeader.button.title:SetText("Tank") -- Nastaví text tlačítka
|
|
||||||
infoHeader.button.title:SetPoint("TOPLEFT", infoHeader, "TOPLEFT", 22, -7);
|
|
||||||
infoHeader.button.title:SetWidth(220) -- Nastavte šířku podle potřeby
|
|
||||||
|
|
||||||
-- Skrytí ikon a dalších prvků tlačítka
|
|
||||||
infoHeader.button.abilityIcon:Hide() -- Skryje ikonu schopnosti
|
|
||||||
infoHeader.button.portrait:Hide() -- Skryje portrét
|
|
||||||
infoHeader.button.icon2:Hide() -- Skryje druhou ikonu
|
|
||||||
infoHeader.button.icon3:Hide() -- Skryje třetí ikonu
|
|
||||||
infoHeader.button.icon4:Hide() -- Skryje čtvrtou ikonu
|
|
||||||
|
|
||||||
-- Nastavení počátečního textu a vzhledu tlačítka
|
|
||||||
infoHeader.button.expandedIcon:SetPoint("TOPLEFT", infoHeader.button, "TOPLEFT", 5, -6);
|
|
||||||
infoHeader.button.expandedIcon:SetText("+") -- Ikona pro "rozbalit"
|
|
||||||
infoHeader.expanded = false -- Default: není rozbaleno
|
|
||||||
|
|
||||||
|
|
||||||
-- Skrytí dalších prvků spojených s obsahem
|
|
||||||
for i = 1, #infoHeader.Bullets do
|
|
||||||
infoHeader.Bullets[i]:Hide()
|
|
||||||
end
|
|
||||||
wipe(infoHeader.Bullets) -- Vyčistíme seznam bullets
|
|
||||||
|
|
||||||
|
|
||||||
for index, icon in ipairs(infoHeader.button.icons) do
|
|
||||||
local iconFlag = iconFlags and iconFlags[index];
|
|
||||||
icon:Hide();
|
|
||||||
end
|
|
||||||
|
|
||||||
infoHeader:SetPoint("BOTTOMLEFT", label, "BOTTOMLEFT", 0, -40)
|
|
||||||
|
|
||||||
addon.API.UpdateCzechFont(infoHeader.description, CzechQuestsAddon_Store.config.QUEST_TEXT_FONT_NAME)
|
|
||||||
|
|
||||||
-- Nastavení obsahu a jeho zobrazení
|
|
||||||
infoHeader.description:SetText("|cffffffffTank Buster|r - Geargrinder udeří tanka silným fyzickým útokem, způsobí vysoké poškození, knockback a stacking debuff zvyšující utržené poškození. Tank musí použít defenzivní cooldowny a včas swapovat bosse s druhým tankem.")
|
|
||||||
infoHeader.description:SetWidth(infoHeader:GetWidth() - 20)
|
|
||||||
infoHeader.description:Hide() -- Výchozí stav: skryto
|
|
||||||
infoHeader.overviewDescription:Hide() -- Skryje popis přehledu (overview
|
|
||||||
|
|
||||||
|
|
||||||
infoHeader.descriptionBG:Hide();
|
|
||||||
infoHeader.descriptionBGBottom:Hide();
|
|
||||||
|
|
||||||
-- Přizpůsobíme klikací funkci pro rozbalení/sbalení
|
|
||||||
infoHeader.button:SetScript("OnClick", function(self)
|
|
||||||
local parent = self:GetParent()
|
|
||||||
parent.expanded = not parent.expanded -- Přepneme logiku mezi rozbaleným a sbaleným
|
|
||||||
|
|
||||||
-- Logika pro rozbalení
|
|
||||||
if parent.expanded then
|
|
||||||
self.expandedIcon:SetText("-") -- Ikona pro "sbalit"
|
|
||||||
self.expandedIcon:SetPoint("TOPLEFT", infoHeader.button, "TOPLEFT", 5, -5);
|
|
||||||
parent.description:Show() -- Zobrazíme popis
|
|
||||||
parent.descriptionBG:Show() -- Zobrazíme popis
|
|
||||||
parent.descriptionBGBottom:Show() -- Zobrazíme popis
|
|
||||||
else
|
|
||||||
self.expandedIcon:SetText("+") -- Ikona pro "rozbalit"
|
|
||||||
self.expandedIcon:SetPoint("TOPLEFT", infoHeader.button, "TOPLEFT", 5, -6);
|
|
||||||
parent.description:Hide() -- Skryjeme popis
|
|
||||||
parent.descriptionBG:Hide() -- Zobrazíme popis
|
|
||||||
parent.descriptionBGBottom:Hide() -- Zobrazíme popis
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
|
|
||||||
EncounterJournal.encounter.info.CustomContent = customContent
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-- Funkce pro deaktivaci CustomTab
|
|
||||||
local function DeselectCustomTab()
|
|
||||||
isCustomTabSelected = false
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
local function SelectCustomTab()
|
|
||||||
-- Nastavíme stav CustomTab jako aktivní
|
|
||||||
isCustomTabSelected = true
|
|
||||||
|
|
||||||
-- Skryjeme všechny záložky
|
|
||||||
--EncounterJournal.encounter.info.overviewScroll:Hide()
|
|
||||||
EncounterJournal.encounter.info.detailsScroll:Hide()
|
|
||||||
EncounterJournal.encounter.info.LootContainer:Hide()
|
|
||||||
EncounterJournal.encounter.info.model:Hide()
|
|
||||||
|
|
||||||
EncounterJournal.encounter.info['overviewScroll']:Hide();
|
|
||||||
EncounterJournal.encounter.info['overviewTab'].selected:Hide();
|
|
||||||
EncounterJournal.encounter.info['overviewTab'].unselected:Show();
|
|
||||||
EncounterJournal.encounter.info['overviewTab']:UnlockHighlight();
|
|
||||||
|
|
||||||
|
|
||||||
EncounterJournal.encounter.info['LootContainer']:Hide();
|
|
||||||
EncounterJournal.encounter.info['lootTab'].selected:Hide();
|
|
||||||
EncounterJournal.encounter.info['lootTab'].unselected:Show();
|
|
||||||
EncounterJournal.encounter.info['lootTab']:UnlockHighlight();
|
|
||||||
|
|
||||||
|
|
||||||
EncounterJournal.encounter.info['detailsScroll']:Hide();
|
|
||||||
EncounterJournal.encounter.info['bossTab'].selected:Hide();
|
|
||||||
EncounterJournal.encounter.info['bossTab'].unselected:Show();
|
|
||||||
EncounterJournal.encounter.info['bossTab']:UnlockHighlight();
|
|
||||||
|
|
||||||
|
|
||||||
EncounterJournal.encounter.info['model']:Hide();
|
|
||||||
EncounterJournal.encounter.info['modelTab'].selected:Hide();
|
|
||||||
EncounterJournal.encounter.info['modelTab'].unselected:Show();
|
|
||||||
EncounterJournal.encounter.info['modelTab']:UnlockHighlight();
|
|
||||||
|
|
||||||
EncounterJournal.encounter.info.CustomTab.selected:Show();
|
|
||||||
|
|
||||||
|
|
||||||
if EncounterJournal.encounter.info.creatureButtons then
|
|
||||||
for _, button in pairs(EncounterJournal.encounter.info.creatureButtons) do
|
|
||||||
button:Hide()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
EncounterJournal.encounter.info.encounterTitle:Show()
|
|
||||||
EncounterJournal.encounter.info.difficulty:Show()
|
|
||||||
|
|
||||||
EncounterJournal.encounter.info.rightShadow:Show()
|
|
||||||
|
|
||||||
-- Vyplnění obsahu naší tabulky
|
|
||||||
local bossName = EJ_GetEncounterInfo(encounterId)
|
|
||||||
print(bossName)
|
|
||||||
|
|
||||||
-- Zobrazíme vlastní obsah
|
|
||||||
EncounterJournal.encounter.info.CustomContent:Show()
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Kontrola a vytvoření vlastního tlačítka
|
|
||||||
if not EncounterJournal.encounter.info.CustomTab then
|
|
||||||
local customTab = CreateFrame("Button", "EncounterJournalCustomTab", EncounterJournal.encounter.info, "EncounterTabTemplate")
|
|
||||||
customTab:SetPoint("TOP", EncounterJournal.encounter.info.modelTab, "BOTTOM", -3, -12)
|
|
||||||
customTab:SetSize(50, 40)
|
|
||||||
customTab.tooltip = "Taktika"
|
|
||||||
|
|
||||||
-- Přidání textury (zelená koule) do layoutu záložky
|
|
||||||
local icon = customTab:CreateTexture(nil, "OVERLAY")
|
|
||||||
icon:SetSize(20, 20) -- Velikost ikony (koule)
|
|
||||||
icon:SetPoint("CENTER", customTab, "CENTER", 0, 0) -- Pozice vlevo od textu
|
|
||||||
icon:SetTexture("Interface\\COMMON\\Indicator-Yellow") -- Použití textury zelené koule
|
|
||||||
|
|
||||||
customTab:SetEnabled(false);
|
|
||||||
customTab:GetDisabledTexture():SetDesaturated(true);
|
|
||||||
|
|
||||||
-- Vytvoření selected textury (vybraný stav)
|
|
||||||
local selectTexture = customTab:CreateTexture(nil, "BACKGROUND")
|
|
||||||
selectTexture:SetTexture("Interface\\EncounterJournal\\UI-EncounterJournalTextures") -- Základní textura
|
|
||||||
selectTexture:SetAllPoints(customTab) -- Umístění na střed
|
|
||||||
-- TexCoords pro "selected", pokud existují (nahraďte správnými souřadnicemi)
|
|
||||||
selectTexture:SetBlendMode("ADD")
|
|
||||||
selectTexture:SetDrawLayer("OVERLAY")
|
|
||||||
selectTexture:SetTexCoord(0, 0.126953125, 0.90234375, 0.9599609375)-- Ukázkové hodnoty (upravit dle specifikace)
|
|
||||||
selectTexture:Hide()
|
|
||||||
customTab.selected = selectTexture -- Přidáme jako vlastnost rámce
|
|
||||||
|
|
||||||
-- Kliknutí na vlastní záložku
|
|
||||||
customTab:SetScript("OnClick", function(self)
|
|
||||||
currentTabId = 0
|
|
||||||
SelectCustomTab()
|
|
||||||
end)
|
|
||||||
|
|
||||||
customTab.icon = icon
|
|
||||||
|
|
||||||
|
|
||||||
EncounterJournal.encounter.info.CustomTab = customTab
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Hook na přepnutí bosse
|
|
||||||
hooksecurefunc("EncounterJournal_DisplayEncounter", function(encounterID)
|
|
||||||
encounterId = encounterID
|
|
||||||
EncounterJournal.encounter.info.CustomTab:SetEnabled(true);
|
|
||||||
EncounterJournal.encounter.info.CustomTab:GetDisabledTexture():SetDesaturated(false);
|
|
||||||
|
|
||||||
-- Pokud je CustomTab vybrána, při změně bosse zachováme zvýraznění
|
|
||||||
if isCustomTabSelected then
|
|
||||||
SelectCustomTab()
|
|
||||||
else
|
|
||||||
DeselectCustomTab()
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
hooksecurefunc("EncounterJournal_SetTab", function(tabId)
|
|
||||||
if currentTabId ~= tabId then
|
|
||||||
isCustomTabSelected = false
|
|
||||||
EncounterJournal.encounter.info.CustomTab.selected:Hide();
|
|
||||||
end
|
|
||||||
prevTabId = currentTabId
|
|
||||||
currentTabId = tabId
|
|
||||||
EncounterJournal.encounter.info.CustomContent:Hide()
|
|
||||||
end)
|
|
||||||
|
|
||||||
-- Hook na přepnutí bosse
|
|
||||||
hooksecurefunc("EncounterJournalBossButton_OnClick", function(encounterID)
|
|
||||||
if prevTabId == 0 then
|
|
||||||
currentTabId = 0
|
|
||||||
SelectCustomTab()
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
-- Hook na přepnutí bosse
|
|
||||||
hooksecurefunc("EncounterJournal_UpdateDifficulty", function(dif)
|
|
||||||
difficulty = dif
|
|
||||||
if prevTabId == 0 and encounterId then
|
|
||||||
currentTabId = 0
|
|
||||||
SelectCustomTab()
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
-- Hook na přepnutí bosse
|
|
||||||
hooksecurefunc("EncounterJournal_DisplayInstance", function(encounterID)
|
|
||||||
EncounterJournal.encounter.info.CustomTab:SetEnabled(false);
|
|
||||||
EncounterJournal.encounter.info.CustomTab:GetDisabledTexture():SetDesaturated(true);
|
|
||||||
EncounterJournal.encounter.info.CustomTab.selected:Hide();
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Sledujeme Blizzard Encounter Journal události
|
|
||||||
local frame = CreateFrame("Frame")
|
local frame = CreateFrame("Frame")
|
||||||
frame:RegisterEvent("PLAYER_ENTERING_WORLD")
|
local function OnEvent(self, event, addonName, ...)
|
||||||
frame:RegisterEvent("ADDON_LOADED")
|
if event == "ADDON_LOADED" and addonName == 'CzechQuests' then
|
||||||
frame:RegisterEvent("EJ_DIFFICULTY_UPDATE") -- Událost pro změnu obtížnosti
|
InitStore()
|
||||||
|
addon.API.InitOptions()
|
||||||
|
addon.API.InitQuests()
|
||||||
frame:SetScript("OnEvent", function(self, event, addonName)
|
addon.API.InitSpeeches()
|
||||||
if event == "ADDON_LOADED" then
|
addon.API.InitTactics()
|
||||||
AddCustomEncounterTab()
|
self:UnregisterEvent("ADDON_LOADED")
|
||||||
end
|
end
|
||||||
end)
|
end
|
||||||
|
|
||||||
|
-- Register the event
|
||||||
|
frame:RegisterEvent("ADDON_LOADED")
|
||||||
|
frame:SetScript("OnEvent", OnEvent)
|
|
@ -14,6 +14,7 @@ Addon/Data/1.lua
|
||||||
Addon/Data/2.lua
|
Addon/Data/2.lua
|
||||||
Addon/Data/3.lua
|
Addon/Data/3.lua
|
||||||
Addon/Data/4.lua
|
Addon/Data/4.lua
|
||||||
|
Addon/Data/5.lua
|
||||||
|
|
||||||
Addon/Data/other.lua
|
Addon/Data/other.lua
|
||||||
|
|
||||||
|
@ -29,3 +30,6 @@ Addon/Code/Quest.lua
|
||||||
Addon/Code/SpeechDataApi.lua
|
Addon/Code/SpeechDataApi.lua
|
||||||
Addon/Code/SpeechFrame.lua
|
Addon/Code/SpeechFrame.lua
|
||||||
Addon/Code/Speech.lua
|
Addon/Code/Speech.lua
|
||||||
|
|
||||||
|
Addon/Code/TacticFrame.lua
|
||||||
|
Addon/Code/Tactic.lua
|
||||||
|
|
Loading…
Add table
Reference in a new issue