Add files via upload
This commit is contained in:
@@ -0,0 +1,178 @@
|
||||
-- MainCharacterTag
|
||||
-- Prefixes guild and guild officer chat with your main character's name.
|
||||
-- Compatible with WoW 1.12.1
|
||||
|
||||
MainCharacterTagDB = MainCharacterTagDB or {}
|
||||
|
||||
local function GetMainName()
|
||||
return MainCharacterTagDB.mainName or ""
|
||||
end
|
||||
|
||||
local function SetMainName(name)
|
||||
name = string.gsub(name, "^%s*(.-)%s*$", "%1")
|
||||
MainCharacterTagDB.mainName = name
|
||||
end
|
||||
|
||||
local function IsCurrentCharMain()
|
||||
local currentChar = UnitName("player")
|
||||
local mainName = GetMainName()
|
||||
return mainName == "" or currentChar == mainName
|
||||
end
|
||||
|
||||
-- ============================================================
|
||||
-- Hook SendChatMessage to prepend the main name
|
||||
-- Only active after the player is fully in the world
|
||||
-- ============================================================
|
||||
local origSendChatMessage = SendChatMessage
|
||||
local playerReady = false
|
||||
|
||||
function SendChatMessage(msg, chatType, language, channel)
|
||||
if playerReady and msg and msg ~= "" and chatType then
|
||||
-- ignore macro directives
|
||||
if string.sub(msg, 1, 1) == "#" then
|
||||
return origSendChatMessage(msg, chatType, language, channel)
|
||||
end
|
||||
local upperType = string.upper(chatType)
|
||||
if (upperType == "GUILD" or upperType == "OFFICER") then
|
||||
local mainName = GetMainName()
|
||||
if mainName ~= "" and not IsCurrentCharMain() then
|
||||
msg = "(" .. mainName .. "): " .. msg
|
||||
end
|
||||
end
|
||||
end
|
||||
origSendChatMessage(msg, chatType, language, channel)
|
||||
end
|
||||
|
||||
-- ============================================================
|
||||
-- Options Frame (vanilla-compatible, no XML templates)
|
||||
-- ============================================================
|
||||
local optionsFrame = CreateFrame("Frame", "MainCharacterTagOptions", UIParent)
|
||||
optionsFrame:SetWidth(360)
|
||||
optionsFrame:SetHeight(200)
|
||||
optionsFrame:SetPoint("CENTER", UIParent, "CENTER")
|
||||
optionsFrame:SetBackdrop({
|
||||
bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background",
|
||||
edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border",
|
||||
tile = true, tileSize = 32, edgeSize = 32,
|
||||
insets = { left = 11, right = 12, top = 12, bottom = 11 },
|
||||
})
|
||||
optionsFrame:SetMovable(true)
|
||||
optionsFrame:EnableMouse(true)
|
||||
optionsFrame:RegisterForDrag("LeftButton")
|
||||
optionsFrame:SetScript("OnDragStart", function() optionsFrame:StartMoving() end)
|
||||
optionsFrame:SetScript("OnDragStop", function() optionsFrame:StopMovingOrSizing() end)
|
||||
optionsFrame:Hide()
|
||||
|
||||
-- Title bar text
|
||||
local titleText = optionsFrame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
||||
titleText:SetPoint("TOP", optionsFrame, "TOP", 0, -16)
|
||||
titleText:SetText("MainCharacterTag — Options")
|
||||
|
||||
-- Description
|
||||
local descText = optionsFrame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
|
||||
descText:SetPoint("TOPLEFT", optionsFrame, "TOPLEFT", 20, -42)
|
||||
descText:SetWidth(320)
|
||||
descText:SetJustifyH("LEFT")
|
||||
descText:SetText("Set your main character's name. Guild and officer chat\nsent from alts will be prefixed with that name.")
|
||||
|
||||
-- Current character label
|
||||
local currentLabel = optionsFrame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
|
||||
currentLabel:SetPoint("TOPLEFT", optionsFrame, "TOPLEFT", 20, -82)
|
||||
|
||||
-- Name input label
|
||||
local nameLabel = optionsFrame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
||||
nameLabel:SetPoint("TOPLEFT", optionsFrame, "TOPLEFT", 20, -108)
|
||||
nameLabel:SetText("Main Name:")
|
||||
|
||||
-- EditBox
|
||||
local nameInput = CreateFrame("EditBox", "MainCharacterTagInput", optionsFrame)
|
||||
nameInput:SetPoint("TOPLEFT", optionsFrame, "TOPLEFT", 100, -104)
|
||||
nameInput:SetWidth(230)
|
||||
nameInput:SetHeight(20)
|
||||
nameInput:SetAutoFocus(false)
|
||||
nameInput:SetMaxLetters(64)
|
||||
nameInput:SetFontObject(GameFontHighlight)
|
||||
nameInput:SetBackdrop({
|
||||
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
|
||||
edgeFile = "Interface\\ChatFrame\\ChatFrameBackground",
|
||||
tile = true, tileSize = 5, edgeSize = 1,
|
||||
insets = { left = 3, right = 3, top = 3, bottom = 3 },
|
||||
})
|
||||
nameInput:SetBackdropColor(0, 0, 0, 0.8)
|
||||
nameInput:SetBackdropBorderColor(0.4, 0.4, 0.4, 0.8)
|
||||
nameInput:SetScript("OnEnterPressed", function() nameInput:ClearFocus() end)
|
||||
nameInput:SetScript("OnEscapePressed", function() nameInput:ClearFocus() end)
|
||||
|
||||
-- Status text centered above buttons
|
||||
local statusLabel = optionsFrame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
|
||||
statusLabel:SetPoint("BOTTOM", optionsFrame, "BOTTOM", 0, 50)
|
||||
statusLabel:SetJustifyH("CENTER")
|
||||
|
||||
-- Save button (centered pair)
|
||||
local saveBtn = CreateFrame("Button", nil, optionsFrame, "GameMenuButtonTemplate")
|
||||
saveBtn:SetWidth(90)
|
||||
saveBtn:SetHeight(24)
|
||||
saveBtn:SetPoint("BOTTOM", optionsFrame, "BOTTOM", -50, 18)
|
||||
saveBtn:SetText("Save")
|
||||
saveBtn:SetScript("OnClick", function()
|
||||
local name = nameInput:GetText()
|
||||
SetMainName(name)
|
||||
if name == "" then
|
||||
DEFAULT_CHAT_FRAME:AddMessage("|cff00ff96MainCharacterTag:|r Main name cleared. Prefix disabled.")
|
||||
else
|
||||
DEFAULT_CHAT_FRAME:AddMessage("|cff00ff96MainCharacterTag:|r Main set to |cffffd700" .. name .. "|r")
|
||||
end
|
||||
optionsFrame:Hide()
|
||||
end)
|
||||
|
||||
-- Cancel button
|
||||
local cancelBtn = CreateFrame("Button", nil, optionsFrame, "GameMenuButtonTemplate")
|
||||
cancelBtn:SetWidth(90)
|
||||
cancelBtn:SetHeight(24)
|
||||
cancelBtn:SetPoint("BOTTOM", optionsFrame, "BOTTOM", 50, 18)
|
||||
cancelBtn:SetText("Cancel")
|
||||
cancelBtn:SetScript("OnClick", function()
|
||||
optionsFrame:Hide()
|
||||
end)
|
||||
|
||||
-- Refresh frame contents on show
|
||||
optionsFrame:SetScript("OnShow", function()
|
||||
nameInput:SetText(GetMainName())
|
||||
currentLabel:SetText("Logged in as: |cffffd700" .. (UnitName("player") or "Unknown") .. "|r")
|
||||
local main = GetMainName()
|
||||
if main == "" then
|
||||
statusLabel:SetText("|cffaaaaaa(No main set — prefix disabled)|r")
|
||||
elseif IsCurrentCharMain() then
|
||||
statusLabel:SetText("|cff00ff96You are on your main.|r")
|
||||
else
|
||||
statusLabel:SetText("|cffffff00Alt detected — prefix active.|r")
|
||||
end
|
||||
end)
|
||||
|
||||
-- ============================================================
|
||||
-- Slash commands
|
||||
-- ============================================================
|
||||
SLASH_MAINCHARACTERTAG1 = "/mct"
|
||||
SLASH_MAINCHARACTERTAG2 = "/mainchartag"
|
||||
SlashCmdList["MAINCHARACTERTAG"] = function(msg)
|
||||
if optionsFrame:IsShown() then
|
||||
optionsFrame:Hide()
|
||||
else
|
||||
optionsFrame:Show()
|
||||
end
|
||||
end
|
||||
|
||||
-- ============================================================
|
||||
-- Addon loaded event (vanilla style)
|
||||
-- ============================================================
|
||||
local eventFrame = CreateFrame("Frame")
|
||||
eventFrame:RegisterEvent("VARIABLES_LOADED")
|
||||
eventFrame:RegisterEvent("PLAYER_ENTERING_WORLD")
|
||||
eventFrame:SetScript("OnEvent", function()
|
||||
if event == "VARIABLES_LOADED" then
|
||||
MainCharacterTagDB = MainCharacterTagDB or {}
|
||||
DEFAULT_CHAT_FRAME:AddMessage("|cff00ff96MainCharacterTag|r loaded. Type |cffffd700/mct|r to open options.")
|
||||
elseif event == "PLAYER_ENTERING_WORLD" then
|
||||
playerReady = true
|
||||
end
|
||||
end)
|
||||
Reference in New Issue
Block a user