-- 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