201 lines
5.6 KiB
Lua
201 lines
5.6 KiB
Lua
Console = {}
|
|
|
|
-- private variables
|
|
local SpeakTypes = {
|
|
say = { color = '#FFFF00' },
|
|
whisper = { color = '#FFFF00' },
|
|
yell = { color = '#FFFF00' },
|
|
monsterSay = { color = '#FE6500', hideInConsole = true},
|
|
monsterYell = { color = '#FE6500', hideInConsole = true},
|
|
npcToPlayer = { color = '#5FF7F7', private = true, npcChat = true },
|
|
channelYellow = { color = '#FFFF00' },
|
|
channelWhite = { color = '#FFFFFF' },
|
|
channelRed = { color = '#F55E5E' },
|
|
channelOrange = { color = '#FE6500' },
|
|
private = { color = '#5FF7F7', private = true },
|
|
playerToNpc = { color = '#9F9DFD', private = true, npcChat = true },
|
|
broadcast = { color = '#F55E5E' },
|
|
privateRed = { color = '#F55E5E', private = true }
|
|
}
|
|
|
|
local consolePanel
|
|
local consoleBuffer
|
|
local consoleTabBar
|
|
local consoleLineEdit
|
|
local channels
|
|
|
|
-- private functions
|
|
function applyMessagePrefixies(name, level, message)
|
|
if name then
|
|
if Options.showLevelsInConsole and level > 0 then
|
|
message = name .. ' [' .. level .. ']: ' .. message
|
|
else
|
|
message = name .. ': ' .. message
|
|
end
|
|
end
|
|
return message
|
|
end
|
|
|
|
-- public functions
|
|
function Console.create()
|
|
consolePanel = displayUI('console.otui', { parent = Game.gameBottomPanel } )
|
|
consoleLineEdit = consolePanel:getChildById('consoleLineEdit')
|
|
consoleBuffer = consolePanel:getChildById('consoleBuffer')
|
|
consoleTabBar = consolePanel:getChildById('consoleTabBar')
|
|
consoleTabBar:setContentWidget(consoleBuffer)
|
|
channels = {}
|
|
|
|
Console.addChannel('Default', 0)
|
|
Console.addTab('Server Log')
|
|
|
|
Hotkeys.bind('Tab', function() consoleTabBar:selectNextTab() end, consolePanel)
|
|
Hotkeys.bind('Shift+Tab', function() consoleTabBar:selectPrevTab() end, consolePanel)
|
|
Hotkeys.bind('Enter', Console.sendCurrentMessage, consolePanel)
|
|
Hotkeys.bind('Return', Console.sendCurrentMessage, consolePanel)
|
|
end
|
|
|
|
function Console.destroy()
|
|
consolePanel:destroy()
|
|
consolePanel = nil
|
|
end
|
|
|
|
function Console.addTab(name)
|
|
local tab = consoleTabBar:addTab(name)
|
|
consoleTabBar:selectTab(tab)
|
|
return tab
|
|
end
|
|
|
|
function Console.getTab(name)
|
|
return consoleTabBar:getTab(name)
|
|
end
|
|
|
|
function Console.getCurrentTab()
|
|
return consoleTabBar:getCurrentTab()
|
|
end
|
|
|
|
function Console.addChannel(name, id)
|
|
channels[id] = name
|
|
local tab = Console.addTab(name)
|
|
tab.channelId = id
|
|
return tab
|
|
end
|
|
|
|
function Console.addPrivateText(text, speaktype, name)
|
|
local privateTab = Console.getTab(name)
|
|
if privateTab == nil then
|
|
if Options.showPrivateMessagesInConsole then
|
|
privateTab = Console.getTab('Default')
|
|
else
|
|
privateTab = Console.addTab(name)
|
|
end
|
|
privateTab.npcChat = speaktype.npcChat
|
|
end
|
|
Console.addTabText(text, speaktype, privateTab)
|
|
end
|
|
|
|
function Console.addText(text, speaktype, tabName)
|
|
local tab = Console.getTab(tabName)
|
|
Console.addTabText(text, speaktype, tab)
|
|
end
|
|
|
|
function Console.addTabText(text, speaktype, tab)
|
|
if Options.showTimestampsInConsole then
|
|
text = os.date('%H:%M') .. ' ' .. text
|
|
end
|
|
|
|
local panel = consoleTabBar:getTabPanel(tab)
|
|
local label = createWidget('ConsoleLabel', panel)
|
|
label:setText(text)
|
|
label:setColor(speaktype.color)
|
|
consoleTabBar:blinkTab(tab)
|
|
|
|
if panel:getChildCount() > 10 then
|
|
panel:removeChild(panel:getFirstChild())
|
|
end
|
|
end
|
|
|
|
function Console.sendCurrentMessage()
|
|
local message = consoleLineEdit:getText()
|
|
if #message == 0 then return end
|
|
consoleLineEdit:clearText()
|
|
|
|
-- get current channel
|
|
local tab = Console.getCurrentTab()
|
|
|
|
-- when talking on server log, the message goes to default channel
|
|
local name = tab:getText()
|
|
if name == 'Server Log' then
|
|
tab = Console.getTab('Default')
|
|
name = 'Default'
|
|
end
|
|
local speaktypedesc
|
|
|
|
if tab.channelId then
|
|
if tab.channelId == 0 then
|
|
speaktypedesc = 'say'
|
|
else
|
|
speaktypedesc = 'channelYellow'
|
|
end
|
|
|
|
Game.talkChannel(speaktypedesc, tab.channelId, message)
|
|
return
|
|
else
|
|
if tab.npcChat then
|
|
speaktypedesc = 'playerToNpc'
|
|
else
|
|
speaktypedesc = 'private'
|
|
end
|
|
|
|
local speaktype = SpeakTypes[speaktypedesc]
|
|
local player = Game.getLocalPlayer()
|
|
Game.talkPrivate(speaktypedesc, name, message)
|
|
|
|
message = applyMessagePrefixies(player:getName(), player:getLevel(), message)
|
|
Console.addPrivateText(message, speaktype, name)
|
|
end
|
|
end
|
|
|
|
-- hooked events
|
|
local function onCreatureSpeak(name, level, speaktypedesc, message, channelId, creaturePos)
|
|
speaktype = SpeakTypes[speaktypedesc]
|
|
if speaktype.hideInConsole then return end
|
|
|
|
message = applyMessagePrefixies(name, level, message)
|
|
|
|
if speaktype.private then
|
|
Console.addPrivateText(message, speaktype, name)
|
|
else
|
|
Console.addText(message, speaktype, channels[channelId])
|
|
end
|
|
end
|
|
|
|
local function onOpenChannel(channelId, channelName)
|
|
Console.addChannel(channelName, channelId)
|
|
end
|
|
|
|
local function onChannelList(channelList)
|
|
local channelsWindow = displayUI('channelswindow.otui')
|
|
local channelListPanel = channelsWindow:getChildById('channelList')
|
|
channelsWindow.onEnter = function(self)
|
|
local selectedChannelLabel = channelListPanel:getFocusedChild()
|
|
if not selectedChannelLabel then return end
|
|
Game.joinChannel(selectedChannelLabel.channelId)
|
|
channelsWindow:destroy()
|
|
end
|
|
for k,v in pairs(channelList) do
|
|
local channelId = v[1]
|
|
local channelName = v[2]
|
|
|
|
if channelId ~= 0 and #channelName > 0 then
|
|
local label = createWidget('ChannelListLabel', channelListPanel)
|
|
label.channelId = channelId
|
|
label:setText(channelName)
|
|
end
|
|
end
|
|
end
|
|
|
|
connect(Game, { onLogin = Console.create,
|
|
onLogout = Console.destroy,
|
|
onCreatureSpeak = onCreatureSpeak,
|
|
onChannelList = onChannelList,
|
|
onOpenChannel = onOpenChannel}) |