skeen@0: -- skeen@0: -- SkeenMelee skeen@0: -- skeen@0: skeen@0: -- Local table (used to store functions, ect) skeen@0: local SkeenMelee = {} skeen@0: skeen@0: SkeenMelee.eventHandler = CreateFrame("Frame") skeen@0: SkeenMelee.eventHandler:SetScript("OnEvent", function(this, event, ...) SkeenMelee.events[event](...) end) skeen@0: --Events to listen to skeen@0: SkeenMelee.eventHandler:RegisterEvent("PLAYER_TARGET_CHANGED") skeen@0: SkeenMelee.eventHandler:RegisterEvent("ADDON_LOADED") skeen@0: --EventHandler Functions skeen@0: --by our eventHandler frame. skeen@0: SkeenMelee.events = {} skeen@0: --Player logged in skeen@0: function SkeenMelee.events.ADDON_LOADED(addon) skeen@0: if (addon ~= "SkeenMelee") then skeen@0: return skeen@0: end skeen@0: skeen@0: SkeenMelee:PrepareDatabase() skeen@0: SkeenMelee:CreateGUI() skeen@0: SkeenMelee:UpdateDragability() skeen@0: SkeenMelee:CreateOptionFrame() skeen@0: end skeen@0: skeen@0: -- Prepare the Normal database (settings database) skeen@0: -- This is the maintained database, and isn't wiped on each login, like the active one is skeen@0: function SkeenMelee:PrepareDatabase() skeen@0: skeen@0: -- If there doesn't exist a database currently skeen@0: if not SkeenMeleeDatabase then skeen@0: SkeenMeleeDatabase = {} -- fresh start skeen@0: SkeenMeleeDatabase.update_interval = 0.1 -- Fill it with the default value of 0.1 seconds per interval skeen@0: SkeenMeleeDatabase.scale = 1 --100% size skeen@0: SkeenMeleeDatabase.locked = false --Not locked by default skeen@0: SkeenMeleeDatabase.x = 100 --TODO: Make some better values I guess? skeen@0: SkeenMeleeDatabase.y = 100 --TODO: Make some better values I guess? skeen@0: end skeen@0: end skeen@0: skeen@0: -- Functions Section skeen@0: function SkeenMelee_OnUpdate(self, elapsed) skeen@0: self.TimeSinceLastUpdate = self.TimeSinceLastUpdate + elapsed; skeen@0: skeen@0: if (self.TimeSinceLastUpdate > SkeenMeleeDatabase.update_interval) then skeen@0: SkeenMelee:Update() skeen@0: self.TimeSinceLastUpdate = 0; skeen@0: end skeen@0: end skeen@0: skeen@0: function SkeenMelee.events.PLAYER_TARGET_CHANGED(...) skeen@0: SkeenMelee:Update() skeen@0: end skeen@0: skeen@0: function SkeenMelee:Update() skeen@0: local is_in_melee_range = nil skeen@0: local unit = "target" skeen@0: -- Test class and find a spell accordingly skeen@0: local _, class = UnitClass("player"); skeen@0: local meleespell skeen@0: skeen@0: -- Choose a melee spell for each class (if any) skeen@0: if (class == "DEATH KNIGHT") then skeen@0: meleespell = "Blood Strike" skeen@0: elseif (class == "DRUID") then skeen@0: meleespell = "Claw" skeen@0: elseif (class == "HUNTER") then skeen@0: meleespell = "Raptor Strike" skeen@0: elseif (class == "PALADIN") then skeen@0: meleespell = "Crusader Strike" skeen@0: elseif (class == "ROGUE") then skeen@0: meleespell = "Sinister Strike" skeen@0: elseif (class == "SHAMAN") then skeen@0: meleespell = "Primal Strike" skeen@0: elseif (class == "WARRIOR") then skeen@0: meleespell = "Strike" skeen@0: else --mage, priest, warlock skeen@0: SkeenMelee:HideFrame() skeen@0: end skeen@0: skeen@0: if UnitExists(unit) and UnitIsVisible(unit) then skeen@0: is_in_melee_range = IsSpellInRange(meleespell, unit) skeen@0: end skeen@0: if (is_in_melee_range==1) then --Is in melee range skeen@0: SkeenMelee.infoString:SetText("Melee") skeen@0: SkeenMelee:ShowFrame() skeen@0: elseif (is_in_melee_range==0) then --Is not in melee range skeen@0: SkeenMelee.infoString:SetText("|cffff0000NOT MELEE|r") skeen@0: SkeenMelee:ShowFrame() skeen@0: else --Not even a melee target skeen@0: SkeenMelee:HideFrame() skeen@0: end skeen@0: end skeen@0: skeen@0: function SkeenMelee:CreateGUI() skeen@0: skeen@0: local displayFrame = CreateFrame("Frame", "SkeenMeleeDisplayFrame", UIParent) skeen@0: displayFrame:SetFrameStrata("BACKGROUND") skeen@0: displayFrame:SetWidth(100) skeen@0: displayFrame:SetHeight(30) skeen@0: displayFrame:SetBackdrop({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 32,}) skeen@0: displayFrame:SetBackdropColor(0, 0, 0, .4) skeen@0: displayFrame:EnableMouse(true) skeen@0: displayFrame:SetMovable(true) skeen@0: displayFrame:SetClampedToScreen(true) skeen@0: displayFrame:SetScript("OnMouseDown", function(self) self:StartMoving() end) skeen@0: displayFrame:SetScript("OnMouseUp", function(self) self:StopMovingOrSizing() end) skeen@0: displayFrame:SetScript("OnDragStop", function(self) self:StopMovingOrSizing() end) skeen@0: displayFrame:SetPoint("CENTER",-200,-200) skeen@0: skeen@0: local infoString = displayFrame:CreateFontString("SkeenMelee_infoString","OVERLAY","GameFontNormal") skeen@0: infoString:SetText("Unknown") skeen@0: infoString:SetPoint("CENTER", 0, 0) skeen@0: skeen@0: SkeenMelee.infoString = infoString skeen@0: SkeenMelee.displayFrame = displayFrame skeen@0: skeen@0: displayFrame:SetScale(SkeenMeleeDatabase.scale) skeen@0: end skeen@0: skeen@0: -- The optionsframe in interface skeen@0: function SkeenMelee:CreateOptionFrame() skeen@0: skeen@0: local panel = CreateFrame("FRAME", "SkeenMeleeOptions", UIParent); skeen@0: panel.name = "SkeenMelee"; skeen@0: skeen@0: local fstring1 = panel:CreateFontString("SkeenMeleeOptions_string1","OVERLAY","GameFontNormal") skeen@0: fstring1:SetText("Lock") skeen@0: fstring1:SetPoint("TOPLEFT", 10, -10) skeen@0: skeen@0: local checkbox1 = CreateFrame("CheckButton", "$parent_cb1", panel, "OptionsCheckButtonTemplate") skeen@0: checkbox1:SetWidth(18) skeen@0: checkbox1:SetHeight(18) skeen@0: checkbox1:SetScript("OnClick", function() SkeenMelee:ToggleLocked() end) skeen@0: checkbox1:SetPoint("TOPRIGHT", -10, -10) skeen@0: checkbox1:SetChecked(SkeenMelee:GetLocked()) skeen@0: skeen@0: local fstring2 = panel:CreateFontString("SkeenMeleeOptions_string2","OVERLAY","GameFontNormal") skeen@0: fstring2:SetText("GUI Scale") skeen@0: fstring2:SetPoint("TOPLEFT", 10, -40) skeen@0: skeen@0: local slider2 = CreateFrame("Slider", "$parent_sl2", panel, "OptionsSliderTemplate") skeen@0: slider2:SetMinMaxValues(.5, 1.5) skeen@0: slider2:SetValue(SkeenMelee:GetScale()) skeen@0: slider2:SetValueStep(.05) skeen@0: slider2:SetScript("OnValueChanged", function(self) SkeenMelee:SetScale(self:GetValue()); getglobal(self:GetName() .. "Text"):SetText(string.format("%.0f%%", self:GetValue()*100)) end) skeen@0: getglobal(slider2:GetName() .. "Low"):SetText("50%") skeen@0: getglobal(slider2:GetName() .. "High"):SetText("150%") skeen@0: getglobal(slider2:GetName() .. "Text"):SetText(string.format("%.0f%%", SkeenMelee:GetScale()*100)) skeen@0: slider2:SetPoint("TOPRIGHT", -10, -40) skeen@0: skeen@0: local fstring3 = panel:CreateFontString("SkeenMeleeOptions_string3","OVERLAY","GameFontNormal") skeen@0: fstring3:SetText("Update Interval (sec)") skeen@0: fstring3:SetPoint("TOPLEFT", 10, -70) skeen@0: skeen@0: local slider3 = CreateFrame("Slider", "$parent_sl3", panel, "OptionsSliderTemplate") skeen@0: slider3:SetMinMaxValues(0, 1) skeen@0: slider3:SetValue(SkeenMelee:GetUpdateInterval()) skeen@0: slider3:SetValueStep(.1) skeen@0: slider3:SetScript("OnValueChanged", function(self) SkeenMelee:SetUpdateInterval(self:GetValue()); getglobal(self:GetName() .. "Text"):SetText(string.format("%.1f", self:GetValue())) end) skeen@0: getglobal(slider3:GetName() .. "Low"):SetText("0") skeen@0: getglobal(slider3:GetName() .. "High"):SetText("1") skeen@0: getglobal(slider3:GetName() .. "Text"):SetText(string.format("%.1f", SkeenMelee:GetUpdateInterval())) skeen@0: slider3:SetPoint("TOPRIGHT", -10, -70) skeen@0: skeen@0: SkeenMelee.options = panel skeen@0: panel.parent = "Skeen" skeen@0: skeen@0: InterfaceOptions_AddCategory(panel); skeen@0: end skeen@0: skeen@0: function SkeenMelee:GetLocked() skeen@0: return SkeenMeleeDatabase.locked skeen@0: end skeen@0: skeen@0: function SkeenMelee:ToggleLocked() skeen@0: SkeenMeleeDatabase.locked = not SkeenMeleeDatabase.locked skeen@0: SkeenMelee:UpdateDragability() skeen@0: end skeen@0: skeen@0: function SkeenMelee:GetScale() skeen@0: return SkeenMeleeDatabase.scale skeen@0: end skeen@0: skeen@0: function SkeenMelee:SetScale(num) skeen@0: SkeenMeleeDatabase.scale = num skeen@0: SkeenMelee.displayFrame:SetScale(SkeenMeleeDatabase.scale) skeen@0: end skeen@0: skeen@0: function SkeenMelee:GetUpdateInterval() skeen@0: return SkeenMeleeDatabase.update_interval skeen@0: end skeen@0: skeen@0: function SkeenMelee:SetUpdateInterval(num) skeen@0: SkeenMeleeDatabase.update_interval = num skeen@0: end skeen@0: skeen@0: function SkeenMelee:UpdateDragability() skeen@0: if SkeenMeleeDatabase.locked then skeen@0: SkeenMelee.displayFrame:SetScript("OnMouseDown", nil) skeen@0: SkeenMelee.displayFrame:SetScript("OnMouseUp", nil) skeen@0: SkeenMelee.displayFrame:SetScript("OnDragStop", nil) skeen@0: SkeenMelee.displayFrame:SetBackdropColor(0, 0, 0, 0) skeen@0: SkeenMelee.displayFrame:EnableMouse(false) skeen@0: else skeen@0: SkeenMelee.displayFrame:SetScript("OnMouseDown", function(self) self:StartMoving() end) skeen@0: SkeenMelee.displayFrame:SetScript("OnMouseUp", function(self) self:StopMovingOrSizing() end) skeen@0: SkeenMelee.displayFrame:SetScript("OnDragStop", function(self) self:StopMovingOrSizing() end) skeen@0: SkeenMelee.displayFrame:SetBackdropColor(0, 0, 0, .4) skeen@0: SkeenMelee.displayFrame:EnableMouse(true) skeen@0: end skeen@0: end skeen@0: skeen@0: function SkeenMelee:HideFrame() skeen@0: SkeenMelee.displayFrame:Hide() skeen@0: SkeenMelee.infoString:Hide() skeen@0: end skeen@0: skeen@0: function SkeenMelee:ShowFrame() skeen@0: SkeenMelee.displayFrame:Show() skeen@0: SkeenMelee.infoString:Show() skeen@0: end