Name | Type | is_array | initial_value |
library chatTest initializer onInit
globals
// do not edit -->
private hashtable Hashtable = InitHashtable()
private framehandle frameChatHistory
private framehandle frameMain
private framehandle frameMessagePanel
private framehandle array frameMessage
private framehandle array frameMessageType
private framehandle array frameMessageTimeStamp
private framehandle array frameMessageIcon
private framehandle array frameMessageText
private framehandle array frameMessageTimeStampContainer
private framehandle array frameMessageIconContainer
private framehandle array frameMessageTextContainer
private integer Iterator = 1
private integer gameTime = 0
private timer array timerMessage
private integer messageIterator = 0
private integer array syncValue
private integer array messageReceivers
private integer array messageType
private integer array messageTime
private integer array messageSender
private string array messageContent
private real array startY
private real array currentY
private real array targetY
private boolean array asyncVisibility
private integer array timeSinceStart
private boolean array frameInUse
private integer array frameAlpha
private integer array previousFrame
private integer tempPrev = 0
private constant integer DURATION_HASH = StringHash("Duration")
private constant integer FRAME_HASH = StringHash("Frame")
private constant string CHAT_SYSTEM_VERSION = "0.1"
// <-- do not edit
/*
Following variables are constant, as that they can't be changed during game.
*/
private constant string COMMAND_SYNTAX = "-" // syntax that indicates a command, can have any length, just no spacebar
private constant string SYSTEM_MESSAGE_TYPE = "[|cffe6a200System|r]" // system messages are marked with this
private constant string ALL_PLAYERS_MESSAGE_TYPE = "[|cff00e6e2Global|r]"
private constant string ALLIED_PLAYERS_MESSAGE_TYPE = "[|cff003ae6Allies|r]"
private constant integer MESSAGE_LENGTH_LIMIT = 128 // maximum length of a player message
private constant string MESSAGE_SIZE_OVERFLOW = "MESSAGE SIZE OVERFLOW [LIMIT: " + I2S(MESSAGE_LENGTH_LIMIT) + "]"
private constant integer MAX_MESSAGES = 1000 // better not touch this
// Frame position (scales with resolution)
private constant framepointtype CHAT_REFPOINT = FRAMEPOINT_BOTTOMLEFT // from which point of screen the X and Y calculate
private constant real CHAT_X = 0.0222
private constant real CHAT_Y = 0.2106
// Text alignment
//constant textaligntype VERTICAL_ALIGNMENT = TEXT_JUSTIFY_MIDDLE // not recommended to be changed, since each message has its own line anyway!
//constant textaligntype HORIZONTAL_ALIGNMENT = TEXT_JUSTIFY_LEFT
private constant string CHAT_FONT = "Fonts\\BLQ55Web.ttf" // font used by messages (default wc3 chat font is "Fonts\\BLQ55Web.ttf")
private constant real FONT_SIZE = 0.012 // font size of messages
private constant integer MESSAGE_DURATION = 500 // Message disappears after this duration (in 500 == 5.00 seconds)
/*
Following variables can be freely changed at any point of the game.
*/
// u can NOT leave any of these undeclared for some player, either make it "" or null
public string systemIcon = null // icon infront of system message text (if null or "", it will be hidden)
public string array playerColor // the color of player name (not sure if null will work, better use "")
public string array playerIcon // icon infront of player name (if null or "", it will hidden)
endglobals
private function easeInOutSine takes real t returns real
return -(Cos(bj_PI * t) - 1.) / 2.
endfunction
private function frameFix takes nothing returns nothing
local real width = BlzGetLocalClientWidth()
local real height = BlzGetLocalClientHeight()
call BlzFrameSetSize(BlzGetFrameByName("Main", 0), 0.6 * width / height, 0.6)
endfunction
private function convertTime takes integer time returns string
local integer Quotient = time
local string minutes = I2S(Quotient / 60)
local string seconds = I2S(Quotient - (Quotient / 60) * 60)
if StringLength(minutes) < 2 then
set minutes = "0" + minutes
endif
if StringLength(seconds) < 2 then
set seconds = "0" + seconds
endif
return "[" + minutes + ":" + seconds + "]"
endfunction
private function updateGameTime takes nothing returns nothing
set gameTime = gameTime + 1
call frameFix()
endfunction
public function getMessageSender takes integer messageID returns string
return playerColor[messageSender[messageID]] + GetPlayerName(Player(messageSender[messageID]))
endfunction
public function getMessageContent takes integer messageID returns string
return messageContent[messageID]
endfunction
public function getMessageType takes integer messageID returns string
if messageType[messageID] == 0 then
return ALL_PLAYERS_MESSAGE_TYPE
elseif messageType[messageID] == 1 then
return ALLIED_PLAYERS_MESSAGE_TYPE
endif
return "null"
endfunction
public function getMessageReceivers takes integer messageID returns string
local integer pID = 23 // reverse order to be able to perform substraction check
local integer receivers = messageReceivers[messageID]
local string list = ""
if receivers == 0 then
return "null"
endif
loop
exitwhen pID < 0 or receivers == 0
if GetPlayerController(Player(pID)) == MAP_CONTROL_USER and GetPlayerSlotState(Player(pID)) == PLAYER_SLOT_STATE_PLAYING then
if receivers - R2I(1 * Pow(2, pID)) >= 0 then // check if player is supposed to receive the message
set receivers = receivers - R2I(1 * Pow(2, pID))
if list == "" then
set list = I2S(pID)
else
set list = list + ", " + I2S(pID)
endif
endif
endif
set pID = pID - 1
endloop
return list
endfunction
public function getMessageTime takes integer messageID returns string
return convertTime(messageTime[messageID])
endfunction
private function sizeCheck takes string message returns boolean
if StringLength(message) > MESSAGE_LENGTH_LIMIT then
return false
endif
return true
endfunction
private function hideMessage takes nothing returns nothing
local integer HandleID = GetHandleId(GetExpiredTimer())
local integer current = LoadInteger(Hashtable, HandleID, FRAME_HASH)
local integer prev = previousFrame[current] // async
local integer duration = LoadInteger(Hashtable, HandleID, DURATION_HASH) + 1
call SaveInteger(Hashtable, HandleID, DURATION_HASH, duration)
if asyncVisibility[current] then // following stuff is all async, and only happens if player was meant to see the message
if (prev == 0 or not frameInUse[prev] or currentY[prev] >= FONT_SIZE + 0.005) and frameAlpha[current] < 0 then
call BlzFrameSetPoint(frameMessage[current], FRAMEPOINT_BOTTOMLEFT, frameMessagePanel, FRAMEPOINT_BOTTOMLEFT, 0., 0.)
set frameAlpha[current] = 0
endif
if frameAlpha[current] >= 0 and frameAlpha[current] < 255 and duration < MESSAGE_DURATION then
set frameAlpha[current] = frameAlpha[current] + 3
call BlzFrameSetAlpha(frameMessage[current], frameAlpha[current])
elseif duration > MESSAGE_DURATION and frameAlpha[current] > 0 then
set frameAlpha[current] = frameAlpha[current] - 3
call BlzFrameSetAlpha(frameMessage[current], frameAlpha[current])
endif
if targetY[current] > currentY[current] and frameAlpha[current] >= 0 then
set timeSinceStart[current] = timeSinceStart[current] + 1
if timeSinceStart[current] < 20 then
set currentY[current] = startY[current] + (targetY[current] - startY[current]) * easeInOutSine(timeSinceStart[current] / 20.)
else
set currentY[current] = targetY[current]
endif
call BlzFrameSetPoint(frameMessage[current], FRAMEPOINT_BOTTOMLEFT, frameMessagePanel, FRAMEPOINT_BOTTOMLEFT, 0., currentY[current])
endif
endif
if duration > MESSAGE_DURATION + 100 then
set frameInUse[current] = false
set asyncVisibility[current] = false
call BlzFrameSetVisible(frameMessage[current], false)
set currentY[current] = 0.
set frameAlpha[current] = -1
set timeSinceStart[current] = 0
call FlushChildHashtable(Hashtable, GetHandleId(GetExpiredTimer()))
call PauseTimer(GetExpiredTimer())
endif
endfunction
// Generates the message frontend in following shematic: [messageType][timeStamp] :icon: Playername: message
private function generateMessage takes integer time, string messagetype, string messageIcon, string message, integer receivers returns nothing
local integer current = 1
local integer HandleID
local integer prev = 0
local string timestamp = convertTime(time)
local integer pID
loop
exitwhen not frameInUse[Iterator]
if Iterator > MAX_MESSAGES then
set Iterator = 1
else
set Iterator = Iterator + 1
endif
endloop
//call BJDebugMsg("Expected Time: " + I2S(time))
//call BJDebugMsg("Expected Type: " + messagetype)
//call BJDebugMsg("Expected Icon: " + messageIcon)
//call BJDebugMsg("Expected Content: " + message)
//call BJDebugMsg("Expected Receivers: " + I2S(receivers))
// no reason to do these async, since only frameMessage visiblity matters
call BlzFrameSetText(frameMessageType[Iterator], messagetype)
call BlzFrameSetText(frameMessageTimeStamp[Iterator], timestamp)
call BlzFrameSetText(frameMessageText[Iterator], message)
if messageIcon != "" and messageIcon != null then
call BlzFrameSetTexture(frameMessageIcon[Iterator], messageIcon, 0, true)
call BlzFrameSetVisible(frameMessageIconContainer[Iterator], true)
call BlzFrameSetPoint(frameMessageTextContainer[Iterator], FRAMEPOINT_LEFT, frameMessageIconContainer[Iterator], FRAMEPOINT_RIGHT, 0.003, 0.)
else
call BlzFrameSetVisible(frameMessageIconContainer[Iterator], false)
call BlzFrameSetPoint(frameMessageTextContainer[Iterator], FRAMEPOINT_LEFT, frameMessageTimeStampContainer[Iterator], FRAMEPOINT_RIGHT, 0.003, 0.)
endif
set pID = 23 // reverse order to be able to perform substraction check
loop
exitwhen pID < 0 or receivers == 0
if GetPlayerController(Player(pID)) == MAP_CONTROL_USER and GetPlayerSlotState(Player(pID)) == PLAYER_SLOT_STATE_PLAYING then
if receivers - R2I(1 * Pow(2, pID)) >= 0 then // check if player is supposed to receive the message
set receivers = receivers - R2I(1 * Pow(2, pID)) // substract value from receiver panel
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetVisible(frameMessage[Iterator], true)
set asyncVisibility[Iterator] = true // async
set previousFrame[Iterator] = tempPrev // async
set prev = tempPrev // local async
set tempPrev = Iterator // async
set current = Iterator // local async
loop
exitwhen prev == 0
if prev == current then
set previousFrame[current] = 0 // async
set prev = 0 // local async
elseif frameInUse[prev] and asyncVisibility[prev] then
set targetY[prev] = targetY[prev] + FONT_SIZE + 0.005 // async
set startY[prev] = currentY[prev] // async
set timeSinceStart[prev] = 0 // async
set current = prev // local async
set prev = previousFrame[current] // local async
else
set prev = 0 // local async
endif
endloop
endif
endif
endif
set pID = pID - 1
endloop
set frameInUse[Iterator] = true
set HandleID = GetHandleId(timerMessage[Iterator])
call SaveInteger(Hashtable, HandleID, FRAME_HASH, Iterator)
call TimerStart(timerMessage[Iterator], 0.01, true, function hideMessage)
endfunction
private function sendPlayerMessage takes integer messageID returns nothing
local string visualMessageType = getMessageType(messageID)
local string sender = getMessageSender(messageID)
local string message = sender + "|r: " + getMessageContent(messageID)
local integer receivers = messageReceivers[messageID]
local integer time = messageTime[messageID]
local string icon = playerIcon[messageSender[messageID]]
call generateMessage(time, visualMessageType, icon, message, receivers)
endfunction
private function syncPlayerMessage takes nothing returns nothing
local integer pID = S2I(SubString(BlzGetTriggerSyncPrefix(), 12, StringLength(BlzGetTriggerSyncPrefix())))
local string Data = BlzGetTriggerSyncData()
local integer messageID = S2I(SubString(Data, 0, StringLength(Data) - 11))
local integer messageReceived = S2I(SubString(Data, StringLength(Data) - 1, StringLength(Data)))
local integer allChatSyncValue
//call BJDebugMsg("Player " + I2S(pID) + " synched")
set syncValue[messageID] = syncValue[messageID] - R2I(1 * Pow(2, pID))
//call BJDebugMsg("New Sync Value: " + I2S(syncValue[messageID]))
set messageReceivers[messageID] = messageReceivers[messageID] + R2I(messageReceived * (Pow(2, pID))) // geometric sequence to tell which players received the message
//call BJDebugMsg("New Receivers Value: " + I2S(messageReceivers[messageID]))
if syncValue[messageID] == 0 then
set allChatSyncValue = 0
set pID = 0
loop
exitwhen pID > 23
if GetPlayerController(Player(pID)) == MAP_CONTROL_USER and GetPlayerSlotState(Player(pID)) == PLAYER_SLOT_STATE_PLAYING then
set allChatSyncValue = allChatSyncValue + R2I(1 * Pow(2, pID)) // calculate expected partial sum of all players
endif
set pID = pID + 1
endloop
if messageReceivers[messageID] == allChatSyncValue then // compare syncValue partial sum with messageReceivers partial sum
set messageType[messageID] = 0 // All Chat
else
set messageType[messageID] = 1 // Allies Chat
endif
call sendPlayerMessage(messageID)
endif
endfunction
private function processPlayerMessage takes integer sender, string message, string log returns integer
local integer messageID
local integer pID = 0
set messageID = messageIterator
if messageIterator < JASS_MAX_ARRAY_SIZE then
set messageIterator = messageIterator + 1
else
set messageIterator = 0
endif
set messageTime[messageID] = gameTime
set messageSender[messageID] = sender
set messageContent[messageID] = message
set messageReceivers[messageID] = 0
set syncValue[messageID] = 0
loop
exitwhen pID > 23
if GetPlayerController(Player(pID)) == MAP_CONTROL_USER and GetPlayerSlotState(Player(pID)) == PLAYER_SLOT_STATE_PLAYING then
set syncValue[messageID] = syncValue[messageID] + R2I(1 * Pow(2, pID)) // geometric sequence to tell the current sync status of each player
if GetLocalPlayer() == Player(pID) then
if log != "" then
call BlzSendSyncData("New Message " + I2S(pID), I2S(messageID) + "_RECEIVED_1") // this way everyone receives a list of players that received the message
else
call BlzSendSyncData("New Message " + I2S(pID), I2S(messageID) + "_RECEIVED_0") // this way everyone receives a list of players that received the message
endif
endif
endif
set pID = pID + 1
endloop
return messageID
endfunction
// This function sends out a message to one player as system message. (receiver is a player ID)
public function sendSystemMessage takes integer receiver, string message returns nothing
local string visualMessageType
local integer receivers
if GetPlayerController(Player(receiver)) == MAP_CONTROL_USER and GetPlayerSlotState(Player(receiver)) == PLAYER_SLOT_STATE_PLAYING then
set visualMessageType = SYSTEM_MESSAGE_TYPE
set receivers = R2I(1 * Pow(2, receiver))
call generateMessage(gameTime, visualMessageType, systemIcon, message, receivers)
endif
endfunction
// This function sends out a message to multiple player as system message. (receivers is a partial sum)
public function sendSystemMessageMultiple takes integer receivers, string message returns nothing
local string visualMessageType
set visualMessageType = SYSTEM_MESSAGE_TYPE
call generateMessage(gameTime, visualMessageType, systemIcon, message, receivers)
endfunction
// This function sends out a message to all players as system message.
public function print takes string message returns nothing
local integer receivers = 0
local integer pID = 0
local string visualMessageType = SYSTEM_MESSAGE_TYPE
loop
exitwhen pID > 23
if GetPlayerController(Player(pID)) == MAP_CONTROL_USER and GetPlayerSlotState(Player(pID)) == PLAYER_SLOT_STATE_PLAYING then
set receivers = receivers + R2I(1 * Pow(2, pID)) // calculate expected partial sum of all players
endif
set pID = pID + 1
endloop
call generateMessage(gameTime, visualMessageType, systemIcon, message, receivers)
endfunction
private function commandEvent takes integer pID, string message returns nothing
local integer i = 1
local string array argsv
local integer current = 0
local integer last = 0
// Splits the message into a array to read message content as parameter
loop
exitwhen i > StringLength(message)
if SubString(message, i - 1, i) == " " then
set argsv[current] = SubString(message, last, i - 1)
set last = i
set current = current + 1
elseif i == StringLength(message) then
set argsv[current] = SubString(message, last, i)
endif
set i = i + 1
endloop
if argsv[0] == "caminfo" then
call sendSystemMessage(pID, "|cFFFFCC00Current Camera Information|r:")
call sendSystemMessage(pID, "|cFFFFCC00" + "Targ" + "|r" + " = " + "|cff00ffff" + "( " + R2SW( GetCameraTargetPositionX( ), 0, 0 ) + ", " + R2SW( GetCameraTargetPositionY( ), 0, 0 ) + ", " + R2SW( GetCameraTargetPositionZ( ), 0, 0 ) + " )|r")
call sendSystemMessage(pID, "|cFFFFCC00" + "Dist" + "|r" + " = " + "|cff00ffff" + R2SW( GetCameraField( CAMERA_FIELD_TARGET_DISTANCE ), 0, 0 ) + "|r")
call sendSystemMessage(pID, "|cFFFFCC00" + "FarZ" + "|r" + " = " + "|cff00ffff" + R2SW( GetCameraField( CAMERA_FIELD_FARZ ), 0, 0 ) + "|r")
call sendSystemMessage(pID, "|cFFFFCC00" + "AoA" + "|r" + " = " + "|cff00ffff" + R2SW( GetCameraField( CAMERA_FIELD_ANGLE_OF_ATTACK ) * bj_RADTODEG, 0, 2 ) + "|r")
call sendSystemMessage(pID, "|cFFFFCC00" + "FoV" + "|r" + " = " + "|cff00ffff" + R2SW( GetCameraField( CAMERA_FIELD_FIELD_OF_VIEW ) * bj_RADTODEG, 0, 2 ) + "|r")
call sendSystemMessage(pID, "|cFFFFCC00" + "Roll" + "|r" + " = " + "|cff00ffff" + R2SW( GetCameraField( CAMERA_FIELD_ROLL ) * bj_RADTODEG, 0, 2 ) + "|r")
call sendSystemMessage(pID, "|cFFFFCC00" + "Rot" + "|r" + " = " + "|cff00ffff" + R2SW( GetCameraField( CAMERA_FIELD_ROTATION ) * bj_RADTODEG, 0, 2 ) + "|r")
elseif argsv[0] == "sysinfo" then
call sendSystemMessage(pID, "|cFFFFCC00System Version: " + "|r" + "|cff00ffff" + CHAT_SYSTEM_VERSION + "|r")
call sendSystemMessage(pID, "|cFFFFCC00Command Syntax: " + "|r" + "|cff00ffff" + COMMAND_SYNTAX + "|r")
call sendSystemMessage(pID, "|cFFFFCC00System Messages: " + "|r" + "|cff00ffff" + SYSTEM_MESSAGE_TYPE + "|r")
call sendSystemMessage(pID, "|cFFFFCC00All Player Messages: " + "|r" + "|cff00ffff" + ALL_PLAYERS_MESSAGE_TYPE + "|r")
call sendSystemMessage(pID, "|cFFFFCC00Allied Players Messages: " + "|r" + "|cff00ffff" + ALLIED_PLAYERS_MESSAGE_TYPE + "|r")
call sendSystemMessage(pID, "|cFFFFCC00Message Length Limit: " + "|r" + "|cff00ffff" + I2S(MESSAGE_LENGTH_LIMIT) + "|r")
elseif argsv[0] == "message" then
set i = S2I(argsv[1])
if messageContent[i] != null then
call sendSystemMessage(pID, "|cFFFFCC00Message Sender: " + "|r" + "|cff00ffff" + getMessageSender(i) + "|r")
call sendSystemMessage(pID, "|cFFFFCC00Message Content: " + "|r" + "|cff00ffff" + getMessageContent(i) + "|r")
call sendSystemMessage(pID, "|cFFFFCC00Message Time: " + "|r" + "|cff00ffff" + getMessageTime(i) + "|r")
call sendSystemMessage(pID, "|cFFFFCC00Message Receivers: " + "|r" + "|cff00ffff" + getMessageReceivers(i) + "|r")
call sendSystemMessage(pID, "|cFFFFCC00Message Type: " + "|r" + "|cff00ffff" + getMessageType(i) + "|r")
else
call sendSystemMessage(pID, "|cFFFFCC00No message with given id found. (Searched ID: " + I2S(i) + ")|r")
endif
else
call sendSystemMessage(pID, "Couldn't find the command '" + argsv[0] + "'.")
endif
endfunction
private function chatAction takes nothing returns nothing
local integer pID = GetPlayerId(GetTriggerPlayer())
local string message = GetEventPlayerChatString()
if SubString(message, 0, StringLength(COMMAND_SYNTAX)) == COMMAND_SYNTAX then
// Command
call commandEvent(pID, SubString(message, StringLength(COMMAND_SYNTAX), StringLength(message)))
elseif frameChatHistory != null then
// Message
//call print("Log Data: " + BlzFrameGetText(frameChatHistory))
if sizeCheck(message) then
call processPlayerMessage(GetPlayerId(GetTriggerPlayer()), message, BlzFrameGetText(frameChatHistory))
else
call sendSystemMessage(pID, MESSAGE_SIZE_OVERFLOW)
endif
endif
if frameChatHistory != null then
call BlzFrameSetText(frameChatHistory, "")
endif
endfunction
private function generateMessageFrame takes integer createContext returns nothing
set frameMessage[createContext] = BlzCreateSimpleFrame("Message", frameMessagePanel, createContext)
call BlzFrameSetSize(frameMessage[createContext], 0.8, FONT_SIZE + 0.005)
call BlzFrameSetSize(BlzGetFrameByName("Message Type Container", createContext), 0.045, FONT_SIZE + 0.005)
set frameMessageType[createContext] = BlzGetFrameByName("Message Type", createContext)
call BlzFrameSetSize(frameMessageType[createContext], 0.045, FONT_SIZE + 0.005)
call BlzFrameSetFont(frameMessageType[createContext], CHAT_FONT, FONT_SIZE, 0)
set frameMessageTimeStampContainer[createContext] = BlzGetFrameByName("Message Timestamp Container", createContext)
call BlzFrameSetSize(frameMessageTimeStampContainer[createContext], 0.045, FONT_SIZE + 0.005)
set frameMessageTimeStamp[createContext] = BlzGetFrameByName("Message Timestamp", createContext)
call BlzFrameSetSize(frameMessageTimeStamp[createContext], 0.045, FONT_SIZE + 0.005)
call BlzFrameSetFont(frameMessageTimeStamp[createContext], CHAT_FONT, FONT_SIZE, 0)
set frameMessageIconContainer[createContext] = BlzGetFrameByName("Message Icon Container", createContext)
call BlzFrameSetSize(frameMessageIconContainer[createContext], FONT_SIZE + 0.005, FONT_SIZE + 0.005)
set frameMessageIcon[createContext] = BlzGetFrameByName("Message Icon", createContext)
set frameMessageTextContainer[createContext] = BlzGetFrameByName("Message Text Container", createContext)
call BlzFrameSetSize(frameMessageTextContainer[createContext], 0.675, FONT_SIZE + 0.005)
set frameMessageText[createContext] = BlzGetFrameByName("Message Text", createContext)
call BlzFrameSetSize(frameMessageText[createContext], 0.675, FONT_SIZE + 0.005)
call BlzFrameSetFont(frameMessageText[createContext], CHAT_FONT, FONT_SIZE, 0)
call BlzFrameSetVisible(frameMessage[createContext], false)
call BlzFrameSetAlpha(frameMessage[createContext], 0)
set timerMessage[createContext] = CreateTimer()
set frameInUse[createContext] = false
set startY[createContext] = 0.
set currentY[createContext] = 0.
set targetY[createContext] = 0.
set frameAlpha[createContext] = -1
set timeSinceStart[createContext] = 0
set asyncVisibility[createContext] = false
set previousFrame[createContext] = 0
endfunction
private function chatInit takes nothing returns nothing
local integer current = 0
local trigger trig1
local trigger trig2
// Try to load ChatSystem.toc, otherwise don't init system
if BlzLoadTOCFile("UI\\ChatSystem.toc") then
set trig1 = CreateTrigger()
set trig2 = CreateTrigger()
loop
exitwhen current > 23
call TriggerRegisterPlayerChatEvent(trig1, Player(current), "", false)
call BlzTriggerRegisterPlayerSyncEvent(trig2, Player(current), "New Message " + I2S(current), false)
set current = current + 1
endloop
call TriggerAddAction(trig1, function chatAction)
call TriggerAddAction(trig2, function syncPlayerMessage)
set trig1 = null
set trig2 = null
call BlzFrameSetVisible(BlzGetOriginFrame(ORIGIN_FRAME_CHAT_MSG, 0), false) // hides default chat
set frameMain = BlzCreateSimpleFrame("Main", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), 0)
set frameMessagePanel = BlzGetFrameByName("Message Panel", 0)
set current = 1
loop
exitwhen current > MAX_MESSAGES
call generateMessageFrame(current)
set current = current + 1
endloop
call BlzFrameSetAbsPoint(frameMain, FRAMEPOINT_BOTTOM, 0.4, 0.)
call BlzFrameSetPoint(frameMessagePanel, CHAT_REFPOINT, frameMain, CHAT_REFPOINT, CHAT_X, CHAT_Y)
call print("Successfully loaded Chat System v" + CHAT_SYSTEM_VERSION)
call BlzGetFrameByName("ChatHistoryDisplay", 0)
set frameChatHistory = BlzGetFrameByName("ChatHistoryDisplay", 0)
if frameChatHistory == null then
call print("Singleplayer detected, normal chat messages are disabled. (Commands will remain working)")
else
call print("Multiplayer detected, normal chat messages and commands will work as intended")
call BlzFrameSetText(frameChatHistory, "")
// hide observer chat radio button cause it cause desyncs
call BlzFrameSetVisible(BlzGetFrameByName("ChatObserversRadioButton", 0), false)
call BlzFrameSetEnable(BlzGetFrameByName("ChatObserversRadioButton", 0), false)
call BlzFrameSetVisible(BlzGetFrameByName("ChatObserversLabel", 0), false)
// move everyone button where observer chat would normally be
call BlzFrameSetPoint(BlzGetFrameByName("ChatEveryoneRadioButton", 0), FRAMEPOINT_TOP, BlzGetFrameByName("ChatAlliesRadioButton", 0), FRAMEPOINT_BOTTOM, 0., -0.002)
endif
set playerColor[0] = "|cffff0303"
set playerColor[1] = "|cff0042ff"
set playerColor[2] = "|cff1ce6b9"
set playerColor[3] = "|cff540081"
set playerColor[4] = "|cfffffc01"
set playerColor[5] = "|cfffe8a0e"
set playerColor[6] = "|cff20c000"
set playerColor[7] = "|cffe55bb0"
set playerColor[8] = "|cff959697"
set playerColor[9] = "|cff7ebff1"
set playerColor[10] = "|cff106246"
set playerColor[11] = "|cff4e2a04"
set playerColor[12] = "|cff9B0000"
set playerColor[13] = "|cff0000C3"
set playerColor[14] = "|cff00EAFF"
set playerColor[15] = "|cffBE00FE"
set playerColor[16] = "|cffEBCD87"
set playerColor[17] = "|cffF8A48B"
set playerColor[18] = "|cffBFFF80"
set playerColor[19] = "|cffDCB9EB"
set playerColor[20] = "|cff282828"
set playerColor[21] = "|cffEBF0FF"
set playerColor[22] = "|cff00781E"
set playerColor[23] = "|cffA46F33"
set playerIcon[0] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
set playerIcon[1] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
set playerIcon[2] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
set playerIcon[3] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
set playerIcon[4] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
set playerIcon[5] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
set playerIcon[6] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
set playerIcon[7] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
set playerIcon[8] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
set playerIcon[9] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
set playerIcon[10] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
set playerIcon[11] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
set playerIcon[12] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
set playerIcon[13] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
set playerIcon[14] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
set playerIcon[15] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
set playerIcon[16] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
set playerIcon[17] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
set playerIcon[18] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
set playerIcon[19] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
set playerIcon[20] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
set playerIcon[21] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
set playerIcon[22] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
set playerIcon[23] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
call TimerStart(CreateTimer(), 1.0, true, function updateGameTime)
endif
endfunction
private function onInit takes nothing returns nothing
call TimerStart(CreateTimer(), 0., false, function chatInit)
endfunction
endlibrary