SHOW:
|
|
- or go back to the newest paste.
1 | local library = { | |
2 | windowcount = 0; | |
3 | } | |
4 | ||
5 | local dragger = {}; | |
6 | local resizer = {}; | |
7 | ||
8 | do | |
9 | local mouse = game:GetService("Players").LocalPlayer:GetMouse(); | |
10 | local inputService = game:GetService('UserInputService'); | |
11 | local heartbeat = game:GetService("RunService").Heartbeat; | |
12 | -- // credits to Ririchi / Inori for this cute drag function :) | |
13 | function dragger.new(frame) | |
14 | local s, event = pcall(function() | |
15 | return frame.MouseEnter | |
16 | end) | |
17 | ||
18 | if s then | |
19 | frame.Active = true; | |
20 | ||
21 | event:connect(function() | |
22 | local input = frame.InputBegan:connect(function(key) | |
23 | if key.UserInputType == Enum.UserInputType.MouseButton1 then | |
24 | local objectPosition = Vector2.new(mouse.X - frame.AbsolutePosition.X, mouse.Y - frame.AbsolutePosition.Y); | |
25 | while heartbeat:wait() and inputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1) do | |
26 | 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', 'Quad', 0.1, true); | |
27 | end | |
28 | end | |
29 | end) | |
30 | ||
31 | local leave; | |
32 | leave = frame.MouseLeave:connect(function() | |
33 | input:disconnect(); | |
34 | leave:disconnect(); | |
35 | end) | |
36 | end) | |
37 | end | |
38 | end | |
39 | ||
40 | function resizer.new(p, s) | |
41 | p:GetPropertyChangedSignal('AbsoluteSize'):connect(function() | |
42 | s.Size = UDim2.new(s.Size.X.Scale, s.Size.X.Offset, s.Size.Y.Scale, p.AbsoluteSize.Y); | |
43 | end) | |
44 | end | |
45 | end | |
46 | ||
47 | ||
48 | local defaults = { | |
49 | txtcolor = Color3.fromRGB(255, 255, 255), | |
50 | - | underline = Color3.fromRGB(255,255,0), |
50 | + | underline = Color3.fromRGB(0, 255, 140), |
51 | barcolor = Color3.fromRGB(40, 40, 40), | |
52 | bgcolor = Color3.fromRGB(30, 30, 30), | |
53 | } | |
54 | ||
55 | function library:Create(class, props) | |
56 | local object = Instance.new(class); | |
57 | ||
58 | for i, prop in next, props do | |
59 | if i ~= "Parent" then | |
60 | object[i] = prop; | |
61 | end | |
62 | end | |
63 | ||
64 | object.Parent = props.Parent; | |
65 | return object; | |
66 | end | |
67 | ||
68 | function library:CreateWindow(options) | |
69 | assert(options.text, "no name"); | |
70 | local window = { | |
71 | count = 0; | |
72 | toggles = {}, | |
73 | closed = false; | |
74 | } | |
75 | ||
76 | local options = options or {}; | |
77 | setmetatable(options, {__index = defaults}) | |
78 | ||
79 | self.windowcount = self.windowcount + 1; | |
80 | ||
81 | - | library.gui = library.gui or self:Create("ScreenGui", {Name = "PrisonGutterUI", Parent = game:GetService('CoreGui')}) |
81 | + | library.gui = library.gui or self:Create("ScreenGui", {Name = "PrisonGutterUI", Parent = game:GetService("Players").LocalPlayer.PlayerGui}) |
82 | window.frame = self:Create("Frame", { | |
83 | Name = options.text; | |
84 | Parent = self.gui, | |
85 | Active = true, | |
86 | BackgroundTransparency = 0, | |
87 | Size = UDim2.new(0, 190, 0, 30), | |
88 | Position = UDim2.new(0, (15 + ((200 * self.windowcount) - 200)), 0, 15), | |
89 | BackgroundColor3 = options.barcolor, | |
90 | BorderSizePixel = 0; | |
91 | }) | |
92 | ||
93 | window.background = self:Create('Frame', { | |
94 | Name = 'Background'; | |
95 | Parent = window.frame, | |
96 | BorderSizePixel = 0; | |
97 | BackgroundColor3 = options.bgcolor, | |
98 | Position = UDim2.new(0, 0, 1, 0), | |
99 | Size = UDim2.new(1, 0, 0, 25), | |
100 | ClipsDescendants = true; | |
101 | }) | |
102 | ||
103 | window.container = self:Create('Frame', { | |
104 | Name = 'Container'; | |
105 | Parent = window.frame, | |
106 | BorderSizePixel = 0; | |
107 | BackgroundColor3 = options.bgcolor, | |
108 | Position = UDim2.new(0, 0, 1, 0), | |
109 | Size = UDim2.new(1, 0, 0, 25), | |
110 | ClipsDescendants = true; | |
111 | }) | |
112 | ||
113 | window.organizer = self:Create('UIListLayout', { | |
114 | Name = 'Sorter'; | |
115 | --Padding = UDim.new(0, 0); | |
116 | SortOrder = Enum.SortOrder.LayoutOrder; | |
117 | Parent = window.container; | |
118 | }) | |
119 | ||
120 | window.padder = self:Create('UIPadding', { | |
121 | Name = 'Padding'; | |
122 | PaddingLeft = UDim.new(0, 10); | |
123 | PaddingTop = UDim.new(0, 5); | |
124 | Parent = window.container; | |
125 | }) | |
126 | ||
127 | self:Create("Frame", { | |
128 | Name = 'Underline'; | |
129 | Size = UDim2.new(1, 0, 0, 1), | |
130 | Position = UDim2.new(0, 0, 1, -1), | |
131 | BorderSizePixel = 0; | |
132 | BackgroundColor3 = options.underline; | |
133 | Parent = window.frame | |
134 | }) | |
135 | ||
136 | local togglebutton = self:Create("TextButton", { | |
137 | Name = 'Toggle'; | |
138 | ZIndex = 2, | |
139 | BackgroundTransparency = 1; | |
140 | Position = UDim2.new(1, -25, 0, 0), | |
141 | Size = UDim2.new(0, 25, 1, 0), | |
142 | Text = "-", | |
143 | TextSize = 17, | |
144 | TextColor3 = options.txtcolor, | |
145 | Font = Enum.Font.SourceSans; | |
146 | Parent = window.frame, | |
147 | }); | |
148 | ||
149 | togglebutton.MouseButton1Click:connect(function() | |
150 | window.closed = not window.closed | |
151 | togglebutton.Text = (window.closed and "+" or "-") | |
152 | if window.closed then | |
153 | window:Resize(true, UDim2.new(1, 0, 0, 0)) | |
154 | else | |
155 | window:Resize(true) | |
156 | end | |
157 | end) | |
158 | ||
159 | self:Create("TextLabel", { | |
160 | Size = UDim2.new(1, 0, 1, 0), | |
161 | BackgroundTransparency = 1; | |
162 | BorderSizePixel = 0; | |
163 | TextColor3 = options.txtcolor, | |
164 | TextColor3 = (options.bartextcolor or Color3.fromRGB(255, 255, 255)); | |
165 | TextSize = 17, | |
166 | Font = Enum.Font.SourceSansSemibold; | |
167 | Text = options.text or "window", | |
168 | Name = "Window", | |
169 | Parent = window.frame, | |
170 | }) | |
171 | ||
172 | do | |
173 | dragger.new(window.frame) | |
174 | resizer.new(window.background, window.container); | |
175 | end | |
176 | ||
177 | local function getSize() | |
178 | local ySize = 0; | |
179 | for i, object in next, window.container:GetChildren() do | |
180 | if (not object:IsA('UIListLayout')) and (not object:IsA('UIPadding')) then | |
181 | ySize = ySize + object.AbsoluteSize.Y | |
182 | end | |
183 | end | |
184 | return UDim2.new(1, 0, 0, ySize + 10) | |
185 | end | |
186 | ||
187 | function window:Resize(tween, change) | |
188 | local size = change or getSize() | |
189 | self.container.ClipsDescendants = true; | |
190 | ||
191 | if tween then | |
192 | self.background:TweenSize(size, "Out", "Sine", 0.5, true) | |
193 | else | |
194 | self.background.Size = size | |
195 | end | |
196 | end | |
197 | ||
198 | function window:AddToggle(text, callback) | |
199 | self.count = self.count + 1 | |
200 | ||
201 | callback = callback or function() end | |
202 | local label = library:Create("TextLabel", { | |
203 | Text = text, | |
204 | Size = UDim2.new(1, -10, 0, 20); | |
205 | --Position = UDim2.new(0, 5, 0, ((20 * self.count) - 20) + 5), | |
206 | BackgroundTransparency = 1; | |
207 | TextColor3 = Color3.fromRGB(255, 255, 255); | |
208 | TextXAlignment = Enum.TextXAlignment.Left; | |
209 | LayoutOrder = self.Count; | |
210 | TextSize = 16, | |
211 | Font = Enum.Font.SourceSans, | |
212 | Parent = self.container; | |
213 | }) | |
214 | ||
215 | local button = library:Create("TextButton", { | |
216 | Text = "OFF", | |
217 | TextColor3 = Color3.fromRGB(255, 25, 25), | |
218 | BackgroundTransparency = 1; | |
219 | Position = UDim2.new(1, -25, 0, 0), | |
220 | Size = UDim2.new(0, 25, 1, 0), | |
221 | TextSize = 17, | |
222 | Font = Enum.Font.SourceSansSemibold, | |
223 | Parent = label; | |
224 | }) | |
225 | ||
226 | button.MouseButton1Click:connect(function() | |
227 | self.toggles[text] = (not self.toggles[text]) | |
228 | button.TextColor3 = (self.toggles[text] and Color3.fromRGB(0, 255, 140) or Color3.fromRGB(255, 25, 25)) | |
229 | button.Text =(self.toggles[text] and "ON" or "OFF") | |
230 | ||
231 | callback(self.toggles[text]) | |
232 | end) | |
233 | ||
234 | self:Resize() | |
235 | return button | |
236 | end | |
237 | ||
238 | function window:AddBox(text, callback) | |
239 | self.count = self.count + 1 | |
240 | callback = callback or function() end | |
241 | ||
242 | local box = library:Create("TextBox", { | |
243 | PlaceholderText = text, | |
244 | Size = UDim2.new(1, -10, 0, 20); | |
245 | --Position = UDim2.new(0, 5, 0, ((20 * self.count) - 20) + 5), | |
246 | BackgroundTransparency = 0.75; | |
247 | BackgroundColor3 = options.boxcolor, | |
248 | TextColor3 = Color3.fromRGB(255, 255, 255); | |
249 | TextXAlignment = Enum.TextXAlignment.Center; | |
250 | TextSize = 16, | |
251 | Text = "", | |
252 | Font = Enum.Font.SourceSans, | |
253 | LayoutOrder = self.Count; | |
254 | BorderSizePixel = 0; | |
255 | Parent = self.container; | |
256 | }) | |
257 | ||
258 | box.FocusLost:connect(function(...) | |
259 | callback(box, ...) | |
260 | end) | |
261 | ||
262 | self:Resize() | |
263 | return box | |
264 | end | |
265 | ||
266 | function window:AddButton(text, callback) | |
267 | self.count = self.count + 1 | |
268 | ||
269 | callback = callback or function() end | |
270 | local button = library:Create("TextButton", { | |
271 | Text = text, | |
272 | Size = UDim2.new(1, -10, 0, 20); | |
273 | --Position = UDim2.new(0, 5, 0, ((20 * self.count) - 20) + 5), | |
274 | BackgroundTransparency = 1; | |
275 | TextColor3 = Color3.fromRGB(255, 255, 255); | |
276 | TextXAlignment = Enum.TextXAlignment.Left; | |
277 | TextSize = 16, | |
278 | Font = Enum.Font.SourceSans, | |
279 | LayoutOrder = self.Count; | |
280 | Parent = self.container; | |
281 | }) | |
282 | ||
283 | button.MouseButton1Click:connect(callback) | |
284 | self:Resize() | |
285 | return button | |
286 | end | |
287 | ||
288 | function window:AddLabel(text) | |
289 | self.count = self.count + 1; | |
290 | ||
291 | local tSize = game:GetService('TextService'):GetTextSize(text, 16, Enum.Font.SourceSans, Vector2.new(math.huge, math.huge)) | |
292 | ||
293 | local button = library:Create("TextLabel", { | |
294 | Text = text, | |
295 | Size = UDim2.new(1, -10, 0, tSize.Y + 5); | |
296 | TextScaled = false; | |
297 | BackgroundTransparency = 1; | |
298 | TextColor3 = Color3.fromRGB(255, 255, 255); | |
299 | TextXAlignment = Enum.TextXAlignment.Left; | |
300 | TextSize = 16, | |
301 | Font = Enum.Font.SourceSans, | |
302 | LayoutOrder = self.Count; | |
303 | Parent = self.container; | |
304 | }) | |
305 | ||
306 | self:Resize() | |
307 | return button | |
308 | end | |
309 | ||
310 | function window:AddDropdown(options, callback) | |
311 | self.count = self.count + 1 | |
312 | local default = options[1] or ""; | |
313 | ||
314 | callback = callback or function() end | |
315 | local dropdown = library:Create("TextLabel", { | |
316 | Size = UDim2.new(1, -10, 0, 20); | |
317 | BackgroundTransparency = 0.75; | |
318 | BackgroundColor3 = options.boxcolor, | |
319 | TextColor3 = Color3.fromRGB(255, 255, 255); | |
320 | TextXAlignment = Enum.TextXAlignment.Center; | |
321 | TextSize = 16, | |
322 | Text = default, | |
323 | Font = Enum.Font.SourceSans, | |
324 | BorderSizePixel = 0; | |
325 | LayoutOrder = self.Count; | |
326 | Parent = self.container; | |
327 | }) | |
328 | ||
329 | local button = library:Create("ImageButton",{ | |
330 | BackgroundTransparency = 1; | |
331 | Image = 'rbxassetid://3234893186'; | |
332 | Size = UDim2.new(0, 18, 1, 0); | |
333 | Position = UDim2.new(1, -20, 0, 0); | |
334 | Parent = dropdown; | |
335 | }) | |
336 | ||
337 | local frame; | |
338 | ||
339 | local function isInGui(frame) | |
340 | local mloc = game:GetService('UserInputService'):GetMouseLocation(); | |
341 | local mouse = Vector2.new(mloc.X, mloc.Y - 36); | |
342 | ||
343 | local x1, x2 = frame.AbsolutePosition.X, frame.AbsolutePosition.X + frame.AbsoluteSize.X; | |
344 | local y1, y2 = frame.AbsolutePosition.Y, frame.AbsolutePosition.Y + frame.AbsoluteSize.Y; | |
345 | ||
346 | return (mouse.X >= x1 and mouse.X <= x2) and (mouse.Y >= y1 and mouse.Y <= y2) | |
347 | end | |
348 | ||
349 | local function count(t) | |
350 | local c = 0; | |
351 | for i, v in next, t do | |
352 | c = c + 1 | |
353 | end | |
354 | return c; | |
355 | end | |
356 | ||
357 | button.MouseButton1Click:connect(function() | |
358 | if count(options) == 0 then | |
359 | return | |
360 | end | |
361 | ||
362 | if frame then | |
363 | frame:Destroy(); | |
364 | frame = nil; | |
365 | end | |
366 | ||
367 | self.container.ClipsDescendants = false; | |
368 | ||
369 | frame = library:Create('Frame', { | |
370 | Position = UDim2.new(0, 0, 1, 0); | |
371 | BackgroundColor3 = Color3.fromRGB(40, 40, 40); | |
372 | Size = UDim2.new(0, dropdown.AbsoluteSize.X, 0, (count(options) * 21)); | |
373 | BorderSizePixel = 0; | |
374 | Parent = dropdown; | |
375 | ClipsDescendants = true; | |
376 | ZIndex = 2; | |
377 | }) | |
378 | ||
379 | library:Create('UIListLayout', { | |
380 | Name = 'Layout'; | |
381 | Parent = frame; | |
382 | }) | |
383 | ||
384 | for i, option in next, options do | |
385 | local selection = library:Create('TextButton', { | |
386 | Text = option; | |
387 | BackgroundColor3 = Color3.fromRGB(40, 40, 40); | |
388 | TextColor3 = Color3.fromRGB(255, 255, 255); | |
389 | BorderSizePixel = 0; | |
390 | TextSize = 16; | |
391 | Font = Enum.Font.SourceSans; | |
392 | Size = UDim2.new(1, 0, 0, 21); | |
393 | Parent = frame; | |
394 | ZIndex = 2; | |
395 | }) | |
396 | ||
397 | selection.MouseButton1Click:connect(function() | |
398 | dropdown.Text = option; | |
399 | callback(option) | |
400 | frame.Size = UDim2.new(1, 0, 0, 0); | |
401 | game:GetService('Debris'):AddItem(frame, 0.1) | |
402 | end) | |
403 | end | |
404 | end); | |
405 | ||
406 | game:GetService('UserInputService').InputBegan:connect(function(m) | |
407 | if m.UserInputType == Enum.UserInputType.MouseButton1 then | |
408 | if frame and (not isInGui(frame)) then | |
409 | game:GetService('Debris'):AddItem(frame); | |
410 | end | |
411 | end | |
412 | end) | |
413 | ||
414 | callback(default); | |
415 | self:Resize() | |
416 | return { | |
417 | Refresh = function(self, array) | |
418 | game:GetService('Debris'):AddItem(frame); | |
419 | options = array | |
420 | dropdown.Text = options[1]; | |
421 | end | |
422 | } | |
423 | end; | |
424 | ||
425 | ||
426 | return window | |
427 | end | |
428 | ||
429 | return library |