-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchat.lua
690 lines (591 loc) · 20.5 KB
/
chat.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
local addonName, addon = ...
setfenv(1, addon)
------------------------------------------------------------------------------------------------------------------------
chatFrames = _G.PrimalCore.chatFrames
------------------------------------------------------------------------------------------------------------------------
local chatCache
--local chatCacheTable = _G.setmetatable({}, { __index = function(table, key) table[key] = {}; return table[key] end})
local chatCacheTable = {}
if debug then
_G.chatCacheTable = chatCacheTable
end
-- These are often preceded by a blank line but not always.
local sectionHeadings = {
CHANNELS = true,
COLORS = true,
WINDOW = true,
MESSAGES = true,
}
local function parseChatCache()
-- The chain of keys used to index into the chatCacheTable to find the subtable currently used for insertion.
local keyChain = {}
local subTable = chatCacheTable
for line in _G.string.gmatch(chatCache, "[^\r\n]+") do -- lua-users.org/wiki/StringRecipes
_G.assert(line ~= "")
if line == "END" then
_G.assert(#keyChain > 0)
subTable = chatCacheTable
keyChain[#keyChain] = nil
for _, key in _G.ipairs(keyChain) do
subTable = subTable[key]
end
else
local i, j = _G.string.find(line, "%S+")
_G.assert(i == 1)
local attribute = _G.string.sub(line, i, j)
if sectionHeadings[attribute] then
subTable[line] = {}
subTable = subTable[line]
keyChain[#keyChain + 1] = line
else
line = _G.string.sub(line, j + 2) -- Skip the space
subTable[attribute] = line
end
end
end
end
-- This function is meant to make WoW save the values from chatCache in chat-cache.txt when logging out. It's not
-- intended to make everything look right before reloading the UI (and currently doesn't either). TODO: set CVars that
-- are integral to the chat configuration.
function addon:setupChat()
parseChatCache()
----------------------------------------------------------------------------------------------------------------------
-- In general, whether it is possible to join or leave a server channel, depends on what zone the player is currently
-- in. Specifically, we can't join the Trade channel, unless the player is in a zone where Trade Chat is available
-- (capital cities, Shattrath, Dalaran, garrisons, etc.). This makes it impossible to fully reset the channels a
-- player has joined in some cases. Moreover, GetChannelList() and EnumerateServerChannels() (and ListChannels())
-- omit unavailable channels from their return values, even though the information that the player joined them is not
-- discarded. The index of an unavailable channel will remain reserved and the game will automatically join that
-- channel again once it becomes available. GetChannelName() doesn't return useful information about inactive
-- channels either.
-- Keys in joinedChannels aren't necessarily consecutive!
--[[
local joinedChannels = {}
(function(...) -- Such varargs :D
for i = 1, _G.select("#", ...), 2 do
local index, channelName = _G.select(i, ...), _G.select(i + 1, ...)
joinedChannels[index] = channelName
end
end)(_G.GetChannelList())
--]]
-- This is what EnumerateServerChannels() returns in a capital as I'm writing this. Hard coded since that function
-- doesn't work depending on where the player is...
local serverChannels = {
"General",
"Trade",
"LocalDefense",
--"WorldDefense", -- Nobody is ever in this channel... also, wasn't LookingForGroup normally at index 4?
"LookingForGroup",
--"BigfootWorldChannel", -- Can't join this channel. What the hell is this anyway?
--"MeetingStone", -- Ditto.
}
do local i, j = 1, _G.GetNumDisplayChannels()
while i <= j do
local _, header, collapsed = _G.GetChannelDisplayInfo(i)
if header and collapsed then -- It's actually not a chat channel. Wtf?
_G.ExpandChannelHeader(i)
j = _G.GetNumDisplayChannels()
end
i = i + 1
end
end
-- All the headers in the Chat Channels pane (wow.gamepedia.com/Chat_Channels) should be expanded now. This is
-- actually required to get information about all channels using GetChannelDisplayInfo(), which is the only way I'm
-- aware of to get information about inactive channels. I'm serious.
-- Leaving inactive channles doesn't work but calling LeaveChannelByName() on them doesn't break anything either.
for i = 1, _G.GetNumDisplayChannels() do
local name, header, _, channelNumber, _, active, category = _G.GetChannelDisplayInfo(i)
if not header then
if category == "CHANNEL_CATEGORY_CUSTOM" then
if serverChannels[channelNumber] then -- Need this index. Free it.
print("leaving channel " .. channelNumber .. ": " .. name)
_G.LeaveChannelByName(name)
end
elseif category == "CHANNEL_CATEGORY_GROUP " then
-- TODO?
elseif category == "CHANNEL_CATEGORY_WORLD" then
if name ~= serverChannels[channelNumber] then -- Wrong index.
-- The only way to change indices is leaving channels and joining them again in a different order.
print("trying to leave channel " .. channelNumber .. ": " .. name)
_G.LeaveChannelByName(name)
end
end
end
end
_G.C_Timer.After(1, function()
for i = 1, #serverChannels do
_G.JoinPermanentChannel(serverChannels[i], nil, _G[chatFrames.trade]:GetID())
_G.ChatFrame_AddChannel(_G[chatFrames.trade], serverChannels[i])
end
end)
-- This part of the API (wowprogramming.com/docs/api_categories#channel) is actually so weird. I bet noone touched
-- it since Vanilla and it's still exacly the same.
-- wowprogramming.com/docs/api/GetChannelList
-- wowprogramming.com/docs/api/EnumerateServerChannels
----------------------------------------------------------------------------------------------------------------------
-- Section in chat-cache.txt looks like this:
--[[
CHANNELS
Foo 1 1
Bar 1 5
END
]]
for channelName, channelInfo in _G.pairs(chatCacheTable.CHANNELS) do
-- TODO.
end
-- I have no idea what to do with the value of chatCacheTable.ZONECHANNELS. TODO?
for messageGroup, info in _G.pairs(chatCacheTable.COLORS) do
_G.assert(_G.type(info) == "string")
local r, g, b, classColored = _G.string.match(info, "([0-9]+) ([0-9]+) ([0-9]+) ([YN]+)")
_G.assert(classColored == "Y" or classColored == "N")
_G.ChangeChatColor(messageGroup, _G.tonumber(r) / 255, _G.tonumber(g) / 255, _G.tonumber(b) / 255)
-- Defined in FrameXML/ChatConfigFrame.lua (wowprogramming.com/utils/xmlbrowser/test/FrameXML/ChatConfigFrame.lua).
_G.ToggleChatColorNamesByClassGroup(classColored == "Y" and true or false, messageGroup)
end
local dockedFrames = {}
-- TODO: FCF_ResetChatWindows()?
----------------------------------------------------------------------------------------------------------------------
for key, info in _G.pairs(chatCacheTable) do
local chatFrameId = _G.tonumber(_G.string.match(key, "^WINDOW (%d%d?)$"))
if chatFrameId then
local chatFrame = _G["ChatFrame" .. chatFrameId]
local chatTab = _G["ChatFrame".. chatFrameId .. "Tab"]
_G.assert(chatFrame and chatTab)
print("configuring ChatFrame" .. chatFrameId .. (info.NAME and (": \"" .. info.NAME .. "\"") or ""))
-- Clear chat windows?
_G.assert(info.SHOWN and info.DOCKED)
------------------------------------------------------------------------------------------------------------------
-- Undock all chat frames. If it should be undocked, this oviously makes sense. If it should be docked, we still
-- undock it so we can later dock all frames in the correct order as FCF_DockFrame() immediately returns if the
-- chat frame is already docked. Chat frames that don't fullfill this condition are closed (which also undocks
-- them).
if info.SHOWN == "1" or info.DOCKED == "1" then
_G.FCF_UnDockFrame(chatFrame)
end
------------------------------------------------------------------------------------------------------------------
if info.NAME then
_G.FCF_SetWindowName(chatFrame, info.NAME)
end
-- Chatter will override this default font size setting if its "Chat Font" module is enabled.
_G.FCF_SetChatWindowFontSize(nil, chatFrame, _G.tonumber(info.SIZE))
do
-- stackoverflow.com/a/19269176/1980378
local r, g, b, a = _G.string.match(info.COLOR, "([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+)")
r, g, b, a = _G.tonumber(r) / 255, _G.tonumber(g) / 255, _G.tonumber(b) / 255, _G.tonumber(a) / 255
_G.assert(r and g and b and a)
_G.FCF_SetWindowColor(chatFrame, r, g, b)
_G.FCF_SetWindowAlpha(chatFrame, a)
end
local locked = _G.tonumber(info.LOCKED)
_G.FCF_SetLocked(chatFrame, (locked == 1) and true or false) -- wowprogramming.com/docs/api/SetChatWindowLocked
-- It's normally not really possible for docked chat frames (there can only by one dock) to have different
-- interactable settings. This doesn't explicitly prevent it.
_G.FCF_SetUninteractable(chatFrame, info.UNINTERACTABLE == "1")
-- wowprogramming.com/docs/api/SetChatWindowUninteractable
------------------------------------------------------------------------------------------------------------------
-- The frame will be docked at this position; e.g., if index is 3, its tab will be the third tab.
local index = _G.tonumber(info.DOCKED)
if index ~= 0 then
-- We dock these later in the right order making sure we don't try to, for example, dock a frame at position 3
-- when no other frames were docked yet.
dockedFrames[index] = chatFrame
end
-- wowprogramming.com/docs/api/SetChatWindowDocked
------------------------------------------------------------------------------------------------------------------
-- These settings aren't used if Chatter is set to handle chat frame positioning.
if not chatFrame.isDocked or chatFrame == _G.GENERAL_CHAT_DOCK.primary then
local chatFrameChanged = false
if info.POSITION then
local point, xOffset, yOffset = _G.string.match(info.POSITION, "([^ ]+) ([^ ]+) ([^ ]+)")
xOffset, yOffset = _G.tonumber(xOffset), _G.tonumber(yOffset)
chatFrame:ClearAllPoints()
chatFrame:SetPoint(point, _G.UIParent, point, xOffset, yOffset)
chatFrameChanged = true
end
if info.DIMENSIONS then
local width, height = _G.string.match(info.DIMENSIONS, "([^ ]+) ([^ ]+)")
width, height = _G.tonumber(width), _G.tonumber(height)
chatFrame:SetSize(width, height)
chatFrameChanged = true
end
if chatFrameChanged then
_G.FCF_SavePositionAndDimensions(chatFrame)
end
end
------------------------------------------------------------------------------------------------------------------
-- These four lines are all over FrameXML/FloatingChatFrame.lua used exacly like this whenever a chat frame is
-- reset.
_G.ChatFrame_RemoveAllMessageGroups(chatFrame)
_G.ChatFrame_RemoveAllChannels(chatFrame)
_G.ChatFrame_ReceiveAllPrivateMessages(chatFrame)
_G.ChatFrame_ReceiveAllBNConversations(chatFrame)
-- ChatFrame_AddMessageGroup vs. ChatFrame_AddSingleMessageType(). What's the deal? Which one should we use?
--
-- ChatFrame_AddMessageGroup expects its "group" parameter to be an index into the global ChatTypeGroup table
-- (defined in FrameXML/ChatFrame.lua). That table maps those to arrays of mostly CHAT_MSG_X events.
--
-- ChatFrame_AddSingleMessageType() expects to be passed an event which belongs to a group in the ChatTypeGroup
-- table in its "messageType" parameter. It adds that group to the chat frame but only registers it for the
-- single event passed.
for value, _ in _G.pairs(info.MESSAGES) do
-- What exacly can value be? It seems to typically be an index into ChatTypeGroup.
_G.assert(not _G.ChatTypeGroupInverted[value])
if _G.ChatTypeGroup[value] then
if not _G.ChatTypeInfo[value] then
--print("Warning: " .. value .. " has entry in ChatTypeGroup but not in ChatTypeInfo.")
end
_G.ChatFrame_AddMessageGroup(chatFrame, value)
else
-- This is apparently more than the Blizzard UI does when reading chat-cache.txt. I can't prevent
-- BN_WHISPER_INFORM and BN_WHISPER_PLAYER_OFFLINE from appearing in the MESSAGES section for WINDOW 1 in the
-- actual chat-cache.txt, but it doesn't cause their respective message groups (BN_WHISPER and SYSTEM) to be
-- added to ChatFrame1. Commenting this code out for now.
--[[
local group = _G.ChatTypeGroupInverted["CHAT_MSG_" .. value]
if group then
print("Warning: " .. value .. " isn't a known message group. Adding CHAT_MSG_" .. value .. " " ..
"message type instead.")
_G.ChatFrame_AddSingleMessageType(chatFrame, "CHAT_MSG_" .. value)
else
print("Warning: " .. value .. " isn't a known message group.")
-- This would have no effect: ChatFrame_AddMessageGroup(chatFrame, value). That function returns if
-- ChatTypeGroup[value] is nil.
end
--if _G.ChatTypeInfo[value] then
-- ...
--end
--]]
end
end
-- wowprogramming.com/docs/api_types#chatMsgType (this description seems to be inaccurate, though)
------------------------------------------------------------------------------------------------------------------
-- Section in chat-cache.txt looks like this:
--[[
CHANNELS
LookingForGroup
Foo
Bar
END
]]
for channelName, _ in _G.pairs(info.CHANNELS) do
_G.ChatFrame_RemoveChannel(chatFrame, channelName)
_G.ChatFrame_AddChannel(chatFrame, channelName)
end
-- TODO: info.ZONECHANNELS? What does the value of it mean?
--[[
_G.ChatFrame_AddChannel(chatFrame, _G.Chat_GetChannelShortcutName(chatTarget))
]]
if info.SHOWN == "0" then
if info.DOCKED == "0" then
_G.FCF_Close(chatFrame) -- Calls FCF_UnDockFrame()
end
else -- TODO: check if this chat frame is selected.
-- Code equivalent to a small excerpt from FCF_OpenNewWindow(). The other stuff done in that function should
-- already be handled when applying other settings. TODO: there's probably at least an UPDATE_CHAT_WINDOWS or
-- UPDATE_FLOATING_CHAT_WINDOWS event as well though so some code to do the same stuff as
-- FloatingChatFrame_OnEvent() might be needed.
chatFrame:Show()
chatTab:Show()
_G.SetChatWindowShown(chatFrameId, true) -- wowprogramming.com/docs/api/SetChatWindowShown
end
-- TODO: FCF_SetTabPosition() somewhere?
-- TODO: we should probably run FloatingChatFrame_Update() now? FloatingChatFrame_OnEvent() would do that in
-- response to UPDATE_CHAT_WINDOWS or UPDATE_FLOATING_CHAT_WINDOWS.
end
end
----------------------------------------------------------------------------------------------------------------------
for i = 1, _G.NUM_CHAT_WINDOWS do
local chatFrame = dockedFrames[i]
if chatFrame then
_G.FCF_DockFrame(chatFrame, i, false) -- Don't select the chat frame.
end
end
_G[chatFrames.chat .. "Tab"]:Click()
end
-- wowprogramming.com/docs/api_categories#chat
-- wowprogramming.com/utils/xmlbrowser/test/FrameXML/FloatingChatFrame.lua
-- Contents of automatically generated file chat-cache.txt -------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
chatCache = [[
VERSION 5
ADDEDVERSION 19
CHANNELS
END
ZONECHANNELS 35651587
COLORS
SYSTEM 255 255 0 N
SAY 255 255 255 Y
PARTY 170 170 255 Y
RAID 255 127 0 Y
GUILD 64 255 64 Y
OFFICER 64 192 64 Y
YELL 255 64 64 Y
WHISPER 255 128 255 Y
WHISPER_FOREIGN 255 128 255 N
WHISPER_INFORM 255 128 255 Y
EMOTE 255 128 64 Y
TEXT_EMOTE 255 128 64 Y
MONSTER_SAY 255 255 159 N
MONSTER_PARTY 170 170 255 Y
MONSTER_YELL 255 64 64 N
MONSTER_WHISPER 255 181 235 N
MONSTER_EMOTE 255 128 64 N
CHANNEL 255 192 192 N
CHANNEL_JOIN 192 128 128 N
CHANNEL_LEAVE 192 128 128 N
CHANNEL_LIST 192 128 128 N
CHANNEL_NOTICE 192 192 192 N
CHANNEL_NOTICE_USER 192 192 192 N
AFK 255 128 255 Y
DND 255 128 255 Y
IGNORED 255 0 0 N
SKILL 85 85 255 N
LOOT 0 170 0 N
MONEY 255 255 0 N
OPENING 128 128 255 N
TRADESKILLS 255 255 255 N
PET_INFO 128 128 255 N
COMBAT_MISC_INFO 128 128 255 N
COMBAT_XP_GAIN 111 111 255 N
COMBAT_HONOR_GAIN 224 202 10 N
COMBAT_FACTION_CHANGE 128 128 255 N
BG_SYSTEM_NEUTRAL 255 120 10 N
BG_SYSTEM_ALLIANCE 0 174 239 N
BG_SYSTEM_HORDE 255 0 0 N
RAID_LEADER 255 72 9 Y
RAID_WARNING 255 72 0 Y
RAID_BOSS_EMOTE 255 221 0 N
RAID_BOSS_WHISPER 255 221 0 N
FILTERED 255 0 0 N
RESTRICTED 255 0 0 N
BATTLENET 255 255 255 N
ACHIEVEMENT 255 255 0 Y
GUILD_ACHIEVEMENT 64 255 64 Y
ARENA_POINTS 255 255 255 N
PARTY_LEADER 118 200 255 Y
TARGETICONS 255 255 0 N
BN_WHISPER 0 255 246 N
BN_WHISPER_INFORM 0 255 246 N
BN_CONVERSATION 0 177 240 N
BN_CONVERSATION_NOTICE 0 177 240 N
BN_CONVERSATION_LIST 0 177 240 N
BN_INLINE_TOAST_ALERT 130 197 255 N
BN_INLINE_TOAST_BROADCAST 130 197 255 N
BN_INLINE_TOAST_BROADCAST_INFORM 130 197 255 N
BN_INLINE_TOAST_CONVERSATION 130 197 255 N
BN_WHISPER_PLAYER_OFFLINE 255 255 0 N
COMBAT_GUILD_XP_GAIN 111 111 255 N
CURRENCY 0 170 0 N
QUEST_BOSS_EMOTE 255 128 64 N
PET_BATTLE_COMBAT_LOG 231 222 171 N
PET_BATTLE_INFO 225 222 93 N
INSTANCE_CHAT 255 127 0 Y
INSTANCE_CHAT_LEADER 255 72 9 Y
CHANNEL1 255 192 192 Y
CHANNEL2 255 192 192 Y
CHANNEL3 255 192 192 Y
CHANNEL4 255 192 192 Y
CHANNEL5 255 192 192 Y
CHANNEL6 255 192 192 Y
CHANNEL7 255 192 192 Y
CHANNEL8 255 192 192 Y
CHANNEL9 255 192 192 Y
CHANNEL10 255 192 192 Y
END
WINDOW 1
NAME ChatFrame1
SIZE 14
COLOR 0 0 0 0
LOCKED 1
UNINTERACTABLE 0
DOCKED 1
SHOWN 0
POSITION BOTTOMLEFT 2.000000 7.000000
DIMENSIONS 461.000000 197.000000
MESSAGES
BN_WHISPER_INFORM
BN_WHISPER_PLAYER_OFFLINE
END
CHANNELS
END
ZONECHANNELS 0
END
WINDOW 2
NAME Combat Log
SIZE 14
COLOR 0 0 0 0
LOCKED 1
UNINTERACTABLE 0
DOCKED 2
SHOWN 0
MESSAGES
OPENING
PET_INFO
COMBAT_MISC_INFO
END
CHANNELS
END
ZONECHANNELS 0
END
WINDOW 3
NAME Trade
SIZE 14
COLOR 0 0 0 0
LOCKED 1
UNINTERACTABLE 0
DOCKED 3
SHOWN 0
MESSAGES
YELL
END
CHANNELS
LookingForGroup
END
ZONECHANNELS 35651587
END
WINDOW 4
NAME Chat
SIZE 14
COLOR 0 0 0 0
LOCKED 1
UNINTERACTABLE 0
DOCKED 4
SHOWN 1
MESSAGES
SAY
EMOTE
WHISPER
PARTY
PARTY_LEADER
RAID
RAID_LEADER
RAID_WARNING
GUILD
OFFICER
BN_WHISPER
BN_CONVERSATION
INSTANCE_CHAT
INSTANCE_CHAT_LEADER
END
CHANNELS
END
ZONECHANNELS 0
END
WINDOW 5
SIZE 14
COLOR 0 0 0 0
LOCKED 0
UNINTERACTABLE 0
DOCKED 0
SHOWN 0
MESSAGES
END
CHANNELS
END
ZONECHANNELS 0
END
WINDOW 6
SIZE 14
COLOR 0 0 0 0
LOCKED 0
UNINTERACTABLE 0
DOCKED 0
SHOWN 0
MESSAGES
END
CHANNELS
END
ZONECHANNELS 0
END
WINDOW 7
SIZE 14
COLOR 0 0 0 0
LOCKED 1
UNINTERACTABLE 0
DOCKED 0
SHOWN 0
MESSAGES
END
CHANNELS
END
ZONECHANNELS 0
END
WINDOW 8
SIZE 14
COLOR 0 0 0 0
LOCKED 0
UNINTERACTABLE 0
DOCKED 0
SHOWN 0
MESSAGES
END
CHANNELS
END
ZONECHANNELS 0
END
WINDOW 9
SIZE 14
COLOR 0 0 0 0
LOCKED 1
UNINTERACTABLE 0
DOCKED 0
SHOWN 0
MESSAGES
END
CHANNELS
END
ZONECHANNELS 0
END
WINDOW 10
NAME Sink
SIZE 14
COLOR 0 0 0 0
LOCKED 1
UNINTERACTABLE 0
DOCKED 0
SHOWN 1
POSITION BOTTOMRIGHT -2.000000 7.000000
DIMENSIONS 461.000000 113.000000
MESSAGES
SYSTEM
MONSTER_SAY
MONSTER_YELL
MONSTER_EMOTE
MONSTER_WHISPER
MONSTER_BOSS_EMOTE
MONSTER_BOSS_WHISPER
ERRORS
AFK
DND
IGNORED
COMBAT_FACTION_CHANGE
SKILL
LOOT
MONEY
CHANNEL
ACHIEVEMENT
GUILD_ACHIEVEMENT
TARGETICONS
BN_INLINE_TOAST_ALERT
CURRENCY
PET_BATTLE_COMBAT_LOG
PET_BATTLE_INFO
OPENING
COMBAT_XP_GAIN
COMBAT_HONOR_GAIN
COMBAT_MISC_INFO
COMBAT_GUILD_XP_GAIN
END
CHANNELS
END
ZONECHANNELS 0
END
]]
-- There was a SYSTEM_NOMENU entry in the original file. I removed it. I think it was an old message group that
-- doesn't exist anymore, but isn't removed from chat-cache.txt automatically.
--
-- An entry like "SAY 255 255 255 Y" in the COLORS section means that chat messages of the SAY message type should have
-- the color white ("255 255 255" RBG triplet) and the name of the player sending the message should be class colored
-- ("Y").
------------------------------------------------------------------------------------------------------------------------
-- vim: tw=120 sts=2 sw=2 et