Mercurial > wow > icu
comparison ICU.lua @ 0:98c6f55e6619
First commit
| author | Xiiph |
|---|---|
| date | Sat, 05 Feb 2011 16:45:02 +0100 |
| parents | |
| children | 6af2d0a0c537 |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:98c6f55e6619 |
|---|---|
| 1 local L = LibStub("AceLocale-3.0"):GetLocale("ICU") | |
| 2 if not L then return end | |
| 3 | |
| 4 local icu = LibStub("AceAddon-3.0"):NewAddon("ICU", "AceEvent-3.0", "AceTimer-3.0"); | |
| 5 | |
| 6 -- Accepted flasks | |
| 7 local flaskID = { | |
| 8 79469, -- Flask of Steelskin | |
| 9 79470, -- Flask of the Draconic Mind | |
| 10 79471, -- Flask of the Winds | |
| 11 79472, -- Flask of Titanic Strength | |
| 12 94160, -- Flask of Flowing Water | |
| 13 }; | |
| 14 | |
| 15 -- Accepted well-fed buffs | |
| 16 local foodID = { | |
| 17 87545, -- 90 Strength | |
| 18 87546, -- 90 Agility | |
| 19 87547, -- 90 Intellect | |
| 20 87548, -- 90 Spirit | |
| 21 87549, -- 90 Mastery | |
| 22 87550, -- 90 Hit | |
| 23 87551, -- 90 Crit | |
| 24 87552, -- 90 Haste | |
| 25 }; | |
| 26 | |
| 27 | |
| 28 local minFlaskDuration = 10; | |
| 29 local noFlask, noFood, hasLowDuration = {},{},{}; | |
| 30 | |
| 31 local defaults = { | |
| 32 profile = { | |
| 33 checkFlask = true, | |
| 34 checkFood = true, | |
| 35 checkLowFlaskDuration = true, | |
| 36 remindRaider = true, | |
| 37 reportResults = true, | |
| 38 reportDestination = "OFFICER", | |
| 39 manualCheckOnly = false, | |
| 40 checkAfterFinish = true, | |
| 41 advertiseICU = true, | |
| 42 noFoodMessage = L["Well Fed reminder!"], | |
| 43 noFlaskMessage = L["Flask reminder!"], | |
| 44 lowFlaskDurationMessage = L["Your Flask runs out in less than 10 minutes!"], | |
| 45 } | |
| 46 } | |
| 47 | |
| 48 function icu:OnInitialize() | |
| 49 self.db = LibStub("AceDB-3.0"):New("icuDB", defaults, true) | |
| 50 | |
| 51 self.db.RegisterCallback(self, "OnProfileChanged", "refreshConfig") | |
| 52 self.db.RegisterCallback(self, "OnProfileCopied", "refreshConfig") | |
| 53 self.db.RegisterCallback(self, "OnProfileReset", "refreshConfig") | |
| 54 | |
| 55 self.options = self:getOptions() | |
| 56 | |
| 57 local AceConfig = LibStub("AceConfig-3.0") | |
| 58 local AceConfigDialog = LibStub("AceConfigDialog-3.0") | |
| 59 | |
| 60 AceConfig:RegisterOptionsTable("ICU", self.options, {"icu"}) | |
| 61 | |
| 62 AceConfigDialog:AddToBlizOptions("ICU", nil, nil, "general") | |
| 63 AceConfigDialog:AddToBlizOptions("ICU", "Profiles","ICU","profile") | |
| 64 end | |
| 65 | |
| 66 function icu:refreshConfig() | |
| 67 --print("ICU: Config refreshing ..."); | |
| 68 | |
| 69 if self.db.profile.manualCheckOnly then | |
| 70 icu:UnregisterEvent("READY_CHECK"); | |
| 71 else | |
| 72 icu:RegisterEvent("READY_CHECK"); | |
| 73 end | |
| 74 | |
| 75 --print("ICU: Config refreshed!"); | |
| 76 end | |
| 77 | |
| 78 function icu:config() | |
| 79 InterfaceOptionsFrame_OpenToCategory("ICU") | |
| 80 end | |
| 81 | |
| 82 function icu:getOptions() | |
| 83 local options = { | |
| 84 handler = icu, | |
| 85 type = 'group', | |
| 86 args = { | |
| 87 config = { | |
| 88 name = L["Options"], | |
| 89 desc = L["Shows the blizzard addon configuration window"], | |
| 90 type = 'execute', | |
| 91 func = "config", | |
| 92 hidden = true, | |
| 93 cmdHidden = false, | |
| 94 }, | |
| 95 check = { | |
| 96 name = L["Raid Check"], | |
| 97 desc = L["Checks the raid for flask/food buffs"], | |
| 98 type = 'execute', | |
| 99 func = function() self:inspectRaid(false) end, | |
| 100 hidden = true, | |
| 101 cmdHidden = false, | |
| 102 }, | |
| 103 quiet = { | |
| 104 name = L["Raid Check (Silent)"], | |
| 105 desc = L["Checks the raid for flask/food buffs, but does not remind raiders, regardless of other settings."], | |
| 106 type = 'execute', | |
| 107 func = function() self:inspectRaid(true) end, | |
| 108 hidden = true, | |
| 109 cmdHidden = false, | |
| 110 }, | |
| 111 general = { | |
| 112 name = L["General Settings"], | |
| 113 type = 'group', | |
| 114 args = { | |
| 115 checkFlask = { | |
| 116 type = 'toggle', | |
| 117 name = L["Check for Flask"], | |
| 118 desc = L["Checks the raid for valid flasks and reports results"], | |
| 119 set = function(o,v,...) self.db.profile.checkFlask = v end, | |
| 120 get = function() return self.db.profile.checkFlask end, | |
| 121 }, | |
| 122 checkLowFlaskDuration = { | |
| 123 type = 'toggle', | |
| 124 name = L["Flask expiration"], | |
| 125 desc = L["Check for soon to expire flask buffs"], | |
| 126 set = function(o,v,...) self.db.profile.checkLowFlaskDuration = v end, | |
| 127 get = function() return self.db.profile.checkLowFlaskDuration end, | |
| 128 }, | |
| 129 checkFood = { | |
| 130 type = 'toggle', | |
| 131 name = L["Check for Food"], | |
| 132 desc = L["Checks the raid for valid food buffs and reports results"], | |
| 133 set = function(o,v,...) self.db.profile.checkFood = v end, | |
| 134 get = function() return self.db.profile.checkFood end, | |
| 135 }, | |
| 136 advertiseICU = { | |
| 137 type = 'toggle', | |
| 138 name = L["Advertise ICU"], | |
| 139 desc = L["Let everyone know you are using ICU! Prefixes whispers and reports"], | |
| 140 set = function(o,v,...) self.db.profile.advertiseICU = v end, | |
| 141 get = function() return self.db.profile.advertiseICU end, | |
| 142 }, | |
| 143 remindRaider = { | |
| 144 type = 'toggle', | |
| 145 name = L["Raid reminder"], | |
| 146 desc = L["Whisper the raider lacking (or soon to expire, if enabled) food/flask buff a reminder"], | |
| 147 set = function(o,v,...) self.db.profile.remindRaider = v end, | |
| 148 get = function() return self.db.profile.remindRaider end, | |
| 149 }, | |
| 150 reportResults = { | |
| 151 type = 'toggle', | |
| 152 name = L["Report results"], | |
| 153 desc = L["Report the results after finishing"], | |
| 154 set = function(o,v,...) self.db.profile.reportResults = v end, | |
| 155 get = function() return self.db.profile.reportResults end, | |
| 156 }, | |
| 157 reportDestination = { | |
| 158 type = 'select', | |
| 159 style = "dropdown", | |
| 160 name = L["Report Destination"], | |
| 161 desc = L["Report the results to the following channel"], | |
| 162 values = { | |
| 163 ["OFFICER"] = L["Officer"], | |
| 164 ["SAY"] = L["Say"], | |
| 165 ["RAID"] = L["Raid"], | |
| 166 ["GUILD"] = L["Guild"], | |
| 167 ["SELF"] = L["Self"], | |
| 168 }, | |
| 169 set = function(o,v,...) self.db.profile.reportDestination = v end, | |
| 170 get = function() return self.db.profile.reportDestination end, | |
| 171 }, | |
| 172 manualCheckOnly = { | |
| 173 type = 'toggle', | |
| 174 name = L["Manual checks only"], | |
| 175 desc = L["Only perform buff checks if initiated manually (via /icu check)"], | |
| 176 set = function(o,v,...) self.db.profile.manualCheckOnly = v; self:refreshConfig() end, | |
| 177 get = function() return self.db.profile.manualCheckOnly end, | |
| 178 }, | |
| 179 checkAfterFinish = { | |
| 180 type = 'toggle', | |
| 181 name = L["Check after readycheck"], | |
| 182 desc = L["Don't check buffs until ready check has finished (or timed out)"], | |
| 183 set = function(o,v,...) self.db.profile.checkAfterFinish = v end, | |
| 184 get = function() return self.db.profile.checkAfterFinish end, | |
| 185 }, | |
| 186 noFlaskMessage = { | |
| 187 type = 'input', | |
| 188 name = L["Flask reminder"], | |
| 189 desc = L["Message whispered to raiders missing a cataclysm flask"], | |
| 190 set = function(o,v,...) self.db.profile.noFlaskMessage = v end, | |
| 191 get = function() return self.db.profile.noFlaskMessage end, | |
| 192 }, | |
| 193 lowFlaskDurationMessage = { | |
| 194 type = 'input', | |
| 195 name = L["Flask expiration"], | |
| 196 desc = L["Message whispered to raiders with less than 10 minutes left on their flask"], | |
| 197 set = function(o,v,...) self.db.profile.lowFlaskDurationMessage = v end, | |
| 198 get = function() return self.db.profile.lowFlaskDurationMessage end, | |
| 199 }, | |
| 200 noFoodMessage = { | |
| 201 type = 'input', | |
| 202 name = L["Food reminder"], | |
| 203 desc = L["Message whispered to raiders missing the well-fed buff"], | |
| 204 set = function(o,v,...) self.db.profile.noFoodMessage = v end, | |
| 205 get = function() return self.db.profile.noFoodMessage end, | |
| 206 }, | |
| 207 | |
| 208 } | |
| 209 }, | |
| 210 profile = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.db), | |
| 211 }, | |
| 212 } | |
| 213 return options | |
| 214 end | |
| 215 | |
| 216 function icu:inspectRaid(silent) | |
| 217 -- Not in a raid group | |
| 218 local icuAd = ""; | |
| 219 | |
| 220 if GetNumRaidMembers() == 0 then | |
| 221 return true | |
| 222 end | |
| 223 | |
| 224 if self.db.profile.advertiseICU then | |
| 225 icuAd = L["ICU"] .. ": "; | |
| 226 else | |
| 227 icuAd = ""; | |
| 228 end | |
| 229 | |
| 230 for i = 1, GetNumRaidMembers() do | |
| 231 local raider = GetRaidRosterInfo(i); | |
| 232 if raider then | |
| 233 | |
| 234 local hasFood, hasFlask, hasLowDuration = icu:validateBuffs(i); | |
| 235 | |
| 236 if not hasFood and self.db.profile.checkFood then | |
| 237 noFood[#noFood+1] = raider; | |
| 238 -- Tell player | |
| 239 if self.db.profile.remindRaider and not silent then | |
| 240 SendChatMessage(icuAd .. self.db.profile.noFoodMessage,"WHISPER",nil,raider); | |
| 241 end | |
| 242 end | |
| 243 | |
| 244 if not hasFlask and self.db.profile.checkFlask then | |
| 245 noFlask[#noFlask+1] = raider; | |
| 246 -- Tell player | |
| 247 if self.db.profile.remindRaider and not silent then | |
| 248 SendChatMessage(icuAd .. self.db.profile.noFlaskMessage,"WHISPER",nil,raider); | |
| 249 end | |
| 250 elseif hasLowDuration and not silent then | |
| 251 if self.db.profile.remindRaider and self.db.profile.checkLowFlaskDuration then | |
| 252 SendChatMessage(icuAd .. self.db.profile.lowFlaskDurationMessage,"WHISPER",nil,raider); | |
| 253 end | |
| 254 end | |
| 255 end | |
| 256 | |
| 257 end | |
| 258 | |
| 259 if self.db.profile.reportResults and (#noFlask > 0 or #noFood > 0) and self.db.profile.advertiseICU and self.db.profile.reportDestination ~= "SELF" then | |
| 260 SendChatMessage("---- "..L["ICU"].." "..L["Report"].." ----",self.db.profile.reportDestination,nil,nil); | |
| 261 end | |
| 262 | |
| 263 if self.db.profile.reportResults then | |
| 264 if #noFlask > 0 and self.db.profile.checkFlask then | |
| 265 local reportFlaskMessage = L["Missing Flask"]..": " .. table.concat(noFlask, ", "); | |
| 266 | |
| 267 if self.db.profile.reportDestination == "SELF" then | |
| 268 DEFAULT_CHAT_FRAME:AddMessage(reportFlaskMessage); | |
| 269 else | |
| 270 SendChatMessage(reportFlaskMessage,self.db.profile.reportDestination,nil,nil); | |
| 271 end | |
| 272 end | |
| 273 | |
| 274 if #noFood > 0 and self.db.profile.checkFood then | |
| 275 local reportFoodMessage = L["Missing Food"]..": " .. table.concat(noFood, ", "); | |
| 276 | |
| 277 if self.db.profile.reportDestination == "SELF" then | |
| 278 DEFAULT_CHAT_FRAME:AddMessage(reportFoodMessage); | |
| 279 else | |
| 280 SendChatMessage(reportFoodMessage,self.db.profile.reportDestination,nil,nil); | |
| 281 end | |
| 282 end | |
| 283 end | |
| 284 | |
| 285 noFlask, noFood, hasLowDuration = {},{},{}; | |
| 286 end | |
| 287 | |
| 288 function icu:validateBuffs(playerIndex) | |
| 289 local i = 1; | |
| 290 local hasFood, hasFlask, hasLowDuration = false, false, false; | |
| 291 local name, _, _, _, _, _, expirationTime, _, _, _, spellId = UnitBuff("raid"..playerIndex,i); | |
| 292 | |
| 293 while name do | |
| 294 -- Check for food | |
| 295 if not hasFood then | |
| 296 for k,v in ipairs(foodID) do | |
| 297 if v == spellId then | |
| 298 hasFood = true; | |
| 299 end | |
| 300 end | |
| 301 end | |
| 302 -- Check for flask | |
| 303 if not hasFlask then | |
| 304 for k,v in ipairs(flaskID) do | |
| 305 if v == spellId then | |
| 306 hasFlask = true; | |
| 307 -- Check if low duration | |
| 308 if expirationTime and ((expirationTime-GetTime())/60) <= minFlaskDuration then | |
| 309 hasLowDuration = true; | |
| 310 end | |
| 311 end | |
| 312 end | |
| 313 end | |
| 314 i = i + 1; | |
| 315 name, _, _, _, _, _, expirationTime, _, _, _, spellId = UnitBuff("raid"..playerIndex,i); | |
| 316 end | |
| 317 | |
| 318 return hasFood, hasFlask, hasLowDuration; | |
| 319 end | |
| 320 | |
| 321 function icu:READY_CHECK() | |
| 322 --print("Ready check init!"); | |
| 323 if self.db.profile.manualCheckOnly then | |
| 324 icu:UnregisterEvent("READY_CHECK"); | |
| 325 return true; | |
| 326 end | |
| 327 | |
| 328 if not self.db.profile.checkAfterFinish then | |
| 329 self:inspectRaid(); | |
| 330 else | |
| 331 self:ScheduleTimer("READY_CHECK_FINISHED", 30); | |
| 332 self:RegisterEvent("READY_CHECK_FINISHED"); | |
| 333 end | |
| 334 end | |
| 335 | |
| 336 function icu:READY_CHECK_FINISHED() | |
| 337 --print("Ready check finish!"); | |
| 338 self:UnregisterEvent("READY_CHECK_FINISHED"); | |
| 339 self:CancelAllTimers(); | |
| 340 self:inspectRaid(); | |
| 341 end | |
| 342 | |
| 343 function icu:filterChat(self, event, msg) | |
| 344 if msg == self.db.profile.noFoodMessage or msg == self.db.profile.noFlaskMessage or msg == self.db.profile.lowFlaskDurationMessage or msg == L["ICU"]..": "..self.db.profile.noFoodMessage or msg == L["ICU"]..": "..self.db.profile.noFlaskMessage or msg == L["ICU"]..": "..self.db.profile.lowFlaskDurationMessage then return true end | |
| 345 end | |
| 346 ChatFrame_AddMessageEventFilter("CHAT_MSG_WHISPER_ICU_INFORM", icu:filterChat) | |
| 347 | |
| 348 icu:RegisterEvent("READY_CHECK"); | |
| 349 | |
| 350 --@do-not-package@ | |
| 351 function icu:test(cond) | |
| 352 if true and not cond then | |
| 353 print("First.") | |
| 354 else | |
| 355 print("Second.") | |
| 356 end | |
| 357 end | |
| 358 | |
| 359 function icu:grabVar(var) | |
| 360 print(self.db.profile[var]) | |
| 361 end | |
| 362 | |
| 363 _G.icu = icu; | |
| 364 --@end-do-not-package@ |
