--[[ --------------------------------------------------------------- Call To Arms --------------------------------------------------------------- @Author: Sacha Beharry @DateCreated: 26th May 2005 @LastUpdate: 1st July 2006 @Release: R10 @Version: 1.6 @Note: ]] CTA_RELEASEVERSION = "R10"; CTA_RELEASENOTE = "R10 [1.6]"; CTA_THIS_VERSION = 9; --[[ --------------------------------------------------------------- Web: Filename: CallToArms.lua Project Name: Call To Arms Description: Main Program Purpose: --------------------------------------------------------------- ]] --[[ --------------------------------------------------------------- Variables --------------------------------------------------------------- ]] CTA_DEFAULT_RAID_CHANNEL = "CTAChannel"; CTA_INVITE_MAGIC_WORD = "inviteme"; CTA_PLAYER = "PLAYER"; CTA_MAX_RESULTS_ITEMS = 20; CTA_MAX_BLACKLIST_ITEMS = 15; CTA_ALLIANCE = "Alliance"; CTA_HORDE = "Horde"; CTA_DEFAULT_LFM_TRIGGER = "\"lf%d*m\""; CTA_DEFAULT_LFG_TRIGGER = "lfg"; CTA_SavedVariables = { version = 0, runCount = 0, GreyList = {}, MinimapArcOffset = 223, MinimapRadiusOffset = 75, MinimapMsgArcOffset = 296, MinimapMsgRadiusOffset = 95, MainFrameTransparency = 0.85, lfmTrigger = "\"lf%d*m\"", lfgTrigger = "lfg" }; CTA_CommunicationChannel = "CTAChannel"; CTA_MyRaid = nil; CTA_RaidList = {}; CTA_ResultsListOffset = 0; CTA_BlackList = {}; CTA_PlayerListOffset = 0; CTA_MyRaidIsOnline = nil; CTA_IgnoreBlacklisted = 1; local CTA_RAID_TYPE_PVP = 1; local CTA_RAID_TYPE_PVE = 0; local CTA_GREYLISTED = 0; local CTA_BLACKLISTED = 1; local CTA_WHITELISTED = 2; local CTA_MESSAGE = "M"; local CTA_GENERAL = "I"; local CTA_GROUP_UPDATE = "G"; local CTA_BLOCK = "X"; local CTA_SEARCH = "S"; local 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 } }; local CTA_MyRaidPassword = nil; local CTA_UpdateTicker = 0.0; local CTA_SearchTimer = 0; local CTA_SelectedResultListItem = 0; local CTA_ChannelSpam = {}; local CTA_SpamTimer = 0; local CTA_PendingMembers = {}; local CTA_GraceTimer = 0; local CTA_HostingRaidGroup = nil; CTA_InvitationRequests = {}; local CTA_OutstandingRequests = 0; local CTA_RequestTimer = 0; CTA_PollBroadcast = nil; CTA_PollApplyFilters = nil; CTA_TimeSinceLastBroadcast = 0; CTA_TimeSinceLastFilter = 0 CTA_RawGroupList = {}; CTA_JoinedChannel = nil; CTA_AcidSummary = nil; CTA_AnnounceTimer = 0; CTA_WhoName = nil; -- R7 BEGIN local lfxChatMessageList = {}; local autoannounce = nil; --CTA_lfmTrigger = CTA_DEFAULT_LFM_TRIGGER; --CTA_lfgTrigger = CTA_DEFAULT_LFG_TRIGGER; CTA_CtaMessageList = {}; CTA_ForwardTimer = 10; CTA_WhoFlag = nil; CTA_AcidDetails = nil; CTA_PlayerIsAFK = nil; CTA_Classes = {}; --R7 END --[[ --------------------------------------------------------------- OnLoad and Slash Commands --------------------------------------------------------------- ]] --[[ CTA_OnLoad() --------------------------------------------------------------- Register events and hook functions. ]] function CTA_OnLoad() --Register Slash Command SlashCmdList["CallToArmsCOMMAND"] = CTA_SlashHandler; SLASH_CallToArmsCOMMAND1 = "/cta"; --Register Event Listeners this:RegisterEvent("CHAT_MSG_SYSTEM"); this:RegisterEvent("PARTY_MEMBERS_CHANGED"); this:RegisterEvent("PARTY_LEADER_CHANGED"); this:RegisterEvent("CHAT_MSG_WHISPER"); this:RegisterEvent("CHAT_MSG_CHANNEL"); this:RegisterEvent("RAID_ROSTER_UPDATE"); this:RegisterEvent("WHO_LIST_UPDATE"); this:RegisterEvent("VARIABLES_LOADED"); --Announce AddOn to user CTA_Println( CTA_CALL_TO_ARMS_LOADED ); CTA_Error("-[ CTA "..CTA_RELEASEVERSION.." ]-"); CTA_Classes[1] = CTA_PRIEST; CTA_Classes[2] = CTA_MAGE; CTA_Classes[3] = CTA_WARLOCK; CTA_Classes[4] = CTA_DRUID; CTA_Classes[5] = CTA_HUNTER; CTA_Classes[6] = CTA_ROGUE; CTA_Classes[7] = CTA_WARRIOR; if( UnitFactionGroup(CTA_PLAYER) == CTA_ALLIANCE ) then CTA_Classes[8] = CTA_PALADIN; else CTA_Classes[8] = CTA_SHAMAN; end CTA_Classes[CTA_PRIEST] = 1; CTA_Classes[CTA_MAGE] = 2; CTA_Classes[CTA_WARLOCK] = 3; CTA_Classes[CTA_DRUID] = 4; CTA_Classes[CTA_HUNTER] = 5; CTA_Classes[CTA_ROGUE] = 6; CTA_Classes[CTA_WARRIOR] = 7; CTA_Classes[CTA_PALADIN] = 8; CTA_Classes[CTA_SHAMAN] = 8; --Hook into ChatFrame to hide AddOn communication local old_ChatFrame_OnEvent = ChatFrame_OnEvent; function ChatFrame_OnEvent(event) -- R5 : effectively makes blacklist an extended ignore list as well if( arg2 and CTA_IgnoreBlacklisted and CTA_FindInList( arg2, CTA_BlackList ) ) then --CTA_IconMsg( arg2, CTA_BLOCK ); -- left for testing, disabled for R7 CTA_LogMsg( "Blocked message from "..arg2, CTA_BLOCK ); -- R7 return; end if( strsub(event, 1, 16) == "CHAT_MSG_WHISPER" ) then if( arg2 and arg1 and strsub(arg1, 1, 5) == "[CTA]" ) then CTA_IconMsg( arg2, CTA_MESSAGE ); CTA_LogMsg( arg2..": "..arg1, CTA_MESSAGE ); return; --R3 end end if( arg9 and CTA_MuteLFGChannelCheckButton:GetChecked() and arg9=="LookingForGroup" ) then --CTA_IconMsg( arg1 ); -- for testing return; end if ( not arg1 or strsub(event, 1, 16) ~= "CHAT_MSG_WHISPER" or strsub(arg1, 1, 5) ~= "/cta " ) then -- not arg1: R3 bug fix if( not arg1 or not CTA_MainFrame:IsVisible() or not string.find( arg1, "Away from Keyboard") ) then -- not arg1: R3 bug fix old_ChatFrame_OnEvent(event); end end end --Hook into FriendsFrame_OnEvent local old_FriendsFrame_OnEvent = FriendsFrame_OnEvent; function FriendsFrame_OnEvent() if( event ~= "WHO_LIST_UPDATE" or ( CTA_OutstandingRequests == 0 and CTA_WhoFlag == nil ) ) then --if( CTA_OutstandingRequests == 0 and CTA_WhoFlag == nil ) then old_FriendsFrame_OnEvent(); end end ScriptErrors:SetScript("OnShow", CTA_ScriptError ); end function CTA_ScriptError() local message = ScriptErrors_Message:GetText(); if (not message or not string.find( message, "CallToArms" ) ) then --CTA_Println( "No CallToArms error found" ); return; end local extMsg = "Error: "..message; extMsg = extMsg..", Addons: "; local numAddons = GetNumAddOns(); for i = 1, numAddons do if( IsAddOnLoaded( i ) ) then local name = GetAddOnInfo( i ); extMsg = extMsg..name..", "; end end extMsg = extMsg.." Client: "..GetLocale(); CTA_ErrorReportingFrameEditBox:SetText( extMsg ); CTA_ErrorReportingFrame:Show(); end --[[ CTA_SlashHandler(com) --------------------------------------------------------------- For Slash Commands (surprise) @arg The command String ]] function CTA_SlashHandler(com) if( not com or com=="" ) then CTA_Println( CTA_CALL_TO_ARMS.." "..CTA_RELEASEVERSION ); CTA_Println( CTA_COMMANDS..": "..CTA_HELP.." | "..CTA_TOGGLE.." | "..CTA_ANNOUNCE_GROUP.." | "..CTA_DISSOLVE_RAID ); CTA_Println( CTA_COMMANDS..": "..CTA_TOGGLE_MINIMAP ); CTA_Println( "Beta commands:" ); CTA_Println( "/error: starts CTA error reporting function. Only works if an error has already occurred." ); return; end if( com==CTA_HELP ) then CTA_Println( CTA_TOGGLE..": "..CTA_TOGGLE_HELP ); CTA_Println( CTA_ANNOUNCE_GROUP..": "..CTA_ANNOUNCE_GROUP_HELP ); CTA_Println( CTA_DISSOLVE_RAID..": "..CTA_DISSOLVE_RAID_HELP ); return; end if( com==CTA_TOGGLE ) then if( CTA_MainFrame:IsVisible() ) then CTA_MainFrame:Hide(); else CTA_MainFrame:Show(); end return; end if( com==CTA_TOGGLE_MINIMAP ) then if( CTA_MinimapIcon:IsVisible() ) then CTA_MinimapIcon:Hide(); else CTA_MinimapIcon:Show(); end return; end if( com==CTA_DISSOLVE_RAID ) then if( IsRaidLeader() ) then CTA_DissolveRaid(); else CTA_Println( CTA_MUST_BE_LEADER_TO_DISSOLVE_RAID ); end return; end if( com==CTA_AUTO_ANNOUNCE_OFF ) then autoannounce = nil; CTA_AnnounceTimer = 0; CTA_Println( "Auto announce OFF" ); return; end for channelName in string.gfind( com, CTA_ANNOUNCE_GROUP.." (%w+)" ) do autoannounce = channelName; CTA_AnnounceTimer = 5; CTA_Println( "Auto announce ON" ); end --[ [ if( com=="error" ) then CTA_ScriptError(); return; end --]] if( com=="test" ) then local DefaultChannels = { GetChatWindowChannels(DEFAULT_CHAT_FRAME:GetID()) }; local connected = nil; if( DefaultChannels ) then for item = 1, getn(DefaultChannels) do CTA_Println( DefaultChannels[item] or "Null" ); end end end end --[[ --------------------------------------------------------------- OnUpdate and OnEvent --------------------------------------------------------------- ]] --[[ CTA_OnUpdate() --------------------------------------------------------------- Keep the CTA_UpdateTicker running. @arg The time elapsed since the last call to this function ]] function CTA_OnUpdate( arg1 ) CTA_UpdateTicker = CTA_UpdateTicker + arg1; if( CTA_UpdateTicker >= 1 ) then if( CTA_AnnounceTimer > 0 ) then CTA_AnnounceTimer = CTA_AnnounceTimer - 1; -- r7 if( CTA_AnnounceTimer == 0 and autoannounce ) then if( CTA_PlayerIsAFK ) then autoannounce = nil; CTA_Println( "You are AFK: Setting auto announce to OFF" ); elseif ( CTA_GetNumGroupMembers() > 1 and not CTA_MyRaid ) then autoannouce = nil; CTA_Println( "You have joined a group. LFG Auto announce OFF" ); elseif( CTA_MyRaidIsOnline and CTA_MyRaid and CTA_AcidSummary ) then CTA_SendChatMessage( CTA_AcidSummary, "CHANNEL", autoannounce ); CTA_AnnounceTimer = 100; PlaySound("TellMessage"); CTA_IconMsg( "Announced LFM" ); CTA_Println( "Announced LFM message to local channel" ); elseif( CTA_LGMPrefixLabel:GetText() and CTA_LFGDescriptionEditBox:GetText() ~= "" ) then CTA_SendChatMessage( CTA_LGMPrefixLabel:GetText()..CTA_LFGDescriptionEditBox:GetText(), "CHANNEL", autoannounce ); CTA_AnnounceTimer = 100; PlaySound("TellMessage"); CTA_IconMsg( "Announced LFG" ); CTA_Println( "Announced LFG message to local channel" ); else autoannounce = nil; CTA_Println( "Nothing to announce: Setting auto announce to OFF" ); end end -- /r7 end CTA_TimeSinceLastBroadcast = CTA_TimeSinceLastBroadcast + 1; if( CTA_TimeSinceLastBroadcast > 15 ) then CTA_TimeSinceLastBroadcast = 0; --[[if( CTA_PlayerIsAFK ) then CTA_PollBroadcast = nil; else]] if( CTA_MyRaidIsOnline and CTA_MyRaid ) then CTA_PollBroadcast = 1; elseif( CTA_LFGCheckButton:GetChecked() and CTA_LGMPrefixLabel:GetText() and CTA_LFGDescriptionEditBox:GetText() ~= "" ) then if( CTA_GetNumGroupMembers() > 1 ) then CTA_LFGCheckButton:SetChecked( 0 ); CTA_Println( "You have joined a group. CTA has stopped listing you as looking for a group." ); else CTA_PollBroadcast = 3; end end --/r7 end CTA_TimeSinceLastFilter = CTA_TimeSinceLastFilter + 1; if( CTA_TimeSinceLastFilter > 15 ) then CTA_TimeSinceLastFilter = 0; CTA_PollApplyFilters = 1; end CTA_SpamTimer = CTA_SpamTimer + CTA_UpdateTicker; if( CTA_SpamTimer > 10 ) then CTA_ChannelSpam = {}; CTA_SpamTimer = 0; -- Ok, piggybacking 10s SpamTimer to implement -- Polled Broadcasting and -- Auto Search Updates. if( CTA_PollApplyFilters ) then CTA_TimeSinceLastFilter = 0; CTA_ApplyFiltersToGroupList(); end if( CTA_PollBroadcast ) then CTA_TimeSinceLastBroadcast = 0; --[[if( CTA_PlayerIsAFK ) then CTA_PollBroadcast = nil; CTA_Println( "You are AFK: CTA broadcasts paused " ); else]] if( CTA_PollBroadcast == 3 ) then --r7 if( CTA_LFGCheckButton:GetChecked() and CTA_LGMPrefixLabel:GetText() and CTA_LFGDescriptionEditBox:GetText() ~= "" ) then local tim, minute = GetGameTime(); if( tim < 10 ) then tim = "0"..tim; end if( minute < 10 ) then tim = tim.."0"; end tim = tim..minute; local lfgT = CTA_LFGDescriptionEditBox:GetText(); -- if string.find( lfgT, ":") then lfgT = string.gsub(lfgT, ":", "."); end; CTA_SendChatMessage( "/cta B<"..tim..":"..lfgT..":"..CTA_RELEASEVERSION..">", "CHANNEL", GetChannelName( CTA_CommunicationChannel ) ); end CTA_PollBroadcast = nil; elseif( CTA_PollBroadcast == 2 ) then CTA_SendChatMessage("/cta A<>", "CHANNEL", GetChannelName( CTA_CommunicationChannel ) ); CTA_PollBroadcast = nil; elseif( CTA_MyRaidIsOnline and CTA_MyRaid ) then CTA_BroadcastRaidInfo(); end end end if( CTA_GraceTimer > 0 ) then CTA_GraceTimer = CTA_GraceTimer - CTA_UpdateTicker; CTA_IconMsg( floor(CTA_GraceTimer) ); if( CTA_GraceTimer <= 0 ) then if( CTA_MyRaid and not CTA_PlayerCanHostGroup() ) then CTA_MyRaid = nil; CTA_MyRaidIsOnline = nil; CTA_HostingRaidGroup = nil; CTA_SearchFrame:Show(); CTA_MyRaidFrame:Hide(); CTA_StartRaidFrame:Hide(); else CTA_MyRaidInstantUpdate(); end end end CTA_RequestTimer = CTA_RequestTimer + CTA_UpdateTicker; if( CTA_RequestTimer > 5 ) then if( CTA_OutstandingRequests > 0 ) then CTA_LogMsg( CTA_OutstandingRequests.." invitation request(s) outstanding" ); for name, data in CTA_InvitationRequests do if( data.status == 1 ) then SetWhoToUI(1); CTA_WhoName = name; SendWho("n-"..name); --SendWho(name); CTA_LogMsg( "Validating request from "..name ); break; end end else --r7 if( not FriendsFrame:IsVisible() ) then -- R10: This stops CTA from sending who requests while the friends frame is open for i = 1, getn( CTA_CtaMessageList ) do if( not CTA_CtaMessageList[i].who ) then --CTA_CtaMessageList[i].who = { level = 0 }; SetWhoToUI(1); local name = CTA_CtaMessageList[i].op or CTA_CtaMessageList[i].author; CTA_WhoFlag = name; SendWho("n-"..name); --SendWho(name); CTA_LogMsg( "Getting information on: "..name ); break; end end else CTA_LogMsg( "CTA /who aborted: Social window open" ); end end CTA_RequestTimer = 0; end CTA_ForwardTimer = CTA_ForwardTimer - 1; if( CTA_ForwardTimer == 0 ) then --[ [ R10: Prep to stop CTA LFX Forwarding in R11 if( lfxChatMessageList[getn(lfxChatMessageList)] ) then CTA_SendChatMessage( lfxChatMessageList[getn(lfxChatMessageList)].message, "CHANNEL", GetChannelName( CTA_CommunicationChannel ) ); local name = lfxChatMessageList[getn(lfxChatMessageList)].author; table.remove( lfxChatMessageList, getn(lfxChatMessageList) ); CTA_LogMsg( "Forwarded msg from "..name..", lfx size is: "..getn(lfxChatMessageList) ); end --]] CTA_ForwardTimer = 10; end CTA_UpdateTicker = 0; end end --[[ CTA_OnEvent() --------------------------------------------------------------- Event handler. @arg The event to be handled ]] function CTA_OnEvent( event ) if(event == "VARIABLES_LOADED") then CTA_MinimapArcSlider:SetValue( CTA_SavedVariables.MinimapArcOffset ); CTA_MinimapRadiusSlider:SetValue( CTA_SavedVariables.MinimapRadiusOffset ); CTA_MinimapMsgArcSlider:SetValue( CTA_SavedVariables.MinimapMsgArcOffset ); CTA_MinimapMsgRadiusSlider:SetValue( CTA_SavedVariables.MinimapMsgRadiusOffset ); CTA_UpdateMinimapIcon(); CTA_AddGreyToBlack(); CTA_ImportIgnoreListToGreyList(); if( not CTA_SavedVariables.runCount or CTA_SavedVariables.runCount == 0 ) then CTA_SavedVariables.runCount = 0; CTA_MainFrame:Show(); CTA_SearchFrame:Hide(); CTA_MyRaidFrame:Hide(); CTA_StartRaidFrame:Hide(); CTA_SettingsFrame:Show(); CTA_GreyListFrame:Hide(); CTA_LogFrame:Hide(); end CTA_SavedVariables.runCount = CTA_SavedVariables.runCount + 1; CTA_UpdateGreyListItems(); -- R7 B4 CTA_UpdateResults(); -- R7 B4 CTA_FrameTransparencySlider:SetValue( ( CTA_SavedVariables.MainFrameTransparency or 0.85 ) ); CTA_MainFrame:SetAlpha( CTA_FrameTransparencySlider:GetValue() ); if( not CTA_SavedVariables.lfgTrigger or strlen( CTA_SavedVariables.lfgTrigger ) < 3 ) then CTA_SavedVariables.lfgTrigger = CTA_DEFAULT_LFG_TRIGGER; CTA_SavedVariables.lfmTrigger = CTA_DEFAULT_LFM_TRIGGER; end if( not CTA_SavedVariables.version or CTA_SavedVariables.version < CTA_THIS_VERSION ) then CTA_SavedVariables.lfgTrigger = CTA_DEFAULT_LFG_TRIGGER; CTA_SavedVariables.lfmTrigger = CTA_DEFAULT_LFM_TRIGGER; CTA_SavedVariables.version = CTA_THIS_VERSION; CTA_Println( "CallToArms version updated. Resetting LFx triggers."); end CTA_SearchFrameLFGTriggerEditBox:SetText( CTA_SavedVariables.lfgTrigger or CTA_DEFAULT_LFG_TRIGGER ); CTA_SearchFrameLFMTriggerEditBox:SetText( CTA_SavedVariables.lfmTrigger or CTA_DEFAULT_LFM_TRIGGER ); end -- for R2 to see if we can tell when a player does not accept your invitation to join the group if ( event == "CHAT_MSG_SYSTEM" ) then if ( string.find( arg1, "declines your group invitation" ) or string.find( arg1, "is already in a group" ) ) then local name = string.gsub( arg1, "%s*([^%s]+).*", "%1" ); CTA_RemoveRequest( name ); CTA_LogMsg( name.." has declined the invitation - request removed" ); CTA_MyRaidInstantUpdate(); end if ( string.find( arg1, "You are now AFK" ) ) then --CTA_Println( "AFK" ); CTA_PlayerIsAFK = 1; end if ( string.find( arg1, "You are no longer AFK" ) ) then --CTA_Println( "NOT AFK" ); CTA_PlayerIsAFK = nil; end end -- Listen for Invitation requests if ( event == "CHAT_MSG_WHISPER" ) then if( CTA_MyRaidIsOnline and string.lower( strsub(arg1, 1, 8) ) == CTA_INVITE_MAGIC_WORD ) then if( not CTA_FindInList( arg2, CTA_BlackList ) ) then -- R2 if( CTA_ChannelSpam[arg2] == nil ) then CTA_ChannelSpam[arg2] = 0; end CTA_ChannelSpam[arg2] = CTA_ChannelSpam[arg2] + 1; if( CTA_ChannelSpam[arg2] > 12 ) then --r7 4 -> 12 CTA_RemoveRequest( arg2 ); CTA_SendAutoMsg(arg2.." "..CTA_WAS_BLACKLISTED, arg2); CTA_IconMsg( arg2.." "..CTA_WAS_BLACKLISTED, CTA_BLOCK ); CTA_AddPlayer( arg2, CTA_BLACKLISTED_NOTE, CTA_DEFAULT_STATUS, CTA_DEFAULT_RATING, CTA_BlackList ) else CTA_ReceiveRaidInvitationRequest( arg1, arg2 ); end end end if( CTA_MyRaidIsOnline and CTA_AcidDetails and string.lower( strsub(arg1, 1, 7) ) == "details" ) then CTA_SendAutoMsg( CTA_AcidDetails, arg2 ) end if( string.lower( strsub(arg1, 1, 4) ) == "cta?" ) then CTA_SendAutoMsg( CTA_ABOUT_CTA_MESSAGE, arg2 ) end end -- Listen for Group information --[[ --------------------------------------------------------------- a b c d e f g 1234567890123 /cta A<1200255808060:~:~> ^ ^ ^ ^ ^ ^ ^ 4 3 2 2 2 ? ? a - time of transmission (HHMM 24HR format) b - lfm classes code (0 = none, .. , 255 = any class) c - current group size and pv? type d - maximum group size and password protection e - minimum level to join group f - group description g - options (reserved for future releases) a b c 1234 /cta B<1200:~:~> ^ ^ ^ 4 ? ? a - time of transmission (HHMM 24HR format) b - message c - options (reserved for future releases) a b c d 1234 /cta C<1200:~:~:~> /cta D<1200:~:~:~> ^ ^ ^ ^ 4 ? ? ? a - time of transmission (HHMM 24HR format) b - op name c - op message d - options (reserved for future releases) --------------------------------------------------------------- ]] if ( event == "CHAT_MSG_CHANNEL" ) then -- Use channel event to delay joining of CTAChannel if( not CTA_JoinedChannel ) then CTA_Util.joinChannel( CTA_CommunicationChannel ); CTA_JoinedChannel = 1; end if( arg9 == CTA_CommunicationChannel ) then --R7 > Trusted CTA Channel Messages if( arg1 == "/cta A<>" ) then for i = 1, getn( CTA_CtaMessageList ) do local name = CTA_CtaMessageList[i].author or "?"; if( name == arg2 and not CTA_CtaMessageList[i].op ) then table.remove( CTA_CtaMessageList , i ); break; end end CTA_PollApplyFilters = 1; return; end for code, com, opt in string.gfind( arg1, "/cta A<(%d+):(.+):(.+)>" ) do local tim = string.sub( code, 1, 4 ); local cla = tonumber( string.sub( code, 5, 7 ) ); local siz = tonumber( string.sub( code, 8, 9 ) ); local max = tonumber( string.sub( code, 10, 11 ) ); local min = tonumber( string.sub( code, 12, 13 ) ); local pro = 0; local typ = CTA_RAID_TYPE_PVE; if( siz > 40 ) then typ = CTA_RAID_TYPE_PVP; siz = siz - 40; end if( max > 40 ) then pro = 1; max = max - 40; end for i = 1, getn(lfxChatMessageList) do local name = lfxChatMessageList[i].author or "?"; if( name == arg2 ) then table.remove( lfxChatMessageList, i ); break; end end local whoData = nil; for i = 1, getn( CTA_CtaMessageList ) do local name = CTA_CtaMessageList[i].author or "?"; if( name == arg2 and not CTA_CtaMessageList[i].op ) then whoData = CTA_CtaMessageList[i].who; table.remove( CTA_CtaMessageList , i ); break; end end -- R10: Show new messages in minimap icon text if( CTA_ShowOnMinimapCheckButton:GetChecked() ) then CTA_IconMsg( arg2..": "..com ); end local entry = {}; entry.ctaType = "A"; entry.author = arg2; entry.message = com; entry.time = tim; entry.options = opt; entry.who = whoData; entry.pvtype = tonumber(typ); entry.size = tonumber(siz); entry.maxSize = tonumber(max); entry.minLevel = tonumber(min); entry.classes = tonumber(cla); entry.passwordProtected = tonumber(pro); table.insert( CTA_CtaMessageList, 1, entry ); CTA_PollApplyFilters = 1; return; end for code, com, opt in string.gfind( arg1, "/cta B<(%d+):(.+):(.+)>" ) do for i = 1, getn(lfxChatMessageList) do local name = lfxChatMessageList[i].author or "?"; if( name == arg2 ) then table.remove( lfxChatMessageList, i ); break; end end local whoData = nil; for i = 1, getn( CTA_CtaMessageList ) do local name = CTA_CtaMessageList[i].author or "?"; if( name == arg2 and not CTA_CtaMessageList[i].op ) then whoData = CTA_CtaMessageList[i].who; table.remove( CTA_CtaMessageList , i ); break; end end -- R10: Show new messages in minimap icon text if( CTA_ShowOnMinimapCheckButton:GetChecked() ) then CTA_IconMsg( arg2..": "..com ); end local entry = {}; entry.ctaType = "B"; entry.author = arg2; entry.message = com; entry.time = code; entry.options = opt; entry.who = whoData; table.insert( CTA_CtaMessageList, 1, entry ); CTA_PollApplyFilters = 1; return; end for code, opname, com, opt in string.gfind( arg1, "/cta C<(%d+):(.+):(.+):(.+)>" ) do --[ [ Removed for beta 4 tests if( CTA_Util.search( com, CTA_SavedVariables.lfmTrigger ) > 0 ) then --]] for i = 1, getn(lfxChatMessageList) do local name = lfxChatMessageList[i].author or "?"; if( name == opname ) then table.remove( lfxChatMessageList, i ); CTA_LogMsg( "Rx cta forward msg re: "..opname.." from "..arg2.." - Removed monitor entry" ); break; end end local whoData = nil; for i = 1, getn( CTA_CtaMessageList ) do local name = CTA_CtaMessageList[i].op or "?"; if( name == opname ) then whoData = CTA_CtaMessageList[i].who; table.remove( CTA_CtaMessageList , i ); break; end end -- R10: Show new messages in minimap icon text if( CTA_ShowOnMinimapCheckButton:GetChecked() ) then CTA_IconMsg( opname..": "..com ); end local entry = {}; entry.ctaType = "C"; entry.author = arg2; entry.message = com; entry.time = code; entry.options = opt; entry.who = whoData; entry.op = opname; table.insert( CTA_CtaMessageList, 1, entry ); CTA_PollApplyFilters = 1; --[ [ Removed for beta 4 tests end --]] return; end for code, opname, com, opt in string.gfind( arg1, "/cta D<(%d+):(.+):(.+):(.+)>" ) do --[ [ Removed for beta 4 tests if( CTA_Util.search( com, CTA_SavedVariables.lfgTrigger ) > 0 ) then --]] for i = 1, getn(lfxChatMessageList) do local name = lfxChatMessageList[i].author or "?"; if( name == opname ) then table.remove( lfxChatMessageList, i ); CTA_LogMsg( "Rx cta forward msg re: "..opname.." from "..arg2.." - Removed monitor entry" ); break; end end local whoData = nil; for i = 1, getn( CTA_CtaMessageList ) do local name = CTA_CtaMessageList[i].op or "?"; if( name == opname ) then whoData = CTA_CtaMessageList[i].who; table.remove( CTA_CtaMessageList , i ); break; end end -- R10: Show new messages in minimap icon text if( CTA_ShowOnMinimapCheckButton:GetChecked() ) then CTA_IconMsg( opname..": "..com ); end local entry = {}; entry.ctaType = "D"; entry.author = arg2; entry.message = com; entry.time = code; entry.options = opt; entry.who = whoData; entry.op = opname; table.insert( CTA_CtaMessageList, 1, entry ); CTA_PollApplyFilters = 1; --[ [ Removed for beta 4 tests end --]] return; end --[ [ R10: Prep to remove to stop forwarding messages in R11; global LFG channel introduced by Blizzard after R9 elseif( CTA_MonitorChatCheckButton:GetChecked() ) then if( not CTA_SavedVariables.lfmTrigger or strlen( CTA_SavedVariables.lfmTrigger ) < 3 ) then return; end -- R7 local channel = arg8 or "?"; local author = arg2 or " "; local ok = 0; for word in string.gfind(author, "%w+") do ok = ok + 1; end if( ok > 1 ) then return; end local msg = arg1 or "?"; local type = "C" local score = CTA_Util.search( msg, CTA_SavedVariables.lfmTrigger ); if( score == 0 ) then score = CTA_Util.search( msg, CTA_SavedVariables.lfgTrigger ); type = "D" end if( score == 0 ) then return; end -- is a spam by another cta user for i = 1, getn( CTA_CtaMessageList ) do local name = CTA_CtaMessageList[i].author or "?"; if( name == author and not CTA_CtaMessageList[i].op ) then return; end end local tim, minute = GetGameTime(); if( tim < 10 ) then tim = "0"..tim; end if( minute < 10 ) then tim = tim.."0"; end tim = tim..minute; for i = 1, getn(lfxChatMessageList) do local name = lfxChatMessageList[i].author or "?"; if( name == author ) then table.remove( lfxChatMessageList, i ); break; end end -- if string.find( msg, ":") then msg = string.gsub(msg, ":", "."); end; local entry = {}; entry.author = author; entry.message = "/cta "..type.."<"..tim..":"..author..":"..msg..":x>"; table.insert( lfxChatMessageList, 1, entry ); CTA_Util.logPrintln( "Picked up lfx msg from "..author..", lfx size is: "..getn(lfxChatMessageList) ); -- /R7 --]] end end -- Listen for Who information if ( event == "WHO_LIST_UPDATE" ) then if( CTA_WhoName and CTA_MyRaid ) then local name, level, class, group = CTA_GetWhoInfo(); --CTA_Println( "group: "..group ); if( name ) then if( CTA_FindInList( name, CTA_BlackList ) ) then CTA_LogMsg( name.." has been blacklisted - Request denied and removed" ); CTA_RemoveRequest(name); end if( group == "yes" ) then CTA_LogMsg( name.." is already in a group - Request denied and removed" ); CTA_RemoveRequest(name); end if( CTA_InvitationRequests[name] and CTA_InvitationRequests[name].status == 1 and CTA_MyRaid ) then CTA_OutstandingRequests = CTA_OutstandingRequests - 1; if( level >= CTA_MyRaid.minLevel and string.find( CTA_GetClassString(CTA_MyRaid.classes),class) ) then InviteByName( name ); CTA_LogMsg( name.."\'s request processed: Valid player - Invitation sent" ); CTA_InvitationRequests[name].status = 2; CTA_InvitationRequests[name].class = class; CTA_InvitationRequests[name].level = level; CTA_IconMsg( CTA_INVITATION_SENT_TO.." "..name, CTA_GROUP_UPDATE ); CTA_SendAutoMsg( CTA_INVITATION_SENT_MESSAGE, name ); CTA_MyRaidInstantUpdate(); else CTA_InvitationRequests[name] = nil; CTA_LogMsg( name.."\'s request processed: Invalid player - request removed" ); CTA_SendAutoMsg( CTA_WRONG_LEVEL_OR_CLASS, name ); end end else CTA_LogMsg( "Player "..CTA_WhoName.." could not be found. Removing from requests list." ); CTA_RemoveRequest(CTA_WhoName); end CTA_WhoName = nil; elseif( CTA_WhoFlag ) then 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( not name or name == CTA_WhoFlag ) then --CTA_Println( "Name: "..name..", Group: "..( group or "Null" ) ); break; end end if( name ) then for i = 1, getn( CTA_CtaMessageList ) do local cname = CTA_CtaMessageList[i].op or CTA_CtaMessageList[i].author or "?"; if( name == cname ) then if( strlen( guild ) > 0 ) then guild = "<"..guild..">"; end local entry = { level = level; class = class; zone = zone; guild = guild; grouped = group; }; CTA_CtaMessageList[i].who = entry; break; end end else for i = 1, getn( CTA_CtaMessageList ) do local cname = CTA_CtaMessageList[i].op or CTA_CtaMessageList[i].author or "?"; if( CTA_WhoFlag == cname ) then local entry = {}; entry.level = 0; --[[ entry.class = ; entry.zone = ; entry.guild = ; ]] CTA_CtaMessageList[i].who = entry; break; end end end CTA_WhoFlag = nil; end SetWhoToUI(0); end -- Group update if ( event == "RAID_ROSTER_UPDATE" or event == "PARTY_LEADER_CHANGED" or event == "PARTY_MEMBERS_CHANGED" ) then CTA_GraceTimer = 2; end end function CTA_GetWhoInfo() 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( not name or name == CTA_WhoName ) then break; end end return name, level, class, group; end --[[ --------------------------------------------------------------- Communication - System --------------------------------------------------------------- ]] --[[ CTA_JoinChannel() --------------------------------------------------------------- Attempts to join the CTA_CommunicationChannel channel. ]] function CTA_JoinChannel() CTA_Util.joinChannel( CTA_CommunicationChannel ); end --[[ CTA_ConnectedToChannel() --------------------------------------------------------------- Determines whether the client has joined the specified channel. @arg The name of the channel @return nil, 1 if already connected to the channel ]] function CTA_ConnectedToChannel( channel ) local DefaultChannels = { GetChatWindowChannels(DEFAULT_CHAT_FRAME:GetID()) }; local connected = nil; if( DefaultChannels ) then for item = 1, getn(DefaultChannels) do CTA_LogMsg( DefaultChannels[item] ); if( DefaultChannels[item] == channel ) then connected = 1; break; end end end return connected; end --[[ CTA_SendAutoMsg() --------------------------------------------------------------- Sends a chat message, by whisper, to the specified player. @arg The message to be sent @arg The recipient of the message ]] function CTA_SendAutoMsg( message, player ) CTA_SendChatMessage( "[CTA] "..message, "WHISPER", player ); end --[[ CTA_SendChatMessage() --------------------------------------------------------------- Sends a chat message to the specified player or channel. @arg The message to be sent @arg The type of transmission eg. whisper, channel etc @arg The recipient player/channel of the message ]] function CTA_SendChatMessage( message, messageType, channel ) local language = CTA_COMMON; if( UnitFactionGroup(CTA_PLAYER) ~= CTA_ALLIANCE ) then language = CTA_ORCISH; end SendChatMessage( string.gsub( message, "|c(%w+)|H(%w+):(.+)|h(.+)|h|r", "%4" ), messageType, language, channel ); end --[[ --------------------------------------------------------------- Invitations --------------------------------------------------------------- ]] --[[ CTA_SendPasswordRaidInvitationRequest() --------------------------------------------------------------- Sends a request with a pasword for an invitation ]] function CTA_SendPasswordRaidInvitationRequest() local raid = CTA_RaidList[ CTA_SelectedResultListItem ]; local password = CTA_SafeSet( CTA_JoinRaidWindowEditBox:GetText(), "" ); if( password ~= "" ) then CTA_SendChatMessage( CTA_INVITE_MAGIC_WORD.." "..password, "WHISPER", raid.leader ); CTA_JoinRaidWindow:Hide(); end end --[[ CTA_SendRaidInvitationRequest() --------------------------------------------------------------- Sends a request for an invitation ]] function CTA_SendRaidInvitationRequest() local raid = CTA_RaidList[ CTA_SelectedResultListItem ]; CTA_JoinRaidWindow:Hide(); CTA_RequestInviteButton:Disable(); if( raid.passwordProtected == 1 ) then CTA_JoinRaidWindow:Show(); else CTA_SendChatMessage( CTA_INVITE_MAGIC_WORD, "WHISPER", raid.author ); end end --[[ CTA_ReceiveRaidInvitationRequest() --------------------------------------------------------------- Handles incoming invitation requests. @arg The invitation request with optional password @arg The name pf the player requesting the invitation ]] function CTA_ReceiveRaidInvitationRequest( msg, author ) if( CTA_InvitationRequests[author] ) then return; end -- cheap short-circuit hack CTA_LogMsg( "Received invitation request from "..author ); if( CTA_MyRaid.size + getn(CTA_InvitationRequests) < CTA_MyRaid.maxSize ) then if( CTA_MyRaid.passwordProtected==1 ) then local password = string.gsub( string.sub( msg, 9 ), "%s*([^%s]+).*", "%1" ); if( password and password==CTA_MyRaidPassword ) then CTA_AddRequest( author ); else CTA_SendAutoMsg( CTA_INCORRECT_PASSWORD_MESSAGE, author); end else CTA_AddRequest( author ); end else CTA_SendAutoMsg( CTA_NO_SPACE_MESSAGE, author); end end --[[ CTA_AddRequest() --------------------------------------------------------------- Adds a player's request for an invitation to join the group. @arg The name of the player requesting an invitaion ]] function CTA_AddRequest( name ) CTA_InvitationRequests[name] = {}; CTA_InvitationRequests[name].status = 1; CTA_OutstandingRequests = CTA_OutstandingRequests + 1; end --[[ CTA_RemoveRequest() --------------------------------------------------------------- Removes a player's request for an invitation to join the group. @arg The name of the player requesting an invitaion ]] function CTA_RemoveRequest( name ) if( CTA_InvitationRequests[name] ) then if( CTA_InvitationRequests[name].status == 1 ) then CTA_OutstandingRequests = CTA_OutstandingRequests - 1; end CTA_InvitationRequests[name] = nil; end end --[[ --------------------------------------------------------------- Inter-AddOn Group Information Communication --------------------------------------------------------------- ]] --[[ CTA_BroadcastRaidInfo() --------------------------------------------------------------- Sends this group info to the CTA Channel. ]] function CTA_BroadcastRaidInfo() CTA_PollBroadcast = nil; if( CTA_MyRaidIsOnline == nil ) then return; end -- short circuit hack for push changeover in R5 local myName = UnitName( CTA_PLAYER ); local myRaid = CTA_MyRaid; --local com = CTA_GetGroupType()..": [CTA R3 Pre-release Test Group] "..myRaid.comment; local com = myRaid.comment.." ("..CTA_GetGroupType()..")"; local typ = myRaid.pvtype; local siz = myRaid.size; local max = myRaid.maxSize; local min = myRaid.minLevel; local cla = myRaid.classes; local pro = myRaid.passwordProtected; local opt = myRaid.options; --local tim = myRaid.creationTime; ListChannelByName local hour, minute = GetGameTime(); local tim = hour; if( hour < 10 ) then tim = "0"..tim; end if( minute < 10 ) then tim = tim.."0"; end tim = tim..minute; if( typ == CTA_RAID_TYPE_PVP ) then siz = siz + 40; end if( pro == 1 ) then max = max + 40; end while( string.len( cla ) < 3 ) do cla = "0"..cla; end while( string.len( siz ) < 2 ) do siz = "0"..siz; end while( string.len( max ) < 2 ) do max = "0"..max; end while( string.len( min ) < 2 ) do min = "0"..min; end local code = ""..tim..cla..siz..max..min; -- if string.find( com, ":") then com = string.gsub(com, ":", "."); end; CTA_SendChatMessage("/cta A<"..code..":"..com..":"..opt..">", "CHANNEL", GetChannelName( CTA_CommunicationChannel ) ); --CTA_IconMsg( "Broadcast Sent" ); end --[[ --------------------------------------------------------------- Functions Related To The Search Frame And The Group List --------------------------------------------------------------- ]] --[[ CTA_ApplyFiltersToGroupList() --------------------------------------------------------------- Applies filter settings to the group list and updates the score for each one. This score will be used by the CTA_UpdateList() function to refresh the results list with those groups with a score of at least 1. Called by CTA_SearchButton, will be renamed to ApplyFilters() or something to that effect. ]] function CTA_ApplyFiltersToGroupList() local showClasses = CTA_SafeSet( CTA_SearchFrameShowClassCheckButton:GetChecked(), 0 ); if( showClasses == 0 ) then showClasses = CTA_MyClassCode(); else showClasses = 0; end local showPVP = CTA_SafeSet( CTA_SearchFrameShowPVPCheckButton:GetChecked(), 0 ); local showPVE = CTA_SafeSet( CTA_SearchFrameShowPVECheckButton:GetChecked(), 0 ); local keywords = CTA_SafeSet( CTA_SearchFrameDescriptionEditBox:GetText(), "*" ); local showEmpty = CTA_SafeSet( CTA_SearchFrameShowEmptyCheckButton:GetChecked(), 0 ); local showFull = CTA_SafeSet( CTA_SearchFrameShowFullCheckButton:GetChecked(), 0 ); local showProtected = CTA_SafeSet( CTA_SearchFrameShowPasswordCheckButton:GetChecked(), 0 ); local showMinLevel = CTA_SafeSet( CTA_SearchFrameShowLevelCheckButton:GetChecked(), 0 ); if( showMinLevel == 0 ) then showMinLevel = UnitLevel(CTA_PLAYER); else showMinLevel = 60; end CTA_RequestInviteButton:Disable(); CTA_ResultsListOffset = 0; CTA_SelectedResultListItem = 0; local oldListSize = 0; if( CTA_RaidList ) then oldListSize = getn( CTA_RaidList ); end CTA_RaidList = nil; CTA_RaidList = {}; local chr, cmn = GetGameTime(); cmn = cmn + 1; local pruneCount = 0; local playerClass, playerMinLevel, playerMaxLevel; for i=1, getn( CTA_CtaMessageList ) do local data = CTA_CtaMessageList[i]; if( data ) then local ok = 1; local rhr = tonumber( string.sub( data.time, 1, 2 ) ) or 0; -- added: beta 4 hack re: beta 3 reported error local rmn = tonumber( string.sub( data.time, 3, 4 ) ) or 0; -- added: beta 4 hack re: beta 3 reported error local dmn = cmn - rmn; if( dmn < 0 ) then dmn = dmn + 60; end playerClass = CTA_PlayerClassDropDownText:GetText() or CTA_ANY_CLASS; if( strlen(CTA_PlayerMinLevelEditBox:GetText()) == 0 ) then playerMinLevel = 1; else playerMinLevel = tonumber( CTA_PlayerMinLevelEditBox:GetText() ); end if( strlen(CTA_PlayerMaxLevelEditBox:GetText()) == 0 ) then playerMaxLevel = 60; else playerMaxLevel = tonumber( CTA_PlayerMaxLevelEditBox:GetText() ); end if( data.ctaType == "A" ) then if( dmn > 2 ) then table.remove( CTA_CtaMessageList , i ); pruneCount = pruneCount + 1; ok = nil; i = i - 1; end if( ok and showClasses > 0 and CTA_CheckClasses( data.classes, showClasses ) == 0 ) then ok = nil; end if( ok and showEmpty == 0 and data.size <= 1 ) then ok = nil; end if( ok and showFull == 0 and data.size == data.maxSize ) then ok = nil; end if( ok and showPVP == 0 and data.pvtype == CTA_RAID_TYPE_PVP ) then ok = nil; end if( ok and showPVE == 0 and data.pvtype == CTA_RAID_TYPE_PVE ) then ok = nil; end if( ok and showProtected == 0 and CTA_MyRaidPassword ) then ok = nil; end if( ok and showMinLevel < data.minLevel ) then ok = nil; end if ( CTA_SearchDropDownText:GetText() == CTA_SHOW_PLAYERS_ONLY ) then ok = nil; end elseif( data.ctaType == "B" ) then if( dmn > 2 ) then table.remove( CTA_CtaMessageList , i ); pruneCount = pruneCount + 1; ok = nil; i = i - 1; end if ( CTA_SearchDropDownText:GetText() == CTA_SHOW_GROUPS_ONLY ) then ok = nil; end if ( data.who and data.who.level ~= 0 ) then if( playerClass ~= CTA_ANY_CLASS and data.who.class ~= playerClass ) then ok = nil; end if( data.who.level < playerMinLevel or data.who.level > playerMaxLevel ) then ok = nil; end end elseif( data.ctaType == "C" ) then if( not CTA_ShowLocalLFXMessagesCheckButton:GetChecked() ) then ok = nil; end if( dmn > 15 ) then table.remove( CTA_CtaMessageList , i ); pruneCount = pruneCount + 1; ok = nil; i = i - 1; end if ( CTA_SearchDropDownText:GetText() == CTA_SHOW_PLAYERS_ONLY ) then ok = nil; end elseif( data.ctaType == "D" ) then if( not CTA_ShowLocalLFXMessagesCheckButton:GetChecked() ) then ok = nil; end if( dmn > 15 ) then table.remove( CTA_CtaMessageList , i ); pruneCount = pruneCount + 1; ok = nil; i = i - 1; end if ( CTA_SearchDropDownText:GetText() == CTA_SHOW_GROUPS_ONLY ) then ok = nil; end if ( data.who and data.who.level ~= 0 ) then if( playerClass ~= CTA_ANY_CLASS and data.who.class ~= playerClass ) then ok = nil; end if( data.who.level < playerMinLevel or data.who.level > playerMaxLevel ) then ok = nil; end end end if( ok ) then local score = 1; if( keywords and keywords~="*" ) then score = SachaSearch( data.author.." "..data.message, keywords ); end if( score > 0 ) then data.elapsed = dmn; table.insert( CTA_RaidList, data ); end end end end if( pruneCount > 0 ) then CTA_LogMsg( "Removed "..pruneCount.." old result items." ); end if ( oldListSize < getn( CTA_RaidList ) ) then --CTA_IconMsg( CTA_NEW_LFX ); --PlaySound("TellMessage"); end CTA_PollApplyFilters = nil; CTA_UpdateResults(); end --[[ CTA_UpdateResults() UPDATE FUNCTION --------------------------------------------------------------- Updates the groups results list to show only those groups with a score of at least 1. Also updates the selected group as necessary. ]] --[[ local entry = {}; entry.ctaType = "A"; entry.author = arg2; entry.message = com; entry.time = tonumber(tim); entry.options = opt; entry.pvtype = tonumber(typ); entry.size = tonumber(siz); entry.maxSize = tonumber(max); entry.minLevel = tonumber(min); entry.classes = tonumber(cla); entry.passwordProtected = tonumber(pro); - local entry = {}; entry.ctaType = "B"; entry.author = arg2; entry.message = com; entry.time = tonumber(code); entry.options = opt; - local entry = {}; entry.ctaType = "C"; entry.author = arg2; entry.message = com; entry.time = tonumber(code); entry.options = opt; entry.op = opname; - local entry = {}; entry.ctaType = "D"; entry.author = arg2; entry.message = com; entry.time = tonumber(code); entry.options = opt; entry.op = opname; ]] function CTA_UpdateResults() local index = 1; local groupListLength = getn( CTA_RaidList ); if( groupListLength ~= 0 ) then CTA_MinimapIconTextLabel:SetText( groupListLength ); CTA_MinimapIconTextLabel:Show(); else CTA_MinimapIconTextLabel:Hide(); end if( groupListLength ~= 1 ) then CTA_ResultsLabel:SetText( CTA_RESULTS_FOUND.." "..groupListLength.." / "..CTA_getn( CTA_CtaMessageList ) ); else CTA_ResultsLabel:SetText( CTA_RESULTS_FOUND.." "..groupListLength ); end CTA_PageLabel:Show(); local cpage = floor( CTA_ResultsListOffset / CTA_MAX_RESULTS_ITEMS ); local tpage = floor( groupListLength / CTA_MAX_RESULTS_ITEMS ); if( cpage == 0 or cpage <= CTA_ResultsListOffset / CTA_MAX_RESULTS_ITEMS ) then cpage = cpage + 1; end if( tpage == 0 or tpage < groupListLength / CTA_MAX_RESULTS_ITEMS ) then tpage = tpage + 1; end CTA_PageLabel:SetText( CTA_PAGE.." "..cpage.." / "..tpage ); while( index < CTA_MAX_RESULTS_ITEMS + 1 ) do local c = "CTA_NewItem"..index; if( getglobal( c ) ) then if( index+CTA_ResultsListOffset <= groupListLength ) then local entry = CTA_RaidList[index+CTA_ResultsListOffset]; --[[ The background colour if( entry.ctaType== "A" or entry.ctaType== "B" ) then getglobal( c.."TexturePurple"):Show(); getglobal( c.."TextureBlue"):Hide(); else getglobal( c.."TexturePurple"):Hide(); getglobal( c.."TextureBlue"):Show(); end --]] -- The text colour if( entry.ctaType== "A" or entry.ctaType== "C" ) then getglobal( c.."NameLabel"):SetTextColor( 1, 0.85, 0, 1 ); getglobal( c.."TextureGold"):Show(); getglobal( c.."TextureSilver"):Hide(); else getglobal( c.."NameLabel"):SetTextColor( 0.95, 0.95, 1, 1 ); getglobal( c.."TextureGold"):Hide(); getglobal( c.."TextureSilver"):Show(); end -- get elapsed time local timeText = ""; if( entry.elapsed ) then timeText = entry.elapsed.." min"; if( entry.elapsed > 1 ) then timeText = timeText.."s"; end else timeText = entry.time; end local mainText = ""; local moreText = ""; local rightText = timeText.." ago"; if( entry.ctaType== "A" ) then local typeText = CTA_PVP; local passwordText = CTA_NO; if( entry.pvtype == CTA_RAID_TYPE_PVE ) then typeText = CTA_PVE; end if( entry.passwordProtected == 1 ) then passwordText = CTA_YES; end local myClass = UnitClass( CTA_PLAYER ); local comment = entry.message; if( entry.minLevel > UnitLevel(CTA_PLAYER) or not string.find(CTA_GetClassString(entry.classes),myClass) ) then comment = "|cffff0000"..comment.."|r"; elseif( entry.passwordProtected == 1 ) then comment = "|cffffff00"..comment.."|r"; else comment = "|cff00ff00"..comment.."|r"; end mainText = entry.author..": "..comment; moreText = "Type: "..typeText..", Size: "..entry.size.."/"..entry.maxSize..", Minimum level: "..entry.minLevel..", Password: "..passwordText; rightText = "CTA Group. Last updated ".. rightText; elseif( entry.ctaType== "B" ) then mainText = entry.author..": "..entry.message; if( entry.who and entry.who.level ~= 0 ) then moreText = "Level "..entry.who.level.." "..entry.who.class..", "..entry.who.guild.." "..entry.who.zone; --[[ if( entry.grouped == "yes" ) then moreText = moreText.." - In a group at tiem of message "; else moreText = moreText.." (not in a group)"; end ]] end rightText = "CTA Player. Last updated ".. rightText; elseif( entry.ctaType== "C" ) then mainText = entry.op..": "..entry.message; if( entry.who and entry.who.level ~= 0 ) then moreText = "Level "..entry.who.level.." "..entry.who.class..", "..entry.who.guild.." "..entry.who.zone; end rightText = "forwarded by "..entry.author.." "..rightText; elseif( entry.ctaType== "D" ) then mainText = entry.op..": "..entry.message; if( entry.who and entry.who.level ~= 0 ) then moreText = "Level "..entry.who.level.." "..entry.who.class..", "..entry.who.guild.." "..entry.who.zone; end rightText = "forwarded by "..entry.author.." "..rightText; end -- Set the texts getglobal( c.."NameLabel"):SetText( mainText ); getglobal( c.."MoreLabel"):SetText( moreText ); getglobal( c.."MoreRightLabel"):SetText( rightText ); if( CTA_SelectedResultListItem == index + CTA_ResultsListOffset ) then getglobal( c.."TextureSelected"):Show(); else getglobal( c.."TextureSelected"):Hide(); end getglobal( c ):Show(); else getglobal( c ):Hide(); end end index = index + 1; end end --[[ CTA_ListItem_OnMouseUp() --------------------------------------------------------------- Sets the caller item as the selected group and updates the CTA_RequestInviteButton button as necessary, then calls the CTA_UpdateResults() afterwards. ]] function CTA_ListItem_OnMouseUp() local value = string.gsub( this:GetName(), "CTA_NewItem(%d+)", "%1" ); if( CTA_SelectedResultListItem == CTA_ResultsListOffset + value ) then CTA_SelectedResultListItem = 0; CTA_RequestInviteButton:Disable(); else CTA_SelectedResultListItem = CTA_ResultsListOffset + value; local raid = CTA_RaidList[ CTA_ResultsListOffset + value ]; -- R7 if (arg1 == "RightButton") then local name = raid.op or raid.author; --FriendsFrame_ShowDropdown(name, 1); HideDropDownMenu(1); if ( name ~= UnitName("player") ) then FriendsDropDown.initialize = FriendsFrameDropDown_Initialize; FriendsDropDown.displayMode = "MENU"; FriendsDropDown.name = name; ToggleDropDownMenu(1, nil, FriendsDropDown, this:GetName()); end return; end -- /R7 if( raid.ctaType == "A" ) then -- for R7 goodness local myClass = UnitClass( CTA_PLAYER ); if( raid.minLevel > UnitLevel (CTA_PLAYER ) or not string.find( CTA_GetClassString( raid.classes ),myClass ) ) then CTA_RequestInviteButton:Disable(); else CTA_RequestInviteButton:Enable(); end end end CTA_UpdateResults(); end --[[ CTA_ListItem_ShowTooltip() --------------------------------------------------------------- Set up and show the tooltip for the calling group list item. ]] function CTA_ListItemAuxLeft_ShowTooltip() GameTooltip:ClearLines(); local parent = this:GetParent(); local value = CTA_ResultsListOffset + string.gsub( parent:GetName(), "CTA_NewItem(%d+)", "%1" ); local entry = CTA_RaidList[value]; GameTooltip:SetOwner( this, "ANCHOR_BOTTOMLEFT" ); GameTooltip:ClearAllPoints(); GameTooltip:SetPoint("BOTTOMLEFT", parent:GetName(), "TOPLEFT", 0, 8); if( entry == nil ) then return; end GameTooltip:AddLine( ( entry.op or entry.author ) ); GameTooltip:AddLine( entry.message, 0.9, 0.9, 1.0, 1, 1 ); GameTooltip:Show(); end function CTA_ListItemAuxRight_ShowTooltip() local parent = this:GetParent(); GameTooltip:ClearLines(); local value = CTA_ResultsListOffset + string.gsub( parent:GetName(), "CTA_NewItem(%d+)", "%1" ); local raid = CTA_RaidList[value]; GameTooltip:SetOwner( this, "ANCHOR_BOTTOMRIGHT" ); GameTooltip:ClearAllPoints(); GameTooltip:SetPoint("BOTTOMRIGHT", parent:GetName(), "TOPRIGHT", 0, 8); if( raid == nil ) then return; end if( raid.ctaType == "A" ) then -- R7 condition local classes = { }; classes[1] = CTA_PRIEST; classes[2] = CTA_MAGE; classes[3] = CTA_WARLOCK; classes[4] = CTA_DRUID; classes[5] = CTA_HUNTER; classes[6] = CTA_ROGUE; classes[7] = CTA_WARRIOR; if( UnitFactionGroup(CTA_PLAYER) == CTA_ALLIANCE ) then classes[8] = CTA_PALADIN; else classes[8] = CTA_SHAMAN; end local groupClasses, ctaVersion = CTA_DecodeGroupClasses( raid.options ); if( groupClasses and ctaVersion ) then GameTooltip:AddLine( CTA_CTA_GROUP, 0.1, 0.9, 0.1, 1, 1 ); GameTooltip:AddLine( CTA_CURRENT_GROUP_CLASSES..":", 0.1, 0.9, 0.1, 1, 1 ); local classList = CTA_GetClassString(raid.classes); for i = 1, 8 do if( string.find(classList, classes[i]) ) then GameTooltip:AddDoubleLine( classes[i], groupClasses[i], 0.9, 0.9, 0.1, 0.1, 0.9, 0.1 ); else GameTooltip:AddDoubleLine( classes[i], groupClasses[i], 0.9, 0.9, 0.1, 0.9, 0.1, 0.1 ); end end GameTooltip:AddDoubleLine( CTA_VERSION, ctaVersion, 0.9, 0.9, 0.9, 0.1, 0.9, 0.1 ); else if( raid.classes == 255 ) then GameTooltip:AddLine( CTA_LFM_ANY_CLASS, 0.1, 0.9, 0.1 ); else local myClass = UnitClass( CTA_PLAYER ); local classList = CTA_GetClassString(raid.classes); if( string.find(classList, myClass) ) then GameTooltip:AddLine( CTA_LFM_CLASSLIST..classList, 0.1, 0.9, 0.1 ); else if( not classList or classList == "" ) then GameTooltip:AddLine( CTA_NO_MORE_PLAYERS_NEEDED, 0.9, 0.1, 0.1 ); else GameTooltip:AddLine( CTA_LFM_CLASSLIST..classList, 0.9, 0.1, 0.1 ); end end end GameTooltip:AddLine( CTA_PRE_R7_USER, 0.3, 0.3, 0.3, 1, 1 ); end elseif( raid.ctaType == "B" ) then -- R7 condition GameTooltip:AddLine( CTA_CTA_PLAYER, 0.1, 0.9, 0.1, 1, 1 ); GameTooltip:AddDoubleLine( CTA_VERSION, raid.options, 0.9, 0.9, 0.9, 0.1, 0.9, 0.1 ); elseif( raid.ctaType == "C" ) then -- R7 condition GameTooltip:AddLine( CTA_NON_CTA_GROUP_MESSAGE, 0.3, 0.3, 0.3, 1, 1 ); elseif( raid.ctaType == "D" ) then -- R7 condition GameTooltip:AddLine( CTA_NON_CTA_PLAYER_MESSAGE, 0.3, 0.3, 0.3, 1, 1 ); end GameTooltip:Show(); end function CTA_ResultItem_Hover_On(parent) local value = CTA_ResultsListOffset + string.gsub( parent:GetName(), "CTA_NewItem(%d+)", "%1" ); local entry = CTA_RaidList[value]; if( entry == nil ) then return; end parent:SetHeight( 32 ); getglobal( parent:GetName().."MoreLabel" ):Show(); getglobal( parent:GetName().."MoreRightLabel" ):Show(); if( entry.ctaType== "A" or entry.ctaType== "B" ) then getglobal( parent:GetName().."TexturePurple"):Show(); getglobal( parent:GetName().."TextureBlue"):Hide(); else getglobal( parent:GetName().."TexturePurple"):Hide(); getglobal( parent:GetName().."TextureBlue"):Show(); end if( entry.ctaType== "A" ) then getglobal( parent:GetName().."TextureSelectedIcon"):SetTexture( "Interface\\Icons\\Spell_Holy_SealOfFury" ); elseif( entry.ctaType== "B" ) then getglobal( parent:GetName().."TextureSelectedIcon"):SetTexture( "Interface\\Icons\\Spell_Holy_RetributionAura" ); elseif( entry.ctaType== "C" ) then getglobal( parent:GetName().."TextureSelectedIcon"):SetTexture( "Interface\\Icons\\Spell_Holy_SealOfProtection" ); elseif( entry.ctaType== "D" ) then getglobal( parent:GetName().."TextureSelectedIcon"):SetTexture( "Interface\\Icons\\Spell_Holy_RighteousnessAura" ); end getglobal( parent:GetName().."NameLabel"):SetPoint( "TOPLEFT", parent:GetName(), "TOPLEFT", 37, 0 ); getglobal( parent:GetName().."MoreLabel"):SetPoint( "LEFT", parent:GetName(), "LEFT", 37, -6 ); getglobal( parent:GetName().."TextureSelectedBg"):Show(); getglobal( parent:GetName().."TextureSelectedIcon"):Show(); end function CTA_ResultItem_Hover_Off(parent) parent:SetHeight( 18 ); getglobal( parent:GetName().."MoreLabel" ):Hide(); getglobal( parent:GetName().."MoreRightLabel" ):Hide(); getglobal( parent:GetName().."TexturePurple"):Hide(); getglobal( parent:GetName().."TextureBlue"):Hide(); getglobal( parent:GetName().."NameLabel"):SetPoint( "TOPLEFT", parent:GetName(), "TOPLEFT", 5, 0 ); getglobal( parent:GetName().."MoreLabel"):SetPoint( "LEFT", parent:GetName(), "LEFT", 5, -6 ); getglobal( parent:GetName().."TextureSelectedBg"):Hide(); getglobal( parent:GetName().."TextureSelectedIcon"):Hide(); end --[[ --------------------------------------------------------------- Functions Related To Hosting A Group And The Acid Items --------------------------------------------------------------- ]] --[[ CTA_MyRaidInstantUpdate() UPDATE FUNCTION --------------------------------------------------------------- Called by CTA_MyRaidFrame Components. This is the longest, most elaborate and buggy function and has been hacked and updated far too many times. Todo: A complete rewrite of the function. ]] function CTA_MyRaidInstantUpdate() if( CTA_MyRaid == nil ) then return; end local myName = UnitName( CTA_PLAYER ); local myComment = CTA_SafeSet( CTA_MyRaidFrameDescriptionEditBox:GetText(), CTA_NO_DESCRIPTION ); local myRaidType = CTA_RAID_TYPE_PVE; if( CTA_MyRaidFramePVPCheckButton:GetChecked() ) then myRaidType = CTA_RAID_TYPE_PVP; end -- Advanced Class Integration and Distribution -- ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID -- ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID --[[ ------------------------------------ [Setup Acid Items] If the acid item has no class list then it is hidden. ------------------------------------ ]] if( not CTA_Acid0.val ) then local classes = { }; classes[1] = CTA_PRIEST; classes[2] = CTA_MAGE; classes[3] = CTA_WARLOCK; classes[4] = CTA_DRUID; classes[5] = CTA_HUNTER; classes[6] = CTA_ROGUE; classes[7] = CTA_WARRIOR; if( UnitFactionGroup(CTA_PLAYER) == CTA_ALLIANCE ) then classes[8] = CTA_PALADIN; else classes[8] = CTA_SHAMAN; end local num = 0; while( num < 9 ) do local item = getglobal( "CTA_Acid"..num ); local class = getglobal( "CTA_Acid"..num.."ClassNameLabel" ); if( num > 0 ) then item.val = 0; item.cur = 0; else class:SetText( CTA_ANY_CLASS ); item.val = CTA_MyRaid.maxSize; getglobal( "CTA_Acid"..num.."LessButton"):Hide(); getglobal( "CTA_Acid"..num.."MoreButton"):Hide(); --getglobal( "CTA_Acid"..num.."EditButton"):Hide(); getglobal( "CTA_Acid"..num.."DeleteButton"):Hide(); end num = num + 1; end end --[[ ------------------------------------ [Update the Max Size] If the and sets up certain features for raid / party ------------------------------------ ]] local myOldMax = CTA_MyRaid.maxSize; if( not myOldMax ) then myOldMax = 40; end if ( IsRaidLeader() and GetNumRaidMembers() > 0 ) then CTA_HostingRaidGroup = 1; end local maxSizeLimit = 5; -- R2 CTA_ConvertToRaidButton:Hide(); CTA_MaxSizeHelpLabel:SetText( CTA_MAXIMUM_PLAYERS_HELP2 ); if( IsPartyLeader() and GetNumRaidMembers() == 0 ) then CTA_ConvertToRaidButton:Show(); else CTA_ConvertToRaidButton:Hide(); end if( CTA_HostingRaidGroup ) then maxSizeLimit = 40; CTA_MaxSizeHelpLabel:SetText( CTA_MAXIMUM_PLAYERS_HELP ); end if( IsRaidLeader() and GetNumRaidMembers() > 0 and GetNumRaidMembers() < 6 ) then CTA_ConvertToPartyButton:Show(); else CTA_ConvertToPartyButton:Hide(); end if( CTA_MyRaid.maxSize > maxSizeLimit ) then CTA_MyRaid.maxSize = maxSizeLimit; end local myMaxSize = CTA_SafeSetNumber( CTA_MyRaidFrameMaxSizeEditBox:GetText(), 5, maxSizeLimit ); if( not myMaxSize ) then myMaxSize = CTA_MyRaid.maxSize; else CTA_MyRaid.maxSize = tonumber(myMaxSize); end CTA_MyRaidFrameMaxSizeEditBox:SetText(""..myMaxSize); --[[ ------------------------------------ [Update ACID Scale] According to the max size ------------------------------------ ]] --if( myMaxSize ~= myOldMax ) then local num = 0; local cval = 0; while( num < 9 ) do local item = getglobal( "CTA_Acid"..num ); local ratio = item.val/myOldMax; item.val = floor(myMaxSize*ratio); cval = cval+item.val; num = num + 1; end if( cval < myMaxSize ) then CTA_Acid0.val = CTA_Acid0.val + (myMaxSize-cval); end num = 0; while( num < 9 and cval > myMaxSize ) do local item = getglobal( "CTA_Acid"..num ); if( item.val > 0 ) then item.val = item.val - 1; cval = cval - 1; else num = num + 1; end end --end --CTA_LogMsg( "Adjusted ACID Size ("..cval..")", CTA_GENERAL ); --[[ ------------------------------------ [Reset Acid item current size] Set the current players in each rule to 0 ------------------------------------ ]] local num = 0; while( num < 9 ) do local item = getglobal( "CTA_Acid"..num ); item.cur = 0; num = num + 1; end --[[ ------------------------------------ [Update ACID items current size] Big change here now ------------------------------------ ]] local name, level, class; local over = 0; num = 1; while ( num <= 40 ) do name, level, class = CTA_GetGroupMemberInfo( num ); if( name == nil ) then break; end local index = CTA_GetClassCode(class); local bestItem = nil; for i = 1, 8 do local item = getglobal( "CTA_Acid"..i ); if( item.classes and item.classes[class] ) then if( not bestItem or CTA_getn(bestItem.classes) > CTA_getn(item.classes) ) then if( item.cur < item.val ) then bestItem = item; end end end end if( not bestItem ) then over = over + 1; else bestItem.cur = bestItem.cur + 1; end --if( item.cur > item.val ) then over = over + 1; end if( CTA_InvitationRequests[name] ) then CTA_RemoveRequest( name ); -- R2: Remove pending member if in raid CTA_LogMsg( name.." has joined the group - request removed" ); CTA_SendAutoMsg( CTA_PROMO..CTA_ANNOUNCE_JOIN_PROMPT, name ); end num = num+1; end --[[ ------------------------------------ [Update the Group Size] Take pendings into account etc ------------------------------------ ]] local pendingSize = 0; for name, data in CTA_InvitationRequests do if( name and data.status == 2 ) then -- R2: pending members --CTA_Println( name..": "..class ); local index = CTA_GetClassCode( data.class); local item = getglobal( "CTA_Acid"..index ); item.cur = item.cur + 1; pendingSize = pendingSize + 1; if( item.cur > item.val ) then over = over + 1; end end end CTA_Acid0.cur = over; --[[ local oldSize = CTA_MyRaid.size; CTA_MyRaid.size = CTA_GetNumGroupMembers() + pendingSize; local mySize = CTA_MyRaid.size; if ( ( IsRaidLeader() and GetNumRaidMembers() > 0 ) ) then CTA_RaidSizeLabel:SetText( CTA_SIZE..": "..CTA_MyRaid.size.." ("..CTA_RAID..") ("..CTA_CURRENT..": "..CTA_GetNumGroupMembers().." "..CTA_PENDING..": "..pendingSize..")" ); elseif( IsPartyLeader() and GetNumRaidMembers() == 0 ) then CTA_RaidSizeLabel:SetText( CTA_SIZE..": "..CTA_MyRaid.size.." ("..CTA_PARTY..") ("..CTA_CURRENT..": "..CTA_GetNumGroupMembers().." "..CTA_PENDING..": "..pendingSize..")" ); end]] local oldSize = CTA_MyRaid.size; CTA_MyRaid.size = CTA_GetNumGroupMembers(); local mySize = CTA_MyRaid.size; --CTA_Println( "Size = "..mySize ); CTA_RaidSizeLabel:SetText( CTA_SIZE..": "..CTA_MyRaid.size.." ("..CTA_CURRENT..": "..CTA_GetNumGroupMembers().." "..CTA_PENDING..": "..CTA_getn(CTA_InvitationRequests)..")" ); if( CTA_MyRaid.size > oldSize ) then PlaySound("TellMessage"); end CTA_IconMsg( CTA_GROUP_MEMBERS..CTA_MyRaid.size, CTA_GROUP_UPDATE); -- R7 announce auto off if( autoannounce and CTA_GetNumGroupMembers() >= CTA_MyRaid.maxSize ) then autoannouce = nil; CTA_AnnounceTimer = 0; CTA_Println( "Your group has the desired number of players. LFM Auto announce OFF" ); end --[[ ------------------------------------ [Update the Acid Items] Accordingly ------------------------------------ ]] num = 0; CTA_AcidSummary = CTA_LFM..": "..CTA_MyRaid.comment.." ("..CTA_MyRaid.size.."/"..CTA_MyRaid.maxSize..")"..CTA_ANNOUNCE_SUMMARY_PROMPT; CTA_AcidDetails = CTA_LFM..": "..CTA_MyRaid.comment.." ("..CTA_MyRaid.size.."/"..CTA_MyRaid.maxSize..") - "; while( num < 9 ) do local item = getglobal( "CTA_Acid"..num ); if( item.classes or item:GetName()=="CTA_Acid0" ) then local nam = getglobal( "CTA_Acid"..num.."ClassNameLabel" ); if( item:GetName()~="CTA_Acid0" ) then getglobal( "CTA_Acid"..num.."ClassNameLabel" ):Show(); --getglobal( "CTA_Acid"..num.."ClassPercentLabel" ):Show(); getglobal( "CTA_Acid"..num.."ClassAbsoluteLabel" ):Show(); getglobal( "CTA_Acid"..num.."ClassCurrentLabel" ):Show(); getglobal( "CTA_Acid"..num.."LessButton"):Show(); getglobal( "CTA_Acid"..num.."MoreButton"):Show(); --getglobal( "CTA_Acid"..num.."EditButton"):Show(); getglobal( "CTA_Acid"..num.."DeleteButton"):SetText( "Edit" ); nam:SetText( "" ); for key, val in item.classes do if( nam:GetText() ) then nam:SetText( nam:GetText()..key.."\n" ); else nam:SetText( key.."\n" ); end end end local percent = getglobal( "CTA_Acid"..num.."ClassPercentLabel" ); local current = getglobal( "CTA_Acid"..num.."ClassAbsoluteLabel" ); local absolute = getglobal( "CTA_Acid"..num.."ClassCurrentLabel" ); local percentTex = getglobal( "CTA_Acid"..num.."PercentTexture" ); local currentTex = getglobal( "CTA_Acid"..num.."CurrentTexture" ); local pval = floor(50*item.val/CTA_MyRaid.maxSize); --80 changed to 50 R5 if( pval > 50 ) then pval = 50; end -- cheapo fix local percentage = floor(100*item.val/CTA_MyRaid.maxSize); percent:SetText( percentage.."%" ); absolute:SetText( "/"..item.val ); if( item.val == 0) then percentTex:Hide(); absolute:SetTextColor( 0.5, 0.5, 0.5 ); else percentTex:SetHeight( pval ); absolute:SetTextColor( 1.0, 0.82, 0.0 ); percentTex:Show(); end local cval = item.cur; local cpval = floor(50*cval/CTA_MyRaid.maxSize); --80 -> 50 R5 if( cpval > 50 ) then cpval = 50; end -- cheapo fix current:SetText( cval ); if( cval == 0) then currentTex:Hide(); current:SetTextColor( 0.5, 0.5, 0.5 ); else current:SetTextColor( 1.0, 0.82, 0.0 ); currentTex:SetHeight( cpval ); currentTex:Show(); end if( cval > item.val and CTA_Acid0.cur > CTA_Acid0.val ) then current:SetTextColor( 1.0, 0.0, 0.0 ); end local lfm = item.val-item.cur; if( lfm > 0 ) then if( num == 0 ) then CTA_AcidDetails = CTA_AcidDetails..(lfm).." "..CTA_ANY_CLASS..", "; else CTA_AcidDetails = CTA_AcidDetails..(lfm).." "; local f = nil; for k,v in item.classes do if( f ) then CTA_AcidDetails = CTA_AcidDetails.."/"; else f = 1; end CTA_AcidDetails = CTA_AcidDetails..k; end CTA_AcidDetails = CTA_AcidDetails..", "; end end else getglobal( "CTA_Acid"..num.."ClassNameLabel" ):Hide(); --getglobal( "CTA_Acid"..num.."ClassPercentLabel" ):Hide(); getglobal( "CTA_Acid"..num.."ClassAbsoluteLabel" ):Hide(); getglobal( "CTA_Acid"..num.."ClassCurrentLabel" ):Hide(); getglobal( "CTA_Acid"..num.."PercentTexture" ):Hide(); getglobal( "CTA_Acid"..num.."CurrentTexture" ):Hide(); getglobal( "CTA_Acid"..num.."LessButton"):Hide(); getglobal( "CTA_Acid"..num.."MoreButton"):Hide(); --getglobal( "CTA_Acid"..num.."EditButton"):Hide(); getglobal( "CTA_Acid"..num.."DeleteButton"):SetText( "Add" ); --item:Hide(); end num = num + 1; end CTA_AcidDetails = CTA_AcidDetails..CTA_ANNOUNCE_DETAILS_PROMPT; CTA_AcidNote:SetText( CTA_AcidSummary ); if( CTA_HostingRaidGroup and IsPartyLeader() and GetNumRaidMembers() == 0 ) then CTA_ConvertToRaid(); end -- ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID -- ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID -- ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID ACID local myMinLevel = CTA_SafeSetNumber( CTA_MyRaidFrameMinLevelEditBox:GetText(), 1, 60 ); if( not myMinLevel ) then CTA_MyRaidFrameMinLevelEditBox:SetText( CTA_MyRaid.minLevel ); myMinLevel = CTA_MyRaid.minLevel; end local myClasses = 0; if( CTA_Acid0.cur < CTA_Acid0.val ) then myClasses = 255; else local num = 1; local b = 1; local combinedClasses = {}; for i = 1, 8 do local item = getglobal( "CTA_Acid"..i ); if( item.classes and item.cur < item.val ) then for k, v in item.classes do combinedClasses[ k ] = 1; end end end for k,v in combinedClasses do local index = CTA_GetClassCode( k ); myClasses = myClasses + (2^(index - 1 )); end --[[ while( num < 9 ) do local item = getglobal( "CTA_Acid"..num ); if( item.cur < item.val ) then myClasses = myClasses + b; end b = b * 2; num = num + 1; end ]] end local myUsePassword = 1; local oldPassword = CTA_MyRaidPassword; CTA_MyRaidPassword = CTA_MyRaidFramePasswordEditBox:GetText(); for space in string.gfind( CTA_MyRaidPassword, "(%s)" ) do CTA_MyRaidPassword = oldPassword; end if( not CTA_MyRaidPassword or CTA_MyRaidPassword== "" ) then myUsePassword = 0; CTA_MyRaidPassword = nil; CTA_MyRaidFramePasswordEditBox:SetText( "" ); else CTA_MyRaidFramePasswordEditBox:SetText( CTA_MyRaidPassword ); end local myName = UnitName(CTA_PLAYER); local myTime = CTA_MyRaid.creationTime; local myOptions = CTA_GetGroupClassesCode()..CTA_RELEASEVERSION..",R"; CTA_SetRaidInfo( CTA_MyRaid, myName, 100, myComment, myRaidType, mySize, myMaxSize, myMinLevel, myClasses, myUsePassword, myTime, myOptions ); CTA_PollBroadcast = 1; --CTA_IconMsg( "Broadcast Polled" ); end function CTA_AcidItemButton_OnClick() local item = getglobal( this:GetParent():GetName() ); if( string.find( this:GetName(), "Delete" ) ) then CTA_StartEditAcidItem( item ); --[[ if( item.classes == nil ) then CTA_AddAcidItem( item ); else CTA_StartEditAcidItem(item); end]] elseif( string.find( this:GetName(), "Less" ) ) then if( item.val > 0 ) then item.val = item.val - 1; CTA_Acid0.val = CTA_Acid0.val + 1; end CTA_MyRaidInstantUpdate(); else if( CTA_Acid0.val > 0 ) then item.val = item.val + 1; CTA_Acid0.val = CTA_Acid0.val - 1; end CTA_MyRaidInstantUpdate(); end end --[[ CTA_StartEditAcidItem() --------------------------------------------------------------- Called by CTA_Acid(0-8) AddButton Components. All this function really does is set up the check buttons in the CTA_AcidEditDialog Frame before showing it to the user. ]] function CTA_StartEditAcidItem( item ) for i = 1, 8 do getglobal( "CTA_AcidClassCheckButton"..i ):SetChecked( 0 ); end if( UnitFactionGroup(CTA_PLAYER) == CTA_ALLIANCE ) then CTA_AcidClassCheckButton8TextLabel:SetText( CTA_PALADIN ); else CTA_AcidClassCheckButton8TextLabel:SetText( CTA_SHAMAN ); end if( item.classes ) then for key, val in item.classes do for i = 1, 8 do if ( getglobal( "CTA_AcidClassCheckButton"..i.."TextLabel" ):GetText() == key ) then getglobal( "CTA_AcidClassCheckButton"..i ):SetChecked( 1 ); end end end else item.classes = {}; end CTA_AcidEditDialogHeadingLabel:SetText( CTA_EDIT_ACID_CLASSES ); CTA_AcidEditDialog.target = item:GetName(); CTA_AcidEditDialog:Show(); end --[[ CTA_EditAcidItem() --------------------------------------------------------------- Called by the CTA_AcidEditDialog's OKButton Component. Sets the Acid item's class list to what classes were checked by the user in the edit dialog. ]] function CTA_EditAcidItem() local acidItem = getglobal( CTA_AcidEditDialog.target ); local checkCount = 0; acidItem.classes = {}; for i = 1, 8 do local checked = getglobal( "CTA_AcidClassCheckButton"..i ):GetChecked(); if( checked ) then acidItem.classes[ getglobal( "CTA_AcidClassCheckButton"..i.."TextLabel" ):GetText() ] = 0; checkCount = checkCount + 1; end end if( checkCount == 0 or checkCount == 8 ) then acidItem.classes = nil; if( acidItem.val ) then CTA_Acid0.val = CTA_Acid0.val + acidItem.val; end acidItem.val = 0; end CTA_AcidEditDialog:Hide(); CTA_MyRaidInstantUpdate(); end --[[ CTA_getn() --------------------------------------------------------------- Utility function that returns the length of a list. @arg the list @return the length of the list ]] function CTA_getn( list ) local c = 0; for i, j in list do c = c + 1; end return c; end --[[ CTA_StartAParty() --------------------------------------------------------------- Starts a party group. Called by StartARaidFrame's StartAPartyButton ]] function CTA_StartAParty() CTA_HostingRaidGroup = nil; CTA_MyRaid = {}; CTA_SetRaidInfo( CTA_MyRaid, UnitName( CTA_PLAYER ), 100, "", CTA_RAID_TYPE_PVE, GetNumPartyMembers()+1, 5, 1, 255, 0, CTA_GetTime(), 0 ); CTA_MyRaidIsOnline = 1; CTA_ShowStartRaidFrame(); end --[[ CTA_StartARaid --------------------------------------------------------------- Starts a raid group. Called by StartARaidFrame's StartARaidButton ]] function CTA_StartARaid() CTA_HostingRaidGroup = 1; CTA_MyRaid = {}; CTA_SetRaidInfo( CTA_MyRaid, UnitName( CTA_PLAYER ), 100, "", CTA_RAID_TYPE_PVE, GetNumRaidMembers(), 10, 1, 255, 0, CTA_GetTime(), 0 ); CTA_MyRaidIsOnline = 1; CTA_ShowStartRaidFrame(); end --[[ CTA_StopHosting() --------------------------------------------------------------- Stops hosting a group with CTA. ]] function CTA_StopHosting() CTA_HostingRaidGroup = nil; CTA_MyRaid = nil; CTA_MyRaidIsOnline = nil; CTA_PollBroadcast = 2; CTA_SearchFrame:Hide(); CTA_MyRaidFrame:Hide(); CTA_SettingsFrame:Hide(); CTA_GreyListFrame:Hide(); CTA_LogFrame:Hide(); CTA_ShowStartRaidFrame(); end --[[ CTA_ShowStartRaidFrame() --------------------------------------------------------------- Prompts the user to start hosting a group with CTA or tells the user that s/he cannot currently host a group or shows the group information frame if user is already using CTA to host a group. ]] function CTA_ShowStartRaidFrame() CTA_StartRaidFrame:Show(); if( CTA_MyRaid ) then CTA_StartRaidFrame:Hide(); if( CTA_ToggleViewableButton:GetText() == CTA_GO_OFFLINE ) then CTA_MyRaidIsOnline = 1; end CTA_MyRaidFrameDescriptionEditBox:SetText(""..CTA_MyRaid.comment); local myRaidType = CTA_MyRaid.pvtype; if( myRaidType == CTA_RAID_TYPE_PVP ) then CTA_MyRaidFramePVPCheckButton:SetChecked(1) CTA_MyRaidFramePVECheckButton:SetChecked(0) else CTA_MyRaidFramePVPCheckButton:SetChecked(0) CTA_MyRaidFramePVECheckButton:SetChecked(1) end CTA_MyRaidFrameMaxSizeEditBox:SetText(""..CTA_MyRaid.maxSize); CTA_MyRaidFrameMinLevelEditBox:SetText(""..CTA_MyRaid.minLevel); if( CTA_MyRaidPassword ) then CTA_MyRaidFramePasswordEditBox:SetText(CTA_MyRaidPassword); else CTA_MyRaidFramePasswordEditBox:SetText(""); end CTA_MyRaidInstantUpdate(); CTA_MyRaidFrame:Show(); end CTA_StartARaidButton:Hide(); CTA_StartAPartyButton:Hide(); if ( CTA_PlayerCanHostGroup() ) then CTA_StartRaidLabel:SetText( CTA_PLAYER_CAN_START_A_GROUP ); if( not CTA_MyRaid and IsRaidLeader() and GetNumRaidMembers() > 0 ) then CTA_StartARaidButton:Show(); elseif( not CTA_MyRaid and IsPartyLeader() and GetNumRaidMembers() == 0 ) then CTA_StartAPartyButton:Show(); CTA_StartARaidButton:Show(); else CTA_StartAPartyButton:Show(); CTA_StartARaidButton:Show(); end else CTA_StartRaidLabel:SetText( CTA_PLAYER_IS_RAID_MEMBER_NOT_LEADER ); end end --[[ CTA_AcidItem_ShowTooltip() --------------------------------------------------------------- Shows tooltip for acid items. ]] function CTA_AcidItem_ShowTooltip() GameTooltip:SetOwner( this, "ANCHOR_TOP" ); GameTooltip:ClearLines(); GameTooltip:ClearAllPoints(); GameTooltip:SetPoint("TOPLEFT", this:GetName(), "BOTTOMLEFT", 0, -8); local acidItem = this; if( not acidItem.classes and acidItem:GetName() ~= "CTA_Acid0" ) then GameTooltip:AddLine( CTA_NO_CLASSES_TOOLTIP ); GameTooltip:AddLine( CTA_NO_CLASSES_TOOLTIP2, 1, 1, 1, 1, 1 ); return; end local needed = acidItem.val - acidItem.cur; if( needed < 0 ) then needed = 0; end if( this:GetName() == "CTA_Acid0" ) then GameTooltip:AddDoubleLine( CTA_MAXIMUM_PLAYERS_ALLOWED..":", ""..this.val ); GameTooltip:AddDoubleLine( CTA_PLAYERS_IN_RAID..":", ""..this.cur ); GameTooltip:AddDoubleLine( CTA_NUMBER_OF_PLAYERS_NEEDED..":", ""..needed ); GameTooltip:AddLine( CTA_ANY_CLASS_TOOLTIP, 1, 1, 1, 1, 1 ); else GameTooltip:AddDoubleLine( CTA_MINIMUM_PLAYERS_WANTED..":", ""..this.val ); GameTooltip:AddDoubleLine( CTA_PLAYERS_IN_RAID..":", ""..this.cur ); GameTooltip:AddDoubleLine( CTA_NUMBER_OF_PLAYERS_NEEDED..":", ""..needed ); GameTooltip:AddLine( CTA_CLASS_TOOLTIP, 1, 1, 1, 1, 1 ); end GameTooltip:Show(); end --[[ CTA_GetGroupMemberInfo() --------------------------------------------------------------- Returns information about a group member. @arg the index of the group member @return the name, level, class of the player. ]] function CTA_GetGroupMemberInfo( 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_GetNumGroupMembers() --------------------------------------------------------------- Returns information about a group member. @arg the index of the group member @return the name, level, class of the player. ]] function CTA_GetNumGroupMembers() --[[ if( IsRaidLeader() ) then return GetNumRaidMembers(); elseif( IsPartyLeader() ) then return GetNumPartyMembers() + 1; else return 1; end ]] if( GetNumRaidMembers() > 0 ) then return GetNumRaidMembers(); elseif( GetNumPartyMembers() > 0 ) then return GetNumPartyMembers() + 1; else return 1; end end --[[ CTA_DissolveRaid() --------------------------------------------------------------- Dissolves the group by removing each member. ]] function CTA_DissolveRaid() CTA_IconMsg( CTA_DISSOLVING_RAID, CTA_GROUP_UPDATE ); num = 1; local numRaidMembers = GetNumRaidMembers(); local name, rank, subgroup, level, class, fileName, zone, online, isDead; local over = 0; while ( num <= numRaidMembers ) do name, rank, subgroup, level, class, fileName, zone, online, isDead = GetRaidRosterInfo(num); if( name ~= UnitName(CTA_PLAYER) ) then UninviteByName( name ); CTA_SendAutoMsg( CTA_DISSOLVING_THE_RAID_CHAT_MESSAGE, name); end num = num+1; end CTA_IconMsg( CTA_RAID_DISSOLVED, CTA_GROUP_UPDATE ); end --[[ CTA_ConvertToParty() --------------------------------------------------------------- convert your raid to a party. ]] function CTA_ConvertToParty() --R2 (suggested by Sadris) CTA_IconMsg( CTA_CONVERTING_TO_PARTY, CTA_GROUP_UPDATE ); num = 1; local numRaidMembers = GetNumRaidMembers(); if( numRaidMembers > 5 ) then CTA_Println( CTA_CANNOT_CONVERT_TO_PARTY ); return; end local memberList = {}; local name, rank, subgroup, level, class, fileName, zone, online, isDead; local over = 0; while ( num <= numRaidMembers ) do name, rank, subgroup, level, class, fileName, zone, online, isDead = GetRaidRosterInfo(num); if( name ~= UnitName(CTA_PLAYER) ) then memberList[num] = name; UninviteByName( name ); CTA_MyRaidInstantUpdate(); CTA_SendAutoMsg( CTA_CONVERTING_TO_PARTY_MESSAGE, name); end num = num+1; end for i = 1, numRaidMembers - 1 do InviteByName( memberList[i] ); end CTA_IconMsg( CTA_CONVERTING_TO_PARTY_DONE, CTA_GROUP_UPDATE ); CTA_HostingRaidGroup = nil; end --[[ CTA_GetGroupType() --------------------------------------------------------------- Returns a String representation of the type of group currently being hosted. @return CTA_GROUP or CTA_PARTY ]] function CTA_GetGroupType() if ( CTA_HostingRaidGroup ) then return CTA_RAID; end return CTA_PARTY; end --[[ CTA_ConvertToParty() --------------------------------------------------------------- Converts the raid to a party ]] function CTA_ConvertToRaid() if( IsPartyLeader() ) then CTA_HostingRaidGroup = 1; ConvertToRaid(); end end --[[ CTA_PlayerCanHostGroup() --------------------------------------------------------------- Indicates whether a player can start hosting a group according to CTA logic. returns 1 if can host, nil if not ]] function CTA_PlayerCanHostGroup() if ( ( IsRaidLeader() and GetNumRaidMembers() > 0 ) or ( IsPartyLeader() and GetNumRaidMembers() == 0 ) or ( GetNumPartyMembers() == 0 and GetNumRaidMembers() == 0 ) ) then return 1; else return nil; end end --[[ CTA_SetRaidInfo() --------------------------------------------------------------- Set group information for the specified group. ]] function CTA_SetRaidInfo( raid, name, score, comment, groupType, size, maxSize, minLevel, classes, passwordProtected, creationTime, options ) raid.leader = name; raid.score = tonumber(score); raid.comment = comment; raid.pvtype = tonumber(groupType); raid.size = tonumber(size); raid.maxSize = tonumber(maxSize); raid.minLevel = tonumber(minLevel); raid.classes = tonumber(classes); raid.passwordProtected = tonumber(passwordProtected); raid.creationTime = creationTime; raid.options = options; end --[[ --------------------------------------------------------------- Functions Related To The Blacklist --------------------------------------------------------------- ]] --[[ CTA_UpdateGreyListItems() UPDATE FUNCTION --------------------------------------------------------------- Updates the list of blacklisted players. ]] function CTA_UpdateGreyListItems() CTA_GreyListItem0NameLabel:SetText( CTA_NAME ); CTA_GreyListItem0NoteLabel:SetText( CTA_PLAYER_NOTE ); CTA_GreyListItem0StatusLabel:SetText( "" ); CTA_GreyListItem0:Show(); local gls = getn(CTA_BlackList); if( not gls ) then gls = 0; end CTA_GreyListFramePageLabel:Show(); local cpage = floor( CTA_PlayerListOffset / CTA_MAX_BLACKLIST_ITEMS ); local tpage = floor( gls / CTA_MAX_BLACKLIST_ITEMS ); if( cpage == 0 or cpage <= CTA_PlayerListOffset / CTA_MAX_BLACKLIST_ITEMS ) then cpage = cpage + 1; end if( tpage == 0 or tpage < gls / CTA_MAX_BLACKLIST_ITEMS ) then tpage = tpage + 1; end CTA_GreyListFramePageLabel:SetText( CTA_PAGE.." "..cpage.." / "..tpage ); for index = 1, CTA_MAX_BLACKLIST_ITEMS do local item = getglobal( "CTA_GreyListItem"..index ); if( index + CTA_PlayerListOffset <= gls ) then local data = CTA_BlackList[ index + CTA_PlayerListOffset ]; getglobal( "CTA_GreyListItem"..index.."NameLabel" ):SetText( data.name ); local i = CTA_FindInList( data.name, CTA_SavedVariables.GreyList ); if( i ) then getglobal( "CTA_GreyListItem"..index.."NoteLabel" ):SetTextColor( 1, 1, 1 ); else getglobal( "CTA_GreyListItem"..index.."NoteLabel" ):SetTextColor( 1, 0, 0 ); end getglobal( "CTA_GreyListItem"..index.."NoteLabel" ):SetText( data.note ); getglobal( "CTA_GreyListItem"..index.."RatingLabel" ):SetText( data.rating ); getglobal( "CTA_GreyListItem"..index ):Show(); else item:Hide(); end end end --[[ CTA_ShowGreyListFrame() --------------------------------------------------------------- Show the Greylist frame ]] function CTA_ShowGreyListFrame() --CTA_SearchFrame:Hide(); --CTA_MyRaidFrame:Hide(); --CTA_StartRaidFrame:Hide(); CTA_SettingsFrame:Hide(); CTA_LogFrame:Hide(); CTA_GreyListFrame:Show(); CTA_UpdateGreyListItems(); end --[[ CTA_EditGreyListItem() --------------------------------------------------------------- Shows the Edit frame for the selected Greylist item ]] function CTA_EditGreyListItem() local listItem = getglobal( this:GetName() ); CTA_GreyListItemEditFrame.name = ( getglobal( listItem:GetName().."NameLabel" ):GetText() or "?" ); if( not CTA_FindInList( CTA_GreyListItemEditFrame.name, CTA_SavedVariables.GreyList ) ) then CTA_AddPlayer( CTA_GreyListItemEditFrame.name, CTA_DEFAULT_PLAYER_NOTE, CTA_DEFAULT_STATUS, CTA_DEFAULT_RATING, CTA_SavedVariables.GreyList ); end CTA_GreyListItemEditFrameEditBox:SetText( CTA_SavedVariables.GreyList[ CTA_FindInList( CTA_GreyListItemEditFrame.name, CTA_SavedVariables.GreyList ) ].note ); CTA_GreyListItemEditFrameTitleLabel:SetText( CTA_EDIT_PLAYER..": "..CTA_GreyListItemEditFrame.name ); CTA_GreyListItemEditFrame:Show(); end --[[ CTA_GreyListItemSaveChanges() --------------------------------------------------------------- Commits changes made to the selected Greylist item ]] function CTA_GreyListItemSaveChanges() CTA_SavedVariables.GreyList[CTA_FindInList( CTA_GreyListItemEditFrame.name, CTA_SavedVariables.GreyList )].note = CTA_GreyListItemEditFrameEditBox:GetText(); CTA_BlackList[CTA_FindInList( CTA_GreyListItemEditFrame.name, CTA_BlackList )].note = CTA_GreyListItemEditFrameEditBox:GetText(); CTA_GreyListItemEditFrame:Hide(); CTA_ShowGreyListFrame(); end --[[ CTA_DeletePlayer() --------------------------------------------------------------- Removes the player from the Greylist ]] function CTA_DeletePlayer() table.remove( CTA_BlackList , CTA_FindInList( CTA_GreyListItemEditFrame.name, CTA_BlackList ) ); table.remove( CTA_SavedVariables.GreyList , CTA_FindInList( CTA_GreyListItemEditFrame.name, CTA_SavedVariables.GreyList ) ); CTA_GreyListItemEditFrame:Hide(); CTA_ShowGreyListFrame(); end --[[ function CTA_ImportFriendsToGreyList() numFriends = GetNumFriends(); for i=1,numFriends do local name, level, class, area, connected = GetFriendInfo(i); if( not CTA_SavedVariables.GreyList[name] ) then CTA_AddPlayer( name, CTA_DEFAULT_PLAYER_NOTE, CTA_DEFAULT_STATUS, CTA_DEFAULT_RATING, CTA_SavedVariables.GreyList ); end end end ]] --[[ CTA_ImportIgnoreListToGreyList() --------------------------------------------------------------- Adds players from the ignore list to the Greylist ]] function CTA_ImportIgnoreListToGreyList() local numIgnores = GetNumIgnores(); for i = 1, numIgnores do local name = GetIgnoreName(i); CTA_AddPlayer( name, CTA_DEFAULT_IMPORTED_IGNORED_PLAYER_NOTE, CTA_DEFAULT_STATUS, CTA_DEFAULT_RATING, CTA_SavedVariables.GreyList ); CTA_AddPlayer( name, CTA_DEFAULT_IMPORTED_IGNORED_PLAYER_NOTE, CTA_DEFAULT_STATUS, CTA_DEFAULT_RATING, CTA_BlackList ); end end --[[ CTA_AddGreyToBlack() --------------------------------------------------------------- Updates the Blacklist by adding Greylist entries to it. ]] function CTA_AddGreyToBlack() for i = 1, getn(CTA_SavedVariables.GreyList) do CTA_AddToList( CTA_SavedVariables.GreyList[i], CTA_BlackList ); end end --[[ CTA_AddPlayer() --------------------------------------------------------------- Adds a new player to the Greylist. @arg the name of the player @arg the note to be added @arg the status of the player @arg the rating of the player @arg the list in which to enter the data ]] function CTA_AddPlayer( name, note, status, rating, list ) local data = { name=name, note=note, status=status, rating=rating }; CTA_AddToList( data, list ); CTA_UpdateGreyListItems(); end --[[ CTA_AddToList() --------------------------------------------------------------- Add data to list only if the name is not already in the List @arg the data to be added @arg the list in which to enter the data ]] function CTA_AddToList( data, list ) if( not CTA_FindInList( data.name, list ) ) then table.insert( list, data ); end end --[[ CTA_FindInList() --------------------------------------------------------------- Returns the index of the data which has a name field that matches the name provided @arg the name to search for @arg the list in which to search for the data @return index if found, nil if not found ]] function CTA_FindInList( name, list ) for i = 1, getn(list) do if( list[i].name == name ) then return i; end end return nil; end --[[ --------------------------------------------------------------- Generic Functions Driven Directly By User Interface Events --------------------------------------------------------------- ]] --[[ CTA_ToggleMainFrame() --------------------------------------------------------------- Show/hide the Main Frame. If the search frame is visible and the main frame is opened the results list is automatically refreshed. Called by the minimap icon and the main frame's close button. ]] function CTA_ToggleMainFrame() PlaySound("igCharacterInfoTab"); if( CTA_MainFrame:IsVisible() ) then CTA_MainFrame:Hide(); else CTA_MainFrame:Show(); --[[if( CTA_SearchFrame:IsVisible() ) then CTA_ApplyFiltersToGroupList(); end ]] end end --[[ CTA_Tab_OnCLick() --------------------------------------------------------------- Switches visibility of the frames in the main frame. Called by all tab buttons under the main frame. ]] function CTA_Tab_OnCLick() PlaySound("igCharacterInfoTab"); CTA_SearchFrame:Hide(); CTA_StartRaidFrame:Hide(); CTA_MyRaidFrame:Hide(); --CTA_SettingsFrame:Hide(); --CTA_GreyListFrame:Hide(); --CTA_LogFrame:Hide(); CTA_MoreFeaturesFrame:Hide(); CTA_CannotLFGFrame:Hide(); CTA_LFGFrame:Hide(); -- r7 CTA_ShowSearchButton:SetFrameLevel(CTA_MainFrame:GetFrameLevel() - 1); CTA_ShowMyRaidButton:SetFrameLevel(CTA_MainFrame:GetFrameLevel() - 1); --CTA_ShowPlayerListButton:SetFrameLevel(CTA_MainFrame:GetFrameLevel() - 1); --CTA_ShowSettingsButton:SetFrameLevel(CTA_MainFrame:GetFrameLevel() - 1); --CTA_ShowLogButton:SetFrameLevel(CTA_MainFrame:GetFrameLevel() - 1); CTA_ShowLFGButton:SetFrameLevel(CTA_MainFrame:GetFrameLevel() - 1); -- r7 CTA_ShowMFFButton:SetFrameLevel(CTA_MainFrame:GetFrameLevel() - 1); this:SetFrameLevel(CTA_MainFrame:GetFrameLevel() + 1); if( this:GetName() == "CTA_ShowSearchButton" ) then CTA_SearchFrame:Show(); --[[CTA_ApplyFiltersToGroupList();]] elseif( this:GetName() == "CTA_ShowMyRaidButton" ) then CTA_ShowStartRaidFrame(); elseif( this:GetName() == "CTA_ShowPlayerListButton" ) then CTA_ShowGreyListFrame(); elseif( this:GetName() == "CTA_ShowSettingsButton" ) then CTA_SettingsFrame:Show(); elseif( this:GetName() == "CTA_ShowLogButton" ) then CTA_LogFrame:Show(); elseif( this:GetName() == "CTA_ShowLFGButton" ) then CTA_ShowLFGFrame(); elseif( this:GetName() == "CTA_ShowMFFButton" ) then CTA_MoreFeaturesFrame:Show(); end end --[[ CTA_DialogOKButton_OnCLick() --------------------------------------------------------------- Handles all 'Ok button' events generated by dialogs. ]] function CTA_DialogOKButton_OnCLick() local item = this:GetParent(); if( item:GetName() == "CTA_AddPlayerFrame" ) then local name = CTA_AddPlayerFrameEditBox:GetText(); if( name and name ~= "" ) then CTA_AddPlayer( name, CTA_DEFAULT_PLAYER_NOTE, CTA_DEFAULT_STATUS, CTA_DEFAULT_RATING, CTA_SavedVariables.GreyList ); CTA_AddPlayer( name, CTA_DEFAULT_PLAYER_NOTE, CTA_DEFAULT_STATUS, CTA_DEFAULT_RATING, CTA_BlackList ); end CTA_AddPlayerFrame:Hide(); end if( item:GetName() == "CTA_JoinRaidWindow" ) then CTA_SendPasswordRaidInvitationRequest(); end if( item:GetName() == "CTA_AcidEditDialog" ) then CTA_EditAcidItem(); end end --[[ CTA_UpdateMinimapIcon() --------------------------------------------------------------- Adjusts the minimap icon position. ]] function CTA_UpdateMinimapIcon() CTA_MinimapIcon:SetPoint( "TOPLEFT", "Minimap", "TOPLEFT", 55 - ( ( CTA_SavedVariables.MinimapRadiusOffset ) * cos( CTA_SavedVariables.MinimapArcOffset ) ), ( ( CTA_SavedVariables.MinimapRadiusOffset ) * sin( CTA_SavedVariables.MinimapArcOffset ) ) - 55 ); CTA_MinimapMessageFrame:SetPoint( "TOPRIGHT", "Minimap", "TOPRIGHT", ( 0 - ( ( CTA_SavedVariables.MinimapMsgRadiusOffset ) * cos( CTA_SavedVariables.MinimapMsgArcOffset ) ) ) - 55, ( ( CTA_SavedVariables.MinimapMsgRadiusOffset ) * sin (CTA_SavedVariables.MinimapMsgArcOffset ) ) - 55 ); end --[[ --------------------------------------------------------------- Utility Functions --------------------------------------------------------------- ]] -- Other Functions -- -- Searches a specified String (source) for a keyword String (search) -- String patterns are not allowed - simple search keywords are used -- Returns a number representing the degree to which the search string -- was found in the specified string using my own scoring system. -- Number ( 0 - 100 ) -- function CTA_SearchScore( source, search, show ) local ad = string.lower( source ); local query = string.lower( search ); if( string.find( ad, query ) ) then return 100, "|cff33ff33"..source.."|r"; else local sourceWords = {}; for word in string.gfind( ad, "%w+" ) do sourceWords[word] = word; end local highlighted = source; local score = 0; local total = 0; for word in string.gfind(query, "%w+") do total = total + 1; if( sourceWords[word] ) then score = score + 1; if( show ) then local s, e = string.find( string.lower( highlighted ), word ); highlighted = string.sub( highlighted, 1, s-1 ).."|cff99ff33"..string.sub( highlighted, s, e ).."|r"..string.sub( highlighted, e+1 ); end elseif( string.find( ad, word ) ) then score = score + 0.9; if( show ) then local s, e = string.find( string.lower( highlighted ), word ); highlighted = string.sub( highlighted, 1, s-1 ).."|cffccff33"..string.sub( highlighted, s, e ).."|r"..string.sub( highlighted, e+1 ); end end end if( score > 0 ) then score = floor(99*score/total); end return score, highlighted; end end -- Returns a String representation of the current time -- String ( eg. "14:40" ) function CTA_GetTime() local hour, minute = GetGameTime(); local t = hour; if( hour < 10 ) then t = "0"..t; end t = t..":"; if( minute < 10 ) then t = t.."0"; end t = t..minute; return t; end -- Returns a String from the specified textfield (uiVal) -- If the String is Nil, then (defaultVal) is returned -- String / defaultVal -- function CTA_SafeSet( uiVal, defaultVal ) if( not uiVal or uiVal=="" ) then return defaultVal; else return uiVal; end end -- Returns the number entered into the textfield (uiValue), -- if the number is valid, is no less than (min) and is no more then (max) -- Number / Nil -- function CTA_SafeSetNumber( uiValue, min, max ) for value in string.gfind( uiValue, "(%d+)" ) do if( value and value ~= "" and tonumber(value) >=min and tonumber(value) <= max ) then return tonumber(value); end end return nil; end -- Shows an error dialog with a title, text and close button -- function CTA_ShowError( title, text ) CTA_InformationDialogHeadingLabel:SetText( title ); CTA_InformationDialogContentLabel:SetText( text ); CTA_InformationDialog:Show(); end -- Returns the class code for this player. -- Number ( 1 - 8 ) -- function CTA_MyClassCode() local myClass = UnitClass(CTA_PLAYER); return CTA_GetClassCode(myClass); end -- Returns a String representaion of a class code -- String ( eg. "Priest" ) -- function CTA_GetClassCode( name ) local classes = { }; classes[CTA_PRIEST] = 1; classes[CTA_MAGE] = 2; classes[CTA_WARLOCK] = 3; classes[CTA_DRUID] = 4; classes[CTA_HUNTER] = 5; classes[CTA_ROGUE] = 6; classes[CTA_WARRIOR] = 7; classes[CTA_PALADIN] = 8; classes[CTA_SHAMAN] = 8; return classes[name]; end -- Returns whether the class code (value) is in a class set (classSet) -- Number ( 1 / 0 ) -- function CTA_CheckClasses( classSet, value ) 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 return tonumber( string.sub(b, 9-value, 9-value ) ); end -- Returns a String with all the class names represented by the class set -- String ( eg. "Priest Druid Warlock" ) -- function CTA_GetClassString( classSet ) local b = ""; local c = classSet; local classes = { }; classes[1] = CTA_PRIEST; classes[2] = CTA_MAGE; classes[3] = CTA_WARLOCK; classes[4] = CTA_DRUID; classes[5] = CTA_HUNTER; classes[6] = CTA_ROGUE; classes[7] = CTA_WARRIOR; if( UnitFactionGroup(CTA_PLAYER) == CTA_ALLIANCE ) then classes[8] = CTA_PALADIN; else classes[8] = CTA_SHAMAN; end 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..classes[9-pos].." "; end pos = pos - 1; end return t; end -- Generic Tooltip Function -- function CTA_ShowTooltip() if( CTA_GenTooltips[this:GetName()] ) then GameTooltip:SetOwner( getglobal(this:GetName()), "ANCHOR_TOP" ); GameTooltip:ClearLines(); GameTooltip:ClearAllPoints(); GameTooltip:SetPoint("TOPLEFT", this:GetName(), "BOTTOMLEFT", 0, -2); GameTooltip:AddLine( CTA_GenTooltips[this:GetName()].tooltip1 ); GameTooltip:AddLine( CTA_GenTooltips[this:GetName()].tooltip2, 1, 1, 1, 1, 1 ); GameTooltip:Show(); end end --[[ --------------------------------------------------------------- DEBUG / PROVING GROUNDS --------------------------------------------------------------- ]] function CTA_Error( s ) UIErrorsFrame:AddMessage(s, 0.75, 0.75, 1.0, 1.0, UIERRORS_HOLD_TIME); end function CTA_Println( s ) local m = s; if( not m ) then m = "nil"; end if( DEFAULT_CHAT_FRAME ) then DEFAULT_CHAT_FRAME:AddMessage( "CTA: "..m, 1, 1, 0.5); end end function CTA_IconMsg( s, t ) local m = s; if( not m ) then m = "nil"; end if( not t ) then CTA_MinimapMessageFrame:AddMessage(m, 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(m, r, g, b, 1.0, UIERRORS_HOLD_TIME); end end function CTA_LogMsg( s, t ) local m = s; if( not m ) then m = "nil"; end m = "["..CTA_GetTime().."] "..m; 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 -- R7 function SachaSearch( 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 = SachaSearch( 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 = SachaSearch( 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 - SachaSearch( source, trim( string.sub( s, 2 ) ) ) ); elseif( string.sub( s, 1, 1 ) == "(" and string.sub( s, string.len( s ) ) == ")" ) then return SachaSearch( 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( SachaScoredSearch( source, s ) > 0 ) then return 1; else return 0; end end end end function trim(s) if( not s ) then return nil; end return( string.gsub(s, "^%s*(.-)%s*$", "%1") or s ); end function getOps( source ) local operatorFound = nil; local bracketCount = 0; local inQuote = 0; local pos = 0; local currentChar; 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; end pos = pos + 1; end if( operatorFound ) then return currentChar, string.sub( source, 1, pos - 1 ), string.sub( source, pos + 1 ); end end function SachaScoredSearch( source, search ) local ad = string.lower( source ); local query = string.lower( search ); if( string.find( ad, query ) ) then return 100; else local score = 0; local total = 0; for word in string.gfind(query, "%w+") do total = total + 1; if( string.find( ad, "%s+"..word.."%s+" ) ) then score = score + 1; elseif( string.find( ad, word ) ) then score = score + 0.9; end end if( score > 0 and total > 0 ) then score = floor(99*score/total); end return score; end end function CTA_GetGroupClassesCode() local groupClasses = {}; groupClasses[1] = 0; groupClasses[2] = 0; groupClasses[3] = 0; groupClasses[4] = 0; groupClasses[5] = 0; groupClasses[6] = 0; groupClasses[7] = 0; groupClasses[8] = 0; local name, level, class; for num = 1, 40 do name, level, class = CTA_GetGroupMemberInfo( num ); if( name == nil ) then break; end groupClasses[ CTA_GetClassCode(class) ] = groupClasses[ CTA_GetClassCode(class) ] + 1; end local retVal = ""; for num = 1, 8 do retVal = retVal..groupClasses[ num ]..","; end return retVal; end function CTA_DecodeGroupClasses( code ) if( not code or code == 0 ) then return; end local classes = { }; classes[1] = CTA_PRIEST; classes[2] = CTA_MAGE; classes[3] = CTA_WARLOCK; classes[4] = CTA_DRUID; classes[5] = CTA_HUNTER; classes[6] = CTA_ROGUE; classes[7] = CTA_WARRIOR; if( UnitFactionGroup(CTA_PLAYER) == CTA_ALLIANCE ) then classes[8] = CTA_PALADIN; else classes[8] = CTA_SHAMAN; end --local retVal; local retVal2; for priest, mage, warlock, druid, hunter, rogue, warrior, hybrid, version, extra in string.gfind( code, "(%d+),(%d+),(%d+),(%d+),(%d+),(%d+),(%d+),(%d+),(.+),(.+)" ) do --[[ ^extra reserved for any future releases NB: I might need it to implement the max level req for groups. ]] classes[1] = priest; classes[2] = mage; classes[3] = warlock; classes[4] = druid; classes[5] = hunter; classes[6] = rogue; classes[7] = warrior; classes[8] = hybrid; retVal2 = version; end return classes, retVal2; end function CTA_SearchDropDown_OnClick() UIDropDownMenu_SetSelectedID(CTA_SearchDropDown, this:GetID()); end function CTA_SearchDropDown_Init() local info = {}; info.text = CTA_SHOW_PLAYERS_AND_GROUPS; info.func = CTA_SearchDropDown_OnClick; UIDropDownMenu_AddButton(info); info = {}; info.text = CTA_SHOW_GROUPS_ONLY; info.func = CTA_SearchDropDown_OnClick; UIDropDownMenu_AddButton(info); info = {}; info.text = CTA_SHOW_PLAYERS_ONLY; info.func = CTA_SearchDropDown_OnClick; UIDropDownMenu_AddButton(info); end function CTA_UpdateLFxButtonButton_OnClick() local text = CTA_SearchFrameLFGTriggerEditBox:GetText() or ""; local ok = 1; for word in string.gfind(text, "%w+") do if( strlen( word ) < 3 ) then ok = nil; break; end end if( ok ) then local spos = string.find( text, CTA_DEFAULT_LFG_TRIGGER ) or 0; if( spos <= 0 ) then CTA_SavedVariables.lfgTrigger = CTA_DEFAULT_LFG_TRIGGER.." "..text; else CTA_SavedVariables.lfgTrigger = text; end end CTA_SearchFrameLFGTriggerEditBox:SetText( CTA_SavedVariables.lfgTrigger ); text = CTA_SearchFrameLFMTriggerEditBox:GetText() or ""; local ok = 1; for word in string.gfind(text, "%w+") do if( strlen( word ) < 3 ) then ok = nil; break; end end if( ok ) then local spos = string.find( text, CTA_DEFAULT_LFM_TRIGGER ) or 0; if( spos <= 0 ) then CTA_SavedVariables.lfmTrigger = CTA_DEFAULT_LFM_TRIGGER.." "..text; else CTA_SavedVariables.lfmTrigger = text; end end CTA_SearchFrameLFMTriggerEditBox:SetText( CTA_SavedVariables.lfmTrigger ); end -- fix function CTA_UpdateLFxButtonButton_OnClick() local text = CTA_SearchFrameLFGTriggerEditBox:GetText() or ""; local ok = 1; for word in string.gfind(text, ".+") do if( string.sub( word, 1, 1 ) == "\"" and string.sub( word, string.len( word ) ) == "\"" ) then if( strlen( word ) < 6 ) then ok = nil; break; end else if( strlen( word ) < 3 ) then ok = nil; break; end end end if( ok ) then CTA_SavedVariables.lfgTrigger = text; CTA_SearchFrameLFGTriggerEditBox:SetText( CTA_SavedVariables.lfgTrigger ); end text = CTA_SearchFrameLFMTriggerEditBox:GetText(); local ok = 1; for word in string.gfind(text, ".+") do if( string.sub( word, 1, 1 ) == "\"" and string.sub( word, string.len( word ) ) == "\"" ) then if( strlen( word ) < 6 ) then ok = nil; break; end else if( strlen( word ) < 3 ) then ok = nil; break; end end end if( ok ) then CTA_SavedVariables.lfmTrigger = text; CTA_SearchFrameLFMTriggerEditBox:SetText( CTA_SavedVariables.lfmTrigger ); end end function CTA_ShowLFGFrame() if ( CTA_GetNumGroupMembers() > 1 ) then CTA_CannotLFGFrame:Show(); CTA_LFGFrame:Hide(); else CTA_CannotLFGFrame:Hide(); CTA_LGMPrefixLabel:SetText( "Level "..UnitLevel( CTA_PLAYER ).." "..UnitClass( CTA_PLAYER ).." "..CTA_LFG.." " ); CTA_LFGFrame:Show(); end end function CTA_InitClassTable() CTA_Classes[1] = CTA_PRIEST; CTA_Classes[2] = CTA_MAGE; CTA_Classes[3] = CTA_WARLOCK; CTA_Classes[4] = CTA_DRUID; CTA_Classes[5] = CTA_HUNTER; CTA_Classes[6] = CTA_ROGUE; CTA_Classes[7] = CTA_WARRIOR; if( UnitFactionGroup(CTA_PLAYER) == CTA_ALLIANCE ) then CTA_Classes[8] = CTA_PALADIN; else CTA_Classes[8] = CTA_SHAMAN; end CTA_Classes[CTA_PRIEST] = 1; CTA_Classes[CTA_MAGE] = 2; CTA_Classes[CTA_WARLOCK] = 3; CTA_Classes[CTA_DRUID] = 4; CTA_Classes[CTA_HUNTER] = 5; CTA_Classes[CTA_ROGUE] = 6; CTA_Classes[CTA_WARRIOR] = 7; CTA_Classes[CTA_PALADIN] = 8; CTA_Classes[CTA_SHAMAN] = 8; end function CTA_PlayerClassDropDown_Init() if( not CTA_Classes[i] ) then CTA_InitClassTable(); end local info = {}; info.text = CTA_ANY_CLASS; info.func = CTA_PlayerClassDropDown_OnClick; UIDropDownMenu_AddButton(info); for i=1, 8 do info = {}; info.text = CTA_Classes[i]; info.func = CTA_PlayerClassDropDown_OnClick; UIDropDownMenu_AddButton(info); end end function CTA_PlayerClassDropDown_OnClick() UIDropDownMenu_SetSelectedID(CTA_PlayerClassDropDown, this:GetID()); end --[[ function CTA_InitLinks() local old_SetItemRef = SetItemRef; function SetItemRef(link, text, button) for name, msg in string.gfind( link, "xhmsg:(%w+)(.+)" ) do if( ItemRefTooltip:IsVisible() and lastName and lastName == name ) then HideUIPanel(ItemRefTooltip); --ItemRefTooltip:Hide(); lastName = nil; else lastName = name; ShowUIPanel(ItemRefTooltip); if ( not ItemRefTooltip:IsVisible() ) then ItemRefTooltip:SetOwner(UIParent, "ANCHOR_PRESERVE"); end ItemRefTooltip:ClearLines(); --ItemRefTooltip:ClearAllPoints(); if( name == "eas" and msg == "eas" ) then ItemRefTooltip:AddLine( EAS_NOTE[1], 1, 0.5, 0 ); ItemRefTooltip:AddLine( EAS_NOTE[2], 1, 1, 1, 1, 1 ); ItemRefTooltip:AddLine( EAS_NOTE[3] ); else ItemRefTooltip:AddLine( "Message", 0.5, 0.5, 1 ); ItemRefTooltip:AddLine( name ); ItemRefTooltip:AddLine( msg, 1, 1, 1, 1, 1 ); end ItemRefTooltip:Show(); -- --ShowUIPanel(ItemRefTooltip); --if ( not ItemRefTooltip:IsVisible() ) then -- ItemRefTooltip:SetOwner(UIParent, "ANCHOR_PRESERVE"); --end end return; end lastName = nil; old_SetItemRef(link, text, button); end local old_ChatFrame_OnEvent = ChatFrame_OnEvent; function ChatFrame_OnEvent(event) if( string.find( event, "CHAT_MSG" ) and arg1 and arg2 and string.len(arg1) > 16 ) then local argl = string.lower(arg1); local start; --, _ = string.find( argl, "enchanting"); local score = 100; if( not start ) then score = Sacha_LightSearch( arg1, "bracer chest boots weapon armor fiery demon slaying beast crusader" ); if( score > 0 and ( string.find( argl, "chant") or string.find( argl, "ench") ) ) then start = 1; end end if( start and Sacha_LightSearch( arg1, "trainer thorium item:" ) == 0 ) then arg1 = "|cff8888ff|Hxhmsg:"..arg2..""..arg1.."|h[Enchantments]|h|r"; if( string.find(argl, "wts") ) then arg1 = "WTS "..arg1; elseif( string.find(argl, "wtb") ) then arg1 = "WTB "..arg1; else arg1 = "Regarding "..arg1; end end end old_ChatFrame_OnEvent(event); end ChatPrintln( "|cffff8800|Hxhmsg:easeas|h[Enchanter Ad Shrinker]|h|r loaded." ); end ]]