Nenue@50
|
1 --- Devian - Devian.lua
|
Nenue@32
|
2 -- @file-author@
|
Nenue@32
|
3 -- @project-revision@ @project-hash@
|
Nenue@32
|
4 -- @file-revision@ @file-hash@
|
Nenue@0
|
5 if not LibStub then
|
Nenue@0
|
6 print('Something has happened...')
|
Nenue@0
|
7 end
|
Nenue@57
|
8 local MAJOR, MINOR = 'Devian-2.0', 'r@project-revision@'
|
Nenue@0
|
9 Devian = LibStub("AceAddon-3.0"):NewAddon("Devian", "AceConsole-3.0", "AceEvent-3.0")
|
Nenue@46
|
10 local D = _G.Devian
|
Nenue@46
|
11 D:SetDefaultModuleState(false)
|
Nenue@57
|
12 D.L = {}
|
Nenue@57
|
13 setmetatable(D.L, {__index= function(t,k) return k end, __call = function(t,k,...) return string.format((t[k] or k) , ...) end})
|
Nenue@57
|
14 local L = D.L
|
Nenue@47
|
15 local pairs, tostring, tonumber, ipairs, type = pairs, tostring, tonumber, ipairs, type
|
Nenue@47
|
16 local max, rand, format = math.max, math.random, string.format
|
Nenue@47
|
17 local insert, wipe, concat = table.insert, table.wipe, table.concat
|
Nenue@47
|
18 local select, unpack = select, unpack
|
Nenue@47
|
19 local GetNumAddOns, GetAddOnInfo, GetAddOnEnableState, EnableAddOn = GetNumAddOns, GetAddOnInfo, GetAddOnEnableState, EnableAddOn
|
Nenue@47
|
20 local UnitName, DisableAddOn = UnitName, DisableAddOn
|
Nenue@32
|
21 local WORKSPACE_ON, WORKSPACE_OFF = 1, 2
|
Nenue@0
|
22 local PLAYER_REALM = UnitName("player") .. '-' .. GetRealmName()
|
Nenue@18
|
23 local print = _G.print
|
Nenue@9
|
24 local db
|
Nenue@13
|
25 local defaults = {
|
Nenue@32
|
26 ['global'] = {{}, {}},
|
Nenue@13
|
27 ['tags'] = {},
|
Nenue@55
|
28 ['channels'] = {[1] = {
|
Nenue@55
|
29 signature = 'Main',
|
Nenue@55
|
30 index = 1,
|
Nenue@55
|
31 x = 100, y = 800,
|
Nenue@55
|
32 height = 500, width = 600,
|
Nenue@55
|
33 enabled = true}},
|
Nenue@45
|
34 ['profiles'] = {
|
Nenue@45
|
35 {'Main', false},
|
Nenue@45
|
36 {'Devian', true},
|
Nenue@45
|
37 {'Turok', true},
|
Nenue@45
|
38 {'Bam', true}
|
Nenue@45
|
39 },
|
Nenue@33
|
40 primary_channel = 1, -- the channel to which default output is sent
|
Nenue@33
|
41 current_channel = 1, -- the front channel
|
Nenue@33
|
42 max_channel = 1, -- the highest created channel id
|
Nenue@55
|
43 enabled = true, -- allow enabled consoles to appear
|
Nenue@33
|
44 load_message = "Defaults loaded.", -- messages to be displayed after reload
|
Nenue@33
|
45 font = [[Interface\Addons\Devian\font\SourceCodePro-Regular.ttf]], -- font info
|
Nenue@13
|
46 fontsize = 13,
|
Nenue@13
|
47 fontoutline = 'NONE',
|
Nenue@45
|
48
|
Nenue@45
|
49 headergrad = {'VERTICAL', 0, 0, 0, 1,
|
Nenue@45
|
50 1, 0.1, 0.1, 1}, -- header info
|
Nenue@33
|
51 headerdrop = {1,1,1,1},
|
Nenue@45
|
52 headerblend = 'BLEND',
|
Nenue@33
|
53 headeralpha = 1,
|
Nenue@45
|
54 headerfontcolor = {1,1,1,1},
|
Nenue@45
|
55
|
Nenue@45
|
56 backdrop = {1,1,1,1}, -- background frame info
|
Nenue@56
|
57 backgrad = {'VERTICAL', 0, 0, 0, .75, 0,0,0, .65},
|
Nenue@55
|
58 backblend = 'BLEND',
|
Nenue@45
|
59 backalpha = 1,
|
Nenue@45
|
60 backborder = {.5,.5,.5,1},
|
Nenue@45
|
61 backheader = {.25,.25,.25,1},
|
Nenue@45
|
62
|
Nenue@45
|
63 frontdrop = {1,1,1,1}, -- foreground frame info
|
Nenue@56
|
64 frontgrad = {'VERTICAL', 0, 0, 0, 1, 0,0,0, 0.95},
|
Nenue@55
|
65 frontblend = 'BLEND',
|
Nenue@28
|
66 frontalpha = 1,
|
Nenue@45
|
67 frontborder = {.07,.47,1,1},
|
Nenue@45
|
68 frontheader = {1,1,1,1},
|
Nenue@33
|
69 tagcolor = {}, -- tag color repository
|
Nenue@36
|
70 workspace = 2, -- current profile
|
Nenue@47
|
71 last_workspace = 2, -- default workspace to alternate with when just "/dvn" is issued
|
Nenue@47
|
72
|
Nenue@47
|
73 dock_onshow_fade_time = 2.5,
|
Nenue@47
|
74 dock_onshow_fade_from = 1,
|
Nenue@47
|
75 dock_onshow_fade_to = 0.2,
|
Nenue@47
|
76
|
Nenue@47
|
77 dock_alpha_on = 1,
|
Nenue@47
|
78 dock_alpha_off = 0.2,
|
Nenue@47
|
79 dock_fade_in = 0.15,
|
Nenue@47
|
80 dock_fade_out = 0.45,
|
Nenue@47
|
81 dock_button_alpha_on = 1,
|
Nenue@47
|
82 dock_button_alpha_off = 0.2,
|
Nenue@50
|
83 dock_button_fade_in = 0.075,
|
Nenue@55
|
84 dock_button_fade_out = 0.075,
|
Nenue@47
|
85
|
Nenue@55
|
86 movement_fade = true,
|
Nenue@55
|
87 movement_fade_time = 0.15,
|
Nenue@60
|
88 movement_fade_from = 1,
|
Nenue@60
|
89 movement_fade_to = 0,
|
Nenue@60
|
90 movement_translation_x = 25,
|
Nenue@60
|
91 movement_translation_y = 25,
|
Nenue@13
|
92 }
|
Nenue@9
|
93
|
Nenue@13
|
94 local function ScanAddOnList(cmd, ...)
|
Nenue@0
|
95 local list_state
|
Nenue@0
|
96
|
Nenue@14
|
97 local args = {}
|
Nenue@14
|
98 local arg, n = D:GetArgs(cmd, 1)
|
Nenue@14
|
99 while arg do
|
Nenue@47
|
100 insert(args, arg)
|
Nenue@14
|
101 arg, n = D:GetArgs(cmd,1,n)
|
Nenue@14
|
102 end
|
Nenue@14
|
103 local mode, tag, dest = unpack(args)
|
Nenue@0
|
104
|
Nenue@13
|
105
|
Nenue@14
|
106 -- no args, toggle ui
|
Nenue@57
|
107 if mode == 'stack' then
|
Nenue@33
|
108 if db.workspace == 1 then
|
Nenue@57
|
109 return D:Print(L['Need devmode'])
|
Nenue@33
|
110 end
|
Nenue@14
|
111 return D:StackFrames()
|
Nenue@14
|
112 elseif mode == 'grid' then
|
Nenue@33
|
113 if db.workspace == 1 then
|
Nenue@57
|
114 return D:Print(L['Need devmode'])
|
Nenue@33
|
115 end
|
Nenue@14
|
116 return D:DistributeFrames()
|
Nenue@14
|
117 elseif mode == 'tag' then -- tagging
|
Nenue@33
|
118 if db.workspace == 1 then
|
Nenue@57
|
119 return D:Print(L['Need devmode'])
|
Nenue@33
|
120 end
|
Nenue@32
|
121
|
Nenue@36
|
122 local sig
|
Nenue@14
|
123 if tag ~= nil and dest ~= nil then
|
Nenue@36
|
124 --@debug@
|
Nenue@38
|
125 --print(tag, dest)
|
Nenue@36
|
126 --@end-debug@
|
Nenue@36
|
127
|
Nenue@32
|
128 -- convert to ID
|
Nenue@36
|
129 if tonumber(dest) == nil then
|
Nenue@36
|
130 if D.sigID[dest] then
|
Nenue@36
|
131 dest = db.channels[D.sigID[dest]].index
|
Nenue@36
|
132 else
|
Nenue@36
|
133 sig = dest
|
Nenue@36
|
134 end
|
Nenue@42
|
135 else
|
Nenue@42
|
136 dest = tonumber(dest)
|
Nenue@18
|
137 end
|
Nenue@38
|
138 --@debug@
|
Nenue@38
|
139 --print('2 tag,dest,sig', tag, dest, sig)--@end-debug@
|
Nenue@18
|
140
|
Nenue@32
|
141 -- make a new channel?
|
Nenue@36
|
142 local channel
|
Nenue@42
|
143 if not D.db.channels[dest] then
|
Nenue@36
|
144 dest = D.max_channel + 1
|
Nenue@57
|
145 D:Print(L('New channel created', sig and (dest..':'..sig) or dest ))
|
Nenue@36
|
146 channel = D:SetChannel(sig or tag,dest)
|
Nenue@42
|
147 else
|
Nenue@42
|
148
|
Nenue@42
|
149 channel = D.db.channels[dest]
|
Nenue@32
|
150 end
|
Nenue@38
|
151 --@debug@
|
Nenue@42
|
152 --print('3 tag,dest,channel.sig=',tag, dest, channel.signature)--@end-debug@
|
Nenue@32
|
153
|
Nenue@42
|
154 if not db.tags[tag] then -- no tag table?
|
Nenue@42
|
155 db.tags[tag] = {}
|
Nenue@42
|
156 end
|
Nenue@42
|
157
|
Nenue@42
|
158 if db.tags[tag][dest] then -- is tag set?
|
Nenue@32
|
159 db.tags[tag][dest] = nil
|
Nenue@57
|
160 D:Print(L('Tag removed from channel', tag, db.channels[dest].index, db.channels[dest].signature))
|
Nenue@32
|
161 else
|
Nenue@32
|
162 db.tags[tag][dest] = dest
|
Nenue@57
|
163 D:Print(L('Tag added to channel', tag, db.channels[dest].index, db.channels[dest].signature))
|
Nenue@32
|
164 end
|
Nenue@47
|
165 D:UpdateDock()
|
Nenue@14
|
166 else
|
Nenue@57
|
167 D:Print(L['Command tag help'])
|
Nenue@14
|
168 end
|
Nenue@14
|
169 return
|
Nenue@32
|
170 elseif tonumber(mode) ~= nil or mode == 'save' then
|
Nenue@32
|
171 -- iterating for something
|
Nenue@32
|
172 if mode == 'save' then
|
Nenue@32
|
173 if tonumber(tag) == nil then
|
Nenue@57
|
174 T:Print(L('Invalid ID from arg', tag))
|
Nenue@32
|
175 end
|
Nenue@32
|
176 list_state = tonumber(tag)
|
Nenue@32
|
177 else
|
Nenue@32
|
178 list_state = tonumber(mode)
|
Nenue@32
|
179 db.workspace = list_state
|
Nenue@33
|
180 if list_state ~= 1 then
|
Nenue@33
|
181 db.last_workspace = list_state
|
Nenue@33
|
182 end
|
Nenue@33
|
183
|
Nenue@0
|
184 end
|
Nenue@32
|
185 elseif mode == nil then
|
Nenue@33
|
186 list_state = (db.workspace == 1) and db.last_workspace or 1
|
Nenue@33
|
187 db.workspace = list_state
|
Nenue@32
|
188 else
|
Nenue@32
|
189 return D:PrintHelp()
|
Nenue@0
|
190 end
|
Nenue@32
|
191
|
Nenue@32
|
192 -- start the iterating
|
Nenue@36
|
193 if not db[PLAYER_REALM][list_state] then
|
Nenue@36
|
194 db[PLAYER_REALM][list_state] = {}
|
Nenue@36
|
195 end
|
Nenue@36
|
196 if not db.global[list_state] then
|
Nenue@36
|
197 db.global[list_state] = {}
|
Nenue@36
|
198 end
|
Nenue@36
|
199
|
Nenue@0
|
200 local char_list, global_list = db[PLAYER_REALM][list_state], db.global[list_state]
|
Nenue@0
|
201 local playername = UnitName("player")
|
Nenue@0
|
202
|
Nenue@0
|
203 for i = 1, GetNumAddOns() do
|
Nenue@0
|
204 local name = GetAddOnInfo(i)
|
Nenue@0
|
205 local enableState, globalState = GetAddOnEnableState(playername, i), GetAddOnEnableState(nil, i)
|
Nenue@0
|
206
|
Nenue@32
|
207 if mode == 'save' then
|
Nenue@0
|
208 char_list[name] = enableState
|
Nenue@0
|
209 global_list[name] = globalState
|
Nenue@0
|
210 else
|
Nenue@13
|
211 if char_list[name] or global_list[name] then
|
Nenue@32
|
212 if char_list[name] ~= 0 and global_list[name] ~= 0 then
|
Nenue@32
|
213 local value = false
|
Nenue@32
|
214 if char_list[name] == 2 and global_list[name] == 1 then
|
Nenue@32
|
215 value = UnitName("player")
|
Nenue@32
|
216 elseif global_list[name] == 2 then
|
Nenue@32
|
217 value = true
|
Nenue@32
|
218 end
|
Nenue@32
|
219 --print('EnableAddOn(', i, ',', value,')')
|
Nenue@32
|
220 EnableAddOn(i, value)
|
Nenue@32
|
221 else
|
Nenue@32
|
222 local value = true
|
Nenue@32
|
223 if char_list[name] == 2 and global_list[name] == 1 then
|
Nenue@32
|
224 value = UnitName("player")
|
Nenue@32
|
225 end
|
Nenue@32
|
226 --print('DisableAddOn(', i, ',', value,')')
|
Nenue@32
|
227 DisableAddOn(i,value)
|
Nenue@0
|
228 end
|
Nenue@33
|
229 elseif mode ~= 'save' then
|
Nenue@32
|
230 if type(db.unlisted) ~= 'table' then
|
Nenue@32
|
231 db.unlisted = {}
|
Nenue@0
|
232 end
|
Nenue@47
|
233 insert(db.unlisted, name)
|
Nenue@13
|
234 end
|
Nenue@0
|
235
|
Nenue@0
|
236 end
|
Nenue@0
|
237 end
|
Nenue@0
|
238
|
Nenue@32
|
239 if mode ~= 'save' then
|
Nenue@57
|
240 db.load_message = (mode == nil) and L("Toggled to profile", list_state) or L('Switched to profile number', list_state)
|
Nenue@0
|
241 ReloadUI()
|
Nenue@0
|
242 else
|
Nenue@57
|
243
|
Nenue@32
|
244 if list_state == 1 then
|
Nenue@57
|
245 D:Print(L['Profile main saved'])
|
Nenue@57
|
246 else
|
Nenue@32
|
247 db.last_workspace = list_state
|
Nenue@57
|
248 D:Print(L('Profile number saved', list_state, list_state))
|
Nenue@32
|
249 end
|
Nenue@0
|
250 end
|
Nenue@0
|
251 end
|
Nenue@0
|
252
|
Nenue@0
|
253
|
Nenue@13
|
254
|
Nenue@18
|
255 --- Creates a Devian-style output.
|
Nenue@18
|
256 -- The first argument describes the channel to output on, and the remaining arguments are concatenated in a manner similar to default print()
|
Nenue@18
|
257 -- This becomes the print handler when development mode is active. The original print() function is assigned to oldprint().
|
Nenue@18
|
258 -- @param Tag, signature, or numeric index of the channel to output on. Defaults to primary channel.
|
Nenue@18
|
259 -- @param ... Output contents.
|
Nenue@0
|
260 local function Message(prefix, ...)
|
Nenue@45
|
261 if db.workspace == 1 then
|
Nenue@23
|
262 return D.oldprint(prefix, ...)
|
Nenue@23
|
263 end
|
Nenue@57
|
264 prefix = tostring(prefix)
|
Nenue@57
|
265 if prefix == nil then
|
Nenue@55
|
266 prefix = 'nil*'
|
Nenue@1
|
267 end
|
Nenue@9
|
268
|
Nenue@18
|
269 local sendq = {}
|
Nenue@30
|
270 local tag, id, tagged
|
Nenue@13
|
271 local byName = true
|
Nenue@18
|
272 if D.tags[prefix] then
|
Nenue@18
|
273 for _, id in pairs(D.tags[prefix]) do
|
Nenue@18
|
274 if D.console[id] then
|
Nenue@18
|
275 sendq[id] = D.console[id]
|
Nenue@30
|
276 tagged = true
|
Nenue@18
|
277 end
|
Nenue@18
|
278 end
|
Nenue@18
|
279 end
|
Nenue@18
|
280
|
Nenue@13
|
281 if D.sig[prefix] then
|
Nenue@18
|
282 sendq[D.sig[prefix].index] = D.sig[prefix]
|
Nenue@13
|
283 elseif D.console[prefix] then
|
Nenue@18
|
284 sendq[D.console[prefix]] = D.console[prefix]
|
Nenue@30
|
285 elseif not tagged then
|
Nenue@18
|
286 sendq[D.primary_channel] = D.console[D.primary_channel]
|
Nenue@13
|
287 end
|
Nenue@18
|
288
|
Nenue@9
|
289 -- color me timbers
|
Nenue@9
|
290 local pcolor
|
Nenue@18
|
291 if (not db.tagcolor[prefix]) and byName then
|
Nenue@30
|
292 local c = {
|
Nenue@47
|
293 rand(64,255), rand(64,255), rand(64,255)
|
Nenue@30
|
294 }
|
Nenue@30
|
295 if c[1] > 223 and c[2] > 223 and c[3] > 223 then
|
Nenue@47
|
296 c[rand(1,3)] = rand(64,223)
|
Nenue@0
|
297 end
|
Nenue@30
|
298
|
Nenue@47
|
299 db.tagcolor[prefix] = format('%02X%02X%02X', unpack(c))
|
Nenue@0
|
300 end
|
Nenue@18
|
301 pcolor = db.tagcolor[prefix]
|
Nenue@0
|
302
|
Nenue@55
|
303 local buffer = {}
|
Nenue@0
|
304 for i = 1, select('#',...) do
|
Nenue@0
|
305 local var = select(i, ...)
|
Nenue@0
|
306
|
Nenue@0
|
307 if type(var) == 'table' then
|
Nenue@20
|
308 if type(var.GetName) == 'function' then
|
Nenue@46
|
309 var = '<table:'..tostring(var:GetName())..'>'
|
Nenue@20
|
310 else
|
Nenue@32
|
311 var = '<'..tostring(var)..'>'
|
Nenue@20
|
312 end
|
Nenue@20
|
313
|
Nenue@0
|
314 elseif type(var) == 'boolean' then
|
Nenue@0
|
315 var = var and 'true' or 'false'
|
Nenue@0
|
316 elseif type(var) == 'function' then
|
Nenue@0
|
317 var = '<funcref>'
|
Nenue@0
|
318 elseif type(var) == 'nil' then
|
Nenue@0
|
319 var = 'nil'
|
Nenue@60
|
320 else
|
Nenue@60
|
321 var = tostring(var)
|
Nenue@0
|
322 end
|
Nenue@0
|
323
|
Nenue@47
|
324 insert(buffer, var)
|
Nenue@0
|
325 end
|
Nenue@47
|
326 local message = concat(buffer, ' ')
|
Nenue@18
|
327 for id, channel in pairs(sendq) do
|
Nenue@55
|
328 if channel.width < 250 then
|
Nenue@55
|
329 prefix = string.sub(prefix, 0,2)
|
Nenue@55
|
330 end
|
Nenue@58
|
331 channel.out:AddMessage('|cFF'.. pcolor..prefix ..'|r ' .. message, 0.8, 0.8, 0.8, nil, nil, prefix, GetTime())
|
Nenue@58
|
332 if not D.dock.buttons[id].newMessage then
|
Nenue@58
|
333 D.dock.buttons[id].newMessage = true
|
Nenue@58
|
334 D.UpdateBeacon(D.dock.buttons[id])
|
Nenue@58
|
335 end
|
Nenue@18
|
336 end
|
Nenue@47
|
337 wipe(buffer)
|
Nenue@0
|
338 end
|
Nenue@0
|
339
|
Nenue@14
|
340
|
Nenue@32
|
341
|
Nenue@14
|
342
|
Nenue@32
|
343 function D:PrintHelp()
|
Nenue@32
|
344 D:Print("|cFFFFFF00/dvn|r",
|
Nenue@32
|
345 "\n |cFFFFFF00<number>|r - Loads a saved addon list. List 1 is treated as a gameplay profile and consoles will be disabled by default.")
|
Nenue@47
|
346 D:Print("|cFFFFFF00/dvc|r [<key>, ...]", "- Hides and show consoles. A list of channel keys can be passed to specify which ones get toggled.")
|
Nenue@32
|
347
|
Nenue@32
|
348 D:Print("|cFFFFFF00/resetdvn|r", "- Resets all but profile data SavedVariables.")
|
Nenue@32
|
349 D:Print("|cFFFFFF00/cleandvn|r", "- Fully resets SavedVariables, profiles and all.")
|
Nenue@32
|
350 end
|
Nenue@32
|
351
|
Nenue@60
|
352 local dot1, dot2 = CreateFrame('Frame', nil, UIParent), CreateFrame('Frame', nil, UIParent)
|
Nenue@60
|
353 dot1:SetSize(5,5)
|
Nenue@60
|
354 dot1:SetFrameStrata('TOOLTIP')
|
Nenue@60
|
355 local a = dot1:CreateTexture('fill', nil)
|
Nenue@60
|
356 a:SetAllPoints(dot1)
|
Nenue@60
|
357 a:SetTexture(1,0,0,1)
|
Nenue@60
|
358 dot2:SetSize(5,5)
|
Nenue@60
|
359 dot2:SetFrameStrata('TOOLTIP')
|
Nenue@60
|
360 a = dot2:CreateTexture('fill', nil)
|
Nenue@60
|
361 a:SetAllPoints(dot2)
|
Nenue@60
|
362 a:SetTexture(0,1,0,1)
|
Nenue@60
|
363
|
Nenue@60
|
364 local OnStartedMoving = function()
|
Nenue@60
|
365 for k, v in pairs(D.console) do
|
Nenue@60
|
366 if v.enabled then
|
Nenue@60
|
367 v.moveFade:Stop()
|
Nenue@60
|
368 local F1 = v.moveFade.alphaOut
|
Nenue@60
|
369 F1:SetFromAlpha(db.movement_fade_from)
|
Nenue@60
|
370 F1:SetToAlpha(db.movement_fade_to)
|
Nenue@60
|
371 F1:SetDuration(db.movement_fade_time)
|
Nenue@60
|
372 v.moveFade:Play()
|
Nenue@60
|
373 v:EnableMouse(false)
|
Nenue@60
|
374 end
|
Nenue@60
|
375 end
|
Nenue@60
|
376 end
|
Nenue@60
|
377
|
Nenue@60
|
378 local OnStoppedMoving = function()
|
Nenue@60
|
379 for k, v in pairs(D.console) do
|
Nenue@60
|
380 if v.enabled then
|
Nenue@60
|
381 v.moveFade:Stop()
|
Nenue@60
|
382 local F1 = v.moveFade.alphaOut
|
Nenue@60
|
383 F1:SetToAlpha(db.movement_fade_from)
|
Nenue@60
|
384 F1:SetFromAlpha(db.movement_fade_to)
|
Nenue@60
|
385 F1:SetDuration(db.movement_fade_time)
|
Nenue@60
|
386 v.moveFade:Play()
|
Nenue@60
|
387 v:EnableMouse(true)
|
Nenue@60
|
388 end
|
Nenue@60
|
389 end
|
Nenue@60
|
390 end
|
Nenue@45
|
391
|
Nenue@45
|
392
|
Nenue@0
|
393 function D:OnEnable()
|
Nenue@33
|
394
|
Nenue@33
|
395 if db.unlisted and #db.unlisted > 0 then
|
Nenue@47
|
396 D:Print('New AddOns have been found since the last profile update: '.. concat(db.unlisted, ', '))
|
Nenue@47
|
397 wipe(db.unlisted)
|
Nenue@33
|
398 end
|
Nenue@33
|
399
|
Nenue@33
|
400 if db.workspace == 1 then
|
Nenue@57
|
401 D:Print(L('Devian loaded on standby',MAJOR, MINOR))
|
Nenue@33
|
402 else
|
Nenue@57
|
403 D:Print(L('Devian loaded in workspace', MAJOR, MINOR, db.workspace))
|
Nenue@56
|
404 -- movement fading
|
Nenue@56
|
405 if db.movement_fade then
|
Nenue@60
|
406
|
Nenue@60
|
407 self:RegisterEvent('PLAYER_STARTED_MOVING', OnStartedMoving)
|
Nenue@60
|
408 self:RegisterEvent('PLAYER_STOPPED_MOVING', OnStoppedMoving)
|
Nenue@56
|
409 end
|
Nenue@33
|
410 end
|
Nenue@33
|
411
|
Nenue@47
|
412 --@debug@
|
Nenue@45
|
413 self:RegisterChatCommand("dvg", function(input)
|
Nenue@45
|
414 if not self.config then
|
Nenue@45
|
415 self.config = DevCon
|
Nenue@45
|
416 self:EnableModule("Config")
|
Nenue@45
|
417 end
|
Nenue@45
|
418 self.modules.Config:ChatCommand(input)
|
Nenue@45
|
419 end)
|
Nenue@47
|
420 --@end-debug@
|
Nenue@45
|
421
|
Nenue@33
|
422 end
|
Nenue@33
|
423
|
Nenue@33
|
424 function D:OnInitialize()
|
Nenue@13
|
425 -- commands
|
Nenue@33
|
426 self:RegisterChatCommand("cleandvn", function(args)
|
Nenue@33
|
427 DevianDB = nil
|
Nenue@33
|
428 DevianDB = {
|
Nenue@33
|
429 load_message = "All SavedVars wiped."
|
Nenue@33
|
430 }
|
Nenue@33
|
431 ReloadUI()
|
Nenue@33
|
432 end)
|
Nenue@60
|
433 local blocked = {global = true, channels = true, tags = true, [PLAYER_REALM] = true}
|
Nenue@33
|
434 self:RegisterChatCommand("resetdvn", function(args)
|
Nenue@33
|
435 for k,v in pairs(DevianDB) do
|
Nenue@36
|
436 if not blocked[k] then
|
Nenue@33
|
437 DevianDB[k] = nil
|
Nenue@33
|
438 end
|
Nenue@33
|
439 end
|
Nenue@36
|
440 for k,v in pairs(defaults) do
|
Nenue@36
|
441 if not blocked[k] then
|
Nenue@36
|
442 DevianDB[k] = v
|
Nenue@36
|
443 end
|
Nenue@36
|
444 end
|
Nenue@33
|
445 DevianDB.load_message = "Non-user SavedVars have been reset."
|
Nenue@33
|
446 ReloadUI()
|
Nenue@33
|
447 end)
|
Nenue@13
|
448 local cmdlist = {
|
Nenue@13
|
449 ['dvn'] = ScanAddOnList,
|
Nenue@13
|
450 ['devian'] = ScanAddOnList,
|
Nenue@36
|
451 ['dvc'] = "Console_Toggle",
|
Nenue@13
|
452 }
|
Nenue@13
|
453 for cmd, func in pairs(cmdlist) do
|
Nenue@13
|
454 self:RegisterChatCommand(cmd, func, true)
|
Nenue@13
|
455 end
|
Nenue@13
|
456
|
Nenue@33
|
457 -- pull defaults
|
Nenue@9
|
458 if not _G.DevianDB then
|
Nenue@13
|
459 _G.DevianDB = defaults
|
Nenue@9
|
460 end
|
Nenue@9
|
461 db = _G.DevianDB
|
Nenue@47
|
462 self.db = db
|
Nenue@32
|
463 self.tags = db.tags
|
Nenue@32
|
464 self.channelinfo = db.channels
|
Nenue@0
|
465
|
Nenue@0
|
466 if not db[PLAYER_REALM] then
|
Nenue@32
|
467 db[PLAYER_REALM] = {[WORKSPACE_ON] = {}, [WORKSPACE_OFF] = {}}
|
Nenue@0
|
468 end
|
Nenue@0
|
469
|
Nenue@32
|
470 if db.load_message then
|
Nenue@32
|
471 D:Print(db.load_message)
|
Nenue@32
|
472 db.load_message = nil
|
Nenue@0
|
473 end
|
Nenue@0
|
474 D.oldprint = getprinthandler()
|
Nenue@0
|
475 if not _G.oldprint then
|
Nenue@0
|
476 _G.oldprint = D.oldprint
|
Nenue@0
|
477 end
|
Nenue@13
|
478
|
Nenue@33
|
479 -- Stop here in game mode
|
Nenue@33
|
480 if db.workspace == 1 then
|
Nenue@33
|
481 return
|
Nenue@33
|
482 end
|
Nenue@35
|
483 -----------------------------------------------------------------------
|
Nenue@35
|
484 self.db = db
|
Nenue@35
|
485 self.channels = db.channels
|
Nenue@32
|
486 self.max_channel = 0
|
Nenue@14
|
487 self.num_channels = 0
|
Nenue@13
|
488 self.console = {}
|
Nenue@13
|
489 self.sig = {}
|
Nenue@14
|
490 self.sigID = {}
|
Nenue@14
|
491 self.IDsig = {}
|
Nenue@47
|
492 self.dock = DevianDock
|
Nenue@47
|
493 self.dock.buttons = {}
|
Nenue@14
|
494 for i, cinfo in pairs(db.channels) do
|
Nenue@14
|
495 i = tonumber(i)
|
Nenue@14
|
496 if not self.primary_channel then
|
Nenue@14
|
497 self.primary_channel = i
|
Nenue@14
|
498 end
|
Nenue@14
|
499 self:SetChannel(cinfo, i)
|
Nenue@47
|
500 self.max_channel = max(i, self.max_channel)
|
Nenue@32
|
501 self.num_channels = self.num_channels + 1
|
Nenue@32
|
502 end
|
Nenue@32
|
503
|
Nenue@18
|
504 if self.console[db.current_channel] then
|
Nenue@60
|
505 print('bringing', self.console[db.current_channel].signature, 'to the front')
|
Nenue@18
|
506 self.console[db.current_channel]:ToFront()
|
Nenue@28
|
507 -- bring the current channel to the front
|
Nenue@18
|
508 end
|
Nenue@47
|
509 DevianDock:Show()
|
Nenue@47
|
510 self:UpdateDock()
|
Nenue@33
|
511 setprinthandler(Message)
|
Nenue@33
|
512 print = function(...)
|
Nenue@33
|
513 _G.print('Dvn', ...)
|
Nenue@23
|
514 end
|
Nenue@36
|
515 end
|
Nenue@36
|
516
|
Nenue@36
|
517 --- Console frame toggler
|
Nenue@36
|
518 -- @paramsig [...]
|
Nenue@36
|
519 -- @param ... one or more space-seperated channel keys
|
Nenue@47
|
520 function D:Console_Toggle(input, force)
|
Nenue@38
|
521 --oldprint(input)
|
Nenue@47
|
522 local setAll
|
Nenue@36
|
523 if db.workspace == 1 then
|
Nenue@36
|
524 return self:Print(MSG_NEED_DEV_MODE)
|
Nenue@36
|
525 end
|
Nenue@36
|
526 local search = {}
|
Nenue@47
|
527 local key
|
Nenue@36
|
528 local n = 0
|
Nenue@47
|
529 while self:GetArgs(input,1,n) and n < 255 do --should end itself when it gets nil, but
|
Nenue@47
|
530 key, n = self:GetArgs(input,1,n)
|
Nenue@47
|
531
|
Nenue@36
|
532 if self.sig[key] then
|
Nenue@47
|
533 --print(key, self.sigID[key])
|
Nenue@47
|
534 insert(search, self.sigID[key])
|
Nenue@47
|
535 elseif self.console[tonumber(key)] then
|
Nenue@47
|
536 --print(key, tonumber(key))
|
Nenue@47
|
537 insert(search, tonumber(key))
|
Nenue@36
|
538 end
|
Nenue@47
|
539
|
Nenue@47
|
540 --oldprint(#search, key, n)
|
Nenue@47
|
541 end
|
Nenue@47
|
542 if #search < 1 then
|
Nenue@36
|
543 search = self.sigID
|
Nenue@47
|
544 setAll = true
|
Nenue@47
|
545 end
|
Nenue@47
|
546 if setAll then
|
Nenue@47
|
547 --oldprint('setall', setAll)
|
Nenue@47
|
548 db.enabled = (not db.enabled) and true or nil
|
Nenue@47
|
549 if force == 0 then
|
Nenue@47
|
550 db.enabled = nil
|
Nenue@47
|
551 end
|
Nenue@36
|
552 end
|
Nenue@36
|
553
|
Nenue@36
|
554 for i, id in pairs(search) do
|
Nenue@38
|
555 --oldprint(i, id)
|
Nenue@36
|
556 local c = self.console[id]
|
Nenue@47
|
557 if setAll then
|
Nenue@47
|
558 c.enabled = db.enabled and db.enabled or nil
|
Nenue@47
|
559 else
|
Nenue@47
|
560
|
Nenue@47
|
561 db.enabled = true
|
Nenue@47
|
562 c.enabled = (not c.enabled) and true or nil
|
Nenue@47
|
563 if force == 0 then
|
Nenue@47
|
564 c.enabled = nil
|
Nenue@47
|
565 end
|
Nenue@47
|
566 --oldprint(id, ' ', force, c.enabled, db.enabled)
|
Nenue@47
|
567 end
|
Nenue@47
|
568
|
Nenue@47
|
569 if c.enabled or (setAll and db.enabled) then
|
Nenue@36
|
570 c:Show()
|
Nenue@47
|
571 elseif not (c.enabled and db.enabled) then
|
Nenue@36
|
572 c:Hide()
|
Nenue@36
|
573 end
|
Nenue@47
|
574 c:Save()
|
Nenue@36
|
575 end
|
Nenue@36
|
576
|
Nenue@47
|
577 if setAll then
|
Nenue@47
|
578 if db.enabled then
|
Nenue@47
|
579 self:Print('toggled all consoles ON')
|
Nenue@60
|
580 if D.console[db.current_channel] then
|
Nenue@60
|
581 oldprint('push', D.console[db.current_channel].signature, 'to the front')
|
Nenue@60
|
582 D.console[db.current_channel]:ToFront()
|
Nenue@60
|
583 end
|
Nenue@47
|
584 else
|
Nenue@47
|
585 self:Print('toggled all consoles OFF')
|
Nenue@47
|
586 end
|
Nenue@36
|
587 else
|
Nenue@47
|
588 local result = {}
|
Nenue@47
|
589 for i, id in pairs(search) do
|
Nenue@47
|
590 result[i] = tostring(id) .. ' = ' .. (self.console[id].enabled and 'ON' or 'OFF')
|
Nenue@47
|
591 end
|
Nenue@47
|
592 self:Print('toggled: '..concat(result, ', '))
|
Nenue@36
|
593 end
|
Nenue@0
|
594 end |