Mercurial > wow > reaction
comparison modules/ReAction_State/ReAction_State.lua @ 65:5ea65ec7d162
Fixed stance initializers for locale-independent behavior as well as proper initialization for druids (after PLAYER_AURAS_CHANGED)
| author | Flick <flickerstreak@gmail.com> |
|---|---|
| date | Wed, 28 May 2008 17:26:27 +0000 |
| parents | 2000f4f4c6af |
| children | 44d3716aba8d |
comparison
equal
deleted
inserted
replaced
| 64:2000f4f4c6af | 65:5ea65ec7d162 |
|---|---|
| 9 local _G = _G | 9 local _G = _G |
| 10 local InCombatLockdown = InCombatLockdown | 10 local InCombatLockdown = InCombatLockdown |
| 11 | 11 |
| 12 -- module declaration | 12 -- module declaration |
| 13 local moduleID = "State" | 13 local moduleID = "State" |
| 14 local module = ReAction:NewModule( moduleID ) | 14 local module = ReAction:NewModule( moduleID, "AceEvent-3.0" ) |
| 15 | |
| 16 | |
| 17 -- module event handlers | |
| 18 function module:OnInitialize() | |
| 19 self.db = ReAction.db:RegisterNamespace( moduleID, | |
| 20 { | |
| 21 profile = { | |
| 22 bars = { }, | |
| 23 } | |
| 24 } | |
| 25 ) | |
| 26 | |
| 27 ReAction:RegisterBarOptionGenerator(self, "GetBarOptions") | |
| 28 | |
| 29 ReAction.RegisterCallback(self, "OnCreateBar","OnRefreshBar") | |
| 30 ReAction.RegisterCallback(self, "OnRefreshBar") | |
| 31 ReAction.RegisterCallback(self, "OnEraseBar") | |
| 32 ReAction.RegisterCallback(self, "OnRenameBar") | |
| 33 ReAction.RegisterCallback(self, "OnConfigModeChanged") | |
| 34 end | |
| 35 | |
| 36 function module:OnRefreshBar(event, bar, name) | |
| 37 local c = self.db.profile.bars[name] | |
| 38 if c then | |
| 39 self:UpdateStates(bar) | |
| 40 end | |
| 41 end | |
| 42 | |
| 43 function module:OnEraseBar(event, bar, name) | |
| 44 self.db.profile.bars[name] = nil | |
| 45 end | |
| 46 | |
| 47 function module:OnRenameBar(event, bar, oldname, newname) | |
| 48 local b = self.db.profile.bars | |
| 49 bars[newname], bars[oldname] = bars[oldname], nil | |
| 50 end | |
| 51 | |
| 52 function module:OnConfigModeChanged(event, mode) | |
| 53 -- TODO: unregister all state drivers (temporarily) and hidestates | |
| 54 end | |
| 55 | |
| 56 | |
| 57 | |
| 58 | 15 |
| 59 -- Utility -- | 16 -- Utility -- |
| 60 | 17 |
| 61 -- traverse a table tree by key list and fetch the result or first nil | 18 -- traverse a table tree by key list and fetch the result or first nil |
| 62 local function tfetch(t, ...) | 19 local function tfetch(t, ...) |
| 75 end | 32 end |
| 76 return t | 33 return t |
| 77 end | 34 end |
| 78 | 35 |
| 79 -- PRIVATE -- | 36 -- PRIVATE -- |
| 80 local BuildRuleString, ApplyStates | 37 local InitRules, ApplyStates |
| 81 do | 38 do |
| 82 local forms = { } | 39 local ruleformats = { } |
| 83 for i = 1, GetNumShapeshiftForms() do | 40 |
| 84 local icon, name = GetShapeshiftFormInfo(i) | 41 function InitRules() |
| 85 forms[name] = i; | 42 local forms = { } |
| 86 end | 43 for i = 1, GetNumShapeshiftForms() do |
| 87 -- TODO: need to find out if form name is localized, it probably is | 44 local icon = GetShapeshiftFormInfo(i) |
| 88 local dStance = forms["Defensive Stance"] or 2 | 45 forms[icon] = i; |
| 89 local zStance = forms["Berserker Stance"] or 3 | 46 end |
| 90 local bForm = forms["Dire Bear Form"] or forms["Bear Form"] or 1 | 47 -- sort by icon since it's locale-independent |
| 91 local cForm = forms["Cat Form"] or 3 | 48 -- use 9 if not found since 9 is never a valid stance/form |
| 92 local tForm = forms["Tree of Life"] or forms["Moonkin Form"] or 5 | 49 -- we do these shenanigans instead of hardcoding the stances because |
| 93 local aForm = forms["Aquatic Form"] or 2 | 50 -- the ordering varies if the character is missing a form. For warriors |
| 94 local trForm = forms["Travel Form"] or 4 | 51 -- this is rarely a problem but for druids it can be. Some people never bother |
| 95 local fForm = forms["Flight Form"] or forms["Swift Flight Form"] or 6 | 52 -- to do the aquatic form quest, and stance 5 can be either flight or tree/boomkin |
| 96 | 53 -- depending on talents. |
| 97 -- TODO: do the macro conditional strings need to be localized? | 54 local defensive = forms["Interface\\Icons\\Ability_Warrior_DefensiveStance"] or 9 |
| 98 -- they're not contained in GlobalStrings.lua, but the parsing is done | 55 local berserker = forms["Interface\\Icons\\Ability_Racial_Avatar"] or 9 |
| 99 -- via the C function SecureCmdOptionParse(), so it's not clear | 56 local bear = forms["Interface\\Icons\\Ability_Racial_BearForm"] or 9 -- bear and dire bear share the same icon |
| 100 local ruleformats = { | 57 local aquatic = forms["Interface\\Icons\\Ability_Druid_AquaticForm"] or 9 |
| 101 battle = "stance:1", | 58 local cat = forms["Interface\\Icons\\Ability_Druid_CatForm"] or 9 |
| 102 defensive = ("stance:%d"):format(dStance), | 59 local travel = forms["Interface\\Icons\\Ability_Druid_TravelForm"] or 9 |
| 103 berserker = ("stance:%d"):format(zStance), | 60 local treekin = forms["Interface\\Icons\\Ability_Druid_TreeofLife"] or forms["Interface\\Icons\\Spell_Nature_ForceOfNature"] or 9 |
| 104 caster = ("form:0/%d/%d/%d"):format(aForm, trForm, fForm), | 61 local flight = forms["Interface\\Icons\\Ability_Druid_FlightForm"] or 9 -- both flight and swift flight share the same icon |
| 105 bear = ("form:%d"):format(bForm), | 62 |
| 106 cat = ("form:%d"):format(cForm), | 63 -- As far as I can tell the macro clauses are NOT locale-specific. |
| 107 treeOrMoonkin = ("form:%d"):format(tForm), | 64 ruleformats.battle = "stance:1" |
| 108 stealth = "stealth", | 65 ruleformats.defensive = ("stance:%d"):format(defensive) |
| 109 nostealth = "nostealth", | 66 ruleformats.berserker = ("stance:%d"):format(berserker) |
| 110 shadowform = "form:1", | 67 ruleformats.caster = ("form:0/%d/%d/%d"):format(aquatic, travel, flight) |
| 111 noshadowform = "noform", | 68 ruleformats.bear = ("form:%d"):format(bear) |
| 112 pet = "pet", | 69 ruleformats.cat = ("form:%d"):format(cat) |
| 113 nopet = "nopet", | 70 ruleformats.treeOrMoonkin = ("form:%d"):format(treekin) |
| 114 harm = "target=target,harm", | 71 ruleformats.stealth = "stealth" |
| 115 help = "target=target,help", | 72 ruleformats.nostealth = "nostealth" |
| 116 notarget = "target=target,noexists", | 73 ruleformats.shadowform = "form:1" |
| 117 focusharm = "target=focus,harm", | 74 ruleformats.noshadowform = "noform" |
| 118 focushelp = "target=focus,help", | 75 ruleformats.pet = "pet" |
| 119 nofocus = "target=focus,noexists", | 76 ruleformats.nopet = "nopet" |
| 120 raid = "group:raid", | 77 ruleformats.harm = "target=target,harm" |
| 121 party = "group:party", | 78 ruleformats.help = "target=target,help" |
| 122 solo = "nogroup", | 79 ruleformats.notarget = "target=target,noexists" |
| 123 combat = "combat", | 80 ruleformats.focusharm = "target=focus,harm" |
| 124 nocombat = "nocombat", | 81 ruleformats.focushelp = "target=focus,help" |
| 125 } | 82 ruleformats.nofocus = "target=focus,noexists" |
| 126 | 83 ruleformats.raid = "group:raid" |
| 127 function BuildRuleString(states) | 84 ruleformats.party = "group:party" |
| 85 ruleformats.solo = "nogroup" | |
| 86 ruleformats.combat = "combat" | |
| 87 ruleformats.nocombat = "nocombat" | |
| 88 end | |
| 89 | |
| 90 local function BuildRuleString(states) | |
| 128 local s = "" | 91 local s = "" |
| 129 local default | 92 local default |
| 130 local sorted = { } | 93 local sorted = { } |
| 131 for name in pairs(states) do | 94 for name in pairs(states) do |
| 132 table.insert(sorted,name) | 95 table.insert(sorted,name) |
| 198 end | 161 end |
| 199 end | 162 end |
| 200 end | 163 end |
| 201 end | 164 end |
| 202 | 165 |
| 166 | |
| 167 -- module event handlers | |
| 168 function module:OnInitialize() | |
| 169 self.db = ReAction.db:RegisterNamespace( moduleID, | |
| 170 { | |
| 171 profile = { | |
| 172 bars = { }, | |
| 173 } | |
| 174 } | |
| 175 ) | |
| 176 | |
| 177 InitRules() | |
| 178 self:RegisterEvent("PLAYER_AURAS_CHANGED") | |
| 179 | |
| 180 ReAction:RegisterBarOptionGenerator(self, "GetBarOptions") | |
| 181 | |
| 182 ReAction.RegisterCallback(self, "OnCreateBar","OnRefreshBar") | |
| 183 ReAction.RegisterCallback(self, "OnRefreshBar") | |
| 184 ReAction.RegisterCallback(self, "OnEraseBar") | |
| 185 ReAction.RegisterCallback(self, "OnRenameBar") | |
| 186 ReAction.RegisterCallback(self, "OnConfigModeChanged") | |
| 187 end | |
| 188 | |
| 189 function module:PLAYER_AURAS_CHANGED() | |
| 190 self:UnregisterEvent("PLAYER_AURAS_CHANGED") | |
| 191 -- for some classes the number of stances is 0 until this event fires | |
| 192 InitRules() | |
| 193 end | |
| 194 | |
| 195 function module:OnRefreshBar(event, bar, name) | |
| 196 local c = self.db.profile.bars[name] | |
| 197 if c then | |
| 198 self:UpdateStates(bar) | |
| 199 end | |
| 200 end | |
| 201 | |
| 202 function module:OnEraseBar(event, bar, name) | |
| 203 self.db.profile.bars[name] = nil | |
| 204 end | |
| 205 | |
| 206 function module:OnRenameBar(event, bar, oldname, newname) | |
| 207 local b = self.db.profile.bars | |
| 208 bars[newname], bars[oldname] = bars[oldname], nil | |
| 209 end | |
| 210 | |
| 211 function module:OnConfigModeChanged(event, mode) | |
| 212 -- TODO: unregister all state drivers (temporarily) and hidestates | |
| 213 end | |
| 203 | 214 |
| 204 | 215 |
| 205 -- API -- | 216 -- API -- |
| 206 | 217 |
| 207 function module:UpdateStates( bar ) | 218 function module:UpdateStates( bar ) |
