CTA_MESSAGE = "M"; CTA_GENERAL = "I"; CTA_GROUP_UPDATE = "G"; CTA_BLOCK = "X"; CTA_SEARCH = "S"; CTA_MESSAGE_COLOURS = { M = { r = 1, b = 1, g = 0.5 }, I = { r = 1, b = 0.5, g = 1 }, G = { r = 0.5, b = 0.5, g = 1 }, X = { r = 1, b = 0.5, g = 0.5 }, S = { r = 0.5, b = 1, g = 0.5 } }; CTA_Classes = { init = function() if( UnitFactionGroup(CTA_PLAYER) == CTA_ALLIANCE ) then CTA_Classes[8] = "PALADIN"; else CTA_Classes[8] = "SHAMAN"; end end }; CTA_Classes[1] = "PRIEST"; CTA_Classes[2] = "MAGE"; CTA_Classes[3] = "WARLOCK"; CTA_Classes[4] = "DRUID"; CTA_Classes[5] = "HUNTER"; CTA_Classes[6] = "ROGUE"; CTA_Classes[7] = "WARRIOR"; CTA_Classes[8] = "PALADIN"; CTA_Classes[CTA_PRIEST] = { id=1, txMin=0.50, txMax=0.75, tyMin=0.25, tyMax=0.50 }; CTA_Classes[CTA_MAGE] = { id=2, txMin=0.25, txMax=0.50, tyMin=0.00, tyMax=0.25 }; CTA_Classes[CTA_WARLOCK] = { id=3, txMin=0.75, txMax=1.00, tyMin=0.25, tyMax=0.50 }; CTA_Classes[CTA_DRUID] = { id=4, txMin=0.75, txMax=1.00, tyMin=0.00, tyMax=0.25 }; CTA_Classes[CTA_HUNTER] = { id=5, txMin=0.00, txMax=0.25, tyMin=0.25, tyMax=0.50 }; CTA_Classes[CTA_ROGUE] = { id=6, txMin=0.50, txMax=0.75, tyMin=0.00, tyMax=0.25 }; CTA_Classes[CTA_WARRIOR] = { id=7, txMin=0.00, txMax=0.25, tyMin=0.00, tyMax=0.25 }; CTA_Classes[CTA_PALADIN] = { id=8, txMin=0.00, txMax=0.25, tyMin=0.50, tyMax=0.75 }; CTA_Classes[CTA_SHAMAN] = { id=8, txMin=0.25, txMax=0.50, tyMin=0.25, tyMax=0.50 }; CTA_Classes["PRIEST"] = { localName=CTA_PRIEST, id=1, txMin=0.50, txMax=0.75, tyMin=0.25, tyMax=0.50 }; CTA_Classes["MAGE"] = { localName=CTA_MAGE, id=2, txMin=0.25, txMax=0.50, tyMin=0.00, tyMax=0.25 }; CTA_Classes["WARLOCK"] = { localName=CTA_WARLOCK, id=3, txMin=0.75, txMax=1.00, tyMin=0.25, tyMax=0.50 }; CTA_Classes["DRUID"] = { localName=CTA_DRUID, id=4, txMin=0.75, txMax=1.00, tyMin=0.00, tyMax=0.25 }; CTA_Classes["HUNTER"] = { localName=CTA_HUNTER, id=5, txMin=0.00, txMax=0.25, tyMin=0.25, tyMax=0.50 }; CTA_Classes["ROGUE"] = { localName=CTA_ROGUE, id=6, txMin=0.50, txMax=0.75, tyMin=0.00, tyMax=0.25 }; CTA_Classes["WARRIOR"] = { localName=CTA_WARRIOR, id=7, txMin=0.00, txMax=0.25, tyMin=0.00, tyMax=0.25 }; CTA_Classes["PALADIN"] = { localName=CTA_PALADIN, id=8, txMin=0.00, txMax=0.25, tyMin=0.50, tyMax=0.75 }; CTA_Classes["SHAMAN"] = { localName=CTA_SHAMAN, id=8, txMin=0.25, txMax=0.50, tyMin=0.25, tyMax=0.50 }; local trim; local getOps; local recursiveSearch; local cloneTable; trim = function( s ) if( not s ) then return nil; end return( string.gsub(s, "^%s*(.-)%s*$", "%1") or s ); end getOps = function( source ) local operatorFound = nil; local bracketCount = 0; local inQuote = 0; local pos = 0; local currentChar; local prevChar = "x"; while( pos < string.len( source ) ) do currentChar = string.sub( source, pos, pos ); if( ( currentChar == "+" or currentChar == "/" ) and bracketCount == 0 and inQuote == 0 ) then operatorFound = 1; break; elseif( currentChar == "(" ) then bracketCount = bracketCount + 1; elseif( currentChar == ")" ) then bracketCount = bracketCount - 1; elseif( currentChar == "\"" ) then inQuote = 1 - inQuote; else if( prevChar == " " and bracketCount == 0 and inQuote == 0 ) then operatorFound = 2; pos = pos - 1; break; end end prevChar = currentChar; pos = pos + 1; end if( operatorFound == 2 ) then return "/", string.sub( source, 1, pos - 1 ), string.sub( source, pos + 1 ); end if( operatorFound ) then return currentChar, string.sub( source, 1, pos - 1 ), string.sub( source, pos + 1 ); end end recursiveSearch = function( source, search ) if( not ( source and search ) ) then return nil; end local s = trim( search ); local operator, op1, op2 = getOps( s ); if( operator ) then local op1Res = recursiveSearch( source, op1 ); if( not op1Res ) then return 0; elseif( op1Res > 0 and operator == "/" ) then return 1; elseif( op1Res == 0 and operator == "+" ) then return 0; end local op2Res = recursiveSearch( source, op2, verbose ); if( not op2Res ) then return 0; elseif( op2Res > 0 and ( op1Res > 0 or operator == "/" ) ) then return 1; end return 0; else local literal; if( string.sub( s, 1, 1 ) == "-" ) then return( 1 - recursiveSearch( source, trim( string.sub( s, 2 ) ) ) ); elseif( string.sub( s, 1, 1 ) == "(" and string.sub( s, string.len( s ) ) == ")" ) then return recursiveSearch( source, trim( string.sub( s, 2, string.len( s ) - 1 ) ) ); elseif( string.sub( s, 1, 1 ) == "\"" and string.sub( s, string.len( s ) ) == "\"" ) then s = trim( string.sub( s, 2, string.len( s ) - 1 ) ); literal = 1; end if( literal ) then if( string.find( source, s ) ) then return 1; else return 0; end else if( string.find( source, s ) ) then return 1; else for word in string.gfind( s, "%w+" ) do if( string.find( source, "%s+"..word.."%s+" ) ) then return 1; elseif( string.find( source, "^"..word.."%s+" ) ) then return 1; elseif( string.find( source, "%s+"..word.."$" ) ) then return 1; end end return 0; end end end end cloneTable = function( t ) local new = {}; local i, v; for i, v in t do if ( type(v)=="table" ) then new[i] = cloneTable(v); else new[i] = v; end end return new; end --[[ The CTA_Util table holds several utility functions. ======================================================================================================================== --]] CTA_Util = {}; --[[ ------------------------------------------------------------------------------------------------------------------------ Time ------------------------------------------------------------------------------------------------------------------------ --]] CTA_Util.getTime = function() local hour, minute = GetGameTime(); if( hour < 10 ) then hour = "0"..hour; end if( minute < 10 ) then minute = "0"..minute; end return hour..":"..minute; end --[[ ------------------------------------------------------------------------------------------------------------------------ Searching ------------------------------------------------------------------------------------------------------------------------ --]] CTA_Util.search = function ( s, q ) local source = string.lower( string.gsub( s, "|c(%w+)|H(%w+):(.+)|h(.+)|h|r", "%4" ) ); return recursiveSearch( source, string.lower( q ) ), source; end --[[ ------------------------------------------------------------------------------------------------------------------------ Showing and filtering lists ------------------------------------------------------------------------------------------------------------------------ --]] CTA_Util.updateList = function ( list, first, UIListName, maxResults, offset, showResultItem, size ) while( size <= offset ) do offset = offset - maxResults; end if( offset < 0 ) then offset = 0; end local pos = 0; local current = first; while( current ~= 0 and pos < offset ) do pos = pos + 1; current = list[current].next; end pos = 0; while( current ~= 0 and pos < maxResults ) do pos = pos + 1; showResultItem( getglobal( UIListName..pos ), current ); current = list[current].next; end while( pos < maxResults ) do pos = pos + 1; getglobal( UIListName..pos ):Hide(); end end CTA_Util.filterList = function ( list, satisfiesFilter ) local size = 0; local first = 0; local prev = 0; for key, data in list do if( not satisfiesFilter or satisfiesFilter( key ) ) then size = size + 1; if( first ~= 0 ) then list[prev].next = key; else first = key; end prev = key; end data.next = 0; end return first, size; end --[[ ------------------------------------------------------------------------------------------------------------------------ Output to chat, log and minimap ------------------------------------------------------------------------------------------------------------------------ --]] CTA_Util.errorPrintln = function ( s ) UIErrorsFrame:AddMessage(s, 0.75, 0.75, 1.0, 1.0, UIERRORS_HOLD_TIME); end CTA_Util.chatPrintln = function ( s ) DEFAULT_CHAT_FRAME:AddMessage( "CTA: "..( s or "nil" ), 1, 0.75, 0.0); end CTA_Util.iconPrintln = function ( s, t ) if( not t ) then CTA_MinimapMessageFrame:AddMessage( ( s or "nil" ), 1.0, 1.0, 0.5, 1.0, UIERRORS_HOLD_TIME); else local r = CTA_MESSAGE_COLOURS[t].r; local g = CTA_MESSAGE_COLOURS[t].g; local b = CTA_MESSAGE_COLOURS[t].b; CTA_MinimapMessageFrame:AddMessage( ( s or "nil" ), r, g, b, 1.0, UIERRORS_HOLD_TIME); end end CTA_Util.logPrintln = function ( s, t ) local m = s; if( not m ) then m = "nil"; end m = "["..CTA_Util.getTime().."] "..( m or "nil" ); if( not t ) then CTA_Log:AddMessage( m, 1.0, 1.0, 0.5 ); else local r = CTA_MESSAGE_COLOURS[t].r; local g = CTA_MESSAGE_COLOURS[t].g; local b = CTA_MESSAGE_COLOURS[t].b; CTA_Log:AddMessage( m, r, g, b ); end end --[[ ------------------------------------------------------------------------------------------------------------------------ Communication ------------------------------------------------------------------------------------------------------------------------ --]] CTA_Util.joinChannel = function( channel ) JoinChannelByName( channel ); RemoveChatWindowChannel( DEFAULT_CHAT_FRAME:GetID(), channel ); CTA_Util.logPrintln( CTA_CALL_TO_ARMS_LOADED ); CTA_Util.logPrintln( "Joined "..channel ); return 1; end CTA_Util.sendChatMessage = function( message, messageType, channel, hidden ) local language = CTA_COMMON; if( UnitFactionGroup(CTA_PLAYER) ~= CTA_ALLIANCE ) then language = CTA_ORCISH; end if( not hidden ) then SendChatMessage( string.gsub( message, "|c(%w+)|H(%w+):(.+)|h(.+)|h|r", "%4" ), messageType, language, channel ); elseif( hidden == 1 ) then SendChatMessage( "[CTA] "..string.gsub( message, "|c(%w+)|H(%w+):(.+)|h(.+)|h|r", "%4" ), messageType, language, channel ); else SendChatMessage( " "..string.gsub( message, "|c(%w+)|H(%w+):(.+)|h(.+)|h|r", "%4" ), messageType, language, channel ); end end --[[ ------------------------------------------------------------------------------------------------------------------------ Group ------------------------------------------------------------------------------------------------------------------------ --]] CTA_Util.getGroupMemberInfo = function( index ) local name, rank, subgroup, level, class, fileName, zone, online, isDead; if ( IsRaidLeader() and GetNumRaidMembers() > 0 ) then name, rank, subgroup, level, class, fileName, zone, online, isDead = GetRaidRosterInfo(index); elseif ( IsPartyLeader() and GetNumPartyMembers() > 0 ) then local target = CTA_PLAYER; if( index > 1 and index < 6 ) then target = "PARTY"..(index-1); end name = UnitName(target); level = UnitLevel(target); class = UnitClass(target); elseif( GetNumRaidMembers() == 0 and GetNumPartyMembers() == 0 and index == 1 ) then local target = CTA_PLAYER; name = UnitName(target); level = UnitLevel(target); class = UnitClass(target); end return name, level, class; end CTA_Util.getNumGroupMembers = function() if( GetNumRaidMembers() > 0 ) then return GetNumRaidMembers(); elseif( GetNumPartyMembers() > 0 ) then return GetNumPartyMembers() + 1; else return 1; end end --[[ ------------------------------------------------------------------------------------------------------------------------ Table functions ------------------------------------------------------------------------------------------------------------------------ --]] CTA_Util.getn = function( list ) local c = 0; for i, j in list do c = c + 1; end return c; end CTA_Util.cloneTable = function( t ) return cloneTable( t ); end --[[ ------------------------------------------------------------------------------------------------------------------------ Class codec functions ------------------------------------------------------------------------------------------------------------------------ --]] CTA_Util.getClassCode = function( className ) return CTA_Classes[className].id; end CTA_Util.getClassString = function( classSet ) local b = ""; local c = classSet; while( c > 0 ) do local d = mod(c, 2); b = d..b; c = floor(c/2); end while(string.len(b) < 8 ) do b = "0"..b; end local pos = 8; local t = ""; while( pos > 0 ) do if( string.sub(b, pos, pos) == "1" ) then t = t..CTA_Classes[ CTA_Classes[9-pos] ].localName.." "; end pos = pos - 1; end return t; end --[[ ------------------------------------------------------------------------------------------------------------------------ Player information retrieval ------------------------------------------------------------------------------------------------------------------------ --]] CTA_Util.getWhoInfo = function( playerName ) local numWhos, totalCount = GetNumWhoResults(); local name, guild, level, race, class, zone, group; for i=1, totalCount do name, guild, level, race, class, zone, group = GetWhoInfo(i); if( name == playerName ) then return name, guild, level, race, class, zone, group; end end end