consoleutils.luau hinzugefügt
This commit is contained in:
309
consoleutils.luau
Normal file
309
consoleutils.luau
Normal file
@@ -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
|
||||
Reference in New Issue
Block a user