-- ============================================================================ -- MasterReset ยท Panel (CLIENTE) -- Modelo de cargas: la barra se llena RequiredCharges (10) veces; un contador -- muestra las cargas y solo al llegar a 10/10 se habilita el Master Reset. -- Diseno tipo tabla (celdas con tonos alternos), tema Scripts\MasterHub\Theme.lua. -- ============================================================================ local CONFIG = require("Scripts\\MasterReset\\Config") local THEME = require("Scripts\\MasterHub\\Theme") local MasterReset = { Resets = 0, Points = 0, Charges = 0, Required = 10, Exp = 0, Need = 1, Gp = 0, Sess = 0, Mult = 1.0, Vip = false, Event = false, Arena = false, Ready = false, MlOk = false, HasData = false, Visible = false, Minimized = false, PanelX = nil, PanelY = nil, Dragging = false, DragOX = 0, DragOY = 0, BonusView = false, BonusList = {}, BonusPool = 0, BonusTotal = 1, } BridgeFunctionAttach("MainInterfaceProcThread", "MasterReset_Render") BridgeFunctionAttach("UpdateMouseEvent", "MasterReset_UpdateMouse") -- --------------------------------------------------------------------------- -- Helpers -- --------------------------------------------------------------------------- local function clamp(v, a, b) v = tonumber(v) or a if v < a then return a end if v > b then return b end return v end local function isMouseOver(x, y, w, h) local mx, my = MousePosX(), MousePosY() return mx >= x and mx <= (x + w) and my >= y and my <= (y + h) end local function blockGameClick() if DisableCLick ~= nil then DisableCLick() elseif DisableClickClient ~= nil then DisableClickClient() end end local function resetMouseLeft() if ResetMouseL ~= nil then ResetMouseL() end end local drawRect = THEME.DrawRect local function rgb(c) return math.floor(c[1]*255), math.floor(c[2]*255), math.floor(c[3]*255) end local function trimStr(v) v = tostring(v or "") v = string.gsub(v, "%z", "") v = string.gsub(v, "%s+$", "") return v end local function groupNum(n) local s = tostring(math.floor(tonumber(n) or 0)) local out = string.reverse(s) out = string.gsub(out, "(%d%d%d)", "%1.") out = string.reverse(out) out = string.gsub(out, "^%.", "") return out end local function pct01() if MasterReset.Need <= 0 then return 0 end local p = MasterReset.Exp / MasterReset.Need if p < 0 then p = 0 end if p > 1 then p = 1 end return p end -- true si la ventana de chat esta abierta (para ocultar la barra minimizada) local function chatOpen() if CheckWindowOpen == nil then return false end local key = UIChatWindow or 33 local ok, r = pcall(CheckWindowOpen, key) return ok and r ~= nil and r ~= 0 end -- Mapa actual del personaje (para desactivar la barra mini en ciertos mapas) local function currentMap() if UserGetMap ~= nil then local ok, m = pcall(UserGetMap); if ok then return tonumber(m) end end if GetCharacterMap ~= nil then local ok, m = pcall(GetCharacterMap); if ok then return tonumber(m) end end return nil end -- true si el mapa actual esta en NoMiniMaps (ej. Castle Siege): sin barra mini local function isNoMiniMap() local m = currentMap() if m == nil then return false end local list = CONFIG.NoMiniMaps or {} for i = 1, #list do if tonumber(list[i]) == m then return true end end return false end -- Minimizar: en mapas normales -> barra abajo; en NoMiniMaps -> cierra el panel local function applyMinimize() MasterReset.BonusView = false if isNoMiniMap() then MasterReset.Visible = false else MasterReset.Minimized = true end end -- --------------------------------------------------------------------------- -- Envio de accion: 1 = pedir estado | 2 = ejecutar reset -- --------------------------------------------------------------------------- local function sendAction(action) CreatePacket(CONFIG.PacketName, CONFIG.PacketHead) SetBytePacket(CONFIG.PacketName, action) if GetPlayerIndex ~= nil then SendPacket(CONFIG.PacketName, GetPlayerIndex()) else SendPacket(CONFIG.PacketName, 0) end ClearPacket(CONFIG.PacketName) end -- --------------------------------------------------------------------------- -- Protocolo: recepcion del estado -- --------------------------------------------------------------------------- function MasterReset.Protocol(packet, packetName) if tonumber(CONFIG.Enable) == 0 or packetName ~= CONFIG.PacketName then return false end local numLen = tonumber(CONFIG.NumLen) or 18 local sessLen = tonumber(CONFIG.SessLen) or 14 local action = tonumber(GetBytePacket(packetName, -1)) or 1 -- action 3 = lista Bonus (data-driven desde el Config del server) if action == 3 then local nameLen = tonumber(CONFIG.BonusNameLen) or 20 local tagLen = tonumber(CONFIG.BonusTagLen) or 8 local count = tonumber(GetBytePacket(packetName, -1)) or 0 MasterReset.BonusPool = (tonumber(GetWordPacket(packetName, -1)) or 0) / 10 MasterReset.BonusTotal = (tonumber(GetWordPacket(packetName, -1)) or 100) / 100 local list = {} for i = 1, count do local section = tonumber(GetBytePacket(packetName, -1)) or 0 local active = (tonumber(GetBytePacket(packetName, -1)) or 0) == 1 local nm = trimStr(GetCharPacketLength(packetName, -1, nameLen)) local tag = trimStr(GetCharPacketLength(packetName, -1, tagLen)) list[i] = { section = section, active = active, name = nm, tag = tag } end MasterReset.BonusList = list ClearPacket(packetName) return true end MasterReset.Resets = tonumber(GetWordPacket(packetName, -1)) or 0 MasterReset.Points = tonumber(GetWordPacket(packetName, -1)) or 0 MasterReset.Charges = tonumber(GetBytePacket(packetName, -1)) or 0 MasterReset.Required = tonumber(GetBytePacket(packetName, -1)) or 10 MasterReset.Exp = tonumber(trimStr(GetCharPacketLength(packetName, -1, numLen))) or 0 MasterReset.Need = tonumber(trimStr(GetCharPacketLength(packetName, -1, numLen))) or 1 MasterReset.Gp = tonumber(trimStr(GetCharPacketLength(packetName, -1, numLen))) or 0 MasterReset.Sess = tonumber(trimStr(GetCharPacketLength(packetName, -1, sessLen))) or 0 local multX100 = tonumber(GetWordPacket(packetName, -1)) or 100 local mask = tonumber(GetBytePacket(packetName, -1)) or 0 MasterReset.Ready = (tonumber(GetBytePacket(packetName, -1)) or 0) == 1 MasterReset.MlOk = (tonumber(GetBytePacket(packetName, -1)) or 0) == 1 MasterReset.Mult = multX100 / 100 MasterReset.Vip = (mask % 2) >= 1 MasterReset.Event = (math.floor(mask / 2) % 2) >= 1 MasterReset.Arena = (math.floor(mask / 4) % 2) >= 1 MasterReset.HasData = true if not MasterReset.Visible and tonumber(CONFIG.ShowMinimizedOnStart) == 1 and MasterReset.MlOk then MasterReset.Visible = true MasterReset.Minimized = true end if action == 2 then MasterReset.Visible = true MasterReset.Minimized = true end ClearPacket(packetName) return true end function MasterReset.Init() ProtocolFunctions.ClientProtocol(MasterReset.Protocol) end -- --------------------------------------------------------------------------- -- Layout -- --------------------------------------------------------------------------- local function getPanelLayout() local P = CONFIG.Panel or {} local w = tonumber(P.Width) or 218 local h = tonumber(P.Height) or 192 local sh = tonumber(CONFIG.ScreenHeight) or 480 local defX = tonumber(P.PosX) or (GetWideX() - w - 18) local defY = tonumber(P.PosY) or 90 MasterReset.PanelX = clamp(tonumber(MasterReset.PanelX) or defX, 0, math.max(0, GetWideX() - w)) MasterReset.PanelY = clamp(tonumber(MasterReset.PanelY) or defY, 0, math.max(0, sh - h)) return MasterReset.PanelX, MasterReset.PanelY, w, h end local function getMiniLayout() local M = CONFIG.Mini or {} local w = tonumber(M.Width) or 220 local h = tonumber(M.Height) or 16 local sh = tonumber(CONFIG.ScreenHeight) or 480 local x = tonumber(M.PosX) or math.floor((GetWideX() - w) / 2) local y = tonumber(M.PosY) or (sh - 74) return x, y, w, h end -- --------------------------------------------------------------------------- -- Celda de estadistica (tabla con tonos alternos) -- --------------------------------------------------------------------------- local function drawCellText(x, y, w, label, value, col) SetFontType(0) SetTextBg(0, 0, 0, 0) THEME.SetTextDimColor() RenderText(x + 6, y + 4, label, w - 8, ALIGN_LEFT) if col ~= nil then local r, g, b = rgb(col); SetTextColor(r, g, b, 255) else THEME.SetTextColor() end RenderText(x + 6, y + 12, value, w - 8, ALIGN_LEFT) end -- --------------------------------------------------------------------------- -- Panel maximizado -- --------------------------------------------------------------------------- function MasterReset.DrawPanel() local C = CONFIG.Colors or {} local x, y, w, h = getPanelLayout() local headerH = tonumber((CONFIG.Panel or {}).HeaderH) or 18 local px = x + 10 local innerW = w - 20 local by = y + headerH SetBlend(1) THEME.DrawFrame(x, y, w, h, headerH) -- Titulo + minimizar SetFontType(1) SetTextBg(0, 0, 0, 0) THEME.SetTitleColor() RenderText(x, y + 4, "MASTER RESET", w - 16, ALIGN_CENTER) local minX, minY, minW, minH = x + w - 16, y + 3, 12, 12 drawRect(minX, minY, minW, minH, isMouseOver(minX, minY, minW, minH) and THEME.Colors.ButtonHover or THEME.Colors.Button) SetFontType(0) SetTextColor(230, 240, 250, 255) RenderText(minX, minY + 1, "-", minW, ALIGN_CENTER) -- Fila: numero de MasterResets (izq) + estado ML (der) SetFontType(0) THEME.SetTextDimColor() RenderText(px, by + 3, "MASTER RESET", 90, ALIGN_LEFT) SetFontType(1) SetTextColor(255, 255, 255, 255) RenderText(px, by + 11, tostring(MasterReset.Resets), 90, ALIGN_LEFT) SetFontType(0) if MasterReset.MlOk then local r, g, b = rgb(C.Green); SetTextColor(r, g, b, 255) RenderText(x, by + 8, "Master Level OK", innerW, ALIGN_RIGHT) else local r, g, b = rgb(C.Red); SetTextColor(r, g, b, 255) RenderText(x, by + 8, "Requiere ML 400", innerW, ALIGN_RIGHT) end -- Contador de cargas (pips + X/N) local cy = by + 30 drawRect(px, cy, innerW, 15, { 0.06, 0.10, 0.13, 0.55 }) SetFontType(0) THEME.SetTextDimColor() RenderText(px + 5, cy + 3, "CARGAS", 46, ALIGN_LEFT) local req = math.max(1, MasterReset.Required) local pipsX = px + 52 local pipsW = innerW - 52 - 40 local pipGap = 2 local pipW = math.max(3, math.floor((pipsW - (req - 1) * pipGap) / req)) for i = 1, req do local fx = pipsX + (i - 1) * (pipW + pipGap) local on = i <= MasterReset.Charges local col = on and (MasterReset.Ready and C.Gold or C.XpFill) or { 0.00, 0.00, 0.00, 0.45 } drawRect(fx, cy + 3, pipW, 9, col) end if MasterReset.Ready then local r, g, b = rgb(C.Gold); SetTextColor(r, g, b, 255) else local r, g, b = rgb(C.XpFill); SetTextColor(r, g, b, 255) end RenderText(x, cy + 3, MasterReset.Charges .. " / " .. MasterReset.Required, innerW - 4, ALIGN_RIGHT) -- Barra de la carga actual local barX, barY, barW, barH = px, cy + 20, innerW, 15 local p = pct01() drawRect(barX, barY, barW, barH, C.XpBack) if p > 0 then drawRect(barX, barY, math.floor(barW * p), barH, C.XpFill) drawRect(barX, barY, math.floor(barW * p), 1, C.XpBevel) end SetFontType(0) SetTextColor(235, 245, 252, 255) RenderText(barX, barY + 3, groupNum(MasterReset.Exp) .. " / " .. groupNum(MasterReset.Need), barW, ALIGN_CENTER) -- Meta local metaY = barY + barH + 3 THEME.SetTextDimColor() RenderText(px, metaY, "Progreso " .. math.floor(p * 100) .. "%", 90, ALIGN_LEFT) local rest = MasterReset.Need - MasterReset.Exp if rest < 0 then rest = 0 end RenderText(x, metaY, "Restante " .. groupNum(rest), innerW, ALIGN_RIGHT) -- Tabla de stats (celdas con tonos alternos) local sY = metaY + 14 local colW = math.floor(innerW / 2) local rowH = 22 local toneA = { 0.15, 0.19, 0.23, 0.42 } local toneB = { 0.08, 0.11, 0.14, 0.42 } local sep = { 0.00, 0.00, 0.00, 0.35 } drawRect(px, sY, colW * 2, rowH, toneA) drawRect(px, sY + rowH, colW * 2, rowH, toneB) drawRect(px + colW, sY, 1, rowH * 2, sep) drawRect(px, sY + rowH, colW * 2, 1, sep) drawCellText(px, sY, colW, "EXP SESION", groupNum(MasterReset.Sess), C.Green) drawCellText(px + colW, sY, colW, "MULTIPLICADOR", "x" .. string.format("%.2f", MasterReset.Mult), C.XpFill) drawCellText(px, sY + rowH, colW, "PUNTOS GANADOS", tostring(MasterReset.Points), C.Gold) drawCellText(px + colW, sY + rowH, colW, "GP OBTENIDOS", groupNum(MasterReset.Gp), C.Gold) -- Boton BONUS: abre la lista de fuentes de exp en la MISMA ventana local bY = sY + rowH * 2 + 5 local bonusH = 15 MasterReset.BonusBtnArea = { x = px, y = bY, w = innerW, h = bonusH } local hoverBonus = isMouseOver(px, bY, innerW, bonusH) drawRect(px, bY, innerW, bonusH, hoverBonus and THEME.Colors.ButtonHover or THEME.Colors.Button) SetFontType(0) local br, bgc, bb = rgb(C.XpFill); SetTextColor(br, bgc, bb, 255) RenderText(px, bY + 2, "BONUS DE EXP x" .. string.format("%.2f", MasterReset.Mult), innerW, ALIGN_CENTER) -- Boton de reset local btnX, btnY, btnW, btnH = px, bY + bonusH + 3, innerW, 20 MasterReset.BtnArea = { x = btnX, y = btnY, w = btnW, h = btnH } if MasterReset.Ready then drawRect(btnX, btnY, btnW, btnH, C.Ready) SetFontType(1) SetTextColor(10, 20, 28, 255) RenderText(btnX, btnY + 4, "EJECUTAR MASTER RESET", btnW, ALIGN_CENTER) else drawRect(btnX, btnY, btnW, btnH, { 0.05, 0.08, 0.10, 0.55 }) SetFontType(0) THEME.SetTextDimColor() local txt if not MasterReset.MlOk then txt = "Requiere Master Level 400" else txt = "Faltan cargas (" .. MasterReset.Charges .. "/" .. MasterReset.Required .. ")" end RenderText(btnX, btnY + 5, txt, btnW, ALIGN_CENTER) end DisableAlphaBlend() end -- Barra inferior (minimizado) function MasterReset.DrawMini() local C = CONFIG.Colors or {} local x, y, w, h = getMiniLayout() MasterReset.MiniArea = { x = x, y = y, w = w, h = h } local p = pct01() SetBlend(1) drawRect(x, y, w, h, { 0.04, 0.07, 0.10, 0.92 }) drawRect(x, y, w, 1, THEME.Colors.GoldLight) drawRect(x, y + h - 1, w, 1, THEME.Colors.GoldDark) SetFontType(0) SetTextBg(0, 0, 0, 0) local lr, lg, lb = rgb(THEME.Colors.GoldLight) SetTextColor(lr, lg, lb, 255) RenderText(x + 6, y + 4, "MASTER RESET", 80, ALIGN_LEFT) local gr, gg, gb = rgb(C.Gold) SetTextColor(gr, gg, gb, 255) RenderText(x + 86, y + 4, MasterReset.Charges .. "/" .. MasterReset.Required, 32, ALIGN_LEFT) -- barra de la carga actual local bx, bw = x + 122, w - 154 drawRect(bx, y + 5, bw, 6, C.XpBack) if p > 0 then drawRect(bx, y + 5, math.floor(bw * p), 6, C.XpFill) end THEME.SetTextColor() RenderText(x, y + 4, math.floor(p * 100) .. "%", w - 6, ALIGN_RIGHT) DisableAlphaBlend() end -- --------------------------------------------------------------------------- -- Vista Bonus (misma ventana): lista de fuentes de exp, verde suave = activo -- --------------------------------------------------------------------------- function MasterReset.DrawBonus() local C = CONFIG.Colors or {} local w = tonumber((CONFIG.Panel or {}).Width) or 218 local headerH = tonumber((CONFIG.Panel or {}).HeaderH) or 18 local sh = tonumber(CONFIG.ScreenHeight) or 480 local rows = MasterReset.BonusList or {} local n = #rows local rowH = 14 local sections, seen = 0, {} for i = 1, n do local s = rows[i].section or 0 if not seen[s] then seen[s] = true; sections = sections + 1 end end local h = headerH + 4 + 17 + (sections * 12) + (n * rowH) + 24 if n == 0 then h = headerH + 4 + 17 + 22 end local x = clamp(MasterReset.PanelX or (GetWideX() - w - 18), 0, math.max(0, GetWideX() - w)) local y = clamp(MasterReset.PanelY or 90, 0, math.max(0, sh - h)) MasterReset.PanelX, MasterReset.PanelY = x, y MasterReset.BonusArea = { x = x, y = y, w = w, h = h } local px = x + 10 local innerW = w - 20 SetBlend(1) THEME.DrawFrame(x, y, w, h, headerH) SetFontType(1); SetTextBg(0, 0, 0, 0); THEME.SetTitleColor() RenderText(x, y + 4, "MASTER RESET", w - 16, ALIGN_CENTER) local minX, minY = x + w - 16, y + 3 drawRect(minX, minY, 12, 12, isMouseOver(minX, minY, 12, 12) and THEME.Colors.ButtonHover or THEME.Colors.Button) SetFontType(0); SetTextColor(230, 240, 250, 255); RenderText(minX, minY + 1, "-", 12, ALIGN_CENTER) local cy = y + headerH + 4 local backW = 54 MasterReset.BackArea = { x = px, y = cy, w = backW, h = 13 } drawRect(px, cy, backW, 13, isMouseOver(px, cy, backW, 13) and THEME.Colors.ButtonHover or THEME.Colors.Button) SetFontType(0); local cr, cg, cb = rgb(C.XpFill); SetTextColor(cr, cg, cb, 255) RenderText(px, cy + 2, "< Volver", backW, ALIGN_CENTER) THEME.SetTextDimColor(); RenderText(x, cy + 2, "Fuentes de exp", innerW, ALIGN_RIGHT) cy = cy + 17 if n == 0 then THEME.SetTextDimColor(); RenderText(px, cy + 2, "Cargando...", innerW, ALIGN_CENTER) DisableAlphaBlend() return end local lastSection = -1 for i = 1, n do local e = rows[i] local sc = e.section or 0 if sc ~= lastSection then lastSection = sc SetFontType(0); local sr, sg, sb = rgb(C.XpFill); SetTextColor(sr, sg, sb, 210) RenderText(px, cy, sc == 0 and "ITEMS / SELLOS (ponderado)" or "CONTEXTO (multiplicadores)", innerW, ALIGN_LEFT) cy = cy + 12 end drawRect(px, cy, innerW, rowH - 1, e.active and (C.GreenSoft or { 0.34, 0.81, 0.52, 0.16 }) or { 1, 1, 1, 0.02 }) drawRect(px + 3, cy + 4, 4, 4, e.active and C.Green or { 0.24, 0.28, 0.32, 1 }) if e.active then local r, g, b = rgb(C.Green); SetTextColor(r, g, b, 255) else THEME.SetTextDimColor() end RenderText(px + 12, cy + 2, e.name, innerW - 54, ALIGN_LEFT) if e.active then local r, g, b = rgb(C.Green); SetTextColor(r, g, b, 255) else SetTextColor(110, 124, 138, 220) end RenderText(x, cy + 2, e.tag, innerW - 4, ALIGN_RIGHT) cy = cy + rowH end cy = cy + 3 drawRect(px, cy, innerW, 1, { 0, 0, 0, 0.35 }) cy = cy + 4 SetFontType(0); THEME.SetTextDimColor(); RenderText(px, cy, "Ponderado", 70, ALIGN_LEFT) local r, g, b = rgb(C.XpFill); SetTextColor(r, g, b, 255) RenderText(x, cy, "+" .. string.format("%.1f", MasterReset.BonusPool or 0) .. "% x" .. string.format("%.2f", MasterReset.BonusTotal or 1), innerW, ALIGN_RIGHT) DisableAlphaBlend() end function MasterReset.RenderCore() if tonumber(CONFIG.Enable) == 0 then return end if GetMainScene() ~= 5 then return end if not MasterReset.Visible or not MasterReset.HasData then return end if MasterReset.Minimized then if isNoMiniMap() then return end -- CS: sin barra mini if tonumber(CONFIG.HideMiniWhenChatOpen) == 1 and chatOpen() then return end MasterReset.DrawMini() elseif MasterReset.BonusView then MasterReset.BonusTick = (MasterReset.BonusTick or 0) + 1 if (MasterReset.BonusTick % 180) == 0 then sendAction(3) end -- refresco ~3s MasterReset.DrawBonus() else MasterReset.DrawPanel() end end -- --------------------------------------------------------------------------- -- Mouse -- --------------------------------------------------------------------------- function MasterReset.MouseCore() if tonumber(CONFIG.Enable) == 0 or not MasterReset.Visible or not MasterReset.HasData then MasterReset.Dragging = false return end if GetMainScene() ~= 5 then MasterReset.Dragging = false return end local pressed = CheckPressedKey(Keys.LButton) == 1 local released = CheckReleasedKey(Keys.LButton) == 1 local mx, my = MousePosX(), MousePosY() if MasterReset.Minimized then if isNoMiniMap() then return end -- CS: no hay barra mini que clickear local a = MasterReset.MiniArea if a ~= nil and isMouseOver(a.x, a.y, a.w, a.h) then blockGameClick() if released then MasterReset.Minimized = false; resetMouseLeft() end end return end -- Vista Bonus: arrastre por cabecera + minimizar + Volver if MasterReset.BonusView then local a = MasterReset.BonusArea or { x = 0, y = 0, w = 218, h = 192 } local bx, byy, bw, bh = a.x, a.y, a.w, a.h if isMouseOver(bx, byy, bw, bh) or MasterReset.Dragging then blockGameClick() end if MasterReset.Dragging then local sh = tonumber(CONFIG.ScreenHeight) or 480 MasterReset.PanelX = clamp(mx - MasterReset.DragOX, 0, math.max(0, GetWideX() - bw)) MasterReset.PanelY = clamp(my - MasterReset.DragOY, 0, math.max(0, sh - bh)) if released then MasterReset.Dragging = false; resetMouseLeft() end return end local mX, mY = bx + bw - 16, byy + 3 if released and isMouseOver(mX, mY, 12, 12) then applyMinimize(); resetMouseLeft(); return end local bk = MasterReset.BackArea if released and bk ~= nil and isMouseOver(bk.x, bk.y, bk.w, bk.h) then MasterReset.BonusView = false; resetMouseLeft(); return end local headerH = tonumber((CONFIG.Panel or {}).HeaderH) or 18 if tonumber((CONFIG.Panel or {}).Draggable) == 1 and pressed and isMouseOver(bx, byy, bw - 18, headerH) then MasterReset.Dragging = true; MasterReset.DragOX = mx - bx; MasterReset.DragOY = my - byy end return end local x, y, w, h = getPanelLayout() local overPanel = isMouseOver(x, y, w, h) if overPanel or MasterReset.Dragging then blockGameClick() end if MasterReset.Dragging then local sh = tonumber(CONFIG.ScreenHeight) or 480 MasterReset.PanelX = clamp(mx - MasterReset.DragOX, 0, math.max(0, GetWideX() - w)) MasterReset.PanelY = clamp(my - MasterReset.DragOY, 0, math.max(0, sh - h)) if released then MasterReset.Dragging = false; resetMouseLeft() end return end local minX, minY = x + w - 16, y + 3 local overMin = isMouseOver(minX, minY, 12, 12) local btn = MasterReset.BtnArea local overBtn = btn ~= nil and isMouseOver(btn.x, btn.y, btn.w, btn.h) local overHeader = isMouseOver(x, y, w - 18, tonumber((CONFIG.Panel or {}).HeaderH) or 18) if released and overMin then applyMinimize() resetMouseLeft() return end if released and overBtn and MasterReset.Ready then sendAction(2) resetMouseLeft() return end local bb = MasterReset.BonusBtnArea if released and bb ~= nil and isMouseOver(bb.x, bb.y, bb.w, bb.h) then MasterReset.BonusView = true sendAction(3) -- pedir la lista al server resetMouseLeft() return end if tonumber((CONFIG.Panel or {}).Draggable) == 1 and pressed and overHeader and not overMin then MasterReset.Dragging = true MasterReset.DragOX = mx - x MasterReset.DragOY = my - y end end -- --------------------------------------------------------------------------- -- Envolturas protegidas -- --------------------------------------------------------------------------- function MasterReset_Render() local ok, err = pcall(MasterReset.RenderCore) if not ok then pcall(Console, 1, "[MasterReset] render: " .. tostring(err)) end end function MasterReset_UpdateMouse() local ok, err = pcall(MasterReset.MouseCore) if not ok then pcall(Console, 1, "[MasterReset] mouse: " .. tostring(err)) end end MasterReset.Init() _G.MasterResetStatus = MasterReset -- ### MASTERHUB REGISTRO ### MasterHubQueue = MasterHubQueue or {} table.insert(MasterHubQueue, { Id = "masterreset", Label = "Master Reset", Order = tonumber(CONFIG.Order) or 15, IsVisible = function() return tonumber(CONFIG.Enable) == 1 end, GetCount = function() return MasterReset.Ready and 1 or 0 end, OnClick = function() MasterReset.Visible = true MasterReset.Minimized = false MasterReset.BonusView = false sendAction(1) if not MasterReset.MlOk and MasterReset.HasData then return "Requiere Master Level 400" end return nil end, }) return MasterReset