From fff979f23992c60aae94fc5c47e7a5a389320be8 Mon Sep 17 00:00:00 2001 From: redstonestudios Date: Mon, 22 Dec 2025 02:12:04 +0000 Subject: [PATCH] =?UTF-8?q?consoleutils.luau=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- consoleutils.luau | 309 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 309 insertions(+) create mode 100644 consoleutils.luau diff --git a/consoleutils.luau b/consoleutils.luau new file mode 100644 index 0000000..2575748 --- /dev/null +++ b/consoleutils.luau @@ -0,0 +1,309 @@ +--[[ + ©️ 2024-2025 upio + + Console Utils, a utility made to help with logging dynamic messages in roblox console. + https://www.upio.dev/ + https://www.mspaint.cc/ + + Please do not redistribute or claim the code as your own. + However you may use it anywhere without any credits (but credits are appreciated <3) +--]] + +local global_env = (getgenv and getgenv()) or shared or _G or {} +if global_env["console_utils"] then return global_env.console_utils end + +--// services \\-- +local cloneref = (cloneref or clonereference or function(instance: any) return instance end) +local RunService = cloneref(game:GetService("RunService")) +local CoreGui = cloneref(game:GetService("CoreGui")) + +--// module table \\-- +local MAX_LINES = 2048 --// taken from corescripts roblox repo +local library = { + custom_prints = {}; + render_stepped_conn = nil; +} + +--// variables \\-- +local ClientLog = nil; + +if not global_env._console_message_counter then + global_env._console_message_counter = 3000 +end + +--// functions \\-- +function _find_first_child(root, paths) + local instance = root + + for _, path in ipairs(paths) do + instance = instance:FindFirstChild(path) + if not instance then + return false, nil + end + end + + return true, instance +end + +function _internal_get_guid() + global_env._console_message_counter = global_env._console_message_counter + 1 + return tostring(global_env._console_message_counter) .. tostring(tick()) +end + +function _internal_get_console() + return _find_first_child(CoreGui, { "DevConsoleMaster", "DevConsoleWindow", "DevConsoleUI", "MainView", "ClientLog" }) +end + +--// module functions \\-- +function library.custom_print(...) + local custom_print = { + message = "", + image = "", + color = Color3.fromRGB(255, 255, 255), + timestamp = os.date("%H:%M:%S"), + UMID = _internal_get_guid() + } + + --// fetch data \\-- + if typeof(select(1, ...)) == "table" then + local data = select(1, ...) + + if typeof(data.message) == "string" then + custom_print.message = data.message + end + + if typeof(data.image) == "string" then + custom_print.image = data.image + end + + if typeof(data.color) == "Color3" then + custom_print.color = data.color + end + else + local msg = select(1, ...) + local img = select(2, ...) + local clr = select(3, ...) + + if typeof(msg) == "string" then + custom_print.message = msg + end + + if typeof(img) == "string" then + custom_print.image = img + end + + if typeof(clr) == "Color3" then + custom_print.color = clr + end + end + + --// for main loop \\-- + local logData = nil; + local logName = nil; + local logCooldown = false; + + --// insert into prints table, also cut old prints if over max lines \\-- + while #library.custom_prints > MAX_LINES do table.remove(library.custom_prints, 1); end + table.insert(library.custom_prints, custom_print) + + custom_print.update = function(ClientLogChildren) + if not ClientLog then return end + + --// Get the instance \\-- + if not logName then + if logCooldown then return end + logCooldown = true; + + for _, logFrame in ClientLogChildren do + local msgInst = logFrame:FindFirstChild("msg") + if not (msgInst and string.match(msgInst.Text, tostring(custom_print.UMID) .. "$")) then continue end + + logName = logFrame.Name; + break; + end + + task.delay(math.random() / 5, function() logCooldown = false; end) + return; + end + + if not (logData and logData.frame and logData.frame.Parent) then + logData = nil; + + local logFrame = ClientLog:FindFirstChild(logName); + if not logFrame then return end + + local msgInst, imgInst = logFrame:FindFirstChild("msg"), logFrame:FindFirstChild("image"); + if not (msgInst and imgInst) then return end + + if not string.match(msgInst.Text, tostring(custom_print.UMID) .. "$") then return end + + logData = { + frame = logFrame; + msg = msgInst; + img = imgInst; + }; + return + end + + --// Update the message \\-- + if logData.msg then + logData.msg.Text = custom_print.timestamp .. " -- " .. custom_print.message + logData.msg.TextColor3 = custom_print.color + logData.msg.TextWrapped = true + end + + --// Update the image \\-- + if logData.img then + logData.img.Image = custom_print.image + logData.img.ImageColor3 = custom_print.color + end + end + + --// print functions \\-- + local log_module = {} + + log_module.update_message = function(...) + local update_timestamp = true + + if typeof(select(1, ...)) == "table" then + local data = select(1, ...) + + if typeof(data.message) == "string" then + custom_print.message = data.message + end + + if typeof(data.image) == "string" then + custom_print.image = data.image + end + + if typeof(data.color) == "Color3" then + custom_print.color = data.color + end + + if typeof(data.update_timestamp) == "boolean" then + update_timestamp = data.update_timestamp + end + else + local msg = select(1, ...) + local img = select(2, ...) + local clr = select(3, ...) + local update = select(4, ...) + + if typeof(msg) == "string" then + custom_print.message = msg + end + + if typeof(img) == "string" then + custom_print.image = img + end + + if typeof(clr) == "Color3" then + custom_print.color = clr + end + + if typeof(update) == "boolean" then + update_timestamp = update + end + end + + if update_timestamp then + custom_print.timestamp = os.date("%H:%M:%S") + end + end + + log_module.cleanup = function() + for i, print_data in pairs(library.custom_prints) do + if print_data.UMID == custom_print.UMID then + table.remove(library.custom_prints, i) + break + end + end + + custom_print.update = function() end + end + + -- unique message id + print(custom_print.UMID) + return log_module +end + +function library.custom_console_progressbar(params) + if typeof(params) == "string" then + params = {msg = params} + end + + local msg = params["msg"] or params["message"] + local clr = params["clr"] or params["color"] + local img = params["img"] or params["image"] + + local progressbar_length = params["length"] or 10 + + local progressbar_char = "█" + local progressbar_empty = "░" + + local message = library.custom_print(msg, img, clr) + local progress = 0 + + --// print module \\-- + local progressbar_module = {} + + progressbar_module.update_message = function(_message, _image, _color) + message.update_message({ + message = _message, + image = _image, + color = _color, + update_timestamp = false + }) + end + + progressbar_module.update_progress = function(_progress) + progress = _progress + local progressbar_string = "" + + local normalized_progress = math.floor(progress / progressbar_length * 100) + + for i = 1, 10 do + if i <= progress / progressbar_length * 10 then + progressbar_string = progressbar_string .. progressbar_char + else + progressbar_string = progressbar_string .. progressbar_empty + end + end + + message.update_message(msg .. " [" .. progressbar_string .. "] " .. normalized_progress .. "%", img, clr, false) + end + + progressbar_module.update_message_with_progress = function(_message, _progress) + _progress = _progress or progress + + msg = _message + progressbar_module.update_progress(_progress) + end + + progressbar_module.cleanup = message.cleanup + + return progressbar_module +end + +--// update loop \\-- +library.render_stepped_conn = RunService.RenderStepped:Connect(function() + if #library.custom_prints == 0 then return end + + --// update client log \\-- + if not (ClientLog and ClientLog.Parent) then + local exists, newClientLog = _internal_get_console() + if not (exists and newClientLog) then return end + + ClientLog = newClientLog; + end + + --// prints update \\-- + local ClientLogChildren = ClientLog:GetChildren() + for _, print_data in next, library.custom_prints do + print_data.update(ClientLogChildren) + end +end) + +--// return the module \\-- +global_env.console_utils = library +return library \ No newline at end of file