Files
Andrew6810 39c0ed874e init
2022-10-21 06:50:13 -07:00

287 lines
7.5 KiB
Lua

-- Alterac mod v3.0
-- rewrite by Nitram and Tandanu
local Alterac = DBM:NewMod("AlteracValley", "DBM-PvP", 2)
local L = Alterac:GetLocalizedStrings()
Alterac:SetZone(DBM_DISABLE_ZONE_DETECTION)
Alterac:AddBoolOption("AutoTurnIn")
Alterac:RemoveOption("HealthFrame")
Alterac:RegisterEvents(
"ZONE_CHANGED_NEW_AREA", -- Required for BG start
"CHAT_MSG_MONSTER_YELL",
"CHAT_MSG_BG_SYSTEM_ALLIANCE",
"CHAT_MSG_BG_SYSTEM_HORDE",
"CHAT_MSG_BG_SYSTEM_NEUTRAL",
"GOSSIP_SHOW",
"QUEST_PROGRESS",
"QUEST_COMPLETE"
)
local allyTowerIcon = "Interface\\AddOns\\DBM-PvP\\Textures\\GuardTower"
local allyColor = {
r = 0,
g = 0,
b = 1,
}
local hordeTowerIcon = "Interface\\AddOns\\DBM-PvP\\Textures\\OrcTower"
local hordeColor = {
r = 1,
g = 0,
b = 0,
}
local startTimer = Alterac:NewTimer(62, "TimerStart")
local towerTimer = Alterac:NewTimer(243, "TimerTower")
local gyTimer = Alterac:NewTimer(243, "TimerGY", "Interface\\Icons\\Spell_Shadow_AnimateDead")
-- http://www.wowwiki.com/API_GetMapLandmarkInfo
local graveyards = {}
local function is_graveyard(id)
return id == 15 or id == 4 or id == 13 or id == 14 or id == 8
end
local function gy_state(id)
if id == 15 then return 1 -- if gy_state(id) > 2 then .. conflict state ...
elseif id == 13 then return 2
elseif id == 8 then return 3 -- if gy_state(id) == 3 then --- untaken
elseif id == 4 then return 4 -- if gy_state(id) == 4 then --- alliance takes gy from horde
elseif id == 14 then return 5 -- if gy_state(id) == 5 then --- horde takes gy from alliance
else return 0
end
end
--[[
15 Graveyard, held by Alliance
04 Graveyard, assaulted by Alliance
13 Graveyard, held by Horde
14 Graveyard, assaulted by Horde
--]]
towers = {}
local function is_tower(id)
return id == 10 or id == 12 or id == 11 or id == 9 or id == 6
end
local function tower_state(id)
if id == 11 then return 1 -- if tower_state(id) > 2 then .. conflict state ...
elseif id == 10 then return 2
elseif id == 9 then return 3 -- if tower_state(id) == 3 then --- alliance trys to destroy the tower
elseif id == 12 then return 4 -- if tower_state(id) == 4 then --- horde trys to destroy the tower
elseif id == 6 then return 5 -- if tower_state(id) == 5 then --- destroyed
else return 0
end
end
--[[
10 Tower, held by Horde
12 Tower, assaulted by Horde
11 Tower, held by Alliance
09 Tower, assaulted by Alliance
--]]
local bgzone = false
do
local function AV_Initialize()
if select(2, IsInInstance()) == "pvp" and GetRealZoneText() == L.ZoneName then
bgzone = true
for i=1, GetNumMapLandmarks(), 1 do
local name, _, textureIndex = GetMapLandmarkInfo(i)
if name and textureIndex then
if is_graveyard(textureIndex) then
graveyards[i] = textureIndex
elseif is_tower(textureIndex) then
towers[i] = textureIndex
end
end
end
elseif bgzone then
bgzone = false
end
end
Alterac.OnInitialize = AV_Initialize
Alterac.ZONE_CHANGED_NEW_AREA = AV_Initialize
end
local schedule_check
function Alterac:CHAT_MSG_BG_SYSTEM_NEUTRAL(arg1)
if not bgzone then return end
if arg1 == L.BgStart60 then
startTimer:Start()
elseif arg1 == L.BgStart30 then
startTimer:Update(31, 62)
end
schedule_check(self)
end
local function check_for_updates()
if not bgzone then return end
for k,v in pairs(graveyards) do
local name, _, textureIndex = GetMapLandmarkInfo(k)
if name and textureIndex then
if gy_state(v) <= 3 and gy_state(textureIndex) > 3 then
-- gy is now in conflict, we have to start a bar :)
gyTimer:Start(nil, name)
if gy_state(textureIndex) == 4 then
gyTimer:SetColor(allyColor, name)
else
gyTimer:SetColor(hordeColor, name)
end
elseif gy_state(textureIndex) <= 3 then
-- gy is now longer under conflict, remove the bars
gyTimer:Stop(name)
end
graveyards[k] = textureIndex
end
end
for k,v in pairs(towers) do
local name, _, textureIndex = GetMapLandmarkInfo(k)
if name and textureIndex then
if tower_state(v) <= 2 and tower_state(textureIndex) > 2 then
-- Tower is now in conflict, we have to start a bar :)
towerTimer:Start(nil, name)
if tower_state(textureIndex) == 3 then
towerTimer:SetColor(allyColor, name)
towerTimer:UpdateIcon(hordeTowerIcon, name)
else
towerTimer:SetColor(hordeColor, name)
towerTimer:UpdateIcon(allyTowerIcon, name)
end
elseif tower_state(textureIndex) <= 2 then
-- Tower is now longer under conflict, remove the bars
towerTimer:Stop(name)
end
towers[k] = textureIndex
end
end
end
function schedule_check(self)
self:Schedule(1, check_for_updates)
end
Alterac.CHAT_MSG_MONSTER_YELL = schedule_check
Alterac.CHAT_MSG_BG_SYSTEM_ALLIANCE = schedule_check
Alterac.CHAT_MSG_BG_SYSTEM_HORDE = schedule_check
local quests
do
local getQuestName
do
local tooltip = CreateFrame("GameTooltip", "DBM-PvP_Tooltip")
tooltip:SetOwner(UIParent, "ANCHOR_NONE")
tooltip:AddFontStrings(tooltip:CreateFontString("$parentText", nil, "GameTooltipText"), tooltip:CreateFontString("$parentTextRight", nil, "GameTooltipText"))
function getQuestName(id)
tooltip:ClearLines()
tooltip:SetHyperlink("quest:"..id)
return getglobal(tooltip:GetName().."Text"):GetText()
end
end
local function loadQuests()
for i, v in pairs(quests) do
if type(v[1]) == "table" then
for i, v in ipairs(v) do
v[1] = getQuestName(v[1]) or v[1]
end
else
v[1] = getQuestName(v[1]) or v[1]
end
end
end
quests = {
[13442] = {
{7386, 17423, 5},
{6881, 17423},
},
[13236] = {
{7385, 17306, 5},
{6801, 17306},
},
[13257] = {6781, 17422, 20},
[13176] = {6741, 17422, 20},
[13577] = {7026, 17643},
[13179] = {6825, 17326},
[13438] = {6942, 17502},
[13180] = {6826, 17327},
[13181] = {6827, 17328},
[13439] = {6941, 17503},
[13437] = {6943, 17504},
[13441] = {7002, 17642},
}
loadQuests() -- requests the quest information from the server
Alterac:Schedule(5, loadQuests) -- information should be available now....load it
Alterac:Schedule(15, loadQuests) -- sometimes this requires a lot more time, just to be sure!
end
local function isQuestAutoTurnInQuest(name)
for i, v in pairs(quests) do
if type(v[1]) == "table" then
for i, v in ipairs(v) do
if v[1] == name then return true end
end
else
if v[1] == name then return true end
end
end
end
local function acceptQuestByName(name)
for i = 1, select("#", GetGossipAvailableQuests()), 5 do
if select(i, GetGossipAvailableQuests()) == name then
SelectGossipAvailableQuest(math.ceil(i/5))
break
end
end
end
local function checkItems(item, amount)
local found = 0
for bag = 0, NUM_BAG_SLOTS do
for i = 1, GetContainerNumSlots(bag) do
if tonumber((GetContainerItemLink(bag, i) or ""):match(":(%d+):") or 0) == item then
found = found + select(2, GetContainerItemInfo(bag, i))
end
end
end
return found >= amount
end
function Alterac:GOSSIP_SHOW()
if not bgzone or not self.Options.AutoTurnIn then return end
local quest = quests[tonumber((UnitGUID("target") or ""):sub(9, 12), 16) or 0]
if quest and type(quest[1]) == "table" then
for i, v in ipairs(quest) do
if checkItems(v[2], v[3] or 1) then
acceptQuestByName(v[1])
break
end
end
elseif quest then
if checkItems(quest[2], quest[3] or 1) then acceptQuestByName(quest[1]) end
end
end
function Alterac:QUEST_PROGRESS()
if bgzone and isQuestAutoTurnInQuest(GetTitleText()) then
CompleteQuest()
end
end
function Alterac:QUEST_COMPLETE()
if bgzone and isQuestAutoTurnInQuest(GetTitleText()) then
GetQuestReward(0)
end
end