You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

261 lines
6.8 KiB

local _, addon = ...
--Required CVar: SoftTargetNameplateInteract = 1
--User Settings
local USE_NAMPLATE_GOSSIP = false;
local ANCHOR_OFFSET_Y = 24;
------------------
local FadeFrame = addon.API.UIFrameFade;
local SplitParagraph = addon.API.SplitParagraph;
local CloseGossipInteraction = addon.API.CloseGossipInteraction;
local GetTextReadingTime = addon.API.GetTextReadingTime;
local UnitExists = UnitExists;
local UnitIsUnit = UnitIsUnit;
local UnitGUID = UnitGUID;
local UnitName = UnitName;
local GetGossipText = C_GossipInfo.GetText;
local GetNamePlateForUnit = C_NamePlate.GetNamePlateForUnit;
local Controller = CreateFrame("Frame");
local NameplateGossip = CreateFrame("Frame", nil, UIParent);
addon.NameplateGossip = NameplateGossip;
NameplateGossip:SetSize(4, 4);
NameplateGossip:Hide();
NameplateGossip:SetScript("OnHide", function(self)
self:Hide();
end);
local FORMAT_SAY = addon.L["Format Monster Say"];
local function AddMessageAsChat(name, msg)
msg = string.gsub(msg, "[%c]+", "\n");
ChatFrame1:AddMessage(FORMAT_SAY:format(name)..msg, 1, 1, 0.62);
end
local function OnUpdate_ShowText(self, elapsed)
self.t = self.t + elapsed;
if self.t >= 0 then
self:SetScript("OnUpdate", nil);
if Controller:AnchorToNameplate() then
NameplateGossip:DisplayNextParagraph();
end
end
end
local function OnUpdate_CloseGossip(self, elapsed)
self.t = self.t + elapsed;
if self.t >= 0 then
CloseGossipInteraction();
self.t = -0.25;
self:SetScript("OnUpdate", OnUpdate_ShowText);
end
end
local function GetNPCNampelate()
--nameplate may not be ready immediately
return GetNamePlateForUnit("softinteract");
--[[
if UnitExists("npc") then
for _, nameplate in ipairs(C_NamePlate.GetNamePlates()) do
if UnitIsUnit("npc", nameplate.namePlateUnitToken) then
return nameplate
end
end
end
--]]
end
function Controller:OnEvent(event, ...)
if event == "PLAYER_SOFT_INTERACT_CHANGED" then
local oldTarget, newTarget = ...; --GUID
self.interactGUID = newTarget;
end
end
function Controller:EnableModule(state)
USE_NAMPLATE_GOSSIP = state;
if state then
self:RegisterEvent("PLAYER_SOFT_INTERACT_CHANGED");
self:SetScript("OnEvent", self.OnEvent);
else
self:UnregisterEvent("PLAYER_SOFT_INTERACT_CHANGED");
self:SetScript("OnEvent", nil);
self:Cancel();
NameplateGossip:Clear();
end
end
--Controller:EnableModule(true); --debug
function Controller:Cancel()
self:SetScript("OnUpdate", nil);
end
function Controller:StartShowTextCountdown()
self.t = -0.1;
self:SetScript("OnUpdate", OnUpdate_CloseGossip);
end
function Controller:IsUnitSameNPC()
if UnitExists("softinteract") then
local guid = UnitGUID("softinteract");
return guid == self.lastNPCGUID
end
end
function Controller:IsLastInteractNPC()
if self.interactGUID then
--print(self.interactGUID, UnitGUID("npc"))
return self.interactGUID == UnitGUID("npc")
end
return false
end
function Controller:InitiateInteraction()
self:Cancel();
self.lastNPCGUID = UnitGUID("npc") or "none";
self:StartShowTextCountdown();
end
function Controller:AnchorToNameplate()
local success = false;
if self:IsUnitSameNPC() then
local nameplate = GetNPCNampelate();
if nameplate then
NameplateGossip:SetParent(nameplate);
NameplateGossip:SetPoint("CENTER", nameplate, "CENTER", 0, ANCHOR_OFFSET_Y);
success = true;
end
end
return success
end
function NameplateGossip:Init()
self:SetFrameStrata("HIGH");
self:SetIgnoreParentScale(true);
self:SetIgnoreParentAlpha(false);
self.Text = self:CreateFontString(nil, "OVERLAY", "DUIFont_NameplateGossip");
self.Text:SetJustifyV("BOTTOM");
self.Text:SetJustifyH("CENTER");
self.Text:SetPoint("BOTTOM", self, "BOTTOM", 0, 0);
self.Text:SetWidth(272);
self.Text:SetSpacing(2);
self.Text:SetTextColor(1, 1, 0.62);
local corner = 16;
self.Background = self:CreateTexture(nil, "BACKGROUND");
self.Background:SetTextureSliceMargins(corner, corner, corner, corner);
self.Background:SetTextureSliceMode(1);
self.Background:SetTexture("Interface/AddOns/DialogueUI/Art/Theme_Shared/NameplateDialogShadow.png");
self.Background:SetPoint("CENTER", self.Text, "CENTER", 0, 0);
self.Init = nil;
end
function NameplateGossip:RequestDisplayGossip()
if self.Init then
self:Init();
end
self:Clear();
Controller:InitiateInteraction();
local gossipText = GetGossipText();
local name = UnitName("npc");
AddMessageAsChat(name, gossipText);
self.paragraphs = SplitParagraph(gossipText);
self.numPages = #self.paragraphs;
self.showPageNumber = self.numPages > 1;
self.page = 0;
return true
end
function NameplateGossip:SetText(text)
self.Text:SetText(text);
local width = self.Text:GetWrappedWidth();
local height = self.Text:GetHeight();
self.Background:SetSize(width + 24, height + 24);
end
function NameplateGossip:Clear()
self:ClearAllPoints();
self:Hide();
self:SetScript("OnUpdate", nil);
if self.Text then
self.Text:SetText(nil);
end
end
function NameplateGossip:ShowPageNumber(state)
if state then
else
end
end
local function OnUpdate_ShowNextParagraph(self, elapsed)
self.t = self.t + elapsed;
if self.t >= 0 then
self:DisplayNextParagraph();
end
end
function NameplateGossip:DisplayNextParagraph()
self.page = self.page + 1;
if self.page > self.numPages then
self:SetScript("OnUpdate", nil);
self.paragraphs = nil;
FadeFrame(self, 0.5, 0);
else
local paragraph = self.paragraphs[self.page];
self:SetText(paragraph);
local delay = GetTextReadingTime(paragraph);
self.t = -delay;
self:SetScript("OnUpdate", OnUpdate_ShowNextParagraph);
FadeFrame(self, 0.25, 1, 0);
self:ShowPageNumber(self.showPageNumber);
end
end
function NameplateGossip:ShouldUseNameplate()
if USE_NAMPLATE_GOSSIP then
if Controller:IsLastInteractNPC() then
--print("YES UNIT")
return true
else
--print("NOT LAST UNIT")
end
end
return false
end
do
local function Settings_NameplateDialogEnabled(dbValue)
Controller:EnableModule(dbValue == true);
end
addon.CallbackRegistry:Register("SettingChanged.NameplateDialogEnabled", Settings_NameplateDialogEnabled);
end