From 30c1b69d60019aea50515d98f64ae82e5f737f9e Mon Sep 17 00:00:00 2001 From: Apapapa Date: Wed, 12 Feb 2025 12:32:43 +0000 Subject: [PATCH] Add Library/MyUiLib --- Library/MyUiLib | 561 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 561 insertions(+) create mode 100644 Library/MyUiLib diff --git a/Library/MyUiLib b/Library/MyUiLib new file mode 100644 index 0000000..09d10a9 --- /dev/null +++ b/Library/MyUiLib @@ -0,0 +1,561 @@ +local Library = {} -- Struktur dasar sesuai kode awal Anda + +-------------------------------------------------- +-- SERVICES & VARIABLES +-------------------------------------------------- +local RunService = game:GetService("RunService") +local TweenService = game:GetService("TweenService") +local UserInputService = game:GetService("UserInputService") +local HttpService = game:GetService("HttpService") +local Players = game:GetService("Players") +local MarketplaceService = game:GetService("MarketplaceService") +local LocalizationService = game:GetService("LocalizationService") + +local LocalPlayer = Players.LocalPlayer +local GameName = MarketplaceService:GetProductInfo(game.PlaceId).Name +local NameID = LocalPlayer.Name + +-------------------------------------------------- +-- UTILITY FUNCTIONS +-------------------------------------------------- +local utility = {} +function utility:Tween(instance, properties, duration, ...) + TweenService:Create(instance, TweenInfo.new(duration, ...), properties):Play() +end + +-- Fungsi untuk memulai animasi border RGB (efek dinamis) +local function startDynamicBorder(uiElement) + local hue = 0 + spawn(function() + while uiElement and uiElement.Parent do + uiElement.BorderColor3 = Color3.fromHSV(hue, 1, 1) + hue = (hue + 0.005) % 1 + RunService.RenderStepped:Wait() + end + end) +end + +-- Fungsi untuk membuat loading screen sederhana +local function createLoadingScreen() + local sg = Instance.new("ScreenGui") + sg.Name = "LoadingScreen" + sg.ResetOnSpawn = false + sg.Parent = game.CoreGui + + local frame = Instance.new("Frame", sg) + frame.Name = "LoadingFrame" + frame.Size = UDim2.new(1, 0, 1, 0) + frame.BackgroundColor3 = Color3.new(0, 0, 0) + frame.BackgroundTransparency = 0.5 + + local spinner = Instance.new("ImageLabel", frame) + spinner.Name = "Spinner" + spinner.Size = UDim2.new(0, 100, 0, 100) + spinner.AnchorPoint = Vector2.new(0.5, 0.5) + spinner.Position = UDim2.new(0.5, 0, 0.5, 0) + spinner.Image = "rbxassetid://6034818372" -- Ganti dengan asset spinner pilihan Anda + spinner.BackgroundTransparency = 1 + + delay(2, function() + utility:Tween(frame, {BackgroundTransparency = 1}, 1, Enum.EasingStyle.Quad, Enum.EasingDirection.Out) + wait(1) + sg:Destroy() + end) +end + +-------------------------------- +-- UKURAN UI (MODE) +-------------------------------- +local sizes = { + small = {width = 400, height = 300}, + medium = {width = 600, height = 450}, + large = {width = 800, height = 600}, +} + +-------------------------------------------------- +-- SAVE/LOAD CONFIG & NOTIFICATION FUNCTIONS +-------------------------------------------------- +-- Jika fungsi writefile/readfile tidak tersedia, abaikan blok ini. +local SettingToggle = {} +local ConfigFileName = "BTConfig.JSON" +if writefile and readfile then + pcall(function() + if not pcall(function() readfile(ConfigFileName) end) then + writefile(ConfigFileName, HttpService:JSONEncode(SettingToggle)) + end + -- Hanya menyimpan string config ke variabel Settings sebagai contoh. + Settings = HttpService:JSONEncode(readfile(ConfigFileName)) + end) +else + warn("Fungsi file I/O tidak tersedia. Fitur SaveConfig/LoadConfig dinonaktifkan.") + Settings = "" +end + +function Library:SaveConfig(configTable, fileName) + if writefile and readfile then + local success, encoded = pcall(function() return HttpService:JSONEncode(configTable) end) + if success then + local ws, err = pcall(function() writefile(fileName, encoded) end) + if ws then + return true + else + warn("Failed to write config file:", err) + return false + end + else + warn("Failed to encode config:", encoded) + return false + end + else + warn("SaveConfig tidak tersedia karena file I/O tidak didukung.") + return false + end +end + +function Library:LoadConfig(fileName) + if writefile and readfile then + local success, content = pcall(function() return readfile(fileName) end) + if success and content then + local ok, decoded = pcall(function() return HttpService:JSONDecode(content) end) + if ok then + return decoded + else + warn("Failed to decode config:", decoded) + end + else + warn("Failed to read config file:", content) + end + return nil + else + warn("LoadConfig tidak tersedia karena file I/O tidak didukung.") + return nil + end +end + +function Library:MakeNotification(options) + local sg = Instance.new("ScreenGui") + sg.Name = "Notification" + sg.ResetOnSpawn = false + sg.Parent = game.CoreGui + + local frame = Instance.new("Frame", sg) + frame.Size = UDim2.new(0, 300, 0, 100) + frame.Position = UDim2.new(0.5, -150, 0.8, 0) + frame.BackgroundColor3 = Color3.fromRGB(20,20,20) + frame.BackgroundTransparency = 0.3 + frame.BorderSizePixel = 0 + + local titleLabel = Instance.new("TextLabel", frame) + titleLabel.Size = UDim2.new(1,0,0,30) + titleLabel.Text = options.Name or "Notification" + titleLabel.Font = Enum.Font.SourceSansBold + titleLabel.TextSize = 20 + titleLabel.TextColor3 = Color3.new(1,1,1) + titleLabel.BackgroundTransparency = 1 + + local contentLabel = Instance.new("TextLabel", frame) + contentLabel.Position = UDim2.new(0,0,0,30) + contentLabel.Size = UDim2.new(1,0,0,70) + contentLabel.Text = options.Content or "" + contentLabel.Font = Enum.Font.SourceSans + contentLabel.TextSize = 14 + contentLabel.TextColor3 = Color3.new(1,1,1) + contentLabel.BackgroundTransparency = 1 + + delay(options.Time or 5, function() + sg:Destroy() + end) +end + +-------------------------------------------------- +-- PEMBUATAN WINDOW, TAB, & SECTION +-------------------------------------------------- +-- Fungsi MakeWindow(options): Membuat window utama. +function Library:MakeWindow(options) + options = options or {} + local windowTitle = options.Name or "UI Library" + + createLoadingScreen() + + local sg = Instance.new("ScreenGui") + sg.Name = LibName + sg.Parent = game.CoreGui + sg.ZIndexBehavior = Enum.ZIndexBehavior.Global + + local Body = Instance.new("Frame", sg) + Body.Name = "Body" + Body.BackgroundColor3 = Color3.fromRGB(12,12,12) + Body.BorderColor3 = Color3.fromRGB(0,0,0) + Body.BorderSizePixel = 0 + Body.Position = UDim2.new(0.258, 0, 0.218, 0) + Body.Size = UDim2.new(0, 600, 0, 350) -- Ukuran default ("small") + Body.ClipsDescendants = true + + local Body_Corner = Instance.new("UICorner") + Body_Corner.CornerRadius = UDim.new(0, 5) + Body_Corner.Parent = Body + + local Title_Hub = Instance.new("TextLabel", Body) + Title_Hub.Name = "Title_Hub" + Title_Hub.BackgroundTransparency = 1 + Title_Hub.Position = UDim2.new(0, 5, 0, 0) + Title_Hub.Size = UDim2.new(0, 558, 0, 30) + Title_Hub.Font = Enum.Font.SourceSansBold + Title_Hub.Text = windowTitle .. " - " .. GameName + Title_Hub.TextColor3 = Color3.fromRGB(255,255,255) + Title_Hub.TextSize = 15 + Title_Hub.TextXAlignment = Enum.TextXAlignment.Left + + -- Tombol minimize + local MInimize_Button = Instance.new("TextButton", Body) + MInimize_Button.Name = "MInimize_Button" + MInimize_Button.BackgroundTransparency = 1 + MInimize_Button.Position = UDim2.new(0, 570, 0, 0) + MInimize_Button.Rotation = -315 + MInimize_Button.Size = UDim2.new(0, 30, 0, 30) + MInimize_Button.AutoButtonColor = false + MInimize_Button.Font = Enum.Font.SourceSans + MInimize_Button.Text = "+" + MInimize_Button.TextColor3 = Color3.fromRGB(255,255,255) + MInimize_Button.TextSize = 40 + + MInimize_Button.MouseButton1Click:Connect(function() + if Body.Visible then + utility:Tween(Body, {Size = UDim2.new(0, 600, 0, 32)}, 0.3) + utility:Tween(MInimize_Button, {Rotation = 360}, 0.3) + Body.Visible = false + else + utility:Tween(Body, {Size = UDim2.new(0, 600, 0, 350)}, 0.3) + utility:Tween(MInimize_Button, {Rotation = -315}, 0.3) + Body.Visible = true + end + end) + + startDynamicBorder(Body) + + -- Container untuk tombol tab (bagian atas Body) + local TabButtons = Instance.new("Frame", Body) + TabButtons.Name = "TabButtons" + TabButtons.Size = UDim2.new(1, 0, 0, 30) + TabButtons.Position = UDim2.new(0, 0, 0, 30) + TabButtons.BackgroundTransparency = 1 + local btnLayout = Instance.new("UIListLayout", TabButtons) + btnLayout.FillDirection = Enum.FillDirection.Horizontal + btnLayout.HorizontalAlignment = Enum.HorizontalAlignment.Left + btnLayout.SortOrder = Enum.SortOrder.LayoutOrder + btnLayout.Padding = UDim.new(0, 5) + + -- Container untuk konten tab + local TabContent = Instance.new("Frame", Body) + TabContent.Name = "TabContent" + TabContent.Size = UDim2.new(1, 0, 1, -60) + TabContent.Position = UDim2.new(0, 0, 0, 60) + TabContent.BackgroundTransparency = 1 + + local WindowObject = {} + + function WindowObject:SetUISize(mode) + local s = sizes[mode] + if s then + tween(Body, {Size = UDim2.new(0, s.width, 0, s.height)}, 0.3) + else + warn("Invalid size mode. Use 'small', 'medium', or 'large'.") + end + end + + function WindowObject:MakeTab(options) + options = options or {} + local tabName = options.Name or "Tab" + local tabButton = Instance.new("TextButton", TabButtons) + tabButton.Name = "TabButton_" .. tabName + tabButton.Size = UDim2.new(0, 100, 0, 30) + tabButton.BackgroundColor3 = Color3.fromRGB(50,50,50) + tabButton.Text = tabName + tabButton.Font = Enum.Font.SourceSans + tabButton.TextSize = 16 + tabButton.TextColor3 = Color3.new(1,1,1) + + local contentFrame = Instance.new("Frame", TabContent) + contentFrame.Name = "TabContent_" .. tabName + contentFrame.Size = UDim2.new(1, 0, 1, 0) + contentFrame.Position = UDim2.new(0, 0, 0, 0) + contentFrame.BackgroundTransparency = 1 + contentFrame.Visible = false + + tabButton.MouseButton1Click:Connect(function() + for _, v in ipairs(TabContent:GetChildren()) do + if v:IsA("Frame") then + v.Visible = false + end + end + contentFrame.Visible = true + end) + + local TabObject = {} + function TabObject:AddSection(options) + options = options or {} + local sectionName = options.Name or "Section" + local sectionFrame = Instance.new("Frame", contentFrame) + sectionFrame.Name = "Section_" .. sectionName + sectionFrame.Size = UDim2.new(1, -10, 0, 150) + sectionFrame.Position = UDim2.new(0, 5, 0, 5) + sectionFrame.BackgroundColor3 = Color3.fromRGB(30,30,30) + sectionFrame.BorderSizePixel = 0 + + local sectionHeader = Instance.new("TextLabel", sectionFrame) + sectionHeader.Name = "SectionHeader" + sectionHeader.Size = UDim2.new(1, 0, 0, 25) + sectionHeader.BackgroundTransparency = 1 + sectionHeader.Text = sectionName + sectionHeader.Font = Enum.Font.SourceSansBold + sectionHeader.TextSize = 18 + sectionHeader.TextColor3 = Color3.new(1,1,1) + sectionHeader.TextXAlignment = Enum.TextXAlignment.Left + + local elementContainer = Instance.new("Frame", sectionFrame) + elementContainer.Name = "ElementContainer" + elementContainer.Size = UDim2.new(1, 0, 1, -25) + elementContainer.Position = UDim2.new(0, 0, 0, 25) + elementContainer.BackgroundTransparency = 1 + local layout = Instance.new("UIListLayout", elementContainer) + layout.SortOrder = Enum.SortOrder.LayoutOrder + layout.Padding = UDim.new(0, 5) + + local SectionObject = {} + + function SectionObject:addButton(title, callback) + callback = callback or function() end + local btn = Instance.new("TextButton", elementContainer) + btn.Size = UDim2.new(1, -10, 0, 30) + btn.BackgroundColor3 = Color3.fromRGB(50,50,50) + btn.Text = title + btn.Font = Enum.Font.SourceSans + btn.TextSize = 16 + btn.TextColor3 = Color3.new(1,1,1) + btn.MouseButton1Click:Connect(callback) + end + + function SectionObject:addToggle(title, default, callback) + callback = callback or function() end + local toggleFrame = Instance.new("Frame", elementContainer) + toggleFrame.Size = UDim2.new(1, -10, 0, 30) + toggleFrame.BackgroundColor3 = Color3.fromRGB(50,50,50) + + local label = Instance.new("TextLabel", toggleFrame) + label.Size = UDim2.new(0.7, 0, 1, 0) + label.BackgroundTransparency = 1 + label.Text = title + label.Font = Enum.Font.SourceSans + label.TextSize = 16 + label.TextColor3 = Color3.new(1,1,1) + label.TextXAlignment = Enum.TextXAlignment.Left + + local toggleButton = Instance.new("TextButton", toggleFrame) + toggleButton.Size = UDim2.new(0.3, 0, 1, 0) + toggleButton.Position = UDim2.new(0.7, 0, 0, 0) + toggleButton.BackgroundColor3 = default and Color3.fromRGB(0,255,0) or Color3.fromRGB(255,0,0) + toggleButton.Text = default and "ON" or "OFF" + toggleButton.Font = Enum.Font.SourceSansBold + toggleButton.TextSize = 16 + toggleButton.TextColor3 = Color3.new(1,1,1) + toggleButton.MouseButton1Click:Connect(function() + default = not default + toggleButton.BackgroundColor3 = default and Color3.fromRGB(0,255,0) or Color3.fromRGB(255,0,0) + toggleButton.Text = default and "ON" or "OFF" + callback(default) + end) + end + + function SectionObject:addDropdown(title, default, list, callback) + callback = callback or function() end + local dropdownFrame = Instance.new("Frame", elementContainer) + dropdownFrame.Size = UDim2.new(1, -10, 0, 30) + dropdownFrame.BackgroundColor3 = Color3.fromRGB(50,50,50) + + local label = Instance.new("TextLabel", dropdownFrame) + label.Size = UDim2.new(0.7, 0, 1, 0) + label.BackgroundTransparency = 1 + label.Text = title .. " : " .. default + label.Font = Enum.Font.SourceSans + label.TextSize = 16 + label.TextColor3 = Color3.new(1,1,1) + label.TextXAlignment = Enum.TextXAlignment.Left + + local dropdownButton = Instance.new("TextButton", dropdownFrame) + dropdownButton.Size = UDim2.new(0.3, 0, 1, 0) + dropdownButton.Position = UDim2.new(0.7, 0, 0, 0) + dropdownButton.BackgroundColor3 = Color3.fromRGB(70,70,70) + dropdownButton.Text = "v" + dropdownButton.Font = Enum.Font.SourceSansBold + dropdownButton.TextSize = 16 + dropdownButton.TextColor3 = Color3.new(1,1,1) + + local optionsContainer = Instance.new("Frame", dropdownFrame) + optionsContainer.Size = UDim2.new(1, 0, 0, #list * 30) + optionsContainer.Position = UDim2.new(0, 0, 1, 0) + optionsContainer.BackgroundColor3 = Color3.fromRGB(50,50,50) + optionsContainer.Visible = false + + local optionsLayout = Instance.new("UIListLayout", optionsContainer) + optionsLayout.SortOrder = Enum.SortOrder.LayoutOrder + optionsLayout.Padding = UDim.new(0, 2) + + for _, option in ipairs(list) do + local optionBtn = Instance.new("TextButton", optionsContainer) + optionBtn.Size = UDim2.new(1, 0, 0, 30) + optionBtn.BackgroundColor3 = Color3.fromRGB(60,60,60) + optionBtn.Text = option + optionBtn.Font = Enum.Font.SourceSans + optionBtn.TextSize = 16 + optionBtn.TextColor3 = Color3.new(1,1,1) + optionBtn.MouseButton1Click:Connect(function() + label.Text = title .. " : " .. option + optionsContainer.Visible = false + callback(option) + end) + end + + dropdownButton.MouseButton1Click:Connect(function() + optionsContainer.Visible = not optionsContainer.Visible + end) + end + + function SectionObject:addSlider(title, min, max, default, callback) + callback = callback or function() end + local sliderFrame = Instance.new("Frame", elementContainer) + sliderFrame.Size = UDim2.new(1, -10, 0, 40) + sliderFrame.BackgroundColor3 = Color3.fromRGB(50,50,50) + + local label = Instance.new("TextLabel", sliderFrame) + label.Size = UDim2.new(0, 150, 1, 0) + label.BackgroundTransparency = 1 + label.Text = title .. " : " .. tostring(default) + label.Font = Enum.Font.SourceSans + label.TextSize = 16 + label.TextColor3 = Color3.new(1,1,1) + label.TextXAlignment = Enum.TextXAlignment.Left + + local sliderTrack = Instance.new("Frame", sliderFrame) + sliderTrack.Size = UDim2.new(1, -160, 0, 10) + sliderTrack.Position = UDim2.new(0, 160, 0.5, -5) + sliderTrack.BackgroundColor3 = Color3.fromRGB(80,80,80) + + local sliderKnob = Instance.new("Frame", sliderTrack) + sliderKnob.Size = UDim2.new(0, 10, 1, 0) + local knobX = (default - min) / (max - min) + sliderKnob.Position = UDim2.new(knobX, -5, 0, 0) + sliderKnob.BackgroundColor3 = Color3.fromRGB(255,0,0) + + local dragging = false + sliderKnob.InputBegan:Connect(function(input) + if input.UserInputType == Enum.UserInputType.MouseButton1 then + dragging = true + end + end) + sliderKnob.InputChanged:Connect(function(input) + if dragging and input.UserInputType == Enum.UserInputType.MouseMovement then + local relX = math.clamp(input.Position.X - sliderTrack.AbsolutePosition.X, 0, sliderTrack.AbsoluteSize.X) + local newVal = min + ((max - min) * (relX / sliderTrack.AbsoluteSize.X)) + sliderKnob.Position = UDim2.new(relX / sliderTrack.AbsoluteSize.X, -5, 0, 0) + label.Text = title .. " : " .. string.format("%.2f", newVal) + callback(newVal) + end + end) + sliderKnob.InputEnded:Connect(function(input) + if input.UserInputType == Enum.UserInputType.MouseButton1 then + dragging = false + end + end) + end + + function SectionObject:addKeybind(title, preset, callback) + callback = callback or function() end + local keybindFrame = Instance.new("Frame", elementContainer) + keybindFrame.Size = UDim2.new(1, -10, 0, 30) + keybindFrame.BackgroundColor3 = Color3.fromRGB(50,50,50) + + local label = Instance.new("TextLabel", keybindFrame) + label.Size = UDim2.new(0, 150, 1, 0) + label.BackgroundTransparency = 1 + label.Text = title + label.Font = Enum.Font.SourceSans + label.TextSize = 16 + label.TextColor3 = Color3.new(1,1,1) + label.TextXAlignment = Enum.TextXAlignment.Left + + local bindButton = Instance.new("TextButton", keybindFrame) + bindButton.Size = UDim2.new(0, 100, 1, 0) + bindButton.Position = UDim2.new(0, 160, 0, 0) + bindButton.BackgroundColor3 = Color3.fromRGB(70,70,70) + bindButton.Text = preset.Name + bindButton.Font = Enum.Font.SourceSansBold + bindButton.TextSize = 16 + bindButton.TextColor3 = Color3.new(1,1,1) + bindButton.MouseButton1Click:Connect(function() + bindButton.Text = "..." + local input = UserInputService.InputBegan:Wait() + if input and input.KeyCode then + bindButton.Text = input.KeyCode.Name + callback(input.KeyCode.Name) + end + end) + end + + function SectionObject:addLabel(text) + local lbl = Instance.new("TextLabel", elementContainer) + lbl.Size = UDim2.new(1, -10, 0, 20) + lbl.BackgroundTransparency = 1 + lbl.Text = text + lbl.Font = Enum.Font.SourceSans + lbl.TextSize = 16 + lbl.TextColor3 = Color3.new(1,1,1) + lbl.TextXAlignment = Enum.TextXAlignment.Left + end + + function SectionObject:addChangelog(text) + local lbl = Instance.new("TextLabel", elementContainer) + lbl.Size = UDim2.new(1, -10, 0, 20) + lbl.BackgroundTransparency = 1 + lbl.Text = text + lbl.Font = Enum.Font.SourceSans + lbl.TextSize = 16 + lbl.TextColor3 = Color3.fromRGB(85,170,255) + lbl.TextXAlignment = Enum.TextXAlignment.Left + end + + function SectionObject:addLog(text) + local lbl = Instance.new("TextLabel", elementContainer) + lbl.Size = UDim2.new(1, -10, 0, 20) + lbl.BackgroundTransparency = 1 + lbl.Text = text + lbl.Font = Enum.Font.SourceSans + lbl.TextSize = 16 + lbl.TextColor3 = Color3.fromRGB(255,255,0) + lbl.TextXAlignment = Enum.TextXAlignment.Left + end + + return SectionObject + end + + return TabObject + end + + function Library:MakeTab(options) + error("MakeTab harus dipanggil dari objek window. Gunakan Window:MakeTab(options).") + end + + function Library:AddSection(options) + error("AddSection harus dipanggil dari objek tab. Gunakan Tab:AddSection(options).") + end + + function WindowObject:MakeNotification(options) + Library:MakeNotification(options) + end + + return WindowObject +end + +-------------------------------------------------- +-- RETURN LIBRARY +-------------------------------------------------- +return Library