diff --git a/modules/afkcam.lua b/modules/afkcam.lua new file mode 100644 index 0000000..25f651c --- /dev/null +++ b/modules/afkcam.lua @@ -0,0 +1,206 @@ +pfUI:RegisterModule("afkcam", "vanilla:tbc", function () + local MARKED_AFK_CAPTURE = SanitizePattern(MARKED_AFK_MESSAGE) + local social_chats = { + "CHAT_MSG_SAY", + "CHAT_MSG_WHISPER", + "CHAT_MSG_PARTY", + "CHAT_MSG_RAID", + "CHAT_MSG_RAID_LEADER", + "CHAT_MSG_RAID_WARNING", + "CHAT_MSG_GUILD", + "CHAT_MSG_OFFICER" + } + + local afkcam = CreateFrame("Frame", "pfAFKCam", WorldFrame) + local overlay = CreateFrame("Button", "pfAFKCamOverlay", afkcam) + overlay.top = overlay:CreateTexture("pfAFKGradientTop", "BACKGROUND") + overlay.top:SetPoint("TOPLEFT", overlay, "TOPLEFT") + overlay.top:SetPoint("TOPRIGHT", overlay, "TOPRIGHT") + overlay.top:SetHeight(100) + overlay.top:SetTexture(1,1,1,1) + overlay.top:SetGradientAlpha("VERTICAL", 0,0,0,0, 0,0,0,1) + + overlay.bottom = overlay:CreateTexture("pfAFKGradientTop", "BACKGROUND") + overlay.bottom:SetPoint("BOTTOMLEFT", overlay, "BOTTOMLEFT") + overlay.bottom:SetPoint("BOTTOMRIGHT", overlay, "BOTTOMRIGHT") + overlay.bottom:SetHeight(100) + overlay.bottom:SetTexture(1,1,1,1) + overlay.bottom:SetGradientAlpha("VERTICAL", 0,0,0,1, 0,0,0,0) + + overlay:SetFrameStrata("DIALOG") + overlay:SetAllPoints(WorldFrame) + + overlay:SetScript("OnMouseUp",function() + SendChatMessage("","AFK") + this._parent:stop() + end) + overlay:SetScript("OnShow", function() + this:EnableKeyboard(true) + end) + overlay:SetScript("OnHide", function() + this:EnableKeyboard(false) + end) + overlay:SetScript("OnKeyUp",function() + SendChatMessage("","AFK") + this._parent:stop() + end) + overlay:Hide() + + local chat = CreateFrame("ScrollingMessageFrame", "pfAFKCamChat", overlay) + chat:EnableMouse(false) + chat:EnableMouseWheel(true) + chat:SetHeight(150) + chat:SetWidth(500) + chat:SetPoint("BOTTOMLEFT",overlay,"BOTTOMLEFT", 10, 10) + chat:SetTimeVisible(1800.0) + chat:SetMaxLines(500) + chat:SetFading(false) + chat:SetJustifyH("LEFT") + chat:SetFont(pfUI.font_default, C.global.font_size + 1, "OUTLINE") + chat:SetScript("OnEvent", function() + if not this:IsVisible() then return end + local info = _G.ChatTypeInfo[string.gsub(event,"CHAT_MSG_","")] + if not info then return end + local class = GetUnitData(arg2 or "") + local author, msg + if class and class ~= UNKNOWN then + local class_color = rgbhex(RAID_CLASS_COLORS[class]) + author = string.format("%s%s|r",class_color,arg2) + else + author = arg2 + end + msg = string.format("%s|cffffffff:|r %s",author,arg1) + this:AddMessage(msg, info.r, info.g, info.b, 1.0) + end) + for _,ctype in ipairs(social_chats) do + chat:RegisterEvent(ctype) + end + chat:SetScript("OnMouseWheel",function() + if arg1 > 0 then + this:ScrollUp() + else + this:ScrollDown() + end + end) + overlay.chat = chat + + overlay._parent = afkcam + afkcam.overlay = overlay + + local clock = CreateFrame("Frame", "pfAFKClock", overlay) + clock:SetAllPoints(overlay) + clock.time = clock:CreateFontString("Status", "OVERLAY") + clock.time:SetFont(pfUI.media["font:Hooge.ttf"], 32, "THICKOUTLINE") + clock.time:SetJustifyH("CENTER") + clock.time:SetPoint("TOP", 0, -10) + clock:SetScript("OnUpdate", function() + local h, m = GetGameTime() + local noon = "AM" + local time = "" + if C.global.twentyfour == "0" then + if C.global.servertime == "1" then + if h == 0 then + h = 12 + elseif h == 12 then + noon = "PM" + elseif h > 12 then + h = h - 12 + noon = "PM" + end + time = string.format("%.2d|cff33ffcc:|r%.2d %s", h, m, noon) + else + time = date("%I|cff33ffcc:|r%M %p") + end + clock.time:SetText(time) + else + if C.global.servertime == "1" then + time = string.format("%.2d|cff33ffcc:|r%.2d", h, m) + else + time = date("%H|cff33ffcc:|r%M") + end + end + clock.time:SetText(time) + end) + + function afkcam:start() + if afkcam._spinning then return end + afkcam._speed = GetCVar("cameraYawMoveSpeed") + afkcam._ownname = GetCVar("UnitNameOwn") + afkcam._ui_visible = UIParent:IsVisible() + SaveView(4) + if afkcam._ui_visible then + CloseAllWindows() + UIParent:Hide() + end + if afkcam._ownname == "0" then + SetCVar("UnitNameOwn", "1") + end + SetCVar("cameraYawMoveSpeed","8") + MoveViewRightStart() + afkcam.overlay:Show() + afkcam.overlay.chat:Clear() + afkcam._spinning = true + end + + function afkcam:stop() + MoveViewRightStop() + SetCVar("cameraYawMoveSpeed",afkcam._speed) + SetCVar("UnitNameOwn", afkcam._ownname) + SetView(4) + + SetCVar("cameraCustomViewSmoothing", "1") + + if not UIParent:IsVisible() and afkcam._ui_visible then + UIParent:Show() + end + if pfUI.uf.player then pfUI.uf:RefreshUnit(pfUI.uf.player, "all") end + afkcam.overlay:Hide() + afkcam._spinning = false + end + + local delay = CreateFrame("Frame") + delay:Hide() + + delay:RegisterEvent("AUCTION_ITEM_LIST_UPDATE") + delay:SetScript("OnEvent", function() + this.delay = GetTime() + 10 + end) + + delay:SetScript("OnUpdate", function() + if ( this.tick or 0) > GetTime() then return else this.tick = GetTime() + 1 end + + local name = UnitName("player") + local cast = pfGetCastInfo(name) + if not cast then cast = pfGetChannelInfo(name) end + if not this.delay then this.delay = 0 end + + if cast then + this.delay = GetTime() + 10 + end + + if this.delay < GetTime() then + afkcam:start() + this:Hide() + end + end) + + afkcam:SetScript("OnEvent", function() + if event == "CHAT_MSG_SYSTEM" then + if (arg1 == _G.MARKED_AFK) or strfind(arg1, MARKED_AFK_CAPTURE) then + delay:Show() + elseif (arg1 == _G.CLEARED_AFK) then + delay:Hide() + this:stop() + end + else + if this._spinning then + delay:Hide() + this:stop() + end + end + end) + + afkcam:RegisterEvent("CHAT_MSG_SYSTEM") + afkcam:RegisterEvent("PLAYER_REGEN_DISABLED") + afkcam:RegisterEvent("PLAYER_LEAVING_WORLD") -- reseting cvars on PLAYER_LOGOUT crashes the client ¯\_(ツ)_/¯ +end)