From 644d0cd74abcd7b53665549870c2760926c7876f Mon Sep 17 00:00:00 2001 From: Crum Date: Mon, 19 Feb 2018 22:20:51 -0600 Subject: [PATCH] update !Compatibily & !DebugTools --- !Compatibility/api/luaAPI.lua | 232 ++++++++++++++++----- !Compatibility/api/wowAPI.lua | 49 ++--- !Compatibility/libs/LibBabble-Zone-3.0.lua | 1 + !DebugTools/Blizzard_DebugTools.lua | 10 +- !DebugTools/Blizzard_DebugTools.xml | 2 +- !DebugTools/Compatibility.lua | 4 +- 6 files changed, 207 insertions(+), 91 deletions(-) diff --git a/!Compatibility/api/luaAPI.lua b/!Compatibility/api/luaAPI.lua index ae1901e..b2f0ea2 100644 --- a/!Compatibility/api/luaAPI.lua +++ b/!Compatibility/api/luaAPI.lua @@ -1,53 +1,22 @@ --Cache global variables ---local assert = assert local error = error local geterrorhandler = geterrorhandler local loadstring = loadstring local pairs = pairs local pcall = pcall +local tonumber = tonumber local tostring = tostring local type = type local unpack = unpack -local ceil, floor = math.ceil, math.floor -local find, format, gfind, gsub, sub = string.find, string.format, string.gfind, string.gsub, string.sub -local concat, getn, setn, tinsert = table.concat, table.getn, table.setn, table.insert - -local escapeSequences = { - ["\a"] = "\\a", -- Bell - ["\b"] = "\\b", -- Backspace - ["\t"] = "\\t", -- Horizontal tab - ["\n"] = "\\n", -- Newline - ["\v"] = "\\v", -- Vertical tab - ["\f"] = "\\f", -- Form feed - ["\r"] = "\\r", -- Carriage return - ["\\"] = "\\\\", -- Backslash - ["\""] = "\\\"", -- Quotation mark - ["|"] = "||", - [" "] = "%s", - - [" "] = "%s", - ["!"] = "\\!", - ["#"] = "\\#", - ["$"] = "\\$", - ["%"] = "\\%", - ["&"] = "\\&", - ["'"] = "\\'", - ["("] = "\\(", - [")"] = "\\)", - ["*"] = "\\*", - ["+"] = "\\+", - [","] = "\\,", - ["-"] = "\\-", - ["."] = "\\.", - ["/"] = "\\/" -} +local abs, ceil, exp, floor = math.abs, math.ceil, math.exp, math.floor +local find, format, gfind, gsub, len, sub = string.find, string.format, string.gfind, string.gsub, string.len, string.sub +local concat, getn, setn = table.concat, table.getn, table.setn +math.fmod = math.mod math.huge = 1/0 -string.gmatch = gfind +string.gmatch = string.gfind function difftime(time2, time1) --- assert(type(time2) == "number", format("bad argument #1 to 'difftime' (number expected, got %s)", time2 and type(time2) or "no value")) --- assert(not time1 or type(time1) == "number", format("bad argument #2 to 'difftime' (number expected, got %s)", time1 and type(time1) or "no value")) if type(time2) ~= "number" then error(format("bad argument #1 to 'difftime' (number expected, got %s)", time2 and type(time2) or "no value"), 2) elseif time1 and type(time1) ~= "number" then @@ -58,16 +27,13 @@ function difftime(time2, time1) end function select(n, ...) --- assert(type(n) == "number" or (type(n) == "string" and n == "#"), format("bad argument #1 to 'select' (number expected, got %s)", n and type(n) or "no value")) if not (type(n) == "number" or (type(n) == "string" and n == "#")) then error(format("bad argument #1 to 'select' (number expected, got %s)", n and type(n) or "no value"), 2) end - if type(n) == "string" then + if n == "#" then return getn(arg) - end - - if n == 1 then + elseif n == 1 then return unpack(arg) end @@ -80,19 +46,138 @@ function select(n, ...) return unpack(args) end +local huge = math.huge function math.modf(i) --- assert(type(i) == "number", format("bad argument #1 to 'modf' (number expected, got %s)", i and type(i) or "no value")) + i = type(i) ~= "number" and tonumber(i) or i + if type(i) ~= "number" then error(format("bad argument #1 to 'modf' (number expected, got %s)", i and type(i) or "no value"), 2) end + if i == 0 then + return i, i + elseif abs(i) == huge then + return i, i > 0 and 0 or -0 + end + local int = i >= 0 and floor(i) or ceil(i) return int, i - int end +function math.modulo(x, y) + x = type(x) ~= "number" and tonumber(i) or x + y = type(y) ~= "number" and tonumber(i) or y + + if type(x) ~= "number" then + error(format("bad argument #1 to 'modulo' (number expected, got %s)", x and type(x) or "no value"), 2) + elseif type(y) ~= "number" then + error(format("bad argument #2 to 'modulo' (number expected, got %s)", y and type(y) or "no value"), 2) + end + + return x - floor(x / y) * y +end + +function math.cosh(i) + i = type(i) ~= "number" and tonumber(i) or i + + if type(i) ~= "number" then + error(format("bad argument #1 to 'cosh' (number expected, got %s)", i and type(i) or "no value"), 2) + end + + if i < 0 then + i = -i + end + + if i > 21 then + return exp(i) / 2 + end + + return (exp(i) + exp(-i)) / 2 +end + +local sinhC = { + ["P0"] = -0.6307673640497716991184787251e+6, + ["P1"] = -0.8991272022039509355398013511e+5, + ["P2"] = -0.2894211355989563807284660366e+4, + ["P3"] = -0.2630563213397497062819489e+2, + ["Q0"] = -0.6307673640497716991212077277e+6, + ["Q1"] = 0.1521517378790019070696485176e+5, + ["Q2"] = -0.173678953558233699533450911e+3 +} +function math.sinh(i) + i = type(i) ~= "number" and tonumber(i) or i + + if type(i) ~= "number" then + error(format("bad argument #1 to 'sinh' (number expected, got %s)", i and type(i) or "no value"), 2) + end + + local neg, x + + if i < 0 then + i = -i + neg = true + end + + if i > 21 then + x = exp(i) / 2 + elseif i > 0.5 then + x = (exp(i) - exp(-i)) / 2 + else + local sq = i * i + x = (((sinhC["P3"] * sq + sinhC["P2"]) * sq + sinhC["P1"]) * sq + sinhC["P0"]) * i + x = x / (((sq + sinhC["Q2"]) * sq + sinhC["Q1"]) * sq + sinhC["Q0"]) + end + + if neg then + x = -x + end + + return x +end + +local MAXLOG2 = 8.8029691931113054295988e+01 * 0.5 +local tanhP = { + -9.64399179425052238628E-1, + -9.92877231001918586564E1, + -1.61468768441708447952E3, +} +local tanhQ = { + 1.12811678491632931402E2, + 2.23548839060100448583E3, + 4.84406305325125486048E3, +} +function math.tanh(i) + i = type(i) ~= "number" and tonumber(i) or i + + if type(i) ~= "number" then + error(format("bad argument #1 to 'tanh' (number expected, got %s)", i and type(i) or "no value"), 2) + end + + if i == 0 then + return i + end + + local x = abs(i) + + if x > MAXLOG2 then + return i < 0 and -1 or 1 + elseif x >= 0.625 then + local s = exp(2 * x) + x = 1 - 2 / (s + 1) + + if i < 0 then + x = -x + end + else + local sq = i * i + x = i + i * sq * ((tanhP[1] * sq + tanhP[2]) * sq + tanhP[3]) / (((sq + tanhQ[1]) * sq + tanhQ[2]) * sq + tanhQ[3]) + end + + return x +end + function string.join(delimiter, ...) --- assert(type(delimiter) == "string" or type(delimiter) == "number", format("bad argument #1 to 'join' (string expected, got %s)", delimiter and type(delimiter) or "no value")) if type(delimiter) ~= "string" and type(delimiter) ~= "number" then error(format("bad argument #1 to 'join' (string expected, got %s)", delimiter and type(delimiter) or "no value"), 2) end @@ -106,9 +191,6 @@ end strjoin = string.join function string.match(str, pattern, index) --- assert(type(str) == "string" or type(str) == "number", format("bad argument #1 to 'match' (string expected, got %s)", str and type(str) or "no value")) --- assert(type(pattern) == "string" or type(pattern) == "number", format("bad argument #2 to 'match' (string expected, got %s)", pattern and type(pattern) or "no value")) --- assert(not index or type(index) == "number" or (type(index) == "string" and index ~= ""), format("bad argument #3 to 'match' (number expected, got %s)", index and type(index) or "no value")) if type(str) ~= "string" and type(str) ~= "number" then error(format("bad argument #1 to 'match' (string expected, got %s)", str and type(str) or "no value"), 2) elseif type(pattern) ~= "string" and type(pattern) ~= "number" then @@ -132,9 +214,25 @@ function string.match(str, pattern, index) end strmatch = string.match +function string.reverse(str) + if type(str) ~= "string" and type(str) ~= "number" then + error(format("bad argument #1 to 'reverse' (string expected, got %s)", str and type(str) or "no value"), 2) + end + + local size = len(str) + if size > 1 then + local reversed = "" + for i = size, 1, -1 do + reversed = reversed .. sub(str, i, i) + end + + return reversed + end + + return str +end + function string.split(delimiter, str) --- assert(type(delimiter) == "string" or type(delimiter) == "number", format("bad argument #1 to 'split' (string expected, got %s)", delimiter and type(delimiter) or "no value")) --- assert(type(str) == "string" or type(str) == "number", format("bad argument #2 to 'split' (string expected, got %s)", str and type(str) or "no value")) if type(delimiter) ~= "string" and type(delimiter) ~= "number" then error(format("bad argument #1 to 'split' (string expected, got %s)", delimiter and type(delimiter) or "no value"), 2) elseif type(str) ~= "string" and type(str) ~= "number" then @@ -148,9 +246,35 @@ function string.split(delimiter, str) end strsplit = string.split +local escapeSequences = { + ["\a"] = "\\a", -- Bell + ["\b"] = "\\b", -- Backspace + ["\t"] = "\\t", -- Horizontal tab + ["\n"] = "\\n", -- Newline + ["\v"] = "\\v", -- Vertical tab + ["\f"] = "\\f", -- Form feed + ["\r"] = "\\r", -- Carriage return + ["\\"] = "\\\\", -- Backslash + ["\""] = "\\\"", -- Quotation mark + ["|"] = "||", + [" "] = "%s", + + ["!"] = "\\!", + ["#"] = "\\#", + ["$"] = "\\$", + ["%"] = "\\%", + ["&"] = "\\&", + ["'"] = "\\'", + ["("] = "\\(", + [")"] = "\\)", + ["*"] = "\\*", + ["+"] = "\\+", + [","] = "\\,", + ["-"] = "\\-", + ["."] = "\\.", + ["/"] = "\\/" +} function string.trim(str, chars) --- assert(type(str) == "string" or type(str) == "number", format("bad argument #1 to 'trim' (string expected, got %s)", str and type(str) or "no value")) --- assert(not chars or type(chars) == "string" or type(chars) == "number", format("bad argument #2 to 'trim' (string expected, got %s)", chars and type(chars) or "no value")) if type(str) ~= "string" and type(str) ~= "number" then error(format("bad argument #1 to 'trim' (string expected, got %s)", str and type(str) or "no value"), 2) elseif chars and (type(chars) ~= "string" and type(chars) ~= "number") then @@ -159,13 +283,14 @@ function string.trim(str, chars) if chars then local tokens = {} + local size = 0 for token in gfind(chars, "[%z\1-\255]") do - tinsert(tokens, token) + size = size + 1 + tokens[size] = token end local pattern = "" - local size = getn(tokens) for i = 1, size do pattern = pattern..(escapeSequences[tokens[i]] or tokens[i]).."+" @@ -196,7 +321,6 @@ end strtrim = string.trim function table.wipe(t) --- assert(type(t) == "table", format("bad argument #1 to 'wipe' (table expected, got %s)", t and type(t) or "no value")) if type(t) ~= "table" then error(format("bad argument #1 to 'wipe' (table expected, got %s)", t and type(t) or "no value"), 2) end diff --git a/!Compatibility/api/wowAPI.lua b/!Compatibility/api/wowAPI.lua index ca20d94..40173d4 100644 --- a/!Compatibility/api/wowAPI.lua +++ b/!Compatibility/api/wowAPI.lua @@ -1,6 +1,5 @@ --Cache global variables local _G = _G ---local assert = assert local date = date local error = error local pairs = pairs @@ -64,7 +63,6 @@ QuestDifficultyColors = { } function HookScript(frame, scriptType, handler) --- assert(type(frame) == "table" and frame.GetScript and type(scriptType) == "string" and type(handler) == "function", "Usage: HookScript(frame, \"type\", function)") if not (type(frame) == "table" and frame.GetScript and type(scriptType) == "string" and type(handler) == "function") then error("Usage: HookScript(frame, \"type\", function)", 2) end @@ -84,7 +82,6 @@ end function hooksecurefunc(arg1, arg2, arg3) local isMethod = type(arg1) == "table" and type(arg2) == "string" and type(arg1[arg2]) == "function" and type(arg3) == "function" --- assert(isMethod or (type(arg1) == "string" and type(_G[arg1]) == "function" and type(arg2) == "function"), "Usage: hooksecurefunc([table,] \"functionName\", hookfunc)") if not (isMethod or (type(arg1) == "string" and type(_G[arg1]) == "function" and type(arg2) == "function")) then error("Usage: hooksecurefunc([table,] \"functionName\", hookfunc)", 2) end @@ -111,7 +108,9 @@ end If a table is passed first, it checks table.variable (e.g. issecurevariable(PlayerFrame, "Show") checks PlayerFrame["Show"] or PlayerFrame.Show (they are the same thing)). ]] function issecurevariable(t, var) --- assert(type(t) == "table" and type(var) == "string", "Usage: issecurevariable([table,] \"variable\")") +-- if type(var) ~= "table" or type(var) ~= "string" then +-- error("Usage: issecurevariable([table,] \"variable\")", 2) +-- end return end @@ -129,7 +128,6 @@ function tContains(table, item) end function UnitAura(unit, i, filter) --- assert((type(unit) == "string" or type(unit) == "number") and (type(i) == "string" or type(i) == "number"), "Usage: UnitAura(\"unit\", index [, filter])") if not ((type(unit) == "string" or type(unit) == "number") and (type(i) == "string" or type(i) == "number")) then error("Usage: UnitAura(\"unit\", index [, filter])", 2) end @@ -170,7 +168,6 @@ function GetQuestDifficultyColor(level) end function FillLocalizedClassList(tab, female) --- assert(type(tab) == "table", "Usage: FillLocalizedClassList(classTable[, isFemale])") if type(tab) ~= "table" then error("Usage: FillLocalizedClassList(classTable[, isFemale])", 2) end @@ -235,10 +232,8 @@ function GetInstanceInfo() local name = GetRealZoneText() local difficulty = 1 - local difficultyName = DUNGEON_DIFFICULTY1 local maxPlayers = GetMaxPlayersByType(instanceType, name) - - difficultyName = format("%d %s", maxPlayers, difficultyName) + local difficultyName = format("%d %s", maxPlayers, DUNGEON_DIFFICULTY1) return name, instanceType, difficulty, difficultyName, maxPlayers end @@ -251,7 +246,6 @@ function GetCurrentMapAreaID() end function GetMapNameByID(id) --- assert(type(id) == "string" or type(id) == "number", format("Bad argument #1 to \"GetMapNameByID\" (number expected, got %s)", id and type(id) or "no value")) if not (type(id) == "string" or type(id) == "number") then error(format("Bad argument #1 to \"GetMapNameByID\" (number expected, got %s)", id and type(id) or "no value"), 2) end @@ -295,6 +289,7 @@ end local function OnSizeChanged() local width, height = this:GetWidth(), this:GetHeight() + this.texturePointer.width = width this.texturePointer.height = height this.texturePointer:SetWidth(width) @@ -302,19 +297,16 @@ local function OnSizeChanged() end local function OnValueChanged() - local value = arg1 local _, max = this:GetMinMaxValues() if this.texturePointer.verticalOrientation then - this.texturePointer:SetHeight(this.texturePointer.height * (value / max)) + this.texturePointer:SetHeight(this.texturePointer.height * (arg1 / max)) else - this.texturePointer:SetWidth(this.texturePointer.width * (value / max)) + this.texturePointer:SetWidth(this.texturePointer.width * (arg1 / max)) end end function CreateStatusBarTexturePointer(statusbar) --- assert(type(statusbar) == "table", format("Bad argument #1 to \"CreateStatusBarTexturePointer\" (table expected, got %s)", statusbar and type(statusbar) or "no value")) --- assert(statusbar.GetObjectType and statusbar:GetObjectType() == "StatusBar", "Bad argument #1 to \"CreateStatusBarTexturePointer\" (statusbar object expected)") if type(statusbar) ~= "table" then error(format("Bad argument #1 to \"CreateStatusBarTexturePointer\" (table expected, got %s)", statusbar and type(statusbar) or "no value"), 2) elseif not (statusbar.GetObjectType and statusbar:GetObjectType() == "StatusBar") then @@ -360,7 +352,6 @@ function GetThreatStatusColor(statusIndex) end function GetThreatStatus(currentThreat, maxThreat) --- assert(type(currentThreat) == "number" and type(maxThreat) == "number", "Usage: GetThreatStatus(currentThreat, maxThreat)") if type(currentThreat) ~= "number" or type(maxThreat) ~= "number" then error("Usage: GetThreatStatus(currentThreat, maxThreat)", 2) end @@ -382,21 +373,21 @@ function GetThreatStatus(currentThreat, maxThreat) end end -local MAX_ITEM_ID = 24283 -local ItemInfoDB = {} +local LAST_ITEM_ID = 24283 +local itemInfoDB = {} -function GetItemInfoByName(name) --- assert(type(itemName) == "string", "Usage: GetItemInfoByName(itemName)") - if type(name) ~= "string" then +function GetItemInfoByName(itemName) + if type(itemName) ~= "string" then error("Usage: GetItemInfoByName(itemName)", 2) end - if not ItemInfoDB[name] then - local itemName - for itemID = 1, MAX_ITEM_ID do - itemName = GetItemInfo(itemID) - if itemName ~= "" then - ItemInfoDB[name] = itemID + if not itemInfoDB[itemName] then + local name + for itemID = 1, LAST_ITEM_ID do + name = GetItemInfo(itemID) + + if name ~= "" then + itemInfoDB[name] = itemID if name == itemName then break @@ -405,7 +396,7 @@ function GetItemInfoByName(name) end end - if not ItemInfoDB[name] then return end + if not itemInfoDB[itemName] then return end - return GetItemInfo(ItemInfoDB[name]) + return GetItemInfo(itemInfoDB[itemName]) end \ No newline at end of file diff --git a/!Compatibility/libs/LibBabble-Zone-3.0.lua b/!Compatibility/libs/LibBabble-Zone-3.0.lua index dca540f..745fcbb 100644 --- a/!Compatibility/libs/LibBabble-Zone-3.0.lua +++ b/!Compatibility/libs/LibBabble-Zone-3.0.lua @@ -8,6 +8,7 @@ License: MIT ]] local MAJOR_VERSION = "LibBabble-Zone-3.0" +--local MINOR_VERSION = 90000 + tonumber(("$Revision: 107 $"):match("%d+")) local MINOR_VERSION = 90000 + tonumber(string.match("$Revision: 107 $", "%d+")) if not LibStub then error(MAJOR_VERSION .. " requires LibStub.") end diff --git a/!DebugTools/Blizzard_DebugTools.lua b/!DebugTools/Blizzard_DebugTools.lua index a193c29..4d20baf 100644 --- a/!DebugTools/Blizzard_DebugTools.lua +++ b/!DebugTools/Blizzard_DebugTools.lua @@ -1,4 +1,4 @@ -local mod = math.mod +local modulo = math.modulo local getn = table.getn EVENT_TRACE_EVENT_HEIGHT = 16; @@ -49,7 +49,7 @@ function EventTraceFrame_OnLoad(self) EventTraceFrame_OnSizeChanged(self, self:GetWidth(), self:GetHeight()); self:EnableMouse(true); self:EnableMouseWheel(true); - self:SetScript("OnMouseWheel", function() EventTraceFrame_OnMouseWheel(tris, arg1) end); + self:SetScript("OnMouseWheel", function() EventTraceFrame_OnMouseWheel(this, arg1) end); end local _workTable = {}; @@ -100,14 +100,14 @@ function EventTraceFrame_OnEvent (self, event, ...) local hours = math.floor(minutes / 60); seconds = seconds - 60 * minutes; minutes = minutes - 60 * hours; - hours = mod(hours, 1000) + hours = modulo(hours, 1000) self.times[nextIndex] = string.format("%.2d:%.2d:%06.3f", hours, minutes, seconds); self.timeSinceLast[nextIndex] = 0; self.framesSinceLast[nextIndex] = 0; self.eventids[nextIndex] = GetCurrentEventID(); - local numArgs = select("#", unpack(arg)); - for i=1, numArgs do + local numArgs = getn(arg); + for i = 1, numArgs do if (not self.args[i]) then self.args[i] = {}; end diff --git a/!DebugTools/Blizzard_DebugTools.xml b/!DebugTools/Blizzard_DebugTools.xml index 2a29101..54b6907 100644 --- a/!DebugTools/Blizzard_DebugTools.xml +++ b/!DebugTools/Blizzard_DebugTools.xml @@ -543,7 +543,7 @@ FrameStackTooltip_OnUpdate(this, arg1); - FrameStackTooltip_OnEvent(this, arg); + FrameStackTooltip_OnEvent(this, event, arg1); diff --git a/!DebugTools/Compatibility.lua b/!DebugTools/Compatibility.lua index 0b3f4ec..ffa4af4 100644 --- a/!DebugTools/Compatibility.lua +++ b/!DebugTools/Compatibility.lua @@ -1,7 +1,7 @@ -- Cache global variables -local mod = math.mod local pairs = pairs local tostring = tostring +local fmod = math.fmod local format, match = string.format, string.match local getn, setn, tinsert, tsort, twipe = table.getn, table.setn, table.insert, table.sort, table.wipe -- WoW API @@ -174,7 +174,7 @@ function UpdateFrameStack(tooltip, showHidden) end if l ~= ol then - cs = mod(cs, cn) + 1 + cs = fmod(cs, cn) + 1 ol = l end