SHOW:
|
|
- or go back to the newest paste.
1 | local library = {count = 0, queue = {}, callbacks = {}, rainbowtable = {}, toggled = true, binds = {}}; | |
2 | local defaults; do | |
3 | local dragger = {}; do | |
4 | local mouse = game:GetService("Players").LocalPlayer:GetMouse(); | |
5 | local inputService = game:GetService('UserInputService'); | |
6 | local heartbeat = game:GetService("RunService").Heartbeat; | |
7 | -- // credits to Ririchi / Inori for this cute drag function :) | |
8 | function dragger.new(frame) | |
9 | local s, event = pcall(function() | |
10 | return frame.MouseEnter | |
11 | end) | |
12 | ||
13 | if s then | |
14 | frame.Active = true; | |
15 | ||
16 | event:connect(function() | |
17 | local input = frame.InputBegan:connect(function(key) | |
18 | if key.UserInputType == Enum.UserInputType.MouseButton1 then | |
19 | local objectPosition = Vector2.new(mouse.X - frame.AbsolutePosition.X, mouse.Y - frame.AbsolutePosition.Y); | |
20 | while heartbeat:wait() and inputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1) do | |
21 | pcall(function() | |
22 | frame:TweenPosition(UDim2.new(0, mouse.X - objectPosition.X + (frame.Size.X.Offset * frame.AnchorPoint.X), 0, mouse.Y - objectPosition.Y + (frame.Size.Y.Offset * frame.AnchorPoint.Y)), 'Out', 'Linear', 0.1, true); | |
23 | end) | |
24 | end | |
25 | end | |
26 | end) | |
27 | ||
28 | local leave; | |
29 | leave = frame.MouseLeave:connect(function() | |
30 | input:disconnect(); | |
31 | leave:disconnect(); | |
32 | end) | |
33 | end) | |
34 | end | |
35 | end | |
36 | ||
37 | game:GetService('UserInputService').InputBegan:connect(function(key, gpe) | |
38 | if (not gpe) then | |
39 | if key.KeyCode == Enum.KeyCode.RightControl then | |
40 | library.toggled = not library.toggled; | |
41 | for i, data in next, library.queue do | |
42 | local pos = (library.toggled and data.p or UDim2.new(-1, 0, -0.5,0)) | |
43 | data.w:TweenPosition(pos, (library.toggled and 'Out' or 'In'), 'Quad', 0.15, true) | |
44 | wait(); | |
45 | end | |
46 | end | |
47 | end | |
48 | end) | |
49 | end | |
50 | ||
51 | local types = {}; do | |
52 | types.__index = types; | |
53 | function types.window(name, options) | |
54 | library.count = library.count + 1 | |
55 | local newWindow = library:Create('Frame', { | |
56 | Name = name; | |
57 | Size = UDim2.new(0, 190, 0, 30); | |
58 | BackgroundColor3 = options.topcolor; | |
59 | BorderSizePixel = 0; | |
60 | Parent = library.container; | |
61 | Position = UDim2.new(0, (15 + (200 * library.count) - 200), 0, 0); | |
62 | ZIndex = 3; | |
63 | library:Create('TextLabel', { | |
64 | Text = name; | |
65 | Size = UDim2.new(1, -10, 1, 0); | |
66 | Position = UDim2.new(0, 5, 0, 0); | |
67 | BackgroundTransparency = 1; | |
68 | Font = Enum.Font.SourceSansSemibold; | |
69 | TextSize = options.titlesize; | |
70 | Font = Enum.Font.SourceSansSemibold; | |
71 | TextColor3 = options.titletextcolor; | |
72 | TextStrokeTransparency = library.options.titlestroke; | |
73 | TextStrokeColor3 = library.options.titlestrokecolor; | |
74 | ZIndex = 3; | |
75 | }); | |
76 | library:Create("TextButton", { | |
77 | Size = UDim2.new(0, 30, 0, 30); | |
78 | Position = UDim2.new(1, -35, 0, 0); | |
79 | BackgroundTransparency = 1; | |
80 | Text = "-"; | |
81 | TextSize = options.titlesize; | |
82 | Font = Enum.Font.SourceSansSemibold;--Enum.Font.Code; | |
83 | Name = 'window_toggle'; | |
84 | TextColor3 = options.titletextcolor; | |
85 | TextStrokeTransparency = library.options.titlestroke; | |
86 | TextStrokeColor3 = library.options.titlestrokecolor; | |
87 | ZIndex = 3; | |
88 | }); | |
89 | library:Create("Frame", { | |
90 | Name = 'Underline'; | |
91 | Size = UDim2.new(1, 0, 0, 2); | |
92 | Position = UDim2.new(0, 0, 1, -2); | |
93 | BackgroundColor3 = (options.underlinecolor ~= "rainbow" and options.underlinecolor or Color3.new()); | |
94 | BorderSizePixel = 0; | |
95 | ZIndex = 3; | |
96 | }); | |
97 | library:Create('Frame', { | |
98 | Name = 'container'; | |
99 | Position = UDim2.new(0, 0, 1, 0); | |
100 | Size = UDim2.new(1, 0, 0, 0); | |
101 | BorderSizePixel = 0; | |
102 | BackgroundColor3 = options.bgcolor; | |
103 | ClipsDescendants = false; | |
104 | library:Create('UIListLayout', { | |
105 | Name = 'List'; | |
106 | SortOrder = Enum.SortOrder.LayoutOrder; | |
107 | }) | |
108 | }); | |
109 | }) | |
110 | ||
111 | if options.underlinecolor == "rainbow" then | |
112 | table.insert(library.rainbowtable, newWindow:FindFirstChild('Underline')) | |
113 | end | |
114 | ||
115 | local window = setmetatable({ | |
116 | count = 0; | |
117 | object = newWindow; | |
118 | container = newWindow.container; | |
119 | toggled = true; | |
120 | flags = {}; | |
121 | ||
122 | }, types) | |
123 | ||
124 | table.insert(library.queue, { | |
125 | w = window.object; | |
126 | p = window.object.Position; | |
127 | }) | |
128 | ||
129 | newWindow:FindFirstChild("window_toggle").MouseButton1Click:connect(function() | |
130 | window.toggled = not window.toggled; | |
131 | newWindow:FindFirstChild("window_toggle").Text = (window.toggled and "+" or "-") | |
132 | if (not window.toggled) then | |
133 | window.container.ClipsDescendants = true; | |
134 | end | |
135 | wait(); | |
136 | local y = 0; | |
137 | for i, v in next, window.container:GetChildren() do | |
138 | if (not v:IsA('UIListLayout')) then | |
139 | y = y + v.AbsoluteSize.Y; | |
140 | end | |
141 | end | |
142 | ||
143 | local targetSize = window.toggled and UDim2.new(1, 0, 0, y+5) or UDim2.new(1, 0, 0, 0); | |
144 | local targetDirection = window.toggled and "In" or "Out" | |
145 | ||
146 | window.container:TweenSize(targetSize, targetDirection, "Quad", 0.15, true) | |
147 | wait(.15) | |
148 | if window.toggled then | |
149 | window.container.ClipsDescendants = false; | |
150 | end | |
151 | end) | |
152 | ||
153 | return window; | |
154 | end | |
155 | ||
156 | function types:Resize() | |
157 | local y = 0; | |
158 | for i, v in next, self.container:GetChildren() do | |
159 | if (not v:IsA('UIListLayout')) then | |
160 | y = y + v.AbsoluteSize.Y; | |
161 | end | |
162 | end | |
163 | self.container.Size = UDim2.new(1, 0, 0, y+5) | |
164 | end | |
165 | ||
166 | function types:GetOrder() | |
167 | local c = 0; | |
168 | for i, v in next, self.container:GetChildren() do | |
169 | if (not v:IsA('UIListLayout')) then | |
170 | c = c + 1 | |
171 | end | |
172 | end | |
173 | return c | |
174 | end | |
175 | ||
176 | function types:Label(text) | |
177 | local v = game:GetService'TextService':GetTextSize(text, 18, Enum.Font.SourceSans, Vector2.new(math.huge, math.huge)) | |
178 | local object = library:Create('Frame', { | |
179 | Size = UDim2.new(1, 0, 0, v.Y + 5); | |
180 | BackgroundTransparency = 1; | |
181 | library:Create('TextLabel', { | |
182 | Size = UDim2.new(1, 0, 1, 0); | |
183 | Position = UDim2.new(0, 10, 0, 0); | |
184 | LayoutOrder = self:GetOrder(); | |
185 | ||
186 | Text = text; | |
187 | TextSize = 18; | |
188 | Font = Enum.Font.SourceSansLight; | |
189 | TextColor3 = Color3.fromRGB(255, 255, 255); | |
190 | BackgroundTransparency = 1; | |
191 | TextXAlignment = Enum.TextXAlignment.Left; | |
192 | TextWrapped = true; | |
193 | }); | |
194 | Parent = self.container | |
195 | }) | |
196 | self:Resize(); | |
197 | end | |
198 | ||
199 | function types:Toggle(name, options, callback) | |
200 | local default = options.default or false; | |
201 | local location = options.location or self.flags; | |
202 | local flag = options.flag or ""; | |
203 | local callback = callback or function() end; | |
204 | ||
205 | location[flag] = default; | |
206 | ||
207 | local check = library:Create('Frame', { | |
208 | BackgroundTransparency = 1; | |
209 | Size = UDim2.new(1, 0, 0, 25); | |
210 | LayoutOrder = self:GetOrder(); | |
211 | library:Create('TextLabel', { | |
212 | Name = name; | |
213 | Text = "\r" .. name; | |
214 | BackgroundTransparency = 1; | |
215 | TextColor3 = library.options.textcolor; | |
216 | Position = UDim2.new(0, 5, 0, 0); | |
217 | Size = UDim2.new(1, -5, 1, 0); | |
218 | TextXAlignment = Enum.TextXAlignment.Left; | |
219 | Font = Enum.Font.SourceSansLight; | |
220 | TextSize = library.options.fontsize; | |
221 | TextStrokeTransparency = library.options.textstroke; | |
222 | TextStrokeColor3 = library.options.strokecolor; | |
223 | library:Create('TextButton', { | |
224 | - | Text = (location[flag] and utf8.char(10003) or ""); |
224 | + | Text = (location[flag] and "◻️" or ""); |
225 | Font = Enum.Font.SourceSansLight; | |
226 | TextSize = library.options.fontsize; | |
227 | Name = 'Checkmark'; | |
228 | Size = UDim2.new(0, 20, 0, 20); | |
229 | Position = UDim2.new(1, -25, 0, 4); | |
230 | TextColor3 = library.options.textcolor; | |
231 | BackgroundColor3 = library.options.bgcolor; | |
232 | BorderColor3 = Color3.fromRGB(55, 55, 55); | |
233 | TextStrokeTransparency = library.options.textstroke; | |
234 | TextStrokeColor3 = library.options.strokecolor; | |
235 | }) | |
236 | }); | |
237 | Parent = self.container; | |
238 | }); | |
239 | ||
240 | local function click(t) | |
241 | location[flag] = not location[flag]; | |
242 | callback(location[flag]) | |
243 | check:FindFirstChild(name).Checkmark.Text = location[flag] and "◻️" or ""; | |
244 | end | |
245 | ||
246 | check:FindFirstChild(name).Checkmark.MouseButton1Click:connect(click) | |
247 | library.callbacks[flag] = click; | |
248 | ||
249 | if location[flag] == true then | |
250 | callback(location[flag]) | |
251 | end | |
252 | ||
253 | self:Resize(); | |
254 | return { | |
255 | Set = function(self, b) | |
256 | location[flag] = b; | |
257 | callback(location[flag]) | |
258 | check:FindFirstChild(name).Checkmark.Text = location[flag] and "◻️" or ""; | |
259 | end | |
260 | } | |
261 | end | |
262 | ||
263 | function types:Button(name, callback) | |
264 | callback = callback or function() end; | |
265 | ||
266 | local check = library:Create('Frame', { | |
267 | BackgroundTransparency = 1; | |
268 | Size = UDim2.new(1, 0, 0, 25); | |
269 | LayoutOrder = self:GetOrder(); | |
270 | library:Create('TextButton', { | |
271 | Name = name; | |
272 | Text = name; | |
273 | BackgroundColor3 = library.options.btncolor; | |
274 | BorderColor3 = library.options.bordercolor; | |
275 | TextStrokeTransparency = library.options.textstroke; | |
276 | TextStrokeColor3 = library.options.strokecolor; | |
277 | TextColor3 = library.options.textcolor; | |
278 | Position = UDim2.new(0, 5, 0, 5); | |
279 | Size = UDim2.new(1, -10, 0, 20); | |
280 | Font = Enum.Font.SourceSansLight; | |
281 | TextSize = library.options.fontsize; | |
282 | }); | |
283 | Parent = self.container; | |
284 | }); | |
285 | ||
286 | check:FindFirstChild(name).MouseButton1Click:connect(callback) | |
287 | self:Resize(); | |
288 | ||
289 | return { | |
290 | Fire = function() | |
291 | callback(); | |
292 | end | |
293 | } | |
294 | end | |
295 | ||
296 | function types:Box(name, options, callback) --type, default, data, location, flag) | |
297 | local type = options.type or ""; | |
298 | local default = options.default or ""; | |
299 | local data = options.data | |
300 | local location = options.location or self.flags; | |
301 | local flag = options.flag or ""; | |
302 | local callback = callback or function() end; | |
303 | local min = options.min or 0; | |
304 | local max = options.max or 9e9; | |
305 | ||
306 | if type == 'number' and (not tonumber(default)) then | |
307 | location[flag] = default; | |
308 | else | |
309 | location[flag] = ""; | |
310 | default = ""; | |
311 | end | |
312 | ||
313 | local check = library:Create('Frame', { | |
314 | BackgroundTransparency = 1; | |
315 | Size = UDim2.new(1, 0, 0, 25); | |
316 | LayoutOrder = self:GetOrder(); | |
317 | library:Create('TextLabel', { | |
318 | Name = name; | |
319 | Text = "\r" .. name; | |
320 | BackgroundTransparency = 1; | |
321 | TextColor3 = library.options.textcolor; | |
322 | TextStrokeTransparency = library.options.textstroke; | |
323 | TextStrokeColor3 = library.options.strokecolor; | |
324 | Position = UDim2.new(0, 5, 0, 0); | |
325 | Size = UDim2.new(1, -5, 1, 0); | |
326 | TextXAlignment = Enum.TextXAlignment.Left; | |
327 | Font = Enum.Font.SourceSansLight; | |
328 | TextSize = library.options.fontsize; | |
329 | library:Create('TextBox', { | |
330 | TextStrokeTransparency = library.options.textstroke; | |
331 | TextStrokeColor3 = library.options.strokecolor; | |
332 | Text = tostring(default); | |
333 | Font = Enum.Font.SourceSansLight; | |
334 | TextSize = library.options.fontsize; | |
335 | Name = 'Box'; | |
336 | Size = UDim2.new(0, 60, 0, 20); | |
337 | Position = UDim2.new(1, -65, 0, 3); | |
338 | TextColor3 = library.options.textcolor; | |
339 | BackgroundColor3 = library.options.boxcolor; | |
340 | BorderColor3 = library.options.bordercolor; | |
341 | PlaceholderColor3 = library.options.placeholdercolor; | |
342 | }) | |
343 | }); | |
344 | Parent = self.container; | |
345 | }); | |
346 | ||
347 | local box = check:FindFirstChild(name):FindFirstChild('Box'); | |
348 | box.FocusLost:connect(function(e) | |
349 | local old = location[flag]; | |
350 | if type == "number" then | |
351 | local num = tonumber(box.Text) | |
352 | if (not num) then | |
353 | box.Text = tonumber(location[flag]) | |
354 | else | |
355 | location[flag] = math.clamp(num, min, max) | |
356 | box.Text = tonumber(location[flag]) | |
357 | end | |
358 | else | |
359 | location[flag] = tostring(box.Text) | |
360 | end | |
361 | ||
362 | callback(location[flag], old, e) | |
363 | end) | |
364 | ||
365 | if type == 'number' then | |
366 | box:GetPropertyChangedSignal('Text'):connect(function() | |
367 | box.Text = string.gsub(box.Text, "[%a+]", ""); | |
368 | end) | |
369 | end | |
370 | ||
371 | self:Resize(); | |
372 | return box | |
373 | end | |
374 | ||
375 | function types:Bind(name, options, callback) | |
376 | local location = options.location or self.flags; | |
377 | local keyboardOnly = options.kbonly or false | |
378 | local flag = options.flag or ""; | |
379 | local callback = callback or function() end; | |
380 | local default = options.default; | |
381 | ||
382 | local passed = true; | |
383 | if keyboardOnly and (tostring(default):find('MouseButton')) then | |
384 | passed = false | |
385 | end | |
386 | if passed then | |
387 | location[flag] = default | |
388 | end | |
389 | ||
390 | local banned = { | |
391 | Return = true; | |
392 | Space = true; | |
393 | Tab = true; | |
394 | Unknown = true; | |
395 | } | |
396 | ||
397 | local shortNames = { | |
398 | RightControl = 'RightCtrl'; | |
399 | LeftControl = 'LeftCtrl'; | |
400 | LeftShift = 'LShift'; | |
401 | RightShift = 'RShift'; | |
402 | MouseButton1 = "Mouse1"; | |
403 | MouseButton2 = "Mouse2"; | |
404 | } | |
405 | ||
406 | local allowed = { | |
407 | MouseButton1 = true; | |
408 | MouseButton2 = true; | |
409 | } | |
410 | ||
411 | local nm = (default and (shortNames[default.Name] or default.Name) or "None"); | |
412 | local check = library:Create('Frame', { | |
413 | BackgroundTransparency = 1; | |
414 | Size = UDim2.new(1, 0, 0, 30); | |
415 | LayoutOrder = self:GetOrder(); | |
416 | library:Create('TextLabel', { | |
417 | Name = name; | |
418 | Text = "\r" .. name; | |
419 | BackgroundTransparency = 1; | |
420 | TextColor3 = library.options.textcolor; | |
421 | Position = UDim2.new(0, 5, 0, 0); | |
422 | Size = UDim2.new(1, -5, 1, 0); | |
423 | TextXAlignment = Enum.TextXAlignment.Left; | |
424 | Font = Enum.Font.SourceSansLight; | |
425 | TextSize = library.options.fontsize; | |
426 | TextStrokeTransparency = library.options.textstroke; | |
427 | TextStrokeColor3 = library.options.strokecolor; | |
428 | BorderColor3 = library.options.bordercolor; | |
429 | BorderSizePixel = 1; | |
430 | library:Create('TextButton', { | |
431 | Name = 'Keybind'; | |
432 | Text = nm; | |
433 | TextStrokeTransparency = library.options.textstroke; | |
434 | TextStrokeColor3 = library.options.strokecolor; | |
435 | Font = Enum.Font.SourceSansLight; | |
436 | TextSize = library.options.fontsize; | |
437 | Size = UDim2.new(0, 60, 0, 20); | |
438 | Position = UDim2.new(1, -65, 0, 5); | |
439 | TextColor3 = library.options.textcolor; | |
440 | BackgroundColor3 = library.options.bgcolor; | |
441 | BorderColor3 = library.options.bordercolor; | |
442 | BorderSizePixel = 1; | |
443 | }) | |
444 | }); | |
445 | Parent = self.container; | |
446 | }); | |
447 | ||
448 | local button = check:FindFirstChild(name).Keybind; | |
449 | button.MouseButton1Click:connect(function() | |
450 | library.binding = true | |
451 | ||
452 | button.Text = "..." | |
453 | local a, b = game:GetService('UserInputService').InputBegan:wait(); | |
454 | local name = tostring(a.KeyCode.Name); | |
455 | local typeName = tostring(a.UserInputType.Name); | |
456 | ||
457 | if (a.UserInputType ~= Enum.UserInputType.Keyboard and (allowed[a.UserInputType.Name]) and (not keyboardOnly)) or (a.KeyCode and (not banned[a.KeyCode.Name])) then | |
458 | local name = (a.UserInputType ~= Enum.UserInputType.Keyboard and a.UserInputType.Name or a.KeyCode.Name); | |
459 | location[flag] = (a); | |
460 | button.Text = shortNames[name] or name; | |
461 | ||
462 | else | |
463 | if (location[flag]) then | |
464 | if (not pcall(function() | |
465 | return location[flag].UserInputType | |
466 | end)) then | |
467 | local name = tostring(location[flag]) | |
468 | button.Text = shortNames[name] or name | |
469 | else | |
470 | local name = (location[flag].UserInputType ~= Enum.UserInputType.Keyboard and location[flag].UserInputType.Name or location[flag].KeyCode.Name); | |
471 | button.Text = shortNames[name] or name; | |
472 | end | |
473 | end | |
474 | end | |
475 | ||
476 | wait(0.1) | |
477 | library.binding = false; | |
478 | end) | |
479 | ||
480 | if location[flag] then | |
481 | button.Text = shortNames[tostring(location[flag].Name)] or tostring(location[flag].Name) | |
482 | end | |
483 | ||
484 | library.binds[flag] = { | |
485 | location = location; | |
486 | callback = callback; | |
487 | }; | |
488 | ||
489 | self:Resize(); | |
490 | end | |
491 | ||
492 | function types:Section(name) | |
493 | local order = self:GetOrder(); | |
494 | local determinedSize = UDim2.new(1, 0, 0, 25) | |
495 | local determinedPos = UDim2.new(0, 0, 0, 4); | |
496 | local secondarySize = UDim2.new(1, 0, 0, 20); | |
497 | ||
498 | if order == 0 then | |
499 | determinedSize = UDim2.new(1, 0, 0, 21) | |
500 | determinedPos = UDim2.new(0, 0, 0, -1); | |
501 | secondarySize = nil | |
502 | end | |
503 | ||
504 | local check = library:Create('Frame', { | |
505 | Name = 'Section'; | |
506 | BackgroundTransparency = 1; | |
507 | Size = determinedSize; | |
508 | BackgroundColor3 = library.options.sectncolor; | |
509 | BorderSizePixel = 0; | |
510 | LayoutOrder = order; | |
511 | library:Create('TextLabel', { | |
512 | Name = 'section_lbl'; | |
513 | Text = name; | |
514 | BackgroundTransparency = 0; | |
515 | BorderSizePixel = 0; | |
516 | BackgroundColor3 = library.options.sectncolor; | |
517 | TextColor3 = library.options.textcolor; | |
518 | Position = determinedPos; | |
519 | Size = (secondarySize or UDim2.new(1, 0, 1, 0)); | |
520 | Font = Enum.Font.SourceSansItalic; | |
521 | TextSize = library.options.fontsize; | |
522 | TextStrokeTransparency = library.options.textstroke; | |
523 | TextStrokeColor3 = library.options.strokecolor; | |
524 | }); | |
525 | Parent = self.container; | |
526 | }); | |
527 | ||
528 | self:Resize(); | |
529 | end | |
530 | ||
531 | function types:Slider(name, options, callback) | |
532 | local default = options.default or options.min; | |
533 | local min = options.min or 0; | |
534 | local max = options.max or 1; | |
535 | local location = options.location or self.flags; | |
536 | local precise = options.precise or false -- e.g 0, 1 vs 0, 0.1, 0.2, ... | |
537 | local flag = options.flag or ""; | |
538 | local callback = callback or function() end | |
539 | ||
540 | location[flag] = default; | |
541 | ||
542 | local check = library:Create('Frame', { | |
543 | BackgroundTransparency = 1; | |
544 | Size = UDim2.new(1, 0, 0, 25); | |
545 | LayoutOrder = self:GetOrder(); | |
546 | library:Create('TextLabel', { | |
547 | Name = name; | |
548 | TextStrokeTransparency = library.options.textstroke; | |
549 | TextStrokeColor3 = library.options.strokecolor; | |
550 | Text = "\r" .. name; | |
551 | BackgroundTransparency = 1; | |
552 | TextColor3 = library.options.textcolor; | |
553 | Position = UDim2.new(0, 5, 0, 2); | |
554 | Size = UDim2.new(1, -5, 1, 0); | |
555 | TextXAlignment = Enum.TextXAlignment.Left; | |
556 | Font = Enum.Font.SourceSansLight; | |
557 | TextSize = library.options.fontsize; | |
558 | library:Create('Frame', { | |
559 | Name = 'Container'; | |
560 | Size = UDim2.new(0, 60, 0, 20); | |
561 | Position = UDim2.new(1, -65, 0, 3); | |
562 | BackgroundTransparency = 1; | |
563 | --BorderColor3 = library.options.bordercolor; | |
564 | BorderSizePixel = 0; | |
565 | library:Create('TextLabel', { | |
566 | Name = 'ValueLabel'; | |
567 | Text = default; | |
568 | BackgroundTransparency = 1; | |
569 | TextColor3 = library.options.textcolor; | |
570 | Position = UDim2.new(0, -10, 0, 0); | |
571 | Size = UDim2.new(0, 1, 1, 0); | |
572 | TextXAlignment = Enum.TextXAlignment.Right; | |
573 | Font = Enum.Font.SourceSansLight; | |
574 | TextSize = library.options.fontsize; | |
575 | TextStrokeTransparency = library.options.textstroke; | |
576 | TextStrokeColor3 = library.options.strokecolor; | |
577 | }); | |
578 | library:Create('TextButton', { | |
579 | Name = 'Button'; | |
580 | Size = UDim2.new(0, 5, 1, -2); | |
581 | Position = UDim2.new(0, 0, 0, 1); | |
582 | AutoButtonColor = false; | |
583 | Text = ""; | |
584 | BackgroundColor3 = Color3.fromRGB(20, 20, 20); | |
585 | BorderSizePixel = 0; | |
586 | ZIndex = 2; | |
587 | TextStrokeTransparency = library.options.textstroke; | |
588 | TextStrokeColor3 = library.options.strokecolor; | |
589 | }); | |
590 | library:Create('Frame', { | |
591 | Name = 'Line'; | |
592 | BackgroundTransparency = 0; | |
593 | Position = UDim2.new(0, 0, 0.5, 0); | |
594 | Size = UDim2.new(1, 0, 0, 1); | |
595 | BackgroundColor3 = Color3.fromRGB(255, 255, 255); | |
596 | BorderSizePixel = 0; | |
597 | }); | |
598 | }) | |
599 | }); | |
600 | Parent = self.container; | |
601 | }); | |
602 | ||
603 | local overlay = check:FindFirstChild(name); | |
604 | ||
605 | local renderSteppedConnection; | |
606 | local inputBeganConnection; | |
607 | local inputEndedConnection; | |
608 | local mouseLeaveConnection; | |
609 | local mouseDownConnection; | |
610 | local mouseUpConnection; | |
611 | ||
612 | check:FindFirstChild(name).Container.MouseEnter:connect(function() | |
613 | local function update() | |
614 | if renderSteppedConnection then renderSteppedConnection:disconnect() end | |
615 | ||
616 | ||
617 | renderSteppedConnection = game:GetService('RunService').RenderStepped:connect(function() | |
618 | local mouse = game:GetService("UserInputService"):GetMouseLocation() | |
619 | local percent = (mouse.X - overlay.Container.AbsolutePosition.X) / (overlay.Container.AbsoluteSize.X) | |
620 | percent = math.clamp(percent, 0, 1) | |
621 | percent = tonumber(string.format("%.2f", percent)) | |
622 | ||
623 | overlay.Container.Button.Position = UDim2.new(math.clamp(percent, 0, 0.99), 0, 0, 1) | |
624 | ||
625 | local num = min + (max - min) * percent | |
626 | local value = (precise and num or math.floor(num)) | |
627 | ||
628 | overlay.Container.ValueLabel.Text = value; | |
629 | callback(tonumber(value)) | |
630 | location[flag] = tonumber(value) | |
631 | end) | |
632 | end | |
633 | ||
634 | local function disconnect() | |
635 | if renderSteppedConnection then renderSteppedConnection:disconnect() end | |
636 | if inputBeganConnection then inputBeganConnection:disconnect() end | |
637 | if inputEndedConnection then inputEndedConnection:disconnect() end | |
638 | if mouseLeaveConnection then mouseLeaveConnection:disconnect() end | |
639 | if mouseUpConnection then mouseUpConnection:disconnect() end | |
640 | end | |
641 | ||
642 | inputBeganConnection = check:FindFirstChild(name).Container.InputBegan:connect(function(input) | |
643 | if input.UserInputType == Enum.UserInputType.MouseButton1 then | |
644 | update() | |
645 | end | |
646 | end) | |
647 | ||
648 | inputEndedConnection = check:FindFirstChild(name).Container.InputEnded:connect(function(input) | |
649 | if input.UserInputType == Enum.UserInputType.MouseButton1 then | |
650 | disconnect() | |
651 | end | |
652 | end) | |
653 | ||
654 | mouseDownConnection = check:FindFirstChild(name).Container.Button.MouseButton1Down:connect(update) | |
655 | mouseUpConnection = game:GetService("UserInputService").InputEnded:connect(function(a, b) | |
656 | if a.UserInputType == Enum.UserInputType.MouseButton1 and (mouseDownConnection.Connected) then | |
657 | disconnect() | |
658 | end | |
659 | end) | |
660 | end) | |
661 | ||
662 | if default ~= min then | |
663 | local percent = 1 - ((max - default) / (max - min)) | |
664 | local number = default | |
665 | ||
666 | number = tonumber(string.format("%.2f", number)) | |
667 | if (not precise) then | |
668 | number = math.floor(number) | |
669 | end | |
670 | ||
671 | overlay.Container.Button.Position = UDim2.new(math.clamp(percent, 0, 0.99), 0, 0, 1) | |
672 | overlay.Container.ValueLabel.Text = number | |
673 | end | |
674 | ||
675 | self:Resize(); | |
676 | return { | |
677 | Set = function(self, value) | |
678 | local percent = 1 - ((max - value) / (max - min)) | |
679 | local number = value | |
680 | ||
681 | number = tonumber(string.format("%.2f", number)) | |
682 | if (not precise) then | |
683 | number = math.floor(number) | |
684 | end | |
685 | ||
686 | overlay.Container.Button.Position = UDim2.new(math.clamp(percent, 0, 0.99), 0, 0, 1) | |
687 | overlay.Container.ValueLabel.Text = number | |
688 | location[flag] = number | |
689 | callback(number) | |
690 | end | |
691 | } | |
692 | end | |
693 | ||
694 | function types:SearchBox(text, options, callback) | |
695 | local list = options.list or {}; | |
696 | local flag = options.flag or ""; | |
697 | local location = options.location or self.flags; | |
698 | local callback = callback or function() end; | |
699 | ||
700 | local busy = false; | |
701 | local box = library:Create('Frame', { | |
702 | BackgroundTransparency = 1; | |
703 | Size = UDim2.new(1, 0, 0, 25); | |
704 | LayoutOrder = self:GetOrder(); | |
705 | library:Create('TextBox', { | |
706 | Text = ""; | |
707 | PlaceholderText = text; | |
708 | PlaceholderColor3 = Color3.fromRGB(60, 60, 60); | |
709 | Font = Enum.Font.SourceSansLight; | |
710 | TextSize = library.options.fontsize; | |
711 | Name = 'Box'; | |
712 | Size = UDim2.new(1, -10, 0, 20); | |
713 | Position = UDim2.new(0, 5, 0, 4); | |
714 | TextColor3 = library.options.textcolor; | |
715 | BackgroundColor3 = library.options.dropcolor; | |
716 | BorderColor3 = library.options.bordercolor; | |
717 | TextStrokeTransparency = library.options.textstroke; | |
718 | TextStrokeColor3 = library.options.strokecolor; | |
719 | library:Create('ScrollingFrame', { | |
720 | Position = UDim2.new(0, 0, 1, 1); | |
721 | Name = 'Container'; | |
722 | BackgroundColor3 = library.options.btncolor; | |
723 | ScrollBarThickness = 0; | |
724 | BorderSizePixel = 0; | |
725 | BorderColor3 = library.options.bordercolor; | |
726 | Size = UDim2.new(1, 0, 0, 0); | |
727 | library:Create('UIListLayout', { | |
728 | Name = 'ListLayout'; | |
729 | SortOrder = Enum.SortOrder.LayoutOrder; | |
730 | }); | |
731 | ZIndex = 2; | |
732 | }); | |
733 | }); | |
734 | Parent = self.container; | |
735 | }) | |
736 | ||
737 | local function rebuild(text) | |
738 | box:FindFirstChild('Box').Container.ScrollBarThickness = 0 | |
739 | for i, child in next, box:FindFirstChild('Box').Container:GetChildren() do | |
740 | if (not child:IsA('UIListLayout')) then | |
741 | child:Destroy(); | |
742 | end | |
743 | end | |
744 | ||
745 | if #text > 0 then | |
746 | for i, v in next, list do | |
747 | if string.sub(string.lower(v), 1, string.len(text)) == string.lower(text) then | |
748 | local button = library:Create('TextButton', { | |
749 | Text = v; | |
750 | Font = Enum.Font.SourceSansLight; | |
751 | TextSize = library.options.fontsize; | |
752 | TextColor3 = library.options.textcolor; | |
753 | BorderColor3 = library.options.bordercolor; | |
754 | TextStrokeTransparency = library.options.textstroke; | |
755 | TextStrokeColor3 = library.options.strokecolor; | |
756 | Parent = box:FindFirstChild('Box').Container; | |
757 | Size = UDim2.new(1, 0, 0, 20); | |
758 | LayoutOrder = i; | |
759 | BackgroundColor3 = library.options.btncolor; | |
760 | ZIndex = 2; | |
761 | }) | |
762 | ||
763 | button.MouseButton1Click:connect(function() | |
764 | busy = true; | |
765 | box:FindFirstChild('Box').Text = button.Text; | |
766 | wait(); | |
767 | busy = false; | |
768 | ||
769 | location[flag] = button.Text; | |
770 | callback(location[flag]) | |
771 | ||
772 | box:FindFirstChild('Box').Container.ScrollBarThickness = 0 | |
773 | for i, child in next, box:FindFirstChild('Box').Container:GetChildren() do | |
774 | if (not child:IsA('UIListLayout')) then | |
775 | child:Destroy(); | |
776 | end | |
777 | end | |
778 | box:FindFirstChild('Box').Container:TweenSize(UDim2.new(1, 0, 0, 0), 'Out', 'Quad', 0.25, true) | |
779 | end) | |
780 | end | |
781 | end | |
782 | end | |
783 | ||
784 | local c = box:FindFirstChild('Box').Container:GetChildren() | |
785 | local ry = (20 * (#c)) - 20 | |
786 | ||
787 | local y = math.clamp((20 * (#c)) - 20, 0, 100) | |
788 | if ry > 100 then | |
789 | box:FindFirstChild('Box').Container.ScrollBarThickness = 5; | |
790 | end | |
791 | ||
792 | box:FindFirstChild('Box').Container:TweenSize(UDim2.new(1, 0, 0, y), 'Out', 'Quad', 0.25, true) | |
793 | box:FindFirstChild('Box').Container.CanvasSize = UDim2.new(1, 0, 0, (20 * (#c)) - 20) | |
794 | end | |
795 | ||
796 | box:FindFirstChild('Box'):GetPropertyChangedSignal('Text'):connect(function() | |
797 | if (not busy) then | |
798 | rebuild(box:FindFirstChild('Box').Text) | |
799 | end | |
800 | end); | |
801 | ||
802 | local function reload(new_list) | |
803 | list = new_list; | |
804 | rebuild("") | |
805 | end | |
806 | self:Resize(); | |
807 | return reload, box:FindFirstChild('Box'); | |
808 | end | |
809 | ||
810 | function types:Dropdown(name, options, callback) | |
811 | local location = options.location or self.flags; | |
812 | local flag = options.flag or ""; | |
813 | local callback = callback or function() end; | |
814 | local list = options.list or {}; | |
815 | ||
816 | location[flag] = list[1] | |
817 | local check = library:Create('Frame', { | |
818 | BackgroundTransparency = 1; | |
819 | Size = UDim2.new(1, 0, 0, 25); | |
820 | BackgroundColor3 = Color3.fromRGB(25, 25, 25); | |
821 | BorderSizePixel = 0; | |
822 | LayoutOrder = self:GetOrder(); | |
823 | library:Create('Frame', { | |
824 | Name = 'dropdown_lbl'; | |
825 | BackgroundTransparency = 0; | |
826 | BackgroundColor3 = library.options.dropcolor; | |
827 | Position = UDim2.new(0, 5, 0, 4); | |
828 | BorderColor3 = library.options.bordercolor; | |
829 | Size = UDim2.new(1, -10, 0, 20); | |
830 | library:Create('TextLabel', { | |
831 | Name = 'Selection'; | |
832 | Size = UDim2.new(1, 0, 1, 0); | |
833 | Text = list[1]; | |
834 | TextColor3 = library.options.textcolor; | |
835 | BackgroundTransparency = 1; | |
836 | Font = Enum.Font.SourceSansLight; | |
837 | TextSize = library.options.fontsize; | |
838 | TextStrokeTransparency = library.options.textstroke; | |
839 | TextStrokeColor3 = library.options.strokecolor; | |
840 | }); | |
841 | library:Create("TextButton", { | |
842 | Name = 'drop'; | |
843 | BackgroundTransparency = 1; | |
844 | Size = UDim2.new(0, 20, 1, 0); | |
845 | Position = UDim2.new(1, -25, 0, 0); | |
846 | Text = 'v'; | |
847 | TextColor3 = library.options.textcolor; | |
848 | Font = Enum.Font.SourceSansLight; | |
849 | TextSize = library.options.fontsize; | |
850 | TextStrokeTransparency = library.options.textstroke; | |
851 | TextStrokeColor3 = library.options.strokecolor; | |
852 | }) | |
853 | }); | |
854 | Parent = self.container; | |
855 | }); | |
856 | ||
857 | local button = check:FindFirstChild('dropdown_lbl').drop; | |
858 | local input; | |
859 | ||
860 | button.MouseButton1Click:connect(function() | |
861 | if (input and input.Connected) then | |
862 | return | |
863 | end | |
864 | ||
865 | check:FindFirstChild('dropdown_lbl'):WaitForChild('Selection').TextColor3 = Color3.fromRGB(60, 60, 60); | |
866 | check:FindFirstChild('dropdown_lbl'):WaitForChild('Selection').Text = name; | |
867 | local c = 0; | |
868 | for i, v in next, list do | |
869 | c = c + 20; | |
870 | end | |
871 | ||
872 | local size = UDim2.new(1, 0, 0, c) | |
873 | ||
874 | local clampedSize; | |
875 | local scrollSize = 0; | |
876 | if size.Y.Offset > 100 then | |
877 | clampedSize = UDim2.new(1, 0, 0, 100) | |
878 | scrollSize = 5; | |
879 | end | |
880 | ||
881 | local goSize = (clampedSize ~= nil and clampedSize) or size; | |
882 | local container = library:Create('ScrollingFrame', { | |
883 | TopImage = 'rbxasset://textures/ui/Scroll/scroll-middle.png'; | |
884 | BottomImage = 'rbxasset://textures/ui/Scroll/scroll-middle.png'; | |
885 | Name = 'DropContainer'; | |
886 | Parent = check:FindFirstChild('dropdown_lbl'); | |
887 | Size = UDim2.new(1, 0, 0, 0); | |
888 | BackgroundColor3 = library.options.bgcolor; | |
889 | BorderColor3 = library.options.bordercolor; | |
890 | Position = UDim2.new(0, 0, 1, 0); | |
891 | ScrollBarThickness = scrollSize; | |
892 | CanvasSize = UDim2.new(0, 0, 0, size.Y.Offset); | |
893 | ZIndex = 5; | |
894 | ClipsDescendants = true; | |
895 | library:Create('UIListLayout', { | |
896 | Name = 'List'; | |
897 | SortOrder = Enum.SortOrder.LayoutOrder | |
898 | }) | |
899 | }) | |
900 | ||
901 | for i, v in next, list do | |
902 | local btn = library:Create('TextButton', { | |
903 | Size = UDim2.new(1, 0, 0, 20); | |
904 | BackgroundColor3 = library.options.btncolor; | |
905 | BorderColor3 = library.options.bordercolor; | |
906 | Text = v; | |
907 | Font = Enum.Font.SourceSansLight; | |
908 | TextSize = library.options.fontsize; | |
909 | LayoutOrder = i; | |
910 | Parent = container; | |
911 | ZIndex = 5; | |
912 | TextColor3 = library.options.textcolor; | |
913 | TextStrokeTransparency = library.options.textstroke; | |
914 | TextStrokeColor3 = library.options.strokecolor; | |
915 | }) | |
916 | ||
917 | btn.MouseButton1Click:connect(function() | |
918 | check:FindFirstChild('dropdown_lbl'):WaitForChild('Selection').TextColor3 = library.options.textcolor | |
919 | check:FindFirstChild('dropdown_lbl'):WaitForChild('Selection').Text = btn.Text; | |
920 | ||
921 | location[flag] = tostring(btn.Text); | |
922 | callback(location[flag]) | |
923 | ||
924 | game:GetService('Debris'):AddItem(container, 0) | |
925 | input:disconnect(); | |
926 | end) | |
927 | end | |
928 | ||
929 | container:TweenSize(goSize, 'Out', 'Quad', 0.15, true) | |
930 | ||
931 | local function isInGui(frame) | |
932 | local mloc = game:GetService('UserInputService'):GetMouseLocation(); | |
933 | local mouse = Vector2.new(mloc.X, mloc.Y - 36); | |
934 | ||
935 | local x1, x2 = frame.AbsolutePosition.X, frame.AbsolutePosition.X + frame.AbsoluteSize.X; | |
936 | local y1, y2 = frame.AbsolutePosition.Y, frame.AbsolutePosition.Y + frame.AbsoluteSize.Y; | |
937 | ||
938 | return (mouse.X >= x1 and mouse.X <= x2) and (mouse.Y >= y1 and mouse.Y <= y2) | |
939 | end | |
940 | ||
941 | input = game:GetService('UserInputService').InputBegan:connect(function(a) | |
942 | if a.UserInputType == Enum.UserInputType.MouseButton1 and (not isInGui(container)) then | |
943 | check:FindFirstChild('dropdown_lbl'):WaitForChild('Selection').TextColor3 = library.options.textcolor | |
944 | check:FindFirstChild('dropdown_lbl'):WaitForChild('Selection').Text = location[flag]; | |
945 | ||
946 | container:TweenSize(UDim2.new(1, 0, 0, 0), 'In', 'Quad', 0.15, true) | |
947 | wait(0.15) | |
948 | ||
949 | game:GetService('Debris'):AddItem(container, 0) | |
950 | input:disconnect(); | |
951 | end | |
952 | end) | |
953 | end) | |
954 | ||
955 | self:Resize(); | |
956 | local function reload(self, array) | |
957 | options = array; | |
958 | location[flag] = array[1]; | |
959 | pcall(function() | |
960 | input:disconnect() | |
961 | end) | |
962 | check:WaitForChild('dropdown_lbl').Selection.Text = location[flag] | |
963 | check:FindFirstChild('dropdown_lbl'):WaitForChild('Selection').TextColor3 = library.options.textcolor | |
964 | game:GetService('Debris'):AddItem(container, 0) | |
965 | end | |
966 | ||
967 | return { | |
968 | Refresh = reload; | |
969 | } | |
970 | end | |
971 | end | |
972 | ||
973 | function library:Create(class, data) | |
974 | local obj = Instance.new(class); | |
975 | for i, v in next, data do | |
976 | if i ~= 'Parent' then | |
977 | ||
978 | if typeof(v) == "Instance" then | |
979 | v.Parent = obj; | |
980 | else | |
981 | obj[i] = v | |
982 | end | |
983 | end | |
984 | end | |
985 | ||
986 | obj.Parent = data.Parent; | |
987 | return obj | |
988 | end | |
989 | ||
990 | function library:CreateWindow(name, options) | |
991 | if (not library.container) then | |
992 | library.container = self:Create("ScreenGui", { | |
993 | self:Create('Frame', { | |
994 | Name = 'Container'; | |
995 | Size = UDim2.new(1, -30, 1, 0); | |
996 | Position = UDim2.new(0, 20, 0, 20); | |
997 | BackgroundTransparency = 1; | |
998 | Active = false; | |
999 | }); | |
1000 | Parent = game:GetService("CoreGui"); | |
1001 | }):FindFirstChild('Container'); | |
1002 | end | |
1003 | ||
1004 | if (not library.options) then | |
1005 | library.options = setmetatable(options or {}, {__index = defaults}) | |
1006 | end | |
1007 | ||
1008 | local window = types.window(name, library.options); | |
1009 | dragger.new(window.object); | |
1010 | return window | |
1011 | end | |
1012 | ||
1013 | default = { | |
1014 | - | topcolor = Color3.fromRGB(30, 30, 30); |
1014 | + | topcolor = Color3.fromRGB(40, 40, 40); |
1015 | titlecolor = Color3.fromRGB(255, 255, 255); | |
1016 | ||
1017 | underlinecolor = Color3.fromRGB(0, 255, 140); | |
1018 | bgcolor = Color3.fromRGB(45, 45, 45); | |
1019 | boxcolor = Color3.fromRGB(35, 35, 35); | |
1020 | btncolor = Color3.fromRGB(35, 35, 35); | |
1021 | dropcolor = Color3.fromRGB(35, 35, 35); | |
1022 | sectncolor = Color3.fromRGB(35, 35, 35); | |
1023 | bordercolor = Color3.fromRGB(35, 35, 35); | |
1024 | ||
1025 | font = Enum.Font.SourceSans; | |
1026 | titlefont = Enum.Font.Code; | |
1027 | ||
1028 | fontsize = 17; | |
1029 | titlesize = 18; | |
1030 | ||
1031 | textstroke = 1; | |
1032 | titlestroke = 1; | |
1033 | ||
1034 | strokecolor = Color3.fromRGB(0, 0, 0); | |
1035 | ||
1036 | textcolor = Color3.fromRGB(255, 255, 255); | |
1037 | titletextcolor = Color3.fromRGB(255, 255, 255); | |
1038 | ||
1039 | placeholdercolor = Color3.fromRGB(255, 255, 255); | |
1040 | titlestrokecolor = Color3.fromRGB(0, 0, 0); | |
1041 | } | |
1042 | ||
1043 | library.options = setmetatable({}, {__index = default}) | |
1044 | ||
1045 | spawn(function() | |
1046 | while true do | |
1047 | for i=0, 1, 1 / 300 do | |
1048 | for _, obj in next, library.rainbowtable do | |
1049 | obj.BackgroundColor3 = Color3.fromHSV(i, 1, 1); | |
1050 | end | |
1051 | wait() | |
1052 | end; | |
1053 | end | |
1054 | end) | |
1055 | ||
1056 | local function isreallypressed(bind, inp) | |
1057 | local key = bind | |
1058 | if typeof(key) == "Instance" then | |
1059 | if key.UserInputType == Enum.UserInputType.Keyboard and inp.KeyCode == key.KeyCode then | |
1060 | return true; | |
1061 | elseif tostring(key.UserInputType):find('MouseButton') and inp.UserInputType == key.UserInputType then | |
1062 | return true | |
1063 | end | |
1064 | end | |
1065 | if tostring(key):find'MouseButton1' then | |
1066 | return key == inp.UserInputType | |
1067 | else | |
1068 | return key == inp.KeyCode | |
1069 | end | |
1070 | end | |
1071 | ||
1072 | game:GetService("UserInputService").InputBegan:connect(function(input) | |
1073 | if (not library.binding) then | |
1074 | for idx, binds in next, library.binds do | |
1075 | local real_binding = binds.location[idx]; | |
1076 | if real_binding and isreallypressed(real_binding, input) then | |
1077 | binds.callback() | |
1078 | end | |
1079 | end | |
1080 | end | |
1081 | end) | |
1082 | end | |
1083 | ||
1084 | return library |