231 lines
6.8 KiB
Lua
231 lines
6.8 KiB
Lua
local IsleOfConquest = DBM:NewMod("IsleofConquest", "DBM-PvP", 2)
|
|
local L = IsleOfConquest:GetLocalizedStrings()
|
|
|
|
IsleOfConquest:RemoveOption("HealthFrame")
|
|
|
|
IsleOfConquest:SetZone(DBM_DISABLE_ZONE_DETECTION)
|
|
|
|
IsleOfConquest: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",
|
|
"UNIT_DIED"
|
|
)
|
|
|
|
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 warnSiegeEngine = IsleOfConquest:NewAnnounce("WarnSiegeEngine", 3)
|
|
local warnSiegeEngineSoon = IsleOfConquest:NewAnnounce("WarnSiegeEngineSoon", 2)
|
|
|
|
local startTimer = IsleOfConquest:NewTimer(62, "TimerStart")
|
|
local POITimer = IsleOfConquest:NewTimer(61, "TimerPOI") -- point of interest
|
|
local timerSiegeEngine = IsleOfConquest:NewTimer(180, "TimerSiegeEngine")
|
|
|
|
|
|
local function isInArgs(val, ...) -- search for val in all args (...)
|
|
for i=1, select("#", ...), 1 do
|
|
local v = select(i, ...)
|
|
if v == val then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
local poi = {}
|
|
local function isPoi(id)
|
|
return (id >= 16 and id <= 20) -- Quarry
|
|
or (id >= 135 and id <= 139) -- Workshop
|
|
or (id >= 140 and id <= 144) -- Hangar
|
|
or (id >= 145 and id <= 149) -- Docks
|
|
or (id >= 150 and id <= 154) -- Refinerie
|
|
or (id >= 9 and id <= 12) -- Keep
|
|
end
|
|
function getPoiState(id)
|
|
if isInArgs(id, 18, 136, 141, 146, 151) then return 1 -- alliance
|
|
elseif isInArgs(id, 20, 138, 143, 148, 153) then return 2 -- horde
|
|
elseif isInArgs(id, 16, 135, 140, 145, 150) then return 3 -- if getPoiState(id) == 3 then --- untaken
|
|
elseif isInArgs(id, 17, 137, 142, 147, 152) then return 4 -- if getPoiState(id) == 4 then --- alliance takes
|
|
elseif isInArgs(id, 19, 139, 144, 149, 154) then return 5 -- if getPoiState(id) == 5 then --- horde takes
|
|
else return 0
|
|
end
|
|
end
|
|
|
|
--
|
|
-- 16 Quarry - Uncontrolled
|
|
-- 17 Quarry - In Conflict (to Alliance)
|
|
-- 18 Quarry - Alliance Controlled
|
|
-- 19 Quarry - In Conflict (to Horde)
|
|
-- 20 Quarry - Horde Controlled
|
|
--
|
|
-- 135 Workshop - Uncontrolled
|
|
-- 136 Workshop - Alliance
|
|
-- 137 Workshop - In Conflict (to Alliance)
|
|
-- 138 Workshop - Horde Controlled
|
|
-- 139 Workshop - In Conflict (to Horde)
|
|
--
|
|
-- 140 Hangar - Uncontrolled
|
|
-- 141 Hangar - Alliance
|
|
-- 142 Hangar - In Conflict (to Alliance)
|
|
-- 143 Hangar - Horde Controlled
|
|
-- 144 Hangar - In Conflict (to Horde)
|
|
--
|
|
-- 145 Docks - Uncontrolled
|
|
-- 146 Docks - Alliance
|
|
-- 147 Docks - In Conflict (to Alliance)
|
|
-- 148 Docks - Horde
|
|
-- 149 Docks - In Conflict (to Horde)
|
|
--
|
|
-- 150 Refinerie - Uncontrolled
|
|
-- 151 Refinerie - Alliance
|
|
-- 152 Refiniere - In Conflict (to Alliance)
|
|
-- 153 Refinerie - Horde Controlled
|
|
-- 154 Refinerie - In Conflict (to Horde)
|
|
--
|
|
-- 77 Horde Gate - OK
|
|
-- 78 - i think its at half hp
|
|
-- 79 Horde Gate - Destroyed
|
|
--
|
|
-- 80 Alliance Gate - OK
|
|
-- 81 - i think its at half hp
|
|
-- 82 Allianz Gate - Destroyed
|
|
--
|
|
-- 9 Keep - In Conflict (to Allianz)
|
|
-- 10 Keep - Horde Controlled
|
|
-- 11 Keep - Alliance
|
|
-- 12 Keep - In Conflict (to Horde)
|
|
--
|
|
|
|
|
|
local bgzone = false
|
|
do
|
|
local function initialize(self)
|
|
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 isPoi(textureIndex) then
|
|
poi[i] = textureIndex
|
|
end
|
|
end
|
|
end
|
|
elseif bgzone then
|
|
self:Stop()
|
|
bgzone = false
|
|
end
|
|
end
|
|
|
|
IsleOfConquest.OnInitialize = initialize
|
|
IsleOfConquest.ZONE_CHANGED_NEW_AREA = initialize
|
|
end
|
|
|
|
local scheduleCheck
|
|
|
|
function IsleOfConquest: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)
|
|
elseif arg1 == L.BgStart15 then
|
|
startTimer:Update(47, 62)
|
|
end
|
|
scheduleCheck(self)
|
|
end
|
|
|
|
local function checkForUpdates()
|
|
if not bgzone then return end
|
|
for k,v in pairs(poi) do
|
|
local name, _, textureIndex = GetMapLandmarkInfo(k)
|
|
if name and textureIndex then
|
|
-- new state vs old state
|
|
if getPoiState(v) <= 3 and getPoiState(textureIndex) > 3 then
|
|
-- poi is now in conflict, we have to start a bar :)
|
|
POITimer:Start(nil, name)
|
|
if k == 13 then -- Workshop is under attack, Siege Engine building is cancelled
|
|
timerSiegeEngine:Cancel()
|
|
warnSiegeEngineSoon:Cancel()
|
|
end
|
|
if getPoiState(textureIndex) == 4 then -- alliance takes
|
|
POITimer:SetColor(allyColor, name)
|
|
POITimer:UpdateIcon(allyTowerIcon, name)
|
|
else
|
|
POITimer:SetColor(hordeColor, name)
|
|
POITimer:UpdateIcon(hordeTowerIcon, name)
|
|
end
|
|
elseif getPoiState(textureIndex) <= 2 then
|
|
-- poi is now longer in conflict, remove the bars
|
|
POITimer:Stop(name)
|
|
end
|
|
poi[k] = textureIndex
|
|
end
|
|
end
|
|
end
|
|
|
|
function scheduleCheck(self)
|
|
self:Schedule(1, checkForUpdates)
|
|
end
|
|
|
|
function IsleOfConquest:CHAT_MSG_MONSTER_YELL(msg)
|
|
if msg == L.GoblinStartAlliance or msg == L.GoblinBrokenAlliance or msg:find(L.GoblinStartAlliance) or msg:find(L.GoblinBrokenAlliance) then
|
|
self:SendSync("SEStart", "Alliance")
|
|
elseif msg == L.GoblinStartHorde or msg == L.GoblinBrokenHorde or msg:find(L.GoblinStartHorde) or msg:find(L.GoblinBrokenHorde) then
|
|
self:SendSync("SEStart", "Horde")
|
|
elseif msg == L.GoblinHalfwayAlliance or msg:find(L.GoblinHalfwayAlliance) then
|
|
self:SendSync("SEHalfway", "Alliance")
|
|
elseif msg == L.GoblinHalfwayHorde or msg:find(L.GoblinHalfwayHorde) then
|
|
self:SendSync("SEHalfway", "Horde")
|
|
elseif msg == L.GoblinFinishedAlliance or msg:find(L.GoblinFinishedAlliance) then
|
|
self:SendSync("SEFinish", "Alliance")
|
|
elseif msg == L.GoblinFinishedHorde or msg:find(L.GoblinFinishedHorde) then
|
|
self:SendSync("SEFinish", "Horde")
|
|
else
|
|
checkForUpdates()
|
|
end
|
|
end
|
|
|
|
function IsleOfConquest:UNIT_DIED(args)
|
|
local cid = self:GetCIDFromGUID(args.destGUID)
|
|
if cid == 34476 then
|
|
self:SendSync("SEBroken", "Alliance")
|
|
elseif cid == 35069 then
|
|
self:SendSync("SEBroken", "Horde")
|
|
end
|
|
end
|
|
|
|
IsleOfConquest.CHAT_MSG_BG_SYSTEM_ALLIANCE = scheduleCheck
|
|
IsleOfConquest.CHAT_MSG_BG_SYSTEM_HORDE = scheduleCheck
|
|
|
|
function IsleOfConquest:OnSync(msg, arg)
|
|
if msg == "SEStart" then
|
|
timerSiegeEngine:Start(178)
|
|
warnSiegeEngineSoon:Schedule(168)
|
|
if arg == "Alliance" then
|
|
timerSiegeEngine:SetColor(allyColor)
|
|
elseif arg == "Horde" then
|
|
timerSiegeEngine:SetColor(hordeColor)
|
|
end
|
|
elseif msg == "SEHalfway" then
|
|
warnSiegeEngineSoon:Cancel()
|
|
timerSiegeEngine:Start(89)
|
|
warnSiegeEngineSoon:Schedule(79)
|
|
if arg == "Alliance" then
|
|
timerSiegeEngine:SetColor(allyColor)
|
|
elseif arg == "Horde" then
|
|
timerSiegeEngine:SetColor(hordeColor)
|
|
end
|
|
elseif msg == "SEFinish" then
|
|
warnSiegeEngineSoon:Cancel()
|
|
timerSiegeEngine:Cancel()
|
|
warnSiegeEngine:Show()
|
|
end
|
|
end
|
|
|
|
|