Mercurial > wow > skeletonkey
comparison SkeletonKey/BindingsUI.lua @ 17:500f9b2bd9ac
- for RegisterAction, use a function table instead of that if/then rats nest
- consequently pet bar actions work now
- unlocalize bindings data
- activate keyslot input manually instead of on mouse over
- activate checkbox to keep input mode active
- dynamic buttons update in real time for petaction/talent/profession spells
author | Nenue |
---|---|
date | Sat, 30 Jul 2016 00:08:00 -0400 |
parents | cdd387d39137 |
children | 91398d284a99 |
comparison
equal
deleted
inserted
replaced
16:cdd387d39137 | 17:500f9b2bd9ac |
---|---|
4 -- %file-revision% | 4 -- %file-revision% |
5 -- Code piecing the interface together | 5 -- Code piecing the interface together |
6 | 6 |
7 local kb, print = LibStub("LibKraken").register(KeyBinder, 'KeySlot') | 7 local kb, print = LibStub("LibKraken").register(KeyBinder, 'KeySlot') |
8 local BINDS_PER_ROW = 2 | 8 local BINDS_PER_ROW = 2 |
9 local BINDING_TYPE_SPECIALIZATION = 3 | |
10 local BINDING_TYPE_CHARACTER = 2 | |
11 local BINDING_TYPE_GLOBAL = 1 | |
9 local BUTTON_HSPACING = 128 | 12 local BUTTON_HSPACING = 128 |
10 local BUTTON_SPACING = 4 | 13 local BUTTON_SPACING = 4 |
11 local BUTTON_PADDING = 12 | 14 local BUTTON_PADDING = 12 |
12 local BINDING_TYPE_SPECIALIZATION = 3 | |
13 local BINDING_TYPE_CHARACTER = 2 | |
14 local BINDING_TYPE_GLOBAL = 1 | |
15 local KEY_BUTTON_SIZE = 48 | 15 local KEY_BUTTON_SIZE = 48 |
16 local MIN_BIND_SLOTS = 32 | 16 local NUM_KEY_SLOTS = BINDS_PER_ROW * 8 |
17 local TAB_OFFSET = 12 | |
18 local TAB_HEIGHT = 40 | 17 local TAB_HEIGHT = 40 |
19 local TAB_SPACING = 2 | |
20 | 18 |
21 local BINDING_SCHEME_COLOR = { | 19 local BINDING_SCHEME_COLOR = { |
22 [BINDING_TYPE_GLOBAL] = {0,.125,.5,.5}, | 20 [BINDING_TYPE_GLOBAL] = {0,.125,.5,.5}, |
23 [BINDING_TYPE_CHARACTER] = {0,0.25,0,0.5}, | 21 [BINDING_TYPE_CHARACTER] = {0,0.25,0,0.5}, |
24 [BINDING_TYPE_SPECIALIZATION] = {.25,0,0,0.5}, | 22 [BINDING_TYPE_SPECIALIZATION] = {.25,0,0,0.5}, |
34 [BINDING_TYPE_GLOBAL] = {0, 1, 1} | 32 [BINDING_TYPE_GLOBAL] = {0, 1, 1} |
35 } | 33 } |
36 | 34 |
37 local restingAlpha = 0.7 | 35 local restingAlpha = 0.7 |
38 local fadeTime, fadeDelay = .30, 0.15 | 36 local fadeTime, fadeDelay = .30, 0.15 |
39 local numButtons = BINDS_PER_ROW * 8 | |
40 local saveButton | 37 local saveButton |
41 local KeyButton_OnKey = function(self, key) | 38 |
42 kb.StoreBinding(self.saveTarget, key) | 39 local KeyButton_OnKeyDown = function(self, key) |
43 kb:SetScript('OnKeyUp', nil) | 40 end |
44 kb:SetScript('OnKeyDown', nil) | 41 local KeyButton_OnKeyUp = function(self, key) |
42 if key == 'ESCAPE' then | |
43 kb.DeactivateSlot(kb.saveTarget) | |
44 else | |
45 | |
46 if key:match('[RL]SHIFT') or key:match('[RL]ALT') or key:match('[RL]CTRL') then | |
47 return | |
48 end | |
49 kb.SaveSlot(kb.saveTarget, key) | |
50 | |
51 if not kb.stickyMode then | |
52 kb:SetScript('OnKeyUp', nil) | |
53 kb:SetScript('OnKeyDown', nil) | |
54 kb.saveTarget = nil | |
55 end | |
56 end | |
57 kb.ui() | |
45 end | 58 end |
46 | 59 |
47 local KeyButton_OnClick = function(self, click) | 60 local KeyButton_OnClick = function(self, click) |
48 print(self:GetName(), 'OnMouseDown', click) | 61 print(self:GetName(), 'OnMouseDown', click) |
49 local cursorType = GetCursorInfo() | 62 local cursorType = GetCursorInfo() |
50 if click == 'LeftButton' then | 63 if click == 'LeftButton' then |
51 if cursorType then | 64 if cursorType then |
52 kb.DropToSlot(self) | 65 kb.DropToSlot(self) |
53 else | 66 else |
67 if IsShiftKeyDown() then | |
68 kb.stickyMode = true | |
69 KeyBinderStickyMode:SetChecked(true) | |
70 | |
71 kb.saveTarget = button | |
72 kb:SetScript('OnKeyUp', KeyButton_OnKeyUp) | |
73 kb:SetScript('OnKeyDown', KeyButton_OnKeyDown) | |
74 end | |
75 | |
54 kb.ActivateSlot(self) | 76 kb.ActivateSlot(self) |
77 kb.ui() | |
55 end | 78 end |
56 elseif click == 'RightButton' then | 79 elseif click == 'RightButton' then |
57 kb.ReleaseSlot(self) | 80 kb.ReleaseSlot(self) |
58 end | 81 end |
59 end | 82 end |
117 | 140 |
118 end | 141 end |
119 else | 142 else |
120 if self.active then | 143 if self.active then |
121 self.active = nil | 144 self.active = nil |
122 self:SetScript('OnKeyDown', nil) | |
123 end | 145 end |
124 end | 146 end |
125 end | 147 end |
126 | 148 |
127 local KeyBinder_OnMouseWheel = function(self, delta) | 149 local KeyBinder_OnMouseWheel = function(self, delta) |
139 return | 161 return |
140 end | 162 end |
141 kb.scrollOffset = ceil(kb.scrollOffset - (delta * BINDS_PER_ROW)) | 163 kb.scrollOffset = ceil(kb.scrollOffset - (delta * BINDS_PER_ROW)) |
142 end | 164 end |
143 | 165 |
166 for i = 1, #kb.buttons do | |
167 kb.buttons[i]:SetSize(KEY_BUTTON_SIZE,KEY_BUTTON_SIZE) | |
168 end | |
169 | |
144 kb.ui(true) | 170 kb.ui(true) |
145 end | 171 end |
146 | 172 |
147 local KeyBinder_OnHide = function() | 173 local KeyBinder_OnHide = function() |
148 KeyBinderImportLog:Hide() | 174 KeyBinderImportLog:Hide() |
157 end | 183 end |
158 local SaveButton_OnClick = function() | 184 local SaveButton_OnClick = function() |
159 kb.ConfirmBindings() | 185 kb.ConfirmBindings() |
160 end | 186 end |
161 | 187 |
188 | |
162 local KeyBinder_Initialize = function() | 189 local KeyBinder_Initialize = function() |
163 | 190 do |
164 | 191 local leftSlot, upSlot |
165 kb.scrollOffset = 0 | 192 for index = 1, NUM_KEY_SLOTS do |
166 kb.tabAnchor = {'TOPLEFT', kb.profilebg, 'TOPLEFT', BUTTON_PADDING, -BUTTON_SPACING} | 193 |
167 kb.tabGrowth = {'TOPLEFT', nil,'TOPRIGHT', BUTTON_SPACING, 0} | |
168 kb.tabSize = {TAB_HEIGHT, TAB_HEIGHT } | |
169 kb.UIPanelAnchor = {'TOPLEFT', kb.sourcesbg, 'TOPLEFT', BUTTON_PADDING, -BUTTON_SPACING} | |
170 kb.UIPanelGrowth = {'TOPLEFT', nil, 'BOTTOMLEFT', 0, -2 } | |
171 kb.UIPanelSize = {84, 32 } | |
172 kb.UIPanelIcon = {24, 32, 'LEFT', -12, 0} | |
173 kb.controlsAnchor = {'BOTTOMLEFT', kb.footer, BUTTON_PADDING, BUTTON_PADDING } | |
174 kb.controlsGrowth = {'BOTTOMLEFT', nil, 'BOTTOMRIGHT', BUTTON_SPACING, 0} | |
175 | |
176 -- order of these is important | |
177 kb:tab('KeyBinderGlobalTab', | |
178 kb.configTitle[BINDING_TYPE_GLOBAL] .. '\n' .. kb.configDescription[BINDING_TYPE_GLOBAL], "Interface\\ICONS\\item_azereansphere", {0.15,.85,.15,.85}) | |
179 kb:tab('KeyBinderCharacterTab', | |
180 kb.configHeaders[BINDING_TYPE_CHARACTER] .. '\n' .. kb.configDescription[BINDING_TYPE_CHARACTER], nil) | |
181 kb:tab('KeyBinderSpecTab', | |
182 kb.configHeaders[BINDING_TYPE_SPECIALIZATION] .. '\n' .. kb.configDescription[BINDING_TYPE_SPECIALIZATION], kb.specInfo.texture) | |
183 KeyBinderCharacterTab.icon:SetTexCoord(0.15,.85,.15,.85) | |
184 | |
185 | |
186 | |
187 --portraitLayers[1] = KeyBinderCharacterTab.icon | |
188 | |
189 saveButton = kb:button('KeyBinderSaveButton', 'Refresh', 'Reload current bindings and refresh panel.', SaveButton_OnClick) | |
190 --restoreButton = kb:button('KeyBinderRestoreButton', 'Discard', 'Revert all changes.', CancelButton_OnClick) | |
191 --clearButton = kb:button('KeyBinderClearButton', 'Clear Page', 'Release all buttons.', ResetButton_OnClick) | |
192 | |
193 kb:uibutton( | |
194 'KeyBinderSpellBookButton', 'SpellBook', nil, | |
195 function() ToggleSpellBook(BOOKTYPE_SPELL) end, | |
196 "Interface\\BUTTONS\\UI-MicroButton-Spellbook-Up", {0, 1, .4, 1}) | |
197 kb:uibutton( | |
198 'KeyBinderTalentFrameButton', TALENTS, SPECIALIZATION, | |
199 function() ToggleTalentFrame() end, | |
200 "Interface\\BUTTONS\\UI-MicroButton-Talents-Up", {0, 1, .4, 1}) | |
201 | |
202 kb:uibutton( | |
203 'KeyBinderMacroFrameButton', 'Macros', nil, | |
204 function() if MacroFrame and MacroFrame:IsVisible() then | |
205 HideUIPanel(MacroFrame) | |
206 else | |
207 ShowMacroFrame() end | |
208 end, | |
209 "Interface\\BUTTONS\\UI-MicroButton-Help-Up", {0, 1, .4, 1}) | |
210 | |
211 kb:uibutton( | |
212 'KeyBinderInventoryButton', 'Bags', nil, | |
213 function() OpenAllBags() end, | |
214 "Interface\\BUTTONS\\UI-MicroButtonCharacter-Up", {0, 1, .4, 1}) | |
215 | |
216 | |
217 | |
218 kb.info:SetPoint('TOPLEFT', kb.UIPanels[1], 'BOTTOMLEFT', 0, -BUTTON_SPACING) | |
219 HEADER_OFFSET = kb.UIPanels[1]:GetHeight() + BUTTON_PADDING | |
220 + kb.info:GetHeight() | |
221 FOOTER_OFFSET = saveButton:GetHeight() + BUTTON_PADDING | |
222 | |
223 kb:SetScript('OnHide', KeyBinder_OnHide) | |
224 kb:SetScript('OnMouseWheel', KeyBinder_OnMouseWheel) | |
225 kb.CloseButton:SetScript('OnClick', CloseButton_OnClick) | |
226 | |
227 end | |
228 | |
229 | |
230 --- Retrieves button at index; creates said button and instates any stored parameters | |
231 do | |
232 local leftSlot, upSlot | |
233 kb.GetSlot = function(index) | |
234 | |
235 local slot = index + kb.scrollOffset | |
236 | |
237 if not kb.buttons[index] then | |
238 local button = CreateFrame('CheckButton', 'KeyBinderSlot'..index, kb, 'KeyButton') | 194 local button = CreateFrame('CheckButton', 'KeyBinderSlot'..index, kb, 'KeyButton') |
239 button:SetScript('OnClick', KeyButton_OnClick) | 195 button:SetScript('OnClick', KeyButton_OnClick) |
240 button:SetScript('OnUpdate', KeyButton_OnUpdate) | 196 button:SetScript('OnUpdate', KeyButton_OnUpdate) |
241 button:SetScript('OnDragStart', KeyButton_OnDragStart) | 197 button:SetScript('OnDragStart', KeyButton_OnDragStart) |
242 button:SetScript('OnReceiveDrag', KeyButton_OnReceiveDrag) | 198 button:SetScript('OnReceiveDrag', KeyButton_OnReceiveDrag) |
258 button:SetSize(KEY_BUTTON_SIZE, KEY_BUTTON_SIZE) | 214 button:SetSize(KEY_BUTTON_SIZE, KEY_BUTTON_SIZE) |
259 button:Show() | 215 button:Show() |
260 kb.buttons[index] = button | 216 kb.buttons[index] = button |
261 leftSlot = button | 217 leftSlot = button |
262 end | 218 end |
263 return kb.buttons[index] | 219 end |
264 end | 220 |
265 end | 221 |
266 | 222 kb.scrollOffset = 0 |
267 | 223 kb.tabAnchor = {'TOPLEFT', kb.profilebg, 'TOPLEFT', BUTTON_PADDING, -BUTTON_SPACING} |
268 kb.ActivateSlot = function(self) | 224 kb.tabGrowth = {'TOPLEFT', nil,'TOPRIGHT', BUTTON_SPACING, 0} |
269 kb.saveTarget = self | 225 kb.tabSize = {TAB_HEIGHT, TAB_HEIGHT } |
270 kb:SetScript('OnKeyUp', KeyButton_OnKey) | 226 kb.UIPanelAnchor = {'TOPLEFT', kb.sourcesbg, 'TOPLEFT', BUTTON_PADDING, -BUTTON_SPACING} |
271 kb.bg:SetColorTexture(0,.5,0,1) | 227 kb.UIPanelGrowth = {'TOPLEFT', nil, 'BOTTOMLEFT', 0, -2 } |
272 end | 228 kb.UIPanelSize = {84, 32 } |
229 kb.UIPanelIcon = {24, 32, 'LEFT', -12, 0} | |
230 kb.controlsAnchor = {'BOTTOMRIGHT', kb.footer, -BUTTON_PADDING, BUTTON_PADDING } | |
231 kb.controlsGrowth = {'BOTTOMRIGHT', nil, 'BOTTOMLEFT', -BUTTON_SPACING, 0} | |
232 | |
233 -- order of these is important | |
234 kb:tab('KeyBinderGlobalTab', | |
235 kb.configTitle[BINDING_TYPE_GLOBAL] .. '\n' .. kb.configDescription[BINDING_TYPE_GLOBAL], "Interface\\ICONS\\item_azereansphere", {0.15,.85,.15,.85}) | |
236 kb:tab('KeyBinderCharacterTab', | |
237 kb.configHeaders[BINDING_TYPE_CHARACTER] .. '\n' .. kb.configDescription[BINDING_TYPE_CHARACTER], nil) | |
238 kb:tab('KeyBinderSpecTab', | |
239 kb.configHeaders[BINDING_TYPE_SPECIALIZATION] .. '\n' .. kb.configDescription[BINDING_TYPE_SPECIALIZATION], kb.specInfo.texture) | |
240 KeyBinderCharacterTab.icon:SetTexCoord(0.15,.85,.15,.85) | |
241 | |
242 | |
243 | |
244 --portraitLayers[1] = KeyBinderCharacterTab.icon | |
245 -- todo: find some generic icons for refresh/key input,etc | |
246 | |
247 saveButton = kb:button('KeyBinderSaveButton', 'Update', 'Reload current bindings and refresh panel.', SaveButton_OnClick) | |
248 --restoreButton = kb:button('KeyBinderRestoreButton', 'Discard', 'Revert all changes.', CancelButton_OnClick) | |
249 --clearButton = kb:button('KeyBinderClearButton', 'Clear Page', 'Release all buttons.', ResetButton_OnClick) | |
250 | |
251 kb:uibutton( | |
252 'KeyBinderSpellBookButton', 'SpellBook', nil, | |
253 function() ToggleSpellBook(BOOKTYPE_SPELL) end, | |
254 "Interface\\BUTTONS\\UI-MicroButton-Spellbook-Up", {0, 1, .4, 1}) | |
255 kb:uibutton( | |
256 'KeyBinderTalentFrameButton', TALENTS, SPECIALIZATION, | |
257 function() ToggleTalentFrame() end, | |
258 "Interface\\BUTTONS\\UI-MicroButton-Talents-Up", {0, 1, .4, 1}) | |
259 | |
260 kb:uibutton( | |
261 'KeyBinderMacroFrameButton', 'Macros', nil, | |
262 function() if MacroFrame and MacroFrame:IsVisible() then | |
263 HideUIPanel(MacroFrame) | |
264 else | |
265 ShowMacroFrame() end | |
266 end, | |
267 "Interface\\BUTTONS\\UI-MicroButton-Help-Up", {0, 1, .4, 1}) | |
268 | |
269 kb:uibutton( | |
270 'KeyBinderInventoryButton', 'Bags', nil, | |
271 function() OpenAllBags() end, | |
272 "Interface\\BUTTONS\\UI-MicroButtonCharacter-Up", {0, 1, .4, 1}) | |
273 | |
274 KeyBinderStickyMode:SetScript('OnClick', function(self) | |
275 | |
276 kb.stickyMode = self:GetChecked() | |
277 if not kb.stickyMode then | |
278 if kb.saveTarget then | |
279 kb.DeactivateSlot(kb.saveTarget) | |
280 end | |
281 end | |
282 | |
283 kb.ui() | |
284 end) | |
285 | |
286 kb.info:SetPoint('TOPLEFT', kb.UIPanels[1], 'BOTTOMLEFT', 0, -BUTTON_SPACING) | |
287 HEADER_OFFSET = kb.UIPanels[1]:GetHeight() + BUTTON_PADDING | |
288 + kb.info:GetHeight() | |
289 FOOTER_OFFSET = saveButton:GetHeight() + BUTTON_PADDING | |
290 | |
291 kb:SetScript('OnHide', KeyBinder_OnHide) | |
292 kb:SetScript('OnMouseWheel', KeyBinder_OnMouseWheel) | |
293 kb.CloseButton:SetScript('OnClick', CloseButton_OnClick) | |
294 | |
295 end | |
296 | |
297 | |
298 --- Retrieves button at index; creates said button and instates any stored parameters | |
299 | |
300 | |
301 kb.ActivateSlot = function(button) | |
302 kb.saveTarget = button | |
303 kb:SetScript('OnKeyUp', KeyButton_OnKeyUp) | |
304 kb:SetScript('OnKeyDown', KeyButton_OnKeyDown) | |
305 kb.savingText:ClearAllPoints() | |
306 kb.savingText:SetParent(button) | |
307 kb.savingText:SetPoint('BOTTOMLEFT', button, 'TOPLEFT', 0, 0) | |
308 end | |
309 | |
310 kb.DeactivateSlot = function(button) | |
311 kb.saveTarget = nil | |
312 kb:SetScript('OnKeyUp', nil) | |
313 kb:SetScript('OnKeyDown', nil) | |
314 end | |
315 | |
273 | 316 |
274 --- push current information into living UI | 317 --- push current information into living UI |
275 kb.ui = function(force) | 318 kb.ui = function(force) |
276 for i, module in ipairs(kb.modules) do | 319 for i, module in ipairs(kb.modules) do |
277 if module.ui then | 320 if module.ui then |
285 end | 328 end |
286 if not kb.loaded then | 329 if not kb.loaded then |
287 KeyBinder_Initialize() | 330 KeyBinder_Initialize() |
288 kb.loaded = true | 331 kb.loaded = true |
289 end | 332 end |
290 for i = 1, numButtons do | 333 for i, button in ipairs(kb.buttons) do |
291 local button = kb.GetSlot(i) | |
292 button:SetID(i+kb.scrollOffset) | 334 button:SetID(i+kb.scrollOffset) |
293 kb.UpdateSlot(button, force) | 335 kb.UpdateSlot(button, force) |
294 end | 336 end |
295 | 337 |
296 | 338 |
297 --- Frame Sizing | 339 --- Frame Sizing |
298 kb.profilebg:SetHeight(kb.tabSize[2] + BUTTON_PADDING * 2 + kb.profiletext:GetStringHeight()) | 340 kb.profilebg:SetHeight(kb.tabSize[2] + BUTTON_PADDING * 2 + kb.profiletext:GetStringHeight()) |
299 | 341 |
300 kb.bg:SetWidth((KEY_BUTTON_SIZE + BUTTON_HSPACING + BUTTON_SPACING) * BINDS_PER_ROW + BUTTON_PADDING*2 - BUTTON_SPACING) | 342 kb.bg:SetWidth((KEY_BUTTON_SIZE + BUTTON_HSPACING + BUTTON_SPACING) * BINDS_PER_ROW + BUTTON_PADDING*2 - BUTTON_SPACING) |
301 local numRows = numButtons/BINDS_PER_ROW | 343 local numRows = NUM_KEY_SLOTS/BINDS_PER_ROW |
302 | 344 |
303 kb.bg:SetHeight((KEY_BUTTON_SIZE + BUTTON_SPACING) * numRows + BUTTON_PADDING*2 - BUTTON_SPACING) | 345 kb.bg:SetHeight((KEY_BUTTON_SIZE + BUTTON_SPACING) * numRows + BUTTON_PADDING*2 - BUTTON_SPACING) |
304 | 346 |
305 kb:SetHeight(kb.headerbg:GetHeight() + kb.profilebg:GetHeight() + kb.bg:GetHeight() + kb.footer:GetHeight()) | 347 kb:SetHeight(kb.headerbg:GetHeight() + kb.profilebg:GetHeight() + kb.bg:GetHeight() + kb.footer:GetHeight()) |
306 kb:SetWidth((kb.sourcesbg:GetWidth() +(BINDS_PER_ROW * (KEY_BUTTON_SIZE + BUTTON_HSPACING) + (BINDS_PER_ROW - 1) * BUTTON_SPACING + BUTTON_PADDING * 2) )) | 348 kb:SetWidth((kb.sourcesbg:GetWidth() +(BINDS_PER_ROW * (KEY_BUTTON_SIZE + BUTTON_HSPACING) + (BINDS_PER_ROW - 1) * BUTTON_SPACING + BUTTON_PADDING * 2) )) |
307 | 349 |
308 kb.bg:SetColorTexture(unpack(BINDING_SCHEME_COLOR[kb.db.bindMode])) | 350 if kb.saveTarget then |
351 kb.bg:SetColorTexture(.2,.5, .2, .5) | |
352 kb.savingText:Show() | |
353 | |
354 else | |
355 kb.bg:SetColorTexture(unpack(BINDING_SCHEME_COLOR[kb.db.bindMode])) | |
356 kb.savingText:Hide() | |
357 end | |
358 | |
309 for i, tab in ipairs(kb.tabButtons) do | 359 for i, tab in ipairs(kb.tabButtons) do |
310 local border = tab:GetNormalTexture() | 360 local border = tab:GetNormalTexture() |
311 local tabTexture = "Interface\\Buttons\\UI-Quickslot2" | 361 local tabTexture = "Interface\\Buttons\\UI-Quickslot2" |
312 local left, top, right, bottom = -12, 12, 13, -13 | 362 local left, top, right, bottom = -12, 12, 13, -13 |
313 if i == kb.db.bindMode then | 363 if i == kb.db.bindMode then |
335 print(kb.db.bindMode, kb.configHeaders[kb.db.bindMode], kb:GetSize()) | 385 print(kb.db.bindMode, kb.configHeaders[kb.db.bindMode], kb:GetSize()) |
336 print(kb:GetPoint(1)) | 386 print(kb:GetPoint(1)) |
337 | 387 |
338 kb:Show() | 388 kb:Show() |
339 | 389 |
390 if kb.saveTarget then | |
391 KeyBinderUnbindButton:SetParent(kb.saveTarget) | |
392 KeyBinderUnbindButton:SetPoint('TOPRIGHT', kb.saveTarget, 'TOPLEFT', -2,0) | |
393 KeyBinderUnbindButton:Show() | |
394 else | |
395 KeyBinderUnbindButton:Hide() | |
396 end | |
397 | |
398 | |
340 -- Reset this so talent cache can be rebuilt | 399 -- Reset this so talent cache can be rebuilt |
341 kb.talentsPushed = nil | 400 kb.talentsPushed = nil |
342 end | 401 end |
343 | 402 |
344 kb.AcceptAssignment = function(self, ...) | 403 kb.AcceptAssignment = function(self, ...) |