cokedrivers |
07-04-17 07:14 AM |
Quote:
Originally Posted by SDPhantom
(Post 324075)
You need a UnitID to be able to get reaction colors. I'm guessing since you're using GUID that this is coming from a chat event, which can come from things without valid UnitIDs.
|
Thanks for the reply.
Here is the whole code I'm trying to use. As I said before I'm not a great code writer.
Code:
------------------------------------------------------------------------
-- Chat Bubbles
------------------------------------------------------------------------
local settings = {
fontSender = {"Fonts\\FRIZQT__.TTF", 12},
showSender = true,
}
-- Events & corresponding cVars
local events = {
CHAT_MSG_SAY = "chatBubbles", CHAT_MSG_YELL = "chatBubbles",
CHAT_MSG_PARTY = "chatBubblesParty", CHAT_MSG_PARTY_LEADER = "chatBubblesParty",
CHAT_MSG_MONSTER_SAY = "chatBubbles", CHAT_MSG_MONSTER_YELL = "chatBubbles", CHAT_MSG_MONSTER_PARTY = "chatBubblesParty",
}
-- WorldFrame frames are always uiScaled it seems
local function FixedScale(len)
return GetScreenHeight() * len / 768
end
local function RotateCoordPair(x, y, ox, oy, a, asp)
y = y / asp
oy = oy / asp
return ox + (x - ox) * math.cos(a) - (y - oy) * math.sin(a),
(oy + (y - oy) * math.cos(a) + (x - ox) * math.sin(a)) * asp
end
-- Clip + rotate texture
local function SetRotatedTexCoords(tex, left, right, top, bottom, width, height, angle, originx, originy)
local ratio, angle, originx, originy = width / height, math.rad(angle), originx or 0.5, originy or 1
local LRx, LRy = RotateCoordPair(left, top, originx, originy, angle, ratio)
local LLx, LLy = RotateCoordPair(left, bottom, originx, originy, angle, ratio)
local ULx, ULy = RotateCoordPair(right, top, originx, originy, angle, ratio)
local URx, URy = RotateCoordPair(right, bottom, originx, originy, angle, ratio)
tex:SetTexCoord(LRx, LRy, LLx, LLy, ULx, ULy, URx, URy)
end
-- Skin a new frame
local function SkinFrame(frame)
for i = 1, select("#", frame:GetRegions()) do
local region = select(i, frame:GetRegions())
if region:GetObjectType() == "FontString" then
frame.text = region
end
end
-- Chat text
frame.text:SetFontObject('SystemFont_Small')
frame.text:SetJustifyH('LEFT')
-- Sender text
if settings.showSender then
frame.sender = frame:CreateFontString(nil, 'OVERLAY', 'NumberFont_Outline_Med')
frame.sender:SetPoint('BOTTOMLEFT', frame.text, 'TOPLEFT', 0, 4)
frame.sender:SetJustifyH('LEFT')
end
-- Border
frame:ClearAllPoints()
frame:SetPoint("TOPLEFT", frame.text, -7, settings.showSender and 10 + FixedScale(settings.fontSender[2]) or 7)
frame:SetPoint("BOTTOMRIGHT", frame.text, 7, -7)
frame:SetBackdrop({
bgFile = 'Interface\\Tooltips\\UI-Tooltip-Background',
edgeFile = 'Interface\\Tooltips\\UI-Tooltip-Border',
tile = true,
tileSize = 16,
edgeSize = 12,
insets = {left=3, right=3, top=3, bottom=3},
})
frame:SetBackdropColor(0, 0, 0, 1)
-- Hide Chat Bubble Tail
local bottom, tail
for i = 1, select("#", frame:GetRegions()) do
local region = select(i, frame:GetRegions())
if region:GetObjectType() == "Texture" then
if ({region:GetPoint()})[1] == "BOTTOMLEFT" and region:GetPoint(2) then
bottom = region
elseif region:GetTexture() == "Interface\\Tooltips\\ChatBubble-Tail" then
tail = region
end
end
end
tail:ClearAllPoints()
tail:Hide()
frame:HookScript("OnHide", function() frame.inUse = false end)
end
-- Update a frame
local function UpdateFrame(frame, guid, name)
if not frame.text then SkinFrame(frame) end
frame.inUse = true
if settings.showSender then
local class
if guid ~= nil and guid ~= "" then
_, class, _, _, _, _ = GetPlayerInfoByGUID(guid)
end
if name then
local color = RAID_CLASS_COLORS[class] or { r = 157/255, g = 197/255, b = 255/255 }
frame.sender:SetText(("|cFF%2x%2x%2x%s|r"):format(color.r * 255, color.g * 255, color.b * 255, name))
if frame.text:GetWidth() < frame.sender:GetWidth() then
frame.text:SetWidth(frame.sender:GetWidth())
end
end
end
end
-- Find chat bubble with given message
local function FindFrame(msg)
for i = 1, WorldFrame:GetNumChildren() do
local frame = select(i, WorldFrame:GetChildren())
if not frame:GetName() and not frame.inUse then
for i = 1, select("#", frame:GetRegions()) do
local region = select(i, frame:GetRegions())
if region:GetObjectType() == "FontString" and region:GetText() == msg then
return frame
end
end
end
end
end
local f = CreateFrame("Frame")
for event, cvar in pairs(events) do f:RegisterEvent(event) end
f:SetScript("OnEvent", function(self, event, msg, sender, _, _, _, _, _, _, _, _, _, guid)
if GetCVarBool(events[event]) then
f.elapsed = 0
f:SetScript("OnUpdate", function(self, elapsed)
self.elapsed = self.elapsed + elapsed
local frame = FindFrame(msg)
if frame or self.elapsed > 0.3 then
f:SetScript("OnUpdate", nil)
if frame then UpdateFrame(frame, guid, sender) end
end
end)
end
end)
Thanks again for any help with this.
Coke
|