-- Author : Chrono -- Create Date : 3/29/2020 4:39:46 PM local _, Import = ...; local ellyb, loc, Color, ColorManager; local NPC_TALK_PATTERNS; local settings; local ChatBubblePool = Import.ChatBubblePool local function makeBubbleForNPCChat(_, event, message, ...) if event == "CHAT_MSG_EMOTE" then local senderGUID = select(11, ...); local playerGUID = UnitGUID("player"); local npcName = TRP3_API.chat.getNPCMessageName() if senderGUID == playerGUID or settings.get("GENERATE_TOTAL_RP3_BUBBLES_FOR_OTHER_PLAYERS") then if npcName then for talkType, talkChannel in pairs(NPC_TALK_PATTERNS) do if message:find(talkType) then local color; local myMessage = message; local normalColor = ColorManager.getChatColorForChannel(talkChannel); local normalColorAsString = normalColor:GetColorCodeStartSequence(); local nameColor; --Detect colour alterations. We need to remove it temporarily to remove the start. if myMessage:sub(1,2) == "|c" then color = myMessage:sub(1,10); --Save this to prepend back later myMessage = myMessage:sub(11); end if npcName:sub(1,2) == "|c" and npcName:sub(-2) == "|r" then --If the name is not in the default color scheme, save it to be set later --Otherwise, we'll replace the name color with ChatBubble's default name colour. if npcName:sub(1,10) ~= normalColorAsString then nameColor = Color.static.CreateFromHexa(npcName:sub(1,10)); else --Strip out the |c and |r tags so they don't get in the way of SetName() npcName = npcName:sub(11); npcName = npcName:sub(1,-3); end end local len = talkType:len(); --Remove the "says:" from the beginning of the message. if myMessage:sub(1, len) == talkType then local actualMessage = myMessage:sub(len+1); --Remove leading spaces if any if actualMessage:sub(1,1) == " " then actualMessage = actualMessage:sub(2); end actualMessage = color .. actualMessage; local chatBubble = ChatBubblePool.getChatBubble() chatBubble:SetName(npcName); chatBubble:SetMessage(actualMessage); if nameColor then chatBubble:SetNameColor(nameColor:GetRGBA()) end end break; end end end end end return false, message, ... end function initTRP3Vars(self) ellyb = TRP3_API.Ellyb; loc = TRP3_API.loc; Color = ellyb.Color; ColorManager = ellyb.ColorManager; NPC_TALK_PATTERNS = { [loc.NPC_TALK_SAY_PATTERN] = "MONSTER_SAY", [loc.NPC_TALK_YELL_PATTERN] = "MONSTER_YELL", [loc.NPC_TALK_WHISPER_PATTERN] = "MONSTER_WHISPER", }; end function TotalRP3_onStart() settings = Import.settings; if TRP3_API then initTRP3Vars(); Import.SharedFunctions.GetUnitNameAndColor = GetNameAndColorFromTotalRP3; for _, channel in pairs(POSSIBLE_CHANNELS) do ChatFrame_RemoveMessageEventFilter(channel, makeBubbleForNPCChat); if settings.get("GENERATE_TOTAL_RP3_BUBBLES") then ChatFrame_AddMessageEventFilter(channel, makeBubbleForNPCChat); end end --Don't re-queue BCI's chat handler. It's important for BCI's handler to go first before -- TotalRP3 as TotalRP3's modifications to the chat message (e.g. colouring) -- are not propagated to the chat bubble, and BlizzChatIntegration.lua relies on -- using the message as a common key between the chat message and chat bubble -- to map the chat bubble to a character name. --Import.modules.BlizzChatIntegration:ResetChatHandler() end end function GetNameAndColorFromTotalRP3(unitId) if unitId == "player" then trp3Name, color = getPlayerTRP3NameAndColor(); elseif unitId == "target" then trp3Name, color = getTargetTRP3NameAndColor(); end if trp3Name ~= nil then return trp3Name, color; end --Fallback to UnitName return UnitName(unitId), nil; end function getPlayerTRP3NameAndColor() local getTRP3Data = TRP3_API.profile.getData local getFullnameUsingChatMethod = TRP3_API.chat.getFullnameUsingChatMethod; local playerData = getTRP3Data("player"); local trp3Name = getFullnameUsingChatMethod(playerData); local unitId = "player"; local nameColor = getPlayerNameColor(trp3Name); return trp3Name, nameColor; end function getPlayerNameColor() local GetClassColorByGUID = TRP3_API.utils.color.GetClassColorByGUID; local configShowNameCustomColors = TRP3_API.chat.configShowNameCustomColors; local guid = UnitGUID("player"); local player = AddOn_TotalRP3.Player.static.CreateFromGUID(guid) if GetCVar("chatClassColorOverride") ~= "1" then characterColor = GetClassColorByGUID(guid); end if configShowNameCustomColors() then characterColor = player:GetCustomColorForDisplay() or characterColor; end return characterColor; end function getTargetTRP3NameAndColor() local getUnitID = TRP3_API.utils.str.getUnitID; local companionIDToInfo = TRP3_API.utils.str.companionIDToInfo; local unitIDToInfo = TRP3_API.utils.str.unitIDToInfo; local configShowNameCustomColors = TRP3_API.chat.configShowNameCustomColors; local targetID = getTargetId("target"); if targetID == nil then return nil; end local owner, companionID = companionIDToInfo(targetID); local profile = getCompanionInfo(owner, companionID, targetID); if profile and profile.data then local targetName = profile.data.NA or companionID; local customColor = nil; if configShowNameCustomColors() then customColor = getTargetsNameColor(profile); end return targetName, customColor; end return nil; end --Straight port of TRP3's target_frame.lua:getCompanionInfo() function getCompanionInfo(owner, companionID, currentTargetId) local profile; local Globals = TRP3_API.globals; local getCompanionProfile = TRP3_API.companions.player.getCompanionProfile; local getCompanionRegisterProfile = TRP3_API.companions.register.getCompanionProfile; if owner == Globals.player_id then profile = getCompanionProfile(companionID) or EMPTY; else profile = getCompanionRegisterProfile(currentTargetId); end return profile; end function getTargetsNameColor(profile) local Color = TRP3_API.Ellyb.Color; local customColor = profile.data.NH; if customColor then customColor = Color(profile.data.NH); if AddOn_TotalRP3.Configuration.shouldDisplayIncreasedColorContrast() then customColor:LightenColorUntilItIsReadableOnDarkBackgrounds(); end end return customColor; end --Basically a straight port of target_frame.lua's onTargetChanged() function getTargetId() local getTargetType, getCompanionFullID = TRP3_API.ui.misc.getTargetType, TRP3_API.ui.misc.getCompanionFullID; local TYPE_CHARACTER = TRP3_API.ui.misc.TYPE_CHARACTER; local TYPE_PET = TRP3_API.ui.misc.TYPE_PET; local TYPE_BATTLE_PET = TRP3_API.ui.misc.TYPE_BATTLE_PET; local TYPE_NPC = TRP3_API.ui.misc.TYPE_NPC; currentTargetType = getTargetType("target"); if currentTargetType == TYPE_CHARACTER then return getUnitID("target"); elseif currentTargetType == TYPE_NPC then return TRP3_API.utils.str.getUnitNPCID("target"); end return getCompanionFullID("target", currentTargetType); end --Import.modules["TotalRP3"] = { -- name="TotalRP3", -- onStart = TotalRP3_onStart; --} POSSIBLE_CHANNELS = { "CHAT_MSG_SAY", "CHAT_MSG_YELL", "CHAT_MSG_EMOTE", "CHAT_MSG_TEXT_EMOTE", "CHAT_MSG_PARTY", "CHAT_MSG_PARTY_LEADER", "CHAT_MSG_RAID", "CHAT_MSG_RAID_LEADER", "CHAT_MSG_GUILD", "CHAT_MSG_OFFICER", "CHAT_MSG_WHISPER", "CHAT_MSG_WHISPER_INFORM" }; local MODULE_STRUCTURE = { ["name"] = "Roleplay Chat Bubbles", ["description"] = "Module for integrating TotalRP3's chatframe system with Roleplay Chat Bubbles.", ["version"] = 1.000, ["id"] = "rp_chatBubbles", ["onStart"] = TotalRP3_onStart, ["minVersion"] = 3, }; if TRP3_API then TRP3_API.module.registerModule(MODULE_STRUCTURE); end