Untitled
unknown
plain_text
2 years ago
19 kB
11
Indexable
local LibDraw = {version = 1.3} _G.LibDraw = LibDraw LibDraw.line = LibDraw.line or {r = 0, g = 1, b = 0, a = 1, w = 1} LibDraw.level = "BACKGROUND" LibDraw.callbacks = {} if not LibDraw.canvas then LibDraw.canvas = CreateFrame("Frame", WorldFrame) LibDraw.canvas:SetAllPoints(WorldFrame) LibDraw.lines = {} LibDraw.lines_used = {} LibDraw.textures = {} LibDraw.textures_used = {} LibDraw.fontstrings = {} LibDraw.fontstrings_used = {} end if _G.C_Timer.Nn then local NoName = _G.NoName or _G.unlockerRAW local Utils = NoName.Utils local Draw = Utils.Draw:New() function LibDraw.SetColor(r, g, b, a) return Draw:SetColor(r, g, b, a) end function LibDraw.SetColorRaw(r, g, b, a) return Draw:SetColorRaw(r, g, b, a) end function LibDraw.SetWidth(w) return Draw:SetWidth(w) end function LibDraw.Line(sx, sy, sz, ex, ey, ez) return Draw:LineRaw(sx, sy, sz, ex, ey, ez) end function LibDraw.rotateX(cx, cy, cz, px, py, pz, r) return Draw:RotateX(cx, cy, cz, px, py, pz, r) end function LibDraw.rotateY(cx, cy, cz, px, py, pz, r) return Draw:RotateY(cx, cy, cz, px, py, pz, r) end function LibDraw.rotateZ(cx, cy, cz, px, py, pz, r) return Draw:RotateZ(cx, cy, cz, px, py, pz, r) end function LibDraw.Array(vectors, x, y, z, rotationX, rotationY, rotationZ) return Draw:Array(vectors, x, y, z, rotationX, rotationY, rotationZ) end function LibDraw.Draw2DLine(sx, sy, ex, ey) end function LibDraw.Circle(x, y, z, size) return Draw:Circle(x, y, z, size) end function LibDraw.GroundCircle(x, y, z, size) return Draw:Circle(x, y, z, size) end function LibDraw.Arc(x, y, z, size, arc, rotation) return Draw:Arc(x, y, z, size, arc, rotation) end function LibDraw.Texture(config, x, y, z, alphaA) return Draw:Texture(config, x, y, z, alphaA) end function LibDraw.Text(text, font, x, y, z) return Draw:Text(text, font, x, y, z) end function LibDraw.Box(x, y, z, width, _, rotation, offset_x, offset_y) Draw:Rectangle(x, y, z, width, l, rotation) end function LibDraw.DrawHelper() return Draw:Helper() end function LibDraw.Distance(ax, ay, az, bx, by, bz) return Draw:Distance(ax, ay, az, bx, by, bz) end function LibDraw.Camera() return Draw:CameraPosition() end function LibDraw.Sync(callback) return Draw:Sync(callback) end function LibDraw.clearCanvas() return Draw:ClearCanvas() end function LibDraw.Enable(interval) return Draw:Enable() end return end -- Tinkr if Tinkr then local Draw = Tinkr.Util.Draw:New() function LibDraw.SetColor(r, g, b, a) return Draw:SetColor(r, g, b, a) end function LibDraw.SetColorRaw(r, g, b, a) return Draw:SetColorRaw(r, g, b, a) end function LibDraw.SetWidth(w) return Draw:SetWidth(w) end function LibDraw.Line(sx, sy, sz, ex, ey, ez) return Draw:LineRaw(sx, sy, sz, ex, ey, ez) end function LibDraw.rotateX(cx, cy, cz, px, py, pz, r) return Draw:RotateX(cx, cy, cz, px, py, pz, r) end function LibDraw.rotateY(cx, cy, cz, px, py, pz, r) return Draw:RotateY(cx, cy, cz, px, py, pz, r) end function LibDraw.rotateZ(cx, cy, cz, px, py, pz, r) return Draw:RotateZ(cx, cy, cz, px, py, pz, r) end function LibDraw.Array(vectors, x, y, z, rotationX, rotationY, rotationZ) return Draw:Array(vectors, x, y, z, rotationX, rotationY, rotationZ) end function LibDraw.Draw2DLine(sx, sy, ex, ey) end function LibDraw.Circle(x, y, z, size) return Draw:Circle(x, y, z, size) end function LibDraw.GroundCircle(x, y, z, size) return Draw:Circle(x, y, z, size) end function LibDraw.Arc(x, y, z, size, arc, rotation) return Draw:Arc(x, y, z, size, arc, rotation) end function LibDraw.Texture(config, x, y, z, alphaA) return Draw:Texture(config, x, y, z, alphaA) end function LibDraw.Text(text, font, x, y, z) return Draw:Text(text, font, x, y, z) end function LibDraw.Box(x, y, z, width, _, rotation, offset_x, offset_y) Draw:Rectangle(x, y, z, width, l, rotation) end function LibDraw.DrawHelper() return Draw:Helper() end function LibDraw.Distance(ax, ay, az, bx, by, bz) return Draw:Distance(ax, ay, az, bx, by, bz) end function LibDraw.Camera() return Draw:CameraPosition() end function LibDraw.Sync(callback) return Draw:Sync(callback) end function LibDraw.clearCanvas() return Draw:ClearCanvas() end function LibDraw.Enable(interval) return Draw:Enable() end return end local sin, cos, atan, atan2, sqrt, rad = math.sin, math.cos, math.atan, math.atan2, math.sqrt, math.rad local tinsert, tremove = tinsert, tremove local wfTop = WorldFrame:GetTop() local function WorldToScreen(wX, wY, wZ) if wZ == nil then wZ = select(3, NeP._G.GetObjectPosition("player")) end local sX, sY = NeP._G.WorldToScreen(wX, wY, wZ); if sX and sY then return sX, -(wfTop - sY); else return sX, sY; end end function LibDraw.SetColor(r, g, b, a) LibDraw.line.r = r * 0.00390625 LibDraw.line.g = g * 0.00390625 LibDraw.line.b = b * 0.00390625 if a then LibDraw.line.a = a * 0.01 else LibDraw.line.a = 1 end end function LibDraw.SetColorRaw(r, g, b, a) LibDraw.line.r = r LibDraw.line.g = g LibDraw.line.b = b LibDraw.line.a = a end function LibDraw.SetWidth(w) LibDraw.line.w = w end function LibDraw.Line(sx, sy, sz, ex, ey, ez) if not WorldToScreen then return end sx, sy = WorldToScreen(sx, sy, sz) ex, ey = WorldToScreen(ex, ey, ez) LibDraw.Draw2DLine(sx, sy, ex, ey) end function LibDraw.rotateX(cx, cy, cz, px, py, pz, r) if r == nil then return px, py, pz end local s = sin(r) local c = cos(r) -- center of rotation px, py, pz = px - cx, py - cy, pz - cz local x = px + cx local y = ((py * c - pz * s) + cy) local z = ((py * s + pz * c) + cz) return x, y, z end function LibDraw.rotateY(cx, cy, cz, px, py, pz, r) if r == nil then return px, py, pz end local s = sin(r) local c = cos(r) -- center of rotation px, py, pz = px - cx, py - cy, pz - cz local x = ((pz * s + px * c) + cx) local y = py + cy local z = ((pz * c - px * s) + cz) return x, y, z end function LibDraw.rotateZ(cx, cy, cz, px, py, pz, r) if r == nil then return px, py, pz end local s = sin(r) local c = cos(r) -- center of rotation px, py, pz = px - cx, py - cy, pz - cz local x = ((px * c - py * s) + cx) local y = ((px * s + py * c) + cy) local z = pz + cz return x, y, z end function LibDraw.Array(vectors, x, y, z, rotationX, rotationY, rotationZ) for _, vector in ipairs(vectors) do local sx, sy, sz = x + vector[1], y + vector[2], z + vector[3] local ex, ey, ez = x + vector[4], y + vector[5], z + vector[6] if rotationX then sx, sy, sz = LibDraw.rotateX(x, y, z, sx, sy, sz, rotationX) ex, ey, ez = LibDraw.rotateX(x, y, z, ex, ey, ez, rotationX) end if rotationY then sx, sy, sz = LibDraw.rotateY(x, y, z, sx, sy, sz, rotationY) ex, ey, ez = LibDraw.rotateY(x, y, z, ex, ey, ez, rotationY) end if rotationZ then sx, sy, sz = LibDraw.rotateZ(x, y, z, sx, sy, sz, rotationZ) ex, ey, ez = LibDraw.rotateZ(x, y, z, ex, ey, ez, rotationZ) end sx, sy = WorldToScreen(sx, sy, sz) ex, ey = WorldToScreen(ex, ey, ez) LibDraw.Draw2DLine(sx, sy, ex, ey) end end function LibDraw.Draw2DLine(sx, sy, ex, ey) if not WorldToScreen or not sx or not sy or not ex or not ey then return end local L = tremove(LibDraw.lines) or false if L == false then L = CreateFrame("Frame", LibDraw.canvas) L.line = L:CreateLine() L.line:SetDrawLayer(LibDraw.level) end tinsert(LibDraw.lines_used, L) L:ClearAllPoints() if sx > ex and sy > ey or sx < ex and sy < ey then L:SetPoint("TOPRIGHT", LibDraw.canvas, "TOPLEFT", sx, sy) L:SetPoint("BOTTOMLEFT", LibDraw.canvas, "TOPLEFT", ex, ey) L.line:SetStartPoint('TOPRIGHT') L.line:SetEndPoint('BOTTOMLEFT') elseif sx < ex and sy > ey then L:SetPoint("TOPLEFT", LibDraw.canvas, "TOPLEFT", sx, sy) L:SetPoint("BOTTOMRIGHT", LibDraw.canvas, "TOPLEFT", ex, ey) L.line:SetStartPoint('TOPLEFT') L.line:SetEndPoint('BOTTOMRIGHT') elseif sx > ex and sy < ey then L:SetPoint("TOPRIGHT", LibDraw.canvas, "TOPLEFT", sx, sy) L:SetPoint("BOTTOMLEFT", LibDraw.canvas, "TOPLEFT", ex, ey) L.line:SetStartPoint('TOPLEFT') L.line:SetEndPoint('BOTTOMRIGHT') else -- wat, I don't like this, not one bit L:SetPoint("TOPLEFT", LibDraw.canvas, "TOPLEFT", sx, sy) L:SetPoint("BOTTOMLEFT", LibDraw.canvas, "TOPLEFT", sx, ey) L.line:SetStartPoint('TOPLEFT') L.line:SetEndPoint('BOTTOMLEFT') end L.line:SetThickness(LibDraw.line.w) L.line:SetColorTexture(LibDraw.line.r, LibDraw.line.g, LibDraw.line.b, LibDraw.line.a) L:Show() end local full_circle = rad(365) local small_circle_step = rad(3) function LibDraw.Circle(x, y, z, size) local lx, ly = false, false for v = 0, full_circle, small_circle_step do local nx, ny = WorldToScreen((x + cos(v) * size), (y + sin(v) * size), z) LibDraw.Draw2DLine(lx, ly, nx, ny) lx, ly = nx, ny end end local flags = bit.bor(0x100) function LibDraw.GroundCircle(x, y, z, size) local lx, ly = false, false for v = 0, full_circle, small_circle_step do local fx, fy, fz = NeP._G.TraceLine((x + cos(v) * size), (y + sin(v) * size), z + 100, (x + cos(v) * size), (y + sin(v) * size), z - 100, flags) if fx == nil then fx, fy, fz = (x + cos(v) * size), (y + sin(v) * size), z end local nx, ny = WorldToScreen((fx + cos(v) * size), (fy + sin(v) * size), fz) LibDraw.Draw2DLine(lx, ly, nx, ny) lx, ly = nx, ny end end function LibDraw.Arc(x, y, z, size, arc, rotation) local lx, ly, fx, fy = false, false, false, false local half_arc = arc * 0.5 local ss = (arc / half_arc) local as, ae = -half_arc, half_arc for v = as, ae, ss do local nx, ny = WorldToScreen((x + cos(rotation + rad(v)) * size), (y + sin(rotation + rad(v)) * size), z) if lx and ly then LibDraw.Draw2DLine(lx, ly, nx, ny) else fx, fy = nx, ny end lx, ly = nx, ny end local px, py = WorldToScreen(x, y, z) LibDraw.Draw2DLine(px, py, lx, ly) LibDraw.Draw2DLine(px, py, fx, fy) end function LibDraw.Texture(config, x, y, z, alphaA) local texture, width, height = config.texture, config.width, config.height local left, right, top, bottom, scale = config.left, config.right, config.top, config.bottom, config.scale local alpha = config.alpha or alphaA if not WorldToScreen or not texture or not width or not height or not x or not y or not z then return end if not left or not right or not top or not bottom then left = 0 right = 1 top = 0 bottom = 1 end if not scale then local cx, cy, cz = NeP._G.GetCameraPosition() scale = width / LibDraw.Distance(x, y, z, cx, cy, cz) end local sx, sy = WorldToScreen(x, y, z) if not sx or not sy then return end local w = width * scale local h = height * scale sx = sx - w * 0.5 sy = sy + h * 0.5 local ex, ey = sx + w, sy - h local T = tremove(LibDraw.textures) or false if T == false then T = LibDraw.canvas:CreateTexture(nil, "BACKGROUND") T:SetDrawLayer(LibDraw.level) T:SetTexture(LibDraw.texture) end tinsert(LibDraw.textures_used, T) T:ClearAllPoints() T:SetTexCoord(left, right, top, bottom) T:SetTexture(texture) T:SetWidth(width) T:SetHeight(height) T:SetPoint("TOPLEFT", LibDraw.canvas, "TOPLEFT", sx, sy) T:SetPoint("BOTTOMRIGHT", LibDraw.canvas, "TOPLEFT", ex, ey) T:SetVertexColor(1, 1, 1, 1) if alpha then T:SetAlpha(alpha) else T:SetAlpha(1) end T:Show() end function LibDraw.Text(text, font, x, y, z) local sx, sy = WorldToScreen(x, y, z) if sx and sy then local F = tremove(LibDraw.fontstrings) or LibDraw.canvas:CreateFontString(nil, "BACKGROUND") F:SetFontObject(font) F:SetText(text) F:SetTextColor(LibDraw.line.r, LibDraw.line.g, LibDraw.line.b, LibDraw.line.a) F:SetPoint("TOPLEFT", UIParent, "TOPLEFT", sx - (F:GetStringWidth() * 0.5), sy) F:Show() tinsert(LibDraw.fontstrings_used, F) end end local rad90 = math.rad(-90) function LibDraw.Box(x, y, z, width, _, rotation, offset_x, offset_y) if not offset_x then offset_x = 0 end if not offset_y then offset_y = 0 end if rotation then rotation = rotation + rad90 end local half_width = width * 0.5 local p1x, p1y = LibDraw.rotateZ(x, y, z, x - half_width + offset_x, y - half_width + offset_y, z, rotation) local p2x, p2y = LibDraw.rotateZ(x, y, z, x + half_width + offset_x, y - half_width + offset_y, z, rotation) local p3x, p3y = LibDraw.rotateZ(x, y, z, x - half_width + offset_x, y + half_width + offset_y, z, rotation) local p4x, p4y = LibDraw.rotateZ(x, y, z, x - half_width + offset_x, y - half_width + offset_y, z, rotation) local p5x, p5y = LibDraw.rotateZ(x, y, z, x + half_width + offset_x, y + half_width + offset_y, z, rotation) local p6x, p6y = LibDraw.rotateZ(x, y, z, x + half_width + offset_x, y - half_width + offset_y, z, rotation) local p7x, p7y = LibDraw.rotateZ(x, y, z, x - half_width + offset_x, y + half_width + offset_y, z, rotation) local p8x, p8y = LibDraw.rotateZ(x, y, z, x + half_width + offset_x, y + half_width + offset_y, z, rotation) LibDraw.Line(p1x, p1y, z, p2x, p2y, z) LibDraw.Line(p3x, p3y, z, p4x, p4y, z) LibDraw.Line(p5x, p5y, z, p6x, p6y, z) LibDraw.Line(p7x, p7y, z, p8x, p8y, z) end local deg45 = math.rad(45) local arrowX = { {0, 0, 0, 1.5, 0, 0}, {1.5, 0, 0, 1.2, 0.2, -0.2}, {1.5, 0, 0, 1.2, -0.2, 0.2} } local arrowY = { {0, 0, 0, 0, 1.5, 0}, {0, 1.5, 0, 0.2, 1.2, -0.2}, {0, 1.5, 0, -0.2, 1.2, 0.2} } local arrowZ = { {0, 0, 0, 0, 0, 1.5}, {0, 0, 1.5, 0.2, -0.2, 1.2}, {0, 0, 1.5, -0.2, 0.2, 1.2} } function LibDraw.DrawHelper() local playerX, playerY, playerZ = NeP._G.ObjectPosition("player") local old_red, old_green, old_blue, old_alpha, old_width = LibDraw.line.r, LibDraw.line.g, LibDraw.line.b, LibDraw.line.a, LibDraw.line.w -- X LibDraw.SetColor(255, 0, 0, 100) LibDraw.SetWidth(1) LibDraw.Array(arrowX, playerX, playerY, playerZ, deg45, false, false) LibDraw.Text('X', "GameFontNormal", playerX + 1.75, playerY, playerZ) -- Y LibDraw.SetColor(0, 255, 0, 100) LibDraw.SetWidth(1) LibDraw.Array(arrowY, playerX, playerY, playerZ, false, -deg45, false) LibDraw.Text('Y', "GameFontNormal", playerX, playerY + 1.75, playerZ) -- Z LibDraw.SetColor(0, 0, 255, 100) LibDraw.SetWidth(1) LibDraw.Array(arrowZ, playerX, playerY, playerZ, false, false, false) LibDraw.Text('Z', "GameFontNormal", playerX, playerY, playerZ + 1.75) LibDraw.line.r, LibDraw.line.g, LibDraw.line.b, LibDraw.line.a, LibDraw.line .w = old_red, old_green, old_blue, old_alpha, old_width end function LibDraw.Distance(ax, ay, az, bx, by, bz) return math.sqrt(((bx - ax) * (bx - ax)) + ((by - ay) * (by - ay)) + ((bz - az) * (bz - az))) end function LibDraw.Camera() local fX, fY, fZ = NeP._G.ObjectPosition("player") local sX, sY, sZ = NeP._G.GetCameraPosition() return sX, sY, sZ, atan2(sY - fY, sX - fX), atan((sZ - fZ) / sqrt(((fX - sX) ^ 2) + ((fY - sY) ^ 2))) end function LibDraw.Sync(callback) tinsert(LibDraw.callbacks, callback) end function LibDraw.clearCanvas() -- LibDraw.stats = #LibDraw.textures_used for i = #LibDraw.textures_used, 1, -1 do LibDraw.textures_used[i]:Hide() tinsert(LibDraw.textures, tremove(LibDraw.textures_used)) end for i = #LibDraw.fontstrings_used, 1, -1 do LibDraw.fontstrings_used[i]:Hide() tinsert(LibDraw.fontstrings, tremove(LibDraw.fontstrings_used)) end for i = #LibDraw.lines_used, 1, -1 do LibDraw.lines_used[i]:Hide() tinsert(LibDraw.lines, tremove(LibDraw.lines_used)) end end local function OnUpdate() LibDraw.clearCanvas() for _, callback in ipairs(LibDraw.callbacks) do callback() if LibDraw.helper then LibDraw.DrawHelper() end LibDraw.helper = false end end function LibDraw.Enable(interval) NeP.Timer:Add('LibDraw', OnUpdate, interval) end
Editor is loading...