--[[ ########################################################## S V U I By: S.Jackson ########################################################## LOCALIZED LUA FUNCTIONS ########################################################## ]]-- --[[ GLOBALS ]]-- local _G = _G; local unpack = _G.unpack; local select = _G.select; local assert = _G.assert; local type = _G.type; local error = _G.error; local pcall = _G.pcall; local print = _G.print; local ipairs = _G.ipairs; local pairs = _G.pairs; local next = _G.next; local tostring = _G.tostring; local tonumber = _G.tonumber; local collectgarbage = _G.collectgarbage; local rawset = _G.rawset; local rawget = _G.rawget; local getmetatable = _G.getmetatable; local setmetatable = _G.setmetatable; local loadstring = _G.loadstring; local string = _G.string; local math = _G.math; local table = _G.table; local rept = string.rep; local tsort,twipe = table.sort,table.wipe; local floor,ceil = math.floor, math.ceil; --BLIZZARD API local CreateFrame = _G.CreateFrame; local InCombatLockdown = _G.InCombatLockdown; local GameTooltip = _G.GameTooltip; local hooksecurefunc = _G.hooksecurefunc; local IsAltKeyDown = _G.IsAltKeyDown; local IsShiftKeyDown = _G.IsShiftKeyDown; local IsControlKeyDown = _G.IsControlKeyDown; local IsModifiedClick = _G.IsModifiedClick; local PlaySound = _G.PlaySound; local PlaySoundFile = _G.PlaySoundFile; local PlayMusic = _G.PlayMusic; local StopMusic = _G.StopMusic; local GetTime = _G.GetTime; local ToggleFrame = _G.ToggleFrame; local EquipItemByName = _G.EquipItemByName; local IsSpellKnown = _G.IsSpellKnown; local ERR_NOT_IN_COMBAT = _G.ERR_NOT_IN_COMBAT; local RAID_CLASS_COLORS = _G.RAID_CLASS_COLORS; local CUSTOM_CLASS_COLORS = _G.CUSTOM_CLASS_COLORS; --[[ CONSTANTS ]]-- _G.BINDING_HEADER_SVUICRAFT = "Supervillain UI: Craft-O-Matic"; _G.BINDING_NAME_SVUICRAFT_FISH = "Toggle Fishing Mode"; _G.BINDING_NAME_SVUICRAFT_FARM = "Toggle Farming Mode"; _G.BINDING_NAME_SVUICRAFT_COOK = "Toggle Cooking Mode"; _G.BINDING_NAME_SVUICRAFT_ARCH = "Toggle Archaeology Mode"; --[[ ########################################################## GET ADDON DATA ########################################################## ]]-- local SV = _G["SVUI"]; local L = SV.L; local PLUGIN = select(2, ...) local CONFIGS = SV.defaults[PLUGIN.Schema]; local NewHook = hooksecurefunc; local playerGUID = UnitGUID('player') local classColor = RAID_CLASS_COLORS --[[ ########################################################## GLOBAL BINDINGS ########################################################## ]]-- _G.SVUIFishingMode = function() if InCombatLockdown() then SV:AddonMessage(ERR_NOT_IN_COMBAT); return; end if PLUGIN.CurrentMode and PLUGIN.CurrentMode == "Fishing" then PLUGIN:EndJobModes() else PLUGIN:SetJobMode("Fishing") end end _G.SVUIFarmingMode = function() if InCombatLockdown() then SV:AddonMessage(ERR_NOT_IN_COMBAT); return; end if PLUGIN.CurrentMode and SV.CurrentMode == "Farming" then PLUGIN:EndJobModes() else PLUGIN:SetJobMode("Farming") end end _G.SVUIArchaeologyMode = function() if InCombatLockdown() then SV:AddonMessage(ERR_NOT_IN_COMBAT); return; end if PLUGIN.CurrentMode and PLUGIN.CurrentMode == "Archaeology" then PLUGIN:EndJobModes() else PLUGIN:SetJobMode("Archaeology") end end _G.SVUICookingMode = function() if InCombatLockdown() then SV:AddonMessage(ERR_NOT_IN_COMBAT); return; end if PLUGIN.CurrentMode and PLUGIN.CurrentMode == "Cooking" then PLUGIN:EndJobModes() else PLUGIN:SetJobMode("Cooking") end end --[[ ########################################################## LOCALIZED GLOBALS ########################################################## ]]-- local LOOT_ITEM_SELF = _G.LOOT_ITEM_SELF; local LOOT_ITEM_CREATED_SELF = _G.LOOT_ITEM_CREATED_SELF; local LOOT_ITEM_SELF_MULTIPLE = _G.LOOT_ITEM_SELF_MULTIPLE local LOOT_ITEM_PUSHED_SELF_MULTIPLE = _G.LOOT_ITEM_PUSHED_SELF_MULTIPLE local LOOT_ITEM_PUSHED_SELF = _G.LOOT_ITEM_PUSHED_SELF --[[ ########################################################## LOCAL VARS ########################################################## ]]-- local currentModeKey = false; local ModeLogsFrame = CreateFrame("Frame", "SVUI_ModeLogsFrame", UIParent) local classColors = CUSTOM_CLASS_COLORS[SV.class] local classR, classG, classB = classColors.r, classColors.g, classColors.b local classA = 0.35 local lastClickTime; local ICON_FILE = [[Interface\AddOns\SVUI_CraftOMatic\artwork\DOCK-LABORER]] local COOK_ICON = [[Interface\AddOns\SVUI_CraftOMatic\artwork\LABORER-COOKING]] local FISH_ICON = [[Interface\AddOns\SVUI_CraftOMatic\artwork\LABORER-FISHING]] local ARCH_ICON = [[Interface\AddOns\SVUI_CraftOMatic\artwork\LABORER-SURVEY]] local FARM_ICON = [[Interface\AddOns\SVUI_CraftOMatic\artwork\LABORER-FARMING]] --[[ ########################################################## LOCAL FUNCTIONS ########################################################## ]]-- local function onMouseWheel(self, delta) if (delta > 0) then self:ScrollUp() elseif (delta < 0) then self:ScrollDown() end end local function CheckForDoubleClick() if lastClickTime then local pressTime = GetTime() local doubleTime = pressTime - lastClickTime if ( (doubleTime < 0.4) and (doubleTime > 0.05) ) then lastClickTime = nil return true end end lastClickTime = GetTime() return false end --[[ ########################################################## CHAT LOG PARSING FUNCTIONS (from LibDeformat by:ckknight) ########################################################## ]]-- local ChatDeFormat; do local FORMAT_SEQUENCES = { ["s"] = ".+", ["c"] = ".", ["%d*d"] = "%%-?%%d+", ["[fg]"] = "%%-?%%d+%%.?%%d*", ["%%%.%d[fg]"] = "%%-?%%d+%%.?%%d*", } local STRING_BASED_SEQUENCES = { ["s"] = true, ["c"] = true, } local cache = setmetatable({}, {__mode='k'}) local function _deformat(pattern) local func = cache[pattern] if func then return func end local unpattern = '^' .. pattern:gsub("([%(%)%.%*%+%-%[%]%?%^%$%%])", "%%%1") .. '$' local number_indexes = {} local index_translation = nil local highest_index if not pattern:find("%%1%$") then local i = 0 while true do i = i + 1 local first_index local first_sequence for sequence in pairs(FORMAT_SEQUENCES) do local index = unpattern:find("%%%%" .. sequence) if index and (not first_index or index < first_index) then first_index = index first_sequence = sequence end end if not first_index then break end unpattern = unpattern:gsub("%%%%" .. first_sequence, "(" .. FORMAT_SEQUENCES[first_sequence] .. ")", 1) number_indexes[i] = not STRING_BASED_SEQUENCES[first_sequence] end highest_index = i - 1 else local i = 0 while true do i = i + 1 local found_sequence for sequence in pairs(FORMAT_SEQUENCES) do if unpattern:find("%%%%" .. i .. "%%%$" .. sequence) then found_sequence = sequence break end end if not found_sequence then break end unpattern = unpattern:gsub("%%%%" .. i .. "%%%$" .. found_sequence, "(" .. FORMAT_SEQUENCES[found_sequence] .. ")", 1) number_indexes[i] = not STRING_BASED_SEQUENCES[found_sequence] end highest_index = i - 1 i = 0 index_translation = {} pattern:gsub("%%(%d)%$", function(w) i = i + 1 index_translation[i] = tonumber(w) end) end if highest_index == 0 then cache[pattern] = SV.fubar else local t = {} t[#t+1] = [=[ return function(text) local ]=] for i = 1, highest_index do if i ~= 1 then t[#t+1] = ", " end t[#t+1] = "a" if not index_translation then t[#t+1] = i else t[#t+1] = index_translation[i] end end t[#t+1] = [=[ = text:match(]=] t[#t+1] = ("%q"):format(unpattern) t[#t+1] = [=[) if not a1 then return ]=] for i = 1, highest_index do if i ~= 1 then t[#t+1] = ", " end t[#t+1] = "nil" end t[#t+1] = "\n" t[#t+1] = [=[ end ]=] t[#t+1] = "return " for i = 1, highest_index do if i ~= 1 then t[#t+1] = ", " end t[#t+1] = "a" t[#t+1] = i if number_indexes[i] then t[#t+1] = "+0" end end t[#t+1] = "\n" t[#t+1] = [=[ end ]=] t = table.concat(t, "") cache[pattern] = assert(loadstring(t))() end return cache[pattern] end ChatDeFormat = function(text, pattern) if((type(text) == "string") and (type(pattern) == "string")) then return _deformat(pattern)(text) end return false; end end --[[ ########################################################## WORLDFRAME HANDLER ########################################################## ]]-- local _hook_WorldFrame_OnMouseDown = function(self, button) if InCombatLockdown() then return end if(currentModeKey and button == "RightButton" and CheckForDoubleClick()) then local handle = PLUGIN[currentModeKey]; if(handle and handle.Bind) then handle.Bind() end end end local ModeCapture_PostClickHandler = function(self, button) if InCombatLockdown() then self:RegisterEvent("PLAYER_REGEN_ENABLED") return end ClearOverrideBindings(self) self.Handler:Hide() end local ModeCapture_EventHandler = function(self, event, ...) if event == "PLAYER_REGEN_ENABLED" then self:UnregisterEvent("PLAYER_REGEN_ENABLED") PLUGIN:ChangeModeGear() ModeCapture_PostClickHandler(self) end if event == "PLAYER_ENTERING_WORLD" then if (IsSpellKnown(131474) or IsSpellKnown(80451) or IsSpellKnown(818)) then WorldFrame:HookScript("OnMouseDown", _hook_WorldFrame_OnMouseDown) end self:UnregisterEvent("PLAYER_ENTERING_WORLD") end end local Handler = CreateFrame("Frame") Handler:SetPoint("LEFT", UIParent, "RIGHT", 10000, 0) local ModeCapture = CreateFrame("Button", "SVUI_ModeCaptureWindow", Handler, "SecureActionButtonTemplate") ModeCapture.Handler = Handler ModeCapture:EnableMouse(true) ModeCapture:RegisterForClicks("RightButtonUp") ModeCapture:RegisterEvent("PLAYER_ENTERING_WORLD") ModeCapture:SetScript("PostClick", ModeCapture_PostClickHandler) ModeCapture:SetScript("OnEvent", ModeCapture_EventHandler) ModeCapture:Hide() --[[ ########################################################## CORE FUNCTIONS ########################################################## ]]-- function PLUGIN:CraftingReset() self.TitleWindow:Clear(); self.LogWindow:Clear(); self.TitleWindow:AddMessage("Crafting Modes", 1, 1, 0); self.LogWindow:AddMessage("Select a Tool to Begin", 1, 1, 1); self.LogWindow:AddMessage(" ", 0, 1, 1); collectgarbage("collect") end function PLUGIN:ModeLootLoader(mode, msg, info) self.TitleWindow:Clear(); self.LogWindow:Clear(); self.ModeAlert.HelpText = info if(mode and self[mode]) then if(self[mode].Log) then local stored = self[mode].Log; self.TitleWindow:AddMessage(msg, 1, 1, 1); local previous = false for name,data in pairs(stored) do if type(data) == "table" and data.amount and data.texture then self.LogWindow:AddMessage("|cff55FF55"..data.amount.." x|r |T".. data.texture ..":16:16:0:0:64:64:4:60:4:60|t".." "..name, 0.8, 0.8, 0.8); previous = true end end if(previous) then self.LogWindow:AddMessage("----------------", 0, 0, 0); self.LogWindow:AddMessage(" ", 0, 0, 0); end self.LogWindow:AddMessage(info, 1, 1, 1); self.LogWindow:AddMessage(" ", 1, 1, 1); end else self:CraftingReset() end end function PLUGIN:CheckForModeLoot(msg) local item, amt = ChatDeFormat(msg, LOOT_ITEM_CREATED_SELF) if not item then item = ChatDeFormat(msg, LOOT_ITEM_SELF_MULTIPLE) if not item then item = ChatDeFormat(msg, LOOT_ITEM_SELF) if not item then item = ChatDeFormat(msg, LOOT_ITEM_PUSHED_SELF_MULTIPLE) if not item then item, amt = ChatDeFormat(msg, LOOT_ITEM_PUSHED_SELF) --print(item) end end end end --print(msg) if item then if not amt then amt = 1 end return item, amt end end function PLUGIN:SetJobMode(category) if InCombatLockdown() then return end if(not category) then self:EndJobModes() return; end self:ChangeModeGear() if(currentModeKey and self[currentModeKey] and self[currentModeKey].Disable) then self:EndJobModes() return; end currentModeKey = category; if(self[category] and self[category].Enable) then self[category].Enable() else self:EndJobModes() return; end end function PLUGIN:EndJobModes() if(currentModeKey and self[currentModeKey] and self[currentModeKey].Disable) then self[currentModeKey].Disable() end currentModeKey = false; --if self.Docklet:IsShown() then self.Docklet.Button:Click() end self:ChangeModeGear() self.ModeAlert:Hide(); SV:SCTMessage("Mode Disabled", 1, 0.35, 0); PlaySound("UndeadExploration"); self:CraftingReset() end function PLUGIN:ChangeModeGear() if(not self.InModeGear) then return end if InCombatLockdown() then _G["SVUI_ModeCaptureWindow"]:RegisterEvent("PLAYER_REGEN_ENABLED"); return else if(self.WornItems["HEAD"]) then EquipItemByName(self.WornItems["HEAD"]) self.WornItems["HEAD"] = false end if(self.WornItems["TAB"]) then EquipItemByName(self.WornItems["TAB"]) self.WornItems["TAB"] = false end if(self.WornItems["MAIN"]) then EquipItemByName(self.WornItems["MAIN"]) self.WornItems["MAIN"] = false end if(self.WornItems["OFF"]) then EquipItemByName(self.WornItems["OFF"]) self.WornItems["OFF"] = false end self.InModeGear = false end end function PLUGIN:SKILL_LINES_CHANGED() if(currentModeKey and self[currentModeKey] and self[currentModeKey].Update) then self[currentModeKey].Update() end end --[[ ########################################################## BUILD FUNCTION / UPDATE ########################################################## ]]-- local ModeAlert_OnEnter = function(self) if InCombatLockdown() then return; end self:SetBackdropColor(0.9, 0.15, 0.1) GameTooltip:SetOwner(self, "ANCHOR_TOPLEFT", 0, 4) GameTooltip:ClearLines() GameTooltip:AddLine(self.ModeText, 1, 1, 0) GameTooltip:AddLine("") GameTooltip:AddLine("Click here end this mode.", 0.79, 0.23, 0.23) GameTooltip:AddLine("") GameTooltip:AddLine(self.HelpText, 0.74, 1, 0.57) GameTooltip:Show() end local ModeAlert_OnLeave = function(self) GameTooltip:Hide() if InCombatLockdown() then return end self:SetBackdropColor(0.25, 0.52, 0.1) end local ModeAlert_OnHide = function() if InCombatLockdown() then SV:AddonMessage(ERR_NOT_IN_COMBAT); return; end PLUGIN.Docklet.Parent.Alert:Deactivate() end local ModeAlert_OnShow = function(self) if InCombatLockdown() then SV:AddonMessage(ERR_NOT_IN_COMBAT); return; end PLUGIN.Docklet.Parent.Alert:Activate(self) end local ModeAlert_OnMouseDown = function(self) PLUGIN:EndJobModes() self:FadeOut(0.5, 1, 0, true) end local ModeButton_OnEnter = function(self) if InCombatLockdown() then return; end local name = self.modeName self.icon:SetGradient(unpack(SV.media.gradient.yellow)) GameTooltip:SetOwner(self, "ANCHOR_TOPLEFT", 0, 4) GameTooltip:ClearLines() GameTooltip:AddLine(L[name .. " Mode"], 1, 1, 1) GameTooltip:Show() end local ModeButton_OnLeave = function(self) if InCombatLockdown() then return; end self.icon:SetGradient("VERTICAL", 0.5, 0.53, 0.55, 0.8, 0.8, 1) GameTooltip:Hide() end local ModeButton_OnMouseDown = function(self) local name = self.modeName PLUGIN:SetJobMode(name) end --[[ ########################################################## SIZING CALLBACK ########################################################## ]]-- local function ResizeCraftingDock() local DOCK_HEIGHT = PLUGIN.Docklet.Parent.Window:GetHeight(); local BUTTON_SIZE = (DOCK_HEIGHT * 0.25) - 4; SVUI_ModesDockToolBar:SetWidth(BUTTON_SIZE + 4); SVUI_ModesDockToolBar:SetHeight((BUTTON_SIZE + 4) * 4); SVUI_ModeButton4:SetSize(BUTTON_SIZE,BUTTON_SIZE); SVUI_ModeButton3:SetSize(BUTTON_SIZE,BUTTON_SIZE); SVUI_ModeButton2:SetSize(BUTTON_SIZE,BUTTON_SIZE); SVUI_ModeButton1:SetSize(BUTTON_SIZE,BUTTON_SIZE); end SV.Events:On("DOCKS_UPDATED", ResizeCraftingDock, true); --[[ ########################################################## BUILD FUNCTION ########################################################## ]]-- function PLUGIN:Load() CONFIGS = SV.db[self.Schema]; lastClickTime = nil; self.WornItems = {}; self.InModeGear = false; self.Docklet = SV.Dock:NewDocklet("BottomRight", "SVUI_ModesDockFrame", self.TitleID, ICON_FILE); local DOCK_HEIGHT = self.Docklet.Parent.Window:GetHeight(); local DOCKLET_HEIGHT = DOCK_HEIGHT - 4; local BUTTON_SIZE = (DOCK_HEIGHT * 0.25) - 4; local modesToolBar = CreateFrame("Frame", "SVUI_ModesDockToolBar", self.Docklet) modesToolBar:SetWidth(BUTTON_SIZE + 4); modesToolBar:SetHeight((BUTTON_SIZE + 4) * 4); modesToolBar:SetPoint("BOTTOMLEFT", self.Docklet, "BOTTOMLEFT", 0, 0); local mode4Button = CreateFrame("Frame", "SVUI_ModeButton4", modesToolBar) mode4Button:SetPoint("BOTTOM",modesToolBar,"BOTTOM",0,0) mode4Button:SetSize(BUTTON_SIZE,BUTTON_SIZE) mode4Button.icon = mode4Button:CreateTexture(nil, 'BACKGROUND') mode4Button.icon:SetTexture(FARM_ICON) mode4Button.icon:InsetPoints(mode4Button) mode4Button.icon:SetGradient("VERTICAL", 0.5, 0.53, 0.55, 0.8, 0.8, 1) mode4Button.modeName = "Farming" mode4Button:SetScript('OnEnter', ModeButton_OnEnter) mode4Button:SetScript('OnLeave', ModeButton_OnLeave) mode4Button:SetScript('OnMouseDown', ModeButton_OnMouseDown) local mode3Button = CreateFrame("Frame", "SVUI_ModeButton3", modesToolBar) mode3Button:SetPoint("BOTTOM",mode4Button,"TOP",0,2) mode3Button:SetSize(BUTTON_SIZE,BUTTON_SIZE) mode3Button.icon = mode3Button:CreateTexture(nil, 'BACKGROUND') mode3Button.icon:SetTexture(ARCH_ICON) mode3Button.icon:InsetPoints(mode3Button) mode3Button.icon:SetGradient("VERTICAL", 0.5, 0.53, 0.55, 0.8, 0.8, 1) mode3Button.modeName = "Archaeology" mode3Button:SetScript('OnEnter', ModeButton_OnEnter) mode3Button:SetScript('OnLeave', ModeButton_OnLeave) mode3Button:SetScript('OnMouseDown', ModeButton_OnMouseDown) local mode2Button = CreateFrame("Frame", "SVUI_ModeButton2", modesToolBar) mode2Button:SetPoint("BOTTOM",mode3Button,"TOP",0,2) mode2Button:SetSize(BUTTON_SIZE,BUTTON_SIZE) mode2Button.icon = mode2Button:CreateTexture(nil, 'BACKGROUND') mode2Button.icon:SetTexture(FISH_ICON) mode2Button.icon:InsetPoints(mode2Button) mode2Button.icon:SetGradient("VERTICAL", 0.5, 0.53, 0.55, 0.8, 0.8, 1) mode2Button.modeName = "Fishing" mode2Button:SetScript('OnEnter', ModeButton_OnEnter) mode2Button:SetScript('OnLeave', ModeButton_OnLeave) mode2Button:SetScript('OnMouseDown', ModeButton_OnMouseDown) local mode1Button = CreateFrame("Frame", "SVUI_ModeButton1", modesToolBar) mode1Button:SetPoint("BOTTOM",mode2Button,"TOP",0,2) mode1Button:SetSize(BUTTON_SIZE,BUTTON_SIZE) mode1Button.icon = mode1Button:CreateTexture(nil, 'BACKGROUND') mode1Button.icon:SetTexture(COOK_ICON) mode1Button.icon:InsetPoints(mode1Button) mode1Button.icon:SetGradient("VERTICAL", 0.5, 0.53, 0.55, 0.8, 0.8, 1) mode1Button.modeName = "Cooking" mode1Button:SetScript('OnEnter', ModeButton_OnEnter) mode1Button:SetScript('OnLeave', ModeButton_OnLeave) mode1Button:SetScript('OnMouseDown', ModeButton_OnMouseDown) local ModeAlert = CreateFrame("Frame", nil, self.Docklet) ModeAlert:SetAllPoints(self.Docklet.Parent.Alert) ModeAlert:SetBackdrop(SV.media.backdrop.button) ModeAlert:SetBackdropBorderColor(0,0,0,1) ModeAlert:SetBackdropColor(0.25, 0.52, 0.1) ModeAlert.text = ModeAlert:CreateFontString(nil, 'ARTWORK', 'GameFontWhite') ModeAlert.text:SetAllPoints(ModeAlert) ModeAlert.text:SetTextColor(1, 1, 1) ModeAlert.text:SetJustifyH("CENTER") ModeAlert.text:SetJustifyV("MIDDLE") ModeAlert.text:SetText("Click to Exit") ModeAlert.ModeText = "Click to Exit"; ModeAlert.HelpText = ""; ModeAlert:SetScript('OnEnter', ModeAlert_OnEnter) ModeAlert:SetScript('OnLeave', ModeAlert_OnLeave) ModeAlert:SetScript('OnHide', ModeAlert_OnHide) ModeAlert:SetScript('OnShow', ModeAlert_OnShow) ModeAlert:SetScript('OnMouseDown', ModeAlert_OnMouseDown) ModeAlert:Hide() ModeLogsFrame:SetFrameStrata("MEDIUM") ModeLogsFrame:SetPoint("TOPLEFT", mode1Button, "TOPRIGHT", 5, -5) ModeLogsFrame:SetPoint("BOTTOMRIGHT", self.Docklet, "BOTTOMRIGHT", -5, 5) ModeLogsFrame:SetParent(self.Docklet) local title = CreateFrame("ScrollingMessageFrame", nil, ModeLogsFrame) title:SetSpacing(4) title:SetClampedToScreen(false) title:SetFrameStrata("MEDIUM") title:SetPoint("TOPLEFT",ModeLogsFrame,"TOPLEFT",0,0) title:SetPoint("BOTTOMRIGHT",ModeLogsFrame,"TOPRIGHT",0,-20) title:SetFontObject(SVUI_Font_Header) title:SetMaxLines(1) title:EnableMouseWheel(false) title:SetFading(false) title:SetInsertMode('TOP') title.divider = title:CreateTexture(nil,"OVERLAY") title.divider:SetTexture(0,0,0,0.5) title.divider:SetPoint("BOTTOMLEFT") title.divider:SetPoint("BOTTOMRIGHT") title.divider:SetHeight(1) local topleftline = title:CreateTexture(nil,"OVERLAY") topleftline:SetTexture(0,0,0,0.5) topleftline:SetPoint("TOPLEFT") topleftline:SetPoint("BOTTOMLEFT") topleftline:SetWidth(1) local log = CreateFrame("ScrollingMessageFrame", nil, ModeLogsFrame) log:SetSpacing(4) log:SetClampedToScreen(false) log:SetFrameStrata("MEDIUM") log:SetPoint("TOPLEFT",title,"BOTTOMLEFT",0,0) log:SetPoint("BOTTOMRIGHT",ModeLogsFrame,"BOTTOMRIGHT",0,0) log:SetFontObject(SVUI_Font_Craft) log:SetJustifyH("CENTER") log:SetJustifyV("MIDDLE") log:SetShadowColor(0, 0, 0, 0) log:SetMaxLines(120) log:EnableMouseWheel(true) log:SetScript("OnMouseWheel", onMouseWheel) log:SetFading(false) log:SetInsertMode('TOP') local bottomleftline = log:CreateTexture(nil,"OVERLAY") bottomleftline:SetTexture(0,0,0,0.5) bottomleftline:SetPoint("TOPLEFT") bottomleftline:SetPoint("BOTTOMLEFT") bottomleftline:SetWidth(1) self.ModeAlert = ModeAlert self.TitleWindow = title self.LogWindow = log --self.Docklet:Hide() self.ListenerEnabled = false; self:CraftingReset() self:LoadCookingMode() self:LoadFishingMode() self:LoadArchaeologyMode() self:PrepareFarmingTools() self:RegisterEvent("SKILL_LINES_CHANGED") end