-- ================================================================================ -- -- EMA - ( Ebony's MultiBoxing Assistant ) -- -- Current Author: Jennifer Cally (Ebony) -- -- -- -- License: All Rights Reserved 2018-2019 Jennifer Cally -- -- -- -- Some Code Used from "Jamba" that is -- -- Released under the MIT License -- -- "Jamba" Copyright 2008-2015 Michael "Jafula" Miller -- -- -- -- ================================================================================ -- -- Create the addon using AceAddon-3.0 and embed some libraries. local EMA = LibStub( "AceAddon-3.0" ):NewAddon( "ISBoxer", "Module-1.0", "AceConsole-3.0", "AceEvent-3.0", "AceHook-3.0", "AceTimer-3.0" ) -- Get the EMA Utilities Library. local EMAUtilities = LibStub:GetLibrary( "EbonyUtilities-1.0" ) local EMAHelperSettings = LibStub:GetLibrary( "EMAHelperSettings-1.0" ) local ISBoxerAddon = IsAddOnLoaded("Isboxer" ) local AceGUI = LibStub( "AceGUI-3.0" ) -- Constants and Locale for this module. EMA.moduleName = "ISBoxer" EMA.settingsDatabaseName = "ISBoxerProfileDB" EMA.chatCommand = "ema-isboxer" local L = LibStub( "AceLocale-3.0" ):GetLocale( "Core" ) EMA.parentDisplayName = L["TEAM"] EMA.moduleDisplayName = L["ISBOXER"] -- Icon EMA.moduleIcon = "Interface\\Addons\\EMA\\Media\\ISBoxerIcon.tga" -- order EMA.moduleOrder = 30 -- Settings - the values to store and their defaults for the settings database. EMA.settings = { profile = { messageArea = EMAApi.DefaultMessageArea(), isboxerTeamList = {}, isboxerTeamName = L["N/A"], isboxerSync = false, }, } -- Configuration. function EMA:GetConfiguration() local configuration = { name = EMA.moduleDisplayName, handler = EMA, type = 'group', childGroups = "tab", get = "EMAConfigurationGetSetting", set = "EMAConfigurationSetSetting", args = { config = { type = "input", name = L["OPEN_CONFIG"], desc = L["OPEN_CONFIG_HELP"], usage = "/ema-isboxer config", get = false, set = "", }, push = { type = "input", name = L["PUSH_SETTINGS"], desc = L["PUSH_ALL_SETTINGS"], usage = "/ema-isboxer push", get = false, set = "EMASendSettings", guiHidden = true, }, iammaster = { type = "input", name = L["ISBOXER_SET_MASTER"], desc = L["ISBOXER_COMMAND_LINE_HELP"], usage = "/ema-isboxer iammaster <group>", get = false, set = "CommandIAmMasterIsboxer", guiHidden = true, }, strobeOnMe = { type = "input", name = L["ISBOXER_SET_STROBEONME"], desc = L["ISBOXER_COMMAND_LINE_HELP"], usage = "/ema-isboxer strobeOnMe <group>", get = false, set = "FollowStrobeOnMeCommandIsboxer", guiHidden = true, }, strobeoff = { type = "input", name = L["ISBOXER_SET_STROBEOFF"], desc = L["ISBOXER_COMMAND_LINE_HELP"], usage = "/ema-isboxer strobeoff <group>", get = false, set = "FollowStrobeOffCommandIsboxer", guiHidden = true, }, snw = { type = "input", name = L["ISBOXER_SET_SNW"], desc = L["ISBOXER_COMMAND_LINE_HELP"], usage = "/ema-isboxer snw", get = false, set = "FollowStrobeOffCommandSnw", guiHidden = true, }, }, } return configuration end ------------------------------------------------------------------------------------------------------------- -- CommandLines for this module sends. (cross "Jamba" Support) for isboxer ------------------------------------------------------------------------------------------------------------- function EMA:ChatCommandTeam(input) if not input or input:trim() == "" then return else LibStub( "AceConfigCmd-3.0" ):HandleCommand( EMA.chatCommand, EMA.moduleName, input ) end end function EMA:ChatCommandFollow(input) --EMA:Print("test", input ) if not input or input:trim() == "" then return else LibStub( "AceConfigCmd-3.0" ):HandleCommand( EMA.chatCommand, EMA.moduleName, input ) end end function EMA:CommandIAmMasterIsboxer( info, parameters ) EMAApi.CommandIAmMaster( parameters ) end function EMA:FollowStrobeOnMeCommandIsboxer( info, parameters ) EMAApi.Follow.StrobeOnMeCommand( parameters ) end function EMA:FollowStrobeOffCommandIsboxer( info, parameters ) EMAApi.Follow.StrobeOffCommand( parameters ) end function EMA:FollowStrobeOffCommandSnw( info, parameters ) end ------------------------------------------------------------------------------------------------------------- -- Messages module sends. ------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------- -- Popup Dialogs. ------------------------------------------------------------------------------------------------------------- local function InitializePopupDialogs() StaticPopupDialogs["EMAISBoxer_CONFIRM_REMOVE_ISBoxer_ITEMS"] = { text = L["REMOVE_ISBOXER_LIST"], button1 = YES, button2 = NO, timeout = 0, whileDead = 1, hideOnEscape = 1, OnAccept = function() EMA:RemoveItem() end, } end ------------------------------------------------------------------------------------------------------------- -- Addon initialization, enabling and disabling. ------------------------------------------------------------------------------------------------------------- -- Initialise the module. function EMA:OnInitialize() -- Initialise the popup dialogs. InitializePopupDialogs() --EMA.autoISBoxerItemLink = L["N/A"] EMA.isboxerTeamName = L["N/A"] -- CommandLines for this module sends. (cross "Jamba" Support) for isboxer EMA:RegisterChatCommand("jamba-team", "ChatCommandTeam") EMA:RegisterChatCommand("jamba-follow", "ChatCommandFollow") EMA.autoISBoxerItemTag = EMAApi.AllTag() -- Create the settings control. EMA:SettingsCreate() -- Initialse the EMAModule part of this module. EMA:EMAModuleInitialize( EMA.settingsControl.widgetSettings.frame ) -- Populate the settings. EMA:SettingsRefresh() end -- Called when the addon is enabled. function EMA:OnEnable() EMA:RegisterEvent( "PLAYER_ENTERING_WORLD" ) --EMA:RegisterMessage( EMAApi.MESSAGE_MESSAGE_AREAS_CHANGED, "OnMessageAreasChanged" ) --EMA:RegisterMessage( EMAApi.GROUP_LIST_CHANGED , "OnGroupAreasChanged" ) end -- Called when the addon is disabled. function EMA:OnDisable() -- AceHook-3.0 will tidy up the hooks for us. end function EMA:SettingsCreate() EMA.settingsControl = {} -- Create the settings panel. EMAHelperSettings:CreateSettings( EMA.settingsControl, EMA.moduleDisplayName, EMA.parentDisplayName, EMA.SettingsPushSettingsClick, EMA.moduleIcon, EMA.moduleOrder ) local bottomOfInfo = EMA:SettingsCreateISBoxer( EMAHelperSettings:TopOfSettings() ) EMA.settingsControl.widgetSettings.content:SetHeight( -bottomOfInfo ) -- Help local helpTable = {} EMAHelperSettings:CreateHelp( EMA.settingsControl, helpTable, EMA:GetConfiguration() ) end function EMA:SettingsPushSettingsClick( event ) EMA:EMASendSettings() end function EMA:SettingsCreateISBoxer( top ) local buttonControlWidth = 85 local checkBoxHeight = EMAHelperSettings:GetCheckBoxHeight() local labelHeight = EMAHelperSettings:GetLabelHeight() local labelContinueHeight = EMAHelperSettings:GetContinueLabelHeight() local editBoxHeight = EMAHelperSettings:GetEditBoxHeight() local buttonHeight = EMAHelperSettings:GetButtonHeight() local dropdownHeight = EMAHelperSettings:GetDropdownHeight() local left = EMAHelperSettings:LeftOfSettings() local headingHeight = EMAHelperSettings:HeadingHeight() local headingWidth = EMAHelperSettings:HeadingWidth( false ) local horizontalSpacing = EMAHelperSettings:GetHorizontalSpacing() local verticalSpacing = EMAHelperSettings:GetVerticalSpacing() local ISBoxerWidth = headingWidth local dropBoxWidth = (headingWidth - horizontalSpacing) / 4 local movingTop = top -- A blank to get layout to show right? EMAHelperSettings:CreateHeading( EMA.settingsControl, L[""], movingTop, false ) movingTop = movingTop - headingHeight EMAHelperSettings:CreateHeading( EMA.settingsControl, L["ISBOXER_LIST_HEADER"], movingTop, false ) movingTop = movingTop - headingHeight EMA.settingsControl.ISBoxerItemsHighlightRow = 1 EMA.settingsControl.ISBoxerItemsOffset = 1 local list = {} list.listFrameName = "EMAISBoxerIteamsSettingsFrame" list.parentFrame = EMA.settingsControl.widgetSettings.content list.listTop = movingTop list.listLeft = left list.listWidth = ISBoxerWidth list.rowHeight = 20 list.rowsToDisplay = 10 list.columnsToDisplay = 3 list.columnInformation = {} list.columnInformation[1] = {} list.columnInformation[1].width = 10 list.columnInformation[1].alignment = "LEFT" list.columnInformation[2] = {} list.columnInformation[2].width = 70 list.columnInformation[2].alignment = "LEFT" list.columnInformation[3] = {} list.columnInformation[3].width = 20 list.columnInformation[3].alignment = "LEFT" list.scrollRefreshCallback = EMA.SettingsScrollRefresh list.rowClickCallback = EMA.SettingsISBoxerItemsRowClick EMA.settingsControl.ISBoxerItems = list EMAHelperSettings:CreateScrollList( EMA.settingsControl.ISBoxerItems ) movingTop = movingTop - list.listHeight - verticalSpacing EMAHelperSettings:CreateHeading( EMA.settingsControl, L["ISBOXER_SYNC_HEADER"], movingTop, false ) movingTop = movingTop - headingHeight -- Information line 1. EMA.settingsControl.labelSyncInformation1 = EMAHelperSettings:CreateContinueLabel( EMA.settingsControl, headingWidth, left, movingTop, L["SYNCINFORMATIONONE"] ) movingTop = movingTop - labelContinueHeight -- Information line 2. EMA.settingsControl.labelSyncInformation2 = EMAHelperSettings:CreateContinueLabel( EMA.settingsControl, headingWidth, left, movingTop, L["SYNCINFORMATIONTWO"] ) movingTop = movingTop - labelContinueHeight -- Information line 3. EMA.settingsControl.labelSyncInformation3 = EMAHelperSettings:CreateContinueLabel( EMA.settingsControl, headingWidth, left, movingTop, L["SYNCINFORMATIONTHREE"] ) movingTop = movingTop - labelHeight EMA.settingsControl.checkBoxISBoxerSnyc = EMAHelperSettings:CreateCheckBox( EMA.settingsControl, headingWidth, left, movingTop, L["CHECKBOX_ISBOXER_SYNC"], EMA.SettingsToggleIsboxerSync, L["CHECKBOX_ISBOXER_SYNC_HELP"] ) --[[ movingTop = movingTop - checkBoxHeight EMA.settingsControl.dropdownMessageArea = EMAHelperSettings:CreateDropdown( EMA.settingsControl, headingWidth, left, movingTop, L["MESSAGE_AREA"] ) EMA.settingsControl.dropdownMessageArea:SetList( EMAApi.MessageAreaList() ) EMA.settingsControl.dropdownMessageArea:SetCallback( "OnValueChanged", EMA.SettingsSetMessageArea ) ]] movingTop = movingTop - dropdownHeight - verticalSpacing return movingTop end ------------------------------------------------------------------------------------------------------------- -- Settings Callbacks. ------------------------------------------------------------------------------------------------------------- local function GetISBoxerTeamMaxPosition() return #EMA.db.isboxerTeamList end function EMA:GetISBoxerTeamAtPosition( position ) return EMA.db.isboxerTeamList[position] end local function GetCharacterNameAtOrderPosition( position ) local characterNameAtPosition = "" for characterPosition, characterName in pairs(EMA.db.isboxerTeamList) do if characterPosition == position then characterNameAtPosition = characterName break end end return characterNameAtPosition end function EMA:SettingsScrollRefresh() FauxScrollFrame_Update( EMA.settingsControl.ISBoxerItems.listScrollFrame, GetISBoxerTeamMaxPosition(), EMA.settingsControl.ISBoxerItems.rowsToDisplay, EMA.settingsControl.ISBoxerItems.rowHeight ) EMA.settingsControl.ISBoxerItemsOffset = FauxScrollFrame_GetOffset( EMA.settingsControl.ISBoxerItems.listScrollFrame ) for iterateDisplayRows = 1, EMA.settingsControl.ISBoxerItems.rowsToDisplay do -- Reset. EMA.settingsControl.ISBoxerItems.rows[iterateDisplayRows].columns[1].textString:SetText( "" ) EMA.settingsControl.ISBoxerItems.rows[iterateDisplayRows].columns[1].textString:SetTextColor( 1.0, 1.0, 1.0, 1.0 ) EMA.settingsControl.ISBoxerItems.rows[iterateDisplayRows].columns[2].textString:SetText( "" ) EMA.settingsControl.ISBoxerItems.rows[iterateDisplayRows].columns[2].textString:SetTextColor( 1.0, 1.0, 1.0, 1.0 ) EMA.settingsControl.ISBoxerItems.rows[iterateDisplayRows].columns[3].textString:SetText( "" ) EMA.settingsControl.ISBoxerItems.rows[iterateDisplayRows].columns[3].textString:SetTextColor( 1.0, 1.0, 1.0, 1.0 ) EMA.settingsControl.ISBoxerItems.rows[iterateDisplayRows].highlight:SetColorTexture( 0.0, 0.0, 0.0, 0.0 ) -- Get data. local dataRowNumber = iterateDisplayRows + EMA.settingsControl.ISBoxerItemsOffset if dataRowNumber <= GetISBoxerTeamMaxPosition() then -- Put data information into columns. local characterName = GetCharacterNameAtOrderPosition( dataRowNumber ) local teamName = EMA.db.isboxerTeamName EMA.settingsControl.ISBoxerItems.rows[iterateDisplayRows].columns[1].textString:SetText( dataRowNumber ) EMA.settingsControl.ISBoxerItems.rows[iterateDisplayRows].columns[2].textString:SetText( characterName ) EMA.settingsControl.ISBoxerItems.rows[iterateDisplayRows].columns[3].textString:SetText( teamName ) -- Highlight the selected row. --if dataRowNumber == EMA.settingsControl.ISBoxerItemsHighlightRow then -- EMA.settingsControl.ISBoxerItems.rows[iterateDisplayRows].highlight:SetColorTexture( 1.0, 1.0, 0.0, 0.5 ) --end end end end function EMA:SettingsISBoxerItemsRowClick( rowNumber, columnNumber ) --[[ if EMA.settingsControl.ISBoxerItemsOffset + rowNumber <= EMA:GetISBoxerItemsMaxPosition() then EMA.settingsControl.ISBoxerItemsHighlightRow = EMA.settingsControl.ISBoxerItemsOffset + rowNumber EMA:SettingsScrollRefresh() end ]] end --[[ function EMA:OnMessageAreasChanged( message ) EMA.settingsControl.dropdownMessageArea:SetList( EMAApi.MessageAreaList() ) end function EMA:OnGroupAreasChanged( message ) EMA.settingsControl.ISBoxerItemsEditBoxToonTag:SetList( EMAApi.GroupList() ) end function EMA:SettingsSetMessageArea( event, value ) EMA.db.messageArea = value EMA:SettingsRefresh() end ]] function EMA:SettingsToggleIsboxerSync( event, checked ) EMA.db.isboxerSync = checked EMA:SettingsRefresh() end -- Settings received. function EMA:EMAOnSettingsReceived( characterName, settings ) if characterName ~= EMA.characterName then -- Update the settings. EMA.db.isboxerSync = settings.isboxerSync --EMA.db.messageArea = settings.messageArea -- Refresh the settings. EMA:SettingsRefresh() -- Tell the player. EMA:Print( L["SETTINGS_RECEIVED_FROM_A"]( characterName ) ) end end function EMA:BeforeEMAProfileChanged() end function EMA:OnEMAProfileChanged() EMA:SettingsRefresh() end function EMA:SettingsRefresh() EMA.settingsControl.checkBoxISBoxerSnyc:SetValue ( EMA.db.isboxerSync ) --EMA.settingsControl.dropdownMessageArea:SetValue( EMA.db.messageArea ) EMA:SettingsScrollRefresh() end --Comms not sure if we going to use comms here. -- A EMA command has been received. function EMA:EMAOnCommandReceived( characterName, commandName, ... ) if characterName == self.characterName then return end end ------------------------------------------------------------------------------------------------------------- -- ISBoxer functionality. ------------------------------------------------------------------------------------------------------------- function EMA:PLAYER_ENTERING_WORLD(event, ... ) EMA:ScheduleTimer( "IsboxerSyncTeamList", 0.5 ) EMA:AddIsboxerMembers() end function EMA:AddIsboxerMembers() --table.wipe( EMA.db.isboxerTeamList ) if IsAddOnLoaded("Isboxer" ) == true then --EMA:Print("test") --local _, teamName, members = isboxer.CharacterSet for value, data in pairs( isboxer.CharacterSet ) do --EMA:Print("test",value, "data", data ) if value == "Members" then --EMA:Print("testMembersList") for isbSlot, characterName in pairs( data ) do if EMA.db.isboxerTeamList[isbSlot] == nil then EMA.db.isboxerTeamList[isbSlot] = characterName end end else --EMA:Print("testTeamListName", data ) EMA.db.isboxerTeamName = data end end end end local function IsboxerTeamList() return pairs( EMA.db.isboxerTeamList ) end local function IsStillInTeam( characterName ) local stillInTeam = false for value, data in pairs( isboxer.CharacterSet ) do --EMA:Print("test",value, "data", data ) if value == "Members" then --EMA:Print("testMembersList") for b, isboxerCharacterName in pairs( data ) do --EMA:Print("test", characterName, "vs", isboxerCharacterName ) if isboxerCharacterName == characterName then stillInTeam = true break end end end end return stillInTeam end function EMA:IsboxerSyncTeamList() if EMA.db.isboxerSync == true and IsAddOnLoaded("Isboxer" ) == true then for isbSlot, isboxerCharacterName in pairs( EMA.db.isboxerTeamList ) do --EMA:Print("test", isboxerCharacterName) local characterName = EMAUtilities:AddRealmToNameIfMissing( isboxerCharacterName ) if EMAApi.IsCharacterInTeam ( isboxerCharacterName ) == false and (characterName ~= EMA.characterName ) then --EMA:Print("NOT IN TEAM", isboxerCharacterName) EMAApi.AddMember( characterName ) elseif IsStillInTeam( characterName ) == false and (characterName ~= EMA.characterName ) then if EMAApi.IsCharacterInTeam ( characterName ) == true then --EMA:Print("NoLongerInTeam", characterName, isbSlot ) EMA.db.isboxerTeamList[isbSlot] = nil EMAApi.RemoveMember( characterName ) end end end end EMA:SettingsScrollRefresh() end EMAApi.IsboxerTeamList = IsboxerTeamList EMAApi.addisboxermembers = EMA.AddIsboxerMembers