--[[ Jamba - Jafula's Awesome Multi-Boxer Assistant Copyright 2008 - 2017 Michael "Jafula" Miller License: The MIT License ]]-- -- Create the addon using AceAddon-3.0 and embed some libraries. local AJM = LibStub( "AceAddon-3.0" ):NewAddon( "JambaTaxi", "JambaModule-1.0", "AceConsole-3.0", "AceEvent-3.0", "AceHook-3.0", "AceTimer-3.0" ) -- Get the Jamba Utilities Library. local JambaUtilities = LibStub:GetLibrary( "JambaUtilities-1.0" ) local JambaHelperSettings = LibStub:GetLibrary( "JambaHelperSettings-1.0" ) -- Constants and Locale for this module. AJM.moduleName = "Jamba-Taxi" AJM.settingsDatabaseName = "JambaTaxiProfileDB" AJM.chatCommand = "jamba-taxi" local L = LibStub( "AceLocale-3.0" ):GetLocale( AJM.moduleName ) AJM.parentDisplayName = L["Toon"] AJM.moduleDisplayName = L["Taxi"] -- Settings - the values to store and their defaults for the settings database. AJM.settings = { profile = { takeMastersTaxi = true, requestTaxiStop = true, changeTexiTime = 5, messageArea = JambaApi.DefaultMessageArea(), }, } -- Configuration. function AJM:GetConfiguration() local configuration = { name = AJM.moduleDisplayName, handler = AJM, type = 'group', childGroups = "tab", get = "JambaConfigurationGetSetting", set = "JambaConfigurationSetSetting", args = { push = { type = "input", name = L["Push Settings"], desc = L["Push the taxi settings to all characters in the team."], usage = "/jamba-taxi push", get = false, set = "JambaSendSettings", order = 4, guiHidden = true, }, }, } return configuration end ------------------------------------------------------------------------------------------------------------- -- Command this module sends. ------------------------------------------------------------------------------------------------------------- AJM.COMMAND_TAKE_TAXI = "JambaTaxiTakeTaxi" AJM.COMMAND_EXIT_TAXI = "JambaTaxiExitTaxi" ------------------------------------------------------------------------------------------------------------- -- Messages module sends. ------------------------------------------------------------------------------------------------------------- -- Taxi has been taken, no parameters. AJM.MESSAGE_TAXI_TAKEN = "JambaTaxiTaxiTaken" ------------------------------------------------------------------------------------------------------------- -- Addon initialization, enabling and disabling. ------------------------------------------------------------------------------------------------------------- -- Initialise the module. function AJM:OnInitialize() AJM.jambaTakesTaxi = false AJM.jambaLeavsTaxi = false -- Create the settings control. AJM:SettingsCreate() -- Initialse the JambaModule part of this module. AJM:JambaModuleInitialize( AJM.settingsControl.widgetSettings.frame ) -- Populate the settings. AJM:SettingsRefresh() end -- Called when the addon is enabled. function AJM:OnEnable() -- Hook the TaketaxiNode function. AJM:SecureHook( "TakeTaxiNode" ) AJM:SecureHook( "TaxiRequestEarlyLanding" ) AJM:RegisterMessage( JambaApi.MESSAGE_MESSAGE_AREAS_CHANGED, "OnMessageAreasChanged" ) end -- Called when the addon is disabled. function AJM:OnDisable() -- AceHook-3.0 will tidy up the hooks for us. end function AJM:SettingsCreate() AJM.settingsControl = {} -- Create the settings panel. JambaHelperSettings:CreateSettings( AJM.settingsControl, AJM.moduleDisplayName, AJM.parentDisplayName, AJM.SettingsPushSettingsClick ) local bottomOfInfo = AJM:SettingsCreateTaxi( JambaHelperSettings:TopOfSettings() ) AJM.settingsControl.widgetSettings.content:SetHeight( -bottomOfInfo ) -- Help local helpTable = {} JambaHelperSettings:CreateHelp( AJM.settingsControl, helpTable, AJM:GetConfiguration() ) end function AJM:SettingsPushSettingsClick( event ) AJM:JambaSendSettings() end function AJM:SettingsCreateTaxi( top ) local checkBoxHeight = JambaHelperSettings:GetCheckBoxHeight() local left = JambaHelperSettings:LeftOfSettings() local sliderHeight = JambaHelperSettings:GetSliderHeight() local headingHeight = JambaHelperSettings:HeadingHeight() local horizontalSpacing = JambaHelperSettings:GetHorizontalSpacing() local headingWidth = JambaHelperSettings:HeadingWidth( false ) local halfWidthSlider = (headingWidth - horizontalSpacing) / 2 local dropdownHeight = JambaHelperSettings:GetDropdownHeight() local verticalSpacing = JambaHelperSettings:GetVerticalSpacing() local movingTop = top JambaHelperSettings:CreateHeading( AJM.settingsControl, L["Taxi Options"], movingTop, false ) movingTop = movingTop - headingHeight AJM.settingsControl.checkBoxTakeMastersTaxi = JambaHelperSettings:CreateCheckBox( AJM.settingsControl, headingWidth, left, movingTop, L["Take Teams Taxi"], AJM.SettingsToggleTakeTaxi, L["Take the same flight as the any team member (Other Team Members must have NPC Flight Master window open)."] ) movingTop = movingTop - headingHeight AJM.settingsControl.checkBoxrequestStop = JambaHelperSettings:CreateCheckBox( AJM.settingsControl, headingWidth, left, movingTop, L["Request Taxi Stop with Master"], AJM.SettingsTogglerequestStop ) movingTop = movingTop - headingHeight movingTop = movingTop - headingHeight AJM.settingsControl.changeTexiTime = JambaHelperSettings:CreateSlider( AJM.settingsControl, halfWidthSlider, left, movingTop, L["Clones To Take Taxi After Master"] ) AJM.settingsControl.changeTexiTime:SetSliderValues( 0, 10, 1 ) AJM.settingsControl.changeTexiTime:SetCallback( "OnValueChanged", AJM.SettingsChangeTaxiTimer ) --movingTop = movingTop - halfWidthSlider movingTop = movingTop - sliderHeight - verticalSpacing AJM.settingsControl.dropdownMessageArea = JambaHelperSettings:CreateDropdown( AJM.settingsControl, headingWidth, left, movingTop, L["Message Area"] ) AJM.settingsControl.dropdownMessageArea:SetList( JambaApi.MessageAreaList() ) AJM.settingsControl.dropdownMessageArea:SetCallback( "OnValueChanged", AJM.SettingsSetMessageArea ) movingTop = movingTop - dropdownHeight - verticalSpacing return movingTop end function AJM:OnMessageAreasChanged( message ) AJM.settingsControl.dropdownMessageArea:SetList( JambaApi.MessageAreaList() ) end function AJM:SettingsSetMessageArea( event, value ) AJM.db.messageArea = value AJM:SettingsRefresh() end function AJM:SettingsToggleTakeTaxi( event, checked ) AJM.db.takeMastersTaxi = checked AJM:SettingsRefresh() end --ebs function AJM:SettingsTogglerequestStop( event, checked ) AJM.db.requestTaxiStop = checked AJM:SettingsRefresh() end function AJM:SettingsChangeTaxiTimer( event, value ) AJM.db.changeTexiTime = tonumber( value ) AJM:SettingsRefresh() end -- Settings received. function AJM:JambaOnSettingsReceived( characterName, settings ) if characterName ~= AJM.characterName then -- Update the settings. AJM.db.takeMastersTaxi = settings.takeMastersTaxi AJM.db.requestTaxiStop = settings.requestTaxiStop AJM.db.changeTexiTime = settings.changeTexiTime AJM.db.messageArea = settings.messageArea -- Refresh the settings. AJM:SettingsRefresh() -- Tell the player. AJM:Print( L["Settings received from A."]( characterName ) ) -- Tell the team? --AJM:JambaSendMessageToTeam( AJM.db.messageArea, L["Settings received from A."]( characterName ), false ) end end function AJM:BeforeJambaProfileChanged() end function AJM:OnJambaProfileChanged() AJM:SettingsRefresh() end function AJM:SettingsRefresh() AJM.settingsControl.checkBoxTakeMastersTaxi:SetValue( AJM.db.takeMastersTaxi ) AJM.settingsControl.checkBoxrequestStop:SetValue( AJM.db.requestTaxiStop ) AJM.settingsControl.dropdownMessageArea:SetValue( AJM.db.messageArea ) AJM.settingsControl.changeTexiTime:SetValue( AJM.db.changeTexiTime ) end ------------------------------------------------------------------------------------------------------------- -- JambaTaxi functionality. ------------------------------------------------------------------------------------------------------------- -- Take a taxi. local function TakeTaxi( sender, nodeName ) -- If the take masters taxi option is on. if AJM.db.takeMastersTaxi == true then -- If the sender was not this character and is the master then... if sender ~= AJM.characterName then -- Find the index of the taxi node to fly to. local nodeIndex = nil for iterateNodes = 1, NumTaxiNodes() do if TaxiNodeName( iterateNodes ) == nodeName then nodeIndex = iterateNodes break end end -- If a node index was found... if nodeIndex ~= nil then -- Send a message to any listeners that a taxi is being taken. AJM:SendMessage( AJM.MESSAGE_TAXI_TAKEN ) -- Take a taxi. AJM.jambaTakesTaxi = true AJM:ScheduleTimer( "TakeTimedTaxi", AJM.db.changeTexiTime , nodeIndex ) --GetNumRoutes( nodeIndex ) --TakeTaxiNode( nodeIndex ) else -- Tell the master that this character could not take the same flight. AJM:JambaSendMessageToTeam( AJM.db.messageArea, L["I am unable to fly to A."]( nodeName ), false ) end end end end function AJM.TakeTimedTaxi( event, nodeIndex, ...) if nodeIndex ~= nil then GetNumRoutes( nodeIndex ) TakeTaxiNode( nodeIndex ) end end -- Called after the character has just taken a flight (hooked function). function AJM:TakeTaxiNode( taxiNodeIndex ) -- If the take masters taxi option is on. if AJM.db.takeMastersTaxi == true then -- Get the name of the node flown to. local nodeName = TaxiNodeName( taxiNodeIndex ) if AJM.jambaTakesTaxi == false then -- Tell the other characters about the taxi. AJM:JambaSendCommandToTeam( AJM.COMMAND_TAKE_TAXI, nodeName ) end AJM.jambaTakesTaxi = false end end -- exit taxi with team ebony local function LeaveTaxi ( sender ) if AJM.db.requestTaxiStop == true then if sender ~= AJM.characterName then AJM.jambaLeavsTaxi = true TaxiRequestEarlyLanding() AJM:JambaSendMessageToTeam( AJM.db.messageArea, L["I Have Requested a Stop From X"]( sender ), false ) end end end function AJM.TaxiRequestEarlyLanding( sender ) -- If the take masters taxi option is on. if AJM.db.requestTaxiStop == true then if UnitOnTaxi( "player" ) and CanExitVehicle() == true then if AJM.jambaLeavsTaxi == false then -- Send a message to any listeners that a taxi is being taken. AJM:JambaSendCommandToTeam ( AJM.COMMAND_EXIT_TAXI ) end end AJM.jambaLeavsTaxi = false end end -- A Jamba command has been received. function AJM:JambaOnCommandReceived( characterName, commandName, ... ) if characterName ~= self.characterName then -- If the command was to take a taxi... if commandName == AJM.COMMAND_TAKE_TAXI then -- If not already on a taxi... if not UnitOnTaxi( "player" ) then -- And if the taxi frame is open... -- 7.0.3 Added support for FlightMapFrame for legion flightMastrers. --ebony if TaxiFrame_ShouldShowOldStyle() == true then if TaxiFrame:IsVisible() then TakeTaxi( characterName, ... ) end else if FlightMapFrame:IsVisible() then TakeTaxi( characterName, ... ) end end end end if commandName == AJM.COMMAND_EXIT_TAXI then if UnitOnTaxi ( "player") then LeaveTaxi ( characterName, ... ) end end end end JambaApi.Taxi = {} JambaApi.Taxi.MESSAGE_TAXI_TAKEN = AJM.MESSAGE_TAXI_TAKEN